[
  {
    "path": ".gitignore",
    "content": ".idea\n.DS_Store\ndepthmapX-build\nbuild\nbuild-*\nRegressionTest/rundir\n__pycache__\nCMakeLists.txt.user\n*_BACKUP_*\n*_BASE_*\n*_LOCAL_*\n*_REMOTE_*\n\n"
  },
  {
    "path": ".mailmap",
    "content": "Petros Koutsolampros <2184600+pklampros@users.noreply.github.com> <2184600+orange-vertex@users.noreply.github.com>\nPetros Koutsolampros <2184600+pklampros@users.noreply.github.com> Petros Koutsolampros <orange-vertex@users.noreply.github.com>\nPetros Koutsolampros <2184600+pklampros@users.noreply.github.com> Petros <orange-vertex@users.noreply.github.com>\n"
  },
  {
    "path": ".travis.yml",
    "content": "sudo: required\ndist: xenial\nlanguage: c++\nservices:\n  - docker\n\nnotifications:\n    slack: depthmapx:B3CKNlNDLrNz1vSOU5yoQQqA\n    webhooks:\n        urls:\n            - \"https://scalar.vector.im/api/neb/services/hooks/dHJhdmlzLWNpLyU0MG9yYW5nZS12ZXJ0ZXglM0FtYXRyaXgub3JnLyUyMUVZQUZRaEVrV3lDZm1hcm9QaCUzQW1hdHJpeC5vcmc\"\n        on_success: always  # always|never|change\n        on_failure: always\n        on_start: never\n\n\nscript:\n  - docker run --security-opt seccomp:unconfined --user $UID -v $PWD:/mnt/code blackseamonster/depthmapx-buildenv:0.3 bash -c ci/build.sh\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "set(CMAKE_OSX_DEPLOYMENT_TARGET \"10.9\" CACHE STRING \"Minimum macOS deployment version\")\nproject(depthmapX)\ncmake_minimum_required(VERSION 3.13.0)\nset(CMAKE_CXX_STANDARD 17)\n\nif (\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"GNU\" OR\n    \"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n    set(warnings \"-Wall -Wextra\")\nelseif (\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"MSVC\")\n    set(warnings \"/W4 /EHsc\")\n    execute_process(COMMAND make_version_header.bat WORKING_DIRECTORY depthmapX)\nendif()\n\n# policy for target sources - we don't expect any old CMakes\ncmake_policy(SET CMP0076 NEW)\n\ninclude_directories(\".\")\n\n# Get the current working branch\nexecute_process(\n  COMMAND git rev-parse --abbrev-ref HEAD\n  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\n  OUTPUT_VARIABLE APP_BRANCH\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n)\n\n# Get the latest abbreviated commit hash of the working branch\nexecute_process(\n  COMMAND git log -1 --format=%h\n  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\n  OUTPUT_VARIABLE APP_COMMIT\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n)\n\n# generate version_defs.h\ninclude_directories(${CMAKE_BINARY_DIR})\nconfigure_file(\"${CMAKE_SOURCE_DIR}/version_defs.h.in\" \"${CMAKE_BINARY_DIR}/version_defs.h\" @ONLY)\n\nstring(TIMESTAMP APP_DATE %Y-%m-%d)\n\nset(modules_core \"\" CACHE INTERNAL \"modules_core\" FORCE)\nset(MODULES_GUI FALSE)\nset(MODULES_CLI FALSE)\nset(MODULES_CLI_TEST FALSE)\nset(MODULES_CORE TRUE)\nset(MODULES_CORE_TEST FALSE)\n\nadd_subdirectory(genlib)\nadd_subdirectory(genlibTest)\nadd_subdirectory(salalib)\nadd_subdirectory(modules) # only the core modules are loaded here\nadd_subdirectory(mgraph440)\nadd_subdirectory(mgraph440Test)\nadd_subdirectory(salaTest)\nadd_subdirectory(depthmapXcli)\nadd_subdirectory(cliTest)\nadd_subdirectory(depthmapXTest)\nadd_subdirectory(depthmapX)\nadd_subdirectory(GuiUnitTest)\nadd_subdirectory(moduleTest)\n\n"
  },
  {
    "path": "GuiUnitTest/.gitignore",
    "content": "# This file is used to ignore files which are generated\n# ----------------------------------------------------------------------------\n\n*~\n*.autosave\n*.a\n*.core\n*.moc\n*.o\n*.obj\n*.orig\n*.rej\n*.so\n*.so.*\n*_pch.h.cpp\n*_resource.rc\n*.qm\n.#*\n*.*#\ncore\n!core/\ntags\n.DS_Store\n.directory\n*.debug\nMakefile*\n*.prl\n*.app\nmoc_*.cpp\nui_*.h\nqrc_*.cpp\nThumbs.db\n*.res\n*.rc\n/.qmake.cache\n/.qmake.stash\n\n# qtcreator generated files\n*.pro.user*\n\n# xemacs temporary files\n*.flc\n\n# Vim temporary files\n.*.swp\n\n# Visual Studio generated files\n*.ib_pdb_index\n*.idb\n*.ilk\n*.pdb\n*.sln\n*.suo\n*.vcproj\n*vcproj.*.*.user\n*.ncb\n*.sdf\n*.opensdf\n*.vcxproj\n*vcxproj.*\n\n# MinGW generated files\n*.Debug\n*.Release\n\n# Python byte code\n*.pyc\n\n# Binaries\n# --------\n*.dll\n*.exe\n\n"
  },
  {
    "path": "GuiUnitTest/CMakeLists.txt",
    "content": "set(GuiUnitTest GuiUnitTest)\n\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n# Find the QtWidgets library\nfind_package(Qt5 COMPONENTS Core Widgets Gui OpenGL REQUIRED)\n# Instruct CMake to run moc automatically when needed\nset(CMAKE_AUTOMOC ON)\n\nset(guiUnitTest_SRCS\n    main.cpp \n    testviewhelpers.cpp \n    testsettings.cpp \n    ../depthmapX/settingsimpl.cpp \n    ../depthmapX/views/viewhelpers.cpp)\n\ninclude_directories(\"../ThirdParty/Catch\" \"../ThirdParty/FakeIt\" \"../depthmapX\")\n\nset(LINK_LIBS salalib genlib mgraph440 Qt5::Core)\n\nadd_executable(${GuiUnitTest} ${guiUnitTest_SRCS})\ntarget_link_libraries(${GuiUnitTest} ${LINK_LIBS})\n\n"
  },
  {
    "path": "GuiUnitTest/main.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n\n"
  },
  {
    "path": "GuiUnitTest/testsettings.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include <../cliTest/selfcleaningfile.h>\n#include <../depthmapX/settingsimpl.h>\n\n\nclass TestSettingsFactory : public QSettingsFactory\n{\npublic:\n    TestSettingsFactory(const QString &filename) : mFilename(filename)\n    {}\n    virtual std::unique_ptr<QSettings> getSettings() const\n    {\n        return std::unique_ptr<QSettings>(new QSettings(mFilename, QSettings::IniFormat));\n    }\nprivate:\n    QString mFilename;\n};\n\nTEST_CASE(\"Test simple settings\")\n{\n    SelfCleaningFile scf(\"./test.ini\");\n    SettingsImpl settings(new TestSettingsFactory(scf.Filename().c_str()));\n\n    REQUIRE(settings.readSetting(\"test1\", \"bar\").toString().toStdString() == \"bar\");\n    settings.writeSetting(\"test1\", \"foo\");\n    REQUIRE(settings.readSetting(\"test1\", \"bar\").toString().toStdString() == \"foo\");\n}\n\n\nTEST_CASE(\"Test settings transaction\")\n{\n    SelfCleaningFile scf(\"./test.ini\");\n    SettingsImpl settings(new TestSettingsFactory(scf.Filename().c_str()));\n\n    REQUIRE(settings.readSetting(\"test1\", \"bar\").toString() == \"bar\");\n    {\n        auto transaction = settings.getTransaction();\n        transaction->writeSetting(\"test1\", \"foo\");\n    }\n    REQUIRE(settings.readSetting(\"test1\", \"bar\").toString() == \"foo\");\n\n}\n"
  },
  {
    "path": "GuiUnitTest/testviewhelpers.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"depthmapX/views/viewhelpers.h\"\n#include \"catch.hpp\"\n#include <time.h>\n#include <sstream>\n#include <iomanip>\n\nTEST_CASE(\"Calculating the new center\", \"[calculateCenter]\"){\n    auto point = QPoint(100, 100);\n    auto oldCenter = QPoint(200,200);\n    auto newCenter = Point2f(150,150);\n\n    REQUIRE(ViewHelpers::calculateCenter(point, oldCenter, 0.5) == newCenter);\n\n    newCenter.x = 300;\n    newCenter.y = 300;\n\n    REQUIRE(ViewHelpers::calculateCenter(point, oldCenter, 2.0) == newCenter);\n\n}\n\nTEST_CASE(\"Date string format\", \"[getCurrentDate]\"){\n    auto now = time(NULL);\n    const tm* ltime = localtime(&now);\n    std::stringstream sstream;\n    sstream << ltime->tm_year + 1900 << \"/\" <<\n            std::setfill('0') << std::setw(2) << ltime->tm_mon + 1 << \"/\" <<\n            std::setfill('0') << std::setw(2) << ltime->tm_mday << std::flush;\n\n    REQUIRE(ViewHelpers::getCurrentDate() ==  sstream.str().c_str());\n}\n\n"
  },
  {
    "path": "README.md",
    "content": "## depthmapX - multi-platform spatial network analyses software\n\n\nThis is the home for the development of depthmapX.\n\n\nLatest releases can be found at the [releases page](https://github.com/SpaceGroupUCL/depthmapX/releases)\n\n\nFor any issues/bugs/crashes please create [a new issue](https://github.com/SpaceGroupUCL/depthmapX/issues/new)\n\n\nFor more information please check the [documentation](./docs/index.md) and the [wiki](https://github.com/SpaceGroupUCL/depthmapX/wiki)\n\n[About depthmapX](./docs/about.md)\n\n\n##\n\ndepthmapX is licensed under the [GPLv3](http://www.gnu.org/licenses/gpl-3.0.html) licence. \n\ndepthmapX uses [Qt5](http://www.qt.io) as UI toolkit and build system, [Catch](https://github.com/philsquared/catch) as unit testing framework and [FakeIt](https://github.com/eranpeer/FakeIt) for test mocks.\n\nPlease join the depthmapX mail distribution list at www.jiscmail.ac.uk/lists/DEPTHMAP.html for updates.\n\nThe developers and users of depthmapX can also be found on matrix for more direct and extended discussions in the following channels:\n- [depthmapX-users](https://matrix.to/#/#depthmapX-users:matrix.org) - for general discussion, and questions about using depthmapX\n- [depthmapX-devel](https://matrix.to/#/#depthmapX-devel:matrix.org) - for development discussion\n"
  },
  {
    "path": "RegressionTest/RegressionTestRunner.py",
    "content": "import runhelpers\nimport config\nimport depthmaprunner\nimport performancerunner\nimport os\nimport sys\n\ndefaultConfigFile = \"regressionconfig.json\"\n\nclass RegressionTestRunner():\n    def __init__(self, configfile, runfunc):\n        self.config = config.RegressionConfig(configfile)\n        self.testBinary = runhelpers.getTestExecutable(self.config.testbinlocation)\n        print(\"Binary under test is \" + self.testBinary)\n        self.baseBinary = runhelpers.getExecutable(self.config.basebinlocation)\n        print(\"Baseline binary is \" + self.baseBinary)\n        self.runfunc = runfunc\n\n    def run(self):\n        if not os.path.exists(self.config.rundir):\n            os.makedirs(self.config.rundir)\n        if self.config.performanceRegression.enabled:\n            print(\"Performance regression runs enabled\")\n            runner = performancerunner.PerformanceRunner(self.runfunc, self.baseBinary, self.testBinary, self.config.rundir,self.config.performanceRegression )\n        else:\n            print(\"Default regression runs - no performance\")\n            runner = depthmaprunner.DepthmapRegressionRunner( self.runfunc, self.baseBinary, self.testBinary, self.config.rundir )\n\n        good = True\n        for name, case in self.config.testcases.items():\n            print(\"Running test case \" + name)\n            success, output = runner.runTestCase(name, case)\n            if not success:\n                good = False\n                print (\"Failed:\\n\" + output)\n            else:\n                print(\"ok\")\n        return good        \n\nif __name__ == \"__main__\":\n    print(\"Starting up RegressionTestRunner\")\n    configFile = defaultConfigFile\n    if len(sys.argv) == 2:\n        configFile = sys.argv[1]\n    print(\"Config file in use is: \" + configFile)\n    r = RegressionTestRunner(configFile, runhelpers.runExecutable)\n    print(\"Setup complete, starting run\")\n    if not r.run():\n        exit(-1)\n\n"
  },
  {
    "path": "RegressionTest/cmdlinewrapper.py",
    "content": "class CommandLineError(Exception):\n    def __init__(self, message):\n        self.message = message\n    \n\nclass DepthmapCmd():\n    def __init__(self):\n        self.infile = None\n        self.outfile = None\n        self.simpleMode = False\n        self.mode = None\n        self.extraArgs = {}\n        self.timingFile = None\n\n\n    def toCmdArray(self):\n        if self.infile == None:\n            raise CommandLineError(\"infile must be defined\")\n        if self.outfile == None:\n            raise CommandLineError(\"outfile must be defined\")\n        if self.mode == None:\n            raise CommandLineError(\"mode must be defined\")\n        args = [\"-f\", self.infile, \"-o\", self.outfile, \"-m\", self.mode]\n        if self.simpleMode:\n            args.append(\"-s\")\n\n        if self.timingFile:\n            args.extend([\"-t\", self.timingFile])\n        \n        for key, value in self.extraArgs.items():\n            if isinstance(value, list):\n                for v in value:\n                    args.append(key)\n                    args.append(v)\n            else:\n                args.append(key)\n                if value:\n                    args.append(value)\n\n        return args    \n\n"
  },
  {
    "path": "RegressionTest/config.py",
    "content": "import json\nimport os.path\nimport cmdlinewrapper\nfrom performanceregressionconfig import PerformanceRegressionConfig\n\n\nclass ConfigError(Exception):\n    def __init__(self, message):\n        self.message = message\n\ndef buildCmd(testcaseSet):\n    cmds = [];\n    for testcase in testcaseSet:\n        cmd = cmdlinewrapper.DepthmapCmd()\n        cmd.infile = testcase[\"infile\"]\n        cmd.outfile = testcase[\"outfile\"]\n        cmd.mode = testcase[\"mode\"]\n        if \"simple\" in testcase and not testcase[\"simple\"]  == \"false\":\n            cmd.simpleMode = True\n        cmd.extraArgs = testcase.get(\"extraArgs\", {})\n        cmds.append(cmd)\n    return cmds\n\nclass RegressionConfig():\n    def __init__(self, filename):\n        with open(filename, \"r\") as f:\n            config = json.load(f)\n        configdir = os.path.dirname(filename)\n        self.rundir = config[\"rundir\"]\n        self.basebinlocation = config[\"basebinlocation\"]\n        self.testbinlocation = config[\"testbinlocation\"]\n        self.performanceRegression = PerformanceRegressionConfig(config.get(\"performance\", None))\n        self.testcases = {}\n        for (name, tc) in config[\"testcases\"].items():\n            self.testcases[name] = buildCmd(tc)\n\n\n"
  },
  {
    "path": "RegressionTest/depthmaprunner.py",
    "content": "import os.path\nimport cmdlinewrapper\nimport difflib\nimport pprint\n\nimport runhelpers\n\n\nclass DepthmapRunner():\n    def __init__(self, runFunc, binary ):\n        self.__runFunc = runFunc\n        self.__binary = binary\n        \n    def runDepthmap(self, cmdWrapper, runDir):\n        args = [self.__binary]\n        args.extend(cmdWrapper.toCmdArray())\n        return self.__runFunc(runDir, args)\n\ndef diffBinaryFiles(file1, file2):\n    with open(file1, \"rb\") as f:\n        content1 = f.read()\n    with open(file2, \"rb\") as f:\n        content2 = f.read()\n    gen = difflib.diff_bytes(difflib.unified_diff, [content1], [content2])\n    return not(list(gen))\n\nclass DepthmapRegressionRunner():\n    def __init__(self, runFunc, baseBinary, testBinary, workingDir):\n        self.__baseRunner = DepthmapRunner(runFunc, baseBinary)\n        self.__testRunner = DepthmapRunner(runFunc, testBinary)\n        self.__workingDir = workingDir\n\n    def makeBaseDir(self, name):\n        return os.path.join(self.__workingDir, name + \"_base\")\n\n    def makeTestDir(self, name):\n        return os.path.join(self.__workingDir, name + \"_test\")\n\n    def runTestCase(self, name, cmds):\n        runhelpers.prepareDirectory(self.makeBaseDir(name))\n        runhelpers.prepareDirectory(self.makeTestDir(name))\n        return self.runTestCaseImpl(name, cmds)\n\n    def runTestCaseImpl(self, name, cmds):\n        baseDir = self.makeBaseDir(name)\n        for step,cmd in enumerate(cmds):\n            (baseSuccess, baseOut) = self.__baseRunner.runDepthmap(cmd, baseDir)\n            if not baseSuccess:\n                print(\"Baseline run failed at step \" + str(step) + \" with arguments \" + pprint.pformat(cmd.toCmdArray()))\n                print(baseOut)\n                return (False, \"Baseline run failed at step: \" + str(step))\n\n        testDir = self.makeTestDir(name)\n        for step,cmd in enumerate(cmds):\n            (testSuccess, testOut) = self.__testRunner.runDepthmap(cmd, testDir)\n            if not testSuccess:\n                print(\"Test run failed at step \" + str(step) + \" with arguments \" + pprint.pformat(cmd.toCmdArray()))\n                print(testOut)\n                return (False, \"Test run failed at step: \" + str(step))\n\n        baseFile = os.path.join(baseDir, cmds[-1].outfile)\n        testFile = os.path.join(testDir, cmds[-1].outfile)\n        if not os.path.exists(baseFile):\n            message = \"Baseline output {0} does not exist\".format(baseFile)\n            print (message)\n            return (False, message)\n        if not os.path.exists(testFile):\n            message = \"Test output {0} does not exist\".format(testFile)\n            print(message)\n            return (False, message)\n        \n        if not diffBinaryFiles(baseFile, testFile):\n            message = \"Test outputs differ\"\n            print (message)\n            return (False, message)\n\n        return (True, \"\")\n\n\n"
  },
  {
    "path": "RegressionTest/performance_regression.json",
    "content": "{\n  \"rundir\": \"rundir\",\n  \"basebinlocation\": \"../../BaselineBinaries\",\n  \"testbinlocation\": \"../../../build\",\n  \"performance\":{},\n  \"testcases\": {\n    \"vis_prep_dense_pointmap\":[{\n        \"infile\": \"../../../testdata/rect1x1.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"VISPREP\",\n        \"extraArgs\": {\n            \"-pg\": \"0.02\",\n            \"-pp\": \"0.5,0.5\"\n        }\n    }],\n    \"visibility_local\": [{\n        \"infile\": \"../../../testdata/gallery_connected.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"VGA\",\n        \"extraArgs\": {\n            \"-vm\": \"visibility\",\n            \"-vl\": \"\"\n        }\n    }],\n    \"vga_isovist\": [{\n        \"infile\": \"../../../testdata/gallery_connected.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"VGA\",\n        \"extraArgs\": {\n            \"-vm\": \"isovist\"\n        }\n    }],\n    \"vga_angular\": [{\n        \"infile\": \"../../../testdata/turns_connected.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"VGA\",\n        \"extraArgs\": {\n            \"-vm\": \"angular\"\n        }\n    }],\n    \"vga_metric\": [{\n        \"infile\": \"../../../testdata/turns_connected.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"VGA\",\n        \"extraArgs\": {\n            \"-vm\": \"metric\",\n            \"-vr\": \"n\"\n        }\n    }],\n    \"vga_thru_vision\": [{\n        \"infile\": \"../../../testdata/gallery_connected.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"VGA\",\n        \"extraArgs\": {\n            \"-vm\": \"thruvision\"\n        }\n    }],\n    \"isovist_args\": [{\n        \"infile\": \"../../../testdata/gallery_empty.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"ISOVIST\",\n        \"extraArgs\":\n        {\n            \"-ii\":  [\"1.77,6.6,90,30\", \"3.1,5.6,270,90\" ]\n        }\n    }],\n    \"visibility_global_n\": [{\n      \"infile\": \"../../../testdata/gallery_connected.graph\",\n      \"outfile\": \"out.graph\",\n      \"mode\": \"VGA\",\n      \"extraArgs\": {\n        \"-vm\": \"visibility\",\n        \"-vg\": \"1\",\n        \"-vr\": \"n\"\n      }\n    }],\n    \"axial_makelines\": [{\n        \"infile\": \"../../../testdata/gallery_empty.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"AXIAL\",\n        \"extraArgs\":{\n            \"-xl\": \"3,5\",\n            \"-xf\": \"\"\n        }\n    }],\n    \"axial_rn\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended2_axial.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"AXIAL\",\n        \"extraArgs\": {\n            \"-xa\": \"n\"\n        }\n    }],\n    \"axial_rn_choice\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended2_axial.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"AXIAL\",\n        \"extraArgs\": {\n            \"-xa\": \"n\",\n            \"-xac\": \"\"\n        }\n    }],\n    \"axial_rn_local\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended2_axial.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"AXIAL\",\n        \"extraArgs\": {\n            \"-xa\": \"n\",\n            \"-xal\": \"\"\n        }\n    }],\n    \"segment_tulip_1024_rn_steps\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"SEGMENT\",\n        \"extraArgs\": {\n            \"-st\": \"tulip\",\n            \"-stb\": \"1024\",\n            \"-sr\": \"n\",\n            \"-srt\": \"steps\"\n        }\n    }],\n    \"segment_tulip_1024_rn_steps_choice\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"SEGMENT\",\n        \"extraArgs\": {\n            \"-st\": \"tulip\",\n            \"-stb\": \"1024\",\n            \"-sr\": \"n\",\n            \"-srt\": \"steps\",\n            \"-sic\": \"\"\n        }\n    }],\n    \"segment_tulip_1024_rn_steps_weighted\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"SEGMENT\",\n        \"extraArgs\": {\n            \"-st\": \"tulip\",\n            \"-stb\": \"1024\",\n            \"-sr\": \"n\",\n            \"-srt\": \"steps\",\n            \"-swa\": \"Segment Length\"\n        }\n    }],\n    \"segment_topological_rn\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"SEGMENT\",\n        \"extraArgs\": {\n            \"-st\": \"topological\",\n            \"-sr\": \"n\"\n        }\n    }],\n    \"segment_metric_rn\": [{\n        \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"SEGMENT\",\n        \"extraArgs\": {\n            \"-st\": \"metric\",\n            \"-sr\": \"n\"\n        }\n    }],\n    \"convert_drawing_axial\":[{\n        \"infile\": \"../../../testdata/barnsbury_extended2_drawing.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"MAPCONVERT\",\n        \"extraArgs\": {\n            \"-co\": \"axial\",\n            \"-con\": \"Axial Map Test\"\n        }\n    }],\n    \"convert_axial_segment\":[{\n        \"infile\": \"../../../testdata/barnsbury_extended2_axial.graph\",\n        \"outfile\": \"out.graph\",\n        \"mode\": \"MAPCONVERT\",\n        \"extraArgs\": {\n            \"-co\": \"segment\",\n            \"-con\": \"Segment Map Test\"\n        }\n    }]\n  }\n}\n"
  },
  {
    "path": "RegressionTest/performanceregressionconfig.py",
    "content": "\n\nclass PerformanceRegressionConfig:\n    \"\"\" Encapsulate performance regression config\n        This takes an optional performance regression config. All Elements\n        in the performance regression config are optional. If it is None\n        completly, performance regresssion will be disabled\n        \"peformanceRegression\":\n        {\n            enabled = 1,   <- enabling performance regression - only required if nothing else is set, the existence of a non null config will turn on performance regression\n            runsPerInstance = 3, <- how many runs of each run def to run and average over\n            relativeThresholdInPercent = 1.5, <- how many percent can the new version be slower without failing\n            absoluteThresholdInSeconds = 2.3, <- how many seconds the new version can be slower without failing\n                                                 of the two above, breaching the lower one will lead to failure.\n        }\n    \"\"\"\n    def __init__(self, perfConfig):\n        if None == perfConfig or (\"enabled\" in perfConfig and perfConfig[\"enabled\"] not in [\"True\", \"true\", \"1\", \"yes\"]):\n            self.enabled = False\n            return\n        self.enabled = True;\n        self.runsPerInstance = int(perfConfig.get(\"runsPerInstance\", 3))\n        self.relativeThresholdInPercent = float(perfConfig.get(\"relativeThresholdInPercent\", 1))\n        self.absoluteThresholdInSeconds = float(perfConfig.get(\"absoluteThresholdInSeconds\",1))\n"
  },
  {
    "path": "RegressionTest/performancerunner.py",
    "content": "from statistics import mean\nfrom collections import OrderedDict\n\nimport depthmaprunner\nimport os\nimport csv\n\nimport runhelpers\nfrom performanceregressionconfig import PerformanceRegressionConfig\n\ndef checkPerformance(baseFile, testFile, relativeThreshold, absoluteThreshold):\n    \"\"\"\n    Check the performance of 2 depthmap runs against each other\n    This function expects the timing from a base and test run and  parses them\n    as CSV. For now, it expects the entries to be the same. It will return an\n    error message if\n    * one or both of the files are missing\n    * the number of lines or the labels don't match\n    * the test run is more than 5 seconds or 5% slower than the baseline\n      (whatever is greater)\n    \"\"\"\n    if not os.path.exists(baseFile):\n        return \"Base performance timing file {0} is missing\".format(baseFile)\n    if not os.path.exists(testFile):\n        return \"Test performance timing file {0} is missing\".format(testFile)\n    with open(baseFile) as baseHandle, open(testFile) as testHandle:\n        baseReader = csv.DictReader(baseHandle)\n        testReader = csv.DictReader(testHandle)\n\n        baseDone = False\n        testDone = False\n\n        while True:\n            try:\n                baseLine = next(baseReader)\n            except StopIteration:\n                baseDone = True\n\n            try:\n                testLine = next(testReader)\n            except StopIteration:\n                testDone = True\n\n            if baseDone and testDone:\n                return \"\"\n            if baseDone and not testDone:\n                return \"baseline performance file {0} has fewer lines than the test one {1}\".format(baseFile, testFile)\n            if testDone and not baseDone:\n                return \"baseline performance file {0} has more lines than the test one {1}\".format(baseFile, testFile)\n\n            if not baseLine[\"action\"] == testLine[\"action\"]:\n                return \"performance line mismatch: base '{0}', test '{1}'\".format(baseLine[\"action\"], testLine[\"action\"])\n\n            baseTime = float(baseLine[\"average\"])\n            testTime = float(testLine[\"average\"])\n\n            allowance = max(absoluteThreshold, baseTime * relativeThreshold / 100 )\n            if testTime > baseTime + allowance:\n                return \"Performance regression: {0} took {1}s instead of {2}s\".format(baseLine[\"action\"], testLine[\"average\"], baseLine[\"average\"])\n\ndef aggregatePerformanceStats(dir, numRuns, numCmds, filenameTemplate ):\n    data = OrderedDict()\n    totalValues = []\n    for i in range(numRuns):\n        for j in range(numCmds):\n            with open(os.path.join(dir, filenameTemplate.format(i, j)), \"r\") as f:\n                reader = csv.DictReader(f)\n                total = 0\n                for line in reader:\n                    if not line[\"action\"] in data:\n                        data[line[\"action\"]] = []\n                    data[line[\"action\"]].append(float(line[\"duration\"]))\n                    total = total + float(line[\"duration\"])\n                totalValues.append(total)\n    data[\"total\"] = totalValues\n\n    outputFile =os.path.join(dir, filenameTemplate.format(\"\", \"all\"))\n    with open(outputFile, \"w+\") as f:\n        writer = csv.DictWriter(f, [\"action\", \"min\", \"max\", \"average\"])\n        writer.writeheader()\n        for key, val in data.items():\n            rowDict = {\"action\": key, \"min\": min(val), \"max\": max(val), \"average\": mean(val)}\n            writer.writerow(rowDict)\n    return outputFile\n\nclass PerformanceRunner(depthmaprunner.DepthmapRegressionRunner):\n    def __init__(self, runFunc, baseBinary, testBinary, workingDir,  perfConfig):\n        depthmaprunner.DepthmapRegressionRunner.__init__(self,runFunc,baseBinary,testBinary,workingDir)\n        self.perfConfig = perfConfig\n\n    def runTestCase(self, name, cmds):\n        runhelpers.prepareDirectory(self.makeBaseDir(name))\n        runhelpers.prepareDirectory(self.makeTestDir(name))\n\n        nameTemplate = \"timings_{0}_{1}.csv\"\n        for i in range(self.perfConfig.runsPerInstance):\n            print (\"Running test case {0}, run {1} of {2}\".format(name, i, self.perfConfig.runsPerInstance))\n            for j in range(len(cmds)):\n                cmds[j].timingFile = nameTemplate.format(i,j)\n            result, message = self.runTestCaseImpl(name, cmds)\n            if not result:\n                return (False, \"Run {0} failed with message: {1}\".format(i, message))\n\n        testFile = aggregatePerformanceStats(self.makeTestDir(name),self.perfConfig.runsPerInstance, len(cmds), nameTemplate)\n        baseFile = aggregatePerformanceStats(self.makeBaseDir(name),self.perfConfig.runsPerInstance, len(cmds), nameTemplate)\n        message = checkPerformance(testFile, baseFile, self.perfConfig.relativeThresholdInPercent, self.perfConfig.absoluteThresholdInSeconds)\n        if message:\n            return (False, message)\n        return (True, \"\")"
  },
  {
    "path": "RegressionTest/regressionconfig.json",
    "content": "{\n    \"rundir\": \"rundir\",\n    \"basebinlocation\": \"../../BaselineBinaries\",\n    \"testbinlocation\": \"../../../build\",\n    \"testcases\": {\n        \"links_pointmap_manual\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lnk\": [\"1.32,7.24,4.88,5.24\",\"1.16,5.28,3.28,7.12\"]\n            }\n        }],\n        \"links_pointmap_file\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n                \"-lf\": \"../../../testdata/gallery_connected_merge_links.txt\"\n            }\n        }],\n        \"unlinks_shapegraph_coords\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lmt\": \"shapegraphs\",\n               \"-lm\": \"unlink\",\n               \"-lt\": \"coords\",\n               \"-lnk\": \"530797,184255\"\n            }\n        }],\n        \"unlinks_shapegraph_refs\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lmt\": \"shapegraphs\",\n               \"-lm\": \"unlink\",\n               \"-lt\": \"refs\",\n               \"-lnk\": \"18,24\"\n            }\n        }],\n        \"links_shapegraph_coords\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lmt\": \"shapegraphs\",\n               \"-lm\": \"link\",\n               \"-lt\": \"coords\",\n               \"-lnk\": \"530684,184098,531388,184353\"\n            }\n        }],\n        \"links_shapegraph_refs\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lmt\": \"shapegraphs\",\n               \"-lm\": \"link\",\n               \"-lt\": \"refs\",\n               \"-lnk\": \"1,41\"\n            }\n        }],\n        \"links_shapegraph_refs_non_cont_keys\": [{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lmt\": \"shapegraphs\",\n               \"-lm\": \"link\",\n               \"-lt\": \"refs\",\n               \"-lnk\": \"17,11\"\n            }\n        }],\n        \"visibility_local\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vl\": \"\"\n            }\n        }],\n        \"visibility_local_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vl\": \"\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"visibility_global_with_multiple_pointmaps\": [{\n            \"infile\": \"../../../testdata/gallery_two_pointmaps.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vg\": \"\",\n                \"-vr\": \"3\"\n            }\n        }],\n        \"visibility_global_3\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vg\": \"\",\n                \"-vr\": \"3\"\n            }\n        }],\n        \"visibility_global_3_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vg\": \"\",\n                \"-vr\": \"3\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"pointmap_export_links\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-links-csv\"\n            }\n        }],\n        \"axial_export_map_csv\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"shapegraph-map-csv\"\n            }\n        }],\n        \"axial_export_map_mif_given_mif\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.mif\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"shapegraph-map-mif\"\n            }\n        }],\n        \"axial_export_map_mif_given_mid\": [{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.mid\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"shapegraph-map-mif\"\n            }\n        }],\n        \"visibility_global_n\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vg\": \"\",\n                \"-vr\": \"n\"\n            }\n        }],\n        \"visibility_global_n_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"visibility\",\n                \"-vg\": \"\",\n                \"-vr\": \"n\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"vga_isovist\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"isovist\"\n            }\n        }],\n        \"vga_isovist_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"isovist\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"vga_angular\": [{\n            \"infile\": \"../../../testdata/turns_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"angular\"\n            }\n        }],\n        \"vga_angular_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"angular\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"vga_metric\": [{\n            \"infile\": \"../../../testdata/turns_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"metric\",\n                \"-vr\": \"n\"\n            }\n        }],\n        \"vga_metric_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"metric\",\n                \"-vr\": \"n\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"vga_thru_vision\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"thruvision\"\n            }\n        }],\n        \"vga_thru_vision_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VGA\",\n            \"extraArgs\": {\n                \"-vm\": \"thruvision\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"pointmap-data-csv\"\n            }\n        }],\n        \"vga_visual_step_depth\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"STEPDEPTH\",\n            \"extraArgs\":{\n                \"-sdp\": \"3,5\",\n                \"-sdt\": \"visual\"\n            }\n        }],\n        \"vga_metric_step_depth\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"STEPDEPTH\",\n            \"extraArgs\":{\n                \"-sdp\": \"3,5\",\n                \"-sdt\": \"metric\"\n            }\n        }],\n        \"vga_angular_step_depth\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"STEPDEPTH\",\n            \"extraArgs\":{\n                \"-sdp\": \"3,5\",\n                \"-sdt\": \"angular\"\n            }\n        }],\n        \"isovist_args\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"ISOVIST\",\n            \"extraArgs\":\n            {\n                \"-ii\":  [\"1.77,6.6,90,30\", \"3.1,5.6,270,90\" ]\n            }\n        }],\n        \"isovist_file\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"ISOVIST\",\n            \"extraArgs\":\n            {\n                \"-if\":  \"../../../testdata/isovists.csv\"\n            }\n        }],\n        \"axial_makelines\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\":{\n                \"-xl\": \"3,5\",\n                \"-xf\": \"\"\n            }\n        }],\n        \"axial_makelines_polywall\": [{\n            \"infile\": \"../../../testdata/polywall.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\":{\n                \"-xl\": \"4300,1500\"\n            }\n        }],\n        \"axial_makelines_rooms\": [{\n            \"infile\": \"../../../testdata/rooms.dxf\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"IMPORT\",\n            \"extraArgs\":{}\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\":{\n                \"-xl\": \"7.5,7.5\",\n                \"-xf\": \"\"\n            }\n        }],\n        \"axial_rn\": [{\n            \"infile\": \"../../../testdata/simple_axlines.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\"\n            }\n        }],\n        \"axial_r3\": [{\n            \"infile\": \"../../../testdata/simple_axlines.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"3\"\n            }\n        }],\n        \"axial_rn_length_weighted\": [{\n            \"infile\": \"../../../testdata/simple_axlines.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xaw\": \"Line Length\"\n            }\n        }],\n        \"axial_rn_rra\": [{\n            \"infile\": \"../../../testdata/simple_axlines.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xar\": \"\"\n            }\n        }],\n        \"axial_rn_choice\": [{\n            \"infile\": \"../../../testdata/simple_axlines.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xac\": \"\"\n            }\n        }],\n        \"axial_rn_local\": [{\n            \"infile\": \"../../../testdata/simple_axlines.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xal\": \"\"\n            }\n        }],\n        \"axial_rn_noncont_keys\": [{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\"\n            }\n        }],\n        \"axial_r3_noncont_keys\": [{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"3\"\n            }\n        }],\n        \"axial_rn_rra_noncont_keys\": [{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xar\": \"\"\n            }\n        }],\n        \"axial_rn_choice_noncont_keys\": [{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xac\": \"\"\n            }\n        }],\n        \"axial_rn_local_noncont_keys\": [{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AXIAL\",\n            \"extraArgs\": {\n                \"-xa\": \"n\",\n                \"-xal\": \"\"\n            }\n        }],\n        \"segment_tulip_1024_rn_steps\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"n\",\n                \"-srt\": \"steps\"\n            }\n        }],\n        \"segment_tulip_1024_rn_steps_choice\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"n\",\n                \"-srt\": \"steps\",\n                \"-sic\": \"\"\n            }\n        }],\n        \"segment_tulip_1024_rn_steps_weighted\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"n\",\n                \"-srt\": \"steps\",\n                \"-swa\": \"Segment Length\"\n            }\n        }],\n        \"segment_tulip_512_rn_steps\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"512\",\n                \"-sr\": \"n\",\n                \"-srt\": \"steps\"\n            }\n        }],\n        \"segment_tulip_123_rn_steps\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"123\",\n                \"-sr\": \"n\",\n                \"-srt\": \"steps\"\n            }\n        }],\n        \"segment_tulip_4_rn_steps\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"4\",\n                \"-sr\": \"n\",\n                \"-srt\": \"steps\"\n            }\n        }],\n        \"segment_tulip_1024_r5_steps\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"5\",\n                \"-srt\": \"steps\"\n            }\n        }],\n        \"segment_tulip_1024_rn_r5_steps\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"5,n\",\n                \"-srt\": \"steps\"\n            }\n        }],\n        \"segment_tulip_1024_r500_metric\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"500\",\n                \"-srt\": \"metric\"\n            }\n        }],\n        \"segment_tulip_1024_r180_angular\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"tulip\",\n                \"-stb\": \"1024\",\n                \"-sr\": \"500\",\n                \"-srt\": \"metric\"\n            }\n        }],\n        \"segment_angular_rn\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"angular\",\n                \"-sr\": \"n\"\n            }\n        }],\n        \"segment_topological_rn\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"topological\",\n                \"-sr\": \"n\"\n            }\n        }],\n        \"segment_metric_rn\": [{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENT\",\n            \"extraArgs\": {\n                \"-st\": \"metric\",\n                \"-sr\": \"n\"\n            }\n        }],\n        \"import_dxf_to_drawing\":[{\n            \"infile\": \"../../../testdata/barnsbury_extended1.dxf\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"IMPORT\",\n            \"extraArgs\": {}\n        }],\n        \"import_csv_to_drawing\":[{\n            \"infile\": \"../../../testdata/barnsbury_extended1_axial.csv\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"IMPORT\",\n            \"extraArgs\": {}\n        }],\n        \"import_tsv_to_data\":[{\n            \"infile\": \"../../../testdata/barnsbury_extended1_axial.tsv\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"IMPORT\",\n            \"extraArgs\": {\n                \"-it\": \"data\"\n            }\n        }],\n        \"convert_drawing_axial\":[{\n            \"infile\": \"../../../testdata/barnsbury_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"axial\",\n                \"-con\": \"Axial Map Test\"\n            }\n        }],\n        \"convert_drawing_segment\":[{\n            \"infile\": \"../../../testdata/barnsbury_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\"\n            }\n        }],\n        \"convert_drawing_segment_only_map\":[{\n            \"infile\": \"../../../testdata/barnsbury_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.csv\",\n            \"mode\": \"EXPORT\",\n            \"extraArgs\": {\n                \"-em\": \"shapegraph-map-csv\"\n            }\n        }],\n        \"convert_drawing_convex\":[{\n            \"infile\": \"../../../testdata/polygons_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"convex\",\n                \"-con\": \"Convex Map Test\"\n            }\n        }],\n        \"convert_drawing_data_convex\":[{\n            \"infile\": \"../../../testdata/polygons_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"convex\",\n                \"-con\": \"Convex Map Test\"\n            }\n        }],\n        \"convert_drawing_data_drawing_polygons\":[{\n            \"infile\": \"../../../testdata/polygons_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"drawing\",\n                \"-con\": \"Drawing Map Test\"\n            }\n        }],\n        \"convert_drawing_data_drawing_lines\":[{\n            \"infile\": \"../../../testdata/barnsbury_drawing.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"drawing\",\n                \"-con\": \"Drawing Map Test\"\n            }\n        }],\n        \"convert_axial_data\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        }],\n        \"convert_axial_data_copy_attributes\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\",\n                \"-coc\":\"\"\n            }\n        }],\n        \"convert_axial_drawing\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"drawing\",\n                \"-con\": \"Drawing Map Test\"\n            }\n        }],\n        \"convert_axial_segment\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\"\n            }\n        }],\n        \"convert_axial_segment_remove_input\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\",\n                \"-cir\":\"\"\n            }\n        }],\n        \"convert_axial_segment_trim_lines\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\",\n                \"-crsl\":\"40\"\n            }\n        }],\n        \"convert_axial_segment_copy_attributes\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\",\n                \"-coc\": \"\"\n            }\n        }],\n        \"convert_axial_segment_copy_attributes_non_cont_keys\":[{\n            \"infile\": \"../../../testdata/axmap_noncont_keys.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"segment\",\n                \"-con\": \"Segment Map Test\",\n                \"-coc\": \"\"\n            }\n        }],\n        \"convert_axial_data_axial\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"axial\",\n                \"-con\": \"Axial Map Test\"\n            }\n        }],\n        \"convert_axial_data_axial_copy_attributes\":[{\n            \"infile\": \"../../../testdata/barnsbury_axial.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\",\n                \"-coc\": \"\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"axial\",\n                \"-con\": \"Axial Map Test\",\n                \"-coc\": \"\"\n            }\n        }],\n        \"convert_segment_data\":[{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        }],\n        \"convert_segment_data_segment\":[{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"axial\",\n                \"-con\": \"Segment Map Test\"\n            }\n        }],\n        \"convert_segment_data_segment_copy_attributes\":[{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"data\",\n                \"-con\": \"Data Map Test\",\n                \"-coc\": \"\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"axial\",\n                \"-con\": \"Segment Map Test\",\n                \"-coc\": \"\"\n            }\n        }],\n        \"convert_segment_drawing\":[{\n            \"infile\": \"../../../testdata/barnsbury_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"MAPCONVERT\",\n            \"extraArgs\": {\n                \"-co\": \"drawing\",\n                \"-con\": \"Drawing Map Test\"\n            }\n        }],\n        \"pointmap_create_fill_make_one_operation\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pg\": \"0.04\",\n               \"-pp\": \"1.32,7.24,4.88,5.24\",\n               \"-pm\": \"\"\n            }\n        }],\n        \"dense_pointmap_create_fill_make\":[{\n            \"infile\": \"../../../testdata/rect1x1.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n                \"-pg\": \"0.02\",\n                \"-pp\": \"0.5,0.5\"\n            }\n        }],\n        \"pointmap_create_fill_make_unmake\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pg\": \"0.04\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pp\": \"1.32,7.24,4.88,5.24\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pm\": \"\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pu\": \"\"\n            }\n        }],\n        \"pointmap_create_fill_make_link_unmake\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pg\": \"0.04\",\n               \"-pp\": \"1.32,7.24,4.88,5.24\",\n               \"-pm\": \"\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lnk\": [\"1.32,7.24,4.88,5.24\",\"1.16,5.28,3.28,7.12\"]\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pu\": \"\"\n            }\n        }],\n        \"pointmap_create_fill_make_link_unmake_unlink\": [{\n            \"infile\": \"../../../testdata/gallery_empty.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pg\": \"0.04\",\n               \"-pp\": \"1.32,7.24,4.88,5.24\",\n               \"-pm\": \"\"\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"LINK\",\n            \"extraArgs\": {\n               \"-lnk\": [\"1.32,7.24,4.88,5.24\",\"1.16,5.28,3.28,7.12\"]\n            }\n        },{\n            \"infile\": \"out.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"VISPREP\",\n            \"extraArgs\": {\n               \"-pu\": \"\",\n               \"-pl\": \"\"\n            }\n        }]\n    }\n}\n"
  },
  {
    "path": "RegressionTest/regressionconfig_agents.json",
    "content": "{\n    \"rundir\": \"rundir\",\n    \"basebinlocation\": \"../../BaselineBinaries\",\n    \"testbinlocation\": \"../../../build\",\n    \"testcases\": {\n        \"agents_defaults\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"standard\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_line_of_sight_length_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"los-length\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_line_of_sight_length_look_only_map\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.tsv\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"los-length\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\",\n                \"-ot\": \"gatecounts\"\n            }\n        }],\n        \"agents_occluded_length_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected_with_isovist.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"occ-length\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_any_occlusion_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"occ-any\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_occlusion_group_bins_45_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"occ-group-45\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_occlusion_group_bins_60_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"occ-group-60\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_furthest_occlusion_per_bin_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"occ-furthest\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_per_bin_far_distance_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"bin-far-dist\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_per_bin_angle_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"bin-angle\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_per_bin_far_distance_and_angle_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"bin-far-dist-angle\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_per_bin_memory_look\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"bin-memory\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\"\n            }\n        }],\n        \"agents_gatecounts\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.tsv\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"standard\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"5\",\n                \"-ot\": \"gatecounts\"\n            }\n        }],\n        \"agents_trails_all\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.cat\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"standard\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\",\n                \"-atrails\": \"0\",\n                \"-ot\": \"trails\"\n            }\n        }],\n        \"agents_trails_1\": [{\n            \"infile\": \"../../../testdata/gallery_connected.graph\",\n            \"outfile\": \"out.cat\",\n            \"mode\": \"AGENTS\",\n            \"extraArgs\": {\n                \"-am\": \"standard\",\n                \"-ats\": \"5000\",\n                \"-arr\": \"0.1\",\n                \"-afov\": \"15\",\n                \"-asteps\": \"3\",\n                \"-alife\": \"1000\",\n                \"-alocseed\": \"0\",\n                \"-atrails\": \"1\",\n                \"-ot\": \"trails\"\n            }\n        }]\n    }\n}\n"
  },
  {
    "path": "RegressionTest/runhelpers.py",
    "content": "import os\nimport shutil\nimport subprocess\nimport platform\n\ndef runTest():\n   pass \n\nclass cd:\n    \"\"\"Context manager for changing the current working directory\"\"\"\n    def __init__(self, newPath):\n        self.newPath = os.path.expanduser(newPath)\n\n    def __enter__(self):\n        self.savedPath = os.getcwd()\n        os.chdir(self.newPath)\n\n    def __exit__(self, etype, value, traceback):\n        os.chdir(self.savedPath)\n\n\ndef prepareDirectory(dirname):\n    if os.path.exists( dirname ):\n        shutil.rmtree(dirname)\n    os.makedirs(dirname)\n\ndef runExecutable( workingDir, arguments ):\n    \"\"\" Prepares a clean run directoy and runs the process in this \"\"\"\n    with cd(workingDir):\n        with open(\"out.txt\", \"w\") as outfile:\n            result = subprocess.run(arguments, stdout = outfile, stderr = subprocess.STDOUT )\n        output = \"\"\n        if os.path.exists( \"out.txt\"):\n            with open( \"out.txt\", \"r\" ) as f:\n                output = f.read()\n        if os.path.exists( \"err.txt\" ):\n            with open( \"err.txt\", \"r\") as f:\n                error = f.read();\n        return (result.returncode == 0, output)\n\ndef getExecutable(basedir):\n    sys = platform.system()\n    if sys == \"Windows\":\n        return os.path.join(basedir, sys, \"depthmapXcli.exe\")\n    else:\n        return os.path.join(basedir, sys, \"depthmapXcli\")\n\ndef getTestExecutable(basedir):\n    sys = platform.system()\n    if sys == \"Windows\":\n        return os.path.join(basedir, \"depthmapXcli\", \"release\", \"depthmapXcli.exe\")\n    else:\n        return os.path.join(basedir, \"depthmapXcli\", \"depthmapXcli\")\n\n\n"
  },
  {
    "path": "RegressionTest/test/context.py",
    "content": "import os\nimport sys\nsys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))\n\nimport cmdlinewrapper\nimport config\nimport depthmaprunner\nimport RegressionTestRunner\nimport runhelpers\nimport performanceregressionconfig\nimport performancerunner"
  },
  {
    "path": "RegressionTest/test/disposablefile.py",
    "content": "import os\nimport shutil\n\nclass DisposableFile:\n    def __init__( self, filename ):\n        self.__filename = filename\n\n    def __enter__(self):\n        return self \n\n    def __exit__(self, exc_type, exc_value, traceback):\n        if os.path.exists(self.filename()):\n            os.remove(self.filename())\n\n    def filename(self):\n        return self.__filename\n\nclass DisposableDirectoryError(Exception):\n    def __init__(self, message):\n        self.message = message\n\nclass DisposableDirectory:\n    def __init__(self, directoryName, create = False):\n        if directoryName == \".\":\n            raise DisposableDirectoryError(\"The disposable directory cannot be the current directory\")\n        if os.path.exists(directoryName):\n            raise DisposableDirectoryError(\"You can't make an existing directory disposable\")\n        self.__directoryName = directoryName\n        if create:\n            os.makedirs(directoryName)\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_value, backtrace):\n        if os.path.exists(self.__directoryName):\n            shutil.rmtree(self.__directoryName)\n\n    def name(self):\n        return self.__directoryName\n"
  },
  {
    "path": "RegressionTest/test/fail/test_fail.py",
    "content": "import unittest\n\nclass TestFailure(unittest.TestCase):\n    \"\"\"\n        Test case that always fails to test that we capture failures correctly\n    \"\"\"\n    def test_fail_this(self):\n        print(\"This will always fail and should only be used in tests of the unittest framework\")\n        self.assertTrue(False)\n\n\nif __name__==\"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/pass/test_pass.py",
    "content": "import unittest\n\nclass TestFailure(unittest.TestCase):\n    \"\"\"\n        Test case that always passes to test that we capture failures correctly\n    \"\"\"\n    def test_fail_this(self):\n        print(\"This will always pass and should only be used in tests of the unittest framework\")\n        self.assertTrue(True)\n\n\nif __name__==\"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_RegressionTestRunner.py",
    "content": "import unittest\nfrom test_config import writeConfig\nfrom RegressionTestRunner import RegressionTestRunner\nfrom disposablefile import DisposableFile, DisposableDirectory\nimport os\n\nclass TestRegressionTestRunner(unittest.TestCase):\n    def runfunc(self, workingdir, args):\n        if self.counter >= 0:\n            self.counter = self.counter - 1\n        if self.counter == 0:\n            return (False, \"Failed\")\n        if not os.path.exists(workingdir):\n            os.makedirs(workingdir)\n        with open(os.path.join(workingdir, \"outfile.graph\"), \"w\") as f:\n            f.write(\"123\")\n        with open(os.path.join(workingdir, \"runtimes.csv\"), \"w\") as f:\n            f.write(\"action,duration\\n\")\n        return (True, \"\")    \n        \n\n    def test_RegressionTestRunnerAllGoesWell(self):\n        with DisposableFile(\"testconfig.json\") as f, DisposableDirectory(\"testrundir\") as d:\n            writeConfig(f.filename(), d.name())\n            runner = RegressionTestRunner(f.filename(), lambda w, a: self.runfunc(w, a))\n            self.counter = -1\n            self.assertTrue(runner.run())\n\n    def test_RegressionTestRunnerOneRunFails(self):\n        with DisposableFile(\"testconfig.json\") as f, DisposableDirectory(\"testrundir\") as d:\n            writeConfig(f.filename(), d.name())\n            runner = RegressionTestRunner(f.filename(), lambda w, a: self.runfunc(w, a))\n            self.counter = 2\n            self.assertFalse(runner.run())\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_cmdlinewrapper.py",
    "content": "import unittest\n\nimport collections\nfrom context import cmdlinewrapper\n\nclass TestDepthmapCmd(unittest.TestCase):\n    def test_correctBehaviour(self):\n        cmd = cmdlinewrapper.DepthmapCmd()\n        cmd.infile = \"foo\"\n        cmd.outfile = \"bar\"\n        cmd.mode = \"visibility\"\n\n        self.assertEqual(cmd.toCmdArray(), [\"-f\", \"foo\", \"-o\", \"bar\", \"-m\", \"visibility\" ])\n        cmd.simpleMode = True\n        self.assertEqual(cmd.toCmdArray(), [\"-f\", \"foo\", \"-o\", \"bar\", \"-m\", \"visibility\", \"-s\" ])\n\n    def test_exceptions(self):\n        cmd = cmdlinewrapper.DepthmapCmd()\n        with self.assertRaises(cmdlinewrapper.CommandLineError) as cm:\n            cmd.toCmdArray()\n        self.assertEqual(cm.exception.message, \"infile must be defined\")    \n        cmd.infile = \"foo\"\n        with self.assertRaises(cmdlinewrapper.CommandLineError) as cm:\n            cmd.toCmdArray()\n        self.assertEqual(cm.exception.message, \"outfile must be defined\")    \n        cmd.outfile = \"bar\"\n        with self.assertRaises(cmdlinewrapper.CommandLineError) as cm:\n            cmd.toCmdArray()\n        self.assertEqual(cm.exception.message, \"mode must be defined\")    \n\n    def test_extraArgs(self):\n        cmd = cmdlinewrapper.DepthmapCmd()\n        cmd.infile = \"foo\"\n        cmd.outfile = \"bar\"\n        cmd.mode = \"visibility\"\n        # use ordered dict here for testability\n        cmd.extraArgs = collections.OrderedDict([(\"-lnk\", [\"foo\", \"bar\"]), (\"-vm\", \"metric\"), (\"-vg\", \"\" )])\n\n        self.assertEqual(cmd.toCmdArray(), [\"-f\", \"foo\", \"-o\", \"bar\", \"-m\", \"visibility\", \"-lnk\", \"foo\", \"-lnk\", \"bar\", \"-vm\", \"metric\", \"-vg\" ])\n\n            \nif __name__ == \"__main__\":\n    unittest.main()\n\n\n"
  },
  {
    "path": "RegressionTest/test/test_config.py",
    "content": "import unittest\nfrom context import config\nfrom disposablefile import DisposableFile\nimport RegressionTestRunner\nimport os\n\ndef writeConfig(filename, rundir):\n    with open(filename, \"w\") as f:\n        f.write('{ \"rundir\": \"'+ rundir +'\",\\n')\n        f.write('   \"basebinlocation\": \"../baselineBinaries\",\\n')\n        f.write('   \"testbinlocation\": \"../..\",\\n')\n        f.write('  \"testcases\": {\\n')\n        f.write('      \"test1\": [{\\n')\n        f.write('           \"infile\": \"infile.graph\",\\n')\n        f.write('           \"outfile\": \"outfile.graph\",\\n')\n        f.write('           \"mode\": \"VGA\",\\n')\n        f.write('           \"extraArgs\": {\\n')\n        f.write('                 \"-vm\": \"metric\",\\n')\n        f.write('                  \"-vr\": \"7\"}}]}}')\n    \n\n\nclass TestMethods(unittest.TestCase):\n    def test_buildCmd(self):\n        data = [{ \"infile\": \"foo.graph\", \"outfile\": \"bar.graph\", \"mode\": \"VGA\", \"extraArgs\": { \"-vm\": \"visibility\", \"-vg\": \"\", \"-vr\": \"5\"}}]\n        cmds = config.buildCmd( data )\n        self.assertEqual(cmds[0].infile, \"foo.graph\")\n        self.assertEqual(cmds[0].outfile, \"bar.graph\")\n        self.assertEqual(cmds[0].mode, \"VGA\")\n        self.assertEqual(len(cmds[0].extraArgs),3)\n\n\n    def test_configClass(self):\n        with DisposableFile(\"test.config\") as testfile:\n            writeConfig(testfile.filename(), \"../foo/bar\")\n            conf = config.RegressionConfig(testfile.filename())\n            self.assertEqual(len(conf.testcases), 1)\n            self.assertEqual(conf.rundir, \"../foo/bar\")\n            self.assertTrue(\"test1\" in conf.testcases)\n\n\nclass TestRealConfig(unittest.TestCase):\n    def test_realConfig(self):\n        configFile = os.path.join(\"..\", RegressionTestRunner.defaultConfigFile)\n        self.assertNotEqual( configFile, \"\" )\n        conf = config.RegressionConfig(configFile)\n        self.assertFalse(conf.performanceRegression.enabled)\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_depthmaprunner.py",
    "content": "from context import depthmaprunner\n\nimport cmdlinewrapper\nfrom cmdlinewrapper import DepthmapCmd\nimport unittest\nfrom disposablefile import DisposableFile, DisposableDirectory\nimport os.path\n\nclass BinaryDiffTest(unittest.TestCase):\n    def test_binaryDiff(self):\n        with DisposableFile( \"testfile1.bin\" ) as f1, DisposableFile( \"testfile2.bin\") as f2:\n            with open( f1.filename(), \"wb\" ) as f:\n                f.write( bytes.fromhex( \"2000 0839\") )\n            with open( f2.filename(), \"wb\" ) as f:\n                f.write( bytes.fromhex( \"2000 0838\" ))\n            self.assertTrue(depthmaprunner.diffBinaryFiles(f1.filename(), f1.filename()))\n            self.assertFalse(depthmaprunner.diffBinaryFiles(f1.filename(), f2.filename()))\n\n\n\n\nclass DepthmapRunnerTest(unittest.TestCase):\n    def runfunc(self, rundir, args):\n        self.assertEqual(rundir, self.__rundir)\n        self.assertEqual(args, self.__args)\n\n    def testDepthmapRunner(self):\n        dcmd = DepthmapCmd()\n        dcmd.infile = \"foo\"\n        dcmd.outfile = \"bar\"\n        dcmd.mode = \"mode\"\n        dcmd.modeLines = []\n\n        runner = depthmaprunner.DepthmapRunner(lambda d, a: self.runfunc(d, a), \"bin\")\n        \n        self.__args = [\"bin\", \"-f\", \"foo\", \"-o\", \"bar\", \"-m\", \"mode\"]\n        self.__rundir = \"dir\"\n        runner.runDepthmap(dcmd, \"dir\")\n\nclass DepthmapRegressioRunnerTest(unittest.TestCase):\n    def getOutfile(self, args):\n        outputfile = None\n        for i in range(0, len(args)):\n            if args[i] == \"-o\" and i < len(args):\n                outputfile = args[i+1]\n                break\n        self.assertFalse( outputfile == None )\n        return outputfile\n\n    def getTimingsFile(self,args):\n        timingsFile = None\n        for i in range(0, len(args)):\n            if args[i] == \"-t\" and i < len(args):\n                timingsFile = args[i+1]\n                break\n        return timingsFile\n\n    \n    def runfuncSucceedAlwaysSame(self, rundir, args):\n        outpath = os.path.join(rundir, self.getOutfile(args))\n        with open (outpath, \"w\") as f:\n            f.write(\"123\")\n        timingsFile = self.getTimingsFile(args)\n        if timingsFile:\n            with open (os.path.join(rundir, timingsFile), \"w\") as f:\n                f.write('\"action\",\"duration\"\\n')\n        return (True, \"\")\n\n    def runfuncDifferentResults(self, rundir, args):\n        outpath = os.path.join(rundir, self.getOutfile(args))\n        with open (outpath, \"w\") as f:\n            f.write(self.__outContent)\n        self.__outContent = self.__outContent + \"x\"    \n        return (True, \"\")\n        \n    def runfuncWriteNoFile(self, rundir, args, dontWriteFor):\n        if not args[0] == dontWriteFor:\n            outpath = os.path.join(rundir, self.getOutfile(args))\n            with open (outpath, \"w\") as f:\n                f.write(\"123\")\n        return (True, \"\")\n\n    def runfuncFail(self, rundir, args, failFor, shouldOtherRun):\n        if args[0] == failFor:\n            return (False, \"Boom!\")\n        if shouldOtherRun:\n            outpath = os.path.join(rundir, self.getOutfile(args))\n            with open (outpath, \"w\") as f:\n                f.write(\"123\")\n            return (True, \"\")\n        else:\n            self.assertFail(\"Should not have been called for \" + args[0])\n       \n            \n    def makeCommand(self, infile, outfile, mode):\n        cmd = cmdlinewrapper.DepthmapCmd()\n        cmd.infile = infile\n        cmd.outfile = outfile\n        cmd.mode = mode\n        return [cmd]\n\n\n    def testSuccessfullRun(self):\n        with DisposableDirectory(\"testdir\", True) as dir:\n            runner = depthmaprunner.DepthmapRegressionRunner(lambda d, a: self.runfuncSucceedAlwaysSame(d,a), \"basebin\", \"testbin\", dir.name())\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\", \"visibility\"))\n            self.assertTrue(result)\n            \n    def testRunWithDiff(self):\n        self.__outContent = \"abc\"\n        with DisposableDirectory(\"testdir\", True) as dir:\n            runner = depthmaprunner.DepthmapRegressionRunner(lambda d, a: self.runfuncDifferentResults(d,a), \"basebin\", \"testbin\", dir.name())\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\", \"visibility\"))\n            self.assertFalse(result)\n            self.assertEqual(message, \"Test outputs differ\")\n\n    def testBaseRunOutputMissing(self):\n        with DisposableDirectory(\"testdir\", True) as dir:\n            runner = depthmaprunner.DepthmapRegressionRunner(lambda d, a: self.runfuncWriteNoFile(d,a, \"basebin\"), \"basebin\", \"testbin\", dir.name())\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\", \"visibility\"))\n            self.assertFalse(result)\n            self.assertEqual(message, \"Baseline output {0} does not exist\".format(os.path.join(dir.name(), \"testname\" + \"_base\", \"outfile.graph\")))\n\n    def testTestRunOutputMissing(self):\n        with DisposableDirectory(\"testdir\", True) as dir:\n            runner = depthmaprunner.DepthmapRegressionRunner(lambda d, a: self.runfuncWriteNoFile(d,a, \"testbin\"), \"basebin\", \"testbin\", dir.name())\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\", \"visibility\"))\n            self.assertFalse(result)\n            self.assertEqual(message, \"Test output {0} does not exist\".format(os.path.join(dir.name(), \"testname\" + \"_test\", \"outfile.graph\")))\n\n    def testBaseRunFail(self):\n        with DisposableDirectory(\"testdir\", True) as dir:\n            runner = depthmaprunner.DepthmapRegressionRunner(lambda d, a: self.runfuncFail(d,a, \"basebin\", False), \"basebin\", \"testbin\", dir.name())\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\", \"visibility\"))\n            self.assertFalse(result)\n            self.assertEqual(message, \"Baseline run failed at step: 0\")\n\n    def testTestRunFail(self):\n        with DisposableDirectory(\"testdir\", True) as dir:\n            runner = depthmaprunner.DepthmapRegressionRunner(lambda d, a: self.runfuncFail(d,a, \"testbin\", True), \"basebin\", \"testbin\", dir.name())\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\", \"visibility\"))\n            self.assertFalse(result)\n            self.assertEqual(message, \"Test run failed at step: 0\")\n\n\nif __name__==\"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_disposablefile.py",
    "content": "import disposablefile\nimport unittest\nimport os.path\n\nclass TestDisposableFile(unittest.TestCase):\n    def testFileDeletion(self):\n        with disposablefile.DisposableFile(\"testfile.xyz\") as f:\n            self.assertEqual(f.filename(), \"testfile.xyz\")\n            with open( f.filename(), \"w\") as tf:\n                tf.write(\"foo\")\n            self.assertTrue( os.path.exists(f.filename()))\n        self.assertFalse( os.path.exists(\"testfile.xyz\"))\n\n\nclass TestDisposableDirectory(unittest.TestCase):\n    def testLifetime(self):\n        with disposablefile.DisposableDirectory(\"testdir1\", True) as d:\n            self.assertEqual(\"testdir1\", d.name())\n            self.assertTrue(os.path.exists(d.name()))\n            self.assertTrue(os.path.isdir(d.name()))\n            with open ( os.path.join(d.name(), \"testfile.txt\"), \"w\") as f:\n                f.write(\"123\")\n            self.assertTrue(os.path.exists(os.path.join(d.name(), \"testfile.txt\")))\n        self.assertFalse(os.path.exists(d.name()))\n\n    def testNotAutomaticallyCreated(self):\n        with disposablefile.DisposableDirectory(\"testdir1\", False) as d:\n            self.assertEqual(\"testdir1\", d.name())\n            self.assertFalse(os.path.exists(d.name()))\n            os.makedirs(d.name())\n            self.assertTrue(os.path.exists(d.name()))\n            self.assertTrue(os.path.isdir(d.name()))\n            with open ( os.path.join(d.name(), \"testfile.txt\"), \"w\") as f:\n                f.write(\"123\")\n            self.assertTrue(os.path.exists(os.path.join(d.name(), \"testfile.txt\")))\n        self.assertFalse(os.path.exists(d.name()))\n            \n    def testNeverCreated(self):\n        with disposablefile.DisposableDirectory(\"testdir1\", False) as d:\n            self.assertEqual(\"testdir1\", d.name())\n            self.assertFalse(os.path.exists(d.name()))\n        self.assertFalse(os.path.exists(d.name()))\n        \n    def testExceptions(self):\n        with self.assertRaises(disposablefile.DisposableDirectoryError) as cm:\n            disposablefile.DisposableDirectory(\".\")\n        self.assertEqual(cm.exception.message,\"The disposable directory cannot be the current directory\" )\n        with disposablefile.DisposableDirectory(\"testdir1\", True) as d:\n            with self.assertRaises(disposablefile.DisposableDirectoryError) as cm:\n                disposablefile.DisposableDirectory(d.name())\n            self.assertEqual( cm.exception.message, \"You can't make an existing directory disposable\" )\n\n\nif __name__==\"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_main.py",
    "content": "import argparse\nimport unittest\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\"Find and run all unittest in a folder\")\n    parser.add_argument('--folder', '-f', dest='folder', help='Optional folder to search, defaults to .')\n    args = parser.parse_args()\n\n    if args.folder:\n        folder = args.folder\n    else:\n        folder = '.'\n    loader = unittest.TestLoader()\n    suite = loader.discover(folder)\n    runner = unittest.TextTestRunner()\n    result = runner.run(suite)\n    if not result.wasSuccessful():\n        exit(-1)\n"
  },
  {
    "path": "RegressionTest/test/test_performanceregressionconfig.py",
    "content": "import unittest\nfrom context import performanceregressionconfig\nimport disposablefile\n\n\nclass TestDisabledConfig(unittest.TestCase):\n    def test_missingConfig(self):\n        p = performanceregressionconfig.PerformanceRegressionConfig(None)\n        self.assertFalse(p.enabled)\n\n    def test_disabledConfig(self):\n        p = performanceregressionconfig.PerformanceRegressionConfig({\"enabled\": \"0\"})\n        self.assertFalse(p.enabled)\n        \n        p = performanceregressionconfig.PerformanceRegressionConfig({\"enabled\": \"False\"})\n        self.assertFalse(p.enabled)\n\n        p = performanceregressionconfig.PerformanceRegressionConfig({\"enabled\": \"True\"})\n        self.assertTrue(p.enabled)\n\nclass TestSuccessfulConfig(unittest.TestCase):\n    def test_defaultValues(self):\n        p = performanceregressionconfig.PerformanceRegressionConfig({})\n        self.assertTrue(p.enabled)\n        self.assertEqual(p.runsPerInstance, 3)\n        self.assertEqual(p.relativeThresholdInPercent, 1)\n        self.assertEqual(p.absoluteThresholdInSeconds, 1)\n        \n    def test_overrideValues(self):\n        p = performanceregressionconfig.PerformanceRegressionConfig(\n            { \"runsPerInstance\": \"5\",\n              \"relativeThresholdInPercent\": 1.5,\n              \"absoluteThresholdInSeconds\": \"4.1\"\n                })\n        self.assertTrue(p.enabled)\n        self.assertEqual(p.runsPerInstance, 5)\n        self.assertEqual(p.relativeThresholdInPercent, 1.5)\n        self.assertEqual(p.absoluteThresholdInSeconds, 4.1)\n        \n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_performancerunner.py",
    "content": "import csv\n\nimport os\nimport unittest\nfrom disposablefile import DisposableFile, DisposableDirectory\nfrom context import performancerunner\nfrom context import performanceregressionconfig\n\nimport test_depthmaprunner\n\n\nclass PerformanceCheckTest(unittest.TestCase):\n    def test_filesMissing(self):\n        message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n        self.assertEqual(message, \"Base performance timing file f1.csv is missing\")\n\n        with DisposableFile(\"f1.csv\") as f1:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\",1 ,2)\n            self.assertEqual(message, \"Test performance timing file f2.csv is missing\")\n\n        with DisposableFile(\"f2.csv\") as f2:\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n            self.assertEqual(message, \"Base performance timing file f1.csv is missing\")\n\n    def test_fileLineNumberMismatch(self):\n        with DisposableFile(\"f1.csv\") as f1, DisposableFile(\"f2.csv\") as f2:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10\\n\")\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n            self.assertEqual(message, \"baseline performance file f1.csv has more lines than the test one f2.csv\")\n\n        with DisposableFile(\"f1.csv\") as f1, DisposableFile(\"f2.csv\") as f2:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10\\n\")\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10\\nbar,20\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1 , 2)\n            self.assertEqual(message, \"baseline performance file f1.csv has fewer lines than the test one f2.csv\")\n\n    def test_fileLabelMismatch(self):\n        with DisposableFile(\"f1.csv\") as f1, DisposableFile(\"f2.csv\") as f2:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10\\n\")\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\nbar,10\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n            self.assertEqual(message, \"performance line mismatch: base 'foo', test 'bar'\")\n\n    def test_successfulRunEmptyFile(self):\n        with DisposableFile(\"f1.csv\") as f1, DisposableFile(\"f2.csv\") as f2:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\n\")\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n            self.assertEqual(message, \"\")\n\n    def test_successfulRun(self):\n        with DisposableFile(\"f1.csv\") as f1, DisposableFile(\"f2.csv\") as f2:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10\\nbar,21\\nbaz,1000\\nblub,10\\n\")\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10.9\\nbar,10\\nbaz,1010\\nblub,10\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n            self.assertEqual(message, \"\")\n\n    def test_performanceRegression(self):\n        with DisposableFile(\"f1.csv\") as f1, DisposableFile(\"f2.csv\") as f2:\n            with open(f1.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,10\\n\")\n            with open(f2.filename(), \"w\") as f:\n                f.write(\"action,average\\nfoo,18\\n\")\n            message = performancerunner.checkPerformance(\"f1.csv\", \"f2.csv\", 1, 2)\n            self.assertEqual(message, \"Performance regression: foo took 18s instead of 10s\")\n\nclass test_PerformanceAggregation(unittest.TestCase):\n    def test_aggregation(self):\n        with DisposableDirectory(\"testdir\") as d:\n            os.makedirs(d.name())\n            nameTemplate = \"test{0}{1}.csv\"\n            with open(os.path.join(d.name(), nameTemplate.format(0,0)), \"w\") as f:\n                f.write(\"action,duration\\nt1,3\\nt2,2\\n\")\n            with open(os.path.join(d.name(), nameTemplate.format(1,0)), \"w\") as f:\n                f.write(\"action,duration\\nt1,1.5\\nt2,2.5\\n\")\n            with open(os.path.join(d.name(), nameTemplate.format(2,0)), \"w\") as f:\n                f.write(\"action,duration\\nt1,2\\nt2,1.5\\n\")\n\n            resFile = performancerunner.aggregatePerformanceStats(d.name(), 3, 1, nameTemplate)\n            with open(resFile, \"r\") as f:\n                reader = csv.DictReader(f)\n                line = next(reader)\n                self.assertEqual(line[\"action\"], \"t1\")\n                self.assertEqual(float(line[\"max\"]), 3 )\n                self.assertEqual(float(line[\"min\"]), 1.5)\n                self.assertEqual(float(line[\"average\"]), 6.5/3)\n\n                line = next(reader)\n                self.assertEqual(line[\"action\"], \"t2\")\n                self.assertEqual(float(line[\"max\"]), 2.5 )\n                self.assertEqual(float(line[\"min\"]), 1.5)\n                self.assertEqual(float(line[\"average\"]), 2)\n\n                line = next(reader)\n                self.assertEqual(line[\"action\"], \"total\")\n                self.assertEqual(float(line[\"max\"]), 5 )\n                self.assertEqual(float(line[\"min\"]), 3.5)\n                self.assertEqual(float(line[\"average\"]), 12.5/3)\n\nclass test_PerformanceRunner(test_depthmaprunner.DepthmapRegressioRunnerTest):\n    def testSuccessfullRun(self):\n        with DisposableDirectory(\"testdir\", True) as testDir, DisposableDirectory(\"basedir\") as baseDir:\n            conf = performanceregressionconfig.PerformanceRegressionConfig({})\n            runner = performancerunner.PerformanceRunner(lambda d, a: self.runfuncSucceedAlwaysSame(d,a), \"basebin\", \"testbin\", testDir.name(), conf)\n            (result, message) = runner.runTestCase(\"testname\", self.makeCommand(\"infile.graph\", \"outfile.graph\",\"visibility\"))\n            self.assertTrue(result)\n\n"
  },
  {
    "path": "RegressionTest/test/test_runhelpers.py",
    "content": "import unittest\nfrom context import runhelpers\nfrom disposablefile import DisposableDirectory\nimport os\nimport platform\nimport sys\n\nclass TestRunHelpers(unittest.TestCase):\n    def test_prepareDirectory(self):\n        with DisposableDirectory(\"testdir\", True) as d:\n            self.assertTrue(os.path.isdir(d.name()))\n            testfile = os.path.join(d.name(), \"testfile.txt\")\n            with open(testfile, \"w\") as f:\n                f.write(\"123\")\n            self.assertTrue(os.path.exists(testfile))\n            runhelpers.prepareDirectory(d.name())\n            self.assertTrue(os.path.isdir(d.name()))\n            self.assertFalse(os.path.exists(testfile))\n\n    def test_cd(self):\n        currentpath = os.getcwd()\n        with DisposableDirectory(\"testdir\", True) as d:\n            with runhelpers.cd(\"testdir\"):\n                self.assertEqual(os.getcwd(), os.path.join(currentpath, d.name()))\n            self.assertEqual(os.getcwd(), currentpath, d.name())\n                \n    def test_getBinary(self):\n        result = runhelpers.getExecutable(\"foo\")\n        sys = platform.system()\n        if sys == \"Windows\":\n            self.assertEqual( result, \"foo\\\\Windows\\\\depthmapXcli.exe\")\n        else:\n            self.assertEqual( result, \"foo/\" + sys + \"/depthmapXcli\" )\n\n    def test_getTestBinary(self):\n        result = runhelpers.getTestExecutable(\"foo\")\n        sys = platform.system()\n        if sys == \"Windows\":\n            self.assertEqual( result, \"foo\\\\depthmapXcli\\\\release\\\\depthmapXcli.exe\")\n        else:\n            self.assertEqual( result, \"foo/depthmapXcli/depthmapXcli\" )\n\n    \n    def test_runExecutable(self):\n        with DisposableDirectory(\"testdir\", True) as d:\n            retcode, output = runhelpers.runExecutable( d.name(), [sys.executable, \"-c\", \"print('foo')\"])\n            self.assertTrue(retcode)\n            self.assertEqual(output, \"foo\\n\")\n\n    def test_runExecutableFail(self):\n        with DisposableDirectory(\"testdir\") as d:\n            runhelpers.prepareDirectory(d.name())\n            retcode, output = runhelpers.runExecutable( d.name(), [sys.executable, \"-c\", \"exit(-1)\"])\n            self.assertFalse(retcode)\n            self.assertEqual(output, \"\")\n\n    def test_runExecutableException(self):\n        with DisposableDirectory(\"testdir\") as d:\n            runhelpers.prepareDirectory(d.name())\n            retcode, output = runhelpers.runExecutable( d.name(), [sys.executable, \"-c\", \"raise Exception()\"])\n            self.assertFalse(retcode)\n            self.assertEqual(output, 'Traceback (most recent call last):\\n  File \"<string>\", line 1, in <module>\\nException\\n')\n            \nif __name__==\"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "RegressionTest/test/test_test_main.py",
    "content": "import unittest\nfrom disposablefile import DisposableDirectory\nfrom context import runhelpers\nimport sys\n\nclass TestUnitTestMain(unittest.TestCase):\n    def test_capture_pass(self):\n        with DisposableDirectory(\"testdir_pass\", True) as d:\n            retcode, output = runhelpers.runExecutable( d.name(), [sys.executable, \"../test_main.py\", \"-f\", \"../pass\"])\n            if not retcode:\n                print(\"printing the underlying test output to help diagnose the issue:\")\n                print(output)\n            self.assertTrue(retcode)\n\n    def test_capture_fail(self):\n        with DisposableDirectory(\"testdir_fail\", True) as d:\n            retcode, output = runhelpers.runExecutable( d.name(), [sys.executable, \"../test_main.py\", \"-f\", \"../fail\"])\n            if retcode:\n                print(\"printing the underlying test output to help diagnose the issue:\")\n                print(output)\n            self.assertFalse(retcode)\n\nif __name__==\"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "ThirdParty/Catch/catch.hpp",
    "content": "/*\n *  Catch v1.6.1\n *  Generated: 2017-01-20 12:33:53.497767\n *  ----------------------------------------------------------\n *  This file has been merged from multiple headers. Please don't edit it directly\n *  Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.\n *\n *  Distributed under the Boost Software License, Version 1.0. (See accompanying\n *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n */\n#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n#define TWOBLUECUBES_CATCH_HPP_INCLUDED\n\n#ifdef __clang__\n#    pragma clang system_header\n#elif defined __GNUC__\n#    pragma GCC system_header\n#endif\n\n// #included from: internal/catch_suppress_warnings.h\n\n#ifdef __clang__\n#   ifdef __ICC // icpc defines the __clang__ macro\n#       pragma warning(push)\n#       pragma warning(disable: 161 1682)\n#   else // __ICC\n#       pragma clang diagnostic ignored \"-Wglobal-constructors\"\n#       pragma clang diagnostic ignored \"-Wvariadic-macros\"\n#       pragma clang diagnostic ignored \"-Wc99-extensions\"\n#       pragma clang diagnostic ignored \"-Wunused-variable\"\n#       pragma clang diagnostic push\n#       pragma clang diagnostic ignored \"-Wpadded\"\n#       pragma clang diagnostic ignored \"-Wc++98-compat\"\n#       pragma clang diagnostic ignored \"-Wc++98-compat-pedantic\"\n#       pragma clang diagnostic ignored \"-Wswitch-enum\"\n#       pragma clang diagnostic ignored \"-Wcovered-switch-default\"\n#    endif\n#elif defined __GNUC__\n#    pragma GCC diagnostic ignored \"-Wvariadic-macros\"\n#    pragma GCC diagnostic ignored \"-Wunused-variable\"\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Wpadded\"\n#endif\n#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)\n#  define CATCH_IMPL\n#endif\n\n#ifdef CATCH_IMPL\n#  ifndef CLARA_CONFIG_MAIN\n#    define CLARA_CONFIG_MAIN_NOT_DEFINED\n#    define CLARA_CONFIG_MAIN\n#  endif\n#endif\n\n// #included from: internal/catch_notimplemented_exception.h\n#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED\n\n// #included from: catch_common.h\n#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED\n\n// #included from: catch_compiler_capabilities.h\n#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED\n\n// Detect a number of compiler features - mostly C++11/14 conformance - by compiler\n// The following features are defined:\n//\n// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported?\n// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported?\n// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods\n// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported?\n// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported\n// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported?\n// CATCH_CONFIG_CPP11_OVERRIDE : is override supported?\n// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)\n\n// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported?\n\n// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported?\n// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?\n// ****************\n// Note to maintainers: if new toggles are added please document them\n// in configuration.md, too\n// ****************\n\n// In general each macro has a _NO_<feature name> form\n// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature.\n// Many features, at point of detection, define an _INTERNAL_ macro, so they\n// can be combined, en-mass, with the _NO_ forms later.\n\n// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11\n\n#ifdef __cplusplus\n\n#  if __cplusplus >= 201103L\n#    define CATCH_CPP11_OR_GREATER\n#  endif\n\n#  if __cplusplus >= 201402L\n#    define CATCH_CPP14_OR_GREATER\n#  endif\n\n#endif\n\n#ifdef __clang__\n\n#  if __has_feature(cxx_nullptr)\n#    define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR\n#  endif\n\n#  if __has_feature(cxx_noexcept)\n#    define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#  endif\n\n#   if defined(CATCH_CPP11_OR_GREATER)\n#       define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( \"clang diagnostic ignored \\\"-Wparentheses\\\"\" )\n#   endif\n\n#endif // __clang__\n\n////////////////////////////////////////////////////////////////////////////////\n// Borland\n#ifdef __BORLANDC__\n\n#endif // __BORLANDC__\n\n////////////////////////////////////////////////////////////////////////////////\n// EDG\n#ifdef __EDG_VERSION__\n\n#endif // __EDG_VERSION__\n\n////////////////////////////////////////////////////////////////////////////////\n// Digital Mars\n#ifdef __DMC__\n\n#endif // __DMC__\n\n////////////////////////////////////////////////////////////////////////////////\n// GCC\n#ifdef __GNUC__\n\n#   if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)\n#       define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR\n#   endif\n\n#   if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER)\n#       define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( \"GCC diagnostic ignored \\\"-Wparentheses\\\"\" )\n#   endif\n\n// - otherwise more recent versions define __cplusplus >= 201103L\n// and will get picked up below\n\n#endif // __GNUC__\n\n////////////////////////////////////////////////////////////////////////////////\n// Visual C++\n#ifdef _MSC_VER\n\n#if (_MSC_VER >= 1600)\n#   define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR\n#   define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR\n#endif\n\n#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015))\n#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS\n#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE\n#endif\n\n#endif // _MSC_VER\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Use variadic macros if the compiler supports them\n#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \\\n    ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \\\n    ( defined __GNUC__ && __GNUC__ >= 3 ) || \\\n    ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L )\n\n#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS\n\n#endif\n\n// Use __COUNTER__ if the compiler supports it\n#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \\\n    ( defined __GNUC__  && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \\\n    ( defined __clang__ && __clang_major__ >= 3 )\n\n#define CATCH_INTERNAL_CONFIG_COUNTER\n\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// C++ language feature support\n\n// catch all support for C++11\n#if defined(CATCH_CPP11_OR_GREATER)\n\n#  if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR)\n#    define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR\n#  endif\n\n#  ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#    define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#  endif\n\n#  ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS\n#    define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS\n#  endif\n\n#  ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM\n#    define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM\n#  endif\n\n#  ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE\n#    define CATCH_INTERNAL_CONFIG_CPP11_TUPLE\n#  endif\n\n#  ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS\n#    define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS\n#  endif\n\n#  if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG)\n#    define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG\n#  endif\n\n#  if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE)\n#    define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE\n#  endif\n#  if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)\n#    define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR\n#  endif\n# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE)\n#   define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE\n#  endif\n\n#endif // __cplusplus >= 201103L\n\n// Now set the actual defines based on the above + anything the user has configured\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_NULLPTR\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_NOEXCEPT\n#endif\n#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)\n#   define CATCH_CONFIG_CPP11_GENERATED_METHODS\n#endif\n#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)\n#   define CATCH_CONFIG_CPP11_IS_ENUM\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_TUPLE\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS)\n#   define CATCH_CONFIG_VARIADIC_MACROS\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_LONG_LONG\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_OVERRIDE\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_UNIQUE_PTR\n#endif\n// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for\n// analytics) because, at time of writing, __COUNTER__ is not properly handled by it.\n// This does not affect compilation\n#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__)\n#   define CATCH_CONFIG_COUNTER\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11)\n#   define CATCH_CONFIG_CPP11_SHUFFLE\n#endif\n\n#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS\n#endif\n\n// noexcept support:\n#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)\n#  define CATCH_NOEXCEPT noexcept\n#  define CATCH_NOEXCEPT_IS(x) noexcept(x)\n#else\n#  define CATCH_NOEXCEPT throw()\n#  define CATCH_NOEXCEPT_IS(x)\n#endif\n\n// nullptr support\n#ifdef CATCH_CONFIG_CPP11_NULLPTR\n#   define CATCH_NULL nullptr\n#else\n#   define CATCH_NULL NULL\n#endif\n\n// override support\n#ifdef CATCH_CONFIG_CPP11_OVERRIDE\n#   define CATCH_OVERRIDE override\n#else\n#   define CATCH_OVERRIDE\n#endif\n\n// unique_ptr support\n#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR\n#   define CATCH_AUTO_PTR( T ) std::unique_ptr<T>\n#else\n#   define CATCH_AUTO_PTR( T ) std::auto_ptr<T>\n#endif\n\n#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line\n#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )\n#ifdef CATCH_CONFIG_COUNTER\n#  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )\n#else\n#  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )\n#endif\n\n#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr\n#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )\n\n#include <sstream>\n#include <stdexcept>\n#include <algorithm>\n\nnamespace Catch {\n\n    struct IConfig;\n\n    struct CaseSensitive { enum Choice {\n        Yes,\n        No\n    }; };\n\n    class NonCopyable {\n#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        NonCopyable( NonCopyable const& )              = delete;\n        NonCopyable( NonCopyable && )                  = delete;\n        NonCopyable& operator = ( NonCopyable const& ) = delete;\n        NonCopyable& operator = ( NonCopyable && )     = delete;\n#else\n        NonCopyable( NonCopyable const& info );\n        NonCopyable& operator = ( NonCopyable const& );\n#endif\n\n    protected:\n        NonCopyable() {}\n        virtual ~NonCopyable();\n    };\n\n    class SafeBool {\n    public:\n        typedef void (SafeBool::*type)() const;\n\n        static type makeSafe( bool value ) {\n            return value ? &SafeBool::trueValue : 0;\n        }\n    private:\n        void trueValue() const {}\n    };\n\n    template<typename ContainerT>\n    inline void deleteAll( ContainerT& container ) {\n        typename ContainerT::const_iterator it = container.begin();\n        typename ContainerT::const_iterator itEnd = container.end();\n        for(; it != itEnd; ++it )\n            delete *it;\n    }\n    template<typename AssociativeContainerT>\n    inline void deleteAllValues( AssociativeContainerT& container ) {\n        typename AssociativeContainerT::const_iterator it = container.begin();\n        typename AssociativeContainerT::const_iterator itEnd = container.end();\n        for(; it != itEnd; ++it )\n            delete it->second;\n    }\n\n    bool startsWith( std::string const& s, std::string const& prefix );\n    bool endsWith( std::string const& s, std::string const& suffix );\n    bool contains( std::string const& s, std::string const& infix );\n    void toLowerInPlace( std::string& s );\n    std::string toLower( std::string const& s );\n    std::string trim( std::string const& str );\n    bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );\n\n    struct pluralise {\n        pluralise( std::size_t count, std::string const& label );\n\n        friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );\n\n        std::size_t m_count;\n        std::string m_label;\n    };\n\n    struct SourceLineInfo {\n\n        SourceLineInfo();\n        SourceLineInfo( char const* _file, std::size_t _line );\n        SourceLineInfo( SourceLineInfo const& other );\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        SourceLineInfo( SourceLineInfo && )                  = default;\n        SourceLineInfo& operator = ( SourceLineInfo const& ) = default;\n        SourceLineInfo& operator = ( SourceLineInfo && )     = default;\n#  endif\n        bool empty() const;\n        bool operator == ( SourceLineInfo const& other ) const;\n        bool operator < ( SourceLineInfo const& other ) const;\n\n        std::string file;\n        std::size_t line;\n    };\n\n    std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );\n\n    // This is just here to avoid compiler warnings with macro constants and boolean literals\n    inline bool alwaysTrue( std::size_t = 0 ) { return true; }\n    inline bool alwaysFalse( std::size_t = 0 ) { return false; }\n\n    void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );\n\n    void seedRng( IConfig const& config );\n    unsigned int rngSeed();\n\n    // Use this in variadic streaming macros to allow\n    //    >> +StreamEndStop\n    // as well as\n    //    >> stuff +StreamEndStop\n    struct StreamEndStop {\n        std::string operator+() {\n            return std::string();\n        }\n    };\n    template<typename T>\n    T const& operator + ( T const& value, StreamEndStop ) {\n        return value;\n    }\n}\n\n#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )\n#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO );\n\n#include <ostream>\n\nnamespace Catch {\n\n    class NotImplementedException : public std::exception\n    {\n    public:\n        NotImplementedException( SourceLineInfo const& lineInfo );\n        NotImplementedException( NotImplementedException const& ) {}\n\n        virtual ~NotImplementedException() CATCH_NOEXCEPT {}\n\n        virtual const char* what() const CATCH_NOEXCEPT;\n\n    private:\n        std::string m_what;\n        SourceLineInfo m_lineInfo;\n    };\n\n} // end namespace Catch\n\n///////////////////////////////////////////////////////////////////////////////\n#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO )\n\n// #included from: internal/catch_context.h\n#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED\n\n// #included from: catch_interfaces_generators.h\n#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED\n\n#include <string>\n\nnamespace Catch {\n\n    struct IGeneratorInfo {\n        virtual ~IGeneratorInfo();\n        virtual bool moveNext() = 0;\n        virtual std::size_t getCurrentIndex() const = 0;\n    };\n\n    struct IGeneratorsForTest {\n        virtual ~IGeneratorsForTest();\n\n        virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0;\n        virtual bool moveNext() = 0;\n    };\n\n    IGeneratorsForTest* createGeneratorsForTest();\n\n} // end namespace Catch\n\n// #included from: catch_ptr.hpp\n#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\nnamespace Catch {\n\n    // An intrusive reference counting smart pointer.\n    // T must implement addRef() and release() methods\n    // typically implementing the IShared interface\n    template<typename T>\n    class Ptr {\n    public:\n        Ptr() : m_p( CATCH_NULL ){}\n        Ptr( T* p ) : m_p( p ){\n            if( m_p )\n                m_p->addRef();\n        }\n        Ptr( Ptr const& other ) : m_p( other.m_p ){\n            if( m_p )\n                m_p->addRef();\n        }\n        ~Ptr(){\n            if( m_p )\n                m_p->release();\n        }\n        void reset() {\n            if( m_p )\n                m_p->release();\n            m_p = CATCH_NULL;\n        }\n        Ptr& operator = ( T* p ){\n            Ptr temp( p );\n            swap( temp );\n            return *this;\n        }\n        Ptr& operator = ( Ptr const& other ){\n            Ptr temp( other );\n            swap( temp );\n            return *this;\n        }\n        void swap( Ptr& other ) { std::swap( m_p, other.m_p ); }\n        T* get() const{ return m_p; }\n        T& operator*() const { return *m_p; }\n        T* operator->() const { return m_p; }\n        bool operator !() const { return m_p == CATCH_NULL; }\n        operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); }\n\n    private:\n        T* m_p;\n    };\n\n    struct IShared : NonCopyable {\n        virtual ~IShared();\n        virtual void addRef() const = 0;\n        virtual void release() const = 0;\n    };\n\n    template<typename T = IShared>\n    struct SharedImpl : T {\n\n        SharedImpl() : m_rc( 0 ){}\n\n        virtual void addRef() const {\n            ++m_rc;\n        }\n        virtual void release() const {\n            if( --m_rc == 0 )\n                delete this;\n        }\n\n        mutable unsigned int m_rc;\n    };\n\n} // end namespace Catch\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n#include <memory>\n#include <vector>\n#include <stdlib.h>\n\nnamespace Catch {\n\n    class TestCase;\n    class Stream;\n    struct IResultCapture;\n    struct IRunner;\n    struct IGeneratorsForTest;\n    struct IConfig;\n\n    struct IContext\n    {\n        virtual ~IContext();\n\n        virtual IResultCapture* getResultCapture() = 0;\n        virtual IRunner* getRunner() = 0;\n        virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0;\n        virtual bool advanceGeneratorsForCurrentTest() = 0;\n        virtual Ptr<IConfig const> getConfig() const = 0;\n    };\n\n    struct IMutableContext : IContext\n    {\n        virtual ~IMutableContext();\n        virtual void setResultCapture( IResultCapture* resultCapture ) = 0;\n        virtual void setRunner( IRunner* runner ) = 0;\n        virtual void setConfig( Ptr<IConfig const> const& config ) = 0;\n    };\n\n    IContext& getCurrentContext();\n    IMutableContext& getCurrentMutableContext();\n    void cleanUpContext();\n    Stream createStream( std::string const& streamName );\n\n}\n\n// #included from: internal/catch_test_registry.hpp\n#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED\n\n// #included from: catch_interfaces_testcase.h\n#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED\n\n#include <vector>\n\nnamespace Catch {\n\n    class TestSpec;\n\n    struct ITestCase : IShared {\n        virtual void invoke () const = 0;\n    protected:\n        virtual ~ITestCase();\n    };\n\n    class TestCase;\n    struct IConfig;\n\n    struct ITestCaseRegistry {\n        virtual ~ITestCaseRegistry();\n        virtual std::vector<TestCase> const& getAllTests() const = 0;\n        virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0;\n    };\n\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );\n\n}\n\nnamespace Catch {\n\ntemplate<typename C>\nclass MethodTestCase : public SharedImpl<ITestCase> {\n\npublic:\n    MethodTestCase( void (C::*method)() ) : m_method( method ) {}\n\n    virtual void invoke() const {\n        C obj;\n        (obj.*m_method)();\n    }\n\nprivate:\n    virtual ~MethodTestCase() {}\n\n    void (C::*m_method)();\n};\n\ntypedef void(*TestFunction)();\n\nstruct NameAndDesc {\n    NameAndDesc( const char* _name = \"\", const char* _description= \"\" )\n    : name( _name ), description( _description )\n    {}\n\n    const char* name;\n    const char* description;\n};\n\nvoid registerTestCase\n    (   ITestCase* testCase,\n        char const* className,\n        NameAndDesc const& nameAndDesc,\n        SourceLineInfo const& lineInfo );\n\nstruct AutoReg {\n\n    AutoReg\n        (   TestFunction function,\n            SourceLineInfo const& lineInfo,\n            NameAndDesc const& nameAndDesc );\n\n    template<typename C>\n    AutoReg\n        (   void (C::*method)(),\n            char const* className,\n            NameAndDesc const& nameAndDesc,\n            SourceLineInfo const& lineInfo ) {\n\n        registerTestCase\n            (   new MethodTestCase<C>( method ),\n                className,\n                nameAndDesc,\n                lineInfo );\n    }\n\n    ~AutoReg();\n\nprivate:\n    AutoReg( AutoReg const& );\n    void operator= ( AutoReg const& );\n};\n\nvoid registerTestCaseFunction\n    (   TestFunction function,\n        SourceLineInfo const& lineInfo,\n        NameAndDesc const& nameAndDesc );\n\n} // end namespace Catch\n\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \\\n        static void TestName(); \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\\\n        static void TestName()\n    #define INTERNAL_CATCH_TESTCASE( ... ) \\\n        INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, \"&\" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); }\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\\\n        namespace{ \\\n            struct TestName : ClassName{ \\\n                void test(); \\\n            }; \\\n            Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \\\n        } \\\n        void TestName::test()\n    #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \\\n        INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \\\n        Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) );\n\n#else\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \\\n        static void TestName(); \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\\\n        static void TestName()\n    #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \\\n        INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, \"&\" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); }\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\\\n        namespace{ \\\n            struct TestCaseName : ClassName{ \\\n                void test(); \\\n            }; \\\n            Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \\\n        } \\\n        void TestCaseName::test()\n    #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\\\n        INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \\\n        Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) );\n#endif\n\n// #included from: internal/catch_capture.hpp\n#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED\n\n// #included from: catch_result_builder.h\n#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED\n\n// #included from: catch_result_type.h\n#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED\n\nnamespace Catch {\n\n    // ResultWas::OfType enum\n    struct ResultWas { enum OfType {\n        Unknown = -1,\n        Ok = 0,\n        Info = 1,\n        Warning = 2,\n\n        FailureBit = 0x10,\n\n        ExpressionFailed = FailureBit | 1,\n        ExplicitFailure = FailureBit | 2,\n\n        Exception = 0x100 | FailureBit,\n\n        ThrewException = Exception | 1,\n        DidntThrowException = Exception | 2,\n\n        FatalErrorCondition = 0x200 | FailureBit\n\n    }; };\n\n    inline bool isOk( ResultWas::OfType resultType ) {\n        return ( resultType & ResultWas::FailureBit ) == 0;\n    }\n    inline bool isJustInfo( int flags ) {\n        return flags == ResultWas::Info;\n    }\n\n    // ResultDisposition::Flags enum\n    struct ResultDisposition { enum Flags {\n        Normal = 0x01,\n\n        ContinueOnFailure = 0x02,   // Failures fail test, but execution continues\n        FalseTest = 0x04,           // Prefix expression with !\n        SuppressFail = 0x08         // Failures are reported but do not fail the test\n    }; };\n\n    inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {\n        return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );\n    }\n\n    inline bool shouldContinueOnFailure( int flags )    { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }\n    inline bool isFalseTest( int flags )                { return ( flags & ResultDisposition::FalseTest ) != 0; }\n    inline bool shouldSuppressFailure( int flags )      { return ( flags & ResultDisposition::SuppressFail ) != 0; }\n\n} // end namespace Catch\n\n// #included from: catch_assertionresult.h\n#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED\n\n#include <string>\n\nnamespace Catch {\n\n    struct AssertionInfo\n    {\n        AssertionInfo() {}\n        AssertionInfo(  std::string const& _macroName,\n                        SourceLineInfo const& _lineInfo,\n                        std::string const& _capturedExpression,\n                        ResultDisposition::Flags _resultDisposition );\n\n        std::string macroName;\n        SourceLineInfo lineInfo;\n        std::string capturedExpression;\n        ResultDisposition::Flags resultDisposition;\n    };\n\n    struct AssertionResultData\n    {\n        AssertionResultData() : resultType( ResultWas::Unknown ) {}\n\n        std::string reconstructedExpression;\n        std::string message;\n        ResultWas::OfType resultType;\n    };\n\n    class AssertionResult {\n    public:\n        AssertionResult();\n        AssertionResult( AssertionInfo const& info, AssertionResultData const& data );\n        ~AssertionResult();\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n         AssertionResult( AssertionResult const& )              = default;\n         AssertionResult( AssertionResult && )                  = default;\n         AssertionResult& operator = ( AssertionResult const& ) = default;\n         AssertionResult& operator = ( AssertionResult && )     = default;\n#  endif\n\n        bool isOk() const;\n        bool succeeded() const;\n        ResultWas::OfType getResultType() const;\n        bool hasExpression() const;\n        bool hasMessage() const;\n        std::string getExpression() const;\n        std::string getExpressionInMacro() const;\n        bool hasExpandedExpression() const;\n        std::string getExpandedExpression() const;\n        std::string getMessage() const;\n        SourceLineInfo getSourceInfo() const;\n        std::string getTestMacroName() const;\n\n    protected:\n        AssertionInfo m_info;\n        AssertionResultData m_resultData;\n    };\n\n} // end namespace Catch\n\n// #included from: catch_matchers.hpp\n#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED\n\nnamespace Catch {\nnamespace Matchers {\n    namespace Impl {\n\n    namespace Generic {\n        template<typename ExpressionT> class AllOf;\n        template<typename ExpressionT> class AnyOf;\n        template<typename ExpressionT> class Not;\n    }\n\n    template<typename ExpressionT>\n    struct Matcher : SharedImpl<IShared>\n    {\n        typedef ExpressionT ExpressionType;\n\n        virtual ~Matcher() {}\n        virtual Ptr<Matcher> clone() const = 0;\n        virtual bool match( ExpressionT const& expr ) const = 0;\n        virtual std::string toString() const = 0;\n\n        Generic::AllOf<ExpressionT> operator && ( Matcher<ExpressionT> const& other ) const;\n        Generic::AnyOf<ExpressionT> operator || ( Matcher<ExpressionT> const& other ) const;\n        Generic::Not<ExpressionT> operator ! () const;\n    };\n\n    template<typename DerivedT, typename ExpressionT>\n    struct MatcherImpl : Matcher<ExpressionT> {\n\n        virtual Ptr<Matcher<ExpressionT> > clone() const {\n            return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<DerivedT const&>( *this ) ) );\n        }\n    };\n\n    namespace Generic {\n        template<typename ExpressionT>\n        class Not : public MatcherImpl<Not<ExpressionT>, ExpressionT> {\n        public:\n            explicit Not( Matcher<ExpressionT> const& matcher ) : m_matcher(matcher.clone()) {}\n            Not( Not const& other ) : m_matcher( other.m_matcher ) {}\n\n            virtual bool match( ExpressionT const& expr ) const CATCH_OVERRIDE {\n                return !m_matcher->match( expr );\n            }\n\n            virtual std::string toString() const CATCH_OVERRIDE {\n                return \"not \" + m_matcher->toString();\n            }\n        private:\n            Ptr< Matcher<ExpressionT> > m_matcher;\n        };\n\n        template<typename ExpressionT>\n        class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT> {\n        public:\n\n            AllOf() {}\n            AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {}\n\n            AllOf& add( Matcher<ExpressionT> const& matcher ) {\n                m_matchers.push_back( matcher.clone() );\n                return *this;\n            }\n            virtual bool match( ExpressionT const& expr ) const\n            {\n                for( std::size_t i = 0; i < m_matchers.size(); ++i )\n                    if( !m_matchers[i]->match( expr ) )\n                        return false;\n                return true;\n            }\n            virtual std::string toString() const {\n                std::ostringstream oss;\n                oss << \"( \";\n                for( std::size_t i = 0; i < m_matchers.size(); ++i ) {\n                    if( i != 0 )\n                        oss << \" and \";\n                    oss << m_matchers[i]->toString();\n                }\n                oss << \" )\";\n                return oss.str();\n            }\n\n            AllOf operator && ( Matcher<ExpressionT> const& other ) const {\n                AllOf allOfExpr( *this );\n                allOfExpr.add( other );\n                return allOfExpr;\n            }\n\n        private:\n            std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;\n        };\n\n        template<typename ExpressionT>\n        class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT> {\n        public:\n\n            AnyOf() {}\n            AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {}\n\n            AnyOf& add( Matcher<ExpressionT> const& matcher ) {\n                m_matchers.push_back( matcher.clone() );\n                return *this;\n            }\n            virtual bool match( ExpressionT const& expr ) const\n            {\n                for( std::size_t i = 0; i < m_matchers.size(); ++i )\n                    if( m_matchers[i]->match( expr ) )\n                        return true;\n                return false;\n            }\n            virtual std::string toString() const {\n                std::ostringstream oss;\n                oss << \"( \";\n                for( std::size_t i = 0; i < m_matchers.size(); ++i ) {\n                    if( i != 0 )\n                        oss << \" or \";\n                    oss << m_matchers[i]->toString();\n                }\n                oss << \" )\";\n                return oss.str();\n            }\n\n            AnyOf operator || ( Matcher<ExpressionT> const& other ) const {\n                AnyOf anyOfExpr( *this );\n                anyOfExpr.add( other );\n                return anyOfExpr;\n            }\n\n        private:\n            std::vector<Ptr<Matcher<ExpressionT> > > m_matchers;\n        };\n\n    } // namespace Generic\n\n    template<typename ExpressionT>\n    Generic::AllOf<ExpressionT> Matcher<ExpressionT>::operator && ( Matcher<ExpressionT> const& other ) const {\n        Generic::AllOf<ExpressionT> allOfExpr;\n        allOfExpr.add( *this );\n        allOfExpr.add( other );\n        return allOfExpr;\n    }\n\n    template<typename ExpressionT>\n    Generic::AnyOf<ExpressionT> Matcher<ExpressionT>::operator || ( Matcher<ExpressionT> const& other ) const {\n        Generic::AnyOf<ExpressionT> anyOfExpr;\n        anyOfExpr.add( *this );\n        anyOfExpr.add( other );\n        return anyOfExpr;\n    }\n\n    template<typename ExpressionT>\n    Generic::Not<ExpressionT> Matcher<ExpressionT>::operator ! () const {\n        return Generic::Not<ExpressionT>( *this );\n    }\n\n    namespace StdString {\n\n        inline std::string makeString( std::string const& str ) { return str; }\n        inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); }\n\n        struct CasedString\n        {\n            CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity )\n            :   m_caseSensitivity( caseSensitivity ),\n                m_str( adjustString( str ) )\n            {}\n            std::string adjustString( std::string const& str ) const {\n                return m_caseSensitivity == CaseSensitive::No\n                    ? toLower( str )\n                    : str;\n\n            }\n            std::string toStringSuffix() const\n            {\n                return m_caseSensitivity == CaseSensitive::No\n                    ? \" (case insensitive)\"\n                    : \"\";\n            }\n            CaseSensitive::Choice m_caseSensitivity;\n            std::string m_str;\n        };\n\n        struct Equals : MatcherImpl<Equals, std::string> {\n            Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )\n            :   m_data( str, caseSensitivity )\n            {}\n            Equals( Equals const& other ) : m_data( other.m_data ){}\n\n            virtual ~Equals();\n\n            virtual bool match( std::string const& expr ) const {\n                return m_data.m_str == m_data.adjustString( expr );;\n            }\n            virtual std::string toString() const {\n                return \"equals: \\\"\" + m_data.m_str + \"\\\"\" + m_data.toStringSuffix();\n            }\n\n            CasedString m_data;\n        };\n\n        struct Contains : MatcherImpl<Contains, std::string> {\n            Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )\n            : m_data( substr, caseSensitivity ){}\n            Contains( Contains const& other ) : m_data( other.m_data ){}\n\n            virtual ~Contains();\n\n            virtual bool match( std::string const& expr ) const {\n                return m_data.adjustString( expr ).find( m_data.m_str ) != std::string::npos;\n            }\n            virtual std::string toString() const {\n                return \"contains: \\\"\" + m_data.m_str  + \"\\\"\" + m_data.toStringSuffix();\n            }\n\n            CasedString m_data;\n        };\n\n        struct StartsWith : MatcherImpl<StartsWith, std::string> {\n            StartsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )\n            : m_data( substr, caseSensitivity ){}\n\n            StartsWith( StartsWith const& other ) : m_data( other.m_data ){}\n\n            virtual ~StartsWith();\n\n            virtual bool match( std::string const& expr ) const {\n                return startsWith( m_data.adjustString( expr ), m_data.m_str );\n            }\n            virtual std::string toString() const {\n                return \"starts with: \\\"\" + m_data.m_str + \"\\\"\" + m_data.toStringSuffix();\n            }\n\n            CasedString m_data;\n        };\n\n        struct EndsWith : MatcherImpl<EndsWith, std::string> {\n            EndsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes )\n            : m_data( substr, caseSensitivity ){}\n            EndsWith( EndsWith const& other ) : m_data( other.m_data ){}\n\n            virtual ~EndsWith();\n\n            virtual bool match( std::string const& expr ) const {\n                return endsWith( m_data.adjustString( expr ), m_data.m_str );\n            }\n            virtual std::string toString() const {\n                return \"ends with: \\\"\" + m_data.m_str + \"\\\"\" + m_data.toStringSuffix();\n            }\n\n            CasedString m_data;\n        };\n    } // namespace StdString\n    } // namespace Impl\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n    template<typename ExpressionT>\n    inline Impl::Generic::Not<ExpressionT> Not( Impl::Matcher<ExpressionT> const& m ) {\n        return Impl::Generic::Not<ExpressionT>( m );\n    }\n\n    template<typename ExpressionT>\n    inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,\n                                                    Impl::Matcher<ExpressionT> const& m2 ) {\n        return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 );\n    }\n    template<typename ExpressionT>\n    inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,\n                                                    Impl::Matcher<ExpressionT> const& m2,\n                                                    Impl::Matcher<ExpressionT> const& m3 ) {\n        return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );\n    }\n    template<typename ExpressionT>\n    inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,\n                                                    Impl::Matcher<ExpressionT> const& m2 ) {\n        return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 );\n    }\n    template<typename ExpressionT>\n    inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,\n                                                    Impl::Matcher<ExpressionT> const& m2,\n                                                    Impl::Matcher<ExpressionT> const& m3 ) {\n        return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );\n    }\n\n    inline Impl::StdString::Equals      Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {\n        return Impl::StdString::Equals( str, caseSensitivity );\n    }\n    inline Impl::StdString::Equals      Equals( const char* str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {\n        return Impl::StdString::Equals( Impl::StdString::makeString( str ), caseSensitivity );\n    }\n    inline Impl::StdString::Contains    Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {\n        return Impl::StdString::Contains( substr, caseSensitivity );\n    }\n    inline Impl::StdString::Contains    Contains( const char* substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) {\n        return Impl::StdString::Contains( Impl::StdString::makeString( substr ), caseSensitivity );\n    }\n    inline Impl::StdString::StartsWith  StartsWith( std::string const& substr ) {\n        return Impl::StdString::StartsWith( substr );\n    }\n    inline Impl::StdString::StartsWith  StartsWith( const char* substr ) {\n        return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) );\n    }\n    inline Impl::StdString::EndsWith    EndsWith( std::string const& substr ) {\n        return Impl::StdString::EndsWith( substr );\n    }\n    inline Impl::StdString::EndsWith    EndsWith( const char* substr ) {\n        return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) );\n    }\n\n} // namespace Matchers\n\nusing namespace Matchers;\n\n} // namespace Catch\n\nnamespace Catch {\n\n    struct TestFailureException{};\n\n    template<typename T> class ExpressionLhs;\n\n    struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;\n\n    struct CopyableStream {\n        CopyableStream() {}\n        CopyableStream( CopyableStream const& other ) {\n            oss << other.oss.str();\n        }\n        CopyableStream& operator=( CopyableStream const& other ) {\n            oss.str(\"\");\n            oss << other.oss.str();\n            return *this;\n        }\n        std::ostringstream oss;\n    };\n\n    class ResultBuilder {\n    public:\n        ResultBuilder(  char const* macroName,\n                        SourceLineInfo const& lineInfo,\n                        char const* capturedExpression,\n                        ResultDisposition::Flags resultDisposition,\n                        char const* secondArg = \"\" );\n\n        template<typename T>\n        ExpressionLhs<T const&> operator <= ( T const& operand );\n        ExpressionLhs<bool> operator <= ( bool value );\n\n        template<typename T>\n        ResultBuilder& operator << ( T const& value ) {\n            m_stream.oss << value;\n            return *this;\n        }\n\n        template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& );\n        template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& );\n\n        ResultBuilder& setResultType( ResultWas::OfType result );\n        ResultBuilder& setResultType( bool result );\n        ResultBuilder& setLhs( std::string const& lhs );\n        ResultBuilder& setRhs( std::string const& rhs );\n        ResultBuilder& setOp( std::string const& op );\n\n        void endExpression();\n\n        std::string reconstructExpression() const;\n        AssertionResult build() const;\n\n        void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal );\n        void captureResult( ResultWas::OfType resultType );\n        void captureExpression();\n        void captureExpectedException( std::string const& expectedMessage );\n        void captureExpectedException( Matchers::Impl::Matcher<std::string> const& matcher );\n        void handleResult( AssertionResult const& result );\n        void react();\n        bool shouldDebugBreak() const;\n        bool allowThrows() const;\n\n    private:\n        AssertionInfo m_assertionInfo;\n        AssertionResultData m_data;\n        struct ExprComponents {\n            ExprComponents() : testFalse( false ) {}\n            bool testFalse;\n            std::string lhs, rhs, op;\n        } m_exprComponents;\n        CopyableStream m_stream;\n\n        bool m_shouldDebugBreak;\n        bool m_shouldThrow;\n    };\n\n} // namespace Catch\n\n// Include after due to circular dependency:\n// #included from: catch_expression_lhs.hpp\n#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED\n\n// #included from: catch_evaluate.hpp\n#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4389) // '==' : signed/unsigned mismatch\n#endif\n\n#include <cstddef>\n\nnamespace Catch {\nnamespace Internal {\n\n    enum Operator {\n        IsEqualTo,\n        IsNotEqualTo,\n        IsLessThan,\n        IsGreaterThan,\n        IsLessThanOrEqualTo,\n        IsGreaterThanOrEqualTo\n    };\n\n    template<Operator Op> struct OperatorTraits             { static const char* getName(){ return \"*error*\"; } };\n    template<> struct OperatorTraits<IsEqualTo>             { static const char* getName(){ return \"==\"; } };\n    template<> struct OperatorTraits<IsNotEqualTo>          { static const char* getName(){ return \"!=\"; } };\n    template<> struct OperatorTraits<IsLessThan>            { static const char* getName(){ return \"<\"; } };\n    template<> struct OperatorTraits<IsGreaterThan>         { static const char* getName(){ return \">\"; } };\n    template<> struct OperatorTraits<IsLessThanOrEqualTo>   { static const char* getName(){ return \"<=\"; } };\n    template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return \">=\"; } };\n\n    template<typename T>\n    inline T& opCast(T const& t) { return const_cast<T&>(t); }\n\n// nullptr_t support based on pull request #154 from Konstantin Baumann\n#ifdef CATCH_CONFIG_CPP11_NULLPTR\n    inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; }\n#endif // CATCH_CONFIG_CPP11_NULLPTR\n\n    // So the compare overloads can be operator agnostic we convey the operator as a template\n    // enum, which is used to specialise an Evaluator for doing the comparison.\n    template<typename T1, typename T2, Operator Op>\n    class Evaluator{};\n\n    template<typename T1, typename T2>\n    struct Evaluator<T1, T2, IsEqualTo> {\n        static bool evaluate( T1 const& lhs, T2 const& rhs) {\n            return bool( opCast( lhs ) ==  opCast( rhs ) );\n        }\n    };\n    template<typename T1, typename T2>\n    struct Evaluator<T1, T2, IsNotEqualTo> {\n        static bool evaluate( T1 const& lhs, T2 const& rhs ) {\n            return bool( opCast( lhs ) != opCast( rhs ) );\n        }\n    };\n    template<typename T1, typename T2>\n    struct Evaluator<T1, T2, IsLessThan> {\n        static bool evaluate( T1 const& lhs, T2 const& rhs ) {\n            return bool( opCast( lhs ) < opCast( rhs ) );\n        }\n    };\n    template<typename T1, typename T2>\n    struct Evaluator<T1, T2, IsGreaterThan> {\n        static bool evaluate( T1 const& lhs, T2 const& rhs ) {\n            return bool( opCast( lhs ) > opCast( rhs ) );\n        }\n    };\n    template<typename T1, typename T2>\n    struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {\n        static bool evaluate( T1 const& lhs, T2 const& rhs ) {\n            return bool( opCast( lhs ) >= opCast( rhs ) );\n        }\n    };\n    template<typename T1, typename T2>\n    struct Evaluator<T1, T2, IsLessThanOrEqualTo> {\n        static bool evaluate( T1 const& lhs, T2 const& rhs ) {\n            return bool( opCast( lhs ) <= opCast( rhs ) );\n        }\n    };\n\n    template<Operator Op, typename T1, typename T2>\n    bool applyEvaluator( T1 const& lhs, T2 const& rhs ) {\n        return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );\n    }\n\n    // This level of indirection allows us to specialise for integer types\n    // to avoid signed/ unsigned warnings\n\n    // \"base\" overload\n    template<Operator Op, typename T1, typename T2>\n    bool compare( T1 const& lhs, T2 const& rhs ) {\n        return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );\n    }\n\n    // unsigned X to int\n    template<Operator Op> bool compare( unsigned int lhs, int rhs ) {\n        return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );\n    }\n    template<Operator Op> bool compare( unsigned long lhs, int rhs ) {\n        return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );\n    }\n    template<Operator Op> bool compare( unsigned char lhs, int rhs ) {\n        return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );\n    }\n\n    // unsigned X to long\n    template<Operator Op> bool compare( unsigned int lhs, long rhs ) {\n        return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );\n    }\n    template<Operator Op> bool compare( unsigned long lhs, long rhs ) {\n        return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );\n    }\n    template<Operator Op> bool compare( unsigned char lhs, long rhs ) {\n        return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );\n    }\n\n    // int to unsigned X\n    template<Operator Op> bool compare( int lhs, unsigned int rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( int lhs, unsigned long rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( int lhs, unsigned char rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );\n    }\n\n    // long to unsigned X\n    template<Operator Op> bool compare( long lhs, unsigned int rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( long lhs, unsigned long rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( long lhs, unsigned char rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n\n    // pointer to long (when comparing against NULL)\n    template<Operator Op, typename T> bool compare( long lhs, T* rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );\n    }\n    template<Operator Op, typename T> bool compare( T* lhs, long rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );\n    }\n\n    // pointer to int (when comparing against NULL)\n    template<Operator Op, typename T> bool compare( int lhs, T* rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );\n    }\n    template<Operator Op, typename T> bool compare( T* lhs, int rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );\n    }\n\n#ifdef CATCH_CONFIG_CPP11_LONG_LONG\n    // long long to unsigned X\n    template<Operator Op> bool compare( long long lhs, unsigned int rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( long long lhs, unsigned long rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( long long lhs, unsigned long long rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( long long lhs, unsigned char rhs ) {\n        return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );\n    }\n\n    // unsigned long long to X\n    template<Operator Op> bool compare( unsigned long long lhs, int rhs ) {\n        return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( unsigned long long lhs, long rhs ) {\n        return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( unsigned long long lhs, long long rhs ) {\n        return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );\n    }\n    template<Operator Op> bool compare( unsigned long long lhs, char rhs ) {\n        return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );\n    }\n\n    // pointer to long long (when comparing against NULL)\n    template<Operator Op, typename T> bool compare( long long lhs, T* rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );\n    }\n    template<Operator Op, typename T> bool compare( T* lhs, long long rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );\n    }\n#endif // CATCH_CONFIG_CPP11_LONG_LONG\n\n#ifdef CATCH_CONFIG_CPP11_NULLPTR\n    // pointer to nullptr_t (when comparing against nullptr)\n    template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) {\n        return Evaluator<T*, T*, Op>::evaluate( nullptr, rhs );\n    }\n    template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) {\n        return Evaluator<T*, T*, Op>::evaluate( lhs, nullptr );\n    }\n#endif // CATCH_CONFIG_CPP11_NULLPTR\n\n} // end of namespace Internal\n} // end of namespace Catch\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n// #included from: catch_tostring.h\n#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED\n\n#include <sstream>\n#include <iomanip>\n#include <limits>\n#include <vector>\n#include <cstddef>\n\n#ifdef __OBJC__\n// #included from: catch_objc_arc.hpp\n#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED\n\n#import <Foundation/Foundation.h>\n\n#ifdef __has_feature\n#define CATCH_ARC_ENABLED __has_feature(objc_arc)\n#else\n#define CATCH_ARC_ENABLED 0\n#endif\n\nvoid arcSafeRelease( NSObject* obj );\nid performOptionalSelector( id obj, SEL sel );\n\n#if !CATCH_ARC_ENABLED\ninline void arcSafeRelease( NSObject* obj ) {\n    [obj release];\n}\ninline id performOptionalSelector( id obj, SEL sel ) {\n    if( [obj respondsToSelector: sel] )\n        return [obj performSelector: sel];\n    return nil;\n}\n#define CATCH_UNSAFE_UNRETAINED\n#define CATCH_ARC_STRONG\n#else\ninline void arcSafeRelease( NSObject* ){}\ninline id performOptionalSelector( id obj, SEL sel ) {\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n#endif\n    if( [obj respondsToSelector: sel] )\n        return [obj performSelector: sel];\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n    return nil;\n}\n#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained\n#define CATCH_ARC_STRONG __strong\n#endif\n\n#endif\n\n#ifdef CATCH_CONFIG_CPP11_TUPLE\n#include <tuple>\n#endif\n\n#ifdef CATCH_CONFIG_CPP11_IS_ENUM\n#include <type_traits>\n#endif\n\nnamespace Catch {\n\n// Why we're here.\ntemplate<typename T>\nstd::string toString( T const& value );\n\n// Built in overloads\n\nstd::string toString( std::string const& value );\nstd::string toString( std::wstring const& value );\nstd::string toString( const char* const value );\nstd::string toString( char* const value );\nstd::string toString( const wchar_t* const value );\nstd::string toString( wchar_t* const value );\nstd::string toString( int value );\nstd::string toString( unsigned long value );\nstd::string toString( unsigned int value );\nstd::string toString( const double value );\nstd::string toString( const float value );\nstd::string toString( bool value );\nstd::string toString( char value );\nstd::string toString( signed char value );\nstd::string toString( unsigned char value );\n\n#ifdef CATCH_CONFIG_CPP11_LONG_LONG\nstd::string toString( long long value );\nstd::string toString( unsigned long long value );\n#endif\n\n#ifdef CATCH_CONFIG_CPP11_NULLPTR\nstd::string toString( std::nullptr_t );\n#endif\n\n#ifdef __OBJC__\n    std::string toString( NSString const * const& nsstring );\n    std::string toString( NSString * CATCH_ARC_STRONG const& nsstring );\n    std::string toString( NSObject* const& nsObject );\n#endif\n\nnamespace Detail {\n\n    extern const std::string unprintableString;\n\n    struct BorgType {\n        template<typename T> BorgType( T const& );\n    };\n\n    struct TrueType { char sizer[1]; };\n    struct FalseType { char sizer[2]; };\n\n    TrueType& testStreamable( std::ostream& );\n    FalseType testStreamable( FalseType );\n\n    FalseType operator<<( std::ostream const&, BorgType const& );\n\n    template<typename T>\n    struct IsStreamInsertable {\n        static std::ostream &s;\n        static T  const&t;\n        enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) };\n    };\n\n#if defined(CATCH_CONFIG_CPP11_IS_ENUM)\n    template<typename T,\n             bool IsEnum = std::is_enum<T>::value\n             >\n    struct EnumStringMaker\n    {\n        static std::string convert( T const& ) { return unprintableString; }\n    };\n\n    template<typename T>\n    struct EnumStringMaker<T,true>\n    {\n        static std::string convert( T const& v )\n        {\n            return ::Catch::toString(\n                static_cast<typename std::underlying_type<T>::type>(v)\n                );\n        }\n    };\n#endif\n    template<bool C>\n    struct StringMakerBase {\n#if defined(CATCH_CONFIG_CPP11_IS_ENUM)\n        template<typename T>\n        static std::string convert( T const& v )\n        {\n            return EnumStringMaker<T>::convert( v );\n        }\n#else\n        template<typename T>\n        static std::string convert( T const& ) { return unprintableString; }\n#endif\n    };\n\n    template<>\n    struct StringMakerBase<true> {\n        template<typename T>\n        static std::string convert( T const& _value ) {\n            std::ostringstream oss;\n            oss << _value;\n            return oss.str();\n        }\n    };\n\n    std::string rawMemoryToString( const void *object, std::size_t size );\n\n    template<typename T>\n    inline std::string rawMemoryToString( const T& object ) {\n      return rawMemoryToString( &object, sizeof(object) );\n    }\n\n} // end namespace Detail\n\ntemplate<typename T>\nstruct StringMaker :\n    Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {};\n\ntemplate<typename T>\nstruct StringMaker<T*> {\n    template<typename U>\n    static std::string convert( U* p ) {\n        if( !p )\n            return \"NULL\";\n        else\n            return Detail::rawMemoryToString( p );\n    }\n};\n\ntemplate<typename R, typename C>\nstruct StringMaker<R C::*> {\n    static std::string convert( R C::* p ) {\n        if( !p )\n            return \"NULL\";\n        else\n            return Detail::rawMemoryToString( p );\n    }\n};\n\nnamespace Detail {\n    template<typename InputIterator>\n    std::string rangeToString( InputIterator first, InputIterator last );\n}\n\n//template<typename T, typename Allocator>\n//struct StringMaker<std::vector<T, Allocator> > {\n//    static std::string convert( std::vector<T,Allocator> const& v ) {\n//        return Detail::rangeToString( v.begin(), v.end() );\n//    }\n//};\n\ntemplate<typename T, typename Allocator>\nstd::string toString( std::vector<T,Allocator> const& v ) {\n    return Detail::rangeToString( v.begin(), v.end() );\n}\n\n#ifdef CATCH_CONFIG_CPP11_TUPLE\n\n// toString for tuples\nnamespace TupleDetail {\n  template<\n      typename Tuple,\n      std::size_t N = 0,\n      bool = (N < std::tuple_size<Tuple>::value)\n      >\n  struct ElementPrinter {\n      static void print( const Tuple& tuple, std::ostream& os )\n      {\n          os << ( N ? \", \" : \" \" )\n             << Catch::toString(std::get<N>(tuple));\n          ElementPrinter<Tuple,N+1>::print(tuple,os);\n      }\n  };\n\n  template<\n      typename Tuple,\n      std::size_t N\n      >\n  struct ElementPrinter<Tuple,N,false> {\n      static void print( const Tuple&, std::ostream& ) {}\n  };\n\n}\n\ntemplate<typename ...Types>\nstruct StringMaker<std::tuple<Types...>> {\n\n    static std::string convert( const std::tuple<Types...>& tuple )\n    {\n        std::ostringstream os;\n        os << '{';\n        TupleDetail::ElementPrinter<std::tuple<Types...>>::print( tuple, os );\n        os << \" }\";\n        return os.str();\n    }\n};\n#endif // CATCH_CONFIG_CPP11_TUPLE\n\nnamespace Detail {\n    template<typename T>\n    std::string makeString( T const& value ) {\n        return StringMaker<T>::convert( value );\n    }\n} // end namespace Detail\n\n/// \\brief converts any type to a string\n///\n/// The default template forwards on to ostringstream - except when an\n/// ostringstream overload does not exist - in which case it attempts to detect\n/// that and writes {?}.\n/// Overload (not specialise) this template for custom typs that you don't want\n/// to provide an ostream overload for.\ntemplate<typename T>\nstd::string toString( T const& value ) {\n    return StringMaker<T>::convert( value );\n}\n\n    namespace Detail {\n    template<typename InputIterator>\n    std::string rangeToString( InputIterator first, InputIterator last ) {\n        std::ostringstream oss;\n        oss << \"{ \";\n        if( first != last ) {\n            oss << Catch::toString( *first );\n            for( ++first ; first != last ; ++first )\n                oss << \", \" << Catch::toString( *first );\n        }\n        oss << \" }\";\n        return oss.str();\n    }\n}\n\n} // end namespace Catch\n\nnamespace Catch {\n\n// Wraps the LHS of an expression and captures the operator and RHS (if any) -\n// wrapping them all in a ResultBuilder object\ntemplate<typename T>\nclass ExpressionLhs {\n    ExpressionLhs& operator = ( ExpressionLhs const& );\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n    ExpressionLhs& operator = ( ExpressionLhs && ) = delete;\n#  endif\n\npublic:\n    ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {}\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n    ExpressionLhs( ExpressionLhs const& ) = default;\n    ExpressionLhs( ExpressionLhs && )     = default;\n#  endif\n\n    template<typename RhsT>\n    ResultBuilder& operator == ( RhsT const& rhs ) {\n        return captureExpression<Internal::IsEqualTo>( rhs );\n    }\n\n    template<typename RhsT>\n    ResultBuilder& operator != ( RhsT const& rhs ) {\n        return captureExpression<Internal::IsNotEqualTo>( rhs );\n    }\n\n    template<typename RhsT>\n    ResultBuilder& operator < ( RhsT const& rhs ) {\n        return captureExpression<Internal::IsLessThan>( rhs );\n    }\n\n    template<typename RhsT>\n    ResultBuilder& operator > ( RhsT const& rhs ) {\n        return captureExpression<Internal::IsGreaterThan>( rhs );\n    }\n\n    template<typename RhsT>\n    ResultBuilder& operator <= ( RhsT const& rhs ) {\n        return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );\n    }\n\n    template<typename RhsT>\n    ResultBuilder& operator >= ( RhsT const& rhs ) {\n        return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );\n    }\n\n    ResultBuilder& operator == ( bool rhs ) {\n        return captureExpression<Internal::IsEqualTo>( rhs );\n    }\n\n    ResultBuilder& operator != ( bool rhs ) {\n        return captureExpression<Internal::IsNotEqualTo>( rhs );\n    }\n\n    void endExpression() {\n        bool value = m_lhs ? true : false;\n        m_rb\n            .setLhs( Catch::toString( value ) )\n            .setResultType( value )\n            .endExpression();\n    }\n\n    // Only simple binary expressions are allowed on the LHS.\n    // If more complex compositions are required then place the sub expression in parentheses\n    template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& );\n    template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& );\n    template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& );\n    template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& );\n    template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& );\n    template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& );\n\nprivate:\n    template<Internal::Operator Op, typename RhsT>\n    ResultBuilder& captureExpression( RhsT const& rhs ) {\n        return m_rb\n            .setResultType( Internal::compare<Op>( m_lhs, rhs ) )\n            .setLhs( Catch::toString( m_lhs ) )\n            .setRhs( Catch::toString( rhs ) )\n            .setOp( Internal::OperatorTraits<Op>::getName() );\n    }\n\nprivate:\n    ResultBuilder& m_rb;\n    T m_lhs;\n};\n\n} // end namespace Catch\n\n\nnamespace Catch {\n\n    template<typename T>\n    inline ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {\n        return ExpressionLhs<T const&>( *this, operand );\n    }\n\n    inline ExpressionLhs<bool> ResultBuilder::operator <= ( bool value ) {\n        return ExpressionLhs<bool>( *this, value );\n    }\n\n} // namespace Catch\n\n// #included from: catch_message.h\n#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED\n\n#include <string>\n\nnamespace Catch {\n\n    struct MessageInfo {\n        MessageInfo(    std::string const& _macroName,\n                        SourceLineInfo const& _lineInfo,\n                        ResultWas::OfType _type );\n\n        std::string macroName;\n        SourceLineInfo lineInfo;\n        ResultWas::OfType type;\n        std::string message;\n        unsigned int sequence;\n\n        bool operator == ( MessageInfo const& other ) const {\n            return sequence == other.sequence;\n        }\n        bool operator < ( MessageInfo const& other ) const {\n            return sequence < other.sequence;\n        }\n    private:\n        static unsigned int globalCount;\n    };\n\n    struct MessageBuilder {\n        MessageBuilder( std::string const& macroName,\n                        SourceLineInfo const& lineInfo,\n                        ResultWas::OfType type )\n        : m_info( macroName, lineInfo, type )\n        {}\n\n        template<typename T>\n        MessageBuilder& operator << ( T const& value ) {\n            m_stream << value;\n            return *this;\n        }\n\n        MessageInfo m_info;\n        std::ostringstream m_stream;\n    };\n\n    class ScopedMessage {\n    public:\n        ScopedMessage( MessageBuilder const& builder );\n        ScopedMessage( ScopedMessage const& other );\n        ~ScopedMessage();\n\n        MessageInfo m_info;\n    };\n\n} // end namespace Catch\n\n// #included from: catch_interfaces_capture.h\n#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED\n\n#include <string>\n\nnamespace Catch {\n\n    class TestCase;\n    class AssertionResult;\n    struct AssertionInfo;\n    struct SectionInfo;\n    struct SectionEndInfo;\n    struct MessageInfo;\n    class ScopedMessageBuilder;\n    struct Counts;\n\n    struct IResultCapture {\n\n        virtual ~IResultCapture();\n\n        virtual void assertionEnded( AssertionResult const& result ) = 0;\n        virtual bool sectionStarted(    SectionInfo const& sectionInfo,\n                                        Counts& assertions ) = 0;\n        virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;\n        virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;\n        virtual void pushScopedMessage( MessageInfo const& message ) = 0;\n        virtual void popScopedMessage( MessageInfo const& message ) = 0;\n\n        virtual std::string getCurrentTestName() const = 0;\n        virtual const AssertionResult* getLastResult() const = 0;\n\n        virtual void handleFatalErrorCondition( std::string const& message ) = 0;\n    };\n\n    IResultCapture& getResultCapture();\n}\n\n// #included from: catch_debugger.h\n#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED\n\n// #included from: catch_platform.h\n#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED\n\n#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)\n#  define CATCH_PLATFORM_MAC\n#elif  defined(__IPHONE_OS_VERSION_MIN_REQUIRED)\n#  define CATCH_PLATFORM_IPHONE\n#elif defined(linux) || defined(__linux) || defined(__linux__)\n#  define CATCH_PLATFORM_LINUX\n#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)\n#  define CATCH_PLATFORM_WINDOWS\n#  if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)\n#    define CATCH_DEFINES_NOMINMAX\n#  endif\n#  if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)\n#    define CATCH_DEFINES_WIN32_LEAN_AND_MEAN\n#  endif\n#endif\n\n#include <string>\n\nnamespace Catch{\n\n    bool isDebuggerActive();\n    void writeToDebugConsole( std::string const& text );\n}\n\n#ifdef CATCH_PLATFORM_MAC\n\n    // The following code snippet based on:\n    // http://cocoawithlove.com/2008/03/break-into-debugger.html\n    #ifdef DEBUG\n        #if defined(__ppc64__) || defined(__ppc__)\n            #define CATCH_TRAP() \\\n                    __asm__(\"li r0, 20\\nsc\\nnop\\nli r0, 37\\nli r4, 2\\nsc\\nnop\\n\" \\\n                    : : : \"memory\",\"r0\",\"r3\",\"r4\" )\n        #else\n            #define CATCH_TRAP() _asm__(\"int $3\\n\" : : )\n        #endif\n    #endif\n\n#elif defined(CATCH_PLATFORM_LINUX)\n    // If we can use inline assembler, do it because this allows us to break\n    // directly at the location of the failing check instead of breaking inside\n    // raise() called from it, i.e. one stack frame below.\n    #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))\n        #define CATCH_TRAP() asm volatile (\"int $3\")\n    #else // Fall back to the generic way.\n        #include <signal.h>\n\n        #define CATCH_TRAP() raise(SIGTRAP)\n    #endif\n#elif defined(_MSC_VER)\n    #define CATCH_TRAP() __debugbreak()\n#elif defined(__MINGW32__)\n    extern \"C\" __declspec(dllimport) void __stdcall DebugBreak();\n    #define CATCH_TRAP() DebugBreak()\n#endif\n\n#ifdef CATCH_TRAP\n    #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); }\n#else\n    #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();\n#endif\n\n// #included from: catch_interfaces_runner.h\n#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED\n\nnamespace Catch {\n    class TestCase;\n\n    struct IRunner {\n        virtual ~IRunner();\n        virtual bool aborting() const = 0;\n    };\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// In the event of a failure works out if the debugger needs to be invoked\n// and/or an exception thrown and takes appropriate action.\n// This needs to be done as a macro so the debugger will stop in the user\n// source code rather than in Catch library code\n#define INTERNAL_CATCH_REACT( resultBuilder ) \\\n    if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \\\n    resultBuilder.react();\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \\\n    do { \\\n        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \\\n        try { \\\n            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \\\n            ( __catchResult <= expr ).endExpression(); \\\n        } \\\n        catch( ... ) { \\\n            __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \\\n        } \\\n        INTERNAL_CATCH_REACT( __catchResult ) \\\n    } while( Catch::alwaysFalse( sizeof(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \\\n    INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \\\n    if( Catch::getResultCapture().getLastResult()->succeeded() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \\\n    INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \\\n    if( !Catch::getResultCapture().getLastResult()->succeeded() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \\\n    do { \\\n        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \\\n        try { \\\n            expr; \\\n            __catchResult.captureResult( Catch::ResultWas::Ok ); \\\n        } \\\n        catch( ... ) { \\\n            __catchResult.useActiveException( resultDisposition ); \\\n        } \\\n        INTERNAL_CATCH_REACT( __catchResult ) \\\n    } while( Catch::alwaysFalse() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS( expr, resultDisposition, matcher, macroName ) \\\n    do { \\\n        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \\\n        if( __catchResult.allowThrows() ) \\\n            try { \\\n                expr; \\\n                __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \\\n            } \\\n            catch( ... ) { \\\n                __catchResult.captureExpectedException( matcher ); \\\n            } \\\n        else \\\n            __catchResult.captureResult( Catch::ResultWas::Ok ); \\\n        INTERNAL_CATCH_REACT( __catchResult ) \\\n    } while( Catch::alwaysFalse() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \\\n    do { \\\n        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \\\n        if( __catchResult.allowThrows() ) \\\n            try { \\\n                expr; \\\n                __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \\\n            } \\\n            catch( exceptionType ) { \\\n                __catchResult.captureResult( Catch::ResultWas::Ok ); \\\n            } \\\n            catch( ... ) { \\\n                __catchResult.useActiveException( resultDisposition ); \\\n            } \\\n        else \\\n            __catchResult.captureResult( Catch::ResultWas::Ok ); \\\n        INTERNAL_CATCH_REACT( __catchResult ) \\\n    } while( Catch::alwaysFalse() )\n\n///////////////////////////////////////////////////////////////////////////////\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n    #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \\\n        do { \\\n            Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, \"\", resultDisposition ); \\\n            __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \\\n            __catchResult.captureResult( messageType ); \\\n            INTERNAL_CATCH_REACT( __catchResult ) \\\n        } while( Catch::alwaysFalse() )\n#else\n    #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \\\n        do { \\\n            Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, \"\", resultDisposition ); \\\n            __catchResult << log + ::Catch::StreamEndStop(); \\\n            __catchResult.captureResult( messageType ); \\\n            INTERNAL_CATCH_REACT( __catchResult ) \\\n        } while( Catch::alwaysFalse() )\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_INFO( log, macroName ) \\\n    Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log;\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \\\n    do { \\\n        Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg \", \" #matcher, resultDisposition ); \\\n        try { \\\n            std::string matcherAsString = (matcher).toString(); \\\n            __catchResult \\\n                .setLhs( Catch::toString( arg ) ) \\\n                .setRhs( matcherAsString == Catch::Detail::unprintableString ? #matcher : matcherAsString ) \\\n                .setOp( \"matches\" ) \\\n                .setResultType( (matcher).match( arg ) ); \\\n            __catchResult.captureExpression(); \\\n        } catch( ... ) { \\\n            __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \\\n        } \\\n        INTERNAL_CATCH_REACT( __catchResult ) \\\n    } while( Catch::alwaysFalse() )\n\n// #included from: internal/catch_section.h\n#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED\n\n// #included from: catch_section_info.h\n#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED\n\n// #included from: catch_totals.hpp\n#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED\n\n#include <cstddef>\n\nnamespace Catch {\n\n    struct Counts {\n        Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {}\n\n        Counts operator - ( Counts const& other ) const {\n            Counts diff;\n            diff.passed = passed - other.passed;\n            diff.failed = failed - other.failed;\n            diff.failedButOk = failedButOk - other.failedButOk;\n            return diff;\n        }\n        Counts& operator += ( Counts const& other ) {\n            passed += other.passed;\n            failed += other.failed;\n            failedButOk += other.failedButOk;\n            return *this;\n        }\n\n        std::size_t total() const {\n            return passed + failed + failedButOk;\n        }\n        bool allPassed() const {\n            return failed == 0 && failedButOk == 0;\n        }\n        bool allOk() const {\n            return failed == 0;\n        }\n\n        std::size_t passed;\n        std::size_t failed;\n        std::size_t failedButOk;\n    };\n\n    struct Totals {\n\n        Totals operator - ( Totals const& other ) const {\n            Totals diff;\n            diff.assertions = assertions - other.assertions;\n            diff.testCases = testCases - other.testCases;\n            return diff;\n        }\n\n        Totals delta( Totals const& prevTotals ) const {\n            Totals diff = *this - prevTotals;\n            if( diff.assertions.failed > 0 )\n                ++diff.testCases.failed;\n            else if( diff.assertions.failedButOk > 0 )\n                ++diff.testCases.failedButOk;\n            else\n                ++diff.testCases.passed;\n            return diff;\n        }\n\n        Totals& operator += ( Totals const& other ) {\n            assertions += other.assertions;\n            testCases += other.testCases;\n            return *this;\n        }\n\n        Counts assertions;\n        Counts testCases;\n    };\n}\n\nnamespace Catch {\n\n    struct SectionInfo {\n        SectionInfo\n            (   SourceLineInfo const& _lineInfo,\n                std::string const& _name,\n                std::string const& _description = std::string() );\n\n        std::string name;\n        std::string description;\n        SourceLineInfo lineInfo;\n    };\n\n    struct SectionEndInfo {\n        SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds )\n        : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds )\n        {}\n\n        SectionInfo sectionInfo;\n        Counts prevAssertions;\n        double durationInSeconds;\n    };\n\n} // end namespace Catch\n\n// #included from: catch_timer.h\n#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED\n\n#ifdef CATCH_PLATFORM_WINDOWS\ntypedef unsigned long long uint64_t;\n#else\n#include <stdint.h>\n#endif\n\nnamespace Catch {\n\n    class Timer {\n    public:\n        Timer() : m_ticks( 0 ) {}\n        void start();\n        unsigned int getElapsedMicroseconds() const;\n        unsigned int getElapsedMilliseconds() const;\n        double getElapsedSeconds() const;\n\n    private:\n        uint64_t m_ticks;\n    };\n\n} // namespace Catch\n\n#include <string>\n\nnamespace Catch {\n\n    class Section : NonCopyable {\n    public:\n        Section( SectionInfo const& info );\n        ~Section();\n\n        // This indicates whether the section should be executed or not\n        operator bool() const;\n\n    private:\n        SectionInfo m_info;\n\n        std::string m_name;\n        Counts m_assertions;\n        bool m_sectionIncluded;\n        Timer m_timer;\n    };\n\n} // end namespace Catch\n\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n    #define INTERNAL_CATCH_SECTION( ... ) \\\n        if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) )\n#else\n    #define INTERNAL_CATCH_SECTION( name, desc ) \\\n        if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) )\n#endif\n\n// #included from: internal/catch_generators.hpp\n#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED\n\n#include <iterator>\n#include <vector>\n#include <string>\n#include <stdlib.h>\n\nnamespace Catch {\n\ntemplate<typename T>\nstruct IGenerator {\n    virtual ~IGenerator() {}\n    virtual T getValue( std::size_t index ) const = 0;\n    virtual std::size_t size () const = 0;\n};\n\ntemplate<typename T>\nclass BetweenGenerator : public IGenerator<T> {\npublic:\n    BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}\n\n    virtual T getValue( std::size_t index ) const {\n        return m_from+static_cast<int>( index );\n    }\n\n    virtual std::size_t size() const {\n        return static_cast<std::size_t>( 1+m_to-m_from );\n    }\n\nprivate:\n\n    T m_from;\n    T m_to;\n};\n\ntemplate<typename T>\nclass ValuesGenerator : public IGenerator<T> {\npublic:\n    ValuesGenerator(){}\n\n    void add( T value ) {\n        m_values.push_back( value );\n    }\n\n    virtual T getValue( std::size_t index ) const {\n        return m_values[index];\n    }\n\n    virtual std::size_t size() const {\n        return m_values.size();\n    }\n\nprivate:\n    std::vector<T> m_values;\n};\n\ntemplate<typename T>\nclass CompositeGenerator {\npublic:\n    CompositeGenerator() : m_totalSize( 0 ) {}\n\n    // *** Move semantics, similar to auto_ptr ***\n    CompositeGenerator( CompositeGenerator& other )\n    :   m_fileInfo( other.m_fileInfo ),\n        m_totalSize( 0 )\n    {\n        move( other );\n    }\n\n    CompositeGenerator& setFileInfo( const char* fileInfo ) {\n        m_fileInfo = fileInfo;\n        return *this;\n    }\n\n    ~CompositeGenerator() {\n        deleteAll( m_composed );\n    }\n\n    operator T () const {\n        size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize );\n\n        typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin();\n        typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end();\n        for( size_t index = 0; it != itEnd; ++it )\n        {\n            const IGenerator<T>* generator = *it;\n            if( overallIndex >= index && overallIndex < index + generator->size() )\n            {\n                return generator->getValue( overallIndex-index );\n            }\n            index += generator->size();\n        }\n        CATCH_INTERNAL_ERROR( \"Indexed past end of generated range\" );\n        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\n    }\n\n    void add( const IGenerator<T>* generator ) {\n        m_totalSize += generator->size();\n        m_composed.push_back( generator );\n    }\n\n    CompositeGenerator& then( CompositeGenerator& other ) {\n        move( other );\n        return *this;\n    }\n\n    CompositeGenerator& then( T value ) {\n        ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();\n        valuesGen->add( value );\n        add( valuesGen );\n        return *this;\n    }\n\nprivate:\n\n    void move( CompositeGenerator& other ) {\n        std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) );\n        m_totalSize += other.m_totalSize;\n        other.m_composed.clear();\n    }\n\n    std::vector<const IGenerator<T>*> m_composed;\n    std::string m_fileInfo;\n    size_t m_totalSize;\n};\n\nnamespace Generators\n{\n    template<typename T>\n    CompositeGenerator<T> between( T from, T to ) {\n        CompositeGenerator<T> generators;\n        generators.add( new BetweenGenerator<T>( from, to ) );\n        return generators;\n    }\n\n    template<typename T>\n    CompositeGenerator<T> values( T val1, T val2 ) {\n        CompositeGenerator<T> generators;\n        ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();\n        valuesGen->add( val1 );\n        valuesGen->add( val2 );\n        generators.add( valuesGen );\n        return generators;\n    }\n\n    template<typename T>\n    CompositeGenerator<T> values( T val1, T val2, T val3 ){\n        CompositeGenerator<T> generators;\n        ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();\n        valuesGen->add( val1 );\n        valuesGen->add( val2 );\n        valuesGen->add( val3 );\n        generators.add( valuesGen );\n        return generators;\n    }\n\n    template<typename T>\n    CompositeGenerator<T> values( T val1, T val2, T val3, T val4 ) {\n        CompositeGenerator<T> generators;\n        ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();\n        valuesGen->add( val1 );\n        valuesGen->add( val2 );\n        valuesGen->add( val3 );\n        valuesGen->add( val4 );\n        generators.add( valuesGen );\n        return generators;\n    }\n\n} // end namespace Generators\n\nusing namespace Generators;\n\n} // end namespace Catch\n\n#define INTERNAL_CATCH_LINESTR2( line ) #line\n#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line )\n\n#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ \"(\" INTERNAL_CATCH_LINESTR( __LINE__ ) \")\" )\n\n// #included from: internal/catch_interfaces_exception.h\n#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED\n\n#include <string>\n#include <vector>\n\n// #included from: catch_interfaces_registry_hub.h\n#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED\n\n#include <string>\n\nnamespace Catch {\n\n    class TestCase;\n    struct ITestCaseRegistry;\n    struct IExceptionTranslatorRegistry;\n    struct IExceptionTranslator;\n    struct IReporterRegistry;\n    struct IReporterFactory;\n\n    struct IRegistryHub {\n        virtual ~IRegistryHub();\n\n        virtual IReporterRegistry const& getReporterRegistry() const = 0;\n        virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;\n        virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;\n    };\n\n    struct IMutableRegistryHub {\n        virtual ~IMutableRegistryHub();\n        virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) = 0;\n        virtual void registerListener( Ptr<IReporterFactory> const& factory ) = 0;\n        virtual void registerTest( TestCase const& testInfo ) = 0;\n        virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;\n    };\n\n    IRegistryHub& getRegistryHub();\n    IMutableRegistryHub& getMutableRegistryHub();\n    void cleanUp();\n    std::string translateActiveException();\n\n}\n\nnamespace Catch {\n\n    typedef std::string(*exceptionTranslateFunction)();\n\n    struct IExceptionTranslator;\n    typedef std::vector<const IExceptionTranslator*> ExceptionTranslators;\n\n    struct IExceptionTranslator {\n        virtual ~IExceptionTranslator();\n        virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;\n    };\n\n    struct IExceptionTranslatorRegistry {\n        virtual ~IExceptionTranslatorRegistry();\n\n        virtual std::string translateActiveException() const = 0;\n    };\n\n    class ExceptionTranslatorRegistrar {\n        template<typename T>\n        class ExceptionTranslator : public IExceptionTranslator {\n        public:\n\n            ExceptionTranslator( std::string(*translateFunction)( T& ) )\n            : m_translateFunction( translateFunction )\n            {}\n\n            virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE {\n                try {\n                    if( it == itEnd )\n                        throw;\n                    else\n                        return (*it)->translate( it+1, itEnd );\n                }\n                catch( T& ex ) {\n                    return m_translateFunction( ex );\n                }\n            }\n\n        protected:\n            std::string(*m_translateFunction)( T& );\n        };\n\n    public:\n        template<typename T>\n        ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {\n            getMutableRegistryHub().registerTranslator\n                ( new ExceptionTranslator<T>( translateFunction ) );\n        }\n    };\n}\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \\\n    static std::string translatorName( signature ); \\\n    namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\\\n    static std::string translatorName( signature )\n\n#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )\n\n// #included from: internal/catch_approx.hpp\n#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED\n\n#include <cmath>\n#include <limits>\n\nnamespace Catch {\nnamespace Detail {\n\n    class Approx {\n    public:\n        explicit Approx ( double value )\n        :   m_epsilon( std::numeric_limits<float>::epsilon()*100 ),\n            m_scale( 1.0 ),\n            m_value( value )\n        {}\n\n        Approx( Approx const& other )\n        :   m_epsilon( other.m_epsilon ),\n            m_scale( other.m_scale ),\n            m_value( other.m_value )\n        {}\n\n        static Approx custom() {\n            return Approx( 0 );\n        }\n\n        Approx operator()( double value ) {\n            Approx approx( value );\n            approx.epsilon( m_epsilon );\n            approx.scale( m_scale );\n            return approx;\n        }\n\n        friend bool operator == ( double lhs, Approx const& rhs ) {\n            // Thanks to Richard Harris for his help refining this formula\n            return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );\n        }\n\n        friend bool operator == ( Approx const& lhs, double rhs ) {\n            return operator==( rhs, lhs );\n        }\n\n        friend bool operator != ( double lhs, Approx const& rhs ) {\n            return !operator==( lhs, rhs );\n        }\n\n        friend bool operator != ( Approx const& lhs, double rhs ) {\n            return !operator==( rhs, lhs );\n        }\n\n        friend bool operator <= ( double lhs, Approx const& rhs )\n        {\n          return lhs < rhs.m_value || lhs == rhs;\n        }\n\n        friend bool operator <= ( Approx const& lhs, double rhs )\n        {\n          return lhs.m_value < rhs || lhs == rhs;\n        }\n\n        friend bool operator >= ( double lhs, Approx const& rhs )\n        {\n          return lhs > rhs.m_value || lhs == rhs;\n        }\n\n        friend bool operator >= ( Approx const& lhs, double rhs )\n        {\n          return lhs.m_value > rhs || lhs == rhs;\n        }\n\n        Approx& epsilon( double newEpsilon ) {\n            m_epsilon = newEpsilon;\n            return *this;\n        }\n\n        Approx& scale( double newScale ) {\n            m_scale = newScale;\n            return *this;\n        }\n\n        std::string toString() const {\n            std::ostringstream oss;\n            oss << \"Approx( \" << Catch::toString( m_value ) << \" )\";\n            return oss.str();\n        }\n\n    private:\n        double m_epsilon;\n        double m_scale;\n        double m_value;\n    };\n}\n\ntemplate<>\ninline std::string toString<Detail::Approx>( Detail::Approx const& value ) {\n    return value.toString();\n}\n\n} // end namespace Catch\n\n// #included from: internal/catch_interfaces_tag_alias_registry.h\n#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED\n\n// #included from: catch_tag_alias.h\n#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED\n\n#include <string>\n\nnamespace Catch {\n\n    struct TagAlias {\n        TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {}\n\n        std::string tag;\n        SourceLineInfo lineInfo;\n    };\n\n    struct RegistrarForTagAliases {\n        RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );\n    };\n\n} // end namespace Catch\n\n#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); }\n// #included from: catch_option.hpp\n#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED\n\nnamespace Catch {\n\n    // An optional type\n    template<typename T>\n    class Option {\n    public:\n        Option() : nullableValue( CATCH_NULL ) {}\n        Option( T const& _value )\n        : nullableValue( new( storage ) T( _value ) )\n        {}\n        Option( Option const& _other )\n        : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL )\n        {}\n\n        ~Option() {\n            reset();\n        }\n\n        Option& operator= ( Option const& _other ) {\n            if( &_other != this ) {\n                reset();\n                if( _other )\n                    nullableValue = new( storage ) T( *_other );\n            }\n            return *this;\n        }\n        Option& operator = ( T const& _value ) {\n            reset();\n            nullableValue = new( storage ) T( _value );\n            return *this;\n        }\n\n        void reset() {\n            if( nullableValue )\n                nullableValue->~T();\n            nullableValue = CATCH_NULL;\n        }\n\n        T& operator*() { return *nullableValue; }\n        T const& operator*() const { return *nullableValue; }\n        T* operator->() { return nullableValue; }\n        const T* operator->() const { return nullableValue; }\n\n        T valueOr( T const& defaultValue ) const {\n            return nullableValue ? *nullableValue : defaultValue;\n        }\n\n        bool some() const { return nullableValue != CATCH_NULL; }\n        bool none() const { return nullableValue == CATCH_NULL; }\n\n        bool operator !() const { return nullableValue == CATCH_NULL; }\n        operator SafeBool::type() const {\n            return SafeBool::makeSafe( some() );\n        }\n\n    private:\n        T* nullableValue;\n        char storage[sizeof(T)];\n    };\n\n} // end namespace Catch\n\nnamespace Catch {\n\n    struct ITagAliasRegistry {\n        virtual ~ITagAliasRegistry();\n        virtual Option<TagAlias> find( std::string const& alias ) const = 0;\n        virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;\n\n        static ITagAliasRegistry const& get();\n    };\n\n} // end namespace Catch\n\n// These files are included here so the single_include script doesn't put them\n// in the conditionally compiled sections\n// #included from: internal/catch_test_case_info.h\n#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED\n\n#include <string>\n#include <set>\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\nnamespace Catch {\n\n    struct ITestCase;\n\n    struct TestCaseInfo {\n        enum SpecialProperties{\n            None = 0,\n            IsHidden = 1 << 1,\n            ShouldFail = 1 << 2,\n            MayFail = 1 << 3,\n            Throws = 1 << 4\n        };\n\n        TestCaseInfo(   std::string const& _name,\n                        std::string const& _className,\n                        std::string const& _description,\n                        std::set<std::string> const& _tags,\n                        SourceLineInfo const& _lineInfo );\n\n        TestCaseInfo( TestCaseInfo const& other );\n\n        friend void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags );\n\n        bool isHidden() const;\n        bool throws() const;\n        bool okToFail() const;\n        bool expectedToFail() const;\n\n        std::string name;\n        std::string className;\n        std::string description;\n        std::set<std::string> tags;\n        std::set<std::string> lcaseTags;\n        std::string tagsAsString;\n        SourceLineInfo lineInfo;\n        SpecialProperties properties;\n    };\n\n    class TestCase : public TestCaseInfo {\n    public:\n\n        TestCase( ITestCase* testCase, TestCaseInfo const& info );\n        TestCase( TestCase const& other );\n\n        TestCase withName( std::string const& _newName ) const;\n\n        void invoke() const;\n\n        TestCaseInfo const& getTestCaseInfo() const;\n\n        void swap( TestCase& other );\n        bool operator == ( TestCase const& other ) const;\n        bool operator < ( TestCase const& other ) const;\n        TestCase& operator = ( TestCase const& other );\n\n    private:\n        Ptr<ITestCase> test;\n    };\n\n    TestCase makeTestCase(  ITestCase* testCase,\n                            std::string const& className,\n                            std::string const& name,\n                            std::string const& description,\n                            SourceLineInfo const& lineInfo );\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n\n#ifdef __OBJC__\n// #included from: internal/catch_objc.hpp\n#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED\n\n#import <objc/runtime.h>\n\n#include <string>\n\n// NB. Any general catch headers included here must be included\n// in catch.hpp first to make sure they are included by the single\n// header for non obj-usage\n\n///////////////////////////////////////////////////////////////////////////////\n// This protocol is really only here for (self) documenting purposes, since\n// all its methods are optional.\n@protocol OcFixture\n\n@optional\n\n-(void) setUp;\n-(void) tearDown;\n\n@end\n\nnamespace Catch {\n\n    class OcMethod : public SharedImpl<ITestCase> {\n\n    public:\n        OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}\n\n        virtual void invoke() const {\n            id obj = [[m_cls alloc] init];\n\n            performOptionalSelector( obj, @selector(setUp)  );\n            performOptionalSelector( obj, m_sel );\n            performOptionalSelector( obj, @selector(tearDown)  );\n\n            arcSafeRelease( obj );\n        }\n    private:\n        virtual ~OcMethod() {}\n\n        Class m_cls;\n        SEL m_sel;\n    };\n\n    namespace Detail{\n\n        inline std::string getAnnotation(   Class cls,\n                                            std::string const& annotationName,\n                                            std::string const& testCaseName ) {\n            NSString* selStr = [[NSString alloc] initWithFormat:@\"Catch_%s_%s\", annotationName.c_str(), testCaseName.c_str()];\n            SEL sel = NSSelectorFromString( selStr );\n            arcSafeRelease( selStr );\n            id value = performOptionalSelector( cls, sel );\n            if( value )\n                return [(NSString*)value UTF8String];\n            return \"\";\n        }\n    }\n\n    inline size_t registerTestMethods() {\n        size_t noTestMethods = 0;\n        int noClasses = objc_getClassList( CATCH_NULL, 0 );\n\n        Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);\n        objc_getClassList( classes, noClasses );\n\n        for( int c = 0; c < noClasses; c++ ) {\n            Class cls = classes[c];\n            {\n                u_int count;\n                Method* methods = class_copyMethodList( cls, &count );\n                for( u_int m = 0; m < count ; m++ ) {\n                    SEL selector = method_getName(methods[m]);\n                    std::string methodName = sel_getName(selector);\n                    if( startsWith( methodName, \"Catch_TestCase_\" ) ) {\n                        std::string testCaseName = methodName.substr( 15 );\n                        std::string name = Detail::getAnnotation( cls, \"Name\", testCaseName );\n                        std::string desc = Detail::getAnnotation( cls, \"Description\", testCaseName );\n                        const char* className = class_getName( cls );\n\n                        getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );\n                        noTestMethods++;\n                    }\n                }\n                free(methods);\n            }\n        }\n        return noTestMethods;\n    }\n\n    namespace Matchers {\n        namespace Impl {\n        namespace NSStringMatchers {\n\n            template<typename MatcherT>\n            struct StringHolder : MatcherImpl<MatcherT, NSString*>{\n                StringHolder( NSString* substr ) : m_substr( [substr copy] ){}\n                StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}\n                StringHolder() {\n                    arcSafeRelease( m_substr );\n                }\n\n                NSString* m_substr;\n            };\n\n            struct Equals : StringHolder<Equals> {\n                Equals( NSString* substr ) : StringHolder( substr ){}\n\n                virtual bool match( ExpressionType const& str ) const {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str isEqualToString:m_substr];\n                }\n\n                virtual std::string toString() const {\n                    return \"equals string: \" + Catch::toString( m_substr );\n                }\n            };\n\n            struct Contains : StringHolder<Contains> {\n                Contains( NSString* substr ) : StringHolder( substr ){}\n\n                virtual bool match( ExpressionType const& str ) const {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location != NSNotFound;\n                }\n\n                virtual std::string toString() const {\n                    return \"contains string: \" + Catch::toString( m_substr );\n                }\n            };\n\n            struct StartsWith : StringHolder<StartsWith> {\n                StartsWith( NSString* substr ) : StringHolder( substr ){}\n\n                virtual bool match( ExpressionType const& str ) const {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location == 0;\n                }\n\n                virtual std::string toString() const {\n                    return \"starts with: \" + Catch::toString( m_substr );\n                }\n            };\n            struct EndsWith : StringHolder<EndsWith> {\n                EndsWith( NSString* substr ) : StringHolder( substr ){}\n\n                virtual bool match( ExpressionType const& str ) const {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location == [str length] - [m_substr length];\n                }\n\n                virtual std::string toString() const {\n                    return \"ends with: \" + Catch::toString( m_substr );\n                }\n            };\n\n        } // namespace NSStringMatchers\n        } // namespace Impl\n\n        inline Impl::NSStringMatchers::Equals\n            Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }\n\n        inline Impl::NSStringMatchers::Contains\n            Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }\n\n        inline Impl::NSStringMatchers::StartsWith\n            StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }\n\n        inline Impl::NSStringMatchers::EndsWith\n            EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }\n\n    } // namespace Matchers\n\n    using namespace Matchers;\n\n} // namespace Catch\n\n///////////////////////////////////////////////////////////////////////////////\n#define OC_TEST_CASE( name, desc )\\\n+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \\\n{\\\nreturn @ name; \\\n}\\\n+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \\\n{ \\\nreturn @ desc; \\\n} \\\n-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test )\n\n#endif\n\n#ifdef CATCH_IMPL\n// #included from: internal/catch_impl.hpp\n#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED\n\n// Collect all the implementation files together here\n// These are the equivalent of what would usually be cpp files\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-vtables\"\n#endif\n\n// #included from: ../catch_session.hpp\n#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED\n\n// #included from: internal/catch_commandline.hpp\n#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED\n\n// #included from: catch_config.hpp\n#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED\n\n// #included from: catch_test_spec_parser.hpp\n#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\n// #included from: catch_test_spec.hpp\n#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\n// #included from: catch_wildcard_pattern.hpp\n#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED\n\nnamespace Catch\n{\n    class WildcardPattern {\n        enum WildcardPosition {\n            NoWildcard = 0,\n            WildcardAtStart = 1,\n            WildcardAtEnd = 2,\n            WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd\n        };\n\n    public:\n\n        WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity )\n        :   m_caseSensitivity( caseSensitivity ),\n            m_wildcard( NoWildcard ),\n            m_pattern( adjustCase( pattern ) )\n        {\n            if( startsWith( m_pattern, \"*\" ) ) {\n                m_pattern = m_pattern.substr( 1 );\n                m_wildcard = WildcardAtStart;\n            }\n            if( endsWith( m_pattern, \"*\" ) ) {\n                m_pattern = m_pattern.substr( 0, m_pattern.size()-1 );\n                m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );\n            }\n        }\n        virtual ~WildcardPattern();\n        virtual bool matches( std::string const& str ) const {\n            switch( m_wildcard ) {\n                case NoWildcard:\n                    return m_pattern == adjustCase( str );\n                case WildcardAtStart:\n                    return endsWith( adjustCase( str ), m_pattern );\n                case WildcardAtEnd:\n                    return startsWith( adjustCase( str ), m_pattern );\n                case WildcardAtBothEnds:\n                    return contains( adjustCase( str ), m_pattern );\n            }\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunreachable-code\"\n#endif\n            throw std::logic_error( \"Unknown enum\" );\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n        }\n    private:\n        std::string adjustCase( std::string const& str ) const {\n            return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str;\n        }\n        CaseSensitive::Choice m_caseSensitivity;\n        WildcardPosition m_wildcard;\n        std::string m_pattern;\n    };\n}\n\n#include <string>\n#include <vector>\n\nnamespace Catch {\n\n    class TestSpec {\n        struct Pattern : SharedImpl<> {\n            virtual ~Pattern();\n            virtual bool matches( TestCaseInfo const& testCase ) const = 0;\n        };\n        class NamePattern : public Pattern {\n        public:\n            NamePattern( std::string const& name )\n            : m_wildcardPattern( toLower( name ), CaseSensitive::No )\n            {}\n            virtual ~NamePattern();\n            virtual bool matches( TestCaseInfo const& testCase ) const {\n                return m_wildcardPattern.matches( toLower( testCase.name ) );\n            }\n        private:\n            WildcardPattern m_wildcardPattern;\n        };\n\n        class TagPattern : public Pattern {\n        public:\n            TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {}\n            virtual ~TagPattern();\n            virtual bool matches( TestCaseInfo const& testCase ) const {\n                return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end();\n            }\n        private:\n            std::string m_tag;\n        };\n\n        class ExcludedPattern : public Pattern {\n        public:\n            ExcludedPattern( Ptr<Pattern> const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {}\n            virtual ~ExcludedPattern();\n            virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); }\n        private:\n            Ptr<Pattern> m_underlyingPattern;\n        };\n\n        struct Filter {\n            std::vector<Ptr<Pattern> > m_patterns;\n\n            bool matches( TestCaseInfo const& testCase ) const {\n                // All patterns in a filter must match for the filter to be a match\n                for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) {\n                    if( !(*it)->matches( testCase ) )\n                        return false;\n                }\n                return true;\n            }\n        };\n\n    public:\n        bool hasFilters() const {\n            return !m_filters.empty();\n        }\n        bool matches( TestCaseInfo const& testCase ) const {\n            // A TestSpec matches if any filter matches\n            for( std::vector<Filter>::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it )\n                if( it->matches( testCase ) )\n                    return true;\n            return false;\n        }\n\n    private:\n        std::vector<Filter> m_filters;\n\n        friend class TestSpecParser;\n    };\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\nnamespace Catch {\n\n    class TestSpecParser {\n        enum Mode{ None, Name, QuotedName, Tag, EscapedName };\n        Mode m_mode;\n        bool m_exclusion;\n        std::size_t m_start, m_pos;\n        std::string m_arg;\n        std::vector<std::size_t> m_escapeChars;\n        TestSpec::Filter m_currentFilter;\n        TestSpec m_testSpec;\n        ITagAliasRegistry const* m_tagAliases;\n\n    public:\n        TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}\n\n        TestSpecParser& parse( std::string const& arg ) {\n            m_mode = None;\n            m_exclusion = false;\n            m_start = std::string::npos;\n            m_arg = m_tagAliases->expandAliases( arg );\n            m_escapeChars.clear();\n            for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )\n                visitChar( m_arg[m_pos] );\n            if( m_mode == Name )\n                addPattern<TestSpec::NamePattern>();\n            return *this;\n        }\n        TestSpec testSpec() {\n            addFilter();\n            return m_testSpec;\n        }\n    private:\n        void visitChar( char c ) {\n            if( m_mode == None ) {\n                switch( c ) {\n                case ' ': return;\n                case '~': m_exclusion = true; return;\n                case '[': return startNewMode( Tag, ++m_pos );\n                case '\"': return startNewMode( QuotedName, ++m_pos );\n                case '\\\\': return escape();\n                default: startNewMode( Name, m_pos ); break;\n                }\n            }\n            if( m_mode == Name ) {\n                if( c == ',' ) {\n                    addPattern<TestSpec::NamePattern>();\n                    addFilter();\n                }\n                else if( c == '[' ) {\n                    if( subString() == \"exclude:\" )\n                        m_exclusion = true;\n                    else\n                        addPattern<TestSpec::NamePattern>();\n                    startNewMode( Tag, ++m_pos );\n                }\n                else if( c == '\\\\' )\n                    escape();\n            }\n            else if( m_mode == EscapedName )\n                m_mode = Name;\n            else if( m_mode == QuotedName && c == '\"' )\n                addPattern<TestSpec::NamePattern>();\n            else if( m_mode == Tag && c == ']' )\n                addPattern<TestSpec::TagPattern>();\n        }\n        void startNewMode( Mode mode, std::size_t start ) {\n            m_mode = mode;\n            m_start = start;\n        }\n        void escape() {\n            m_mode = EscapedName;\n            m_escapeChars.push_back( m_pos );\n        }\n        std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); }\n        template<typename T>\n        void addPattern() {\n            std::string token = subString();\n            for( size_t i = 0; i < m_escapeChars.size(); ++i )\n                token = token.substr( 0, m_escapeChars[i] ) + token.substr( m_escapeChars[i]+1 );\n            m_escapeChars.clear();\n            if( startsWith( token, \"exclude:\" ) ) {\n                m_exclusion = true;\n                token = token.substr( 8 );\n            }\n            if( !token.empty() ) {\n                Ptr<TestSpec::Pattern> pattern = new T( token );\n                if( m_exclusion )\n                    pattern = new TestSpec::ExcludedPattern( pattern );\n                m_currentFilter.m_patterns.push_back( pattern );\n            }\n            m_exclusion = false;\n            m_mode = None;\n        }\n        void addFilter() {\n            if( !m_currentFilter.m_patterns.empty() ) {\n                m_testSpec.m_filters.push_back( m_currentFilter );\n                m_currentFilter = TestSpec::Filter();\n            }\n        }\n    };\n    inline TestSpec parseTestSpec( std::string const& arg ) {\n        return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();\n    }\n\n} // namespace Catch\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// #included from: catch_interfaces_config.h\n#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED\n\n#include <iostream>\n#include <string>\n#include <vector>\n\nnamespace Catch {\n\n    struct Verbosity { enum Level {\n        NoOutput = 0,\n        Quiet,\n        Normal\n    }; };\n\n    struct WarnAbout { enum What {\n        Nothing = 0x00,\n        NoAssertions = 0x01\n    }; };\n\n    struct ShowDurations { enum OrNot {\n        DefaultForReporter,\n        Always,\n        Never\n    }; };\n    struct RunTests { enum InWhatOrder {\n        InDeclarationOrder,\n        InLexicographicalOrder,\n        InRandomOrder\n    }; };\n    struct UseColour { enum YesOrNo {\n        Auto,\n        Yes,\n        No\n    }; };\n\n    class TestSpec;\n\n    struct IConfig : IShared {\n\n        virtual ~IConfig();\n\n        virtual bool allowThrows() const = 0;\n        virtual std::ostream& stream() const = 0;\n        virtual std::string name() const = 0;\n        virtual bool includeSuccessfulResults() const = 0;\n        virtual bool shouldDebugBreak() const = 0;\n        virtual bool warnAboutMissingAssertions() const = 0;\n        virtual int abortAfter() const = 0;\n        virtual bool showInvisibles() const = 0;\n        virtual ShowDurations::OrNot showDurations() const = 0;\n        virtual TestSpec const& testSpec() const = 0;\n        virtual RunTests::InWhatOrder runOrder() const = 0;\n        virtual unsigned int rngSeed() const = 0;\n        virtual UseColour::YesOrNo useColour() const = 0;\n    };\n}\n\n// #included from: catch_stream.h\n#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED\n\n// #included from: catch_streambuf.h\n#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED\n\n#include <streambuf>\n\nnamespace Catch {\n\n    class StreamBufBase : public std::streambuf {\n    public:\n        virtual ~StreamBufBase() CATCH_NOEXCEPT;\n    };\n}\n\n#include <streambuf>\n#include <ostream>\n#include <fstream>\n#include <memory>\n\nnamespace Catch {\n\n    std::ostream& cout();\n    std::ostream& cerr();\n\n    struct IStream {\n        virtual ~IStream() CATCH_NOEXCEPT;\n        virtual std::ostream& stream() const = 0;\n    };\n\n    class FileStream : public IStream {\n        mutable std::ofstream m_ofs;\n    public:\n        FileStream( std::string const& filename );\n        virtual ~FileStream() CATCH_NOEXCEPT;\n    public: // IStream\n        virtual std::ostream& stream() const CATCH_OVERRIDE;\n    };\n\n    class CoutStream : public IStream {\n        mutable std::ostream m_os;\n    public:\n        CoutStream();\n        virtual ~CoutStream() CATCH_NOEXCEPT;\n\n    public: // IStream\n        virtual std::ostream& stream() const CATCH_OVERRIDE;\n    };\n\n    class DebugOutStream : public IStream {\n        CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf;\n        mutable std::ostream m_os;\n    public:\n        DebugOutStream();\n        virtual ~DebugOutStream() CATCH_NOEXCEPT;\n\n    public: // IStream\n        virtual std::ostream& stream() const CATCH_OVERRIDE;\n    };\n}\n\n#include <memory>\n#include <vector>\n#include <string>\n#include <iostream>\n#include <ctime>\n\n#ifndef CATCH_CONFIG_CONSOLE_WIDTH\n#define CATCH_CONFIG_CONSOLE_WIDTH 80\n#endif\n\nnamespace Catch {\n\n    struct ConfigData {\n\n        ConfigData()\n        :   listTests( false ),\n            listTags( false ),\n            listReporters( false ),\n            listTestNamesOnly( false ),\n            showSuccessfulTests( false ),\n            shouldDebugBreak( false ),\n            noThrow( false ),\n            showHelp( false ),\n            showInvisibles( false ),\n            filenamesAsTags( false ),\n            abortAfter( -1 ),\n            rngSeed( 0 ),\n            verbosity( Verbosity::Normal ),\n            warnings( WarnAbout::Nothing ),\n            showDurations( ShowDurations::DefaultForReporter ),\n            runOrder( RunTests::InDeclarationOrder ),\n            useColour( UseColour::Auto )\n        {}\n\n        bool listTests;\n        bool listTags;\n        bool listReporters;\n        bool listTestNamesOnly;\n\n        bool showSuccessfulTests;\n        bool shouldDebugBreak;\n        bool noThrow;\n        bool showHelp;\n        bool showInvisibles;\n        bool filenamesAsTags;\n\n        int abortAfter;\n        unsigned int rngSeed;\n\n        Verbosity::Level verbosity;\n        WarnAbout::What warnings;\n        ShowDurations::OrNot showDurations;\n        RunTests::InWhatOrder runOrder;\n        UseColour::YesOrNo useColour;\n\n        std::string outputFilename;\n        std::string name;\n        std::string processName;\n\n        std::vector<std::string> reporterNames;\n        std::vector<std::string> testsOrTags;\n    };\n\n    class Config : public SharedImpl<IConfig> {\n    private:\n        Config( Config const& other );\n        Config& operator = ( Config const& other );\n        virtual void dummy();\n    public:\n\n        Config()\n        {}\n\n        Config( ConfigData const& data )\n        :   m_data( data ),\n            m_stream( openStream() )\n        {\n            if( !data.testsOrTags.empty() ) {\n                TestSpecParser parser( ITagAliasRegistry::get() );\n                for( std::size_t i = 0; i < data.testsOrTags.size(); ++i )\n                    parser.parse( data.testsOrTags[i] );\n                m_testSpec = parser.testSpec();\n            }\n        }\n\n        virtual ~Config() {\n        }\n\n        std::string const& getFilename() const {\n            return m_data.outputFilename ;\n        }\n\n        bool listTests() const { return m_data.listTests; }\n        bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }\n        bool listTags() const { return m_data.listTags; }\n        bool listReporters() const { return m_data.listReporters; }\n\n        std::string getProcessName() const { return m_data.processName; }\n\n        bool shouldDebugBreak() const { return m_data.shouldDebugBreak; }\n\n        std::vector<std::string> getReporterNames() const { return m_data.reporterNames; }\n\n        int abortAfter() const { return m_data.abortAfter; }\n\n        TestSpec const& testSpec() const { return m_testSpec; }\n\n        bool showHelp() const { return m_data.showHelp; }\n        bool showInvisibles() const { return m_data.showInvisibles; }\n\n        // IConfig interface\n        virtual bool allowThrows() const        { return !m_data.noThrow; }\n        virtual std::ostream& stream() const    { return m_stream->stream(); }\n        virtual std::string name() const        { return m_data.name.empty() ? m_data.processName : m_data.name; }\n        virtual bool includeSuccessfulResults() const   { return m_data.showSuccessfulTests; }\n        virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; }\n        virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }\n        virtual RunTests::InWhatOrder runOrder() const  { return m_data.runOrder; }\n        virtual unsigned int rngSeed() const    { return m_data.rngSeed; }\n        virtual UseColour::YesOrNo useColour() const { return m_data.useColour; }\n\n    private:\n\n        IStream const* openStream() {\n            if( m_data.outputFilename.empty() )\n                return new CoutStream();\n            else if( m_data.outputFilename[0] == '%' ) {\n                if( m_data.outputFilename == \"%debug\" )\n                    return new DebugOutStream();\n                else\n                    throw std::domain_error( \"Unrecognised stream: \" + m_data.outputFilename );\n            }\n            else\n                return new FileStream( m_data.outputFilename );\n        }\n        ConfigData m_data;\n\n        CATCH_AUTO_PTR( IStream const ) m_stream;\n        TestSpec m_testSpec;\n    };\n\n} // end namespace Catch\n\n// #included from: catch_clara.h\n#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED\n\n// Use Catch's value for console width (store Clara's off to the side, if present)\n#ifdef CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH\n#undef CLARA_CONFIG_CONSOLE_WIDTH\n#endif\n#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH\n\n// Declare Clara inside the Catch namespace\n#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {\n// #included from: ../external/clara.h\n\n// Version 0.0.2.4\n\n// Only use header guard if we are not using an outer namespace\n#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)\n\n#ifndef STITCH_CLARA_OPEN_NAMESPACE\n#define TWOBLUECUBES_CLARA_H_INCLUDED\n#define STITCH_CLARA_OPEN_NAMESPACE\n#define STITCH_CLARA_CLOSE_NAMESPACE\n#else\n#define STITCH_CLARA_CLOSE_NAMESPACE }\n#endif\n\n#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE\n\n// ----------- #included from tbc_text_format.h -----------\n\n// Only use header guard if we are not using an outer namespace\n#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE)\n#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE\n#define TBC_TEXT_FORMAT_H_INCLUDED\n#endif\n\n#include <string>\n#include <vector>\n#include <sstream>\n#include <algorithm>\n\n// Use optional outer namespace\n#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE\nnamespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE {\n#endif\n\nnamespace Tbc {\n\n#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH\n    const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;\n#else\n    const unsigned int consoleWidth = 80;\n#endif\n\n    struct TextAttributes {\n        TextAttributes()\n        :   initialIndent( std::string::npos ),\n            indent( 0 ),\n            width( consoleWidth-1 ),\n            tabChar( '\\t' )\n        {}\n\n        TextAttributes& setInitialIndent( std::size_t _value )  { initialIndent = _value; return *this; }\n        TextAttributes& setIndent( std::size_t _value )         { indent = _value; return *this; }\n        TextAttributes& setWidth( std::size_t _value )          { width = _value; return *this; }\n        TextAttributes& setTabChar( char _value )               { tabChar = _value; return *this; }\n\n        std::size_t initialIndent;  // indent of first line, or npos\n        std::size_t indent;         // indent of subsequent lines, or all if initialIndent is npos\n        std::size_t width;          // maximum width of text, including indent. Longer text will wrap\n        char tabChar;               // If this char is seen the indent is changed to current pos\n    };\n\n    class Text {\n    public:\n        Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )\n        : attr( _attr )\n        {\n            std::string wrappableChars = \" [({.,/|\\\\-\";\n            std::size_t indent = _attr.initialIndent != std::string::npos\n                ? _attr.initialIndent\n                : _attr.indent;\n            std::string remainder = _str;\n\n            while( !remainder.empty() ) {\n                if( lines.size() >= 1000 ) {\n                    lines.push_back( \"... message truncated due to excessive size\" );\n                    return;\n                }\n                std::size_t tabPos = std::string::npos;\n                std::size_t width = (std::min)( remainder.size(), _attr.width - indent );\n                std::size_t pos = remainder.find_first_of( '\\n' );\n                if( pos <= width ) {\n                    width = pos;\n                }\n                pos = remainder.find_last_of( _attr.tabChar, width );\n                if( pos != std::string::npos ) {\n                    tabPos = pos;\n                    if( remainder[width] == '\\n' )\n                        width--;\n                    remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );\n                }\n\n                if( width == remainder.size() ) {\n                    spliceLine( indent, remainder, width );\n                }\n                else if( remainder[width] == '\\n' ) {\n                    spliceLine( indent, remainder, width );\n                    if( width <= 1 || remainder.size() != 1 )\n                        remainder = remainder.substr( 1 );\n                    indent = _attr.indent;\n                }\n                else {\n                    pos = remainder.find_last_of( wrappableChars, width );\n                    if( pos != std::string::npos && pos > 0 ) {\n                        spliceLine( indent, remainder, pos );\n                        if( remainder[0] == ' ' )\n                            remainder = remainder.substr( 1 );\n                    }\n                    else {\n                        spliceLine( indent, remainder, width-1 );\n                        lines.back() += \"-\";\n                    }\n                    if( lines.size() == 1 )\n                        indent = _attr.indent;\n                    if( tabPos != std::string::npos )\n                        indent += tabPos;\n                }\n            }\n        }\n\n        void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {\n            lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );\n            _remainder = _remainder.substr( _pos );\n        }\n\n        typedef std::vector<std::string>::const_iterator const_iterator;\n\n        const_iterator begin() const { return lines.begin(); }\n        const_iterator end() const { return lines.end(); }\n        std::string const& last() const { return lines.back(); }\n        std::size_t size() const { return lines.size(); }\n        std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }\n        std::string toString() const {\n            std::ostringstream oss;\n            oss << *this;\n            return oss.str();\n        }\n\n        inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {\n            for( Text::const_iterator it = _text.begin(), itEnd = _text.end();\n                it != itEnd; ++it ) {\n                if( it != _text.begin() )\n                    _stream << \"\\n\";\n                _stream << *it;\n            }\n            return _stream;\n        }\n\n    private:\n        std::string str;\n        TextAttributes attr;\n        std::vector<std::string> lines;\n    };\n\n} // end namespace Tbc\n\n#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE\n} // end outer namespace\n#endif\n\n#endif // TBC_TEXT_FORMAT_H_INCLUDED\n\n// ----------- end of #include from tbc_text_format.h -----------\n// ........... back in clara.h\n\n#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE\n\n// ----------- #included from clara_compilers.h -----------\n\n#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED\n#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED\n\n// Detect a number of compiler features - mostly C++11/14 conformance - by compiler\n// The following features are defined:\n//\n// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported?\n// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported?\n// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods\n// CLARA_CONFIG_CPP11_OVERRIDE : is override supported?\n// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)\n\n// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported?\n\n// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported?\n\n// In general each macro has a _NO_<feature name> form\n// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature.\n// Many features, at point of detection, define an _INTERNAL_ macro, so they\n// can be combined, en-mass, with the _NO_ forms later.\n\n// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11\n\n#ifdef __clang__\n\n#if __has_feature(cxx_nullptr)\n#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR\n#endif\n\n#if __has_feature(cxx_noexcept)\n#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#endif\n\n#endif // __clang__\n\n////////////////////////////////////////////////////////////////////////////////\n// GCC\n#ifdef __GNUC__\n\n#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)\n#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR\n#endif\n\n// - otherwise more recent versions define __cplusplus >= 201103L\n// and will get picked up below\n\n#endif // __GNUC__\n\n////////////////////////////////////////////////////////////////////////////////\n// Visual C++\n#ifdef _MSC_VER\n\n#if (_MSC_VER >= 1600)\n#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR\n#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR\n#endif\n\n#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015))\n#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS\n#endif\n\n#endif // _MSC_VER\n\n////////////////////////////////////////////////////////////////////////////////\n// C++ language feature support\n\n// catch all support for C++11\n#if defined(__cplusplus) && __cplusplus >= 201103L\n\n#define CLARA_CPP11_OR_GREATER\n\n#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR)\n#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR\n#endif\n\n#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT\n#endif\n\n#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS\n#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS\n#endif\n\n#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE)\n#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE\n#endif\n#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)\n#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR\n#endif\n\n#endif // __cplusplus >= 201103L\n\n// Now set the actual defines based on the above + anything the user has configured\n#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11)\n#define CLARA_CONFIG_CPP11_NULLPTR\n#endif\n#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11)\n#define CLARA_CONFIG_CPP11_NOEXCEPT\n#endif\n#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)\n#define CLARA_CONFIG_CPP11_GENERATED_METHODS\n#endif\n#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11)\n#define CLARA_CONFIG_CPP11_OVERRIDE\n#endif\n#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)\n#define CLARA_CONFIG_CPP11_UNIQUE_PTR\n#endif\n\n// noexcept support:\n#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT)\n#define CLARA_NOEXCEPT noexcept\n#  define CLARA_NOEXCEPT_IS(x) noexcept(x)\n#else\n#define CLARA_NOEXCEPT throw()\n#  define CLARA_NOEXCEPT_IS(x)\n#endif\n\n// nullptr support\n#ifdef CLARA_CONFIG_CPP11_NULLPTR\n#define CLARA_NULL nullptr\n#else\n#define CLARA_NULL NULL\n#endif\n\n// override support\n#ifdef CLARA_CONFIG_CPP11_OVERRIDE\n#define CLARA_OVERRIDE override\n#else\n#define CLARA_OVERRIDE\n#endif\n\n// unique_ptr support\n#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR\n#   define CLARA_AUTO_PTR( T ) std::unique_ptr<T>\n#else\n#   define CLARA_AUTO_PTR( T ) std::auto_ptr<T>\n#endif\n\n#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED\n\n// ----------- end of #include from clara_compilers.h -----------\n// ........... back in clara.h\n\n#include <map>\n#include <stdexcept>\n#include <memory>\n\n#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)\n#define CLARA_PLATFORM_WINDOWS\n#endif\n\n// Use optional outer namespace\n#ifdef STITCH_CLARA_OPEN_NAMESPACE\nSTITCH_CLARA_OPEN_NAMESPACE\n#endif\n\nnamespace Clara {\n\n    struct UnpositionalTag {};\n\n    extern UnpositionalTag _;\n\n#ifdef CLARA_CONFIG_MAIN\n    UnpositionalTag _;\n#endif\n\n    namespace Detail {\n\n#ifdef CLARA_CONSOLE_WIDTH\n    const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH;\n#else\n    const unsigned int consoleWidth = 80;\n#endif\n\n        using namespace Tbc;\n\n        inline bool startsWith( std::string const& str, std::string const& prefix ) {\n            return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix;\n        }\n\n        template<typename T> struct RemoveConstRef{ typedef T type; };\n        template<typename T> struct RemoveConstRef<T&>{ typedef T type; };\n        template<typename T> struct RemoveConstRef<T const&>{ typedef T type; };\n        template<typename T> struct RemoveConstRef<T const>{ typedef T type; };\n\n        template<typename T>    struct IsBool       { static const bool value = false; };\n        template<>              struct IsBool<bool> { static const bool value = true; };\n\n        template<typename T>\n        void convertInto( std::string const& _source, T& _dest ) {\n            std::stringstream ss;\n            ss << _source;\n            ss >> _dest;\n            if( ss.fail() )\n                throw std::runtime_error( \"Unable to convert \" + _source + \" to destination type\" );\n        }\n        inline void convertInto( std::string const& _source, std::string& _dest ) {\n            _dest = _source;\n        }\n        char toLowerCh(char c) {\n            return static_cast<char>( ::tolower( c ) );\n        }\n        inline void convertInto( std::string const& _source, bool& _dest ) {\n            std::string sourceLC = _source;\n            std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh );\n            if( sourceLC == \"y\" || sourceLC == \"1\" || sourceLC == \"true\" || sourceLC == \"yes\" || sourceLC == \"on\" )\n                _dest = true;\n            else if( sourceLC == \"n\" || sourceLC == \"0\" || sourceLC == \"false\" || sourceLC == \"no\" || sourceLC == \"off\" )\n                _dest = false;\n            else\n                throw std::runtime_error( \"Expected a boolean value but did not recognise:\\n  '\" + _source + \"'\" );\n        }\n\n        template<typename ConfigT>\n        struct IArgFunction {\n            virtual ~IArgFunction() {}\n#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS\n            IArgFunction()                      = default;\n            IArgFunction( IArgFunction const& ) = default;\n#endif\n            virtual void set( ConfigT& config, std::string const& value ) const = 0;\n            virtual bool takesArg() const = 0;\n            virtual IArgFunction* clone() const = 0;\n        };\n\n        template<typename ConfigT>\n        class BoundArgFunction {\n        public:\n            BoundArgFunction() : functionObj( CLARA_NULL ) {}\n            BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {}\n            BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {}\n            BoundArgFunction& operator = ( BoundArgFunction const& other ) {\n                IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL;\n                delete functionObj;\n                functionObj = newFunctionObj;\n                return *this;\n            }\n            ~BoundArgFunction() { delete functionObj; }\n\n            void set( ConfigT& config, std::string const& value ) const {\n                functionObj->set( config, value );\n            }\n            bool takesArg() const { return functionObj->takesArg(); }\n\n            bool isSet() const {\n                return functionObj != CLARA_NULL;\n            }\n        private:\n            IArgFunction<ConfigT>* functionObj;\n        };\n\n        template<typename C>\n        struct NullBinder : IArgFunction<C>{\n            virtual void set( C&, std::string const& ) const {}\n            virtual bool takesArg() const { return true; }\n            virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }\n        };\n\n        template<typename C, typename M>\n        struct BoundDataMember : IArgFunction<C>{\n            BoundDataMember( M C::* _member ) : member( _member ) {}\n            virtual void set( C& p, std::string const& stringValue ) const {\n                convertInto( stringValue, p.*member );\n            }\n            virtual bool takesArg() const { return !IsBool<M>::value; }\n            virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }\n            M C::* member;\n        };\n        template<typename C, typename M>\n        struct BoundUnaryMethod : IArgFunction<C>{\n            BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {}\n            virtual void set( C& p, std::string const& stringValue ) const {\n                typename RemoveConstRef<M>::type value;\n                convertInto( stringValue, value );\n                (p.*member)( value );\n            }\n            virtual bool takesArg() const { return !IsBool<M>::value; }\n            virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }\n            void (C::*member)( M );\n        };\n        template<typename C>\n        struct BoundNullaryMethod : IArgFunction<C>{\n            BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {}\n            virtual void set( C& p, std::string const& stringValue ) const {\n                bool value;\n                convertInto( stringValue, value );\n                if( value )\n                    (p.*member)();\n            }\n            virtual bool takesArg() const { return false; }\n            virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }\n            void (C::*member)();\n        };\n\n        template<typename C>\n        struct BoundUnaryFunction : IArgFunction<C>{\n            BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {}\n            virtual void set( C& obj, std::string const& stringValue ) const {\n                bool value;\n                convertInto( stringValue, value );\n                if( value )\n                    function( obj );\n            }\n            virtual bool takesArg() const { return false; }\n            virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }\n            void (*function)( C& );\n        };\n\n        template<typename C, typename T>\n        struct BoundBinaryFunction : IArgFunction<C>{\n            BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {}\n            virtual void set( C& obj, std::string const& stringValue ) const {\n                typename RemoveConstRef<T>::type value;\n                convertInto( stringValue, value );\n                function( obj, value );\n            }\n            virtual bool takesArg() const { return !IsBool<T>::value; }\n            virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }\n            void (*function)( C&, T );\n        };\n\n    } // namespace Detail\n\n    inline std::vector<std::string> argsToVector( int argc, char const* const* const argv ) {\n        std::vector<std::string> args( static_cast<std::size_t>( argc ) );\n        for( std::size_t i = 0; i < static_cast<std::size_t>( argc ); ++i )\n            args[i] = argv[i];\n\n        return args;\n    }\n\n    class Parser {\n        enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional };\n        Mode mode;\n        std::size_t from;\n        bool inQuotes;\n    public:\n\n        struct Token {\n            enum Type { Positional, ShortOpt, LongOpt };\n            Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {}\n            Type type;\n            std::string data;\n        };\n\n        Parser() : mode( None ), from( 0 ), inQuotes( false ){}\n\n        void parseIntoTokens( std::vector<std::string> const& args, std::vector<Token>& tokens ) {\n            const std::string doubleDash = \"--\";\n            for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i )\n                parseIntoTokens( args[i], tokens);\n        }\n\n        void parseIntoTokens( std::string const& arg, std::vector<Token>& tokens ) {\n            for( std::size_t i = 0; i <= arg.size(); ++i ) {\n                char c = arg[i];\n                if( c == '\"' )\n                    inQuotes = !inQuotes;\n                mode = handleMode( i, c, arg, tokens );\n            }\n        }\n        Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {\n            switch( mode ) {\n                case None: return handleNone( i, c );\n                case MaybeShortOpt: return handleMaybeShortOpt( i, c );\n                case ShortOpt:\n                case LongOpt:\n                case SlashOpt: return handleOpt( i, c, arg, tokens );\n                case Positional: return handlePositional( i, c, arg, tokens );\n                default: throw std::logic_error( \"Unknown mode\" );\n            }\n        }\n\n        Mode handleNone( std::size_t i, char c ) {\n            if( inQuotes ) {\n                from = i;\n                return Positional;\n            }\n            switch( c ) {\n                case '-': return MaybeShortOpt;\n#ifdef CLARA_PLATFORM_WINDOWS\n                case '/': from = i+1; return SlashOpt;\n#endif\n                default: from = i; return Positional;\n            }\n        }\n        Mode handleMaybeShortOpt( std::size_t i, char c ) {\n            switch( c ) {\n                case '-': from = i+1; return LongOpt;\n                default: from = i; return ShortOpt;\n            }\n        }\n        Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {\n            if( std::string( \":=\\0\", 3 ).find( c ) == std::string::npos )\n                return mode;\n\n            std::string optName = arg.substr( from, i-from );\n            if( mode == ShortOpt )\n                for( std::size_t j = 0; j < optName.size(); ++j )\n                    tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) );\n            else if( mode == SlashOpt && optName.size() == 1 )\n                tokens.push_back( Token( Token::ShortOpt, optName ) );\n            else\n                tokens.push_back( Token( Token::LongOpt, optName ) );\n            return None;\n        }\n        Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {\n            if( inQuotes || std::string( \"\\0\", 1 ).find( c ) == std::string::npos )\n                return mode;\n\n            std::string data = arg.substr( from, i-from );\n            tokens.push_back( Token( Token::Positional, data ) );\n            return None;\n        }\n    };\n\n    template<typename ConfigT>\n    struct CommonArgProperties {\n        CommonArgProperties() {}\n        CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {}\n\n        Detail::BoundArgFunction<ConfigT> boundField;\n        std::string description;\n        std::string detail;\n        std::string placeholder; // Only value if boundField takes an arg\n\n        bool takesArg() const {\n            return !placeholder.empty();\n        }\n        void validate() const {\n            if( !boundField.isSet() )\n                throw std::logic_error( \"option not bound\" );\n        }\n    };\n    struct OptionArgProperties {\n        std::vector<std::string> shortNames;\n        std::string longName;\n\n        bool hasShortName( std::string const& shortName ) const {\n            return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end();\n        }\n        bool hasLongName( std::string const& _longName ) const {\n            return _longName == longName;\n        }\n    };\n    struct PositionalArgProperties {\n        PositionalArgProperties() : position( -1 ) {}\n        int position; // -1 means non-positional (floating)\n\n        bool isFixedPositional() const {\n            return position != -1;\n        }\n    };\n\n    template<typename ConfigT>\n    class CommandLine {\n\n        struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties {\n            Arg() {}\n            Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {}\n\n            using CommonArgProperties<ConfigT>::placeholder; // !TBD\n\n            std::string dbgName() const {\n                if( !longName.empty() )\n                    return \"--\" + longName;\n                if( !shortNames.empty() )\n                    return \"-\" + shortNames[0];\n                return \"positional args\";\n            }\n            std::string commands() const {\n                std::ostringstream oss;\n                bool first = true;\n                std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end();\n                for(; it != itEnd; ++it ) {\n                    if( first )\n                        first = false;\n                    else\n                        oss << \", \";\n                    oss << \"-\" << *it;\n                }\n                if( !longName.empty() ) {\n                    if( !first )\n                        oss << \", \";\n                    oss << \"--\" << longName;\n                }\n                if( !placeholder.empty() )\n                    oss << \" <\" << placeholder << \">\";\n                return oss.str();\n            }\n        };\n\n        typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr;\n\n        friend void addOptName( Arg& arg, std::string const& optName )\n        {\n            if( optName.empty() )\n                return;\n            if( Detail::startsWith( optName, \"--\" ) ) {\n                if( !arg.longName.empty() )\n                    throw std::logic_error( \"Only one long opt may be specified. '\"\n                        + arg.longName\n                        + \"' already specified, now attempting to add '\"\n                        + optName + \"'\" );\n                arg.longName = optName.substr( 2 );\n            }\n            else if( Detail::startsWith( optName, \"-\" ) )\n                arg.shortNames.push_back( optName.substr( 1 ) );\n            else\n                throw std::logic_error( \"option must begin with - or --. Option was: '\" + optName + \"'\" );\n        }\n        friend void setPositionalArg( Arg& arg, int position )\n        {\n            arg.position = position;\n        }\n\n        class ArgBuilder {\n        public:\n            ArgBuilder( Arg* arg ) : m_arg( arg ) {}\n\n            // Bind a non-boolean data member (requires placeholder string)\n            template<typename C, typename M>\n            void bind( M C::* field, std::string const& placeholder ) {\n                m_arg->boundField = new Detail::BoundDataMember<C,M>( field );\n                m_arg->placeholder = placeholder;\n            }\n            // Bind a boolean data member (no placeholder required)\n            template<typename C>\n            void bind( bool C::* field ) {\n                m_arg->boundField = new Detail::BoundDataMember<C,bool>( field );\n            }\n\n            // Bind a method taking a single, non-boolean argument (requires a placeholder string)\n            template<typename C, typename M>\n            void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) {\n                m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod );\n                m_arg->placeholder = placeholder;\n            }\n\n            // Bind a method taking a single, boolean argument (no placeholder string required)\n            template<typename C>\n            void bind( void (C::* unaryMethod)( bool ) ) {\n                m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod );\n            }\n\n            // Bind a method that takes no arguments (will be called if opt is present)\n            template<typename C>\n            void bind( void (C::* nullaryMethod)() ) {\n                m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod );\n            }\n\n            // Bind a free function taking a single argument - the object to operate on (no placeholder string required)\n            template<typename C>\n            void bind( void (* unaryFunction)( C& ) ) {\n                m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction );\n            }\n\n            // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)\n            template<typename C, typename T>\n            void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) {\n                m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction );\n                m_arg->placeholder = placeholder;\n            }\n\n            ArgBuilder& describe( std::string const& description ) {\n                m_arg->description = description;\n                return *this;\n            }\n            ArgBuilder& detail( std::string const& detail ) {\n                m_arg->detail = detail;\n                return *this;\n            }\n\n        protected:\n            Arg* m_arg;\n        };\n\n        class OptBuilder : public ArgBuilder {\n        public:\n            OptBuilder( Arg* arg ) : ArgBuilder( arg ) {}\n            OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {}\n\n            OptBuilder& operator[]( std::string const& optName ) {\n                addOptName( *ArgBuilder::m_arg, optName );\n                return *this;\n            }\n        };\n\n    public:\n\n        CommandLine()\n        :   m_boundProcessName( new Detail::NullBinder<ConfigT>() ),\n            m_highestSpecifiedArgPosition( 0 ),\n            m_throwOnUnrecognisedTokens( false )\n        {}\n        CommandLine( CommandLine const& other )\n        :   m_boundProcessName( other.m_boundProcessName ),\n            m_options ( other.m_options ),\n            m_positionalArgs( other.m_positionalArgs ),\n            m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ),\n            m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens )\n        {\n            if( other.m_floatingArg.get() )\n                m_floatingArg.reset( new Arg( *other.m_floatingArg ) );\n        }\n\n        CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) {\n            m_throwOnUnrecognisedTokens = shouldThrow;\n            return *this;\n        }\n\n        OptBuilder operator[]( std::string const& optName ) {\n            m_options.push_back( Arg() );\n            addOptName( m_options.back(), optName );\n            OptBuilder builder( &m_options.back() );\n            return builder;\n        }\n\n        ArgBuilder operator[]( int position ) {\n            m_positionalArgs.insert( std::make_pair( position, Arg() ) );\n            if( position > m_highestSpecifiedArgPosition )\n                m_highestSpecifiedArgPosition = position;\n            setPositionalArg( m_positionalArgs[position], position );\n            ArgBuilder builder( &m_positionalArgs[position] );\n            return builder;\n        }\n\n        // Invoke this with the _ instance\n        ArgBuilder operator[]( UnpositionalTag ) {\n            if( m_floatingArg.get() )\n                throw std::logic_error( \"Only one unpositional argument can be added\" );\n            m_floatingArg.reset( new Arg() );\n            ArgBuilder builder( m_floatingArg.get() );\n            return builder;\n        }\n\n        template<typename C, typename M>\n        void bindProcessName( M C::* field ) {\n            m_boundProcessName = new Detail::BoundDataMember<C,M>( field );\n        }\n        template<typename C, typename M>\n        void bindProcessName( void (C::*_unaryMethod)( M ) ) {\n            m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod );\n        }\n\n        void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const {\n            typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it;\n            std::size_t maxWidth = 0;\n            for( it = itBegin; it != itEnd; ++it )\n                maxWidth = (std::max)( maxWidth, it->commands().size() );\n\n            for( it = itBegin; it != itEnd; ++it ) {\n                Detail::Text usage( it->commands(), Detail::TextAttributes()\n                                                        .setWidth( maxWidth+indent )\n                                                        .setIndent( indent ) );\n                Detail::Text desc( it->description, Detail::TextAttributes()\n                                                        .setWidth( width - maxWidth - 3 ) );\n\n                for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) {\n                    std::string usageCol = i < usage.size() ? usage[i] : \"\";\n                    os << usageCol;\n\n                    if( i < desc.size() && !desc[i].empty() )\n                        os  << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' )\n                            << desc[i];\n                    os << \"\\n\";\n                }\n            }\n        }\n        std::string optUsage() const {\n            std::ostringstream oss;\n            optUsage( oss );\n            return oss.str();\n        }\n\n        void argSynopsis( std::ostream& os ) const {\n            for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) {\n                if( i > 1 )\n                    os << \" \";\n                typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );\n                if( it != m_positionalArgs.end() )\n                    os << \"<\" << it->second.placeholder << \">\";\n                else if( m_floatingArg.get() )\n                    os << \"<\" << m_floatingArg->placeholder << \">\";\n                else\n                    throw std::logic_error( \"non consecutive positional arguments with no floating args\" );\n            }\n            // !TBD No indication of mandatory args\n            if( m_floatingArg.get() ) {\n                if( m_highestSpecifiedArgPosition > 1 )\n                    os << \" \";\n                os << \"[<\" << m_floatingArg->placeholder << \"> ...]\";\n            }\n        }\n        std::string argSynopsis() const {\n            std::ostringstream oss;\n            argSynopsis( oss );\n            return oss.str();\n        }\n\n        void usage( std::ostream& os, std::string const& procName ) const {\n            validate();\n            os << \"usage:\\n  \" << procName << \" \";\n            argSynopsis( os );\n            if( !m_options.empty() ) {\n                os << \" [options]\\n\\nwhere options are: \\n\";\n                optUsage( os, 2 );\n            }\n            os << \"\\n\";\n        }\n        std::string usage( std::string const& procName ) const {\n            std::ostringstream oss;\n            usage( oss, procName );\n            return oss.str();\n        }\n\n        ConfigT parse( std::vector<std::string> const& args ) const {\n            ConfigT config;\n            parseInto( args, config );\n            return config;\n        }\n\n        std::vector<Parser::Token> parseInto( std::vector<std::string> const& args, ConfigT& config ) const {\n            std::string processName = args[0];\n            std::size_t lastSlash = processName.find_last_of( \"/\\\\\" );\n            if( lastSlash != std::string::npos )\n                processName = processName.substr( lastSlash+1 );\n            m_boundProcessName.set( config, processName );\n            std::vector<Parser::Token> tokens;\n            Parser parser;\n            parser.parseIntoTokens( args, tokens );\n            return populate( tokens, config );\n        }\n\n        std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {\n            validate();\n            std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );\n            unusedTokens = populateFixedArgs( unusedTokens, config );\n            unusedTokens = populateFloatingArgs( unusedTokens, config );\n            return unusedTokens;\n        }\n\n        std::vector<Parser::Token> populateOptions( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {\n            std::vector<Parser::Token> unusedTokens;\n            std::vector<std::string> errors;\n            for( std::size_t i = 0; i < tokens.size(); ++i ) {\n                Parser::Token const& token = tokens[i];\n                typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end();\n                for(; it != itEnd; ++it ) {\n                    Arg const& arg = *it;\n\n                    try {\n                        if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) ||\n                            ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) {\n                            if( arg.takesArg() ) {\n                                if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional )\n                                    errors.push_back( \"Expected argument to option: \" + token.data );\n                                else\n                                    arg.boundField.set( config, tokens[++i].data );\n                            }\n                            else {\n                                arg.boundField.set( config, \"true\" );\n                            }\n                            break;\n                        }\n                    }\n                    catch( std::exception& ex ) {\n                        errors.push_back( std::string( ex.what() ) + \"\\n- while parsing: (\" + arg.commands() + \")\" );\n                    }\n                }\n                if( it == itEnd ) {\n                    if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens )\n                        unusedTokens.push_back( token );\n                    else if( errors.empty() && m_throwOnUnrecognisedTokens )\n                        errors.push_back( \"unrecognised option: \" + token.data );\n                }\n            }\n            if( !errors.empty() ) {\n                std::ostringstream oss;\n                for( std::vector<std::string>::const_iterator it = errors.begin(), itEnd = errors.end();\n                        it != itEnd;\n                        ++it ) {\n                    if( it != errors.begin() )\n                        oss << \"\\n\";\n                    oss << *it;\n                }\n                throw std::runtime_error( oss.str() );\n            }\n            return unusedTokens;\n        }\n        std::vector<Parser::Token> populateFixedArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {\n            std::vector<Parser::Token> unusedTokens;\n            int position = 1;\n            for( std::size_t i = 0; i < tokens.size(); ++i ) {\n                Parser::Token const& token = tokens[i];\n                typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( position );\n                if( it != m_positionalArgs.end() )\n                    it->second.boundField.set( config, token.data );\n                else\n                    unusedTokens.push_back( token );\n                if( token.type == Parser::Token::Positional )\n                    position++;\n            }\n            return unusedTokens;\n        }\n        std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {\n            if( !m_floatingArg.get() )\n                return tokens;\n            std::vector<Parser::Token> unusedTokens;\n            for( std::size_t i = 0; i < tokens.size(); ++i ) {\n                Parser::Token const& token = tokens[i];\n                if( token.type == Parser::Token::Positional )\n                    m_floatingArg->boundField.set( config, token.data );\n                else\n                    unusedTokens.push_back( token );\n            }\n            return unusedTokens;\n        }\n\n        void validate() const\n        {\n            if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() )\n                throw std::logic_error( \"No options or arguments specified\" );\n\n            for( typename std::vector<Arg>::const_iterator  it = m_options.begin(),\n                                                            itEnd = m_options.end();\n                    it != itEnd; ++it )\n                it->validate();\n        }\n\n    private:\n        Detail::BoundArgFunction<ConfigT> m_boundProcessName;\n        std::vector<Arg> m_options;\n        std::map<int, Arg> m_positionalArgs;\n        ArgAutoPtr m_floatingArg;\n        int m_highestSpecifiedArgPosition;\n        bool m_throwOnUnrecognisedTokens;\n    };\n\n} // end namespace Clara\n\nSTITCH_CLARA_CLOSE_NAMESPACE\n#undef STITCH_CLARA_OPEN_NAMESPACE\n#undef STITCH_CLARA_CLOSE_NAMESPACE\n\n#endif // TWOBLUECUBES_CLARA_H_INCLUDED\n#undef STITCH_CLARA_OPEN_NAMESPACE\n\n// Restore Clara's value for console width, if present\n#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#endif\n\n#include <fstream>\n\nnamespace Catch {\n\n    inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; }\n    inline void abortAfterX( ConfigData& config, int x ) {\n        if( x < 1 )\n            throw std::runtime_error( \"Value after -x or --abortAfter must be greater than zero\" );\n        config.abortAfter = x;\n    }\n    inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); }\n    inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); }\n\n    inline void addWarning( ConfigData& config, std::string const& _warning ) {\n        if( _warning == \"NoAssertions\" )\n            config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions );\n        else\n            throw std::runtime_error( \"Unrecognised warning: '\" + _warning + \"'\" );\n    }\n    inline void setOrder( ConfigData& config, std::string const& order ) {\n        if( startsWith( \"declared\", order ) )\n            config.runOrder = RunTests::InDeclarationOrder;\n        else if( startsWith( \"lexical\", order ) )\n            config.runOrder = RunTests::InLexicographicalOrder;\n        else if( startsWith( \"random\", order ) )\n            config.runOrder = RunTests::InRandomOrder;\n        else\n            throw std::runtime_error( \"Unrecognised ordering: '\" + order + \"'\" );\n    }\n    inline void setRngSeed( ConfigData& config, std::string const& seed ) {\n        if( seed == \"time\" ) {\n            config.rngSeed = static_cast<unsigned int>( std::time(0) );\n        }\n        else {\n            std::stringstream ss;\n            ss << seed;\n            ss >> config.rngSeed;\n            if( ss.fail() )\n                throw std::runtime_error( \"Argment to --rng-seed should be the word 'time' or a number\" );\n        }\n    }\n    inline void setVerbosity( ConfigData& config, int level ) {\n        // !TBD: accept strings?\n        config.verbosity = static_cast<Verbosity::Level>( level );\n    }\n    inline void setShowDurations( ConfigData& config, bool _showDurations ) {\n        config.showDurations = _showDurations\n            ? ShowDurations::Always\n            : ShowDurations::Never;\n    }\n    inline void setUseColour( ConfigData& config, std::string const& value ) {\n        std::string mode = toLower( value );\n\n        if( mode == \"yes\" )\n            config.useColour = UseColour::Yes;\n        else if( mode == \"no\" )\n            config.useColour = UseColour::No;\n        else if( mode == \"auto\" )\n            config.useColour = UseColour::Auto;\n        else\n            throw std::runtime_error( \"colour mode must be one of: auto, yes or no\" );\n    }\n    inline void forceColour( ConfigData& config ) {\n        config.useColour = UseColour::Yes;\n    }\n    inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) {\n        std::ifstream f( _filename.c_str() );\n        if( !f.is_open() )\n            throw std::domain_error( \"Unable to load input file: \" + _filename );\n\n        std::string line;\n        while( std::getline( f, line ) ) {\n            line = trim(line);\n            if( !line.empty() && !startsWith( line, \"#\" ) ) {\n                if( !startsWith( line, \"\\\"\" ) )\n                    line = \"\\\"\" + line + \"\\\"\";\n                addTestOrTags( config, line + \",\" );\n            }\n        }\n    }\n\n    inline Clara::CommandLine<ConfigData> makeCommandLineParser() {\n\n        using namespace Clara;\n        CommandLine<ConfigData> cli;\n\n        cli.bindProcessName( &ConfigData::processName );\n\n        cli[\"-?\"][\"-h\"][\"--help\"]\n            .describe( \"display usage information\" )\n            .bind( &ConfigData::showHelp );\n\n        cli[\"-l\"][\"--list-tests\"]\n            .describe( \"list all/matching test cases\" )\n            .bind( &ConfigData::listTests );\n\n        cli[\"-t\"][\"--list-tags\"]\n            .describe( \"list all/matching tags\" )\n            .bind( &ConfigData::listTags );\n\n        cli[\"-s\"][\"--success\"]\n            .describe( \"include successful tests in output\" )\n            .bind( &ConfigData::showSuccessfulTests );\n\n        cli[\"-b\"][\"--break\"]\n            .describe( \"break into debugger on failure\" )\n            .bind( &ConfigData::shouldDebugBreak );\n\n        cli[\"-e\"][\"--nothrow\"]\n            .describe( \"skip exception tests\" )\n            .bind( &ConfigData::noThrow );\n\n        cli[\"-i\"][\"--invisibles\"]\n            .describe( \"show invisibles (tabs, newlines)\" )\n            .bind( &ConfigData::showInvisibles );\n\n        cli[\"-o\"][\"--out\"]\n            .describe( \"output filename\" )\n            .bind( &ConfigData::outputFilename, \"filename\" );\n\n        cli[\"-r\"][\"--reporter\"]\n//            .placeholder( \"name[:filename]\" )\n            .describe( \"reporter to use (defaults to console)\" )\n            .bind( &addReporterName, \"name\" );\n\n        cli[\"-n\"][\"--name\"]\n            .describe( \"suite name\" )\n            .bind( &ConfigData::name, \"name\" );\n\n        cli[\"-a\"][\"--abort\"]\n            .describe( \"abort at first failure\" )\n            .bind( &abortAfterFirst );\n\n        cli[\"-x\"][\"--abortx\"]\n            .describe( \"abort after x failures\" )\n            .bind( &abortAfterX, \"no. failures\" );\n\n        cli[\"-w\"][\"--warn\"]\n            .describe( \"enable warnings\" )\n            .bind( &addWarning, \"warning name\" );\n\n// - needs updating if reinstated\n//        cli.into( &setVerbosity )\n//            .describe( \"level of verbosity (0=no output)\" )\n//            .shortOpt( \"v\")\n//            .longOpt( \"verbosity\" )\n//            .placeholder( \"level\" );\n\n        cli[_]\n            .describe( \"which test or tests to use\" )\n            .bind( &addTestOrTags, \"test name, pattern or tags\" );\n\n        cli[\"-d\"][\"--durations\"]\n            .describe( \"show test durations\" )\n            .bind( &setShowDurations, \"yes|no\" );\n\n        cli[\"-f\"][\"--input-file\"]\n            .describe( \"load test names to run from a file\" )\n            .bind( &loadTestNamesFromFile, \"filename\" );\n\n        cli[\"-#\"][\"--filenames-as-tags\"]\n            .describe( \"adds a tag for the filename\" )\n            .bind( &ConfigData::filenamesAsTags );\n\n        // Less common commands which don't have a short form\n        cli[\"--list-test-names-only\"]\n            .describe( \"list all/matching test cases names only\" )\n            .bind( &ConfigData::listTestNamesOnly );\n\n        cli[\"--list-reporters\"]\n            .describe( \"list all reporters\" )\n            .bind( &ConfigData::listReporters );\n\n        cli[\"--order\"]\n            .describe( \"test case order (defaults to decl)\" )\n            .bind( &setOrder, \"decl|lex|rand\" );\n\n        cli[\"--rng-seed\"]\n            .describe( \"set a specific seed for random numbers\" )\n            .bind( &setRngSeed, \"'time'|number\" );\n\n        cli[\"--force-colour\"]\n            .describe( \"force colourised output (deprecated)\" )\n            .bind( &forceColour );\n\n        cli[\"--use-colour\"]\n            .describe( \"should output be colourised\" )\n            .bind( &setUseColour, \"yes|no\" );\n\n        return cli;\n    }\n\n} // end namespace Catch\n\n// #included from: internal/catch_list.hpp\n#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED\n\n// #included from: catch_text.h\n#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED\n\n#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH\n\n#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch\n// #included from: ../external/tbc_text_format.h\n// Only use header guard if we are not using an outer namespace\n#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE\n# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED\n#  ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED\n#   define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED\n#  endif\n# else\n#  define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED\n# endif\n#endif\n#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED\n#include <string>\n#include <vector>\n#include <sstream>\n\n// Use optional outer namespace\n#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE\nnamespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE {\n#endif\n\nnamespace Tbc {\n\n#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH\n    const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;\n#else\n    const unsigned int consoleWidth = 80;\n#endif\n\n    struct TextAttributes {\n        TextAttributes()\n        :   initialIndent( std::string::npos ),\n            indent( 0 ),\n            width( consoleWidth-1 ),\n            tabChar( '\\t' )\n        {}\n\n        TextAttributes& setInitialIndent( std::size_t _value )  { initialIndent = _value; return *this; }\n        TextAttributes& setIndent( std::size_t _value )         { indent = _value; return *this; }\n        TextAttributes& setWidth( std::size_t _value )          { width = _value; return *this; }\n        TextAttributes& setTabChar( char _value )               { tabChar = _value; return *this; }\n\n        std::size_t initialIndent;  // indent of first line, or npos\n        std::size_t indent;         // indent of subsequent lines, or all if initialIndent is npos\n        std::size_t width;          // maximum width of text, including indent. Longer text will wrap\n        char tabChar;               // If this char is seen the indent is changed to current pos\n    };\n\n    class Text {\n    public:\n        Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )\n        : attr( _attr )\n        {\n            std::string wrappableChars = \" [({.,/|\\\\-\";\n            std::size_t indent = _attr.initialIndent != std::string::npos\n                ? _attr.initialIndent\n                : _attr.indent;\n            std::string remainder = _str;\n\n            while( !remainder.empty() ) {\n                if( lines.size() >= 1000 ) {\n                    lines.push_back( \"... message truncated due to excessive size\" );\n                    return;\n                }\n                std::size_t tabPos = std::string::npos;\n                std::size_t width = (std::min)( remainder.size(), _attr.width - indent );\n                std::size_t pos = remainder.find_first_of( '\\n' );\n                if( pos <= width ) {\n                    width = pos;\n                }\n                pos = remainder.find_last_of( _attr.tabChar, width );\n                if( pos != std::string::npos ) {\n                    tabPos = pos;\n                    if( remainder[width] == '\\n' )\n                        width--;\n                    remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );\n                }\n\n                if( width == remainder.size() ) {\n                    spliceLine( indent, remainder, width );\n                }\n                else if( remainder[width] == '\\n' ) {\n                    spliceLine( indent, remainder, width );\n                    if( width <= 1 || remainder.size() != 1 )\n                        remainder = remainder.substr( 1 );\n                    indent = _attr.indent;\n                }\n                else {\n                    pos = remainder.find_last_of( wrappableChars, width );\n                    if( pos != std::string::npos && pos > 0 ) {\n                        spliceLine( indent, remainder, pos );\n                        if( remainder[0] == ' ' )\n                            remainder = remainder.substr( 1 );\n                    }\n                    else {\n                        spliceLine( indent, remainder, width-1 );\n                        lines.back() += \"-\";\n                    }\n                    if( lines.size() == 1 )\n                        indent = _attr.indent;\n                    if( tabPos != std::string::npos )\n                        indent += tabPos;\n                }\n            }\n        }\n\n        void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {\n            lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );\n            _remainder = _remainder.substr( _pos );\n        }\n\n        typedef std::vector<std::string>::const_iterator const_iterator;\n\n        const_iterator begin() const { return lines.begin(); }\n        const_iterator end() const { return lines.end(); }\n        std::string const& last() const { return lines.back(); }\n        std::size_t size() const { return lines.size(); }\n        std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }\n        std::string toString() const {\n            std::ostringstream oss;\n            oss << *this;\n            return oss.str();\n        }\n\n        inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {\n            for( Text::const_iterator it = _text.begin(), itEnd = _text.end();\n                it != itEnd; ++it ) {\n                if( it != _text.begin() )\n                    _stream << \"\\n\";\n                _stream << *it;\n            }\n            return _stream;\n        }\n\n    private:\n        std::string str;\n        TextAttributes attr;\n        std::vector<std::string> lines;\n    };\n\n} // end namespace Tbc\n\n#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE\n} // end outer namespace\n#endif\n\n#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED\n#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE\n\nnamespace Catch {\n    using Tbc::Text;\n    using Tbc::TextAttributes;\n}\n\n// #included from: catch_console_colour.hpp\n#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED\n\nnamespace Catch {\n\n    struct Colour {\n        enum Code {\n            None = 0,\n\n            White,\n            Red,\n            Green,\n            Blue,\n            Cyan,\n            Yellow,\n            Grey,\n\n            Bright = 0x10,\n\n            BrightRed = Bright | Red,\n            BrightGreen = Bright | Green,\n            LightGrey = Bright | Grey,\n            BrightWhite = Bright | White,\n\n            // By intention\n            FileName = LightGrey,\n            Warning = Yellow,\n            ResultError = BrightRed,\n            ResultSuccess = BrightGreen,\n            ResultExpectedFailure = Warning,\n\n            Error = BrightRed,\n            Success = Green,\n\n            OriginalExpression = Cyan,\n            ReconstructedExpression = Yellow,\n\n            SecondaryText = LightGrey,\n            Headers = White\n        };\n\n        // Use constructed object for RAII guard\n        Colour( Code _colourCode );\n        Colour( Colour const& other );\n        ~Colour();\n\n        // Use static method for one-shot changes\n        static void use( Code _colourCode );\n\n    private:\n        bool m_moved;\n    };\n\n    inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; }\n\n} // end namespace Catch\n\n// #included from: catch_interfaces_reporter.h\n#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED\n\n#include <string>\n#include <ostream>\n#include <map>\n#include <assert.h>\n\nnamespace Catch\n{\n    struct ReporterConfig {\n        explicit ReporterConfig( Ptr<IConfig const> const& _fullConfig )\n        :   m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}\n\n        ReporterConfig( Ptr<IConfig const> const& _fullConfig, std::ostream& _stream )\n        :   m_stream( &_stream ), m_fullConfig( _fullConfig ) {}\n\n        std::ostream& stream() const    { return *m_stream; }\n        Ptr<IConfig const> fullConfig() const { return m_fullConfig; }\n\n    private:\n        std::ostream* m_stream;\n        Ptr<IConfig const> m_fullConfig;\n    };\n\n    struct ReporterPreferences {\n        ReporterPreferences()\n        : shouldRedirectStdOut( false )\n        {}\n\n        bool shouldRedirectStdOut;\n    };\n\n    template<typename T>\n    struct LazyStat : Option<T> {\n        LazyStat() : used( false ) {}\n        LazyStat& operator=( T const& _value ) {\n            Option<T>::operator=( _value );\n            used = false;\n            return *this;\n        }\n        void reset() {\n            Option<T>::reset();\n            used = false;\n        }\n        bool used;\n    };\n\n    struct TestRunInfo {\n        TestRunInfo( std::string const& _name ) : name( _name ) {}\n        std::string name;\n    };\n    struct GroupInfo {\n        GroupInfo(  std::string const& _name,\n                    std::size_t _groupIndex,\n                    std::size_t _groupsCount )\n        :   name( _name ),\n            groupIndex( _groupIndex ),\n            groupsCounts( _groupsCount )\n        {}\n\n        std::string name;\n        std::size_t groupIndex;\n        std::size_t groupsCounts;\n    };\n\n    struct AssertionStats {\n        AssertionStats( AssertionResult const& _assertionResult,\n                        std::vector<MessageInfo> const& _infoMessages,\n                        Totals const& _totals )\n        :   assertionResult( _assertionResult ),\n            infoMessages( _infoMessages ),\n            totals( _totals )\n        {\n            if( assertionResult.hasMessage() ) {\n                // Copy message into messages list.\n                // !TBD This should have been done earlier, somewhere\n                MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );\n                builder << assertionResult.getMessage();\n                builder.m_info.message = builder.m_stream.str();\n\n                infoMessages.push_back( builder.m_info );\n            }\n        }\n        virtual ~AssertionStats();\n\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        AssertionStats( AssertionStats const& )              = default;\n        AssertionStats( AssertionStats && )                  = default;\n        AssertionStats& operator = ( AssertionStats const& ) = default;\n        AssertionStats& operator = ( AssertionStats && )     = default;\n#  endif\n\n        AssertionResult assertionResult;\n        std::vector<MessageInfo> infoMessages;\n        Totals totals;\n    };\n\n    struct SectionStats {\n        SectionStats(   SectionInfo const& _sectionInfo,\n                        Counts const& _assertions,\n                        double _durationInSeconds,\n                        bool _missingAssertions )\n        :   sectionInfo( _sectionInfo ),\n            assertions( _assertions ),\n            durationInSeconds( _durationInSeconds ),\n            missingAssertions( _missingAssertions )\n        {}\n        virtual ~SectionStats();\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        SectionStats( SectionStats const& )              = default;\n        SectionStats( SectionStats && )                  = default;\n        SectionStats& operator = ( SectionStats const& ) = default;\n        SectionStats& operator = ( SectionStats && )     = default;\n#  endif\n\n        SectionInfo sectionInfo;\n        Counts assertions;\n        double durationInSeconds;\n        bool missingAssertions;\n    };\n\n    struct TestCaseStats {\n        TestCaseStats(  TestCaseInfo const& _testInfo,\n                        Totals const& _totals,\n                        std::string const& _stdOut,\n                        std::string const& _stdErr,\n                        bool _aborting )\n        : testInfo( _testInfo ),\n            totals( _totals ),\n            stdOut( _stdOut ),\n            stdErr( _stdErr ),\n            aborting( _aborting )\n        {}\n        virtual ~TestCaseStats();\n\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        TestCaseStats( TestCaseStats const& )              = default;\n        TestCaseStats( TestCaseStats && )                  = default;\n        TestCaseStats& operator = ( TestCaseStats const& ) = default;\n        TestCaseStats& operator = ( TestCaseStats && )     = default;\n#  endif\n\n        TestCaseInfo testInfo;\n        Totals totals;\n        std::string stdOut;\n        std::string stdErr;\n        bool aborting;\n    };\n\n    struct TestGroupStats {\n        TestGroupStats( GroupInfo const& _groupInfo,\n                        Totals const& _totals,\n                        bool _aborting )\n        :   groupInfo( _groupInfo ),\n            totals( _totals ),\n            aborting( _aborting )\n        {}\n        TestGroupStats( GroupInfo const& _groupInfo )\n        :   groupInfo( _groupInfo ),\n            aborting( false )\n        {}\n        virtual ~TestGroupStats();\n\n#  ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        TestGroupStats( TestGroupStats const& )              = default;\n        TestGroupStats( TestGroupStats && )                  = default;\n        TestGroupStats& operator = ( TestGroupStats const& ) = default;\n        TestGroupStats& operator = ( TestGroupStats && )     = default;\n#  endif\n\n        GroupInfo groupInfo;\n        Totals totals;\n        bool aborting;\n    };\n\n    struct TestRunStats {\n        TestRunStats(   TestRunInfo const& _runInfo,\n                        Totals const& _totals,\n                        bool _aborting )\n        :   runInfo( _runInfo ),\n            totals( _totals ),\n            aborting( _aborting )\n        {}\n        virtual ~TestRunStats();\n\n#  ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS\n        TestRunStats( TestRunStats const& _other )\n        :   runInfo( _other.runInfo ),\n            totals( _other.totals ),\n            aborting( _other.aborting )\n        {}\n#  else\n        TestRunStats( TestRunStats const& )              = default;\n        TestRunStats( TestRunStats && )                  = default;\n        TestRunStats& operator = ( TestRunStats const& ) = default;\n        TestRunStats& operator = ( TestRunStats && )     = default;\n#  endif\n\n        TestRunInfo runInfo;\n        Totals totals;\n        bool aborting;\n    };\n\n    class MultipleReporters;\n\n    struct IStreamingReporter : IShared {\n        virtual ~IStreamingReporter();\n\n        // Implementing class must also provide the following static method:\n        // static std::string getDescription();\n\n        virtual ReporterPreferences getPreferences() const = 0;\n\n        virtual void noMatchingTestCases( std::string const& spec ) = 0;\n\n        virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;\n        virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;\n\n        virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;\n        virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;\n\n        virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;\n\n        // The return value indicates if the messages buffer should be cleared:\n        virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;\n\n        virtual void sectionEnded( SectionStats const& sectionStats ) = 0;\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;\n        virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;\n\n        virtual void skipTest( TestCaseInfo const& testInfo ) = 0;\n\n        virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; }\n    };\n\n    struct IReporterFactory : IShared {\n        virtual ~IReporterFactory();\n        virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0;\n        virtual std::string getDescription() const = 0;\n    };\n\n    struct IReporterRegistry {\n        typedef std::map<std::string, Ptr<IReporterFactory> > FactoryMap;\n        typedef std::vector<Ptr<IReporterFactory> > Listeners;\n\n        virtual ~IReporterRegistry();\n        virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const = 0;\n        virtual FactoryMap const& getFactories() const = 0;\n        virtual Listeners const& getListeners() const = 0;\n    };\n\n    Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter );\n\n}\n\n#include <limits>\n#include <algorithm>\n\nnamespace Catch {\n\n    inline std::size_t listTests( Config const& config ) {\n\n        TestSpec testSpec = config.testSpec();\n        if( config.testSpec().hasFilters() )\n            Catch::cout() << \"Matching test cases:\\n\";\n        else {\n            Catch::cout() << \"All available test cases:\\n\";\n            testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( \"*\" ).testSpec();\n        }\n\n        std::size_t matchedTests = 0;\n        TextAttributes nameAttr, tagsAttr;\n        nameAttr.setInitialIndent( 2 ).setIndent( 4 );\n        tagsAttr.setIndent( 6 );\n\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();\n                it != itEnd;\n                ++it ) {\n            matchedTests++;\n            TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();\n            Colour::Code colour = testCaseInfo.isHidden()\n                ? Colour::SecondaryText\n                : Colour::None;\n            Colour colourGuard( colour );\n\n            Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;\n            if( !testCaseInfo.tags.empty() )\n                Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;\n        }\n\n        if( !config.testSpec().hasFilters() )\n            Catch::cout() << pluralise( matchedTests, \"test case\" ) << \"\\n\" << std::endl;\n        else\n            Catch::cout() << pluralise( matchedTests, \"matching test case\" ) << \"\\n\" << std::endl;\n        return matchedTests;\n    }\n\n    inline std::size_t listTestsNamesOnly( Config const& config ) {\n        TestSpec testSpec = config.testSpec();\n        if( !config.testSpec().hasFilters() )\n            testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( \"*\" ).testSpec();\n        std::size_t matchedTests = 0;\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();\n                it != itEnd;\n                ++it ) {\n            matchedTests++;\n            TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();\n            if( startsWith( testCaseInfo.name, \"#\" ) )\n               Catch::cout() << \"\\\"\" << testCaseInfo.name << \"\\\"\" << std::endl;\n            else\n               Catch::cout() << testCaseInfo.name << std::endl;\n        }\n        return matchedTests;\n    }\n\n    struct TagInfo {\n        TagInfo() : count ( 0 ) {}\n        void add( std::string const& spelling ) {\n            ++count;\n            spellings.insert( spelling );\n        }\n        std::string all() const {\n            std::string out;\n            for( std::set<std::string>::const_iterator it = spellings.begin(), itEnd = spellings.end();\n                        it != itEnd;\n                        ++it )\n                out += \"[\" + *it + \"]\";\n            return out;\n        }\n        std::set<std::string> spellings;\n        std::size_t count;\n    };\n\n    inline std::size_t listTags( Config const& config ) {\n        TestSpec testSpec = config.testSpec();\n        if( config.testSpec().hasFilters() )\n            Catch::cout() << \"Tags for matching test cases:\\n\";\n        else {\n            Catch::cout() << \"All available tags:\\n\";\n            testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( \"*\" ).testSpec();\n        }\n\n        std::map<std::string, TagInfo> tagCounts;\n\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();\n                it != itEnd;\n                ++it ) {\n            for( std::set<std::string>::const_iterator  tagIt = it->getTestCaseInfo().tags.begin(),\n                                                        tagItEnd = it->getTestCaseInfo().tags.end();\n                    tagIt != tagItEnd;\n                    ++tagIt ) {\n                std::string tagName = *tagIt;\n                std::string lcaseTagName = toLower( tagName );\n                std::map<std::string, TagInfo>::iterator countIt = tagCounts.find( lcaseTagName );\n                if( countIt == tagCounts.end() )\n                    countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;\n                countIt->second.add( tagName );\n            }\n        }\n\n        for( std::map<std::string, TagInfo>::const_iterator countIt = tagCounts.begin(),\n                                                            countItEnd = tagCounts.end();\n                countIt != countItEnd;\n                ++countIt ) {\n            std::ostringstream oss;\n            oss << \"  \" << std::setw(2) << countIt->second.count << \"  \";\n            Text wrapper( countIt->second.all(), TextAttributes()\n                                                    .setInitialIndent( 0 )\n                                                    .setIndent( oss.str().size() )\n                                                    .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) );\n            Catch::cout() << oss.str() << wrapper << \"\\n\";\n        }\n        Catch::cout() << pluralise( tagCounts.size(), \"tag\" ) << \"\\n\" << std::endl;\n        return tagCounts.size();\n    }\n\n    inline std::size_t listReporters( Config const& /*config*/ ) {\n        Catch::cout() << \"Available reporters:\\n\";\n        IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();\n        IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it;\n        std::size_t maxNameLen = 0;\n        for(it = itBegin; it != itEnd; ++it )\n            maxNameLen = (std::max)( maxNameLen, it->first.size() );\n\n        for(it = itBegin; it != itEnd; ++it ) {\n            Text wrapper( it->second->getDescription(), TextAttributes()\n                                                        .setInitialIndent( 0 )\n                                                        .setIndent( 7+maxNameLen )\n                                                        .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) );\n            Catch::cout() << \"  \"\n                    << it->first\n                    << \":\"\n                    << std::string( maxNameLen - it->first.size() + 2, ' ' )\n                    << wrapper << \"\\n\";\n        }\n        Catch::cout() << std::endl;\n        return factories.size();\n    }\n\n    inline Option<std::size_t> list( Config const& config ) {\n        Option<std::size_t> listedCount;\n        if( config.listTests() )\n            listedCount = listedCount.valueOr(0) + listTests( config );\n        if( config.listTestNamesOnly() )\n            listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );\n        if( config.listTags() )\n            listedCount = listedCount.valueOr(0) + listTags( config );\n        if( config.listReporters() )\n            listedCount = listedCount.valueOr(0) + listReporters( config );\n        return listedCount;\n    }\n\n} // end namespace Catch\n\n// #included from: internal/catch_run_context.hpp\n#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED\n\n// #included from: catch_test_case_tracker.hpp\n#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED\n\n#include <map>\n#include <string>\n#include <assert.h>\n#include <vector>\n\nnamespace Catch {\nnamespace TestCaseTracking {\n\n    struct ITracker : SharedImpl<> {\n        virtual ~ITracker();\n\n        // static queries\n        virtual std::string name() const = 0;\n\n        // dynamic queries\n        virtual bool isComplete() const = 0; // Successfully completed or failed\n        virtual bool isSuccessfullyCompleted() const = 0;\n        virtual bool isOpen() const = 0; // Started but not complete\n        virtual bool hasChildren() const = 0;\n\n        virtual ITracker& parent() = 0;\n\n        // actions\n        virtual void close() = 0; // Successfully complete\n        virtual void fail() = 0;\n        virtual void markAsNeedingAnotherRun() = 0;\n\n        virtual void addChild( Ptr<ITracker> const& child ) = 0;\n        virtual ITracker* findChild( std::string const& name ) = 0;\n        virtual void openChild() = 0;\n\n        // Debug/ checking\n        virtual bool isSectionTracker() const = 0;\n        virtual bool isIndexTracker() const = 0;\n    };\n\n    class TrackerContext {\n\n        enum RunState {\n            NotStarted,\n            Executing,\n            CompletedCycle\n        };\n\n        Ptr<ITracker> m_rootTracker;\n        ITracker* m_currentTracker;\n        RunState m_runState;\n\n    public:\n\n        static TrackerContext& instance() {\n            static TrackerContext s_instance;\n            return s_instance;\n        }\n\n        TrackerContext()\n        :   m_currentTracker( CATCH_NULL ),\n            m_runState( NotStarted )\n        {}\n\n        ITracker& startRun();\n\n        void endRun() {\n            m_rootTracker.reset();\n            m_currentTracker = CATCH_NULL;\n            m_runState = NotStarted;\n        }\n\n        void startCycle() {\n            m_currentTracker = m_rootTracker.get();\n            m_runState = Executing;\n        }\n        void completeCycle() {\n            m_runState = CompletedCycle;\n        }\n\n        bool completedCycle() const {\n            return m_runState == CompletedCycle;\n        }\n        ITracker& currentTracker() {\n            return *m_currentTracker;\n        }\n        void setCurrentTracker( ITracker* tracker ) {\n            m_currentTracker = tracker;\n        }\n    };\n\n    class TrackerBase : public ITracker {\n    protected:\n        enum CycleState {\n            NotStarted,\n            Executing,\n            ExecutingChildren,\n            NeedsAnotherRun,\n            CompletedSuccessfully,\n            Failed\n        };\n        class TrackerHasName {\n            std::string m_name;\n        public:\n            TrackerHasName( std::string const& name ) : m_name( name ) {}\n            bool operator ()( Ptr<ITracker> const& tracker ) {\n                return tracker->name() == m_name;\n            }\n        };\n        typedef std::vector<Ptr<ITracker> > Children;\n        std::string m_name;\n        TrackerContext& m_ctx;\n        ITracker* m_parent;\n        Children m_children;\n        CycleState m_runState;\n    public:\n        TrackerBase( std::string const& name, TrackerContext& ctx, ITracker* parent )\n        :   m_name( name ),\n            m_ctx( ctx ),\n            m_parent( parent ),\n            m_runState( NotStarted )\n        {}\n        virtual ~TrackerBase();\n\n        virtual std::string name() const CATCH_OVERRIDE {\n            return m_name;\n        }\n        virtual bool isComplete() const CATCH_OVERRIDE {\n            return m_runState == CompletedSuccessfully || m_runState == Failed;\n        }\n        virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE {\n            return m_runState == CompletedSuccessfully;\n        }\n        virtual bool isOpen() const CATCH_OVERRIDE {\n            return m_runState != NotStarted && !isComplete();\n        }\n        virtual bool hasChildren() const CATCH_OVERRIDE {\n            return !m_children.empty();\n        }\n\n        virtual void addChild( Ptr<ITracker> const& child ) CATCH_OVERRIDE {\n            m_children.push_back( child );\n        }\n\n        virtual ITracker* findChild( std::string const& name ) CATCH_OVERRIDE {\n            Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( name ) );\n            return( it != m_children.end() )\n                ? it->get()\n                : CATCH_NULL;\n        }\n        virtual ITracker& parent() CATCH_OVERRIDE {\n            assert( m_parent ); // Should always be non-null except for root\n            return *m_parent;\n        }\n\n        virtual void openChild() CATCH_OVERRIDE {\n            if( m_runState != ExecutingChildren ) {\n                m_runState = ExecutingChildren;\n                if( m_parent )\n                    m_parent->openChild();\n            }\n        }\n\n        virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; }\n        virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; }\n\n        void open() {\n            m_runState = Executing;\n            moveToThis();\n            if( m_parent )\n                m_parent->openChild();\n        }\n\n        virtual void close() CATCH_OVERRIDE {\n\n            // Close any still open children (e.g. generators)\n            while( &m_ctx.currentTracker() != this )\n                m_ctx.currentTracker().close();\n\n            switch( m_runState ) {\n                case NotStarted:\n                case CompletedSuccessfully:\n                case Failed:\n                    throw std::logic_error( \"Illogical state\" );\n\n                case NeedsAnotherRun:\n                    break;;\n\n                case Executing:\n                    m_runState = CompletedSuccessfully;\n                    break;\n                case ExecutingChildren:\n                    if( m_children.empty() || m_children.back()->isComplete() )\n                        m_runState = CompletedSuccessfully;\n                    break;\n\n                default:\n                    throw std::logic_error( \"Unexpected state\" );\n            }\n            moveToParent();\n            m_ctx.completeCycle();\n        }\n        virtual void fail() CATCH_OVERRIDE {\n            m_runState = Failed;\n            if( m_parent )\n                m_parent->markAsNeedingAnotherRun();\n            moveToParent();\n            m_ctx.completeCycle();\n        }\n        virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE {\n            m_runState = NeedsAnotherRun;\n        }\n    private:\n        void moveToParent() {\n            assert( m_parent );\n            m_ctx.setCurrentTracker( m_parent );\n        }\n        void moveToThis() {\n            m_ctx.setCurrentTracker( this );\n        }\n    };\n\n    class SectionTracker : public TrackerBase {\n    public:\n        SectionTracker( std::string const& name, TrackerContext& ctx, ITracker* parent )\n        :   TrackerBase( name, ctx, parent )\n        {}\n        virtual ~SectionTracker();\n\n        virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; }\n\n        static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) {\n            SectionTracker* section = CATCH_NULL;\n\n            ITracker& currentTracker = ctx.currentTracker();\n            if( ITracker* childTracker = currentTracker.findChild( name ) ) {\n                assert( childTracker );\n                assert( childTracker->isSectionTracker() );\n                section = static_cast<SectionTracker*>( childTracker );\n            }\n            else {\n                section = new SectionTracker( name, ctx, &currentTracker );\n                currentTracker.addChild( section );\n            }\n            if( !ctx.completedCycle() && !section->isComplete() ) {\n\n                section->open();\n            }\n            return *section;\n        }\n    };\n\n    class IndexTracker : public TrackerBase {\n        int m_size;\n        int m_index;\n    public:\n        IndexTracker( std::string const& name, TrackerContext& ctx, ITracker* parent, int size )\n        :   TrackerBase( name, ctx, parent ),\n            m_size( size ),\n            m_index( -1 )\n        {}\n        virtual ~IndexTracker();\n\n        virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; }\n\n        static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) {\n            IndexTracker* tracker = CATCH_NULL;\n\n            ITracker& currentTracker = ctx.currentTracker();\n            if( ITracker* childTracker = currentTracker.findChild( name ) ) {\n                assert( childTracker );\n                assert( childTracker->isIndexTracker() );\n                tracker = static_cast<IndexTracker*>( childTracker );\n            }\n            else {\n                tracker = new IndexTracker( name, ctx, &currentTracker, size );\n                currentTracker.addChild( tracker );\n            }\n\n            if( !ctx.completedCycle() && !tracker->isComplete() ) {\n                if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun )\n                    tracker->moveNext();\n                tracker->open();\n            }\n\n            return *tracker;\n        }\n\n        int index() const { return m_index; }\n\n        void moveNext() {\n            m_index++;\n            m_children.clear();\n        }\n\n        virtual void close() CATCH_OVERRIDE {\n            TrackerBase::close();\n            if( m_runState == CompletedSuccessfully && m_index < m_size-1 )\n                m_runState = Executing;\n        }\n    };\n\n    inline ITracker& TrackerContext::startRun() {\n        m_rootTracker = new SectionTracker( \"{root}\", *this, CATCH_NULL );\n        m_currentTracker = CATCH_NULL;\n        m_runState = Executing;\n        return *m_rootTracker;\n    }\n\n} // namespace TestCaseTracking\n\nusing TestCaseTracking::ITracker;\nusing TestCaseTracking::TrackerContext;\nusing TestCaseTracking::SectionTracker;\nusing TestCaseTracking::IndexTracker;\n\n} // namespace Catch\n\n// #included from: catch_fatal_condition.hpp\n#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED\n\nnamespace Catch {\n\n    // Report the error condition then exit the process\n    inline void fatal( std::string const& message, int exitCode ) {\n        IContext& context = Catch::getCurrentContext();\n        IResultCapture* resultCapture = context.getResultCapture();\n        resultCapture->handleFatalErrorCondition( message );\n\n\t\tif( Catch::alwaysTrue() ) // avoids \"no return\" warnings\n            exit( exitCode );\n    }\n\n} // namespace Catch\n\n#if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////\n\nnamespace Catch {\n\n    struct FatalConditionHandler {\n\t\tvoid reset() {}\n\t};\n\n} // namespace Catch\n\n#else // Not Windows - assumed to be POSIX compatible //////////////////////////\n\n#include <signal.h>\n\nnamespace Catch {\n\n    struct SignalDefs { int id; const char* name; };\n    extern SignalDefs signalDefs[];\n    SignalDefs signalDefs[] = {\n            { SIGINT,  \"SIGINT - Terminal interrupt signal\" },\n            { SIGILL,  \"SIGILL - Illegal instruction signal\" },\n            { SIGFPE,  \"SIGFPE - Floating point error signal\" },\n            { SIGSEGV, \"SIGSEGV - Segmentation violation signal\" },\n            { SIGTERM, \"SIGTERM - Termination request signal\" },\n            { SIGABRT, \"SIGABRT - Abort (abnormal termination) signal\" }\n        };\n\n    struct FatalConditionHandler {\n\n        static void handleSignal( int sig ) {\n            for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )\n                if( sig == signalDefs[i].id )\n                    fatal( signalDefs[i].name, -sig );\n            fatal( \"<unknown signal>\", -sig );\n        }\n\n        FatalConditionHandler() : m_isSet( true ) {\n            for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )\n                signal( signalDefs[i].id, handleSignal );\n        }\n        ~FatalConditionHandler() {\n            reset();\n        }\n        void reset() {\n            if( m_isSet ) {\n                for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i )\n                    signal( signalDefs[i].id, SIG_DFL );\n                m_isSet = false;\n            }\n        }\n\n        bool m_isSet;\n    };\n\n} // namespace Catch\n\n#endif // not Windows\n\n#include <set>\n#include <string>\n\nnamespace Catch {\n\n    class StreamRedirect {\n\n    public:\n        StreamRedirect( std::ostream& stream, std::string& targetString )\n        :   m_stream( stream ),\n            m_prevBuf( stream.rdbuf() ),\n            m_targetString( targetString )\n        {\n            stream.rdbuf( m_oss.rdbuf() );\n        }\n\n        ~StreamRedirect() {\n            m_targetString += m_oss.str();\n            m_stream.rdbuf( m_prevBuf );\n        }\n\n    private:\n        std::ostream& m_stream;\n        std::streambuf* m_prevBuf;\n        std::ostringstream m_oss;\n        std::string& m_targetString;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class RunContext : public IResultCapture, public IRunner {\n\n        RunContext( RunContext const& );\n        void operator =( RunContext const& );\n\n    public:\n\n        explicit RunContext( Ptr<IConfig const> const& _config, Ptr<IStreamingReporter> const& reporter )\n        :   m_runInfo( _config->name() ),\n            m_context( getCurrentMutableContext() ),\n            m_activeTestCase( CATCH_NULL ),\n            m_config( _config ),\n            m_reporter( reporter )\n        {\n            m_context.setRunner( this );\n            m_context.setConfig( m_config );\n            m_context.setResultCapture( this );\n            m_reporter->testRunStarting( m_runInfo );\n        }\n\n        virtual ~RunContext() {\n            m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) );\n        }\n\n        void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {\n            m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) );\n        }\n        void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) {\n            m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );\n        }\n\n        Totals runTest( TestCase const& testCase ) {\n            Totals prevTotals = m_totals;\n\n            std::string redirectedCout;\n            std::string redirectedCerr;\n\n            TestCaseInfo testInfo = testCase.getTestCaseInfo();\n\n            m_reporter->testCaseStarting( testInfo );\n\n            m_activeTestCase = &testCase;\n\n            do {\n                m_trackerContext.startRun();\n                do {\n                    m_trackerContext.startCycle();\n                    m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testInfo.name );\n                    runCurrentTest( redirectedCout, redirectedCerr );\n                }\n                while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() );\n            }\n            // !TBD: deprecated - this will be replaced by indexed trackers\n            while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );\n\n            Totals deltaTotals = m_totals.delta( prevTotals );\n            if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) {\n                deltaTotals.assertions.failed++;\n                deltaTotals.testCases.passed--;\n                deltaTotals.testCases.failed++;\n            }\n            m_totals.testCases += deltaTotals.testCases;\n            m_reporter->testCaseEnded( TestCaseStats(   testInfo,\n                                                        deltaTotals,\n                                                        redirectedCout,\n                                                        redirectedCerr,\n                                                        aborting() ) );\n\n            m_activeTestCase = CATCH_NULL;\n            m_testCaseTracker = CATCH_NULL;\n\n            return deltaTotals;\n        }\n\n        Ptr<IConfig const> config() const {\n            return m_config;\n        }\n\n    private: // IResultCapture\n\n        virtual void assertionEnded( AssertionResult const& result ) {\n            if( result.getResultType() == ResultWas::Ok ) {\n                m_totals.assertions.passed++;\n            }\n            else if( !result.isOk() ) {\n                m_totals.assertions.failed++;\n            }\n\n            if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) )\n                m_messages.clear();\n\n            // Reset working state\n            m_lastAssertionInfo = AssertionInfo( \"\", m_lastAssertionInfo.lineInfo, \"{Unknown expression after the reported line}\" , m_lastAssertionInfo.resultDisposition );\n            m_lastResult = result;\n        }\n\n        virtual bool sectionStarted (\n            SectionInfo const& sectionInfo,\n            Counts& assertions\n        )\n        {\n            std::ostringstream oss;\n            oss << sectionInfo.name << \"@\" << sectionInfo.lineInfo;\n\n            ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, oss.str() );\n            if( !sectionTracker.isOpen() )\n                return false;\n            m_activeSections.push_back( &sectionTracker );\n\n            m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;\n\n            m_reporter->sectionStarting( sectionInfo );\n\n            assertions = m_totals.assertions;\n\n            return true;\n        }\n        bool testForMissingAssertions( Counts& assertions ) {\n            if( assertions.total() != 0 )\n                return false;\n            if( !m_config->warnAboutMissingAssertions() )\n                return false;\n            if( m_trackerContext.currentTracker().hasChildren() )\n                return false;\n            m_totals.assertions.failed++;\n            assertions.failed++;\n            return true;\n        }\n\n        virtual void sectionEnded( SectionEndInfo const& endInfo ) {\n            Counts assertions = m_totals.assertions - endInfo.prevAssertions;\n            bool missingAssertions = testForMissingAssertions( assertions );\n\n            if( !m_activeSections.empty() ) {\n                m_activeSections.back()->close();\n                m_activeSections.pop_back();\n            }\n\n            m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) );\n            m_messages.clear();\n        }\n\n        virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) {\n            if( m_unfinishedSections.empty() )\n                m_activeSections.back()->fail();\n            else\n                m_activeSections.back()->close();\n            m_activeSections.pop_back();\n\n            m_unfinishedSections.push_back( endInfo );\n        }\n\n        virtual void pushScopedMessage( MessageInfo const& message ) {\n            m_messages.push_back( message );\n        }\n\n        virtual void popScopedMessage( MessageInfo const& message ) {\n            m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() );\n        }\n\n        virtual std::string getCurrentTestName() const {\n            return m_activeTestCase\n                ? m_activeTestCase->getTestCaseInfo().name\n                : \"\";\n        }\n\n        virtual const AssertionResult* getLastResult() const {\n            return &m_lastResult;\n        }\n\n        virtual void handleFatalErrorCondition( std::string const& message ) {\n            ResultBuilder resultBuilder = makeUnexpectedResultBuilder();\n            resultBuilder.setResultType( ResultWas::FatalErrorCondition );\n            resultBuilder << message;\n            resultBuilder.captureExpression();\n\n            handleUnfinishedSections();\n\n            // Recreate section for test case (as we will lose the one that was in scope)\n            TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();\n            SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );\n\n            Counts assertions;\n            assertions.failed = 1;\n            SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false );\n            m_reporter->sectionEnded( testCaseSectionStats );\n\n            TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo();\n\n            Totals deltaTotals;\n            deltaTotals.testCases.failed = 1;\n            m_reporter->testCaseEnded( TestCaseStats(   testInfo,\n                                                        deltaTotals,\n                                                        \"\",\n                                                        \"\",\n                                                        false ) );\n            m_totals.testCases.failed++;\n            testGroupEnded( \"\", m_totals, 1, 1 );\n            m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) );\n        }\n\n    public:\n        // !TBD We need to do this another way!\n        bool aborting() const {\n            return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() );\n        }\n\n    private:\n\n        void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {\n            TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();\n            SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );\n            m_reporter->sectionStarting( testCaseSection );\n            Counts prevAssertions = m_totals.assertions;\n            double duration = 0;\n            try {\n                m_lastAssertionInfo = AssertionInfo( \"TEST_CASE\", testCaseInfo.lineInfo, \"\", ResultDisposition::Normal );\n\n                seedRng( *m_config );\n\n                Timer timer;\n                timer.start();\n                if( m_reporter->getPreferences().shouldRedirectStdOut ) {\n                    StreamRedirect coutRedir( Catch::cout(), redirectedCout );\n                    StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr );\n                    invokeActiveTestCase();\n                }\n                else {\n                    invokeActiveTestCase();\n                }\n                duration = timer.getElapsedSeconds();\n            }\n            catch( TestFailureException& ) {\n                // This just means the test was aborted due to failure\n            }\n            catch(...) {\n                makeUnexpectedResultBuilder().useActiveException();\n            }\n            m_testCaseTracker->close();\n            handleUnfinishedSections();\n            m_messages.clear();\n\n            Counts assertions = m_totals.assertions - prevAssertions;\n            bool missingAssertions = testForMissingAssertions( assertions );\n\n            if( testCaseInfo.okToFail() ) {\n                std::swap( assertions.failedButOk, assertions.failed );\n                m_totals.assertions.failed -= assertions.failedButOk;\n                m_totals.assertions.failedButOk += assertions.failedButOk;\n            }\n\n            SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions );\n            m_reporter->sectionEnded( testCaseSectionStats );\n        }\n\n        void invokeActiveTestCase() {\n            FatalConditionHandler fatalConditionHandler; // Handle signals\n            m_activeTestCase->invoke();\n            fatalConditionHandler.reset();\n        }\n\n    private:\n\n        ResultBuilder makeUnexpectedResultBuilder() const {\n            return ResultBuilder(   m_lastAssertionInfo.macroName.c_str(),\n                                    m_lastAssertionInfo.lineInfo,\n                                    m_lastAssertionInfo.capturedExpression.c_str(),\n                                    m_lastAssertionInfo.resultDisposition );\n        }\n\n        void handleUnfinishedSections() {\n            // If sections ended prematurely due to an exception we stored their\n            // infos here so we can tear them down outside the unwind process.\n            for( std::vector<SectionEndInfo>::const_reverse_iterator it = m_unfinishedSections.rbegin(),\n                        itEnd = m_unfinishedSections.rend();\n                    it != itEnd;\n                    ++it )\n                sectionEnded( *it );\n            m_unfinishedSections.clear();\n        }\n\n        TestRunInfo m_runInfo;\n        IMutableContext& m_context;\n        TestCase const* m_activeTestCase;\n        ITracker* m_testCaseTracker;\n        ITracker* m_currentSectionTracker;\n        AssertionResult m_lastResult;\n\n        Ptr<IConfig const> m_config;\n        Totals m_totals;\n        Ptr<IStreamingReporter> m_reporter;\n        std::vector<MessageInfo> m_messages;\n        AssertionInfo m_lastAssertionInfo;\n        std::vector<SectionEndInfo> m_unfinishedSections;\n        std::vector<ITracker*> m_activeSections;\n        TrackerContext m_trackerContext;\n    };\n\n    IResultCapture& getResultCapture() {\n        if( IResultCapture* capture = getCurrentContext().getResultCapture() )\n            return *capture;\n        else\n            throw std::logic_error( \"No result capture instance\" );\n    }\n\n} // end namespace Catch\n\n// #included from: internal/catch_version.h\n#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED\n\nnamespace Catch {\n\n    // Versioning information\n    struct Version {\n        Version(    unsigned int _majorVersion,\n                    unsigned int _minorVersion,\n                    unsigned int _patchNumber,\n                    std::string const& _branchName,\n                    unsigned int _buildNumber );\n\n        unsigned int const majorVersion;\n        unsigned int const minorVersion;\n        unsigned int const patchNumber;\n\n        // buildNumber is only used if branchName is not null\n        std::string const branchName;\n        unsigned int const buildNumber;\n\n        friend std::ostream& operator << ( std::ostream& os, Version const& version );\n\n    private:\n        void operator=( Version const& );\n    };\n\n    extern Version libraryVersion;\n}\n\n#include <fstream>\n#include <stdlib.h>\n#include <limits>\n\nnamespace Catch {\n\n    Ptr<IStreamingReporter> createReporter( std::string const& reporterName, Ptr<Config> const& config ) {\n        Ptr<IStreamingReporter> reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() );\n        if( !reporter ) {\n            std::ostringstream oss;\n            oss << \"No reporter registered with name: '\" << reporterName << \"'\";\n            throw std::domain_error( oss.str() );\n        }\n        return reporter;\n    }\n\n    Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {\n        std::vector<std::string> reporters = config->getReporterNames();\n        if( reporters.empty() )\n            reporters.push_back( \"console\" );\n\n        Ptr<IStreamingReporter> reporter;\n        for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();\n                it != itEnd;\n                ++it )\n            reporter = addReporter( reporter, createReporter( *it, config ) );\n        return reporter;\n    }\n    Ptr<IStreamingReporter> addListeners( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> reporters ) {\n        IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners();\n        for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end();\n                it != itEnd;\n                ++it )\n            reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) );\n        return reporters;\n    }\n\n    Totals runTests( Ptr<Config> const& config ) {\n\n        Ptr<IConfig const> iconfig = config.get();\n\n        Ptr<IStreamingReporter> reporter = makeReporter( config );\n        reporter = addListeners( iconfig, reporter );\n\n        RunContext context( iconfig, reporter );\n\n        Totals totals;\n\n        context.testGroupStarting( config->name(), 1, 1 );\n\n        TestSpec testSpec = config->testSpec();\n        if( !testSpec.hasFilters() )\n            testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( \"~[.]\" ).testSpec(); // All not hidden tests\n\n        std::vector<TestCase> const& allTestCases = getAllTestCasesSorted( *iconfig );\n        for( std::vector<TestCase>::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end();\n                it != itEnd;\n                ++it ) {\n            if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) )\n                totals += context.runTest( *it );\n            else\n                reporter->skipTest( *it );\n        }\n\n        context.testGroupEnded( iconfig->name(), totals, 1, 1 );\n        return totals;\n    }\n\n    void applyFilenamesAsTags( IConfig const& config ) {\n        std::vector<TestCase> const& tests = getAllTestCasesSorted( config );\n        for(std::size_t i = 0; i < tests.size(); ++i ) {\n            TestCase& test = const_cast<TestCase&>( tests[i] );\n            std::set<std::string> tags = test.tags;\n\n            std::string filename = test.lineInfo.file;\n            std::string::size_type lastSlash = filename.find_last_of( \"\\\\/\" );\n            if( lastSlash != std::string::npos )\n                filename = filename.substr( lastSlash+1 );\n\n            std::string::size_type lastDot = filename.find_last_of( \".\" );\n            if( lastDot != std::string::npos )\n                filename = filename.substr( 0, lastDot );\n\n            tags.insert( \"#\" + filename );\n            setTags( test, tags );\n        }\n    }\n\n    class Session : NonCopyable {\n        static bool alreadyInstantiated;\n\n    public:\n\n        struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; };\n\n        Session()\n        : m_cli( makeCommandLineParser() ) {\n            if( alreadyInstantiated ) {\n                std::string msg = \"Only one instance of Catch::Session can ever be used\";\n                Catch::cerr() << msg << std::endl;\n                throw std::logic_error( msg );\n            }\n            alreadyInstantiated = true;\n        }\n        ~Session() {\n            Catch::cleanUp();\n        }\n\n        void showHelp( std::string const& processName ) {\n            Catch::cout() << \"\\nCatch v\" << libraryVersion << \"\\n\";\n\n            m_cli.usage( Catch::cout(), processName );\n            Catch::cout() << \"For more detail usage please see the project docs\\n\" << std::endl;\n        }\n\n        int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {\n            try {\n                m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail );\n                m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData );\n                if( m_configData.showHelp )\n                    showHelp( m_configData.processName );\n                m_config.reset();\n            }\n            catch( std::exception& ex ) {\n                {\n                    Colour colourGuard( Colour::Red );\n                    Catch::cerr()\n                        << \"\\nError(s) in input:\\n\"\n                        << Text( ex.what(), TextAttributes().setIndent(2) )\n                        << \"\\n\\n\";\n                }\n                m_cli.usage( Catch::cout(), m_configData.processName );\n                return (std::numeric_limits<int>::max)();\n            }\n            return 0;\n        }\n\n        void useConfigData( ConfigData const& _configData ) {\n            m_configData = _configData;\n            m_config.reset();\n        }\n\n        int run( int argc, char const* const* const argv ) {\n\n            int returnCode = applyCommandLine( argc, argv );\n            if( returnCode == 0 )\n                returnCode = run();\n            return returnCode;\n        }\n\n        int run() {\n            if( m_configData.showHelp )\n                return 0;\n\n            try\n            {\n                config(); // Force config to be constructed\n\n                seedRng( *m_config );\n\n                if( m_configData.filenamesAsTags )\n                    applyFilenamesAsTags( *m_config );\n\n                // Handle list request\n                if( Option<std::size_t> listed = list( config() ) )\n                    return static_cast<int>( *listed );\n\n                return static_cast<int>( runTests( m_config ).assertions.failed );\n            }\n            catch( std::exception& ex ) {\n                Catch::cerr() << ex.what() << std::endl;\n                return (std::numeric_limits<int>::max)();\n            }\n        }\n\n        Clara::CommandLine<ConfigData> const& cli() const {\n            return m_cli;\n        }\n        std::vector<Clara::Parser::Token> const& unusedTokens() const {\n            return m_unusedTokens;\n        }\n        ConfigData& configData() {\n            return m_configData;\n        }\n        Config& config() {\n            if( !m_config )\n                m_config = new Config( m_configData );\n            return *m_config;\n        }\n    private:\n        Clara::CommandLine<ConfigData> m_cli;\n        std::vector<Clara::Parser::Token> m_unusedTokens;\n        ConfigData m_configData;\n        Ptr<Config> m_config;\n    };\n\n    bool Session::alreadyInstantiated = false;\n\n} // end namespace Catch\n\n// #included from: catch_registry_hub.hpp\n#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED\n\n// #included from: catch_test_case_registry_impl.hpp\n#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED\n\n#include <vector>\n#include <set>\n#include <sstream>\n#include <iostream>\n#include <algorithm>\n\nnamespace Catch {\n\n    struct RandomNumberGenerator {\n        typedef std::ptrdiff_t result_type;\n\n        result_type operator()( result_type n ) const { return std::rand() % n; }\n\n#ifdef CATCH_CONFIG_CPP11_SHUFFLE\n        static constexpr result_type min() { return 0; }\n        static constexpr result_type max() { return 1000000; }\n        result_type operator()() const { return std::rand() % max(); }\n#endif\n        template<typename V>\n        static void shuffle( V& vector ) {\n            RandomNumberGenerator rng;\n#ifdef CATCH_CONFIG_CPP11_SHUFFLE\n            std::shuffle( vector.begin(), vector.end(), rng );\n#else\n            std::random_shuffle( vector.begin(), vector.end(), rng );\n#endif\n        }\n    };\n\n    inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {\n\n        std::vector<TestCase> sorted = unsortedTestCases;\n\n        switch( config.runOrder() ) {\n            case RunTests::InLexicographicalOrder:\n                std::sort( sorted.begin(), sorted.end() );\n                break;\n            case RunTests::InRandomOrder:\n                {\n                    seedRng( config );\n                    RandomNumberGenerator::shuffle( sorted );\n                }\n                break;\n            case RunTests::InDeclarationOrder:\n                // already in declaration order\n                break;\n        }\n        return sorted;\n    }\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) {\n        return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() );\n    }\n\n    void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) {\n        std::set<TestCase> seenFunctions;\n        for( std::vector<TestCase>::const_iterator it = functions.begin(), itEnd = functions.end();\n            it != itEnd;\n            ++it ) {\n            std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert( *it );\n            if( !prev.second ) {\n                std::ostringstream ss;\n\n                ss  << Colour( Colour::Red )\n                    << \"error: TEST_CASE( \\\"\" << it->name << \"\\\" ) already defined.\\n\"\n                    << \"\\tFirst seen at \" << prev.first->getTestCaseInfo().lineInfo << \"\\n\"\n                    << \"\\tRedefined at \" << it->getTestCaseInfo().lineInfo << std::endl;\n\n                throw std::runtime_error(ss.str());\n            }\n        }\n    }\n\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {\n        std::vector<TestCase> filtered;\n        filtered.reserve( testCases.size() );\n        for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();\n                it != itEnd;\n                ++it )\n            if( matchTest( *it, testSpec, config ) )\n                filtered.push_back( *it );\n        return filtered;\n    }\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {\n        return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config );\n    }\n\n    class TestRegistry : public ITestCaseRegistry {\n    public:\n        TestRegistry()\n        :   m_currentSortOrder( RunTests::InDeclarationOrder ),\n            m_unnamedCount( 0 )\n        {}\n        virtual ~TestRegistry();\n\n        virtual void registerTest( TestCase const& testCase ) {\n            std::string name = testCase.getTestCaseInfo().name;\n            if( name == \"\" ) {\n                std::ostringstream oss;\n                oss << \"Anonymous test case \" << ++m_unnamedCount;\n                return registerTest( testCase.withName( oss.str() ) );\n            }\n            m_functions.push_back( testCase );\n        }\n\n        virtual std::vector<TestCase> const& getAllTests() const {\n            return m_functions;\n        }\n        virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const {\n            if( m_sortedFunctions.empty() )\n                enforceNoDuplicateTestCases( m_functions );\n\n            if(  m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) {\n                m_sortedFunctions = sortTests( config, m_functions );\n                m_currentSortOrder = config.runOrder();\n            }\n            return m_sortedFunctions;\n        }\n\n    private:\n        std::vector<TestCase> m_functions;\n        mutable RunTests::InWhatOrder m_currentSortOrder;\n        mutable std::vector<TestCase> m_sortedFunctions;\n        size_t m_unnamedCount;\n        std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class FreeFunctionTestCase : public SharedImpl<ITestCase> {\n    public:\n\n        FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {}\n\n        virtual void invoke() const {\n            m_fun();\n        }\n\n    private:\n        virtual ~FreeFunctionTestCase();\n\n        TestFunction m_fun;\n    };\n\n    inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) {\n        std::string className = classOrQualifiedMethodName;\n        if( startsWith( className, \"&\" ) )\n        {\n            std::size_t lastColons = className.rfind( \"::\" );\n            std::size_t penultimateColons = className.rfind( \"::\", lastColons-1 );\n            if( penultimateColons == std::string::npos )\n                penultimateColons = 1;\n            className = className.substr( penultimateColons, lastColons-penultimateColons );\n        }\n        return className;\n    }\n\n    void registerTestCase\n        (   ITestCase* testCase,\n            char const* classOrQualifiedMethodName,\n            NameAndDesc const& nameAndDesc,\n            SourceLineInfo const& lineInfo ) {\n\n        getMutableRegistryHub().registerTest\n            ( makeTestCase\n                (   testCase,\n                    extractClassName( classOrQualifiedMethodName ),\n                    nameAndDesc.name,\n                    nameAndDesc.description,\n                    lineInfo ) );\n    }\n    void registerTestCaseFunction\n        (   TestFunction function,\n            SourceLineInfo const& lineInfo,\n            NameAndDesc const& nameAndDesc ) {\n        registerTestCase( new FreeFunctionTestCase( function ), \"\", nameAndDesc, lineInfo );\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    AutoReg::AutoReg\n        (   TestFunction function,\n            SourceLineInfo const& lineInfo,\n            NameAndDesc const& nameAndDesc ) {\n        registerTestCaseFunction( function, lineInfo, nameAndDesc );\n    }\n\n    AutoReg::~AutoReg() {}\n\n} // end namespace Catch\n\n// #included from: catch_reporter_registry.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED\n\n#include <map>\n\nnamespace Catch {\n\n    class ReporterRegistry : public IReporterRegistry {\n\n    public:\n\n        virtual ~ReporterRegistry() CATCH_OVERRIDE {}\n\n        virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const CATCH_OVERRIDE {\n            FactoryMap::const_iterator it =  m_factories.find( name );\n            if( it == m_factories.end() )\n                return CATCH_NULL;\n            return it->second->create( ReporterConfig( config ) );\n        }\n\n        void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) {\n            m_factories.insert( std::make_pair( name, factory ) );\n        }\n        void registerListener( Ptr<IReporterFactory> const& factory ) {\n            m_listeners.push_back( factory );\n        }\n\n        virtual FactoryMap const& getFactories() const CATCH_OVERRIDE {\n            return m_factories;\n        }\n        virtual Listeners const& getListeners() const CATCH_OVERRIDE {\n            return m_listeners;\n        }\n\n    private:\n        FactoryMap m_factories;\n        Listeners m_listeners;\n    };\n}\n\n// #included from: catch_exception_translator_registry.hpp\n#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED\n\n#ifdef __OBJC__\n#import \"Foundation/Foundation.h\"\n#endif\n\nnamespace Catch {\n\n    class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {\n    public:\n        ~ExceptionTranslatorRegistry() {\n            deleteAll( m_translators );\n        }\n\n        virtual void registerTranslator( const IExceptionTranslator* translator ) {\n            m_translators.push_back( translator );\n        }\n\n        virtual std::string translateActiveException() const {\n            try {\n#ifdef __OBJC__\n                // In Objective-C try objective-c exceptions first\n                @try {\n                    return tryTranslators();\n                }\n                @catch (NSException *exception) {\n                    return Catch::toString( [exception description] );\n                }\n#else\n                return tryTranslators();\n#endif\n            }\n            catch( TestFailureException& ) {\n                throw;\n            }\n            catch( std::exception& ex ) {\n                return ex.what();\n            }\n            catch( std::string& msg ) {\n                return msg;\n            }\n            catch( const char* msg ) {\n                return msg;\n            }\n            catch(...) {\n                return \"Unknown exception\";\n            }\n        }\n\n        std::string tryTranslators() const {\n            if( m_translators.empty() )\n                throw;\n            else\n                return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() );\n        }\n\n    private:\n        std::vector<const IExceptionTranslator*> m_translators;\n    };\n}\n\nnamespace Catch {\n\n    namespace {\n\n        class RegistryHub : public IRegistryHub, public IMutableRegistryHub {\n\n            RegistryHub( RegistryHub const& );\n            void operator=( RegistryHub const& );\n\n        public: // IRegistryHub\n            RegistryHub() {\n            }\n            virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE {\n                return m_reporterRegistry;\n            }\n            virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE {\n                return m_testCaseRegistry;\n            }\n            virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE {\n                return m_exceptionTranslatorRegistry;\n            }\n\n        public: // IMutableRegistryHub\n            virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE {\n                m_reporterRegistry.registerReporter( name, factory );\n            }\n            virtual void registerListener( Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE {\n                m_reporterRegistry.registerListener( factory );\n            }\n            virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE {\n                m_testCaseRegistry.registerTest( testInfo );\n            }\n            virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE {\n                m_exceptionTranslatorRegistry.registerTranslator( translator );\n            }\n\n        private:\n            TestRegistry m_testCaseRegistry;\n            ReporterRegistry m_reporterRegistry;\n            ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;\n        };\n\n        // Single, global, instance\n        inline RegistryHub*& getTheRegistryHub() {\n            static RegistryHub* theRegistryHub = CATCH_NULL;\n            if( !theRegistryHub )\n                theRegistryHub = new RegistryHub();\n            return theRegistryHub;\n        }\n    }\n\n    IRegistryHub& getRegistryHub() {\n        return *getTheRegistryHub();\n    }\n    IMutableRegistryHub& getMutableRegistryHub() {\n        return *getTheRegistryHub();\n    }\n    void cleanUp() {\n        delete getTheRegistryHub();\n        getTheRegistryHub() = CATCH_NULL;\n        cleanUpContext();\n    }\n    std::string translateActiveException() {\n        return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();\n    }\n\n} // end namespace Catch\n\n// #included from: catch_notimplemented_exception.hpp\n#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED\n\n#include <ostream>\n\nnamespace Catch {\n\n    NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo )\n    :   m_lineInfo( lineInfo ) {\n        std::ostringstream oss;\n        oss << lineInfo << \": function \";\n        oss << \"not implemented\";\n        m_what = oss.str();\n    }\n\n    const char* NotImplementedException::what() const CATCH_NOEXCEPT {\n        return m_what.c_str();\n    }\n\n} // end namespace Catch\n\n// #included from: catch_context_impl.hpp\n#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED\n\n// #included from: catch_stream.hpp\n#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED\n\n#include <stdexcept>\n#include <cstdio>\n#include <iostream>\n\nnamespace Catch {\n\n    template<typename WriterF, size_t bufferSize=256>\n    class StreamBufImpl : public StreamBufBase {\n        char data[bufferSize];\n        WriterF m_writer;\n\n    public:\n        StreamBufImpl() {\n            setp( data, data + sizeof(data) );\n        }\n\n        ~StreamBufImpl() CATCH_NOEXCEPT {\n            sync();\n        }\n\n    private:\n        int overflow( int c ) {\n            sync();\n\n            if( c != EOF ) {\n                if( pbase() == epptr() )\n                    m_writer( std::string( 1, static_cast<char>( c ) ) );\n                else\n                    sputc( static_cast<char>( c ) );\n            }\n            return 0;\n        }\n\n        int sync() {\n            if( pbase() != pptr() ) {\n                m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );\n                setp( pbase(), epptr() );\n            }\n            return 0;\n        }\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    FileStream::FileStream( std::string const& filename ) {\n        m_ofs.open( filename.c_str() );\n        if( m_ofs.fail() ) {\n            std::ostringstream oss;\n            oss << \"Unable to open file: '\" << filename << \"'\";\n            throw std::domain_error( oss.str() );\n        }\n    }\n\n    std::ostream& FileStream::stream() const {\n        return m_ofs;\n    }\n\n    struct OutputDebugWriter {\n\n        void operator()( std::string const&str ) {\n            writeToDebugConsole( str );\n        }\n    };\n\n    DebugOutStream::DebugOutStream()\n    :   m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),\n        m_os( m_streamBuf.get() )\n    {}\n\n    std::ostream& DebugOutStream::stream() const {\n        return m_os;\n    }\n\n    // Store the streambuf from cout up-front because\n    // cout may get redirected when running tests\n    CoutStream::CoutStream()\n    :   m_os( Catch::cout().rdbuf() )\n    {}\n\n    std::ostream& CoutStream::stream() const {\n        return m_os;\n    }\n\n#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions\n    std::ostream& cout() {\n        return std::cout;\n    }\n    std::ostream& cerr() {\n        return std::cerr;\n    }\n#endif\n}\n\nnamespace Catch {\n\n    class Context : public IMutableContext {\n\n        Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {}\n        Context( Context const& );\n        void operator=( Context const& );\n\n    public:\n        virtual ~Context() {\n            deleteAllValues( m_generatorsByTestName );\n        }\n\n    public: // IContext\n        virtual IResultCapture* getResultCapture() {\n            return m_resultCapture;\n        }\n        virtual IRunner* getRunner() {\n            return m_runner;\n        }\n        virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) {\n            return getGeneratorsForCurrentTest()\n            .getGeneratorInfo( fileInfo, totalSize )\n            .getCurrentIndex();\n        }\n        virtual bool advanceGeneratorsForCurrentTest() {\n            IGeneratorsForTest* generators = findGeneratorsForCurrentTest();\n            return generators && generators->moveNext();\n        }\n\n        virtual Ptr<IConfig const> getConfig() const {\n            return m_config;\n        }\n\n    public: // IMutableContext\n        virtual void setResultCapture( IResultCapture* resultCapture ) {\n            m_resultCapture = resultCapture;\n        }\n        virtual void setRunner( IRunner* runner ) {\n            m_runner = runner;\n        }\n        virtual void setConfig( Ptr<IConfig const> const& config ) {\n            m_config = config;\n        }\n\n        friend IMutableContext& getCurrentMutableContext();\n\n    private:\n        IGeneratorsForTest* findGeneratorsForCurrentTest() {\n            std::string testName = getResultCapture()->getCurrentTestName();\n\n            std::map<std::string, IGeneratorsForTest*>::const_iterator it =\n                m_generatorsByTestName.find( testName );\n            return it != m_generatorsByTestName.end()\n                ? it->second\n                : CATCH_NULL;\n        }\n\n        IGeneratorsForTest& getGeneratorsForCurrentTest() {\n            IGeneratorsForTest* generators = findGeneratorsForCurrentTest();\n            if( !generators ) {\n                std::string testName = getResultCapture()->getCurrentTestName();\n                generators = createGeneratorsForTest();\n                m_generatorsByTestName.insert( std::make_pair( testName, generators ) );\n            }\n            return *generators;\n        }\n\n    private:\n        Ptr<IConfig const> m_config;\n        IRunner* m_runner;\n        IResultCapture* m_resultCapture;\n        std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;\n    };\n\n    namespace {\n        Context* currentContext = CATCH_NULL;\n    }\n    IMutableContext& getCurrentMutableContext() {\n        if( !currentContext )\n            currentContext = new Context();\n        return *currentContext;\n    }\n    IContext& getCurrentContext() {\n        return getCurrentMutableContext();\n    }\n\n    void cleanUpContext() {\n        delete currentContext;\n        currentContext = CATCH_NULL;\n    }\n}\n\n// #included from: catch_console_colour_impl.hpp\n#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED\n\nnamespace Catch {\n    namespace {\n\n        struct IColourImpl {\n            virtual ~IColourImpl() {}\n            virtual void use( Colour::Code _colourCode ) = 0;\n        };\n\n        struct NoColourImpl : IColourImpl {\n            void use( Colour::Code ) {}\n\n            static IColourImpl* instance() {\n                static NoColourImpl s_instance;\n                return &s_instance;\n            }\n        };\n\n    } // anon namespace\n} // namespace Catch\n\n#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )\n#   ifdef CATCH_PLATFORM_WINDOWS\n#       define CATCH_CONFIG_COLOUR_WINDOWS\n#   else\n#       define CATCH_CONFIG_COLOUR_ANSI\n#   endif\n#endif\n\n#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////\n\n// #included from: catch_windows_h_proxy.h\n\n#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED\n\n#ifdef CATCH_DEFINES_NOMINMAX\n#  define NOMINMAX\n#endif\n#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN\n#  define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifdef __AFXDLL\n#include <AfxWin.h>\n#else\n#include <windows.h>\n#endif\n\n#ifdef CATCH_DEFINES_NOMINMAX\n#  undef NOMINMAX\n#endif\n#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN\n#  undef WIN32_LEAN_AND_MEAN\n#endif\n\nnamespace Catch {\nnamespace {\n\n    class Win32ColourImpl : public IColourImpl {\n    public:\n        Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )\n        {\n            CONSOLE_SCREEN_BUFFER_INFO csbiInfo;\n            GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );\n            originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );\n            originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );\n        }\n\n        virtual void use( Colour::Code _colourCode ) {\n            switch( _colourCode ) {\n                case Colour::None:      return setTextAttribute( originalForegroundAttributes );\n                case Colour::White:     return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );\n                case Colour::Red:       return setTextAttribute( FOREGROUND_RED );\n                case Colour::Green:     return setTextAttribute( FOREGROUND_GREEN );\n                case Colour::Blue:      return setTextAttribute( FOREGROUND_BLUE );\n                case Colour::Cyan:      return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );\n                case Colour::Yellow:    return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );\n                case Colour::Grey:      return setTextAttribute( 0 );\n\n                case Colour::LightGrey:     return setTextAttribute( FOREGROUND_INTENSITY );\n                case Colour::BrightRed:     return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );\n                case Colour::BrightGreen:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );\n                case Colour::BrightWhite:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );\n\n                case Colour::Bright: throw std::logic_error( \"not a colour\" );\n            }\n        }\n\n    private:\n        void setTextAttribute( WORD _textAttribute ) {\n            SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes );\n        }\n        HANDLE stdoutHandle;\n        WORD originalForegroundAttributes;\n        WORD originalBackgroundAttributes;\n    };\n\n    IColourImpl* platformColourInstance() {\n        static Win32ColourImpl s_instance;\n\n        Ptr<IConfig const> config = getCurrentContext().getConfig();\n        UseColour::YesOrNo colourMode = config\n            ? config->useColour()\n            : UseColour::Auto;\n        if( colourMode == UseColour::Auto )\n            colourMode = !isDebuggerActive()\n                ? UseColour::Yes\n                : UseColour::No;\n        return colourMode == UseColour::Yes\n            ? &s_instance\n            : NoColourImpl::instance();\n    }\n\n} // end anon namespace\n} // end namespace Catch\n\n#elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////\n\n#include <unistd.h>\n\nnamespace Catch {\nnamespace {\n\n    // use POSIX/ ANSI console terminal codes\n    // Thanks to Adam Strzelecki for original contribution\n    // (http://github.com/nanoant)\n    // https://github.com/philsquared/Catch/pull/131\n    class PosixColourImpl : public IColourImpl {\n    public:\n        virtual void use( Colour::Code _colourCode ) {\n            switch( _colourCode ) {\n                case Colour::None:\n                case Colour::White:     return setColour( \"[0m\" );\n                case Colour::Red:       return setColour( \"[0;31m\" );\n                case Colour::Green:     return setColour( \"[0;32m\" );\n                case Colour::Blue:      return setColour( \"[0;34m\" );\n                case Colour::Cyan:      return setColour( \"[0;36m\" );\n                case Colour::Yellow:    return setColour( \"[0;33m\" );\n                case Colour::Grey:      return setColour( \"[1;30m\" );\n\n                case Colour::LightGrey:     return setColour( \"[0;37m\" );\n                case Colour::BrightRed:     return setColour( \"[1;31m\" );\n                case Colour::BrightGreen:   return setColour( \"[1;32m\" );\n                case Colour::BrightWhite:   return setColour( \"[1;37m\" );\n\n                case Colour::Bright: throw std::logic_error( \"not a colour\" );\n            }\n        }\n        static IColourImpl* instance() {\n            static PosixColourImpl s_instance;\n            return &s_instance;\n        }\n\n    private:\n        void setColour( const char* _escapeCode ) {\n            Catch::cout() << '\\033' << _escapeCode;\n        }\n    };\n\n    IColourImpl* platformColourInstance() {\n        Ptr<IConfig const> config = getCurrentContext().getConfig();\n        UseColour::YesOrNo colourMode = config\n            ? config->useColour()\n            : UseColour::Auto;\n        if( colourMode == UseColour::Auto )\n            colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) )\n                ? UseColour::Yes\n                : UseColour::No;\n        return colourMode == UseColour::Yes\n            ? PosixColourImpl::instance()\n            : NoColourImpl::instance();\n    }\n\n} // end anon namespace\n} // end namespace Catch\n\n#else  // not Windows or ANSI ///////////////////////////////////////////////\n\nnamespace Catch {\n\n    static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }\n\n} // end namespace Catch\n\n#endif // Windows/ ANSI/ None\n\nnamespace Catch {\n\n    Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); }\n    Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast<Colour&>( _other ).m_moved = true; }\n    Colour::~Colour(){ if( !m_moved ) use( None ); }\n\n    void Colour::use( Code _colourCode ) {\n        static IColourImpl* impl = platformColourInstance();\n        impl->use( _colourCode );\n    }\n\n} // end namespace Catch\n\n// #included from: catch_generators_impl.hpp\n#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED\n\n#include <vector>\n#include <string>\n#include <map>\n\nnamespace Catch {\n\n    struct GeneratorInfo : IGeneratorInfo {\n\n        GeneratorInfo( std::size_t size )\n        :   m_size( size ),\n            m_currentIndex( 0 )\n        {}\n\n        bool moveNext() {\n            if( ++m_currentIndex == m_size ) {\n                m_currentIndex = 0;\n                return false;\n            }\n            return true;\n        }\n\n        std::size_t getCurrentIndex() const {\n            return m_currentIndex;\n        }\n\n        std::size_t m_size;\n        std::size_t m_currentIndex;\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class GeneratorsForTest : public IGeneratorsForTest {\n\n    public:\n        ~GeneratorsForTest() {\n            deleteAll( m_generatorsInOrder );\n        }\n\n        IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) {\n            std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );\n            if( it == m_generatorsByName.end() ) {\n                IGeneratorInfo* info = new GeneratorInfo( size );\n                m_generatorsByName.insert( std::make_pair( fileInfo, info ) );\n                m_generatorsInOrder.push_back( info );\n                return *info;\n            }\n            return *it->second;\n        }\n\n        bool moveNext() {\n            std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin();\n            std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end();\n            for(; it != itEnd; ++it ) {\n                if( (*it)->moveNext() )\n                    return true;\n            }\n            return false;\n        }\n\n    private:\n        std::map<std::string, IGeneratorInfo*> m_generatorsByName;\n        std::vector<IGeneratorInfo*> m_generatorsInOrder;\n    };\n\n    IGeneratorsForTest* createGeneratorsForTest()\n    {\n        return new GeneratorsForTest();\n    }\n\n} // end namespace Catch\n\n// #included from: catch_assertionresult.hpp\n#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED\n\nnamespace Catch {\n\n    AssertionInfo::AssertionInfo(   std::string const& _macroName,\n                                    SourceLineInfo const& _lineInfo,\n                                    std::string const& _capturedExpression,\n                                    ResultDisposition::Flags _resultDisposition )\n    :   macroName( _macroName ),\n        lineInfo( _lineInfo ),\n        capturedExpression( _capturedExpression ),\n        resultDisposition( _resultDisposition )\n    {}\n\n    AssertionResult::AssertionResult() {}\n\n    AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )\n    :   m_info( info ),\n        m_resultData( data )\n    {}\n\n    AssertionResult::~AssertionResult() {}\n\n    // Result was a success\n    bool AssertionResult::succeeded() const {\n        return Catch::isOk( m_resultData.resultType );\n    }\n\n    // Result was a success, or failure is suppressed\n    bool AssertionResult::isOk() const {\n        return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );\n    }\n\n    ResultWas::OfType AssertionResult::getResultType() const {\n        return m_resultData.resultType;\n    }\n\n    bool AssertionResult::hasExpression() const {\n        return !m_info.capturedExpression.empty();\n    }\n\n    bool AssertionResult::hasMessage() const {\n        return !m_resultData.message.empty();\n    }\n\n    std::string AssertionResult::getExpression() const {\n        if( isFalseTest( m_info.resultDisposition ) )\n            return \"!\" + m_info.capturedExpression;\n        else\n            return m_info.capturedExpression;\n    }\n    std::string AssertionResult::getExpressionInMacro() const {\n        if( m_info.macroName.empty() )\n            return m_info.capturedExpression;\n        else\n            return m_info.macroName + \"( \" + m_info.capturedExpression + \" )\";\n    }\n\n    bool AssertionResult::hasExpandedExpression() const {\n        return hasExpression() && getExpandedExpression() != getExpression();\n    }\n\n    std::string AssertionResult::getExpandedExpression() const {\n        return m_resultData.reconstructedExpression;\n    }\n\n    std::string AssertionResult::getMessage() const {\n        return m_resultData.message;\n    }\n    SourceLineInfo AssertionResult::getSourceInfo() const {\n        return m_info.lineInfo;\n    }\n\n    std::string AssertionResult::getTestMacroName() const {\n        return m_info.macroName;\n    }\n\n} // end namespace Catch\n\n// #included from: catch_test_case_info.hpp\n#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED\n\nnamespace Catch {\n\n    inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {\n        if( startsWith( tag, \".\" ) ||\n            tag == \"hide\" ||\n            tag == \"!hide\" )\n            return TestCaseInfo::IsHidden;\n        else if( tag == \"!throws\" )\n            return TestCaseInfo::Throws;\n        else if( tag == \"!shouldfail\" )\n            return TestCaseInfo::ShouldFail;\n        else if( tag == \"!mayfail\" )\n            return TestCaseInfo::MayFail;\n        else\n            return TestCaseInfo::None;\n    }\n    inline bool isReservedTag( std::string const& tag ) {\n        return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] );\n    }\n    inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {\n        if( isReservedTag( tag ) ) {\n            {\n                Colour colourGuard( Colour::Red );\n                Catch::cerr()\n                    << \"Tag name [\" << tag << \"] not allowed.\\n\"\n                    << \"Tag names starting with non alpha-numeric characters are reserved\\n\";\n            }\n            {\n                Colour colourGuard( Colour::FileName );\n                Catch::cerr() << _lineInfo << std::endl;\n            }\n            exit(1);\n        }\n    }\n\n    TestCase makeTestCase(  ITestCase* _testCase,\n                            std::string const& _className,\n                            std::string const& _name,\n                            std::string const& _descOrTags,\n                            SourceLineInfo const& _lineInfo )\n    {\n        bool isHidden( startsWith( _name, \"./\" ) ); // Legacy support\n\n        // Parse out tags\n        std::set<std::string> tags;\n        std::string desc, tag;\n        bool inTag = false;\n        for( std::size_t i = 0; i < _descOrTags.size(); ++i ) {\n            char c = _descOrTags[i];\n            if( !inTag ) {\n                if( c == '[' )\n                    inTag = true;\n                else\n                    desc += c;\n            }\n            else {\n                if( c == ']' ) {\n                    TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );\n                    if( prop == TestCaseInfo::IsHidden )\n                        isHidden = true;\n                    else if( prop == TestCaseInfo::None )\n                        enforceNotReservedTag( tag, _lineInfo );\n\n                    tags.insert( tag );\n                    tag.clear();\n                    inTag = false;\n                }\n                else\n                    tag += c;\n            }\n        }\n        if( isHidden ) {\n            tags.insert( \"hide\" );\n            tags.insert( \".\" );\n        }\n\n        TestCaseInfo info( _name, _className, desc, tags, _lineInfo );\n        return TestCase( _testCase, info );\n    }\n\n    void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags )\n    {\n        testCaseInfo.tags = tags;\n        testCaseInfo.lcaseTags.clear();\n\n        std::ostringstream oss;\n        for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) {\n            oss << \"[\" << *it << \"]\";\n            std::string lcaseTag = toLower( *it );\n            testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) );\n            testCaseInfo.lcaseTags.insert( lcaseTag );\n        }\n        testCaseInfo.tagsAsString = oss.str();\n    }\n\n    TestCaseInfo::TestCaseInfo( std::string const& _name,\n                                std::string const& _className,\n                                std::string const& _description,\n                                std::set<std::string> const& _tags,\n                                SourceLineInfo const& _lineInfo )\n    :   name( _name ),\n        className( _className ),\n        description( _description ),\n        lineInfo( _lineInfo ),\n        properties( None )\n    {\n        setTags( *this, _tags );\n    }\n\n    TestCaseInfo::TestCaseInfo( TestCaseInfo const& other )\n    :   name( other.name ),\n        className( other.className ),\n        description( other.description ),\n        tags( other.tags ),\n        lcaseTags( other.lcaseTags ),\n        tagsAsString( other.tagsAsString ),\n        lineInfo( other.lineInfo ),\n        properties( other.properties )\n    {}\n\n    bool TestCaseInfo::isHidden() const {\n        return ( properties & IsHidden ) != 0;\n    }\n    bool TestCaseInfo::throws() const {\n        return ( properties & Throws ) != 0;\n    }\n    bool TestCaseInfo::okToFail() const {\n        return ( properties & (ShouldFail | MayFail ) ) != 0;\n    }\n    bool TestCaseInfo::expectedToFail() const {\n        return ( properties & (ShouldFail ) ) != 0;\n    }\n\n    TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}\n\n    TestCase::TestCase( TestCase const& other )\n    :   TestCaseInfo( other ),\n        test( other.test )\n    {}\n\n    TestCase TestCase::withName( std::string const& _newName ) const {\n        TestCase other( *this );\n        other.name = _newName;\n        return other;\n    }\n\n    void TestCase::swap( TestCase& other ) {\n        test.swap( other.test );\n        name.swap( other.name );\n        className.swap( other.className );\n        description.swap( other.description );\n        tags.swap( other.tags );\n        lcaseTags.swap( other.lcaseTags );\n        tagsAsString.swap( other.tagsAsString );\n        std::swap( TestCaseInfo::properties, static_cast<TestCaseInfo&>( other ).properties );\n        std::swap( lineInfo, other.lineInfo );\n    }\n\n    void TestCase::invoke() const {\n        test->invoke();\n    }\n\n    bool TestCase::operator == ( TestCase const& other ) const {\n        return  test.get() == other.test.get() &&\n                name == other.name &&\n                className == other.className;\n    }\n\n    bool TestCase::operator < ( TestCase const& other ) const {\n        return name < other.name;\n    }\n    TestCase& TestCase::operator = ( TestCase const& other ) {\n        TestCase temp( other );\n        swap( temp );\n        return *this;\n    }\n\n    TestCaseInfo const& TestCase::getTestCaseInfo() const\n    {\n        return *this;\n    }\n\n} // end namespace Catch\n\n// #included from: catch_version.hpp\n#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED\n\nnamespace Catch {\n\n    Version::Version\n        (   unsigned int _majorVersion,\n            unsigned int _minorVersion,\n            unsigned int _patchNumber,\n            std::string const& _branchName,\n            unsigned int _buildNumber )\n    :   majorVersion( _majorVersion ),\n        minorVersion( _minorVersion ),\n        patchNumber( _patchNumber ),\n        branchName( _branchName ),\n        buildNumber( _buildNumber )\n    {}\n\n    std::ostream& operator << ( std::ostream& os, Version const& version ) {\n        os  << version.majorVersion << \".\"\n            << version.minorVersion << \".\"\n            << version.patchNumber;\n\n        if( !version.branchName.empty() ) {\n            os  << \"-\" << version.branchName\n                << \".\" << version.buildNumber;\n        }\n        return os;\n    }\n\n    Version libraryVersion( 1, 6, 1, \"\", 0 );\n\n}\n\n// #included from: catch_message.hpp\n#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED\n\nnamespace Catch {\n\n    MessageInfo::MessageInfo(   std::string const& _macroName,\n                                SourceLineInfo const& _lineInfo,\n                                ResultWas::OfType _type )\n    :   macroName( _macroName ),\n        lineInfo( _lineInfo ),\n        type( _type ),\n        sequence( ++globalCount )\n    {}\n\n    // This may need protecting if threading support is added\n    unsigned int MessageInfo::globalCount = 0;\n\n    ////////////////////////////////////////////////////////////////////////////\n\n    ScopedMessage::ScopedMessage( MessageBuilder const& builder )\n    : m_info( builder.m_info )\n    {\n        m_info.message = builder.m_stream.str();\n        getResultCapture().pushScopedMessage( m_info );\n    }\n    ScopedMessage::ScopedMessage( ScopedMessage const& other )\n    : m_info( other.m_info )\n    {}\n\n    ScopedMessage::~ScopedMessage() {\n        getResultCapture().popScopedMessage( m_info );\n    }\n\n} // end namespace Catch\n\n// #included from: catch_legacy_reporter_adapter.hpp\n#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED\n\n// #included from: catch_legacy_reporter_adapter.h\n#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED\n\nnamespace Catch\n{\n    // Deprecated\n    struct IReporter : IShared {\n        virtual ~IReporter();\n\n        virtual bool shouldRedirectStdout() const = 0;\n\n        virtual void StartTesting() = 0;\n        virtual void EndTesting( Totals const& totals ) = 0;\n        virtual void StartGroup( std::string const& groupName ) = 0;\n        virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0;\n        virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0;\n        virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0;\n        virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0;\n        virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0;\n        virtual void NoAssertionsInSection( std::string const& sectionName ) = 0;\n        virtual void NoAssertionsInTestCase( std::string const& testName ) = 0;\n        virtual void Aborted() = 0;\n        virtual void Result( AssertionResult const& result ) = 0;\n    };\n\n    class LegacyReporterAdapter : public SharedImpl<IStreamingReporter>\n    {\n    public:\n        LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter );\n        virtual ~LegacyReporterAdapter();\n\n        virtual ReporterPreferences getPreferences() const;\n        virtual void noMatchingTestCases( std::string const& );\n        virtual void testRunStarting( TestRunInfo const& );\n        virtual void testGroupStarting( GroupInfo const& groupInfo );\n        virtual void testCaseStarting( TestCaseInfo const& testInfo );\n        virtual void sectionStarting( SectionInfo const& sectionInfo );\n        virtual void assertionStarting( AssertionInfo const& );\n        virtual bool assertionEnded( AssertionStats const& assertionStats );\n        virtual void sectionEnded( SectionStats const& sectionStats );\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats );\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats );\n        virtual void testRunEnded( TestRunStats const& testRunStats );\n        virtual void skipTest( TestCaseInfo const& );\n\n    private:\n        Ptr<IReporter> m_legacyReporter;\n    };\n}\n\nnamespace Catch\n{\n    LegacyReporterAdapter::LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter )\n    :   m_legacyReporter( legacyReporter )\n    {}\n    LegacyReporterAdapter::~LegacyReporterAdapter() {}\n\n    ReporterPreferences LegacyReporterAdapter::getPreferences() const {\n        ReporterPreferences prefs;\n        prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout();\n        return prefs;\n    }\n\n    void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {}\n    void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) {\n        m_legacyReporter->StartTesting();\n    }\n    void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) {\n        m_legacyReporter->StartGroup( groupInfo.name );\n    }\n    void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) {\n        m_legacyReporter->StartTestCase( testInfo );\n    }\n    void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) {\n        m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description );\n    }\n    void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) {\n        // Not on legacy interface\n    }\n\n    bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) {\n        if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {\n            for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();\n                    it != itEnd;\n                    ++it ) {\n                if( it->type == ResultWas::Info ) {\n                    ResultBuilder rb( it->macroName.c_str(), it->lineInfo, \"\", ResultDisposition::Normal );\n                    rb << it->message;\n                    rb.setResultType( ResultWas::Info );\n                    AssertionResult result = rb.build();\n                    m_legacyReporter->Result( result );\n                }\n            }\n        }\n        m_legacyReporter->Result( assertionStats.assertionResult );\n        return true;\n    }\n    void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) {\n        if( sectionStats.missingAssertions )\n            m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name );\n        m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions );\n    }\n    void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        m_legacyReporter->EndTestCase\n            (   testCaseStats.testInfo,\n                testCaseStats.totals,\n                testCaseStats.stdOut,\n                testCaseStats.stdErr );\n    }\n    void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        if( testGroupStats.aborting )\n            m_legacyReporter->Aborted();\n        m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals );\n    }\n    void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) {\n        m_legacyReporter->EndTesting( testRunStats.totals );\n    }\n    void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) {\n    }\n}\n\n// #included from: catch_timer.hpp\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wc++11-long-long\"\n#endif\n\n#ifdef CATCH_PLATFORM_WINDOWS\n#else\n#include <sys/time.h>\n#endif\n\nnamespace Catch {\n\n    namespace {\n#ifdef CATCH_PLATFORM_WINDOWS\n        uint64_t getCurrentTicks() {\n            static uint64_t hz=0, hzo=0;\n            if (!hz) {\n                QueryPerformanceFrequency( reinterpret_cast<LARGE_INTEGER*>( &hz ) );\n                QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &hzo ) );\n            }\n            uint64_t t;\n            QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &t ) );\n            return ((t-hzo)*1000000)/hz;\n        }\n#else\n        uint64_t getCurrentTicks() {\n            timeval t;\n            gettimeofday(&t,CATCH_NULL);\n            return static_cast<uint64_t>( t.tv_sec ) * 1000000ull + static_cast<uint64_t>( t.tv_usec );\n        }\n#endif\n    }\n\n    void Timer::start() {\n        m_ticks = getCurrentTicks();\n    }\n    unsigned int Timer::getElapsedMicroseconds() const {\n        return static_cast<unsigned int>(getCurrentTicks() - m_ticks);\n    }\n    unsigned int Timer::getElapsedMilliseconds() const {\n        return static_cast<unsigned int>(getElapsedMicroseconds()/1000);\n    }\n    double Timer::getElapsedSeconds() const {\n        return getElapsedMicroseconds()/1000000.0;\n    }\n\n} // namespace Catch\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n// #included from: catch_common.hpp\n#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED\n\nnamespace Catch {\n\n    bool startsWith( std::string const& s, std::string const& prefix ) {\n        return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix;\n    }\n    bool endsWith( std::string const& s, std::string const& suffix ) {\n        return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix;\n    }\n    bool contains( std::string const& s, std::string const& infix ) {\n        return s.find( infix ) != std::string::npos;\n    }\n    char toLowerCh(char c) {\n        return static_cast<char>( ::tolower( c ) );\n    }\n    void toLowerInPlace( std::string& s ) {\n        std::transform( s.begin(), s.end(), s.begin(), toLowerCh );\n    }\n    std::string toLower( std::string const& s ) {\n        std::string lc = s;\n        toLowerInPlace( lc );\n        return lc;\n    }\n    std::string trim( std::string const& str ) {\n        static char const* whitespaceChars = \"\\n\\r\\t \";\n        std::string::size_type start = str.find_first_not_of( whitespaceChars );\n        std::string::size_type end = str.find_last_not_of( whitespaceChars );\n\n        return start != std::string::npos ? str.substr( start, 1+end-start ) : \"\";\n    }\n\n    bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {\n        bool replaced = false;\n        std::size_t i = str.find( replaceThis );\n        while( i != std::string::npos ) {\n            replaced = true;\n            str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );\n            if( i < str.size()-withThis.size() )\n                i = str.find( replaceThis, i+withThis.size() );\n            else\n                i = std::string::npos;\n        }\n        return replaced;\n    }\n\n    pluralise::pluralise( std::size_t count, std::string const& label )\n    :   m_count( count ),\n        m_label( label )\n    {}\n\n    std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {\n        os << pluraliser.m_count << \" \" << pluraliser.m_label;\n        if( pluraliser.m_count != 1 )\n            os << \"s\";\n        return os;\n    }\n\n    SourceLineInfo::SourceLineInfo() : line( 0 ){}\n    SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line )\n    :   file( _file ),\n        line( _line )\n    {}\n    SourceLineInfo::SourceLineInfo( SourceLineInfo const& other )\n    :   file( other.file ),\n        line( other.line )\n    {}\n    bool SourceLineInfo::empty() const {\n        return file.empty();\n    }\n    bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const {\n        return line == other.line && file == other.file;\n    }\n    bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const {\n        return line < other.line || ( line == other.line  && file < other.file );\n    }\n\n    void seedRng( IConfig const& config ) {\n        if( config.rngSeed() != 0 )\n            std::srand( config.rngSeed() );\n    }\n    unsigned int rngSeed() {\n        return getCurrentContext().getConfig()->rngSeed();\n    }\n\n    std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {\n#ifndef __GNUG__\n        os << info.file << \"(\" << info.line << \")\";\n#else\n        os << info.file << \":\" << info.line;\n#endif\n        return os;\n    }\n\n    void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) {\n        std::ostringstream oss;\n        oss << locationInfo << \": Internal Catch error: '\" << message << \"'\";\n        if( alwaysTrue() )\n            throw std::logic_error( oss.str() );\n    }\n}\n\n// #included from: catch_section.hpp\n#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED\n\nnamespace Catch {\n\n    SectionInfo::SectionInfo\n        (   SourceLineInfo const& _lineInfo,\n            std::string const& _name,\n            std::string const& _description )\n    :   name( _name ),\n        description( _description ),\n        lineInfo( _lineInfo )\n    {}\n\n    Section::Section( SectionInfo const& info )\n    :   m_info( info ),\n        m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )\n    {\n        m_timer.start();\n    }\n\n    Section::~Section() {\n        if( m_sectionIncluded ) {\n            SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() );\n            if( std::uncaught_exception() )\n                getResultCapture().sectionEndedEarly( endInfo );\n            else\n                getResultCapture().sectionEnded( endInfo );\n        }\n    }\n\n    // This indicates whether the section should be executed or not\n    Section::operator bool() const {\n        return m_sectionIncluded;\n    }\n\n} // end namespace Catch\n\n// #included from: catch_debugger.hpp\n#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED\n\n#include <iostream>\n\n#ifdef CATCH_PLATFORM_MAC\n\n    #include <assert.h>\n    #include <stdbool.h>\n    #include <sys/types.h>\n    #include <unistd.h>\n    #include <sys/sysctl.h>\n\n    namespace Catch{\n\n        // The following function is taken directly from the following technical note:\n        // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html\n\n        // Returns true if the current process is being debugged (either\n        // running under the debugger or has a debugger attached post facto).\n        bool isDebuggerActive(){\n\n            int                 mib[4];\n            struct kinfo_proc   info;\n            size_t              size;\n\n            // Initialize the flags so that, if sysctl fails for some bizarre\n            // reason, we get a predictable result.\n\n            info.kp_proc.p_flag = 0;\n\n            // Initialize mib, which tells sysctl the info we want, in this case\n            // we're looking for information about a specific process ID.\n\n            mib[0] = CTL_KERN;\n            mib[1] = KERN_PROC;\n            mib[2] = KERN_PROC_PID;\n            mib[3] = getpid();\n\n            // Call sysctl.\n\n            size = sizeof(info);\n            if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) {\n                Catch::cerr() << \"\\n** Call to sysctl failed - unable to determine if debugger is active **\\n\" << std::endl;\n                return false;\n            }\n\n            // We're being debugged if the P_TRACED flag is set.\n\n            return ( (info.kp_proc.p_flag & P_TRACED) != 0 );\n        }\n    } // namespace Catch\n\n#elif defined(CATCH_PLATFORM_LINUX)\n    #include <fstream>\n    #include <string>\n\n    namespace Catch{\n        // The standard POSIX way of detecting a debugger is to attempt to\n        // ptrace() the process, but this needs to be done from a child and not\n        // this process itself to still allow attaching to this process later\n        // if wanted, so is rather heavy. Under Linux we have the PID of the\n        // \"debugger\" (which doesn't need to be gdb, of course, it could also\n        // be strace, for example) in /proc/$PID/status, so just get it from\n        // there instead.\n        bool isDebuggerActive(){\n            std::ifstream in(\"/proc/self/status\");\n            for( std::string line; std::getline(in, line); ) {\n                static const int PREFIX_LEN = 11;\n                if( line.compare(0, PREFIX_LEN, \"TracerPid:\\t\") == 0 ) {\n                    // We're traced if the PID is not 0 and no other PID starts\n                    // with 0 digit, so it's enough to check for just a single\n                    // character.\n                    return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';\n                }\n            }\n\n            return false;\n        }\n    } // namespace Catch\n#elif defined(_MSC_VER)\n    extern \"C\" __declspec(dllimport) int __stdcall IsDebuggerPresent();\n    namespace Catch {\n        bool isDebuggerActive() {\n            return IsDebuggerPresent() != 0;\n        }\n    }\n#elif defined(__MINGW32__)\n    extern \"C\" __declspec(dllimport) int __stdcall IsDebuggerPresent();\n    namespace Catch {\n        bool isDebuggerActive() {\n            return IsDebuggerPresent() != 0;\n        }\n    }\n#else\n    namespace Catch {\n       inline bool isDebuggerActive() { return false; }\n    }\n#endif // Platform\n\n#ifdef CATCH_PLATFORM_WINDOWS\n    extern \"C\" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* );\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            ::OutputDebugStringA( text.c_str() );\n        }\n    }\n#else\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            // !TBD: Need a version for Mac/ XCode and other IDEs\n            Catch::cout() << text;\n        }\n    }\n#endif // Platform\n\n// #included from: catch_tostring.hpp\n#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED\n\nnamespace Catch {\n\nnamespace Detail {\n\n    const std::string unprintableString = \"{?}\";\n\n    namespace {\n        const int hexThreshold = 255;\n\n        struct Endianness {\n            enum Arch { Big, Little };\n\n            static Arch which() {\n                union _{\n                    int asInt;\n                    char asChar[sizeof (int)];\n                } u;\n\n                u.asInt = 1;\n                return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little;\n            }\n        };\n    }\n\n    std::string rawMemoryToString( const void *object, std::size_t size )\n    {\n        // Reverse order for little endian architectures\n        int i = 0, end = static_cast<int>( size ), inc = 1;\n        if( Endianness::which() == Endianness::Little ) {\n            i = end-1;\n            end = inc = -1;\n        }\n\n        unsigned char const *bytes = static_cast<unsigned char const *>(object);\n        std::ostringstream os;\n        os << \"0x\" << std::setfill('0') << std::hex;\n        for( ; i != end; i += inc )\n             os << std::setw(2) << static_cast<unsigned>(bytes[i]);\n       return os.str();\n    }\n}\n\nstd::string toString( std::string const& value ) {\n    std::string s = value;\n    if( getCurrentContext().getConfig()->showInvisibles() ) {\n        for(size_t i = 0; i < s.size(); ++i ) {\n            std::string subs;\n            switch( s[i] ) {\n            case '\\n': subs = \"\\\\n\"; break;\n            case '\\t': subs = \"\\\\t\"; break;\n            default: break;\n            }\n            if( !subs.empty() ) {\n                s = s.substr( 0, i ) + subs + s.substr( i+1 );\n                ++i;\n            }\n        }\n    }\n    return \"\\\"\" + s + \"\\\"\";\n}\nstd::string toString( std::wstring const& value ) {\n\n    std::string s;\n    s.reserve( value.size() );\n    for(size_t i = 0; i < value.size(); ++i )\n        s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?';\n    return Catch::toString( s );\n}\n\nstd::string toString( const char* const value ) {\n    return value ? Catch::toString( std::string( value ) ) : std::string( \"{null string}\" );\n}\n\nstd::string toString( char* const value ) {\n    return Catch::toString( static_cast<const char*>( value ) );\n}\n\nstd::string toString( const wchar_t* const value )\n{\n\treturn value ? Catch::toString( std::wstring(value) ) : std::string( \"{null string}\" );\n}\n\nstd::string toString( wchar_t* const value )\n{\n\treturn Catch::toString( static_cast<const wchar_t*>( value ) );\n}\n\nstd::string toString( int value ) {\n    std::ostringstream oss;\n    oss << value;\n    if( value > Detail::hexThreshold )\n        oss << \" (0x\" << std::hex << value << \")\";\n    return oss.str();\n}\n\nstd::string toString( unsigned long value ) {\n    std::ostringstream oss;\n    oss << value;\n    if( value > Detail::hexThreshold )\n        oss << \" (0x\" << std::hex << value << \")\";\n    return oss.str();\n}\n\nstd::string toString( unsigned int value ) {\n    return Catch::toString( static_cast<unsigned long>( value ) );\n}\n\ntemplate<typename T>\nstd::string fpToString( T value, int precision ) {\n    std::ostringstream oss;\n    oss << std::setprecision( precision )\n        << std::fixed\n        << value;\n    std::string d = oss.str();\n    std::size_t i = d.find_last_not_of( '0' );\n    if( i != std::string::npos && i != d.size()-1 ) {\n        if( d[i] == '.' )\n            i++;\n        d = d.substr( 0, i+1 );\n    }\n    return d;\n}\n\nstd::string toString( const double value ) {\n    return fpToString( value, 10 );\n}\nstd::string toString( const float value ) {\n    return fpToString( value, 5 ) + \"f\";\n}\n\nstd::string toString( bool value ) {\n    return value ? \"true\" : \"false\";\n}\n\nstd::string toString( char value ) {\n    return value < ' '\n        ? toString( static_cast<unsigned int>( value ) )\n        : Detail::makeString( value );\n}\n\nstd::string toString( signed char value ) {\n    return toString( static_cast<char>( value ) );\n}\n\nstd::string toString( unsigned char value ) {\n    return toString( static_cast<char>( value ) );\n}\n\n#ifdef CATCH_CONFIG_CPP11_LONG_LONG\nstd::string toString( long long value ) {\n    std::ostringstream oss;\n    oss << value;\n    if( value > Detail::hexThreshold )\n        oss << \" (0x\" << std::hex << value << \")\";\n    return oss.str();\n}\nstd::string toString( unsigned long long value ) {\n    std::ostringstream oss;\n    oss << value;\n    if( value > Detail::hexThreshold )\n        oss << \" (0x\" << std::hex << value << \")\";\n    return oss.str();\n}\n#endif\n\n#ifdef CATCH_CONFIG_CPP11_NULLPTR\nstd::string toString( std::nullptr_t ) {\n    return \"nullptr\";\n}\n#endif\n\n#ifdef __OBJC__\n    std::string toString( NSString const * const& nsstring ) {\n        if( !nsstring )\n            return \"nil\";\n        return \"@\" + toString([nsstring UTF8String]);\n    }\n    std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {\n        if( !nsstring )\n            return \"nil\";\n        return \"@\" + toString([nsstring UTF8String]);\n    }\n    std::string toString( NSObject* const& nsObject ) {\n        return toString( [nsObject description] );\n    }\n#endif\n\n} // end namespace Catch\n\n// #included from: catch_result_builder.hpp\n#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED\n\nnamespace Catch {\n\n    std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) {\n        return secondArg.empty() || secondArg == \"\\\"\\\"\"\n            ? capturedExpression\n            : capturedExpression + \", \" + secondArg;\n    }\n    ResultBuilder::ResultBuilder(   char const* macroName,\n                                    SourceLineInfo const& lineInfo,\n                                    char const* capturedExpression,\n                                    ResultDisposition::Flags resultDisposition,\n                                    char const* secondArg )\n    :   m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ),\n        m_shouldDebugBreak( false ),\n        m_shouldThrow( false )\n    {}\n\n    ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) {\n        m_data.resultType = result;\n        return *this;\n    }\n    ResultBuilder& ResultBuilder::setResultType( bool result ) {\n        m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed;\n        return *this;\n    }\n    ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) {\n        m_exprComponents.lhs = lhs;\n        return *this;\n    }\n    ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) {\n        m_exprComponents.rhs = rhs;\n        return *this;\n    }\n    ResultBuilder& ResultBuilder::setOp( std::string const& op ) {\n        m_exprComponents.op = op;\n        return *this;\n    }\n\n    void ResultBuilder::endExpression() {\n        m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition );\n        captureExpression();\n    }\n\n    void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {\n        m_assertionInfo.resultDisposition = resultDisposition;\n        m_stream.oss << Catch::translateActiveException();\n        captureResult( ResultWas::ThrewException );\n    }\n\n    void ResultBuilder::captureResult( ResultWas::OfType resultType ) {\n        setResultType( resultType );\n        captureExpression();\n    }\n    void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) {\n        if( expectedMessage.empty() )\n            captureExpectedException( Matchers::Impl::Generic::AllOf<std::string>() );\n        else\n            captureExpectedException( Matchers::Equals( expectedMessage ) );\n    }\n\n    void ResultBuilder::captureExpectedException( Matchers::Impl::Matcher<std::string> const& matcher ) {\n\n        assert( m_exprComponents.testFalse == false );\n        AssertionResultData data = m_data;\n        data.resultType = ResultWas::Ok;\n        data.reconstructedExpression = m_assertionInfo.capturedExpression;\n\n        std::string actualMessage = Catch::translateActiveException();\n        if( !matcher.match( actualMessage ) ) {\n            data.resultType = ResultWas::ExpressionFailed;\n            data.reconstructedExpression = actualMessage;\n        }\n        AssertionResult result( m_assertionInfo, data );\n        handleResult( result );\n    }\n\n    void ResultBuilder::captureExpression() {\n        AssertionResult result = build();\n        handleResult( result );\n    }\n    void ResultBuilder::handleResult( AssertionResult const& result )\n    {\n        getResultCapture().assertionEnded( result );\n\n        if( !result.isOk() ) {\n            if( getCurrentContext().getConfig()->shouldDebugBreak() )\n                m_shouldDebugBreak = true;\n            if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) )\n                m_shouldThrow = true;\n        }\n    }\n    void ResultBuilder::react() {\n        if( m_shouldThrow )\n            throw Catch::TestFailureException();\n    }\n\n    bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; }\n    bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); }\n\n    AssertionResult ResultBuilder::build() const\n    {\n        assert( m_data.resultType != ResultWas::Unknown );\n\n        AssertionResultData data = m_data;\n\n        // Flip bool results if testFalse is set\n        if( m_exprComponents.testFalse ) {\n            if( data.resultType == ResultWas::Ok )\n                data.resultType = ResultWas::ExpressionFailed;\n            else if( data.resultType == ResultWas::ExpressionFailed )\n                data.resultType = ResultWas::Ok;\n        }\n\n        data.message = m_stream.oss.str();\n        data.reconstructedExpression = reconstructExpression();\n        if( m_exprComponents.testFalse ) {\n            if( m_exprComponents.op == \"\" )\n                data.reconstructedExpression = \"!\" + data.reconstructedExpression;\n            else\n                data.reconstructedExpression = \"!(\" + data.reconstructedExpression + \")\";\n        }\n        return AssertionResult( m_assertionInfo, data );\n    }\n    std::string ResultBuilder::reconstructExpression() const {\n        if( m_exprComponents.op == \"\" )\n            return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.lhs;\n        else if( m_exprComponents.op == \"matches\" )\n            return m_exprComponents.lhs + \" \" + m_exprComponents.rhs;\n        else if( m_exprComponents.op != \"!\" ) {\n            if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 &&\n                m_exprComponents.lhs.find(\"\\n\") == std::string::npos &&\n                m_exprComponents.rhs.find(\"\\n\") == std::string::npos )\n                return m_exprComponents.lhs + \" \" + m_exprComponents.op + \" \" + m_exprComponents.rhs;\n            else\n                return m_exprComponents.lhs + \"\\n\" + m_exprComponents.op + \"\\n\" + m_exprComponents.rhs;\n        }\n        else\n            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}\";\n    }\n\n} // end namespace Catch\n\n// #included from: catch_tag_alias_registry.hpp\n#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED\n\n// #included from: catch_tag_alias_registry.h\n#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED\n\n#include <map>\n\nnamespace Catch {\n\n    class TagAliasRegistry : public ITagAliasRegistry {\n    public:\n        virtual ~TagAliasRegistry();\n        virtual Option<TagAlias> find( std::string const& alias ) const;\n        virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const;\n        void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo );\n        static TagAliasRegistry& get();\n\n    private:\n        std::map<std::string, TagAlias> m_registry;\n    };\n\n} // end namespace Catch\n\n#include <map>\n#include <iostream>\n\nnamespace Catch {\n\n    TagAliasRegistry::~TagAliasRegistry() {}\n\n    Option<TagAlias> TagAliasRegistry::find( std::string const& alias ) const {\n        std::map<std::string, TagAlias>::const_iterator it = m_registry.find( alias );\n        if( it != m_registry.end() )\n            return it->second;\n        else\n            return Option<TagAlias>();\n    }\n\n    std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {\n        std::string expandedTestSpec = unexpandedTestSpec;\n        for( std::map<std::string, TagAlias>::const_iterator it = m_registry.begin(), itEnd = m_registry.end();\n                it != itEnd;\n                ++it ) {\n            std::size_t pos = expandedTestSpec.find( it->first );\n            if( pos != std::string::npos ) {\n                expandedTestSpec =  expandedTestSpec.substr( 0, pos ) +\n                                    it->second.tag +\n                                    expandedTestSpec.substr( pos + it->first.size() );\n            }\n        }\n        return expandedTestSpec;\n    }\n\n    void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {\n\n        if( !startsWith( alias, \"[@\" ) || !endsWith( alias, \"]\" ) ) {\n            std::ostringstream oss;\n            oss << \"error: tag alias, \\\"\" << alias << \"\\\" is not of the form [@alias name].\\n\" << lineInfo;\n            throw std::domain_error( oss.str().c_str() );\n        }\n        if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) {\n            std::ostringstream oss;\n            oss << \"error: tag alias, \\\"\" << alias << \"\\\" already registered.\\n\"\n                << \"\\tFirst seen at \" << find(alias)->lineInfo << \"\\n\"\n                << \"\\tRedefined at \" << lineInfo;\n            throw std::domain_error( oss.str().c_str() );\n        }\n    }\n\n    TagAliasRegistry& TagAliasRegistry::get() {\n        static TagAliasRegistry instance;\n        return instance;\n\n    }\n\n    ITagAliasRegistry::~ITagAliasRegistry() {}\n    ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); }\n\n    RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {\n        try {\n            TagAliasRegistry::get().add( alias, tag, lineInfo );\n        }\n        catch( std::exception& ex ) {\n            Colour colourGuard( Colour::Red );\n            Catch::cerr() << ex.what() << std::endl;\n            exit(1);\n        }\n    }\n\n} // end namespace Catch\n\n// #included from: ../reporters/catch_reporter_multi.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED\n\nnamespace Catch {\n\nclass MultipleReporters : public SharedImpl<IStreamingReporter> {\n    typedef std::vector<Ptr<IStreamingReporter> > Reporters;\n    Reporters m_reporters;\n\npublic:\n    void add( Ptr<IStreamingReporter> const& reporter ) {\n        m_reporters.push_back( reporter );\n    }\n\npublic: // IStreamingReporter\n\n    virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {\n        return m_reporters[0]->getPreferences();\n    }\n\n    virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->noMatchingTestCases( spec );\n    }\n\n    virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->testRunStarting( testRunInfo );\n    }\n\n    virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->testGroupStarting( groupInfo );\n    }\n\n    virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->testCaseStarting( testInfo );\n    }\n\n    virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->sectionStarting( sectionInfo );\n    }\n\n    virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->assertionStarting( assertionInfo );\n    }\n\n    // The return value indicates if the messages buffer should be cleared:\n    virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {\n        bool clearBuffer = false;\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            clearBuffer |= (*it)->assertionEnded( assertionStats );\n        return clearBuffer;\n    }\n\n    virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->sectionEnded( sectionStats );\n    }\n\n    virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->testCaseEnded( testCaseStats );\n    }\n\n    virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->testGroupEnded( testGroupStats );\n    }\n\n    virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->testRunEnded( testRunStats );\n    }\n\n    virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {\n        for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();\n                it != itEnd;\n                ++it )\n            (*it)->skipTest( testInfo );\n    }\n\n    virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE {\n        return this;\n    }\n\n};\n\nPtr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ) {\n    Ptr<IStreamingReporter> resultingReporter;\n\n    if( existingReporter ) {\n        MultipleReporters* multi = existingReporter->tryAsMulti();\n        if( !multi ) {\n            multi = new MultipleReporters;\n            resultingReporter = Ptr<IStreamingReporter>( multi );\n            if( existingReporter )\n                multi->add( existingReporter );\n        }\n        else\n            resultingReporter = existingReporter;\n        multi->add( additionalReporter );\n    }\n    else\n        resultingReporter = additionalReporter;\n\n    return resultingReporter;\n}\n\n} // end namespace Catch\n\n// #included from: ../reporters/catch_reporter_xml.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED\n\n// #included from: catch_reporter_bases.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED\n\n#include <cstring>\n\nnamespace Catch {\n\n    struct StreamingReporterBase : SharedImpl<IStreamingReporter> {\n\n        StreamingReporterBase( ReporterConfig const& _config )\n        :   m_config( _config.fullConfig() ),\n            stream( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = false;\n        }\n\n        virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {\n            return m_reporterPrefs;\n        }\n\n        virtual ~StreamingReporterBase() CATCH_OVERRIDE;\n\n        virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {}\n\n        virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE {\n            currentTestRunInfo = _testRunInfo;\n        }\n        virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE {\n            currentGroupInfo = _groupInfo;\n        }\n\n        virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE {\n            currentTestCaseInfo = _testInfo;\n        }\n        virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE {\n            m_sectionStack.push_back( _sectionInfo );\n        }\n\n        virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE {\n            m_sectionStack.pop_back();\n        }\n        virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE {\n            currentTestCaseInfo.reset();\n        }\n        virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE {\n            currentGroupInfo.reset();\n        }\n        virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE {\n            currentTestCaseInfo.reset();\n            currentGroupInfo.reset();\n            currentTestRunInfo.reset();\n        }\n\n        virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {\n            // Don't do anything with this by default.\n            // It can optionally be overridden in the derived class.\n        }\n\n        Ptr<IConfig const> m_config;\n        std::ostream& stream;\n\n        LazyStat<TestRunInfo> currentTestRunInfo;\n        LazyStat<GroupInfo> currentGroupInfo;\n        LazyStat<TestCaseInfo> currentTestCaseInfo;\n\n        std::vector<SectionInfo> m_sectionStack;\n        ReporterPreferences m_reporterPrefs;\n    };\n\n    struct CumulativeReporterBase : SharedImpl<IStreamingReporter> {\n        template<typename T, typename ChildNodeT>\n        struct Node : SharedImpl<> {\n            explicit Node( T const& _value ) : value( _value ) {}\n            virtual ~Node() {}\n\n            typedef std::vector<Ptr<ChildNodeT> > ChildNodes;\n            T value;\n            ChildNodes children;\n        };\n        struct SectionNode : SharedImpl<> {\n            explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {}\n            virtual ~SectionNode();\n\n            bool operator == ( SectionNode const& other ) const {\n                return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;\n            }\n            bool operator == ( Ptr<SectionNode> const& other ) const {\n                return operator==( *other );\n            }\n\n            SectionStats stats;\n            typedef std::vector<Ptr<SectionNode> > ChildSections;\n            typedef std::vector<AssertionStats> Assertions;\n            ChildSections childSections;\n            Assertions assertions;\n            std::string stdOut;\n            std::string stdErr;\n        };\n\n        struct BySectionInfo {\n            BySectionInfo( SectionInfo const& other ) : m_other( other ) {}\n\t\t\tBySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}\n            bool operator() ( Ptr<SectionNode> const& node ) const {\n                return node->stats.sectionInfo.lineInfo == m_other.lineInfo;\n            }\n        private:\n\t\t\tvoid operator=( BySectionInfo const& );\n            SectionInfo const& m_other;\n        };\n\n        typedef Node<TestCaseStats, SectionNode> TestCaseNode;\n        typedef Node<TestGroupStats, TestCaseNode> TestGroupNode;\n        typedef Node<TestRunStats, TestGroupNode> TestRunNode;\n\n        CumulativeReporterBase( ReporterConfig const& _config )\n        :   m_config( _config.fullConfig() ),\n            stream( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = false;\n        }\n        ~CumulativeReporterBase();\n\n        virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {\n            return m_reporterPrefs;\n        }\n\n        virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {}\n        virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {}\n\n        virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {}\n\n        virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {\n            SectionStats incompleteStats( sectionInfo, Counts(), 0, false );\n            Ptr<SectionNode> node;\n            if( m_sectionStack.empty() ) {\n                if( !m_rootSection )\n                    m_rootSection = new SectionNode( incompleteStats );\n                node = m_rootSection;\n            }\n            else {\n                SectionNode& parentNode = *m_sectionStack.back();\n                SectionNode::ChildSections::const_iterator it =\n                    std::find_if(   parentNode.childSections.begin(),\n                                    parentNode.childSections.end(),\n                                    BySectionInfo( sectionInfo ) );\n                if( it == parentNode.childSections.end() ) {\n                    node = new SectionNode( incompleteStats );\n                    parentNode.childSections.push_back( node );\n                }\n                else\n                    node = *it;\n            }\n            m_sectionStack.push_back( node );\n            m_deepestSection = node;\n        }\n\n        virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}\n\n        virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {\n            assert( !m_sectionStack.empty() );\n            SectionNode& sectionNode = *m_sectionStack.back();\n            sectionNode.assertions.push_back( assertionStats );\n            return true;\n        }\n        virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {\n            assert( !m_sectionStack.empty() );\n            SectionNode& node = *m_sectionStack.back();\n            node.stats = sectionStats;\n            m_sectionStack.pop_back();\n        }\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {\n            Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats );\n            assert( m_sectionStack.size() == 0 );\n            node->children.push_back( m_rootSection );\n            m_testCases.push_back( node );\n            m_rootSection.reset();\n\n            assert( m_deepestSection );\n            m_deepestSection->stdOut = testCaseStats.stdOut;\n            m_deepestSection->stdErr = testCaseStats.stdErr;\n        }\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {\n            Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats );\n            node->children.swap( m_testCases );\n            m_testGroups.push_back( node );\n        }\n        virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {\n            Ptr<TestRunNode> node = new TestRunNode( testRunStats );\n            node->children.swap( m_testGroups );\n            m_testRuns.push_back( node );\n            testRunEndedCumulative();\n        }\n        virtual void testRunEndedCumulative() = 0;\n\n        virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {}\n\n        Ptr<IConfig const> m_config;\n        std::ostream& stream;\n        std::vector<AssertionStats> m_assertions;\n        std::vector<std::vector<Ptr<SectionNode> > > m_sections;\n        std::vector<Ptr<TestCaseNode> > m_testCases;\n        std::vector<Ptr<TestGroupNode> > m_testGroups;\n\n        std::vector<Ptr<TestRunNode> > m_testRuns;\n\n        Ptr<SectionNode> m_rootSection;\n        Ptr<SectionNode> m_deepestSection;\n        std::vector<Ptr<SectionNode> > m_sectionStack;\n        ReporterPreferences m_reporterPrefs;\n\n    };\n\n    template<char C>\n    char const* getLineOfChars() {\n        static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};\n        if( !*line ) {\n            memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );\n            line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;\n        }\n        return line;\n    }\n\n    struct TestEventListenerBase : StreamingReporterBase {\n        TestEventListenerBase( ReporterConfig const& _config )\n        :   StreamingReporterBase( _config )\n        {}\n\n        virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}\n        virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE {\n            return false;\n        }\n    };\n\n} // end namespace Catch\n\n// #included from: ../internal/catch_reporter_registrars.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED\n\nnamespace Catch {\n\n    template<typename T>\n    class LegacyReporterRegistrar {\n\n        class ReporterFactory : public IReporterFactory {\n            virtual IStreamingReporter* create( ReporterConfig const& config ) const {\n                return new LegacyReporterAdapter( new T( config ) );\n            }\n\n            virtual std::string getDescription() const {\n                return T::getDescription();\n            }\n        };\n\n    public:\n\n        LegacyReporterRegistrar( std::string const& name ) {\n            getMutableRegistryHub().registerReporter( name, new ReporterFactory() );\n        }\n    };\n\n    template<typename T>\n    class ReporterRegistrar {\n\n        class ReporterFactory : public SharedImpl<IReporterFactory> {\n\n            // *** Please Note ***:\n            // - If you end up here looking at a compiler error because it's trying to register\n            // your custom reporter class be aware that the native reporter interface has changed\n            // to IStreamingReporter. The \"legacy\" interface, IReporter, is still supported via\n            // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter.\n            // However please consider updating to the new interface as the old one is now\n            // deprecated and will probably be removed quite soon!\n            // Please contact me via github if you have any questions at all about this.\n            // In fact, ideally, please contact me anyway to let me know you've hit this - as I have\n            // no idea who is actually using custom reporters at all (possibly no-one!).\n            // The new interface is designed to minimise exposure to interface changes in the future.\n            virtual IStreamingReporter* create( ReporterConfig const& config ) const {\n                return new T( config );\n            }\n\n            virtual std::string getDescription() const {\n                return T::getDescription();\n            }\n        };\n\n    public:\n\n        ReporterRegistrar( std::string const& name ) {\n            getMutableRegistryHub().registerReporter( name, new ReporterFactory() );\n        }\n    };\n\n    template<typename T>\n    class ListenerRegistrar {\n\n        class ListenerFactory : public SharedImpl<IReporterFactory> {\n\n            virtual IStreamingReporter* create( ReporterConfig const& config ) const {\n                return new T( config );\n            }\n            virtual std::string getDescription() const {\n                return \"\";\n            }\n        };\n\n    public:\n\n        ListenerRegistrar() {\n            getMutableRegistryHub().registerListener( new ListenerFactory() );\n        }\n    };\n}\n\n#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \\\n    namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }\n\n#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \\\n    namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }\n\n#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \\\n    namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; }\n\n// #included from: ../internal/catch_xmlwriter.hpp\n#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED\n\n#include <sstream>\n#include <string>\n#include <vector>\n#include <iomanip>\n\nnamespace Catch {\n\n    class XmlEncode {\n    public:\n        enum ForWhat { ForTextNodes, ForAttributes };\n\n        XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes )\n        :   m_str( str ),\n            m_forWhat( forWhat )\n        {}\n\n        void encodeTo( std::ostream& os ) const {\n\n            // Apostrophe escaping not necessary if we always use \" to write attributes\n            // (see: http://www.w3.org/TR/xml/#syntax)\n\n            for( std::size_t i = 0; i < m_str.size(); ++ i ) {\n                char c = m_str[i];\n                switch( c ) {\n                    case '<':   os << \"&lt;\"; break;\n                    case '&':   os << \"&amp;\"; break;\n\n                    case '>':\n                        // See: http://www.w3.org/TR/xml/#syntax\n                        if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' )\n                            os << \"&gt;\";\n                        else\n                            os << c;\n                        break;\n\n                    case '\\\"':\n                        if( m_forWhat == ForAttributes )\n                            os << \"&quot;\";\n                        else\n                            os << c;\n                        break;\n\n                    default:\n                        // Escape control chars - based on contribution by @espenalb in PR #465 and\n                        // by @mrpi PR #588\n                        if ( ( c >= 0 && c < '\\x09' ) || ( c > '\\x0D' && c < '\\x20') || c=='\\x7F' )\n                            os << \"&#x\" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>( c ) << ';';\n                        else\n                            os << c;\n                }\n            }\n        }\n\n        friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {\n            xmlEncode.encodeTo( os );\n            return os;\n        }\n\n    private:\n        std::string m_str;\n        ForWhat m_forWhat;\n    };\n\n    class XmlWriter {\n    public:\n\n        class ScopedElement {\n        public:\n            ScopedElement( XmlWriter* writer )\n            :   m_writer( writer )\n            {}\n\n            ScopedElement( ScopedElement const& other )\n            :   m_writer( other.m_writer ){\n                other.m_writer = CATCH_NULL;\n            }\n\n            ~ScopedElement() {\n                if( m_writer )\n                    m_writer->endElement();\n            }\n\n            ScopedElement& writeText( std::string const& text, bool indent = true ) {\n                m_writer->writeText( text, indent );\n                return *this;\n            }\n\n            template<typename T>\n            ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {\n                m_writer->writeAttribute( name, attribute );\n                return *this;\n            }\n\n        private:\n            mutable XmlWriter* m_writer;\n        };\n\n        XmlWriter()\n        :   m_tagIsOpen( false ),\n            m_needsNewline( false ),\n            m_os( &Catch::cout() )\n        {\n            // We encode control characters, which requires\n            // XML 1.1\n            // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0\n            *m_os << \"<?xml version=\\\"1.1\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n        }\n\n        XmlWriter( std::ostream& os )\n        :   m_tagIsOpen( false ),\n            m_needsNewline( false ),\n            m_os( &os )\n        {\n            *m_os << \"<?xml version=\\\"1.1\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n        }\n\n        ~XmlWriter() {\n            while( !m_tags.empty() )\n                endElement();\n        }\n\n        XmlWriter& startElement( std::string const& name ) {\n            ensureTagClosed();\n            newlineIfNecessary();\n            stream() << m_indent << \"<\" << name;\n            m_tags.push_back( name );\n            m_indent += \"  \";\n            m_tagIsOpen = true;\n            return *this;\n        }\n\n        ScopedElement scopedElement( std::string const& name ) {\n            ScopedElement scoped( this );\n            startElement( name );\n            return scoped;\n        }\n\n        XmlWriter& endElement() {\n            newlineIfNecessary();\n            m_indent = m_indent.substr( 0, m_indent.size()-2 );\n            if( m_tagIsOpen ) {\n                stream() << \"/>\\n\";\n                m_tagIsOpen = false;\n            }\n            else {\n                stream() << m_indent << \"</\" << m_tags.back() << \">\\n\";\n            }\n            m_tags.pop_back();\n            return *this;\n        }\n\n        XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) {\n            if( !name.empty() && !attribute.empty() )\n                stream() << \" \" << name << \"=\\\"\" << XmlEncode( attribute, XmlEncode::ForAttributes ) << \"\\\"\";\n            return *this;\n        }\n\n        XmlWriter& writeAttribute( std::string const& name, bool attribute ) {\n            stream() << \" \" << name << \"=\\\"\" << ( attribute ? \"true\" : \"false\" ) << \"\\\"\";\n            return *this;\n        }\n\n        template<typename T>\n        XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {\n            std::ostringstream oss;\n            oss << attribute;\n            return writeAttribute( name, oss.str() );\n        }\n\n        XmlWriter& writeText( std::string const& text, bool indent = true ) {\n            if( !text.empty() ){\n                bool tagWasOpen = m_tagIsOpen;\n                ensureTagClosed();\n                if( tagWasOpen && indent )\n                    stream() << m_indent;\n                stream() << XmlEncode( text );\n                m_needsNewline = true;\n            }\n            return *this;\n        }\n\n        XmlWriter& writeComment( std::string const& text ) {\n            ensureTagClosed();\n            stream() << m_indent << \"<!--\" << text << \"-->\";\n            m_needsNewline = true;\n            return *this;\n        }\n\n        XmlWriter& writeBlankLine() {\n            ensureTagClosed();\n            stream() << \"\\n\";\n            return *this;\n        }\n\n        void setStream( std::ostream& os ) {\n            m_os = &os;\n        }\n\n    private:\n        XmlWriter( XmlWriter const& );\n        void operator=( XmlWriter const& );\n\n        std::ostream& stream() {\n            return *m_os;\n        }\n\n        void ensureTagClosed() {\n            if( m_tagIsOpen ) {\n                stream() << \">\\n\";\n                m_tagIsOpen = false;\n            }\n        }\n\n        void newlineIfNecessary() {\n            if( m_needsNewline ) {\n                stream() << \"\\n\";\n                m_needsNewline = false;\n            }\n        }\n\n        bool m_tagIsOpen;\n        bool m_needsNewline;\n        std::vector<std::string> m_tags;\n        std::string m_indent;\n        std::ostream* m_os;\n    };\n\n}\n// #included from: catch_reenable_warnings.h\n\n#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED\n\n#ifdef __clang__\n#    ifdef __ICC // icpc defines the __clang__ macro\n#        pragma warning(pop)\n#    else\n#        pragma clang diagnostic pop\n#    endif\n#elif defined __GNUC__\n#    pragma GCC diagnostic pop\n#endif\n\n\nnamespace Catch {\n    class XmlReporter : public StreamingReporterBase {\n    public:\n        XmlReporter( ReporterConfig const& _config )\n        :   StreamingReporterBase( _config ),\n            m_xml(_config.stream()),\n            m_sectionDepth( 0 )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = true;\n        }\n\n        virtual ~XmlReporter() CATCH_OVERRIDE;\n\n        static std::string getDescription() {\n            return \"Reports test results as an XML document\";\n        }\n\n    public: // StreamingReporterBase\n\n        virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE {\n            StreamingReporterBase::noMatchingTestCases( s );\n        }\n\n        virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE {\n            StreamingReporterBase::testRunStarting( testInfo );\n            m_xml.startElement( \"Catch\" );\n            if( !m_config->name().empty() )\n                m_xml.writeAttribute( \"name\", m_config->name() );\n        }\n\n        virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {\n            StreamingReporterBase::testGroupStarting( groupInfo );\n            m_xml.startElement( \"Group\" )\n                .writeAttribute( \"name\", groupInfo.name );\n        }\n\n        virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {\n            StreamingReporterBase::testCaseStarting(testInfo);\n            m_xml.startElement( \"TestCase\" ).writeAttribute( \"name\", testInfo.name );\n\n            if ( m_config->showDurations() == ShowDurations::Always )\n                m_testCaseTimer.start();\n        }\n\n        virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {\n            StreamingReporterBase::sectionStarting( sectionInfo );\n            if( m_sectionDepth++ > 0 ) {\n                m_xml.startElement( \"Section\" )\n                    .writeAttribute( \"name\", trim( sectionInfo.name ) )\n                    .writeAttribute( \"description\", sectionInfo.description );\n            }\n        }\n\n        virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { }\n\n        virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {\n            const AssertionResult& assertionResult = assertionStats.assertionResult;\n\n            // Print any info messages in <Info> tags.\n            if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {\n                for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();\n                        it != itEnd;\n                        ++it ) {\n                    if( it->type == ResultWas::Info ) {\n                        m_xml.scopedElement( \"Info\" )\n                            .writeText( it->message );\n                    } else if ( it->type == ResultWas::Warning ) {\n                        m_xml.scopedElement( \"Warning\" )\n                            .writeText( it->message );\n                    }\n                }\n            }\n\n            // Drop out if result was successful but we're not printing them.\n            if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) )\n                return true;\n\n            // Print the expression if there is one.\n            if( assertionResult.hasExpression() ) {\n                m_xml.startElement( \"Expression\" )\n                    .writeAttribute( \"success\", assertionResult.succeeded() )\n\t\t\t\t\t.writeAttribute( \"type\", assertionResult.getTestMacroName() )\n                    .writeAttribute( \"filename\", assertionResult.getSourceInfo().file )\n                    .writeAttribute( \"line\", assertionResult.getSourceInfo().line );\n\n                m_xml.scopedElement( \"Original\" )\n                    .writeText( assertionResult.getExpression() );\n                m_xml.scopedElement( \"Expanded\" )\n                    .writeText( assertionResult.getExpandedExpression() );\n            }\n\n            // And... Print a result applicable to each result type.\n            switch( assertionResult.getResultType() ) {\n                case ResultWas::ThrewException:\n                    m_xml.scopedElement( \"Exception\" )\n                        .writeAttribute( \"filename\", assertionResult.getSourceInfo().file )\n                        .writeAttribute( \"line\", assertionResult.getSourceInfo().line )\n                        .writeText( assertionResult.getMessage() );\n                    break;\n                case ResultWas::FatalErrorCondition:\n                    m_xml.scopedElement( \"FatalErrorCondition\" )\n                        .writeAttribute( \"filename\", assertionResult.getSourceInfo().file )\n                        .writeAttribute( \"line\", assertionResult.getSourceInfo().line )\n                        .writeText( assertionResult.getMessage() );\n                    break;\n                case ResultWas::Info:\n                    m_xml.scopedElement( \"Info\" )\n                        .writeText( assertionResult.getMessage() );\n                    break;\n                case ResultWas::Warning:\n                    // Warning will already have been written\n                    break;\n                case ResultWas::ExplicitFailure:\n                    m_xml.scopedElement( \"Failure\" )\n                        .writeText( assertionResult.getMessage() );\n                    break;\n                default:\n                    break;\n            }\n\n            if( assertionResult.hasExpression() )\n                m_xml.endElement();\n\n            return true;\n        }\n\n        virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {\n            StreamingReporterBase::sectionEnded( sectionStats );\n            if( --m_sectionDepth > 0 ) {\n                XmlWriter::ScopedElement e = m_xml.scopedElement( \"OverallResults\" );\n                e.writeAttribute( \"successes\", sectionStats.assertions.passed );\n                e.writeAttribute( \"failures\", sectionStats.assertions.failed );\n                e.writeAttribute( \"expectedFailures\", sectionStats.assertions.failedButOk );\n\n                if ( m_config->showDurations() == ShowDurations::Always )\n                    e.writeAttribute( \"durationInSeconds\", sectionStats.durationInSeconds );\n\n                m_xml.endElement();\n            }\n        }\n\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {\n            StreamingReporterBase::testCaseEnded( testCaseStats );\n            XmlWriter::ScopedElement e = m_xml.scopedElement( \"OverallResult\" );\n            e.writeAttribute( \"success\", testCaseStats.totals.assertions.allOk() );\n\n            if ( m_config->showDurations() == ShowDurations::Always )\n                e.writeAttribute( \"durationInSeconds\", m_testCaseTimer.getElapsedSeconds() );\n\n            m_xml.endElement();\n        }\n\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {\n            StreamingReporterBase::testGroupEnded( testGroupStats );\n            // TODO: Check testGroupStats.aborting and act accordingly.\n            m_xml.scopedElement( \"OverallResults\" )\n                .writeAttribute( \"successes\", testGroupStats.totals.assertions.passed )\n                .writeAttribute( \"failures\", testGroupStats.totals.assertions.failed )\n                .writeAttribute( \"expectedFailures\", testGroupStats.totals.assertions.failedButOk );\n            m_xml.endElement();\n        }\n\n        virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {\n            StreamingReporterBase::testRunEnded( testRunStats );\n            m_xml.scopedElement( \"OverallResults\" )\n                .writeAttribute( \"successes\", testRunStats.totals.assertions.passed )\n                .writeAttribute( \"failures\", testRunStats.totals.assertions.failed )\n                .writeAttribute( \"expectedFailures\", testRunStats.totals.assertions.failedButOk );\n            m_xml.endElement();\n        }\n\n    private:\n        Timer m_testCaseTimer;\n        XmlWriter m_xml;\n        int m_sectionDepth;\n    };\n\n     INTERNAL_CATCH_REGISTER_REPORTER( \"xml\", XmlReporter )\n\n} // end namespace Catch\n\n// #included from: ../reporters/catch_reporter_junit.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED\n\n#include <assert.h>\n\nnamespace Catch {\n\n    namespace {\n        std::string getCurrentTimestamp() {\n            // Beware, this is not reentrant because of backward compatibility issues\n            // Also, UTC only, again because of backward compatibility (%z is C++11)\n            time_t rawtime;\n            std::time(&rawtime);\n            const size_t timeStampSize = sizeof(\"2017-01-16T17:06:45Z\");\n\n#ifdef CATCH_PLATFORM_WINDOWS\n            std::tm timeInfo = {};\n            gmtime_s(&timeInfo, &rawtime);\n#else\n            std::tm* timeInfo;\n            timeInfo = std::gmtime(&rawtime);\n#endif\n\n            char timeStamp[timeStampSize];\n            const char * const fmt = \"%Y-%m-%dT%H:%M:%SZ\";\n\n#ifdef CATCH_PLATFORM_WINDOWS\n            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);\n#else\n            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);\n#endif\n            return std::string(timeStamp);\n        }\n\n    }\n\n    class JunitReporter : public CumulativeReporterBase {\n    public:\n        JunitReporter( ReporterConfig const& _config )\n        :   CumulativeReporterBase( _config ),\n            xml( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = true;\n        }\n\n        virtual ~JunitReporter() CATCH_OVERRIDE;\n\n        static std::string getDescription() {\n            return \"Reports test results in an XML format that looks like Ant's junitreport target\";\n        }\n\n        virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {}\n\n        virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE {\n            CumulativeReporterBase::testRunStarting( runInfo );\n            xml.startElement( \"testsuites\" );\n        }\n\n        virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {\n            suiteTimer.start();\n            stdOutForSuite.str(\"\");\n            stdErrForSuite.str(\"\");\n            unexpectedExceptions = 0;\n            CumulativeReporterBase::testGroupStarting( groupInfo );\n        }\n\n        virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {\n            if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException )\n                unexpectedExceptions++;\n            return CumulativeReporterBase::assertionEnded( assertionStats );\n        }\n\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {\n            stdOutForSuite << testCaseStats.stdOut;\n            stdErrForSuite << testCaseStats.stdErr;\n            CumulativeReporterBase::testCaseEnded( testCaseStats );\n        }\n\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {\n            double suiteTime = suiteTimer.getElapsedSeconds();\n            CumulativeReporterBase::testGroupEnded( testGroupStats );\n            writeGroup( *m_testGroups.back(), suiteTime );\n        }\n\n        virtual void testRunEndedCumulative() CATCH_OVERRIDE {\n            xml.endElement();\n        }\n\n        void writeGroup( TestGroupNode const& groupNode, double suiteTime ) {\n            XmlWriter::ScopedElement e = xml.scopedElement( \"testsuite\" );\n            TestGroupStats const& stats = groupNode.value;\n            xml.writeAttribute( \"name\", stats.groupInfo.name );\n            xml.writeAttribute( \"errors\", unexpectedExceptions );\n            xml.writeAttribute( \"failures\", stats.totals.assertions.failed-unexpectedExceptions );\n            xml.writeAttribute( \"tests\", stats.totals.assertions.total() );\n            xml.writeAttribute( \"hostname\", \"tbd\" ); // !TBD\n            if( m_config->showDurations() == ShowDurations::Never )\n                xml.writeAttribute( \"time\", \"\" );\n            else\n                xml.writeAttribute( \"time\", suiteTime );\n            xml.writeAttribute( \"timestamp\", getCurrentTimestamp() );\n\n            // Write test cases\n            for( TestGroupNode::ChildNodes::const_iterator\n                    it = groupNode.children.begin(), itEnd = groupNode.children.end();\n                    it != itEnd;\n                    ++it )\n                writeTestCase( **it );\n\n            xml.scopedElement( \"system-out\" ).writeText( trim( stdOutForSuite.str() ), false );\n            xml.scopedElement( \"system-err\" ).writeText( trim( stdErrForSuite.str() ), false );\n        }\n\n        void writeTestCase( TestCaseNode const& testCaseNode ) {\n            TestCaseStats const& stats = testCaseNode.value;\n\n            // All test cases have exactly one section - which represents the\n            // test case itself. That section may have 0-n nested sections\n            assert( testCaseNode.children.size() == 1 );\n            SectionNode const& rootSection = *testCaseNode.children.front();\n\n            std::string className = stats.testInfo.className;\n\n            if( className.empty() ) {\n                if( rootSection.childSections.empty() )\n                    className = \"global\";\n            }\n            writeSection( className, \"\", rootSection );\n        }\n\n        void writeSection(  std::string const& className,\n                            std::string const& rootName,\n                            SectionNode const& sectionNode ) {\n            std::string name = trim( sectionNode.stats.sectionInfo.name );\n            if( !rootName.empty() )\n                name = rootName + \"/\" + name;\n\n            if( !sectionNode.assertions.empty() ||\n                !sectionNode.stdOut.empty() ||\n                !sectionNode.stdErr.empty() ) {\n                XmlWriter::ScopedElement e = xml.scopedElement( \"testcase\" );\n                if( className.empty() ) {\n                    xml.writeAttribute( \"classname\", name );\n                    xml.writeAttribute( \"name\", \"root\" );\n                }\n                else {\n                    xml.writeAttribute( \"classname\", className );\n                    xml.writeAttribute( \"name\", name );\n                }\n                xml.writeAttribute( \"time\", Catch::toString( sectionNode.stats.durationInSeconds ) );\n\n                writeAssertions( sectionNode );\n\n                if( !sectionNode.stdOut.empty() )\n                    xml.scopedElement( \"system-out\" ).writeText( trim( sectionNode.stdOut ), false );\n                if( !sectionNode.stdErr.empty() )\n                    xml.scopedElement( \"system-err\" ).writeText( trim( sectionNode.stdErr ), false );\n            }\n            for( SectionNode::ChildSections::const_iterator\n                    it = sectionNode.childSections.begin(),\n                    itEnd = sectionNode.childSections.end();\n                    it != itEnd;\n                    ++it )\n                if( className.empty() )\n                    writeSection( name, \"\", **it );\n                else\n                    writeSection( className, name, **it );\n        }\n\n        void writeAssertions( SectionNode const& sectionNode ) {\n            for( SectionNode::Assertions::const_iterator\n                    it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end();\n                    it != itEnd;\n                    ++it )\n                writeAssertion( *it );\n        }\n        void writeAssertion( AssertionStats const& stats ) {\n            AssertionResult const& result = stats.assertionResult;\n            if( !result.isOk() ) {\n                std::string elementName;\n                switch( result.getResultType() ) {\n                    case ResultWas::ThrewException:\n                    case ResultWas::FatalErrorCondition:\n                        elementName = \"error\";\n                        break;\n                    case ResultWas::ExplicitFailure:\n                        elementName = \"failure\";\n                        break;\n                    case ResultWas::ExpressionFailed:\n                        elementName = \"failure\";\n                        break;\n                    case ResultWas::DidntThrowException:\n                        elementName = \"failure\";\n                        break;\n\n                    // We should never see these here:\n                    case ResultWas::Info:\n                    case ResultWas::Warning:\n                    case ResultWas::Ok:\n                    case ResultWas::Unknown:\n                    case ResultWas::FailureBit:\n                    case ResultWas::Exception:\n                        elementName = \"internalError\";\n                        break;\n                }\n\n                XmlWriter::ScopedElement e = xml.scopedElement( elementName );\n\n                xml.writeAttribute( \"message\", result.getExpandedExpression() );\n                xml.writeAttribute( \"type\", result.getTestMacroName() );\n\n                std::ostringstream oss;\n                if( !result.getMessage().empty() )\n                    oss << result.getMessage() << \"\\n\";\n                for( std::vector<MessageInfo>::const_iterator\n                        it = stats.infoMessages.begin(),\n                        itEnd = stats.infoMessages.end();\n                            it != itEnd;\n                            ++it )\n                    if( it->type == ResultWas::Info )\n                        oss << it->message << \"\\n\";\n\n                oss << \"at \" << result.getSourceInfo();\n                xml.writeText( oss.str(), false );\n            }\n        }\n\n        XmlWriter xml;\n        Timer suiteTimer;\n        std::ostringstream stdOutForSuite;\n        std::ostringstream stdErrForSuite;\n        unsigned int unexpectedExceptions;\n    };\n\n    INTERNAL_CATCH_REGISTER_REPORTER( \"junit\", JunitReporter )\n\n} // end namespace Catch\n\n// #included from: ../reporters/catch_reporter_console.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED\n\nnamespace Catch {\n\n    struct ConsoleReporter : StreamingReporterBase {\n        ConsoleReporter( ReporterConfig const& _config )\n        :   StreamingReporterBase( _config ),\n            m_headerPrinted( false )\n        {}\n\n        virtual ~ConsoleReporter() CATCH_OVERRIDE;\n        static std::string getDescription() {\n            return \"Reports test results as plain lines of text\";\n        }\n\n        virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE {\n            stream << \"No test cases matched '\" << spec << \"'\" << std::endl;\n        }\n\n        virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {\n        }\n\n        virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE {\n            AssertionResult const& result = _assertionStats.assertionResult;\n\n            bool printInfoMessages = true;\n\n            // Drop out if result was successful and we're not printing those\n            if( !m_config->includeSuccessfulResults() && result.isOk() ) {\n                if( result.getResultType() != ResultWas::Warning )\n                    return false;\n                printInfoMessages = false;\n            }\n\n            lazyPrint();\n\n            AssertionPrinter printer( stream, _assertionStats, printInfoMessages );\n            printer.print();\n            stream << std::endl;\n            return true;\n        }\n\n        virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE {\n            m_headerPrinted = false;\n            StreamingReporterBase::sectionStarting( _sectionInfo );\n        }\n        virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE {\n            if( _sectionStats.missingAssertions ) {\n                lazyPrint();\n                Colour colour( Colour::ResultError );\n                if( m_sectionStack.size() > 1 )\n                    stream << \"\\nNo assertions in section\";\n                else\n                    stream << \"\\nNo assertions in test case\";\n                stream << \" '\" << _sectionStats.sectionInfo.name << \"'\\n\" << std::endl;\n            }\n            if( m_headerPrinted ) {\n                if( m_config->showDurations() == ShowDurations::Always )\n                    stream << \"Completed in \" << _sectionStats.durationInSeconds << \"s\" << std::endl;\n                m_headerPrinted = false;\n            }\n            else {\n                if( m_config->showDurations() == ShowDurations::Always )\n                    stream << _sectionStats.sectionInfo.name << \" completed in \" << _sectionStats.durationInSeconds << \"s\" << std::endl;\n            }\n            StreamingReporterBase::sectionEnded( _sectionStats );\n        }\n\n        virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE {\n            StreamingReporterBase::testCaseEnded( _testCaseStats );\n            m_headerPrinted = false;\n        }\n        virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE {\n            if( currentGroupInfo.used ) {\n                printSummaryDivider();\n                stream << \"Summary for group '\" << _testGroupStats.groupInfo.name << \"':\\n\";\n                printTotals( _testGroupStats.totals );\n                stream << \"\\n\" << std::endl;\n            }\n            StreamingReporterBase::testGroupEnded( _testGroupStats );\n        }\n        virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE {\n            printTotalsDivider( _testRunStats.totals );\n            printTotals( _testRunStats.totals );\n            stream << std::endl;\n            StreamingReporterBase::testRunEnded( _testRunStats );\n        }\n\n    private:\n\n        class AssertionPrinter {\n            void operator= ( AssertionPrinter const& );\n        public:\n            AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )\n            :   stream( _stream ),\n                stats( _stats ),\n                result( _stats.assertionResult ),\n                colour( Colour::None ),\n                message( result.getMessage() ),\n                messages( _stats.infoMessages ),\n                printInfoMessages( _printInfoMessages )\n            {\n                switch( result.getResultType() ) {\n                    case ResultWas::Ok:\n                        colour = Colour::Success;\n                        passOrFail = \"PASSED\";\n                        //if( result.hasMessage() )\n                        if( _stats.infoMessages.size() == 1 )\n                            messageLabel = \"with message\";\n                        if( _stats.infoMessages.size() > 1 )\n                            messageLabel = \"with messages\";\n                        break;\n                    case ResultWas::ExpressionFailed:\n                        if( result.isOk() ) {\n                            colour = Colour::Success;\n                            passOrFail = \"FAILED - but was ok\";\n                        }\n                        else {\n                            colour = Colour::Error;\n                            passOrFail = \"FAILED\";\n                        }\n                        if( _stats.infoMessages.size() == 1 )\n                            messageLabel = \"with message\";\n                        if( _stats.infoMessages.size() > 1 )\n                            messageLabel = \"with messages\";\n                        break;\n                    case ResultWas::ThrewException:\n                        colour = Colour::Error;\n                        passOrFail = \"FAILED\";\n                        messageLabel = \"due to unexpected exception with message\";\n                        break;\n                    case ResultWas::FatalErrorCondition:\n                        colour = Colour::Error;\n                        passOrFail = \"FAILED\";\n                        messageLabel = \"due to a fatal error condition\";\n                        break;\n                    case ResultWas::DidntThrowException:\n                        colour = Colour::Error;\n                        passOrFail = \"FAILED\";\n                        messageLabel = \"because no exception was thrown where one was expected\";\n                        break;\n                    case ResultWas::Info:\n                        messageLabel = \"info\";\n                        break;\n                    case ResultWas::Warning:\n                        messageLabel = \"warning\";\n                        break;\n                    case ResultWas::ExplicitFailure:\n                        passOrFail = \"FAILED\";\n                        colour = Colour::Error;\n                        if( _stats.infoMessages.size() == 1 )\n                            messageLabel = \"explicitly with message\";\n                        if( _stats.infoMessages.size() > 1 )\n                            messageLabel = \"explicitly with messages\";\n                        break;\n                    // These cases are here to prevent compiler warnings\n                    case ResultWas::Unknown:\n                    case ResultWas::FailureBit:\n                    case ResultWas::Exception:\n                        passOrFail = \"** internal error **\";\n                        colour = Colour::Error;\n                        break;\n                }\n            }\n\n            void print() const {\n                printSourceInfo();\n                if( stats.totals.assertions.total() > 0 ) {\n                    if( result.isOk() )\n                        stream << \"\\n\";\n                    printResultType();\n                    printOriginalExpression();\n                    printReconstructedExpression();\n                }\n                else {\n                    stream << \"\\n\";\n                }\n                printMessage();\n            }\n\n        private:\n            void printResultType() const {\n                if( !passOrFail.empty() ) {\n                    Colour colourGuard( colour );\n                    stream << passOrFail << \":\\n\";\n                }\n            }\n            void printOriginalExpression() const {\n                if( result.hasExpression() ) {\n                    Colour colourGuard( Colour::OriginalExpression );\n                    stream  << \"  \";\n                    stream << result.getExpressionInMacro();\n                    stream << \"\\n\";\n                }\n            }\n            void printReconstructedExpression() const {\n                if( result.hasExpandedExpression() ) {\n                    stream << \"with expansion:\\n\";\n                    Colour colourGuard( Colour::ReconstructedExpression );\n                    stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << \"\\n\";\n                }\n            }\n            void printMessage() const {\n                if( !messageLabel.empty() )\n                    stream << messageLabel << \":\" << \"\\n\";\n                for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end();\n                        it != itEnd;\n                        ++it ) {\n                    // If this assertion is a warning ignore any INFO messages\n                    if( printInfoMessages || it->type != ResultWas::Info )\n                        stream << Text( it->message, TextAttributes().setIndent(2) ) << \"\\n\";\n                }\n            }\n            void printSourceInfo() const {\n                Colour colourGuard( Colour::FileName );\n                stream << result.getSourceInfo() << \": \";\n            }\n\n            std::ostream& stream;\n            AssertionStats const& stats;\n            AssertionResult const& result;\n            Colour::Code colour;\n            std::string passOrFail;\n            std::string messageLabel;\n            std::string message;\n            std::vector<MessageInfo> messages;\n            bool printInfoMessages;\n        };\n\n        void lazyPrint() {\n\n            if( !currentTestRunInfo.used )\n                lazyPrintRunInfo();\n            if( !currentGroupInfo.used )\n                lazyPrintGroupInfo();\n\n            if( !m_headerPrinted ) {\n                printTestCaseAndSectionHeader();\n                m_headerPrinted = true;\n            }\n        }\n        void lazyPrintRunInfo() {\n            stream  << \"\\n\" << getLineOfChars<'~'>() << \"\\n\";\n            Colour colour( Colour::SecondaryText );\n            stream  << currentTestRunInfo->name\n                    << \" is a Catch v\"  << libraryVersion << \" host application.\\n\"\n                    << \"Run with -? for options\\n\\n\";\n\n            if( m_config->rngSeed() != 0 )\n                stream << \"Randomness seeded to: \" << m_config->rngSeed() << \"\\n\\n\";\n\n            currentTestRunInfo.used = true;\n        }\n        void lazyPrintGroupInfo() {\n            if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) {\n                printClosedHeader( \"Group: \" + currentGroupInfo->name );\n                currentGroupInfo.used = true;\n            }\n        }\n        void printTestCaseAndSectionHeader() {\n            assert( !m_sectionStack.empty() );\n            printOpenHeader( currentTestCaseInfo->name );\n\n            if( m_sectionStack.size() > 1 ) {\n                Colour colourGuard( Colour::Headers );\n\n                std::vector<SectionInfo>::const_iterator\n                    it = m_sectionStack.begin()+1, // Skip first section (test case)\n                    itEnd = m_sectionStack.end();\n                for( ; it != itEnd; ++it )\n                    printHeaderString( it->name, 2 );\n            }\n\n            SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;\n\n            if( !lineInfo.empty() ){\n                stream << getLineOfChars<'-'>() << \"\\n\";\n                Colour colourGuard( Colour::FileName );\n                stream << lineInfo << \"\\n\";\n            }\n            stream << getLineOfChars<'.'>() << \"\\n\" << std::endl;\n        }\n\n        void printClosedHeader( std::string const& _name ) {\n            printOpenHeader( _name );\n            stream << getLineOfChars<'.'>() << \"\\n\";\n        }\n        void printOpenHeader( std::string const& _name ) {\n            stream  << getLineOfChars<'-'>() << \"\\n\";\n            {\n                Colour colourGuard( Colour::Headers );\n                printHeaderString( _name );\n            }\n        }\n\n        // if string has a : in first line will set indent to follow it on\n        // subsequent lines\n        void printHeaderString( std::string const& _string, std::size_t indent = 0 ) {\n            std::size_t i = _string.find( \": \" );\n            if( i != std::string::npos )\n                i+=2;\n            else\n                i = 0;\n            stream << Text( _string, TextAttributes()\n                                        .setIndent( indent+i)\n                                        .setInitialIndent( indent ) ) << \"\\n\";\n        }\n\n        struct SummaryColumn {\n\n            SummaryColumn( std::string const& _label, Colour::Code _colour )\n            :   label( _label ),\n                colour( _colour )\n            {}\n            SummaryColumn addRow( std::size_t count ) {\n                std::ostringstream oss;\n                oss << count;\n                std::string row = oss.str();\n                for( std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it ) {\n                    while( it->size() < row.size() )\n                        *it = \" \" + *it;\n                    while( it->size() > row.size() )\n                        row = \" \" + row;\n                }\n                rows.push_back( row );\n                return *this;\n            }\n\n            std::string label;\n            Colour::Code colour;\n            std::vector<std::string> rows;\n\n        };\n\n        void printTotals( Totals const& totals ) {\n            if( totals.testCases.total() == 0 ) {\n                stream << Colour( Colour::Warning ) << \"No tests ran\\n\";\n            }\n            else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) {\n                stream << Colour( Colour::ResultSuccess ) << \"All tests passed\";\n                stream << \" (\"\n                        << pluralise( totals.assertions.passed, \"assertion\" ) << \" in \"\n                        << pluralise( totals.testCases.passed, \"test case\" ) << \")\"\n                        << \"\\n\";\n            }\n            else {\n\n                std::vector<SummaryColumn> columns;\n                columns.push_back( SummaryColumn( \"\", Colour::None )\n                                        .addRow( totals.testCases.total() )\n                                        .addRow( totals.assertions.total() ) );\n                columns.push_back( SummaryColumn( \"passed\", Colour::Success )\n                                        .addRow( totals.testCases.passed )\n                                        .addRow( totals.assertions.passed ) );\n                columns.push_back( SummaryColumn( \"failed\", Colour::ResultError )\n                                        .addRow( totals.testCases.failed )\n                                        .addRow( totals.assertions.failed ) );\n                columns.push_back( SummaryColumn( \"failed as expected\", Colour::ResultExpectedFailure )\n                                        .addRow( totals.testCases.failedButOk )\n                                        .addRow( totals.assertions.failedButOk ) );\n\n                printSummaryRow( \"test cases\", columns, 0 );\n                printSummaryRow( \"assertions\", columns, 1 );\n            }\n        }\n        void printSummaryRow( std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row ) {\n            for( std::vector<SummaryColumn>::const_iterator it = cols.begin(); it != cols.end(); ++it ) {\n                std::string value = it->rows[row];\n                if( it->label.empty() ) {\n                    stream << label << \": \";\n                    if( value != \"0\" )\n                        stream << value;\n                    else\n                        stream << Colour( Colour::Warning ) << \"- none -\";\n                }\n                else if( value != \"0\" ) {\n                    stream  << Colour( Colour::LightGrey ) << \" | \";\n                    stream  << Colour( it->colour )\n                            << value << \" \" << it->label;\n                }\n            }\n            stream << \"\\n\";\n        }\n\n        static std::size_t makeRatio( std::size_t number, std::size_t total ) {\n            std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0;\n            return ( ratio == 0 && number > 0 ) ? 1 : ratio;\n        }\n        static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) {\n            if( i > j && i > k )\n                return i;\n            else if( j > k )\n                return j;\n            else\n                return k;\n        }\n\n        void printTotalsDivider( Totals const& totals ) {\n            if( totals.testCases.total() > 0 ) {\n                std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() );\n                std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() );\n                std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() );\n                while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 )\n                    findMax( failedRatio, failedButOkRatio, passedRatio )++;\n                while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 )\n                    findMax( failedRatio, failedButOkRatio, passedRatio )--;\n\n                stream << Colour( Colour::Error ) << std::string( failedRatio, '=' );\n                stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' );\n                if( totals.testCases.allPassed() )\n                    stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' );\n                else\n                    stream << Colour( Colour::Success ) << std::string( passedRatio, '=' );\n            }\n            else {\n                stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' );\n            }\n            stream << \"\\n\";\n        }\n        void printSummaryDivider() {\n            stream << getLineOfChars<'-'>() << \"\\n\";\n        }\n\n    private:\n        bool m_headerPrinted;\n    };\n\n    INTERNAL_CATCH_REGISTER_REPORTER( \"console\", ConsoleReporter )\n\n} // end namespace Catch\n\n// #included from: ../reporters/catch_reporter_compact.hpp\n#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED\n\nnamespace Catch {\n\n    struct CompactReporter : StreamingReporterBase {\n\n        CompactReporter( ReporterConfig const& _config )\n        : StreamingReporterBase( _config )\n        {}\n\n        virtual ~CompactReporter();\n\n        static std::string getDescription() {\n            return \"Reports test results on a single line, suitable for IDEs\";\n        }\n\n        virtual ReporterPreferences getPreferences() const {\n            ReporterPreferences prefs;\n            prefs.shouldRedirectStdOut = false;\n            return prefs;\n        }\n\n        virtual void noMatchingTestCases( std::string const& spec ) {\n            stream << \"No test cases matched '\" << spec << \"'\" << std::endl;\n        }\n\n        virtual void assertionStarting( AssertionInfo const& ) {\n        }\n\n        virtual bool assertionEnded( AssertionStats const& _assertionStats ) {\n            AssertionResult const& result = _assertionStats.assertionResult;\n\n            bool printInfoMessages = true;\n\n            // Drop out if result was successful and we're not printing those\n            if( !m_config->includeSuccessfulResults() && result.isOk() ) {\n                if( result.getResultType() != ResultWas::Warning )\n                    return false;\n                printInfoMessages = false;\n            }\n\n            AssertionPrinter printer( stream, _assertionStats, printInfoMessages );\n            printer.print();\n\n            stream << std::endl;\n            return true;\n        }\n\n        virtual void testRunEnded( TestRunStats const& _testRunStats ) {\n            printTotals( _testRunStats.totals );\n            stream << \"\\n\" << std::endl;\n            StreamingReporterBase::testRunEnded( _testRunStats );\n        }\n\n    private:\n        class AssertionPrinter {\n            void operator= ( AssertionPrinter const& );\n        public:\n            AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )\n            : stream( _stream )\n            , stats( _stats )\n            , result( _stats.assertionResult )\n            , messages( _stats.infoMessages )\n            , itMessage( _stats.infoMessages.begin() )\n            , printInfoMessages( _printInfoMessages )\n            {}\n\n            void print() {\n                printSourceInfo();\n\n                itMessage = messages.begin();\n\n                switch( result.getResultType() ) {\n                    case ResultWas::Ok:\n                        printResultType( Colour::ResultSuccess, passedString() );\n                        printOriginalExpression();\n                        printReconstructedExpression();\n                        if ( ! result.hasExpression() )\n                            printRemainingMessages( Colour::None );\n                        else\n                            printRemainingMessages();\n                        break;\n                    case ResultWas::ExpressionFailed:\n                        if( result.isOk() )\n                            printResultType( Colour::ResultSuccess, failedString() + std::string( \" - but was ok\" ) );\n                        else\n                            printResultType( Colour::Error, failedString() );\n                        printOriginalExpression();\n                        printReconstructedExpression();\n                        printRemainingMessages();\n                        break;\n                    case ResultWas::ThrewException:\n                        printResultType( Colour::Error, failedString() );\n                        printIssue( \"unexpected exception with message:\" );\n                        printMessage();\n                        printExpressionWas();\n                        printRemainingMessages();\n                        break;\n                    case ResultWas::FatalErrorCondition:\n                        printResultType( Colour::Error, failedString() );\n                        printIssue( \"fatal error condition with message:\" );\n                        printMessage();\n                        printExpressionWas();\n                        printRemainingMessages();\n                        break;\n                    case ResultWas::DidntThrowException:\n                        printResultType( Colour::Error, failedString() );\n                        printIssue( \"expected exception, got none\" );\n                        printExpressionWas();\n                        printRemainingMessages();\n                        break;\n                    case ResultWas::Info:\n                        printResultType( Colour::None, \"info\" );\n                        printMessage();\n                        printRemainingMessages();\n                        break;\n                    case ResultWas::Warning:\n                        printResultType( Colour::None, \"warning\" );\n                        printMessage();\n                        printRemainingMessages();\n                        break;\n                    case ResultWas::ExplicitFailure:\n                        printResultType( Colour::Error, failedString() );\n                        printIssue( \"explicitly\" );\n                        printRemainingMessages( Colour::None );\n                        break;\n                    // These cases are here to prevent compiler warnings\n                    case ResultWas::Unknown:\n                    case ResultWas::FailureBit:\n                    case ResultWas::Exception:\n                        printResultType( Colour::Error, \"** internal error **\" );\n                        break;\n                }\n            }\n\n        private:\n            // Colour::LightGrey\n\n            static Colour::Code dimColour() { return Colour::FileName; }\n\n#ifdef CATCH_PLATFORM_MAC\n            static const char* failedString() { return \"FAILED\"; }\n            static const char* passedString() { return \"PASSED\"; }\n#else\n            static const char* failedString() { return \"failed\"; }\n            static const char* passedString() { return \"passed\"; }\n#endif\n\n            void printSourceInfo() const {\n                Colour colourGuard( Colour::FileName );\n                stream << result.getSourceInfo() << \":\";\n            }\n\n            void printResultType( Colour::Code colour, std::string passOrFail ) const {\n                if( !passOrFail.empty() ) {\n                    {\n                        Colour colourGuard( colour );\n                        stream << \" \" << passOrFail;\n                    }\n                    stream << \":\";\n                }\n            }\n\n            void printIssue( std::string issue ) const {\n                stream << \" \" << issue;\n            }\n\n            void printExpressionWas() {\n                if( result.hasExpression() ) {\n                    stream << \";\";\n                    {\n                        Colour colour( dimColour() );\n                        stream << \" expression was:\";\n                    }\n                    printOriginalExpression();\n                }\n            }\n\n            void printOriginalExpression() const {\n                if( result.hasExpression() ) {\n                    stream << \" \" << result.getExpression();\n                }\n            }\n\n            void printReconstructedExpression() const {\n                if( result.hasExpandedExpression() ) {\n                    {\n                        Colour colour( dimColour() );\n                        stream << \" for: \";\n                    }\n                    stream << result.getExpandedExpression();\n                }\n            }\n\n            void printMessage() {\n                if ( itMessage != messages.end() ) {\n                    stream << \" '\" << itMessage->message << \"'\";\n                    ++itMessage;\n                }\n            }\n\n            void printRemainingMessages( Colour::Code colour = dimColour() ) {\n                if ( itMessage == messages.end() )\n                    return;\n\n                // using messages.end() directly yields compilation error:\n                std::vector<MessageInfo>::const_iterator itEnd = messages.end();\n                const std::size_t N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) );\n\n                {\n                    Colour colourGuard( colour );\n                    stream << \" with \" << pluralise( N, \"message\" ) << \":\";\n                }\n\n                for(; itMessage != itEnd; ) {\n                    // If this assertion is a warning ignore any INFO messages\n                    if( printInfoMessages || itMessage->type != ResultWas::Info ) {\n                        stream << \" '\" << itMessage->message << \"'\";\n                        if ( ++itMessage != itEnd ) {\n                            Colour colourGuard( dimColour() );\n                            stream << \" and\";\n                        }\n                    }\n                }\n            }\n\n        private:\n            std::ostream& stream;\n            AssertionStats const& stats;\n            AssertionResult const& result;\n            std::vector<MessageInfo> messages;\n            std::vector<MessageInfo>::const_iterator itMessage;\n            bool printInfoMessages;\n        };\n\n        // Colour, message variants:\n        // - white: No tests ran.\n        // -   red: Failed [both/all] N test cases, failed [both/all] M assertions.\n        // - white: Passed [both/all] N test cases (no assertions).\n        // -   red: Failed N tests cases, failed M assertions.\n        // - green: Passed [both/all] N tests cases with M assertions.\n\n        std::string bothOrAll( std::size_t count ) const {\n            return count == 1 ? \"\" : count == 2 ? \"both \" : \"all \" ;\n        }\n\n        void printTotals( const Totals& totals ) const {\n            if( totals.testCases.total() == 0 ) {\n                stream << \"No tests ran.\";\n            }\n            else if( totals.testCases.failed == totals.testCases.total() ) {\n                Colour colour( Colour::ResultError );\n                const std::string qualify_assertions_failed =\n                    totals.assertions.failed == totals.assertions.total() ?\n                        bothOrAll( totals.assertions.failed ) : \"\";\n                stream <<\n                    \"Failed \" << bothOrAll( totals.testCases.failed )\n                              << pluralise( totals.testCases.failed, \"test case\"  ) << \", \"\n                    \"failed \" << qualify_assertions_failed <<\n                                 pluralise( totals.assertions.failed, \"assertion\" ) << \".\";\n            }\n            else if( totals.assertions.total() == 0 ) {\n                stream <<\n                    \"Passed \" << bothOrAll( totals.testCases.total() )\n                              << pluralise( totals.testCases.total(), \"test case\" )\n                              << \" (no assertions).\";\n            }\n            else if( totals.assertions.failed ) {\n                Colour colour( Colour::ResultError );\n                stream <<\n                    \"Failed \" << pluralise( totals.testCases.failed, \"test case\"  ) << \", \"\n                    \"failed \" << pluralise( totals.assertions.failed, \"assertion\" ) << \".\";\n            }\n            else {\n                Colour colour( Colour::ResultSuccess );\n                stream <<\n                    \"Passed \" << bothOrAll( totals.testCases.passed )\n                              << pluralise( totals.testCases.passed, \"test case\"  ) <<\n                    \" with \"  << pluralise( totals.assertions.passed, \"assertion\" ) << \".\";\n            }\n        }\n    };\n\n    INTERNAL_CATCH_REGISTER_REPORTER( \"compact\", CompactReporter )\n\n} // end namespace Catch\n\nnamespace Catch {\n    // These are all here to avoid warnings about not having any out of line\n    // virtual methods\n    NonCopyable::~NonCopyable() {}\n    IShared::~IShared() {}\n    IStream::~IStream() CATCH_NOEXCEPT {}\n    FileStream::~FileStream() CATCH_NOEXCEPT {}\n    CoutStream::~CoutStream() CATCH_NOEXCEPT {}\n    DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {}\n    StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}\n    IContext::~IContext() {}\n    IResultCapture::~IResultCapture() {}\n    ITestCase::~ITestCase() {}\n    ITestCaseRegistry::~ITestCaseRegistry() {}\n    IRegistryHub::~IRegistryHub() {}\n    IMutableRegistryHub::~IMutableRegistryHub() {}\n    IExceptionTranslator::~IExceptionTranslator() {}\n    IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}\n    IReporter::~IReporter() {}\n    IReporterFactory::~IReporterFactory() {}\n    IReporterRegistry::~IReporterRegistry() {}\n    IStreamingReporter::~IStreamingReporter() {}\n    AssertionStats::~AssertionStats() {}\n    SectionStats::~SectionStats() {}\n    TestCaseStats::~TestCaseStats() {}\n    TestGroupStats::~TestGroupStats() {}\n    TestRunStats::~TestRunStats() {}\n    CumulativeReporterBase::SectionNode::~SectionNode() {}\n    CumulativeReporterBase::~CumulativeReporterBase() {}\n\n    StreamingReporterBase::~StreamingReporterBase() {}\n    ConsoleReporter::~ConsoleReporter() {}\n    CompactReporter::~CompactReporter() {}\n    IRunner::~IRunner() {}\n    IMutableContext::~IMutableContext() {}\n    IConfig::~IConfig() {}\n    XmlReporter::~XmlReporter() {}\n    JunitReporter::~JunitReporter() {}\n    TestRegistry::~TestRegistry() {}\n    FreeFunctionTestCase::~FreeFunctionTestCase() {}\n    IGeneratorInfo::~IGeneratorInfo() {}\n    IGeneratorsForTest::~IGeneratorsForTest() {}\n    WildcardPattern::~WildcardPattern() {}\n    TestSpec::Pattern::~Pattern() {}\n    TestSpec::NamePattern::~NamePattern() {}\n    TestSpec::TagPattern::~TagPattern() {}\n    TestSpec::ExcludedPattern::~ExcludedPattern() {}\n\n    Matchers::Impl::StdString::Equals::~Equals() {}\n    Matchers::Impl::StdString::Contains::~Contains() {}\n    Matchers::Impl::StdString::StartsWith::~StartsWith() {}\n    Matchers::Impl::StdString::EndsWith::~EndsWith() {}\n\n    void Config::dummy() {}\n\n    namespace TestCaseTracking {\n        ITracker::~ITracker() {}\n        TrackerBase::~TrackerBase() {}\n        SectionTracker::~SectionTracker() {}\n        IndexTracker::~IndexTracker() {}\n    }\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n#endif\n\n#ifdef CATCH_CONFIG_MAIN\n// #included from: internal/catch_default_main.hpp\n#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED\n\n#ifndef __OBJC__\n\n// Standard C/C++ main entry point\nint main (int argc, char * argv[]) {\n    return Catch::Session().run( argc, argv );\n}\n\n#else // __OBJC__\n\n// Objective-C entry point\nint main (int argc, char * const argv[]) {\n#if !CATCH_ARC_ENABLED\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n#endif\n\n    Catch::registerTestMethods();\n    int result = Catch::Session().run( argc, (char* const*)argv );\n\n#if !CATCH_ARC_ENABLED\n    [pool drain];\n#endif\n\n    return result;\n}\n\n#endif // __OBJC__\n\n#endif\n\n#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED\n#  undef CLARA_CONFIG_MAIN\n#endif\n\n//////\n\n// If this config identifier is defined then all CATCH macros are prefixed with CATCH_\n#ifdef CATCH_CONFIG_PREFIX_ALL\n\n#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, \"CATCH_REQUIRE\" )\n#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, \"CATCH_REQUIRE_FALSE\" )\n\n#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, \"\", \"CATCH_REQUIRE_THROWS\" )\n#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, \"CATCH_REQUIRE_THROWS_AS\" )\n#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, \"CATCH_REQUIRE_THROWS_WITH\" )\n#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, \"CATCH_REQUIRE_NOTHROW\" )\n\n#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_CHECK\" )\n#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, \"CATCH_CHECK_FALSE\" )\n#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_CHECKED_IF\" )\n#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_CHECKED_ELSE\" )\n#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, \"CATCH_CHECK_NOFAIL\" )\n\n#define CATCH_CHECK_THROWS( expr )  INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, \"\", \"CATCH_CHECK_THROWS\" )\n#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_CHECK_THROWS_AS\" )\n#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, \"CATCH_CHECK_THROWS_WITH\" )\n#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_CHECK_NOTHROW\" )\n\n#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_CHECK_THAT\" )\n#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, \"CATCH_REQUIRE_THAT\" )\n\n#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, \"CATCH_INFO\" )\n#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_WARN\", msg )\n#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, \"CATCH_INFO\" )\n#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg \" := \" << msg, \"CATCH_CAPTURE\" )\n#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg \" := \" << msg, \"CATCH_CAPTURE\" )\n\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n    #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )\n    #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )\n    #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )\n    #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )\n    #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )\n    #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, \"CATCH_FAIL\", __VA_ARGS__ )\n    #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_SUCCEED\", __VA_ARGS__ )\n#else\n    #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )\n    #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )\n    #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )\n    #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description )\n    #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )\n    #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, \"CATCH_FAIL\", msg )\n    #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, \"CATCH_SUCCEED\", msg )\n#endif\n#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( \"\", \"\" )\n\n#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )\n#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )\n\n#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )\n\n// \"BDD-style\" convenience wrappers\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( \"Scenario: \" __VA_ARGS__ )\n#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" __VA_ARGS__ )\n#else\n#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( \"Scenario: \" name, tags )\n#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" name, tags )\n#endif\n#define CATCH_GIVEN( desc )    CATCH_SECTION( std::string( \"Given: \") + desc, \"\" )\n#define CATCH_WHEN( desc )     CATCH_SECTION( std::string( \" When: \") + desc, \"\" )\n#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( \"  And: \") + desc, \"\" )\n#define CATCH_THEN( desc )     CATCH_SECTION( std::string( \" Then: \") + desc, \"\" )\n#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( \"  And: \") + desc, \"\" )\n\n// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required\n#else\n\n#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, \"REQUIRE\" )\n#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, \"REQUIRE_FALSE\" )\n\n#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, \"\", \"REQUIRE_THROWS\" )\n#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, \"REQUIRE_THROWS_AS\" )\n#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, \"REQUIRE_THROWS_WITH\" )\n#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, \"REQUIRE_NOTHROW\" )\n\n#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, \"CHECK\" )\n#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, \"CHECK_FALSE\" )\n#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, \"CHECKED_IF\" )\n#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, \"CHECKED_ELSE\" )\n#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, \"CHECK_NOFAIL\" )\n\n#define CHECK_THROWS( expr )  INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, \"\", \"CHECK_THROWS\" )\n#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, \"CHECK_THROWS_AS\" )\n#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, \"CHECK_THROWS_WITH\" )\n#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, \"CHECK_NOTHROW\" )\n\n#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, \"CHECK_THAT\" )\n#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, \"REQUIRE_THAT\" )\n\n#define INFO( msg ) INTERNAL_CATCH_INFO( msg, \"INFO\" )\n#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, \"WARN\", msg )\n#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, \"INFO\" )\n#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg \" := \" << msg, \"CAPTURE\" )\n#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg \" := \" << msg, \"CAPTURE\" )\n\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n    #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )\n    #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )\n    #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )\n    #define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )\n    #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )\n    #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, \"FAIL\", __VA_ARGS__ )\n    #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, \"SUCCEED\", __VA_ARGS__ )\n#else\n    #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )\n    #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )\n    #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )\n    #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description )\n    #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )\n    #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, \"FAIL\", msg )\n    #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, \"SUCCEED\", msg )\n#endif\n#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( \"\", \"\" )\n\n#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )\n#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )\n\n#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )\n\n#endif\n\n#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )\n\n// \"BDD-style\" convenience wrappers\n#ifdef CATCH_CONFIG_VARIADIC_MACROS\n#define SCENARIO( ... ) TEST_CASE( \"Scenario: \" __VA_ARGS__ )\n#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" __VA_ARGS__ )\n#else\n#define SCENARIO( name, tags ) TEST_CASE( \"Scenario: \" name, tags )\n#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" name, tags )\n#endif\n#define GIVEN( desc )    SECTION( std::string(\"   Given: \") + desc, \"\" )\n#define WHEN( desc )     SECTION( std::string(\"    When: \") + desc, \"\" )\n#define AND_WHEN( desc ) SECTION( std::string(\"And when: \") + desc, \"\" )\n#define THEN( desc )     SECTION( std::string(\"    Then: \") + desc, \"\" )\n#define AND_THEN( desc ) SECTION( std::string(\"     And: \") + desc, \"\" )\n\nusing Catch::Detail::Approx;\n\n#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n"
  },
  {
    "path": "ThirdParty/FakeIt/Catch/fakeit.hpp",
    "content": "#pragma once\n/*\n *  FakeIt - A Simplified C++ Mocking Framework\n *  Copyright (c) Eran Pe'er 2013\n *  Generated: 2017-05-07 09:27:02.651812\n *  Distributed under the MIT License. Please refer to the LICENSE file at:\n *  https://github.com/eranpeer/FakeIt\n */\n\n#ifndef fakeit_h__\n#define fakeit_h__\n\n\n\n#include <functional>\n#include <memory>\n#include <set>\n#include <vector>\n#include <stdexcept>\n#if defined (__GNUG__) || _MSC_VER >= 1900\n#define THROWS noexcept(false)\n#define NO_THROWS noexcept(true)\n#elif defined (_MSC_VER)\n#define THROWS throw(...)\n#define NO_THROWS\n#endif\n#include <typeinfo>\n#include <unordered_set>\n#include <tuple>\n#include <string>\n#include <iosfwd>\n#include <atomic>\n#include <tuple>\n\n\nnamespace fakeit {\n\n    template<class C>\n    struct naked_type {\n        typedef typename std::remove_cv<typename std::remove_reference<C>::type>::type type;\n    };\n\n    template< class T > struct tuple_arg         { typedef T  type; };\n    template< class T > struct tuple_arg < T& >  { typedef T& type; };\n    template< class T > struct tuple_arg < T&& > { typedef T&&  type; };\n\n\n\n\n    template<typename... arglist>\n    using ArgumentsTuple = std::tuple < arglist... > ;\n\n    template< class T > struct test_arg         { typedef T& type; };\n    template< class T > struct test_arg< T& >   { typedef T& type; };\n    template< class T > struct test_arg< T&& >  { typedef T& type; };\n\n    template< class T > struct production_arg         { typedef T& type; };\n    template< class T > struct production_arg< T& >   { typedef T& type; };\n    template< class T > struct production_arg< T&& >  { typedef T&&  type; };\n\n    template <typename T>\n    class is_ostreamable {\n        struct no {};\n#if defined(_MSC_VER) && _MSC_VER < 1900\n        template <typename T1>\n        static decltype(operator<<(std::declval<std::ostream&>(), std::declval<const T1>())) test(std::ostream &s, const T1 &t);\n#else\n        template <typename T1>\n        static auto test(std::ostream &s, const T1 &t) -> decltype(s << t);\n#endif\n        static no test(...);\n    public:\n\n        static const bool value =\n            std::is_arithmetic<T>::value ||\n            std::is_pointer<T>::value ||\n            std::is_same<decltype(test(*(std::ostream *)nullptr,\n                std::declval<T>())), std::ostream &>::value;\n    };\n\n\n    template <>\n    class is_ostreamable<std::ios_base& (*)(std::ios_base&)> {\n    public:\n        static const bool value = true;\n    };\n\n    template <typename CharT, typename Traits>\n    class is_ostreamable<std::basic_ios<CharT,Traits>& (*)(std::basic_ios<CharT,Traits>&)> {\n    public:\n        static const bool value = true;\n    };\n\n    template <typename CharT, typename Traits>\n    class is_ostreamable<std::basic_ostream<CharT,Traits>& (*)(std::basic_ostream<CharT,Traits>&)> {\n    public:\n        static const bool value = true;\n    };\n\n    template<typename R, typename... arglist>\n    struct VTableMethodType {\n#if defined (__GNUG__)\n        typedef R(*type)(void *, arglist...);\n#elif defined (_MSC_VER)\n        typedef R(__thiscall *type)(void *, arglist...);\n#endif\n    };\n}\n#include <typeinfo>\n#include <tuple>\n#include <string>\n#include <iosfwd>\n#include <sstream>\n#include <string>\n\nnamespace fakeit {\n\n    struct FakeitContext;\n\n    template<typename C>\n    struct MockObject {\n        virtual ~MockObject() THROWS { };\n\n        virtual C &get() = 0;\n\n        virtual FakeitContext &getFakeIt() = 0;\n    };\n\n    struct MethodInfo {\n\n        static unsigned int nextMethodOrdinal() {\n            static std::atomic_uint ordinal{0};\n            return ++ordinal;\n        }\n\n        MethodInfo(unsigned int anId, std::string aName) :\n                _id(anId), _name(aName) { }\n\n        unsigned int id() const {\n            return _id;\n        }\n\n        std::string name() const {\n            return _name;\n        }\n\n        void setName(const std::string &value) {\n            _name = value;\n        }\n\n    private:\n        unsigned int _id;\n        std::string _name;\n    };\n\n    struct UnknownMethod {\n\n        static MethodInfo &instance() {\n            static MethodInfo instance(MethodInfo::nextMethodOrdinal(), \"unknown\");\n            return instance;\n        }\n\n    };\n\n}\nnamespace fakeit {\n    class Destructible {\n    public:\n        virtual ~Destructible() {}\n    };\n}\n\nnamespace fakeit {\n\n    struct Invocation : Destructible {\n\n        static unsigned int nextInvocationOrdinal() {\n            static std::atomic_uint invocationOrdinal{0};\n            return ++invocationOrdinal;\n        }\n\n        struct Matcher {\n\n            virtual ~Matcher() THROWS {\n            }\n\n            virtual bool matches(Invocation &invocation) = 0;\n\n            virtual std::string format() const = 0;\n        };\n\n        Invocation(unsigned int ordinal, MethodInfo &method) :\n                _ordinal(ordinal), _method(method), _isVerified(false) {\n        }\n\n        virtual ~Invocation() override = default;\n\n        unsigned int getOrdinal() const {\n            return _ordinal;\n        }\n\n        MethodInfo &getMethod() const {\n            return _method;\n        }\n\n        void markAsVerified() {\n            _isVerified = true;\n        }\n\n        bool isVerified() const {\n            return _isVerified;\n        }\n\n        virtual std::string format() const = 0;\n\n    private:\n        const unsigned int _ordinal;\n        MethodInfo &_method;\n        bool _isVerified;\n    };\n\n}\n#include <iosfwd>\n#include <tuple>\n#include <string>\n#include <sstream>\n#include <ostream>\n\nnamespace fakeit {\n\n\ttemplate<typename T, class Enable = void>\n\tstruct Formatter;\n\n\ttemplate <>\n\tstruct Formatter<bool>\n\t{\n\t\tstatic std::string format(bool const &val)\n\t\t{\n\t\t\treturn val ? \"true\" : \"false\";\n\t\t}\n\t};\n\n\ttemplate <>\n\tstruct Formatter<char>\n\t{\n\t\tstatic std::string format(char const &val)\n\t\t{\n\t\t\tstd::string s;\n\t\t\ts += \"'\";\n\t\t\ts += val;\n\t\t\ts += \"'\";\n\t\t\treturn s;\n\t\t}\n\t};\n\n\ttemplate<class C>\n\tstruct Formatter<C, typename std::enable_if<!is_ostreamable<C>::value>::type> {\n\t\tstatic std::string format(C const &)\n\t\t{\n\t\t\treturn \"?\";\n\t\t}\n\t};\n\n\ttemplate<class C>\n\tstruct Formatter<C, typename std::enable_if<is_ostreamable<C>::value>::type> {\n\t\tstatic std::string format(C const &val)\n\t\t{\n\t\t\tstd::ostringstream os;\n\t\t\tos << val;\n\t\t\treturn os.str();\n\t\t}\n\t};\n\n\n\ttemplate <typename T>\n\tusing TypeFormatter = Formatter<typename fakeit::naked_type<T>::type>;\n}\n\nnamespace fakeit {\n\n\n    template<class Tuple, std::size_t N>\n    struct TuplePrinter {\n        static void print(std::ostream &strm, const Tuple &t) {\n            TuplePrinter<Tuple, N - 1>::print(strm, t);\n            strm << \", \" << fakeit::TypeFormatter<decltype(std::get<N - 1>(t))>::format(std::get<N - 1>(t));\n        }\n    };\n\n    template<class Tuple>\n    struct TuplePrinter<Tuple, 1> {\n        static void print(std::ostream &strm, const Tuple &t) {\n            strm << fakeit::TypeFormatter<decltype(std::get<0>(t))>::format(std::get<0>(t));\n        }\n    };\n\n    template<class Tuple>\n    struct TuplePrinter<Tuple, 0> {\n        static void print(std::ostream &, const Tuple &) {\n        }\n    };\n\n    template<class ... Args>\n    void print(std::ostream &strm, const std::tuple<Args...> &t) {\n        strm << \"(\";\n        TuplePrinter<decltype(t), sizeof...(Args)>::print(strm, t);\n        strm << \")\";\n    }\n\n    template<class ... Args>\n    std::ostream &operator<<(std::ostream &strm, const std::tuple<Args...> &t) {\n        print(strm, t);\n        return strm;\n    }\n\n}\n\n\nnamespace fakeit {\n\n    template<typename ... arglist>\n    struct ActualInvocation : public Invocation {\n\n        struct Matcher : public virtual Destructible {\n            virtual bool matches(ActualInvocation<arglist...> &actualInvocation) = 0;\n\n            virtual std::string format() const = 0;\n        };\n\n        ActualInvocation(unsigned int ordinal, MethodInfo &method, const typename fakeit::production_arg<arglist>::type... args) :\n            Invocation(ordinal, method), _matcher{ nullptr }\n            , actualArguments{ std::forward<arglist>(args)... }\n        {\n        }\n\n        ArgumentsTuple<arglist...> & getActualArguments() {\n            return actualArguments;\n        }\n\n\n        void setActualMatcher(Matcher *matcher) {\n            this->_matcher = matcher;\n        }\n\n        Matcher *getActualMatcher() {\n            return _matcher;\n        }\n\n        virtual std::string format() const override {\n            std::ostringstream out;\n            out << getMethod().name();\n            print(out, actualArguments);\n            return out.str();\n        }\n\n    private:\n\n        Matcher *_matcher;\n        ArgumentsTuple<arglist...> actualArguments;\n    };\n\n    template<typename ... arglist>\n    std::ostream &operator<<(std::ostream &strm, const ActualInvocation<arglist...> &ai) {\n        strm << ai.format();\n        return strm;\n    }\n\n}\n\n\n\n\n\n#include <unordered_set>\n\nnamespace fakeit {\n\n\tstruct ActualInvocationsContainer {\n\t\tvirtual void clear() = 0;\n\n\t\tvirtual ~ActualInvocationsContainer() NO_THROWS { }\n\t};\n\n    struct ActualInvocationsSource {\n        virtual void getActualInvocations(std::unordered_set<fakeit::Invocation *> &into) const = 0;\n\n        virtual ~ActualInvocationsSource() NO_THROWS { }\n    };\n\n    struct InvocationsSourceProxy : public ActualInvocationsSource {\n\n        InvocationsSourceProxy(ActualInvocationsSource *inner) :\n                _inner(inner) {\n        }\n\n        void getActualInvocations(std::unordered_set<fakeit::Invocation *> &into) const override {\n            _inner->getActualInvocations(into);\n        }\n\n    private:\n        std::shared_ptr<ActualInvocationsSource> _inner;\n    };\n\n    struct UnverifiedInvocationsSource : public ActualInvocationsSource {\n\n        UnverifiedInvocationsSource(InvocationsSourceProxy decorated) : _decorated(decorated) {\n        }\n\n        void getActualInvocations(std::unordered_set<fakeit::Invocation *> &into) const override {\n            std::unordered_set<fakeit::Invocation *> all;\n            _decorated.getActualInvocations(all);\n            for (fakeit::Invocation *i : all) {\n                if (!i->isVerified()) {\n                    into.insert(i);\n                }\n            }\n        }\n\n    private:\n        InvocationsSourceProxy _decorated;\n    };\n\n    struct AggregateInvocationsSource : public ActualInvocationsSource {\n\n        AggregateInvocationsSource(std::vector<ActualInvocationsSource *> &sources) : _sources(sources) {\n        }\n\n        void getActualInvocations(std::unordered_set<fakeit::Invocation *> &into) const override {\n            std::unordered_set<fakeit::Invocation *> tmp;\n            for (ActualInvocationsSource *source : _sources) {\n                source->getActualInvocations(tmp);\n            }\n            filter(tmp, into);\n        }\n\n    protected:\n        bool shouldInclude(fakeit::Invocation *) const {\n            return true;\n        }\n\n    private:\n        std::vector<ActualInvocationsSource *> _sources;\n\n        void filter(std::unordered_set<Invocation *> &source, std::unordered_set<Invocation *> &target) const {\n            for (Invocation *i:source) {\n                if (shouldInclude(i)) {\n                    target.insert(i);\n                }\n            }\n        }\n    };\n}\n\nnamespace fakeit {\n\n    class Sequence {\n    private:\n\n    protected:\n\n        Sequence() {\n        }\n\n        virtual ~Sequence() THROWS {\n        }\n\n    public:\n\n\n        virtual void getExpectedSequence(std::vector<Invocation::Matcher *> &into) const = 0;\n\n\n        virtual void getInvolvedMocks(std::vector<ActualInvocationsSource *> &into) const = 0;\n\n        virtual unsigned int size() const = 0;\n\n        friend class VerifyFunctor;\n    };\n\n    class ConcatenatedSequence : public virtual Sequence {\n    private:\n        const Sequence &s1;\n        const Sequence &s2;\n\n    protected:\n        ConcatenatedSequence(const Sequence &seq1, const Sequence &seq2) :\n                s1(seq1), s2(seq2) {\n        }\n\n    public:\n\n        virtual ~ConcatenatedSequence() {\n        }\n\n        unsigned int size() const override {\n            return s1.size() + s2.size();\n        }\n\n        const Sequence &getLeft() const {\n            return s1;\n        }\n\n        const Sequence &getRight() const {\n            return s2;\n        }\n\n        void getExpectedSequence(std::vector<Invocation::Matcher *> &into) const override {\n            s1.getExpectedSequence(into);\n            s2.getExpectedSequence(into);\n        }\n\n        virtual void getInvolvedMocks(std::vector<ActualInvocationsSource *> &into) const override {\n            s1.getInvolvedMocks(into);\n            s2.getInvolvedMocks(into);\n        }\n\n        friend inline ConcatenatedSequence operator+(const Sequence &s1, const Sequence &s2);\n    };\n\n    class RepeatedSequence : public virtual Sequence {\n    private:\n        const Sequence &_s;\n        const int times;\n\n    protected:\n        RepeatedSequence(const Sequence &s, const int t) :\n                _s(s), times(t) {\n        }\n\n    public:\n\n        ~RepeatedSequence() {\n        }\n\n        unsigned int size() const override {\n            return _s.size() * times;\n        }\n\n        friend inline RepeatedSequence operator*(const Sequence &s, int times);\n\n        friend inline RepeatedSequence operator*(int times, const Sequence &s);\n\n        void getInvolvedMocks(std::vector<ActualInvocationsSource *> &into) const override {\n            _s.getInvolvedMocks(into);\n        }\n\n        void getExpectedSequence(std::vector<Invocation::Matcher *> &into) const override {\n            for (int i = 0; i < times; i++)\n                _s.getExpectedSequence(into);\n        }\n\n        int getTimes() const {\n            return times;\n        }\n\n        const Sequence &getSequence() const {\n            return _s;\n        }\n    };\n\n    inline ConcatenatedSequence operator+(const Sequence &s1, const Sequence &s2) {\n        return ConcatenatedSequence(s1, s2);\n    }\n\n    inline RepeatedSequence operator*(const Sequence &s, int times) {\n        if (times <= 0)\n            throw std::invalid_argument(\"times\");\n        return RepeatedSequence(s, times);\n    }\n\n    inline RepeatedSequence operator*(int times, const Sequence &s) {\n        if (times <= 0)\n            throw std::invalid_argument(\"times\");\n        return RepeatedSequence(s, times);\n    }\n\n}\n\nnamespace fakeit {\n\n    enum class VerificationType {\n        Exact, AtLeast, NoMoreInvocations\n    };\n\n    enum class UnexpectedType {\n        Unmocked, Unmatched\n    };\n\n    struct VerificationEvent {\n\n        VerificationEvent(VerificationType aVerificationType) :\n                _verificationType(aVerificationType), _line(0) {\n        }\n\n        virtual ~VerificationEvent() = default;\n\n        VerificationType verificationType() const {\n            return _verificationType;\n        }\n\n        void setFileInfo(const char * aFile, int aLine, const char * aCallingMethod) {\n            _file = aFile;\n            _callingMethod = aCallingMethod;\n            _line = aLine;\n        }\n\n        const char * file() const {\n            return _file;\n        }\n\n        int line() const {\n            return _line;\n        }\n\n        const char * callingMethod() const {\n            return _callingMethod;\n        }\n\n    private:\n        VerificationType _verificationType;\n\t\tconst char * _file;\n        int _line;\n        const char * _callingMethod;\n    };\n\n    struct NoMoreInvocationsVerificationEvent : public VerificationEvent {\n\n        ~NoMoreInvocationsVerificationEvent() = default;\n\n        NoMoreInvocationsVerificationEvent(\n                std::vector<Invocation *> &allTheIvocations,\n                std::vector<Invocation *> &anUnverifedIvocations) :\n                VerificationEvent(VerificationType::NoMoreInvocations),\n                _allIvocations(allTheIvocations),\n                _unverifedIvocations(anUnverifedIvocations) {\n        }\n\n        const std::vector<Invocation *> &allIvocations() const {\n            return _allIvocations;\n        }\n\n        const std::vector<Invocation *> &unverifedIvocations() const {\n            return _unverifedIvocations;\n        }\n\n    private:\n        const std::vector<Invocation *> _allIvocations;\n        const std::vector<Invocation *> _unverifedIvocations;\n    };\n\n    struct SequenceVerificationEvent : public VerificationEvent {\n\n        ~SequenceVerificationEvent() = default;\n\n        SequenceVerificationEvent(VerificationType aVerificationType,\n                                  std::vector<Sequence *> &anExpectedPattern,\n                                  std::vector<Invocation *> &anActualSequence,\n                                  int anExpectedCount,\n                                  int anActualCount) :\n                VerificationEvent(aVerificationType),\n                _expectedPattern(anExpectedPattern),\n                _actualSequence(anActualSequence),\n                _expectedCount(anExpectedCount),\n                _actualCount(anActualCount)\n        {\n        }\n\n        const std::vector<Sequence *> &expectedPattern() const {\n            return _expectedPattern;\n        }\n\n        const std::vector<Invocation *> &actualSequence() const {\n            return _actualSequence;\n        }\n\n        int expectedCount() const {\n            return _expectedCount;\n        }\n\n        int actualCount() const {\n            return _actualCount;\n        }\n\n    private:\n        const std::vector<Sequence *> _expectedPattern;\n        const std::vector<Invocation *> _actualSequence;\n        const int _expectedCount;\n        const int _actualCount;\n    };\n\n    struct UnexpectedMethodCallEvent {\n        UnexpectedMethodCallEvent(UnexpectedType unexpectedType, const Invocation &invocation) :\n                _unexpectedType(unexpectedType), _invocation(invocation) {\n        }\n\n        const Invocation &getInvocation() const {\n            return _invocation;\n        }\n\n        UnexpectedType getUnexpectedType() const {\n            return _unexpectedType;\n        }\n\n        const UnexpectedType _unexpectedType;\n        const Invocation &_invocation;\n    };\n\n}\n\nnamespace fakeit {\n\n    struct VerificationEventHandler {\n        virtual void handle(const SequenceVerificationEvent &e) = 0;\n\n        virtual void handle(const NoMoreInvocationsVerificationEvent &e) = 0;\n    };\n\n    struct EventHandler : public VerificationEventHandler {\n        using VerificationEventHandler::handle;\n\n        virtual void handle(const UnexpectedMethodCallEvent &e) = 0;\n    };\n\n}\n#include <vector>\n#include <string>\n\nnamespace fakeit {\n\n    struct UnexpectedMethodCallEvent;\n    struct SequenceVerificationEvent;\n    struct NoMoreInvocationsVerificationEvent;\n\n    struct EventFormatter {\n\n        virtual std::string format(const fakeit::UnexpectedMethodCallEvent &e) = 0;\n\n        virtual std::string format(const fakeit::SequenceVerificationEvent &e) = 0;\n\n        virtual std::string format(const fakeit::NoMoreInvocationsVerificationEvent &e) = 0;\n\n    };\n\n}\n\nnamespace fakeit {\n\n    struct FakeitContext : public EventHandler, protected EventFormatter {\n\n        virtual ~FakeitContext() = default;\n\n        void handle(const UnexpectedMethodCallEvent &e) override {\n            fireEvent(e);\n            auto &eh = getTestingFrameworkAdapter();\n            eh.handle(e);\n        }\n\n        void handle(const SequenceVerificationEvent &e) override {\n            fireEvent(e);\n            auto &eh = getTestingFrameworkAdapter();\n            return eh.handle(e);\n        }\n\n        void handle(const NoMoreInvocationsVerificationEvent &e) override {\n            fireEvent(e);\n            auto &eh = getTestingFrameworkAdapter();\n            return eh.handle(e);\n        }\n\n        std::string format(const UnexpectedMethodCallEvent &e) override {\n            auto &eventFormatter = getEventFormatter();\n            return eventFormatter.format(e);\n        }\n\n        std::string format(const SequenceVerificationEvent &e) override {\n            auto &eventFormatter = getEventFormatter();\n            return eventFormatter.format(e);\n        }\n\n        std::string format(const NoMoreInvocationsVerificationEvent &e) override {\n            auto &eventFormatter = getEventFormatter();\n            return eventFormatter.format(e);\n        }\n\n        void addEventHandler(EventHandler &eventListener) {\n            _eventListeners.push_back(&eventListener);\n        }\n\n        void clearEventHandlers() {\n            _eventListeners.clear();\n        }\n\n    protected:\n        virtual EventHandler &getTestingFrameworkAdapter() = 0;\n\n        virtual EventFormatter &getEventFormatter() = 0;\n\n    private:\n        std::vector<EventHandler *> _eventListeners;\n\n        void fireEvent(const NoMoreInvocationsVerificationEvent &evt) {\n            for (auto listener : _eventListeners)\n                listener->handle(evt);\n        }\n\n        void fireEvent(const UnexpectedMethodCallEvent &evt) {\n            for (auto listener : _eventListeners)\n                listener->handle(evt);\n        }\n\n        void fireEvent(const SequenceVerificationEvent &evt) {\n            for (auto listener : _eventListeners)\n                listener->handle(evt);\n        }\n\n    };\n\n}\n#include <iostream>\n#include <iosfwd>\n\nnamespace fakeit {\n\n    struct DefaultEventFormatter : public EventFormatter {\n\n        virtual std::string format(const UnexpectedMethodCallEvent &e) override {\n            std::ostringstream out;\n            out << \"Unexpected method invocation: \";\n            out << e.getInvocation().format() << std::endl;\n            if (UnexpectedType::Unmatched == e.getUnexpectedType()) {\n                out << \"  Could not find Any recorded behavior to support this method call.\";\n            } else {\n                out << \"  An unmocked method was invoked. All used virtual methods must be stubbed!\";\n            }\n            return out.str();\n        }\n\n\n        virtual std::string format(const SequenceVerificationEvent &e) override {\n            std::ostringstream out;\n            out << \"Verification error\" << std::endl;\n\n            out << \"Expected pattern: \";\n            const std::vector<fakeit::Sequence *> expectedPattern = e.expectedPattern();\n            out << formatExpectedPattern(expectedPattern) << std::endl;\n\n            out << \"Expected matches: \";\n            formatExpectedCount(out, e.verificationType(), e.expectedCount());\n            out << std::endl;\n\n            out << \"Actual matches  : \" << e.actualCount() << std::endl;\n\n            auto actualSequence = e.actualSequence();\n            out << \"Actual sequence : total of \" << actualSequence.size() << \" actual invocations\";\n            if (actualSequence.size() == 0) {\n                out << \".\";\n            } else {\n                out << \":\" << std::endl;\n            }\n            formatInvocationList(out, actualSequence);\n\n            return out.str();\n        }\n\n        virtual std::string format(const NoMoreInvocationsVerificationEvent &e) override {\n            std::ostringstream out;\n            out << \"Verification error\" << std::endl;\n            out << \"Expected no more invocations!! But the following unverified invocations were found:\" << std::endl;\n            formatInvocationList(out, e.unverifedIvocations());\n            return out.str();\n        }\n\n    private:\n\n        static std::string formatSequence(const Sequence &val) {\n            const ConcatenatedSequence *cs = dynamic_cast<const ConcatenatedSequence *>(&val);\n            if (cs) {\n                return format(*cs);\n            }\n            const RepeatedSequence *rs = dynamic_cast<const RepeatedSequence *>(&val);\n            if (rs) {\n                return format(*rs);\n            }\n\n\n            std::vector<Invocation::Matcher *> vec;\n            val.getExpectedSequence(vec);\n            return vec[0]->format();\n        }\n\n        static void formatExpectedCount(std::ostream &out, fakeit::VerificationType verificationType,\n                                        int expectedCount) {\n            if (verificationType == fakeit::VerificationType::Exact)\n                out << \"exactly \";\n\n            if (verificationType == fakeit::VerificationType::AtLeast)\n                out << \"at least \";\n\n            out << expectedCount;\n        }\n\n        static void formatInvocationList(std::ostream &out, const std::vector<fakeit::Invocation *> &actualSequence) {\n            size_t max_size = actualSequence.size();\n            if (max_size > 5)\n                max_size = 5;\n\n            for (unsigned int i = 0; i < max_size; i++) {\n                out << \"  \";\n                auto invocation = actualSequence[i];\n                out << invocation->format();\n                if (i < max_size - 1)\n                    out << std::endl;\n            }\n\n            if (actualSequence.size() > max_size)\n                out << std::endl << \"  ...\";\n        }\n\n        static std::string format(const ConcatenatedSequence &val) {\n            std::ostringstream out;\n            out << formatSequence(val.getLeft()) << \" + \" << formatSequence(val.getRight());\n            return out.str();\n        }\n\n        static std::string format(const RepeatedSequence &val) {\n            std::ostringstream out;\n            const ConcatenatedSequence *cs = dynamic_cast<const ConcatenatedSequence *>(&val.getSequence());\n            const RepeatedSequence *rs = dynamic_cast<const RepeatedSequence *>(&val.getSequence());\n            if (rs || cs)\n                out << '(';\n            out << formatSequence(val.getSequence());\n            if (rs || cs)\n                out << ')';\n\n            out << \" * \" << val.getTimes();\n            return out.str();\n        }\n\n        static std::string formatExpectedPattern(const std::vector<fakeit::Sequence *> &expectedPattern) {\n            std::string expectedPatternStr;\n            for (unsigned int i = 0; i < expectedPattern.size(); i++) {\n                Sequence *s = expectedPattern[i];\n                expectedPatternStr += formatSequence(*s);\n                if (i < expectedPattern.size() - 1)\n                    expectedPatternStr += \" ... \";\n            }\n            return expectedPatternStr;\n        }\n    };\n}\nnamespace fakeit {\n\n    struct FakeitException {\n        std::exception err;\n\n        virtual ~FakeitException() = default;\n\n        virtual std::string what() const = 0;\n\n        friend std::ostream &operator<<(std::ostream &os, const FakeitException &val) {\n            os << val.what();\n            return os;\n        }\n    };\n\n\n\n\n    struct UnexpectedMethodCallException : public FakeitException {\n\n        UnexpectedMethodCallException(std::string format) :\n                _format(format) {\n        }\n\n        virtual std::string what() const override {\n            return _format;\n        }\n\n    private:\n        std::string _format;\n    };\n\n}\n\nnamespace fakeit {\n\n    struct DefaultEventLogger : public fakeit::EventHandler {\n\n        DefaultEventLogger(EventFormatter &formatter) : _formatter(formatter), _out(std::cout) { }\n\n        virtual void handle(const UnexpectedMethodCallEvent &e) override {\n            _out << _formatter.format(e) << std::endl;\n        }\n\n        virtual void handle(const SequenceVerificationEvent &e) override {\n            _out << _formatter.format(e) << std::endl;\n        }\n\n        virtual void handle(const NoMoreInvocationsVerificationEvent &e) override {\n            _out << _formatter.format(e) << std::endl;\n        }\n\n    private:\n        EventFormatter &_formatter;\n        std::ostream &_out;\n    };\n\n}\n\nnamespace fakeit {\n\n    class AbstractFakeit : public FakeitContext {\n    public:\n        virtual ~AbstractFakeit() = default;\n\n    protected:\n\n        virtual fakeit::EventHandler &accessTestingFrameworkAdapter() = 0;\n\n        virtual EventFormatter &accessEventFormatter() = 0;\n    };\n\n    class DefaultFakeit : public AbstractFakeit {\n        DefaultEventFormatter _formatter;\n        fakeit::EventFormatter *_customFormatter;\n        fakeit::EventHandler *_testingFrameworkAdapter;\n\n    public:\n\n        DefaultFakeit() : _formatter(),\n                          _customFormatter(nullptr),\n                          _testingFrameworkAdapter(nullptr) {\n        }\n\n        virtual ~DefaultFakeit() = default;\n\n        void setCustomEventFormatter(fakeit::EventFormatter &customEventFormatter) {\n            _customFormatter = &customEventFormatter;\n        }\n\n        void resetCustomEventFormatter() {\n            _customFormatter = nullptr;\n        }\n\n        void setTestingFrameworkAdapter(fakeit::EventHandler &testingFrameforkAdapter) {\n            _testingFrameworkAdapter = &testingFrameforkAdapter;\n        }\n\n        void resetTestingFrameworkAdapter() {\n            _testingFrameworkAdapter = nullptr;\n        }\n\n    protected:\n\n        fakeit::EventHandler &getTestingFrameworkAdapter() override {\n            if (_testingFrameworkAdapter)\n                return *_testingFrameworkAdapter;\n            return accessTestingFrameworkAdapter();\n        }\n\n        EventFormatter &getEventFormatter() override {\n            if (_customFormatter)\n                return *_customFormatter;\n            return accessEventFormatter();\n        }\n\n        EventFormatter &accessEventFormatter() override {\n            return _formatter;\n        }\n\n    };\n}\n\nnamespace fakeit {\n\n    struct VerificationException : public FakeitException {\n        virtual ~VerificationException() = default;\n\n        void setFileInfo(const char *file, int line, const char *callingMethod) {\n            _file = file;\n            _callingMethod = callingMethod;\n            _line = line;\n        }\n\n        const char *file() const {\n            return _file;\n        }\n\n        int line() const {\n            return _line;\n        }\n\n        const char *callingMethod() const {\n            return _callingMethod;\n        }\n\n    private:\n        const char *_file;\n        int _line;\n        const char *_callingMethod;\n    };\n\n    struct NoMoreInvocationsVerificationException : public VerificationException {\n\n        NoMoreInvocationsVerificationException(std::string format) :\n                _format(format) {\n        }\n\n        virtual std::string what() const override {\n            return _format;\n        }\n\n    private:\n        std::string _format;\n    };\n\n    struct SequenceVerificationException : public VerificationException {\n        SequenceVerificationException(const std::string &format) :\n                _format(format)\n        {\n        }\n\n        virtual std::string what() const override {\n            return _format;\n        }\n\n    private:\n        std::string _format;\n    };\n\n    class CatchAdapter : public EventHandler {\n        EventFormatter &_formatter;\n\n        std::string formatLineNumber(std::string file, int num) {\n#ifndef __GNUG__\n            return file + std::string(\"(\") + std::to_string(num) + std::string(\")\");\n#else\n            return file + std::string(\":\") + std::to_string(num);\n#endif\n        }\n\n    public:\n\n        virtual ~CatchAdapter() = default;\n\n        CatchAdapter(EventFormatter &formatter)\n                : _formatter(formatter) {}\n\n        virtual void handle(const UnexpectedMethodCallEvent &evt) override {\n            std::string format = _formatter.format(evt);\n            Catch::ResultBuilder __catchResult(\"FAIL\", ::Catch::SourceLineInfo(),\n                                               \"\", Catch::ResultDisposition::Normal);\n            __catchResult << format + ::Catch::StreamEndStop();\n            __catchResult.captureResult(Catch::ResultWas::ExplicitFailure);\n            INTERNAL_CATCH_REACT(__catchResult)\n            throw Catch::TestFailureException();\n        }\n\n        virtual void handle(const SequenceVerificationEvent &evt) override {\n            std::string format(formatLineNumber(evt.file(), evt.line()) + \": \" + _formatter.format(evt));\n            Catch::ResultBuilder __catchResult(\"FAIL\", ::Catch::SourceLineInfo(evt.file(),\n                                                                               static_cast<std::size_t>( evt.line())),\n                                               \"\", Catch::ResultDisposition::Normal);\n            __catchResult << format + ::Catch::StreamEndStop();\n            __catchResult.captureResult(Catch::ResultWas::ExplicitFailure);\n            INTERNAL_CATCH_REACT(__catchResult)\n            throw Catch::TestFailureException();\n        }\n\n        virtual void handle(const NoMoreInvocationsVerificationEvent &evt) override {\n            std::string format(formatLineNumber(evt.file(), evt.line()) + \": \" + _formatter.format(evt));\n            Catch::ResultBuilder __catchResult(\"FAIL\", ::Catch::SourceLineInfo(evt.file(),\n                                                                               static_cast<std::size_t>( evt.line())),\n                                               \"\", Catch::ResultDisposition::Normal);\n            __catchResult << format + ::Catch::StreamEndStop();\n            __catchResult.captureResult(Catch::ResultWas::ExplicitFailure);\n            INTERNAL_CATCH_REACT(__catchResult)\n            throw Catch::TestFailureException();\n        }\n\n    };\n\n\n    class CatchFakeit : public DefaultFakeit {\n\n\n    public:\n\n        virtual ~CatchFakeit() = default;\n\n        CatchFakeit() : _formatter(), _catchAdapter(_formatter) {}\n\n        static CatchFakeit &getInstance() {\n            static CatchFakeit instance;\n            return instance;\n        }\n\n    protected:\n\n        fakeit::EventHandler &accessTestingFrameworkAdapter() override {\n            return _catchAdapter;\n        }\n\n        EventFormatter &accessEventFormatter() override {\n            return _formatter;\n        }\n\n    private:\n\n        DefaultEventFormatter _formatter;\n        CatchAdapter _catchAdapter;\n    };\n\n}\n\nstatic fakeit::DefaultFakeit& Fakeit = fakeit::CatchFakeit::getInstance();\n\n\n#include <type_traits>\n#include <unordered_set>\n\n#include <memory>\n#include <functional>\n#include <type_traits>\n#include <vector>\n#include <array>\n#include <new>\n\n#include <functional>\n#include <type_traits>\nnamespace fakeit {\n\n    struct VirtualOffsetSelector {\n\n        unsigned int offset;\n\n        virtual unsigned int offset0(int) {\n            return offset = 0;\n        }\n\n        virtual unsigned int offset1(int) {\n            return offset = 1;\n        }\n\n        virtual unsigned int offset2(int) {\n            return offset = 2;\n        }\n\n        virtual unsigned int offset3(int) {\n            return offset = 3;\n        }\n\n        virtual unsigned int offset4(int) {\n            return offset = 4;\n        }\n\n        virtual unsigned int offset5(int) {\n            return offset = 5;\n        }\n\n        virtual unsigned int offset6(int) {\n            return offset = 6;\n        }\n\n        virtual unsigned int offset7(int) {\n            return offset = 7;\n        }\n\n        virtual unsigned int offset8(int) {\n            return offset = 8;\n        }\n\n        virtual unsigned int offset9(int) {\n            return offset = 9;\n        }\n\n        virtual unsigned int offset10(int) {\n            return offset = 10;\n        }\n\n        virtual unsigned int offset11(int) {\n            return offset = 11;\n        }\n\n        virtual unsigned int offset12(int) {\n            return offset = 12;\n        }\n\n        virtual unsigned int offset13(int) {\n            return offset = 13;\n        }\n\n        virtual unsigned int offset14(int) {\n            return offset = 14;\n        }\n\n        virtual unsigned int offset15(int) {\n            return offset = 15;\n        }\n\n        virtual unsigned int offset16(int) {\n            return offset = 16;\n        }\n\n        virtual unsigned int offset17(int) {\n            return offset = 17;\n        }\n\n        virtual unsigned int offset18(int) {\n            return offset = 18;\n        }\n\n        virtual unsigned int offset19(int) {\n            return offset = 19;\n        }\n\n        virtual unsigned int offset20(int) {\n            return offset = 20;\n        }\n\n        virtual unsigned int offset21(int) {\n            return offset = 21;\n        }\n\n        virtual unsigned int offset22(int) {\n            return offset = 22;\n        }\n\n        virtual unsigned int offset23(int) {\n            return offset = 23;\n        }\n\n        virtual unsigned int offset24(int) {\n            return offset = 24;\n        }\n\n        virtual unsigned int offset25(int) {\n            return offset = 25;\n        }\n\n        virtual unsigned int offset26(int) {\n            return offset = 26;\n        }\n\n        virtual unsigned int offset27(int) {\n            return offset = 27;\n        }\n\n        virtual unsigned int offset28(int) {\n            return offset = 28;\n        }\n\n        virtual unsigned int offset29(int) {\n            return offset = 29;\n        }\n\n        virtual unsigned int offset30(int) {\n            return offset = 30;\n        }\n\n        virtual unsigned int offset31(int) {\n            return offset = 31;\n        }\n\n        virtual unsigned int offset32(int) {\n            return offset = 32;\n        }\n\n        virtual unsigned int offset33(int) {\n            return offset = 33;\n        }\n\n        virtual unsigned int offset34(int) {\n            return offset = 34;\n        }\n\n        virtual unsigned int offset35(int) {\n            return offset = 35;\n        }\n\n        virtual unsigned int offset36(int) {\n            return offset = 36;\n        }\n\n        virtual unsigned int offset37(int) {\n            return offset = 37;\n        }\n\n        virtual unsigned int offset38(int) {\n            return offset = 38;\n        }\n\n        virtual unsigned int offset39(int) {\n            return offset = 39;\n        }\n\n        virtual unsigned int offset40(int) {\n            return offset = 40;\n        }\n\n        virtual unsigned int offset41(int) {\n            return offset = 41;\n        }\n\n        virtual unsigned int offset42(int) {\n            return offset = 42;\n        }\n\n        virtual unsigned int offset43(int) {\n            return offset = 43;\n        }\n\n        virtual unsigned int offset44(int) {\n            return offset = 44;\n        }\n\n        virtual unsigned int offset45(int) {\n            return offset = 45;\n        }\n\n        virtual unsigned int offset46(int) {\n            return offset = 46;\n        }\n\n        virtual unsigned int offset47(int) {\n            return offset = 47;\n        }\n\n        virtual unsigned int offset48(int) {\n            return offset = 48;\n        }\n\n        virtual unsigned int offset49(int) {\n            return offset = 49;\n        }\n\n        virtual unsigned int offset50(int) {\n            return offset = 50;\n        }\n\n        virtual unsigned int offset51(int) {\n            return offset = 51;\n        }\n\n        virtual unsigned int offset52(int) {\n            return offset = 52;\n        }\n\n        virtual unsigned int offset53(int) {\n            return offset = 53;\n        }\n\n        virtual unsigned int offset54(int) {\n            return offset = 54;\n        }\n\n        virtual unsigned int offset55(int) {\n            return offset = 55;\n        }\n\n        virtual unsigned int offset56(int) {\n            return offset = 56;\n        }\n\n        virtual unsigned int offset57(int) {\n            return offset = 57;\n        }\n\n        virtual unsigned int offset58(int) {\n            return offset = 58;\n        }\n\n        virtual unsigned int offset59(int) {\n            return offset = 59;\n        }\n\n        virtual unsigned int offset60(int) {\n            return offset = 60;\n        }\n\n        virtual unsigned int offset61(int) {\n            return offset = 61;\n        }\n\n        virtual unsigned int offset62(int) {\n            return offset = 62;\n        }\n\n        virtual unsigned int offset63(int) {\n            return offset = 63;\n        }\n\n        virtual unsigned int offset64(int) {\n            return offset = 64;\n        }\n\n        virtual unsigned int offset65(int) {\n            return offset = 65;\n        }\n\n        virtual unsigned int offset66(int) {\n            return offset = 66;\n        }\n\n        virtual unsigned int offset67(int) {\n            return offset = 67;\n        }\n\n        virtual unsigned int offset68(int) {\n            return offset = 68;\n        }\n\n        virtual unsigned int offset69(int) {\n            return offset = 69;\n        }\n\n        virtual unsigned int offset70(int) {\n            return offset = 70;\n        }\n\n        virtual unsigned int offset71(int) {\n            return offset = 71;\n        }\n\n        virtual unsigned int offset72(int) {\n            return offset = 72;\n        }\n\n        virtual unsigned int offset73(int) {\n            return offset = 73;\n        }\n\n        virtual unsigned int offset74(int) {\n            return offset = 74;\n        }\n\n        virtual unsigned int offset75(int) {\n            return offset = 75;\n        }\n\n        virtual unsigned int offset76(int) {\n            return offset = 76;\n        }\n\n        virtual unsigned int offset77(int) {\n            return offset = 77;\n        }\n\n        virtual unsigned int offset78(int) {\n            return offset = 78;\n        }\n\n        virtual unsigned int offset79(int) {\n            return offset = 79;\n        }\n\n        virtual unsigned int offset80(int) {\n            return offset = 80;\n        }\n\n        virtual unsigned int offset81(int) {\n            return offset = 81;\n        }\n\n        virtual unsigned int offset82(int) {\n            return offset = 82;\n        }\n\n        virtual unsigned int offset83(int) {\n            return offset = 83;\n        }\n\n        virtual unsigned int offset84(int) {\n            return offset = 84;\n        }\n\n        virtual unsigned int offset85(int) {\n            return offset = 85;\n        }\n\n        virtual unsigned int offset86(int) {\n            return offset = 86;\n        }\n\n        virtual unsigned int offset87(int) {\n            return offset = 87;\n        }\n\n        virtual unsigned int offset88(int) {\n            return offset = 88;\n        }\n\n        virtual unsigned int offset89(int) {\n            return offset = 89;\n        }\n\n        virtual unsigned int offset90(int) {\n            return offset = 90;\n        }\n\n        virtual unsigned int offset91(int) {\n            return offset = 91;\n        }\n\n        virtual unsigned int offset92(int) {\n            return offset = 92;\n        }\n\n        virtual unsigned int offset93(int) {\n            return offset = 93;\n        }\n\n        virtual unsigned int offset94(int) {\n            return offset = 94;\n        }\n\n        virtual unsigned int offset95(int) {\n            return offset = 95;\n        }\n\n        virtual unsigned int offset96(int) {\n            return offset = 96;\n        }\n\n        virtual unsigned int offset97(int) {\n            return offset = 97;\n        }\n\n        virtual unsigned int offset98(int) {\n            return offset = 98;\n        }\n\n        virtual unsigned int offset99(int) {\n            return offset = 99;\n        }\n\n        virtual unsigned int offset100(int) {\n            return offset = 100;\n        }\n\n        virtual unsigned int offset101(int) {\n            return offset = 101;\n        }\n\n        virtual unsigned int offset102(int) {\n            return offset = 102;\n        }\n\n        virtual unsigned int offset103(int) {\n            return offset = 103;\n        }\n\n        virtual unsigned int offset104(int) {\n            return offset = 104;\n        }\n\n        virtual unsigned int offset105(int) {\n            return offset = 105;\n        }\n\n        virtual unsigned int offset106(int) {\n            return offset = 106;\n        }\n\n        virtual unsigned int offset107(int) {\n            return offset = 107;\n        }\n\n        virtual unsigned int offset108(int) {\n            return offset = 108;\n        }\n\n        virtual unsigned int offset109(int) {\n            return offset = 109;\n        }\n\n        virtual unsigned int offset110(int) {\n            return offset = 110;\n        }\n\n        virtual unsigned int offset111(int) {\n            return offset = 111;\n        }\n\n        virtual unsigned int offset112(int) {\n            return offset = 112;\n        }\n\n        virtual unsigned int offset113(int) {\n            return offset = 113;\n        }\n\n        virtual unsigned int offset114(int) {\n            return offset = 114;\n        }\n\n        virtual unsigned int offset115(int) {\n            return offset = 115;\n        }\n\n        virtual unsigned int offset116(int) {\n            return offset = 116;\n        }\n\n        virtual unsigned int offset117(int) {\n            return offset = 117;\n        }\n\n        virtual unsigned int offset118(int) {\n            return offset = 118;\n        }\n\n        virtual unsigned int offset119(int) {\n            return offset = 119;\n        }\n\n        virtual unsigned int offset120(int) {\n            return offset = 120;\n        }\n\n        virtual unsigned int offset121(int) {\n            return offset = 121;\n        }\n\n        virtual unsigned int offset122(int) {\n            return offset = 122;\n        }\n\n        virtual unsigned int offset123(int) {\n            return offset = 123;\n        }\n\n        virtual unsigned int offset124(int) {\n            return offset = 124;\n        }\n\n        virtual unsigned int offset125(int) {\n            return offset = 125;\n        }\n\n        virtual unsigned int offset126(int) {\n            return offset = 126;\n        }\n\n        virtual unsigned int offset127(int) {\n            return offset = 127;\n        }\n\n        virtual unsigned int offset128(int) {\n            return offset = 128;\n        }\n\n        virtual unsigned int offset129(int) {\n            return offset = 129;\n        }\n\n        virtual unsigned int offset130(int) {\n            return offset = 130;\n        }\n\n        virtual unsigned int offset131(int) {\n            return offset = 131;\n        }\n\n        virtual unsigned int offset132(int) {\n            return offset = 132;\n        }\n\n        virtual unsigned int offset133(int) {\n            return offset = 133;\n        }\n\n        virtual unsigned int offset134(int) {\n            return offset = 134;\n        }\n\n        virtual unsigned int offset135(int) {\n            return offset = 135;\n        }\n\n        virtual unsigned int offset136(int) {\n            return offset = 136;\n        }\n\n        virtual unsigned int offset137(int) {\n            return offset = 137;\n        }\n\n        virtual unsigned int offset138(int) {\n            return offset = 138;\n        }\n\n        virtual unsigned int offset139(int) {\n            return offset = 139;\n        }\n\n        virtual unsigned int offset140(int) {\n            return offset = 140;\n        }\n\n        virtual unsigned int offset141(int) {\n            return offset = 141;\n        }\n\n        virtual unsigned int offset142(int) {\n            return offset = 142;\n        }\n\n        virtual unsigned int offset143(int) {\n            return offset = 143;\n        }\n\n        virtual unsigned int offset144(int) {\n            return offset = 144;\n        }\n\n        virtual unsigned int offset145(int) {\n            return offset = 145;\n        }\n\n        virtual unsigned int offset146(int) {\n            return offset = 146;\n        }\n\n        virtual unsigned int offset147(int) {\n            return offset = 147;\n        }\n\n        virtual unsigned int offset148(int) {\n            return offset = 148;\n        }\n\n        virtual unsigned int offset149(int) {\n            return offset = 149;\n        }\n\n        virtual unsigned int offset150(int) {\n            return offset = 150;\n        }\n\n        virtual unsigned int offset151(int) {\n            return offset = 151;\n        }\n\n        virtual unsigned int offset152(int) {\n            return offset = 152;\n        }\n\n        virtual unsigned int offset153(int) {\n            return offset = 153;\n        }\n\n        virtual unsigned int offset154(int) {\n            return offset = 154;\n        }\n\n        virtual unsigned int offset155(int) {\n            return offset = 155;\n        }\n\n        virtual unsigned int offset156(int) {\n            return offset = 156;\n        }\n\n        virtual unsigned int offset157(int) {\n            return offset = 157;\n        }\n\n        virtual unsigned int offset158(int) {\n            return offset = 158;\n        }\n\n        virtual unsigned int offset159(int) {\n            return offset = 159;\n        }\n\n        virtual unsigned int offset160(int) {\n            return offset = 160;\n        }\n\n        virtual unsigned int offset161(int) {\n            return offset = 161;\n        }\n\n        virtual unsigned int offset162(int) {\n            return offset = 162;\n        }\n\n        virtual unsigned int offset163(int) {\n            return offset = 163;\n        }\n\n        virtual unsigned int offset164(int) {\n            return offset = 164;\n        }\n\n        virtual unsigned int offset165(int) {\n            return offset = 165;\n        }\n\n        virtual unsigned int offset166(int) {\n            return offset = 166;\n        }\n\n        virtual unsigned int offset167(int) {\n            return offset = 167;\n        }\n\n        virtual unsigned int offset168(int) {\n            return offset = 168;\n        }\n\n        virtual unsigned int offset169(int) {\n            return offset = 169;\n        }\n\n        virtual unsigned int offset170(int) {\n            return offset = 170;\n        }\n\n        virtual unsigned int offset171(int) {\n            return offset = 171;\n        }\n\n        virtual unsigned int offset172(int) {\n            return offset = 172;\n        }\n\n        virtual unsigned int offset173(int) {\n            return offset = 173;\n        }\n\n        virtual unsigned int offset174(int) {\n            return offset = 174;\n        }\n\n        virtual unsigned int offset175(int) {\n            return offset = 175;\n        }\n\n        virtual unsigned int offset176(int) {\n            return offset = 176;\n        }\n\n        virtual unsigned int offset177(int) {\n            return offset = 177;\n        }\n\n        virtual unsigned int offset178(int) {\n            return offset = 178;\n        }\n\n        virtual unsigned int offset179(int) {\n            return offset = 179;\n        }\n\n        virtual unsigned int offset180(int) {\n            return offset = 180;\n        }\n\n        virtual unsigned int offset181(int) {\n            return offset = 181;\n        }\n\n        virtual unsigned int offset182(int) {\n            return offset = 182;\n        }\n\n        virtual unsigned int offset183(int) {\n            return offset = 183;\n        }\n\n        virtual unsigned int offset184(int) {\n            return offset = 184;\n        }\n\n        virtual unsigned int offset185(int) {\n            return offset = 185;\n        }\n\n        virtual unsigned int offset186(int) {\n            return offset = 186;\n        }\n\n        virtual unsigned int offset187(int) {\n            return offset = 187;\n        }\n\n        virtual unsigned int offset188(int) {\n            return offset = 188;\n        }\n\n        virtual unsigned int offset189(int) {\n            return offset = 189;\n        }\n\n        virtual unsigned int offset190(int) {\n            return offset = 190;\n        }\n\n        virtual unsigned int offset191(int) {\n            return offset = 191;\n        }\n\n        virtual unsigned int offset192(int) {\n            return offset = 192;\n        }\n\n        virtual unsigned int offset193(int) {\n            return offset = 193;\n        }\n\n        virtual unsigned int offset194(int) {\n            return offset = 194;\n        }\n\n        virtual unsigned int offset195(int) {\n            return offset = 195;\n        }\n\n        virtual unsigned int offset196(int) {\n            return offset = 196;\n        }\n\n        virtual unsigned int offset197(int) {\n            return offset = 197;\n        }\n\n        virtual unsigned int offset198(int) {\n            return offset = 198;\n        }\n\n        virtual unsigned int offset199(int) {\n            return offset = 199;\n        }\n\n\n        virtual unsigned int offset200(int) {\n            return offset = 200;\n        }\n\n        virtual unsigned int offset201(int) {\n            return offset = 201;\n        }\n\n        virtual unsigned int offset202(int) {\n            return offset = 202;\n        }\n\n        virtual unsigned int offset203(int) {\n            return offset = 203;\n        }\n\n        virtual unsigned int offset204(int) {\n            return offset = 204;\n        }\n\n        virtual unsigned int offset205(int) {\n            return offset = 205;\n        }\n\n        virtual unsigned int offset206(int) {\n            return offset = 206;\n        }\n\n        virtual unsigned int offset207(int) {\n            return offset = 207;\n        }\n\n        virtual unsigned int offset208(int) {\n            return offset = 208;\n        }\n\n        virtual unsigned int offset209(int) {\n            return offset = 209;\n        }\n\n        virtual unsigned int offset210(int) {\n            return offset = 210;\n        }\n\n        virtual unsigned int offset211(int) {\n            return offset = 211;\n        }\n\n        virtual unsigned int offset212(int) {\n            return offset = 212;\n        }\n\n        virtual unsigned int offset213(int) {\n            return offset = 213;\n        }\n\n        virtual unsigned int offset214(int) {\n            return offset = 214;\n        }\n\n        virtual unsigned int offset215(int) {\n            return offset = 215;\n        }\n\n        virtual unsigned int offset216(int) {\n            return offset = 216;\n        }\n\n        virtual unsigned int offset217(int) {\n            return offset = 217;\n        }\n\n        virtual unsigned int offset218(int) {\n            return offset = 218;\n        }\n\n        virtual unsigned int offset219(int) {\n            return offset = 219;\n        }\n\n        virtual unsigned int offset220(int) {\n            return offset = 220;\n        }\n\n        virtual unsigned int offset221(int) {\n            return offset = 221;\n        }\n\n        virtual unsigned int offset222(int) {\n            return offset = 222;\n        }\n\n        virtual unsigned int offset223(int) {\n            return offset = 223;\n        }\n\n        virtual unsigned int offset224(int) {\n            return offset = 224;\n        }\n\n        virtual unsigned int offset225(int) {\n            return offset = 225;\n        }\n\n        virtual unsigned int offset226(int) {\n            return offset = 226;\n        }\n\n        virtual unsigned int offset227(int) {\n            return offset = 227;\n        }\n\n        virtual unsigned int offset228(int) {\n            return offset = 228;\n        }\n\n        virtual unsigned int offset229(int) {\n            return offset = 229;\n        }\n\n        virtual unsigned int offset230(int) {\n            return offset = 230;\n        }\n\n        virtual unsigned int offset231(int) {\n            return offset = 231;\n        }\n\n        virtual unsigned int offset232(int) {\n            return offset = 232;\n        }\n\n        virtual unsigned int offset233(int) {\n            return offset = 233;\n        }\n\n        virtual unsigned int offset234(int) {\n            return offset = 234;\n        }\n\n        virtual unsigned int offset235(int) {\n            return offset = 235;\n        }\n\n        virtual unsigned int offset236(int) {\n            return offset = 236;\n        }\n\n        virtual unsigned int offset237(int) {\n            return offset = 237;\n        }\n\n        virtual unsigned int offset238(int) {\n            return offset = 238;\n        }\n\n        virtual unsigned int offset239(int) {\n            return offset = 239;\n        }\n\n        virtual unsigned int offset240(int) {\n            return offset = 240;\n        }\n\n        virtual unsigned int offset241(int) {\n            return offset = 241;\n        }\n\n        virtual unsigned int offset242(int) {\n            return offset = 242;\n        }\n\n        virtual unsigned int offset243(int) {\n            return offset = 243;\n        }\n\n        virtual unsigned int offset244(int) {\n            return offset = 244;\n        }\n\n        virtual unsigned int offset245(int) {\n            return offset = 245;\n        }\n\n        virtual unsigned int offset246(int) {\n            return offset = 246;\n        }\n\n        virtual unsigned int offset247(int) {\n            return offset = 247;\n        }\n\n        virtual unsigned int offset248(int) {\n            return offset = 248;\n        }\n\n        virtual unsigned int offset249(int) {\n            return offset = 249;\n        }\n\n        virtual unsigned int offset250(int) {\n            return offset = 250;\n        }\n\n        virtual unsigned int offset251(int) {\n            return offset = 251;\n        }\n\n        virtual unsigned int offset252(int) {\n            return offset = 252;\n        }\n\n        virtual unsigned int offset253(int) {\n            return offset = 253;\n        }\n\n        virtual unsigned int offset254(int) {\n            return offset = 254;\n        }\n\n        virtual unsigned int offset255(int) {\n            return offset = 255;\n        }\n\n        virtual unsigned int offset256(int) {\n            return offset = 256;\n        }\n\n        virtual unsigned int offset257(int) {\n            return offset = 257;\n        }\n\n        virtual unsigned int offset258(int) {\n            return offset = 258;\n        }\n\n        virtual unsigned int offset259(int) {\n            return offset = 259;\n        }\n\n        virtual unsigned int offset260(int) {\n            return offset = 260;\n        }\n\n        virtual unsigned int offset261(int) {\n            return offset = 261;\n        }\n\n        virtual unsigned int offset262(int) {\n            return offset = 262;\n        }\n\n        virtual unsigned int offset263(int) {\n            return offset = 263;\n        }\n\n        virtual unsigned int offset264(int) {\n            return offset = 264;\n        }\n\n        virtual unsigned int offset265(int) {\n            return offset = 265;\n        }\n\n        virtual unsigned int offset266(int) {\n            return offset = 266;\n        }\n\n        virtual unsigned int offset267(int) {\n            return offset = 267;\n        }\n\n        virtual unsigned int offset268(int) {\n            return offset = 268;\n        }\n\n        virtual unsigned int offset269(int) {\n            return offset = 269;\n        }\n\n        virtual unsigned int offset270(int) {\n            return offset = 270;\n        }\n\n        virtual unsigned int offset271(int) {\n            return offset = 271;\n        }\n\n        virtual unsigned int offset272(int) {\n            return offset = 272;\n        }\n\n        virtual unsigned int offset273(int) {\n            return offset = 273;\n        }\n\n        virtual unsigned int offset274(int) {\n            return offset = 274;\n        }\n\n        virtual unsigned int offset275(int) {\n            return offset = 275;\n        }\n\n        virtual unsigned int offset276(int) {\n            return offset = 276;\n        }\n\n        virtual unsigned int offset277(int) {\n            return offset = 277;\n        }\n\n        virtual unsigned int offset278(int) {\n            return offset = 278;\n        }\n\n        virtual unsigned int offset279(int) {\n            return offset = 279;\n        }\n\n        virtual unsigned int offset280(int) {\n            return offset = 280;\n        }\n\n        virtual unsigned int offset281(int) {\n            return offset = 281;\n        }\n\n        virtual unsigned int offset282(int) {\n            return offset = 282;\n        }\n\n        virtual unsigned int offset283(int) {\n            return offset = 283;\n        }\n\n        virtual unsigned int offset284(int) {\n            return offset = 284;\n        }\n\n        virtual unsigned int offset285(int) {\n            return offset = 285;\n        }\n\n        virtual unsigned int offset286(int) {\n            return offset = 286;\n        }\n\n        virtual unsigned int offset287(int) {\n            return offset = 287;\n        }\n\n        virtual unsigned int offset288(int) {\n            return offset = 288;\n        }\n\n        virtual unsigned int offset289(int) {\n            return offset = 289;\n        }\n\n        virtual unsigned int offset290(int) {\n            return offset = 290;\n        }\n\n        virtual unsigned int offset291(int) {\n            return offset = 291;\n        }\n\n        virtual unsigned int offset292(int) {\n            return offset = 292;\n        }\n\n        virtual unsigned int offset293(int) {\n            return offset = 293;\n        }\n\n        virtual unsigned int offset294(int) {\n            return offset = 294;\n        }\n\n        virtual unsigned int offset295(int) {\n            return offset = 295;\n        }\n\n        virtual unsigned int offset296(int) {\n            return offset = 296;\n        }\n\n        virtual unsigned int offset297(int) {\n            return offset = 297;\n        }\n\n        virtual unsigned int offset298(int) {\n            return offset = 298;\n        }\n\n        virtual unsigned int offset299(int) {\n            return offset = 299;\n        }\n\n\n        virtual unsigned int offset300(int) {\n            return offset = 300;\n        }\n\n        virtual unsigned int offset301(int) {\n            return offset = 301;\n        }\n\n        virtual unsigned int offset302(int) {\n            return offset = 302;\n        }\n\n        virtual unsigned int offset303(int) {\n            return offset = 303;\n        }\n\n        virtual unsigned int offset304(int) {\n            return offset = 304;\n        }\n\n        virtual unsigned int offset305(int) {\n            return offset = 305;\n        }\n\n        virtual unsigned int offset306(int) {\n            return offset = 306;\n        }\n\n        virtual unsigned int offset307(int) {\n            return offset = 307;\n        }\n\n        virtual unsigned int offset308(int) {\n            return offset = 308;\n        }\n\n        virtual unsigned int offset309(int) {\n            return offset = 309;\n        }\n\n        virtual unsigned int offset310(int) {\n            return offset = 310;\n        }\n\n        virtual unsigned int offset311(int) {\n            return offset = 311;\n        }\n\n        virtual unsigned int offset312(int) {\n            return offset = 312;\n        }\n\n        virtual unsigned int offset313(int) {\n            return offset = 313;\n        }\n\n        virtual unsigned int offset314(int) {\n            return offset = 314;\n        }\n\n        virtual unsigned int offset315(int) {\n            return offset = 315;\n        }\n\n        virtual unsigned int offset316(int) {\n            return offset = 316;\n        }\n\n        virtual unsigned int offset317(int) {\n            return offset = 317;\n        }\n\n        virtual unsigned int offset318(int) {\n            return offset = 318;\n        }\n\n        virtual unsigned int offset319(int) {\n            return offset = 319;\n        }\n\n        virtual unsigned int offset320(int) {\n            return offset = 320;\n        }\n\n        virtual unsigned int offset321(int) {\n            return offset = 321;\n        }\n\n        virtual unsigned int offset322(int) {\n            return offset = 322;\n        }\n\n        virtual unsigned int offset323(int) {\n            return offset = 323;\n        }\n\n        virtual unsigned int offset324(int) {\n            return offset = 324;\n        }\n\n        virtual unsigned int offset325(int) {\n            return offset = 325;\n        }\n\n        virtual unsigned int offset326(int) {\n            return offset = 326;\n        }\n\n        virtual unsigned int offset327(int) {\n            return offset = 327;\n        }\n\n        virtual unsigned int offset328(int) {\n            return offset = 328;\n        }\n\n        virtual unsigned int offset329(int) {\n            return offset = 329;\n        }\n\n        virtual unsigned int offset330(int) {\n            return offset = 330;\n        }\n\n        virtual unsigned int offset331(int) {\n            return offset = 331;\n        }\n\n        virtual unsigned int offset332(int) {\n            return offset = 332;\n        }\n\n        virtual unsigned int offset333(int) {\n            return offset = 333;\n        }\n\n        virtual unsigned int offset334(int) {\n            return offset = 334;\n        }\n\n        virtual unsigned int offset335(int) {\n            return offset = 335;\n        }\n\n        virtual unsigned int offset336(int) {\n            return offset = 336;\n        }\n\n        virtual unsigned int offset337(int) {\n            return offset = 337;\n        }\n\n        virtual unsigned int offset338(int) {\n            return offset = 338;\n        }\n\n        virtual unsigned int offset339(int) {\n            return offset = 339;\n        }\n\n        virtual unsigned int offset340(int) {\n            return offset = 340;\n        }\n\n        virtual unsigned int offset341(int) {\n            return offset = 341;\n        }\n\n        virtual unsigned int offset342(int) {\n            return offset = 342;\n        }\n\n        virtual unsigned int offset343(int) {\n            return offset = 343;\n        }\n\n        virtual unsigned int offset344(int) {\n            return offset = 344;\n        }\n\n        virtual unsigned int offset345(int) {\n            return offset = 345;\n        }\n\n        virtual unsigned int offset346(int) {\n            return offset = 346;\n        }\n\n        virtual unsigned int offset347(int) {\n            return offset = 347;\n        }\n\n        virtual unsigned int offset348(int) {\n            return offset = 348;\n        }\n\n        virtual unsigned int offset349(int) {\n            return offset = 349;\n        }\n\n        virtual unsigned int offset350(int) {\n            return offset = 350;\n        }\n\n        virtual unsigned int offset351(int) {\n            return offset = 351;\n        }\n\n        virtual unsigned int offset352(int) {\n            return offset = 352;\n        }\n\n        virtual unsigned int offset353(int) {\n            return offset = 353;\n        }\n\n        virtual unsigned int offset354(int) {\n            return offset = 354;\n        }\n\n        virtual unsigned int offset355(int) {\n            return offset = 355;\n        }\n\n        virtual unsigned int offset356(int) {\n            return offset = 356;\n        }\n\n        virtual unsigned int offset357(int) {\n            return offset = 357;\n        }\n\n        virtual unsigned int offset358(int) {\n            return offset = 358;\n        }\n\n        virtual unsigned int offset359(int) {\n            return offset = 359;\n        }\n\n        virtual unsigned int offset360(int) {\n            return offset = 360;\n        }\n\n        virtual unsigned int offset361(int) {\n            return offset = 361;\n        }\n\n        virtual unsigned int offset362(int) {\n            return offset = 362;\n        }\n\n        virtual unsigned int offset363(int) {\n            return offset = 363;\n        }\n\n        virtual unsigned int offset364(int) {\n            return offset = 364;\n        }\n\n        virtual unsigned int offset365(int) {\n            return offset = 365;\n        }\n\n        virtual unsigned int offset366(int) {\n            return offset = 366;\n        }\n\n        virtual unsigned int offset367(int) {\n            return offset = 367;\n        }\n\n        virtual unsigned int offset368(int) {\n            return offset = 368;\n        }\n\n        virtual unsigned int offset369(int) {\n            return offset = 369;\n        }\n\n        virtual unsigned int offset370(int) {\n            return offset = 370;\n        }\n\n        virtual unsigned int offset371(int) {\n            return offset = 371;\n        }\n\n        virtual unsigned int offset372(int) {\n            return offset = 372;\n        }\n\n        virtual unsigned int offset373(int) {\n            return offset = 373;\n        }\n\n        virtual unsigned int offset374(int) {\n            return offset = 374;\n        }\n\n        virtual unsigned int offset375(int) {\n            return offset = 375;\n        }\n\n        virtual unsigned int offset376(int) {\n            return offset = 376;\n        }\n\n        virtual unsigned int offset377(int) {\n            return offset = 377;\n        }\n\n        virtual unsigned int offset378(int) {\n            return offset = 378;\n        }\n\n        virtual unsigned int offset379(int) {\n            return offset = 379;\n        }\n\n        virtual unsigned int offset380(int) {\n            return offset = 380;\n        }\n\n        virtual unsigned int offset381(int) {\n            return offset = 381;\n        }\n\n        virtual unsigned int offset382(int) {\n            return offset = 382;\n        }\n\n        virtual unsigned int offset383(int) {\n            return offset = 383;\n        }\n\n        virtual unsigned int offset384(int) {\n            return offset = 384;\n        }\n\n        virtual unsigned int offset385(int) {\n            return offset = 385;\n        }\n\n        virtual unsigned int offset386(int) {\n            return offset = 386;\n        }\n\n        virtual unsigned int offset387(int) {\n            return offset = 387;\n        }\n\n        virtual unsigned int offset388(int) {\n            return offset = 388;\n        }\n\n        virtual unsigned int offset389(int) {\n            return offset = 389;\n        }\n\n        virtual unsigned int offset390(int) {\n            return offset = 390;\n        }\n\n        virtual unsigned int offset391(int) {\n            return offset = 391;\n        }\n\n        virtual unsigned int offset392(int) {\n            return offset = 392;\n        }\n\n        virtual unsigned int offset393(int) {\n            return offset = 393;\n        }\n\n        virtual unsigned int offset394(int) {\n            return offset = 394;\n        }\n\n        virtual unsigned int offset395(int) {\n            return offset = 395;\n        }\n\n        virtual unsigned int offset396(int) {\n            return offset = 396;\n        }\n\n        virtual unsigned int offset397(int) {\n            return offset = 397;\n        }\n\n        virtual unsigned int offset398(int) {\n            return offset = 398;\n        }\n\n        virtual unsigned int offset399(int) {\n            return offset = 399;\n        }\n\n\n        virtual unsigned int offset400(int) {\n            return offset = 400;\n        }\n\n        virtual unsigned int offset401(int) {\n            return offset = 401;\n        }\n\n        virtual unsigned int offset402(int) {\n            return offset = 402;\n        }\n\n        virtual unsigned int offset403(int) {\n            return offset = 403;\n        }\n\n        virtual unsigned int offset404(int) {\n            return offset = 404;\n        }\n\n        virtual unsigned int offset405(int) {\n            return offset = 405;\n        }\n\n        virtual unsigned int offset406(int) {\n            return offset = 406;\n        }\n\n        virtual unsigned int offset407(int) {\n            return offset = 407;\n        }\n\n        virtual unsigned int offset408(int) {\n            return offset = 408;\n        }\n\n        virtual unsigned int offset409(int) {\n            return offset = 409;\n        }\n\n        virtual unsigned int offset410(int) {\n            return offset = 410;\n        }\n\n        virtual unsigned int offset411(int) {\n            return offset = 411;\n        }\n\n        virtual unsigned int offset412(int) {\n            return offset = 412;\n        }\n\n        virtual unsigned int offset413(int) {\n            return offset = 413;\n        }\n\n        virtual unsigned int offset414(int) {\n            return offset = 414;\n        }\n\n        virtual unsigned int offset415(int) {\n            return offset = 415;\n        }\n\n        virtual unsigned int offset416(int) {\n            return offset = 416;\n        }\n\n        virtual unsigned int offset417(int) {\n            return offset = 417;\n        }\n\n        virtual unsigned int offset418(int) {\n            return offset = 418;\n        }\n\n        virtual unsigned int offset419(int) {\n            return offset = 419;\n        }\n\n        virtual unsigned int offset420(int) {\n            return offset = 420;\n        }\n\n        virtual unsigned int offset421(int) {\n            return offset = 421;\n        }\n\n        virtual unsigned int offset422(int) {\n            return offset = 422;\n        }\n\n        virtual unsigned int offset423(int) {\n            return offset = 423;\n        }\n\n        virtual unsigned int offset424(int) {\n            return offset = 424;\n        }\n\n        virtual unsigned int offset425(int) {\n            return offset = 425;\n        }\n\n        virtual unsigned int offset426(int) {\n            return offset = 426;\n        }\n\n        virtual unsigned int offset427(int) {\n            return offset = 427;\n        }\n\n        virtual unsigned int offset428(int) {\n            return offset = 428;\n        }\n\n        virtual unsigned int offset429(int) {\n            return offset = 429;\n        }\n\n        virtual unsigned int offset430(int) {\n            return offset = 430;\n        }\n\n        virtual unsigned int offset431(int) {\n            return offset = 431;\n        }\n\n        virtual unsigned int offset432(int) {\n            return offset = 432;\n        }\n\n        virtual unsigned int offset433(int) {\n            return offset = 433;\n        }\n\n        virtual unsigned int offset434(int) {\n            return offset = 434;\n        }\n\n        virtual unsigned int offset435(int) {\n            return offset = 435;\n        }\n\n        virtual unsigned int offset436(int) {\n            return offset = 436;\n        }\n\n        virtual unsigned int offset437(int) {\n            return offset = 437;\n        }\n\n        virtual unsigned int offset438(int) {\n            return offset = 438;\n        }\n\n        virtual unsigned int offset439(int) {\n            return offset = 439;\n        }\n\n        virtual unsigned int offset440(int) {\n            return offset = 440;\n        }\n\n        virtual unsigned int offset441(int) {\n            return offset = 441;\n        }\n\n        virtual unsigned int offset442(int) {\n            return offset = 442;\n        }\n\n        virtual unsigned int offset443(int) {\n            return offset = 443;\n        }\n\n        virtual unsigned int offset444(int) {\n            return offset = 444;\n        }\n\n        virtual unsigned int offset445(int) {\n            return offset = 445;\n        }\n\n        virtual unsigned int offset446(int) {\n            return offset = 446;\n        }\n\n        virtual unsigned int offset447(int) {\n            return offset = 447;\n        }\n\n        virtual unsigned int offset448(int) {\n            return offset = 448;\n        }\n\n        virtual unsigned int offset449(int) {\n            return offset = 449;\n        }\n\n        virtual unsigned int offset450(int) {\n            return offset = 450;\n        }\n\n        virtual unsigned int offset451(int) {\n            return offset = 451;\n        }\n\n        virtual unsigned int offset452(int) {\n            return offset = 452;\n        }\n\n        virtual unsigned int offset453(int) {\n            return offset = 453;\n        }\n\n        virtual unsigned int offset454(int) {\n            return offset = 454;\n        }\n\n        virtual unsigned int offset455(int) {\n            return offset = 455;\n        }\n\n        virtual unsigned int offset456(int) {\n            return offset = 456;\n        }\n\n        virtual unsigned int offset457(int) {\n            return offset = 457;\n        }\n\n        virtual unsigned int offset458(int) {\n            return offset = 458;\n        }\n\n        virtual unsigned int offset459(int) {\n            return offset = 459;\n        }\n\n        virtual unsigned int offset460(int) {\n            return offset = 460;\n        }\n\n        virtual unsigned int offset461(int) {\n            return offset = 461;\n        }\n\n        virtual unsigned int offset462(int) {\n            return offset = 462;\n        }\n\n        virtual unsigned int offset463(int) {\n            return offset = 463;\n        }\n\n        virtual unsigned int offset464(int) {\n            return offset = 464;\n        }\n\n        virtual unsigned int offset465(int) {\n            return offset = 465;\n        }\n\n        virtual unsigned int offset466(int) {\n            return offset = 466;\n        }\n\n        virtual unsigned int offset467(int) {\n            return offset = 467;\n        }\n\n        virtual unsigned int offset468(int) {\n            return offset = 468;\n        }\n\n        virtual unsigned int offset469(int) {\n            return offset = 469;\n        }\n\n        virtual unsigned int offset470(int) {\n            return offset = 470;\n        }\n\n        virtual unsigned int offset471(int) {\n            return offset = 471;\n        }\n\n        virtual unsigned int offset472(int) {\n            return offset = 472;\n        }\n\n        virtual unsigned int offset473(int) {\n            return offset = 473;\n        }\n\n        virtual unsigned int offset474(int) {\n            return offset = 474;\n        }\n\n        virtual unsigned int offset475(int) {\n            return offset = 475;\n        }\n\n        virtual unsigned int offset476(int) {\n            return offset = 476;\n        }\n\n        virtual unsigned int offset477(int) {\n            return offset = 477;\n        }\n\n        virtual unsigned int offset478(int) {\n            return offset = 478;\n        }\n\n        virtual unsigned int offset479(int) {\n            return offset = 479;\n        }\n\n        virtual unsigned int offset480(int) {\n            return offset = 480;\n        }\n\n        virtual unsigned int offset481(int) {\n            return offset = 481;\n        }\n\n        virtual unsigned int offset482(int) {\n            return offset = 482;\n        }\n\n        virtual unsigned int offset483(int) {\n            return offset = 483;\n        }\n\n        virtual unsigned int offset484(int) {\n            return offset = 484;\n        }\n\n        virtual unsigned int offset485(int) {\n            return offset = 485;\n        }\n\n        virtual unsigned int offset486(int) {\n            return offset = 486;\n        }\n\n        virtual unsigned int offset487(int) {\n            return offset = 487;\n        }\n\n        virtual unsigned int offset488(int) {\n            return offset = 488;\n        }\n\n        virtual unsigned int offset489(int) {\n            return offset = 489;\n        }\n\n        virtual unsigned int offset490(int) {\n            return offset = 490;\n        }\n\n        virtual unsigned int offset491(int) {\n            return offset = 491;\n        }\n\n        virtual unsigned int offset492(int) {\n            return offset = 492;\n        }\n\n        virtual unsigned int offset493(int) {\n            return offset = 493;\n        }\n\n        virtual unsigned int offset494(int) {\n            return offset = 494;\n        }\n\n        virtual unsigned int offset495(int) {\n            return offset = 495;\n        }\n\n        virtual unsigned int offset496(int) {\n            return offset = 496;\n        }\n\n        virtual unsigned int offset497(int) {\n            return offset = 497;\n        }\n\n        virtual unsigned int offset498(int) {\n            return offset = 498;\n        }\n\n        virtual unsigned int offset499(int) {\n            return offset = 499;\n        }\n\n\n        virtual unsigned int offset500(int) {\n            return offset = 500;\n        }\n\n        virtual unsigned int offset501(int) {\n            return offset = 501;\n        }\n\n        virtual unsigned int offset502(int) {\n            return offset = 502;\n        }\n\n        virtual unsigned int offset503(int) {\n            return offset = 503;\n        }\n\n        virtual unsigned int offset504(int) {\n            return offset = 504;\n        }\n\n        virtual unsigned int offset505(int) {\n            return offset = 505;\n        }\n\n        virtual unsigned int offset506(int) {\n            return offset = 506;\n        }\n\n        virtual unsigned int offset507(int) {\n            return offset = 507;\n        }\n\n        virtual unsigned int offset508(int) {\n            return offset = 508;\n        }\n\n        virtual unsigned int offset509(int) {\n            return offset = 509;\n        }\n\n        virtual unsigned int offset510(int) {\n            return offset = 510;\n        }\n\n        virtual unsigned int offset511(int) {\n            return offset = 511;\n        }\n\n        virtual unsigned int offset512(int) {\n            return offset = 512;\n        }\n\n        virtual unsigned int offset513(int) {\n            return offset = 513;\n        }\n\n        virtual unsigned int offset514(int) {\n            return offset = 514;\n        }\n\n        virtual unsigned int offset515(int) {\n            return offset = 515;\n        }\n\n        virtual unsigned int offset516(int) {\n            return offset = 516;\n        }\n\n        virtual unsigned int offset517(int) {\n            return offset = 517;\n        }\n\n        virtual unsigned int offset518(int) {\n            return offset = 518;\n        }\n\n        virtual unsigned int offset519(int) {\n            return offset = 519;\n        }\n\n        virtual unsigned int offset520(int) {\n            return offset = 520;\n        }\n\n        virtual unsigned int offset521(int) {\n            return offset = 521;\n        }\n\n        virtual unsigned int offset522(int) {\n            return offset = 522;\n        }\n\n        virtual unsigned int offset523(int) {\n            return offset = 523;\n        }\n\n        virtual unsigned int offset524(int) {\n            return offset = 524;\n        }\n\n        virtual unsigned int offset525(int) {\n            return offset = 525;\n        }\n\n        virtual unsigned int offset526(int) {\n            return offset = 526;\n        }\n\n        virtual unsigned int offset527(int) {\n            return offset = 527;\n        }\n\n        virtual unsigned int offset528(int) {\n            return offset = 528;\n        }\n\n        virtual unsigned int offset529(int) {\n            return offset = 529;\n        }\n\n        virtual unsigned int offset530(int) {\n            return offset = 530;\n        }\n\n        virtual unsigned int offset531(int) {\n            return offset = 531;\n        }\n\n        virtual unsigned int offset532(int) {\n            return offset = 532;\n        }\n\n        virtual unsigned int offset533(int) {\n            return offset = 533;\n        }\n\n        virtual unsigned int offset534(int) {\n            return offset = 534;\n        }\n\n        virtual unsigned int offset535(int) {\n            return offset = 535;\n        }\n\n        virtual unsigned int offset536(int) {\n            return offset = 536;\n        }\n\n        virtual unsigned int offset537(int) {\n            return offset = 537;\n        }\n\n        virtual unsigned int offset538(int) {\n            return offset = 538;\n        }\n\n        virtual unsigned int offset539(int) {\n            return offset = 539;\n        }\n\n        virtual unsigned int offset540(int) {\n            return offset = 540;\n        }\n\n        virtual unsigned int offset541(int) {\n            return offset = 541;\n        }\n\n        virtual unsigned int offset542(int) {\n            return offset = 542;\n        }\n\n        virtual unsigned int offset543(int) {\n            return offset = 543;\n        }\n\n        virtual unsigned int offset544(int) {\n            return offset = 544;\n        }\n\n        virtual unsigned int offset545(int) {\n            return offset = 545;\n        }\n\n        virtual unsigned int offset546(int) {\n            return offset = 546;\n        }\n\n        virtual unsigned int offset547(int) {\n            return offset = 547;\n        }\n\n        virtual unsigned int offset548(int) {\n            return offset = 548;\n        }\n\n        virtual unsigned int offset549(int) {\n            return offset = 549;\n        }\n\n        virtual unsigned int offset550(int) {\n            return offset = 550;\n        }\n\n        virtual unsigned int offset551(int) {\n            return offset = 551;\n        }\n\n        virtual unsigned int offset552(int) {\n            return offset = 552;\n        }\n\n        virtual unsigned int offset553(int) {\n            return offset = 553;\n        }\n\n        virtual unsigned int offset554(int) {\n            return offset = 554;\n        }\n\n        virtual unsigned int offset555(int) {\n            return offset = 555;\n        }\n\n        virtual unsigned int offset556(int) {\n            return offset = 556;\n        }\n\n        virtual unsigned int offset557(int) {\n            return offset = 557;\n        }\n\n        virtual unsigned int offset558(int) {\n            return offset = 558;\n        }\n\n        virtual unsigned int offset559(int) {\n            return offset = 559;\n        }\n\n        virtual unsigned int offset560(int) {\n            return offset = 560;\n        }\n\n        virtual unsigned int offset561(int) {\n            return offset = 561;\n        }\n\n        virtual unsigned int offset562(int) {\n            return offset = 562;\n        }\n\n        virtual unsigned int offset563(int) {\n            return offset = 563;\n        }\n\n        virtual unsigned int offset564(int) {\n            return offset = 564;\n        }\n\n        virtual unsigned int offset565(int) {\n            return offset = 565;\n        }\n\n        virtual unsigned int offset566(int) {\n            return offset = 566;\n        }\n\n        virtual unsigned int offset567(int) {\n            return offset = 567;\n        }\n\n        virtual unsigned int offset568(int) {\n            return offset = 568;\n        }\n\n        virtual unsigned int offset569(int) {\n            return offset = 569;\n        }\n\n        virtual unsigned int offset570(int) {\n            return offset = 570;\n        }\n\n        virtual unsigned int offset571(int) {\n            return offset = 571;\n        }\n\n        virtual unsigned int offset572(int) {\n            return offset = 572;\n        }\n\n        virtual unsigned int offset573(int) {\n            return offset = 573;\n        }\n\n        virtual unsigned int offset574(int) {\n            return offset = 574;\n        }\n\n        virtual unsigned int offset575(int) {\n            return offset = 575;\n        }\n\n        virtual unsigned int offset576(int) {\n            return offset = 576;\n        }\n\n        virtual unsigned int offset577(int) {\n            return offset = 577;\n        }\n\n        virtual unsigned int offset578(int) {\n            return offset = 578;\n        }\n\n        virtual unsigned int offset579(int) {\n            return offset = 579;\n        }\n\n        virtual unsigned int offset580(int) {\n            return offset = 580;\n        }\n\n        virtual unsigned int offset581(int) {\n            return offset = 581;\n        }\n\n        virtual unsigned int offset582(int) {\n            return offset = 582;\n        }\n\n        virtual unsigned int offset583(int) {\n            return offset = 583;\n        }\n\n        virtual unsigned int offset584(int) {\n            return offset = 584;\n        }\n\n        virtual unsigned int offset585(int) {\n            return offset = 585;\n        }\n\n        virtual unsigned int offset586(int) {\n            return offset = 586;\n        }\n\n        virtual unsigned int offset587(int) {\n            return offset = 587;\n        }\n\n        virtual unsigned int offset588(int) {\n            return offset = 588;\n        }\n\n        virtual unsigned int offset589(int) {\n            return offset = 589;\n        }\n\n        virtual unsigned int offset590(int) {\n            return offset = 590;\n        }\n\n        virtual unsigned int offset591(int) {\n            return offset = 591;\n        }\n\n        virtual unsigned int offset592(int) {\n            return offset = 592;\n        }\n\n        virtual unsigned int offset593(int) {\n            return offset = 593;\n        }\n\n        virtual unsigned int offset594(int) {\n            return offset = 594;\n        }\n\n        virtual unsigned int offset595(int) {\n            return offset = 595;\n        }\n\n        virtual unsigned int offset596(int) {\n            return offset = 596;\n        }\n\n        virtual unsigned int offset597(int) {\n            return offset = 597;\n        }\n\n        virtual unsigned int offset598(int) {\n            return offset = 598;\n        }\n\n        virtual unsigned int offset599(int) {\n            return offset = 599;\n        }\n\n\n        virtual unsigned int offset600(int) {\n            return offset = 600;\n        }\n\n        virtual unsigned int offset601(int) {\n            return offset = 601;\n        }\n\n        virtual unsigned int offset602(int) {\n            return offset = 602;\n        }\n\n        virtual unsigned int offset603(int) {\n            return offset = 603;\n        }\n\n        virtual unsigned int offset604(int) {\n            return offset = 604;\n        }\n\n        virtual unsigned int offset605(int) {\n            return offset = 605;\n        }\n\n        virtual unsigned int offset606(int) {\n            return offset = 606;\n        }\n\n        virtual unsigned int offset607(int) {\n            return offset = 607;\n        }\n\n        virtual unsigned int offset608(int) {\n            return offset = 608;\n        }\n\n        virtual unsigned int offset609(int) {\n            return offset = 609;\n        }\n\n        virtual unsigned int offset610(int) {\n            return offset = 610;\n        }\n\n        virtual unsigned int offset611(int) {\n            return offset = 611;\n        }\n\n        virtual unsigned int offset612(int) {\n            return offset = 612;\n        }\n\n        virtual unsigned int offset613(int) {\n            return offset = 613;\n        }\n\n        virtual unsigned int offset614(int) {\n            return offset = 614;\n        }\n\n        virtual unsigned int offset615(int) {\n            return offset = 615;\n        }\n\n        virtual unsigned int offset616(int) {\n            return offset = 616;\n        }\n\n        virtual unsigned int offset617(int) {\n            return offset = 617;\n        }\n\n        virtual unsigned int offset618(int) {\n            return offset = 618;\n        }\n\n        virtual unsigned int offset619(int) {\n            return offset = 619;\n        }\n\n        virtual unsigned int offset620(int) {\n            return offset = 620;\n        }\n\n        virtual unsigned int offset621(int) {\n            return offset = 621;\n        }\n\n        virtual unsigned int offset622(int) {\n            return offset = 622;\n        }\n\n        virtual unsigned int offset623(int) {\n            return offset = 623;\n        }\n\n        virtual unsigned int offset624(int) {\n            return offset = 624;\n        }\n\n        virtual unsigned int offset625(int) {\n            return offset = 625;\n        }\n\n        virtual unsigned int offset626(int) {\n            return offset = 626;\n        }\n\n        virtual unsigned int offset627(int) {\n            return offset = 627;\n        }\n\n        virtual unsigned int offset628(int) {\n            return offset = 628;\n        }\n\n        virtual unsigned int offset629(int) {\n            return offset = 629;\n        }\n\n        virtual unsigned int offset630(int) {\n            return offset = 630;\n        }\n\n        virtual unsigned int offset631(int) {\n            return offset = 631;\n        }\n\n        virtual unsigned int offset632(int) {\n            return offset = 632;\n        }\n\n        virtual unsigned int offset633(int) {\n            return offset = 633;\n        }\n\n        virtual unsigned int offset634(int) {\n            return offset = 634;\n        }\n\n        virtual unsigned int offset635(int) {\n            return offset = 635;\n        }\n\n        virtual unsigned int offset636(int) {\n            return offset = 636;\n        }\n\n        virtual unsigned int offset637(int) {\n            return offset = 637;\n        }\n\n        virtual unsigned int offset638(int) {\n            return offset = 638;\n        }\n\n        virtual unsigned int offset639(int) {\n            return offset = 639;\n        }\n\n        virtual unsigned int offset640(int) {\n            return offset = 640;\n        }\n\n        virtual unsigned int offset641(int) {\n            return offset = 641;\n        }\n\n        virtual unsigned int offset642(int) {\n            return offset = 642;\n        }\n\n        virtual unsigned int offset643(int) {\n            return offset = 643;\n        }\n\n        virtual unsigned int offset644(int) {\n            return offset = 644;\n        }\n\n        virtual unsigned int offset645(int) {\n            return offset = 645;\n        }\n\n        virtual unsigned int offset646(int) {\n            return offset = 646;\n        }\n\n        virtual unsigned int offset647(int) {\n            return offset = 647;\n        }\n\n        virtual unsigned int offset648(int) {\n            return offset = 648;\n        }\n\n        virtual unsigned int offset649(int) {\n            return offset = 649;\n        }\n\n        virtual unsigned int offset650(int) {\n            return offset = 650;\n        }\n\n        virtual unsigned int offset651(int) {\n            return offset = 651;\n        }\n\n        virtual unsigned int offset652(int) {\n            return offset = 652;\n        }\n\n        virtual unsigned int offset653(int) {\n            return offset = 653;\n        }\n\n        virtual unsigned int offset654(int) {\n            return offset = 654;\n        }\n\n        virtual unsigned int offset655(int) {\n            return offset = 655;\n        }\n\n        virtual unsigned int offset656(int) {\n            return offset = 656;\n        }\n\n        virtual unsigned int offset657(int) {\n            return offset = 657;\n        }\n\n        virtual unsigned int offset658(int) {\n            return offset = 658;\n        }\n\n        virtual unsigned int offset659(int) {\n            return offset = 659;\n        }\n\n        virtual unsigned int offset660(int) {\n            return offset = 660;\n        }\n\n        virtual unsigned int offset661(int) {\n            return offset = 661;\n        }\n\n        virtual unsigned int offset662(int) {\n            return offset = 662;\n        }\n\n        virtual unsigned int offset663(int) {\n            return offset = 663;\n        }\n\n        virtual unsigned int offset664(int) {\n            return offset = 664;\n        }\n\n        virtual unsigned int offset665(int) {\n            return offset = 665;\n        }\n\n        virtual unsigned int offset666(int) {\n            return offset = 666;\n        }\n\n        virtual unsigned int offset667(int) {\n            return offset = 667;\n        }\n\n        virtual unsigned int offset668(int) {\n            return offset = 668;\n        }\n\n        virtual unsigned int offset669(int) {\n            return offset = 669;\n        }\n\n        virtual unsigned int offset670(int) {\n            return offset = 670;\n        }\n\n        virtual unsigned int offset671(int) {\n            return offset = 671;\n        }\n\n        virtual unsigned int offset672(int) {\n            return offset = 672;\n        }\n\n        virtual unsigned int offset673(int) {\n            return offset = 673;\n        }\n\n        virtual unsigned int offset674(int) {\n            return offset = 674;\n        }\n\n        virtual unsigned int offset675(int) {\n            return offset = 675;\n        }\n\n        virtual unsigned int offset676(int) {\n            return offset = 676;\n        }\n\n        virtual unsigned int offset677(int) {\n            return offset = 677;\n        }\n\n        virtual unsigned int offset678(int) {\n            return offset = 678;\n        }\n\n        virtual unsigned int offset679(int) {\n            return offset = 679;\n        }\n\n        virtual unsigned int offset680(int) {\n            return offset = 680;\n        }\n\n        virtual unsigned int offset681(int) {\n            return offset = 681;\n        }\n\n        virtual unsigned int offset682(int) {\n            return offset = 682;\n        }\n\n        virtual unsigned int offset683(int) {\n            return offset = 683;\n        }\n\n        virtual unsigned int offset684(int) {\n            return offset = 684;\n        }\n\n        virtual unsigned int offset685(int) {\n            return offset = 685;\n        }\n\n        virtual unsigned int offset686(int) {\n            return offset = 686;\n        }\n\n        virtual unsigned int offset687(int) {\n            return offset = 687;\n        }\n\n        virtual unsigned int offset688(int) {\n            return offset = 688;\n        }\n\n        virtual unsigned int offset689(int) {\n            return offset = 689;\n        }\n\n        virtual unsigned int offset690(int) {\n            return offset = 690;\n        }\n\n        virtual unsigned int offset691(int) {\n            return offset = 691;\n        }\n\n        virtual unsigned int offset692(int) {\n            return offset = 692;\n        }\n\n        virtual unsigned int offset693(int) {\n            return offset = 693;\n        }\n\n        virtual unsigned int offset694(int) {\n            return offset = 694;\n        }\n\n        virtual unsigned int offset695(int) {\n            return offset = 695;\n        }\n\n        virtual unsigned int offset696(int) {\n            return offset = 696;\n        }\n\n        virtual unsigned int offset697(int) {\n            return offset = 697;\n        }\n\n        virtual unsigned int offset698(int) {\n            return offset = 698;\n        }\n\n        virtual unsigned int offset699(int) {\n            return offset = 699;\n        }\n\n\n        virtual unsigned int offset700(int) {\n            return offset = 700;\n        }\n\n        virtual unsigned int offset701(int) {\n            return offset = 701;\n        }\n\n        virtual unsigned int offset702(int) {\n            return offset = 702;\n        }\n\n        virtual unsigned int offset703(int) {\n            return offset = 703;\n        }\n\n        virtual unsigned int offset704(int) {\n            return offset = 704;\n        }\n\n        virtual unsigned int offset705(int) {\n            return offset = 705;\n        }\n\n        virtual unsigned int offset706(int) {\n            return offset = 706;\n        }\n\n        virtual unsigned int offset707(int) {\n            return offset = 707;\n        }\n\n        virtual unsigned int offset708(int) {\n            return offset = 708;\n        }\n\n        virtual unsigned int offset709(int) {\n            return offset = 709;\n        }\n\n        virtual unsigned int offset710(int) {\n            return offset = 710;\n        }\n\n        virtual unsigned int offset711(int) {\n            return offset = 711;\n        }\n\n        virtual unsigned int offset712(int) {\n            return offset = 712;\n        }\n\n        virtual unsigned int offset713(int) {\n            return offset = 713;\n        }\n\n        virtual unsigned int offset714(int) {\n            return offset = 714;\n        }\n\n        virtual unsigned int offset715(int) {\n            return offset = 715;\n        }\n\n        virtual unsigned int offset716(int) {\n            return offset = 716;\n        }\n\n        virtual unsigned int offset717(int) {\n            return offset = 717;\n        }\n\n        virtual unsigned int offset718(int) {\n            return offset = 718;\n        }\n\n        virtual unsigned int offset719(int) {\n            return offset = 719;\n        }\n\n        virtual unsigned int offset720(int) {\n            return offset = 720;\n        }\n\n        virtual unsigned int offset721(int) {\n            return offset = 721;\n        }\n\n        virtual unsigned int offset722(int) {\n            return offset = 722;\n        }\n\n        virtual unsigned int offset723(int) {\n            return offset = 723;\n        }\n\n        virtual unsigned int offset724(int) {\n            return offset = 724;\n        }\n\n        virtual unsigned int offset725(int) {\n            return offset = 725;\n        }\n\n        virtual unsigned int offset726(int) {\n            return offset = 726;\n        }\n\n        virtual unsigned int offset727(int) {\n            return offset = 727;\n        }\n\n        virtual unsigned int offset728(int) {\n            return offset = 728;\n        }\n\n        virtual unsigned int offset729(int) {\n            return offset = 729;\n        }\n\n        virtual unsigned int offset730(int) {\n            return offset = 730;\n        }\n\n        virtual unsigned int offset731(int) {\n            return offset = 731;\n        }\n\n        virtual unsigned int offset732(int) {\n            return offset = 732;\n        }\n\n        virtual unsigned int offset733(int) {\n            return offset = 733;\n        }\n\n        virtual unsigned int offset734(int) {\n            return offset = 734;\n        }\n\n        virtual unsigned int offset735(int) {\n            return offset = 735;\n        }\n\n        virtual unsigned int offset736(int) {\n            return offset = 736;\n        }\n\n        virtual unsigned int offset737(int) {\n            return offset = 737;\n        }\n\n        virtual unsigned int offset738(int) {\n            return offset = 738;\n        }\n\n        virtual unsigned int offset739(int) {\n            return offset = 739;\n        }\n\n        virtual unsigned int offset740(int) {\n            return offset = 740;\n        }\n\n        virtual unsigned int offset741(int) {\n            return offset = 741;\n        }\n\n        virtual unsigned int offset742(int) {\n            return offset = 742;\n        }\n\n        virtual unsigned int offset743(int) {\n            return offset = 743;\n        }\n\n        virtual unsigned int offset744(int) {\n            return offset = 744;\n        }\n\n        virtual unsigned int offset745(int) {\n            return offset = 745;\n        }\n\n        virtual unsigned int offset746(int) {\n            return offset = 746;\n        }\n\n        virtual unsigned int offset747(int) {\n            return offset = 747;\n        }\n\n        virtual unsigned int offset748(int) {\n            return offset = 748;\n        }\n\n        virtual unsigned int offset749(int) {\n            return offset = 749;\n        }\n\n        virtual unsigned int offset750(int) {\n            return offset = 750;\n        }\n\n        virtual unsigned int offset751(int) {\n            return offset = 751;\n        }\n\n        virtual unsigned int offset752(int) {\n            return offset = 752;\n        }\n\n        virtual unsigned int offset753(int) {\n            return offset = 753;\n        }\n\n        virtual unsigned int offset754(int) {\n            return offset = 754;\n        }\n\n        virtual unsigned int offset755(int) {\n            return offset = 755;\n        }\n\n        virtual unsigned int offset756(int) {\n            return offset = 756;\n        }\n\n        virtual unsigned int offset757(int) {\n            return offset = 757;\n        }\n\n        virtual unsigned int offset758(int) {\n            return offset = 758;\n        }\n\n        virtual unsigned int offset759(int) {\n            return offset = 759;\n        }\n\n        virtual unsigned int offset760(int) {\n            return offset = 760;\n        }\n\n        virtual unsigned int offset761(int) {\n            return offset = 761;\n        }\n\n        virtual unsigned int offset762(int) {\n            return offset = 762;\n        }\n\n        virtual unsigned int offset763(int) {\n            return offset = 763;\n        }\n\n        virtual unsigned int offset764(int) {\n            return offset = 764;\n        }\n\n        virtual unsigned int offset765(int) {\n            return offset = 765;\n        }\n\n        virtual unsigned int offset766(int) {\n            return offset = 766;\n        }\n\n        virtual unsigned int offset767(int) {\n            return offset = 767;\n        }\n\n        virtual unsigned int offset768(int) {\n            return offset = 768;\n        }\n\n        virtual unsigned int offset769(int) {\n            return offset = 769;\n        }\n\n        virtual unsigned int offset770(int) {\n            return offset = 770;\n        }\n\n        virtual unsigned int offset771(int) {\n            return offset = 771;\n        }\n\n        virtual unsigned int offset772(int) {\n            return offset = 772;\n        }\n\n        virtual unsigned int offset773(int) {\n            return offset = 773;\n        }\n\n        virtual unsigned int offset774(int) {\n            return offset = 774;\n        }\n\n        virtual unsigned int offset775(int) {\n            return offset = 775;\n        }\n\n        virtual unsigned int offset776(int) {\n            return offset = 776;\n        }\n\n        virtual unsigned int offset777(int) {\n            return offset = 777;\n        }\n\n        virtual unsigned int offset778(int) {\n            return offset = 778;\n        }\n\n        virtual unsigned int offset779(int) {\n            return offset = 779;\n        }\n\n        virtual unsigned int offset780(int) {\n            return offset = 780;\n        }\n\n        virtual unsigned int offset781(int) {\n            return offset = 781;\n        }\n\n        virtual unsigned int offset782(int) {\n            return offset = 782;\n        }\n\n        virtual unsigned int offset783(int) {\n            return offset = 783;\n        }\n\n        virtual unsigned int offset784(int) {\n            return offset = 784;\n        }\n\n        virtual unsigned int offset785(int) {\n            return offset = 785;\n        }\n\n        virtual unsigned int offset786(int) {\n            return offset = 786;\n        }\n\n        virtual unsigned int offset787(int) {\n            return offset = 787;\n        }\n\n        virtual unsigned int offset788(int) {\n            return offset = 788;\n        }\n\n        virtual unsigned int offset789(int) {\n            return offset = 789;\n        }\n\n        virtual unsigned int offset790(int) {\n            return offset = 790;\n        }\n\n        virtual unsigned int offset791(int) {\n            return offset = 791;\n        }\n\n        virtual unsigned int offset792(int) {\n            return offset = 792;\n        }\n\n        virtual unsigned int offset793(int) {\n            return offset = 793;\n        }\n\n        virtual unsigned int offset794(int) {\n            return offset = 794;\n        }\n\n        virtual unsigned int offset795(int) {\n            return offset = 795;\n        }\n\n        virtual unsigned int offset796(int) {\n            return offset = 796;\n        }\n\n        virtual unsigned int offset797(int) {\n            return offset = 797;\n        }\n\n        virtual unsigned int offset798(int) {\n            return offset = 798;\n        }\n\n        virtual unsigned int offset799(int) {\n            return offset = 799;\n        }\n\n\n        virtual unsigned int offset800(int) {\n            return offset = 800;\n        }\n\n        virtual unsigned int offset801(int) {\n            return offset = 801;\n        }\n\n        virtual unsigned int offset802(int) {\n            return offset = 802;\n        }\n\n        virtual unsigned int offset803(int) {\n            return offset = 803;\n        }\n\n        virtual unsigned int offset804(int) {\n            return offset = 804;\n        }\n\n        virtual unsigned int offset805(int) {\n            return offset = 805;\n        }\n\n        virtual unsigned int offset806(int) {\n            return offset = 806;\n        }\n\n        virtual unsigned int offset807(int) {\n            return offset = 807;\n        }\n\n        virtual unsigned int offset808(int) {\n            return offset = 808;\n        }\n\n        virtual unsigned int offset809(int) {\n            return offset = 809;\n        }\n\n        virtual unsigned int offset810(int) {\n            return offset = 810;\n        }\n\n        virtual unsigned int offset811(int) {\n            return offset = 811;\n        }\n\n        virtual unsigned int offset812(int) {\n            return offset = 812;\n        }\n\n        virtual unsigned int offset813(int) {\n            return offset = 813;\n        }\n\n        virtual unsigned int offset814(int) {\n            return offset = 814;\n        }\n\n        virtual unsigned int offset815(int) {\n            return offset = 815;\n        }\n\n        virtual unsigned int offset816(int) {\n            return offset = 816;\n        }\n\n        virtual unsigned int offset817(int) {\n            return offset = 817;\n        }\n\n        virtual unsigned int offset818(int) {\n            return offset = 818;\n        }\n\n        virtual unsigned int offset819(int) {\n            return offset = 819;\n        }\n\n        virtual unsigned int offset820(int) {\n            return offset = 820;\n        }\n\n        virtual unsigned int offset821(int) {\n            return offset = 821;\n        }\n\n        virtual unsigned int offset822(int) {\n            return offset = 822;\n        }\n\n        virtual unsigned int offset823(int) {\n            return offset = 823;\n        }\n\n        virtual unsigned int offset824(int) {\n            return offset = 824;\n        }\n\n        virtual unsigned int offset825(int) {\n            return offset = 825;\n        }\n\n        virtual unsigned int offset826(int) {\n            return offset = 826;\n        }\n\n        virtual unsigned int offset827(int) {\n            return offset = 827;\n        }\n\n        virtual unsigned int offset828(int) {\n            return offset = 828;\n        }\n\n        virtual unsigned int offset829(int) {\n            return offset = 829;\n        }\n\n        virtual unsigned int offset830(int) {\n            return offset = 830;\n        }\n\n        virtual unsigned int offset831(int) {\n            return offset = 831;\n        }\n\n        virtual unsigned int offset832(int) {\n            return offset = 832;\n        }\n\n        virtual unsigned int offset833(int) {\n            return offset = 833;\n        }\n\n        virtual unsigned int offset834(int) {\n            return offset = 834;\n        }\n\n        virtual unsigned int offset835(int) {\n            return offset = 835;\n        }\n\n        virtual unsigned int offset836(int) {\n            return offset = 836;\n        }\n\n        virtual unsigned int offset837(int) {\n            return offset = 837;\n        }\n\n        virtual unsigned int offset838(int) {\n            return offset = 838;\n        }\n\n        virtual unsigned int offset839(int) {\n            return offset = 839;\n        }\n\n        virtual unsigned int offset840(int) {\n            return offset = 840;\n        }\n\n        virtual unsigned int offset841(int) {\n            return offset = 841;\n        }\n\n        virtual unsigned int offset842(int) {\n            return offset = 842;\n        }\n\n        virtual unsigned int offset843(int) {\n            return offset = 843;\n        }\n\n        virtual unsigned int offset844(int) {\n            return offset = 844;\n        }\n\n        virtual unsigned int offset845(int) {\n            return offset = 845;\n        }\n\n        virtual unsigned int offset846(int) {\n            return offset = 846;\n        }\n\n        virtual unsigned int offset847(int) {\n            return offset = 847;\n        }\n\n        virtual unsigned int offset848(int) {\n            return offset = 848;\n        }\n\n        virtual unsigned int offset849(int) {\n            return offset = 849;\n        }\n\n        virtual unsigned int offset850(int) {\n            return offset = 850;\n        }\n\n        virtual unsigned int offset851(int) {\n            return offset = 851;\n        }\n\n        virtual unsigned int offset852(int) {\n            return offset = 852;\n        }\n\n        virtual unsigned int offset853(int) {\n            return offset = 853;\n        }\n\n        virtual unsigned int offset854(int) {\n            return offset = 854;\n        }\n\n        virtual unsigned int offset855(int) {\n            return offset = 855;\n        }\n\n        virtual unsigned int offset856(int) {\n            return offset = 856;\n        }\n\n        virtual unsigned int offset857(int) {\n            return offset = 857;\n        }\n\n        virtual unsigned int offset858(int) {\n            return offset = 858;\n        }\n\n        virtual unsigned int offset859(int) {\n            return offset = 859;\n        }\n\n        virtual unsigned int offset860(int) {\n            return offset = 860;\n        }\n\n        virtual unsigned int offset861(int) {\n            return offset = 861;\n        }\n\n        virtual unsigned int offset862(int) {\n            return offset = 862;\n        }\n\n        virtual unsigned int offset863(int) {\n            return offset = 863;\n        }\n\n        virtual unsigned int offset864(int) {\n            return offset = 864;\n        }\n\n        virtual unsigned int offset865(int) {\n            return offset = 865;\n        }\n\n        virtual unsigned int offset866(int) {\n            return offset = 866;\n        }\n\n        virtual unsigned int offset867(int) {\n            return offset = 867;\n        }\n\n        virtual unsigned int offset868(int) {\n            return offset = 868;\n        }\n\n        virtual unsigned int offset869(int) {\n            return offset = 869;\n        }\n\n        virtual unsigned int offset870(int) {\n            return offset = 870;\n        }\n\n        virtual unsigned int offset871(int) {\n            return offset = 871;\n        }\n\n        virtual unsigned int offset872(int) {\n            return offset = 872;\n        }\n\n        virtual unsigned int offset873(int) {\n            return offset = 873;\n        }\n\n        virtual unsigned int offset874(int) {\n            return offset = 874;\n        }\n\n        virtual unsigned int offset875(int) {\n            return offset = 875;\n        }\n\n        virtual unsigned int offset876(int) {\n            return offset = 876;\n        }\n\n        virtual unsigned int offset877(int) {\n            return offset = 877;\n        }\n\n        virtual unsigned int offset878(int) {\n            return offset = 878;\n        }\n\n        virtual unsigned int offset879(int) {\n            return offset = 879;\n        }\n\n        virtual unsigned int offset880(int) {\n            return offset = 880;\n        }\n\n        virtual unsigned int offset881(int) {\n            return offset = 881;\n        }\n\n        virtual unsigned int offset882(int) {\n            return offset = 882;\n        }\n\n        virtual unsigned int offset883(int) {\n            return offset = 883;\n        }\n\n        virtual unsigned int offset884(int) {\n            return offset = 884;\n        }\n\n        virtual unsigned int offset885(int) {\n            return offset = 885;\n        }\n\n        virtual unsigned int offset886(int) {\n            return offset = 886;\n        }\n\n        virtual unsigned int offset887(int) {\n            return offset = 887;\n        }\n\n        virtual unsigned int offset888(int) {\n            return offset = 888;\n        }\n\n        virtual unsigned int offset889(int) {\n            return offset = 889;\n        }\n\n        virtual unsigned int offset890(int) {\n            return offset = 890;\n        }\n\n        virtual unsigned int offset891(int) {\n            return offset = 891;\n        }\n\n        virtual unsigned int offset892(int) {\n            return offset = 892;\n        }\n\n        virtual unsigned int offset893(int) {\n            return offset = 893;\n        }\n\n        virtual unsigned int offset894(int) {\n            return offset = 894;\n        }\n\n        virtual unsigned int offset895(int) {\n            return offset = 895;\n        }\n\n        virtual unsigned int offset896(int) {\n            return offset = 896;\n        }\n\n        virtual unsigned int offset897(int) {\n            return offset = 897;\n        }\n\n        virtual unsigned int offset898(int) {\n            return offset = 898;\n        }\n\n        virtual unsigned int offset899(int) {\n            return offset = 899;\n        }\n\n\n        virtual unsigned int offset900(int) {\n            return offset = 900;\n        }\n\n        virtual unsigned int offset901(int) {\n            return offset = 901;\n        }\n\n        virtual unsigned int offset902(int) {\n            return offset = 902;\n        }\n\n        virtual unsigned int offset903(int) {\n            return offset = 903;\n        }\n\n        virtual unsigned int offset904(int) {\n            return offset = 904;\n        }\n\n        virtual unsigned int offset905(int) {\n            return offset = 905;\n        }\n\n        virtual unsigned int offset906(int) {\n            return offset = 906;\n        }\n\n        virtual unsigned int offset907(int) {\n            return offset = 907;\n        }\n\n        virtual unsigned int offset908(int) {\n            return offset = 908;\n        }\n\n        virtual unsigned int offset909(int) {\n            return offset = 909;\n        }\n\n        virtual unsigned int offset910(int) {\n            return offset = 910;\n        }\n\n        virtual unsigned int offset911(int) {\n            return offset = 911;\n        }\n\n        virtual unsigned int offset912(int) {\n            return offset = 912;\n        }\n\n        virtual unsigned int offset913(int) {\n            return offset = 913;\n        }\n\n        virtual unsigned int offset914(int) {\n            return offset = 914;\n        }\n\n        virtual unsigned int offset915(int) {\n            return offset = 915;\n        }\n\n        virtual unsigned int offset916(int) {\n            return offset = 916;\n        }\n\n        virtual unsigned int offset917(int) {\n            return offset = 917;\n        }\n\n        virtual unsigned int offset918(int) {\n            return offset = 918;\n        }\n\n        virtual unsigned int offset919(int) {\n            return offset = 919;\n        }\n\n        virtual unsigned int offset920(int) {\n            return offset = 920;\n        }\n\n        virtual unsigned int offset921(int) {\n            return offset = 921;\n        }\n\n        virtual unsigned int offset922(int) {\n            return offset = 922;\n        }\n\n        virtual unsigned int offset923(int) {\n            return offset = 923;\n        }\n\n        virtual unsigned int offset924(int) {\n            return offset = 924;\n        }\n\n        virtual unsigned int offset925(int) {\n            return offset = 925;\n        }\n\n        virtual unsigned int offset926(int) {\n            return offset = 926;\n        }\n\n        virtual unsigned int offset927(int) {\n            return offset = 927;\n        }\n\n        virtual unsigned int offset928(int) {\n            return offset = 928;\n        }\n\n        virtual unsigned int offset929(int) {\n            return offset = 929;\n        }\n\n        virtual unsigned int offset930(int) {\n            return offset = 930;\n        }\n\n        virtual unsigned int offset931(int) {\n            return offset = 931;\n        }\n\n        virtual unsigned int offset932(int) {\n            return offset = 932;\n        }\n\n        virtual unsigned int offset933(int) {\n            return offset = 933;\n        }\n\n        virtual unsigned int offset934(int) {\n            return offset = 934;\n        }\n\n        virtual unsigned int offset935(int) {\n            return offset = 935;\n        }\n\n        virtual unsigned int offset936(int) {\n            return offset = 936;\n        }\n\n        virtual unsigned int offset937(int) {\n            return offset = 937;\n        }\n\n        virtual unsigned int offset938(int) {\n            return offset = 938;\n        }\n\n        virtual unsigned int offset939(int) {\n            return offset = 939;\n        }\n\n        virtual unsigned int offset940(int) {\n            return offset = 940;\n        }\n\n        virtual unsigned int offset941(int) {\n            return offset = 941;\n        }\n\n        virtual unsigned int offset942(int) {\n            return offset = 942;\n        }\n\n        virtual unsigned int offset943(int) {\n            return offset = 943;\n        }\n\n        virtual unsigned int offset944(int) {\n            return offset = 944;\n        }\n\n        virtual unsigned int offset945(int) {\n            return offset = 945;\n        }\n\n        virtual unsigned int offset946(int) {\n            return offset = 946;\n        }\n\n        virtual unsigned int offset947(int) {\n            return offset = 947;\n        }\n\n        virtual unsigned int offset948(int) {\n            return offset = 948;\n        }\n\n        virtual unsigned int offset949(int) {\n            return offset = 949;\n        }\n\n        virtual unsigned int offset950(int) {\n            return offset = 950;\n        }\n\n        virtual unsigned int offset951(int) {\n            return offset = 951;\n        }\n\n        virtual unsigned int offset952(int) {\n            return offset = 952;\n        }\n\n        virtual unsigned int offset953(int) {\n            return offset = 953;\n        }\n\n        virtual unsigned int offset954(int) {\n            return offset = 954;\n        }\n\n        virtual unsigned int offset955(int) {\n            return offset = 955;\n        }\n\n        virtual unsigned int offset956(int) {\n            return offset = 956;\n        }\n\n        virtual unsigned int offset957(int) {\n            return offset = 957;\n        }\n\n        virtual unsigned int offset958(int) {\n            return offset = 958;\n        }\n\n        virtual unsigned int offset959(int) {\n            return offset = 959;\n        }\n\n        virtual unsigned int offset960(int) {\n            return offset = 960;\n        }\n\n        virtual unsigned int offset961(int) {\n            return offset = 961;\n        }\n\n        virtual unsigned int offset962(int) {\n            return offset = 962;\n        }\n\n        virtual unsigned int offset963(int) {\n            return offset = 963;\n        }\n\n        virtual unsigned int offset964(int) {\n            return offset = 964;\n        }\n\n        virtual unsigned int offset965(int) {\n            return offset = 965;\n        }\n\n        virtual unsigned int offset966(int) {\n            return offset = 966;\n        }\n\n        virtual unsigned int offset967(int) {\n            return offset = 967;\n        }\n\n        virtual unsigned int offset968(int) {\n            return offset = 968;\n        }\n\n        virtual unsigned int offset969(int) {\n            return offset = 969;\n        }\n\n        virtual unsigned int offset970(int) {\n            return offset = 970;\n        }\n\n        virtual unsigned int offset971(int) {\n            return offset = 971;\n        }\n\n        virtual unsigned int offset972(int) {\n            return offset = 972;\n        }\n\n        virtual unsigned int offset973(int) {\n            return offset = 973;\n        }\n\n        virtual unsigned int offset974(int) {\n            return offset = 974;\n        }\n\n        virtual unsigned int offset975(int) {\n            return offset = 975;\n        }\n\n        virtual unsigned int offset976(int) {\n            return offset = 976;\n        }\n\n        virtual unsigned int offset977(int) {\n            return offset = 977;\n        }\n\n        virtual unsigned int offset978(int) {\n            return offset = 978;\n        }\n\n        virtual unsigned int offset979(int) {\n            return offset = 979;\n        }\n\n        virtual unsigned int offset980(int) {\n            return offset = 980;\n        }\n\n        virtual unsigned int offset981(int) {\n            return offset = 981;\n        }\n\n        virtual unsigned int offset982(int) {\n            return offset = 982;\n        }\n\n        virtual unsigned int offset983(int) {\n            return offset = 983;\n        }\n\n        virtual unsigned int offset984(int) {\n            return offset = 984;\n        }\n\n        virtual unsigned int offset985(int) {\n            return offset = 985;\n        }\n\n        virtual unsigned int offset986(int) {\n            return offset = 986;\n        }\n\n        virtual unsigned int offset987(int) {\n            return offset = 987;\n        }\n\n        virtual unsigned int offset988(int) {\n            return offset = 988;\n        }\n\n        virtual unsigned int offset989(int) {\n            return offset = 989;\n        }\n\n        virtual unsigned int offset990(int) {\n            return offset = 990;\n        }\n\n        virtual unsigned int offset991(int) {\n            return offset = 991;\n        }\n\n        virtual unsigned int offset992(int) {\n            return offset = 992;\n        }\n\n        virtual unsigned int offset993(int) {\n            return offset = 993;\n        }\n\n        virtual unsigned int offset994(int) {\n            return offset = 994;\n        }\n\n        virtual unsigned int offset995(int) {\n            return offset = 995;\n        }\n\n        virtual unsigned int offset996(int) {\n            return offset = 996;\n        }\n\n        virtual unsigned int offset997(int) {\n            return offset = 997;\n        }\n\n        virtual unsigned int offset998(int) {\n            return offset = 998;\n        }\n\n        virtual unsigned int offset999(int) {\n            return offset = 999;\n        }\n\n        virtual unsigned int offset1000(int) {\n            return offset = 1000;\n        }\n\n    };\n}\nnamespace fakeit {\n\n    template<typename TARGET, typename SOURCE>\n    TARGET union_cast(SOURCE source) {\n\n        union {\n            SOURCE source;\n            TARGET target;\n        } u;\n        u.source = source;\n        return u.target;\n    }\n\n}\n\nnamespace fakeit {\n    class NoVirtualDtor {\n    };\n\n    class VTUtils {\n    public:\n\n        template<typename C, typename R, typename ... arglist>\n        static unsigned int getOffset(R (C::*vMethod)(arglist...)) {\n            auto sMethod = reinterpret_cast<unsigned int (VirtualOffsetSelector::*)(int)>(vMethod);\n            VirtualOffsetSelector offsetSelctor;\n            return (offsetSelctor.*sMethod)(0);\n        }\n\n        template<typename C>\n        static typename std::enable_if<std::has_virtual_destructor<C>::value, unsigned int>::type\n        getDestructorOffset() {\n            VirtualOffsetSelector offsetSelctor;\n            union_cast<C *>(&offsetSelctor)->~C();\n            return offsetSelctor.offset;\n        }\n\n        template<typename C>\n        static typename std::enable_if<!std::has_virtual_destructor<C>::value, unsigned int>::type\n        getDestructorOffset() {\n            throw NoVirtualDtor();\n        }\n\n        template<typename C>\n        static unsigned int getVTSize() {\n            struct Derrived : public C {\n                virtual void endOfVt() {\n                }\n            };\n\n            unsigned int vtSize = getOffset(&Derrived::endOfVt);\n            return vtSize;\n        }\n    };\n\n\n}\n#ifdef _MSC_VER\nnamespace fakeit {\n\n    typedef unsigned long DWORD;\n\n    struct TypeDescriptor {\n        TypeDescriptor() :\n                ptrToVTable(0), spare(0) {\n\n            int **tiVFTPtr = (int **) (&typeid(void));\n            int *i = (int *) tiVFTPtr[0];\n\t\t\tchar *type_info_vft_ptr = (char *) i;\n            ptrToVTable = type_info_vft_ptr;\n        }\n\n\t\tchar *ptrToVTable;\n        DWORD spare;\n        char name[8];\n    };\n\n    struct PMD {\n\n\n\n        int mdisp;\n\n        int pdisp;\n        int vdisp;\n\n        PMD() :\n                mdisp(0), pdisp(-1), vdisp(0) {\n        }\n    };\n\n    struct RTTIBaseClassDescriptor {\n        RTTIBaseClassDescriptor() :\n                pTypeDescriptor(nullptr), numContainedBases(0), attributes(0) {\n        }\n\n        const std::type_info *pTypeDescriptor;\n        DWORD numContainedBases;\n        struct PMD where;\n        DWORD attributes;\n    };\n\n    template<typename C, typename... baseclasses>\n    struct RTTIClassHierarchyDescriptor {\n        RTTIClassHierarchyDescriptor() :\n                signature(0),\n                attributes(0),\n                numBaseClasses(0),\n                pBaseClassArray(nullptr) {\n            pBaseClassArray = new RTTIBaseClassDescriptor *[1 + sizeof...(baseclasses)];\n            addBaseClass < C, baseclasses...>();\n        }\n\n        ~RTTIClassHierarchyDescriptor() {\n            for (int i = 0; i < 1 + sizeof...(baseclasses); i++) {\n                RTTIBaseClassDescriptor *desc = pBaseClassArray[i];\n                delete desc;\n            }\n            delete[] pBaseClassArray;\n        }\n\n        DWORD signature;\n        DWORD attributes;\n        DWORD numBaseClasses;\n        RTTIBaseClassDescriptor **pBaseClassArray;\n\n        template<typename BaseType>\n        void addBaseClass() {\n            static_assert(std::is_base_of<BaseType, C>::value, \"C must be a derived class of BaseType\");\n            RTTIBaseClassDescriptor *desc = new RTTIBaseClassDescriptor();\n            desc->pTypeDescriptor = &typeid(BaseType);\n            pBaseClassArray[numBaseClasses] = desc;\n            for (unsigned int i = 0; i < numBaseClasses; i++) {\n                pBaseClassArray[i]->numContainedBases++;\n            }\n            numBaseClasses++;\n        }\n\n        template<typename head, typename B1, typename... tail>\n        void addBaseClass() {\n            static_assert(std::is_base_of<B1, head>::value, \"invalid inheritance list\");\n            addBaseClass<head>();\n            addBaseClass<B1, tail...>();\n        }\n\n    };\n\n\ttemplate<typename C, typename... baseclasses>\n\tstruct RTTICompleteObjectLocator {\n#ifdef _WIN64\n\t\tRTTICompleteObjectLocator(const std::type_info &unused) :\n\t\t\tsignature(0), offset(0), cdOffset(0),\n\t\t\ttypeDescriptorOffset(0), classDescriptorOffset(0)\n\t\t{\n\t\t}\n\n\t\tDWORD signature;\n\t\tDWORD offset;\n\t\tDWORD cdOffset;\n\t\tDWORD typeDescriptorOffset;\n\t\tDWORD classDescriptorOffset;\n#else\n\t\tRTTICompleteObjectLocator(const std::type_info &info) :\n\t\t\tsignature(0), offset(0), cdOffset(0),\n\t\t\tpTypeDescriptor(&info),\n\t\t\tpClassDescriptor(new RTTIClassHierarchyDescriptor<C, baseclasses...>()) {\n\t\t}\n\n\t\t~RTTICompleteObjectLocator() {\n\t\t\tdelete pClassDescriptor;\n\t\t}\n\n\t\tDWORD signature;\n\t\tDWORD offset;\n\t\tDWORD cdOffset;\n\t\tconst std::type_info *pTypeDescriptor;\n\t\tstruct RTTIClassHierarchyDescriptor<C, baseclasses...> *pClassDescriptor;\n#endif\n\t};\n\n\n    struct VirtualTableBase {\n\n        static VirtualTableBase &getVTable(void *instance) {\n            fakeit::VirtualTableBase *vt = (fakeit::VirtualTableBase *) (instance);\n            return *vt;\n        }\n\n        VirtualTableBase(void **firstMethod) : _firstMethod(firstMethod) { }\n\n        void *getCookie(int index) {\n            return _firstMethod[-2 - index];\n        }\n\n        void setCookie(int index, void *value) {\n            _firstMethod[-2 - index] = value;\n        }\n\n        void *getMethod(unsigned int index) const {\n            return _firstMethod[index];\n        }\n\n        void setMethod(unsigned int index, void *method) {\n            _firstMethod[index] = method;\n        }\n\n    protected:\n        void **_firstMethod;\n    };\n\n    template<class C, class... baseclasses>\n    struct VirtualTable : public VirtualTableBase {\n\n        class Handle {\n\n            friend struct VirtualTable<C, baseclasses...>;\n\n            void **firstMethod;\n\n            Handle(void **method) : firstMethod(method) { }\n\n        public:\n\n            VirtualTable<C, baseclasses...> &restore() {\n                VirtualTable<C, baseclasses...> *vt = (VirtualTable<C, baseclasses...> *) this;\n                return *vt;\n            }\n        };\n\n        static VirtualTable<C, baseclasses...> &getVTable(C &instance) {\n            fakeit::VirtualTable<C, baseclasses...> *vt = (fakeit::VirtualTable<C, baseclasses...> *) (&instance);\n            return *vt;\n        }\n\n        void copyFrom(VirtualTable<C, baseclasses...> &from) {\n            unsigned int size = VTUtils::getVTSize<C>();\n            for (unsigned int i = 0; i < size; i++) {\n                _firstMethod[i] = from.getMethod(i);\n            }\n        }\n\n        VirtualTable() : VirtualTable(buildVTArray()) {\n        }\n\n        ~VirtualTable() {\n\n        }\n\n        void dispose() {\n            _firstMethod--;\n            RTTICompleteObjectLocator<C, baseclasses...> *locator = (RTTICompleteObjectLocator<C, baseclasses...> *) _firstMethod[0];\n            delete locator;\n            _firstMethod -= numOfCookies;\n            delete[] _firstMethod;\n        }\n\n\n        unsigned int dtor(int) {\n            C *c = (C *) this;\n            C &cRef = *c;\n            auto vt = VirtualTable<C, baseclasses...>::getVTable(cRef);\n            void *dtorPtr = vt.getCookie(numOfCookies - 1);\n            void(*method)(C *) = reinterpret_cast<void (*)(C *)>(dtorPtr);\n            method(c);\n            return 0;\n        }\n\n        void setDtor(void *method) {\n\n\n\n\n\n            void *dtorPtr = union_cast<void *>(&VirtualTable<C, baseclasses...>::dtor);\n            unsigned int index = VTUtils::getDestructorOffset<C>();\n            _firstMethod[index] = dtorPtr;\n            setCookie(numOfCookies - 1, method);\n        }\n\n        unsigned int getSize() {\n            return VTUtils::getVTSize<C>();\n        }\n\n        void initAll(void *value) {\n            auto size = getSize();\n            for (unsigned int i = 0; i < size; i++) {\n                setMethod(i, value);\n            }\n        }\n\n        Handle createHandle() {\n            Handle h(_firstMethod);\n            return h;\n        }\n\n    private:\n\n        class SimpleType {\n        };\n\n        static_assert(sizeof(unsigned int (SimpleType::*)()) == sizeof(unsigned int (C::*)()),\n            \"Can't mock a type with multiple inheritance or with non-polymorphic base class\");\n        static const unsigned int numOfCookies = 3;\n\n        static void **buildVTArray() {\n            int vtSize = VTUtils::getVTSize<C>();\n            auto array = new void *[vtSize + numOfCookies + 1]{};\n            RTTICompleteObjectLocator<C, baseclasses...> *objectLocator = new RTTICompleteObjectLocator<C, baseclasses...>(\n                    typeid(C));\n            array += numOfCookies;\n            array[0] = objectLocator;\n            array++;\n            return array;\n        }\n\n        VirtualTable(void **firstMethod) : VirtualTableBase(firstMethod) {\n        }\n    };\n}\n#else\n#ifndef __clang__\n#include <type_traits>\n#include <tr2/type_traits>\n\nnamespace fakeit {\n    template<typename ... T1>\n    class has_one_base {\n    };\n\n    template<typename T1, typename T2, typename ... types>\n    class has_one_base<std::tr2::__reflection_typelist<T1, T2, types...>> : public std::false_type {\n    };\n\n    template<typename T1>\n    class has_one_base<std::tr2::__reflection_typelist<T1>>\n            : public has_one_base<typename std::tr2::direct_bases<T1>::type> {\n    };\n\n    template<>\n    class has_one_base<std::tr2::__reflection_typelist<>> : public std::true_type {\n    };\n\n    template<typename T>\n    class is_simple_inheritance_layout : public has_one_base<typename std::tr2::direct_bases<T>::type> {\n    };\n}\n\n#endif\n\nnamespace fakeit {\n\n    struct VirtualTableBase {\n\n        static VirtualTableBase &getVTable(void *instance) {\n            fakeit::VirtualTableBase *vt = (fakeit::VirtualTableBase *) (instance);\n            return *vt;\n        }\n\n        VirtualTableBase(void **firstMethod) : _firstMethod(firstMethod) { }\n\n        void *getCookie(int index) {\n            return _firstMethod[-3 - index];\n        }\n\n        void setCookie(int index, void *value) {\n            _firstMethod[-3 - index] = value;\n        }\n\n        void *getMethod(unsigned int index) const {\n            return _firstMethod[index];\n        }\n\n        void setMethod(unsigned int index, void *method) {\n            _firstMethod[index] = method;\n        }\n\n    protected:\n        void **_firstMethod;\n    };\n\n    template<class C, class ... baseclasses>\n    struct VirtualTable : public VirtualTableBase {\n\n#ifndef __clang__\n        static_assert(is_simple_inheritance_layout<C>::value, \"Can't mock a type with multiple inheritance\");\n#endif\n\n        class Handle {\n\n            friend struct VirtualTable<C, baseclasses...>;\n            void **firstMethod;\n\n            Handle(void **method) :\n                    firstMethod(method) {\n            }\n\n        public:\n\n            VirtualTable<C, baseclasses...> &restore() {\n                VirtualTable<C, baseclasses...> *vt = (VirtualTable<C, baseclasses...> *) this;\n                return *vt;\n            }\n        };\n\n        static VirtualTable<C, baseclasses...> &getVTable(C &instance) {\n            fakeit::VirtualTable<C, baseclasses...> *vt = (fakeit::VirtualTable<C, baseclasses...> *) (&instance);\n            return *vt;\n        }\n\n        void copyFrom(VirtualTable<C, baseclasses...> &from) {\n            unsigned int size = VTUtils::getVTSize<C>();\n\n            for (size_t i = 0; i < size; ++i) {\n                _firstMethod[i] = from.getMethod(i);\n            }\n        }\n\n        VirtualTable() :\n                VirtualTable(buildVTArray()) {\n        }\n\n        void dispose() {\n            _firstMethod--;\n            _firstMethod--;\n            _firstMethod -= numOfCookies;\n            delete[] _firstMethod;\n        }\n\n        unsigned int dtor(int) {\n            C *c = (C *) this;\n            C &cRef = *c;\n            auto vt = VirtualTable<C, baseclasses...>::getVTable(cRef);\n            unsigned int index = VTUtils::getDestructorOffset<C>();\n            void *dtorPtr = vt.getMethod(index);\n            void(*method)(C *) = union_cast<void (*)(C *)>(dtorPtr);\n            method(c);\n            return 0;\n        }\n\n\n        void setDtor(void *method) {\n            unsigned int index = VTUtils::getDestructorOffset<C>();\n            void *dtorPtr = union_cast<void *>(&VirtualTable<C, baseclasses...>::dtor);\n\n\n            _firstMethod[index] = method;\n\n            _firstMethod[index + 1] = dtorPtr;\n        }\n\n\n        unsigned int getSize() {\n            return VTUtils::getVTSize<C>();\n        }\n\n        void initAll(void *value) {\n            unsigned int size = getSize();\n            for (unsigned int i = 0; i < size; i++) {\n                setMethod(i, value);\n            }\n        }\n\n        const std::type_info *getTypeId() {\n            return (const std::type_info *) (_firstMethod[-1]);\n        }\n\n        Handle createHandle() {\n            Handle h(_firstMethod);\n            return h;\n        }\n\n    private:\n        static const unsigned int numOfCookies = 2;\n\n        static void **buildVTArray() {\n            int size = VTUtils::getVTSize<C>();\n            auto array = new void *[size + 2 + numOfCookies]{};\n            array += numOfCookies;\n            array++;\n            array[0] = const_cast<std::type_info *>(&typeid(C));\n            array++;\n            return array;\n        }\n\n        VirtualTable(void **firstMethod) : VirtualTableBase(firstMethod) {\n        }\n\n    };\n}\n#endif\nnamespace fakeit {\n\n    struct NoMoreRecordedActionException {\n    };\n\n    template<typename R, typename ... arglist>\n    struct MethodInvocationHandler : Destructible {\n        virtual R handleMethodInvocation(const typename fakeit::production_arg<arglist>::type... args) = 0;\n    };\n\n}\n#include <new>\n\nnamespace fakeit {\n\n#ifdef __GNUG__\n#ifndef __clang__\n#pragma GCC diagnostic ignored \"-Wpedantic\"\n#endif\n#endif\n\n\n#ifdef _MSC_VER\n#pragma warning( push )\n#pragma warning( disable : 4200 )\n#endif\n\n\n    template<typename C, typename ... baseclasses>\n    class FakeObject {\n\n        VirtualTable<C, baseclasses...> vtable;\n\n        static const size_t SIZE = sizeof(C) - sizeof(VirtualTable<C, baseclasses...>);\n        char instanceArea[SIZE ? SIZE : 0];\n\n        FakeObject(FakeObject const &) = delete;\n        FakeObject &operator=(FakeObject const &) = delete;\n\n    public:\n\n        FakeObject() : vtable() {\n            initializeDataMembersArea();\n        }\n\n        ~FakeObject() {\n            vtable.dispose();\n        }\n\n        void initializeDataMembersArea() {\n            for (size_t i = 0; i < SIZE; ++i) instanceArea[i] = (char) 0;\n        }\n\n        void setMethod(unsigned int index, void *method) {\n            vtable.setMethod(index, method);\n        }\n\n        VirtualTable<C, baseclasses...> &getVirtualTable() {\n            return vtable;\n        }\n\n        void setVirtualTable(VirtualTable<C, baseclasses...> &t) {\n            vtable = t;\n        }\n\n        void setDtor(void *dtor) {\n            vtable.setDtor(dtor);\n        }\n    };\n\n#ifdef _MSC_VER\n#pragma warning( pop )\n#endif\n\n#ifdef __GNUG__\n#ifndef __clang__\n#pragma GCC diagnostic pop\n#endif\n#endif\n\n}\nnamespace fakeit {\n\n    struct MethodProxy {\n\n        MethodProxy(unsigned int id, unsigned int offset, void *vMethod) :\n                _id(id),\n                _offset(offset),\n                _vMethod(vMethod) {\n        }\n\n        unsigned int getOffset() const {\n            return _offset;\n        }\n\n        unsigned int getId() const {\n            return _id;\n        }\n\n        void *getProxy() const {\n            return union_cast<void *>(_vMethod);\n        }\n\n    private:\n        unsigned int _id;\n        unsigned int _offset;\n        void *_vMethod;\n    };\n}\n#include <utility>\n\n\nnamespace fakeit {\n\n    struct InvocationHandlerCollection {\n        static const unsigned int VT_COOKIE_INDEX = 0;\n\n        virtual Destructible *getInvocatoinHandlerPtrById(unsigned int index) = 0;\n\n        static InvocationHandlerCollection *getInvocationHandlerCollection(void *instance) {\n            VirtualTableBase &vt = VirtualTableBase::getVTable(instance);\n            InvocationHandlerCollection *invocationHandlerCollection = (InvocationHandlerCollection *) vt.getCookie(\n                    InvocationHandlerCollection::VT_COOKIE_INDEX);\n            return invocationHandlerCollection;\n        }\n    };\n\n\n    template<typename R, typename ... arglist>\n    class MethodProxyCreator {\n\n\n\n    public:\n\n        template<unsigned int id>\n        MethodProxy createMethodProxy(unsigned int offset) {\n            return MethodProxy(id, offset, union_cast<void *>(&MethodProxyCreator::methodProxyX < id > ));\n        }\n\n    protected:\n\n        R methodProxy(unsigned int id, const typename fakeit::production_arg<arglist>::type... args) {\n            InvocationHandlerCollection *invocationHandlerCollection = InvocationHandlerCollection::getInvocationHandlerCollection(\n                    this);\n            MethodInvocationHandler<R, arglist...> *invocationHandler =\n                    (MethodInvocationHandler<R, arglist...> *) invocationHandlerCollection->getInvocatoinHandlerPtrById(\n                            id);\n            return invocationHandler->handleMethodInvocation(std::forward<const typename fakeit::production_arg<arglist>::type>(args)...);\n        }\n\n        template<int id>\n        R methodProxyX(arglist ... args) {\n            return methodProxy(id, std::forward<const typename fakeit::production_arg<arglist>::type>(args)...);\n        }\n    };\n}\n\nnamespace fakeit {\n\n    class InvocationHandlers : public InvocationHandlerCollection {\n        std::vector<std::shared_ptr<Destructible>> &_methodMocks;\n        std::vector<unsigned int> &_offsets;\n\n        unsigned int getOffset(unsigned int id) const\n        {\n            unsigned int offset = 0;\n            for (; offset < _offsets.size(); offset++) {\n                if (_offsets[offset] == id) {\n                    break;\n                }\n            }\n            return offset;\n        }\n\n    public:\n        InvocationHandlers(\n                std::vector<std::shared_ptr<Destructible>> &methodMocks,\n                std::vector<unsigned int> &offsets) :\n                _methodMocks(methodMocks), _offsets(offsets) {\n        }\n\n        Destructible *getInvocatoinHandlerPtrById(unsigned int id) override {\n            unsigned int offset = getOffset(id);\n            std::shared_ptr<Destructible> ptr = _methodMocks[offset];\n            return ptr.get();\n        }\n\n    };\n\n    template<typename C, typename ... baseclasses>\n    struct DynamicProxy {\n\n        static_assert(std::is_polymorphic<C>::value, \"DynamicProxy requires a polymorphic type\");\n\n        DynamicProxy(C &inst) :\n                instance(inst),\n                originalVtHandle(VirtualTable<C, baseclasses...>::getVTable(instance).createHandle()),\n                _methodMocks(VTUtils::getVTSize<C>()),\n                _offsets(VTUtils::getVTSize<C>()),\n                _invocationHandlers(_methodMocks, _offsets) {\n            _cloneVt.copyFrom(originalVtHandle.restore());\n            _cloneVt.setCookie(InvocationHandlerCollection::VT_COOKIE_INDEX, &_invocationHandlers);\n            getFake().setVirtualTable(_cloneVt);\n        }\n\n        void detach() {\n            getFake().setVirtualTable(originalVtHandle.restore());\n        }\n\n        ~DynamicProxy() {\n            _cloneVt.dispose();\n        }\n\n        C &get() {\n            return instance;\n        }\n\n        void Reset() {\n\t\t\t_methodMocks = {};\n            _methodMocks.resize(VTUtils::getVTSize<C>());\n            _members = {};\n\t\t\t_offsets = {};\n            _offsets.resize(VTUtils::getVTSize<C>());\n            _cloneVt.copyFrom(originalVtHandle.restore());\n        }\n\n\t\tvoid Clear()\n        {\n        }\n\n        template<int id, typename R, typename ... arglist>\n        void stubMethod(R(C::*vMethod)(arglist...), MethodInvocationHandler<R, arglist...> *methodInvocationHandler) {\n            auto offset = VTUtils::getOffset(vMethod);\n            MethodProxyCreator<R, arglist...> creator;\n            bind(creator.template createMethodProxy<id + 1>(offset), methodInvocationHandler);\n        }\n\n        void stubDtor(MethodInvocationHandler<void> *methodInvocationHandler) {\n            auto offset = VTUtils::getDestructorOffset<C>();\n            MethodProxyCreator<void> creator;\n            bindDtor(creator.createMethodProxy<0>(offset), methodInvocationHandler);\n        }\n\n        template<typename R, typename ... arglist>\n        bool isMethodStubbed(R(C::*vMethod)(arglist...)) {\n            unsigned int offset = VTUtils::getOffset(vMethod);\n            return isBinded(offset);\n        }\n\n        bool isDtorStubbed() {\n            unsigned int offset = VTUtils::getDestructorOffset<C>();\n            return isBinded(offset);\n        }\n\n        template<typename R, typename ... arglist>\n        Destructible *getMethodMock(R(C::*vMethod)(arglist...)) {\n            auto offset = VTUtils::getOffset(vMethod);\n            std::shared_ptr<Destructible> ptr = _methodMocks[offset];\n            return ptr.get();\n        }\n\n        Destructible *getDtorMock() {\n            auto offset = VTUtils::getDestructorOffset<C>();\n            std::shared_ptr<Destructible> ptr = _methodMocks[offset];\n            return ptr.get();\n        }\n\n        template<typename DATA_TYPE, typename ... arglist>\n        void stubDataMember(DATA_TYPE C::*member, const arglist &... initargs) {\n            DATA_TYPE C::*theMember = (DATA_TYPE C::*) member;\n            C &mock = get();\n            DATA_TYPE *memberPtr = &(mock.*theMember);\n            _members.push_back(\n                    std::shared_ptr<DataMemeberWrapper < DATA_TYPE, arglist...> >\n                    {new DataMemeberWrapper < DATA_TYPE, arglist...>(memberPtr,\n                    initargs...)});\n        }\n\n        template<typename DATA_TYPE>\n        void getMethodMocks(std::vector<DATA_TYPE> &into) const {\n            for (std::shared_ptr<Destructible> ptr : _methodMocks) {\n                DATA_TYPE p = dynamic_cast<DATA_TYPE>(ptr.get());\n                if (p) {\n                    into.push_back(p);\n                }\n            }\n        }\n\n        VirtualTable<C, baseclasses...> &getOriginalVT() {\n            VirtualTable<C, baseclasses...> &vt = originalVtHandle.restore();\n            return vt;\n        }\n\n    private:\n\n        template<typename DATA_TYPE, typename ... arglist>\n        class DataMemeberWrapper : public Destructible {\n        private:\n            DATA_TYPE *dataMember;\n        public:\n            DataMemeberWrapper(DATA_TYPE *dataMem, const arglist &... initargs) :\n                    dataMember(dataMem) {\n                new(dataMember) DATA_TYPE{initargs ...};\n            }\n\n            ~DataMemeberWrapper() override\n            {\n                dataMember->~DATA_TYPE();\n            }\n        };\n\n        static_assert(sizeof(C) == sizeof(FakeObject<C, baseclasses...>), \"This is a problem\");\n\n        C &instance;\n        typename VirtualTable<C, baseclasses...>::Handle originalVtHandle;\n        VirtualTable<C, baseclasses...> _cloneVt;\n\n        std::vector<std::shared_ptr<Destructible>> _methodMocks;\n        std::vector<std::shared_ptr<Destructible>> _members;\n        std::vector<unsigned int> _offsets;\n        InvocationHandlers _invocationHandlers;\n\n        FakeObject<C, baseclasses...> &getFake() {\n            return reinterpret_cast<FakeObject<C, baseclasses...> &>(instance);\n        }\n\n        void bind(const MethodProxy &methodProxy, Destructible *invocationHandler) {\n            getFake().setMethod(methodProxy.getOffset(), methodProxy.getProxy());\n            _methodMocks[methodProxy.getOffset()].reset(invocationHandler);\n            _offsets[methodProxy.getOffset()] = methodProxy.getId();\n        }\n\n        void bindDtor(const MethodProxy &methodProxy, Destructible *invocationHandler) {\n            getFake().setDtor(methodProxy.getProxy());\n            _methodMocks[methodProxy.getOffset()].reset(invocationHandler);\n            _offsets[methodProxy.getOffset()] = methodProxy.getId();\n        }\n\n        template<typename DATA_TYPE>\n        DATA_TYPE getMethodMock(unsigned int offset) {\n            std::shared_ptr<Destructible> ptr = _methodMocks[offset];\n            return dynamic_cast<DATA_TYPE>(ptr.get());\n        }\n\n        template<typename BaseClass>\n        void checkMultipleInheritance() {\n            C *ptr = (C *) (unsigned int) 1;\n            BaseClass *basePtr = ptr;\n            int delta = (unsigned long) basePtr - (unsigned long) ptr;\n            if (delta > 0) {\n\n\n                throw std::invalid_argument(std::string(\"multiple inheritance is not supported\"));\n            }\n        }\n\n        bool isBinded(unsigned int offset) {\n            std::shared_ptr<Destructible> ptr = _methodMocks[offset];\n            return ptr.get() != nullptr;\n        }\n\n    };\n}\n#include <functional>\n#include <type_traits>\n#include <memory>\n#include <iosfwd>\n#include <vector>\n#include <functional>\n#include <tuple>\n#include <tuple>\n\nnamespace fakeit {\n\n    template<int N>\n    struct apply_func {\n        template<typename R, typename ... ArgsF, typename ... ArgsT, typename ... Args>\n        static R applyTuple(std::function<R(ArgsF &...)> f, std::tuple<ArgsT...> &t, Args &... args) {\n            return apply_func<N - 1>::template applyTuple(f, t, std::get<N - 1>(t), args...);\n        }\n    };\n\n    template<>\n    struct apply_func < 0 > {\n        template<typename R, typename ... ArgsF, typename ... ArgsT, typename ... Args>\n        static R applyTuple(std::function<R(ArgsF &...)> f, std::tuple<ArgsT...> & , Args &... args) {\n            return f(args...);\n        }\n    };\n\n    struct TupleDispatcher {\n\n        template<typename R, typename ... ArgsF, typename ... ArgsT>\n        static R applyTuple(std::function<R(ArgsF &...)> f, std::tuple<ArgsT...> &t) {\n            return apply_func<sizeof...(ArgsT)>::template applyTuple(f, t);\n        }\n\n        template<typename R, typename ...arglist>\n        static R invoke(std::function<R(arglist &...)> func, const std::tuple<arglist...> &arguments) {\n            std::tuple<arglist...> &args = const_cast<std::tuple<arglist...> &>(arguments);\n            return applyTuple(func, args);\n        }\n\n        template<typename TupleType, typename FunctionType>\n        static void for_each(TupleType &&, FunctionType &,\n            std::integral_constant<size_t, std::tuple_size<typename std::remove_reference<TupleType>::type>::value>) {\n        }\n\n        template<std::size_t I, typename TupleType, typename FunctionType, typename = typename std::enable_if<\n            I != std::tuple_size<typename std::remove_reference<TupleType>::type>::value>::type>\n            static void for_each(TupleType &&t, FunctionType &f, std::integral_constant<size_t, I>) {\n            f(I, std::get < I >(t));\n            for_each(std::forward < TupleType >(t), f, std::integral_constant<size_t, I + 1>());\n        }\n\n        template<typename TupleType, typename FunctionType>\n        static void for_each(TupleType &&t, FunctionType &f) {\n            for_each(std::forward < TupleType >(t), f, std::integral_constant<size_t, 0>());\n        }\n\n        template<typename TupleType1, typename TupleType2, typename FunctionType>\n        static void for_each(TupleType1 &&, TupleType2 &&, FunctionType &,\n            std::integral_constant<size_t, std::tuple_size<typename std::remove_reference<TupleType1>::type>::value>) {\n        }\n\n        template<std::size_t I, typename TupleType1, typename TupleType2, typename FunctionType, typename = typename std::enable_if<\n            I != std::tuple_size<typename std::remove_reference<TupleType1>::type>::value>::type>\n            static void for_each(TupleType1 &&t, TupleType2 &&t2, FunctionType &f, std::integral_constant<size_t, I>) {\n            f(I, std::get < I >(t), std::get < I >(t2));\n            for_each(std::forward < TupleType1 >(t), std::forward < TupleType2 >(t2), f, std::integral_constant<size_t, I + 1>());\n        }\n\n        template<typename TupleType1, typename TupleType2, typename FunctionType>\n        static void for_each(TupleType1 &&t, TupleType2 &&t2, FunctionType &f) {\n            for_each(std::forward < TupleType1 >(t), std::forward < TupleType2 >(t2), f, std::integral_constant<size_t, 0>());\n        }\n    };\n}\nnamespace fakeit {\n\n    template<typename R, typename ... arglist>\n    struct ActualInvocationHandler : Destructible {\n        virtual R handleMethodInvocation(ArgumentsTuple<arglist...> & args) = 0;\n    };\n\n}\n#include <functional>\n#include <tuple>\n#include <string>\n#include <iosfwd>\n#include <type_traits>\n#include <typeinfo>\n\nnamespace fakeit {\n\n    struct DefaultValueInstatiationException {\n        virtual ~DefaultValueInstatiationException() = default;\n\n        virtual std::string what() const = 0;\n    };\n\n\n    template<class C>\n    struct is_constructible_type {\n        static const bool value =\n                std::is_default_constructible<typename naked_type<C>::type>::value\n                && !std::is_abstract<typename naked_type<C>::type>::value;\n    };\n\n    template<class C, class Enable = void>\n    struct DefaultValue;\n\n    template<class C>\n    struct DefaultValue<C, typename std::enable_if<!is_constructible_type<C>::value>::type> {\n        static C &value() {\n            if (std::is_reference<C>::value) {\n                typename naked_type<C>::type *ptr = nullptr;\n                return *ptr;\n            }\n\n            class Exception : public DefaultValueInstatiationException {\n                virtual std::string what() const\n\n                override {\n                    return (std::string(\"Type \") + std::string(typeid(C).name())\n                            + std::string(\n                            \" is not default constructible. Could not instantiate a default return value\")).c_str();\n                }\n            };\n\n            throw Exception();\n        }\n    };\n\n    template<class C>\n    struct DefaultValue<C, typename std::enable_if<is_constructible_type<C>::value>::type> {\n        static C &value() {\n            static typename naked_type<C>::type val{};\n            return val;\n        }\n    };\n\n\n    template<>\n    struct DefaultValue<void> {\n        static void value() {\n            return;\n        }\n    };\n\n    template<>\n    struct DefaultValue<bool> {\n        static bool &value() {\n            static bool value{false};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<char> {\n        static char &value() {\n            static char value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<char16_t> {\n        static char16_t &value() {\n            static char16_t value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<char32_t> {\n        static char32_t &value() {\n            static char32_t value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<wchar_t> {\n        static wchar_t &value() {\n            static wchar_t value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<short> {\n        static short &value() {\n            static short value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<int> {\n        static int &value() {\n            static int value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<long> {\n        static long &value() {\n            static long value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<long long> {\n        static long long &value() {\n            static long long value{0};\n            return value;\n        }\n    };\n\n    template<>\n    struct DefaultValue<std::string> {\n        static std::string &value() {\n            static std::string value{};\n            return value;\n        }\n    };\n\n}\nnamespace fakeit {\n\n    struct IMatcher : Destructible {\n        ~IMatcher() = default;\n        virtual std::string format() const = 0;\n    };\n\n    template<typename T>\n    struct TypedMatcher : IMatcher {\n        virtual bool matches(const T &actual) const = 0;\n    };\n\n    template<typename T>\n    struct TypedMatcherCreator {\n\n        virtual ~TypedMatcherCreator() = default;\n\n        virtual TypedMatcher<T> *createMatcher() const = 0;\n    };\n\n    template<typename T>\n    struct ComparisonMatcherCreator : public TypedMatcherCreator<T> {\n\n        virtual ~ComparisonMatcherCreator() = default;\n\n        ComparisonMatcherCreator(const T &arg)\n                : _expected(arg) {\n        }\n\n        struct Matcher : public TypedMatcher<T> {\n            Matcher(const T &expected)\n                    : _expected(expected) {\n            }\n\n            const T _expected;\n        };\n\n        const T &_expected;\n    };\n\n    namespace internal {\n        template<typename T>\n        struct TypedAnyMatcher : public TypedMatcherCreator<T> {\n\n            virtual ~TypedAnyMatcher() = default;\n\n            TypedAnyMatcher() {\n            }\n\n            struct Matcher : public TypedMatcher<T> {\n                virtual bool matches(const T &) const override {\n                    return true;\n                }\n\n                virtual std::string format() const override {\n                    return \"Any\";\n                }\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const override {\n                return new Matcher();\n            }\n\n        };\n\n        template<typename T>\n        struct EqMatcherCreator : public ComparisonMatcherCreator<T> {\n\n            virtual ~EqMatcherCreator() = default;\n\n            EqMatcherCreator(const T &expected)\n                    : ComparisonMatcherCreator<T>(expected) {\n            }\n\n            struct Matcher : public ComparisonMatcherCreator<T>::Matcher {\n                Matcher(const T &expected)\n                        : ComparisonMatcherCreator<T>::Matcher(expected) {\n                }\n\n                virtual std::string format() const override {\n                    return TypeFormatter<T>::format(this->_expected);\n                }\n\n                virtual bool matches(const T &actual) const override {\n                    return actual == this->_expected;\n                }\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const {\n                return new Matcher(this->_expected);\n            }\n\n        };\n\n        template<typename T>\n        struct GtMatcherCreator : public ComparisonMatcherCreator<T> {\n\n            virtual ~GtMatcherCreator() = default;\n\n            GtMatcherCreator(const T &expected)\n                    : ComparisonMatcherCreator<T>(expected) {\n            }\n\n            struct Matcher : public ComparisonMatcherCreator<T>::Matcher {\n                Matcher(const T &expected)\n                        : ComparisonMatcherCreator<T>::Matcher(expected) {\n                }\n\n                virtual bool matches(const T &actual) const override {\n                    return actual > this->_expected;\n                }\n\n                virtual std::string format() const override {\n                    return std::string(\">\") + TypeFormatter<T>::format(this->_expected);\n                }\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const override {\n                return new Matcher(this->_expected);\n            }\n        };\n\n        template<typename T>\n        struct GeMatcherCreator : public ComparisonMatcherCreator<T> {\n\n            virtual ~GeMatcherCreator() = default;\n\n            GeMatcherCreator(const T &expected)\n                    : ComparisonMatcherCreator<T>(expected) {\n            }\n\n            struct Matcher : public ComparisonMatcherCreator<T>::Matcher {\n                Matcher(const T &expected)\n                        : ComparisonMatcherCreator<T>::Matcher(expected) {\n                }\n\n                virtual bool matches(const T &actual) const override {\n                    return actual >= this->_expected;\n                }\n\n                virtual std::string format() const override {\n                    return std::string(\">=\") + TypeFormatter<T>::format(this->_expected);\n                }\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const override {\n                return new Matcher(this->_expected);\n            }\n        };\n\n        template<typename T>\n        struct LtMatcherCreator : public ComparisonMatcherCreator<T> {\n\n            virtual ~LtMatcherCreator() = default;\n\n            LtMatcherCreator(const T &expected)\n                    : ComparisonMatcherCreator<T>(expected) {\n            }\n\n            struct Matcher : public ComparisonMatcherCreator<T>::Matcher {\n                Matcher(const T &expected)\n                        : ComparisonMatcherCreator<T>::Matcher(expected) {\n                }\n\n                virtual bool matches(const T &actual) const override {\n                    return actual < this->_expected;\n                }\n\n                virtual std::string format() const override {\n                    return std::string(\"<\") + TypeFormatter<T>::format(this->_expected);\n                }\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const override {\n                return new Matcher(this->_expected);\n            }\n\n        };\n\n        template<typename T>\n        struct LeMatcherCreator : public ComparisonMatcherCreator<T> {\n\n            virtual ~LeMatcherCreator() = default;\n\n            LeMatcherCreator(const T &expected)\n                    : ComparisonMatcherCreator<T>(expected) {\n            }\n\n            struct Matcher : public ComparisonMatcherCreator<T>::Matcher {\n                Matcher(const T &expected)\n                        : ComparisonMatcherCreator<T>::Matcher(expected) {\n                }\n\n                virtual bool matches(const T &actual) const override {\n                    return actual <= this->_expected;\n                }\n\n                virtual std::string format() const override {\n                    return std::string(\"<=\") + TypeFormatter<T>::format(this->_expected);\n                }\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const override {\n                return new Matcher(this->_expected);\n            }\n\n        };\n\n        template<typename T>\n        struct NeMatcherCreator : public ComparisonMatcherCreator<T> {\n\n            virtual ~NeMatcherCreator() = default;\n\n            NeMatcherCreator(const T &expected)\n                    : ComparisonMatcherCreator<T>(expected) {\n            }\n\n            struct Matcher : public ComparisonMatcherCreator<T>::Matcher {\n                Matcher(const T &expected)\n                        : ComparisonMatcherCreator<T>::Matcher(expected) {\n                }\n\n                virtual bool matches(const T &actual) const override {\n                    return actual != this->_expected;\n                }\n\n                virtual std::string format() const override {\n                    return std::string(\"!=\") + TypeFormatter<T>::format(this->_expected);\n                }\n\n            };\n\n            virtual TypedMatcher<T> *createMatcher() const override {\n                return new Matcher(this->_expected);\n            }\n\n        };\n    }\n\n    struct AnyMatcher {\n    } static _;\n\n    template<typename T>\n    internal::TypedAnyMatcher<T> Any() {\n        internal::TypedAnyMatcher<T> rv;\n        return rv;\n    }\n\n    template<typename T>\n    internal::EqMatcherCreator<T> Eq(const T &arg) {\n        internal::EqMatcherCreator<T> rv(arg);\n        return rv;\n    }\n\n    template<typename T>\n    internal::GtMatcherCreator<T> Gt(const T &arg) {\n        internal::GtMatcherCreator<T> rv(arg);\n        return rv;\n    }\n\n    template<typename T>\n    internal::GeMatcherCreator<T> Ge(const T &arg) {\n        internal::GeMatcherCreator<T> rv(arg);\n        return rv;\n    }\n\n    template<typename T>\n    internal::LtMatcherCreator<T> Lt(const T &arg) {\n        internal::LtMatcherCreator<T> rv(arg);\n        return rv;\n    }\n\n    template<typename T>\n    internal::LeMatcherCreator<T> Le(const T &arg) {\n        internal::LeMatcherCreator<T> rv(arg);\n        return rv;\n    }\n\n    template<typename T>\n    internal::NeMatcherCreator<T> Ne(const T &arg) {\n        internal::NeMatcherCreator<T> rv(arg);\n        return rv;\n    }\n\n}\n\nnamespace fakeit {\n\n    template<typename ... arglist>\n    struct ArgumentsMatcherInvocationMatcher : public ActualInvocation<arglist...>::Matcher {\n\n        virtual ~ArgumentsMatcherInvocationMatcher() {\n            for (unsigned int i = 0; i < _matchers.size(); i++)\n                delete _matchers[i];\n        }\n\n        ArgumentsMatcherInvocationMatcher(const std::vector<Destructible *> &args)\n                : _matchers(args) {\n        }\n\n        virtual bool matches(ActualInvocation<arglist...> &invocation) override {\n            if (invocation.getActualMatcher() == this)\n                return true;\n            return matches(invocation.getActualArguments());\n        }\n\n        virtual std::string format() const override {\n            std::ostringstream out;\n            out << \"(\";\n            for (unsigned int i = 0; i < _matchers.size(); i++) {\n                if (i > 0) out << \", \";\n                IMatcher *m = dynamic_cast<IMatcher *>(_matchers[i]);\n                out << m->format();\n            }\n            out << \")\";\n            return out.str();\n        }\n\n    private:\n\n        struct MatchingLambda {\n            MatchingLambda(const std::vector<Destructible *> &matchers)\n                    : _matchers(matchers) {\n            }\n\n            template<typename A>\n            void operator()(int index, A &actualArg) {\n                TypedMatcher<typename naked_type<A>::type> *matcher =\n                        dynamic_cast<TypedMatcher<typename naked_type<A>::type> *>(_matchers[index]);\n                if (_matching)\n                    _matching = matcher->matches(actualArg);\n            }\n\n            bool isMatching() {\n                return _matching;\n            }\n\n        private:\n            bool _matching = true;\n            const std::vector<Destructible *> &_matchers;\n        };\n\n        virtual bool matches(ArgumentsTuple<arglist...>& actualArguments) {\n            MatchingLambda l(_matchers);\n            fakeit::TupleDispatcher::for_each(actualArguments, l);\n            return l.isMatching();\n        }\n\n        const std::vector<Destructible *> _matchers;\n    };\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    template<typename ... arglist>\n    struct UserDefinedInvocationMatcher : ActualInvocation<arglist...>::Matcher {\n        virtual ~UserDefinedInvocationMatcher() = default;\n\n        UserDefinedInvocationMatcher(std::function<bool(arglist &...)> match)\n                : matcher{match} {\n        }\n\n        virtual bool matches(ActualInvocation<arglist...> &invocation) override {\n            if (invocation.getActualMatcher() == this)\n                return true;\n            return matches(invocation.getActualArguments());\n        }\n\n        virtual std::string format() const override {\n            return {\"( user defined matcher )\"};\n        }\n\n    private:\n        virtual bool matches(ArgumentsTuple<arglist...>& actualArguments) {\n            return TupleDispatcher::invoke<bool, typename tuple_arg<arglist>::type...>(matcher, actualArguments);\n        }\n\n        const std::function<bool(arglist &...)> matcher;\n    };\n\n    template<typename ... arglist>\n    struct DefaultInvocationMatcher : public ActualInvocation<arglist...>::Matcher {\n\n        virtual ~DefaultInvocationMatcher() = default;\n\n        DefaultInvocationMatcher() {\n        }\n\n        virtual bool matches(ActualInvocation<arglist...> &invocation) override {\n            return matches(invocation.getActualArguments());\n        }\n\n        virtual std::string format() const override {\n            return {\"( Any arguments )\"};\n        }\n\n    private:\n\n        virtual bool matches(const ArgumentsTuple<arglist...>&) {\n            return true;\n        }\n    };\n\n}\n\nnamespace fakeit {\n\n\n    template<typename R, typename ... arglist>\n    class RecordedMethodBody : public MethodInvocationHandler<R, arglist...>, public ActualInvocationsSource, public ActualInvocationsContainer {\n\n        struct MatchedInvocationHandler : ActualInvocationHandler<R, arglist...> {\n\n            virtual ~MatchedInvocationHandler() = default;\n\n            MatchedInvocationHandler(typename ActualInvocation<arglist...>::Matcher *matcher,\n                ActualInvocationHandler<R, arglist...> *invocationHandler) :\n                    _matcher{matcher}, _invocationHandler{invocationHandler} {\n            }\n\n            virtual R handleMethodInvocation(ArgumentsTuple<arglist...> & args) override\n            {\n                Destructible &destructable = *_invocationHandler;\n                ActualInvocationHandler<R, arglist...> &invocationHandler = dynamic_cast<ActualInvocationHandler<R, arglist...> &>(destructable);\n                return invocationHandler.handleMethodInvocation(args);\n            }\n\n            typename ActualInvocation<arglist...>::Matcher &getMatcher() const {\n                Destructible &destructable = *_matcher;\n                typename ActualInvocation<arglist...>::Matcher &matcher = dynamic_cast<typename ActualInvocation<arglist...>::Matcher &>(destructable);\n                return matcher;\n            }\n\n        private:\n            std::shared_ptr<Destructible> _matcher;\n            std::shared_ptr<Destructible> _invocationHandler;\n        };\n\n\n        FakeitContext &_fakeit;\n        MethodInfo _method;\n\n        std::vector<std::shared_ptr<Destructible>> _invocationHandlers;\n        std::vector<std::shared_ptr<Destructible>> _actualInvocations;\n\n        MatchedInvocationHandler *buildMatchedInvocationHandler(\n                typename ActualInvocation<arglist...>::Matcher *invocationMatcher,\n                ActualInvocationHandler<R, arglist...> *invocationHandler) {\n            return new MatchedInvocationHandler(invocationMatcher, invocationHandler);\n        }\n\n        MatchedInvocationHandler *getInvocationHandlerForActualArgs(ActualInvocation<arglist...> &invocation) {\n            for (auto i = _invocationHandlers.rbegin(); i != _invocationHandlers.rend(); ++i) {\n                std::shared_ptr<Destructible> curr = *i;\n                Destructible &destructable = *curr;\n                MatchedInvocationHandler &im = asMatchedInvocationHandler(destructable);\n                if (im.getMatcher().matches(invocation)) {\n                    return &im;\n                }\n            }\n            return nullptr;\n        }\n\n        MatchedInvocationHandler &asMatchedInvocationHandler(Destructible &destructable) {\n            MatchedInvocationHandler &im = dynamic_cast<MatchedInvocationHandler &>(destructable);\n            return im;\n        }\n\n        ActualInvocation<arglist...> &asActualInvocation(Destructible &destructable) const {\n            ActualInvocation<arglist...> &invocation = dynamic_cast<ActualInvocation<arglist...> &>(destructable);\n            return invocation;\n        }\n\n    public:\n\n        RecordedMethodBody(FakeitContext &fakeit, std::string name) :\n                _fakeit(fakeit), _method{MethodInfo::nextMethodOrdinal(), name} { }\n\n        virtual ~RecordedMethodBody() NO_THROWS {\n        }\n\n        MethodInfo &getMethod() {\n            return _method;\n        }\n\n        bool isOfMethod(MethodInfo &method) {\n\n            return method.id() == _method.id();\n        }\n\n        void addMethodInvocationHandler(typename ActualInvocation<arglist...>::Matcher *matcher,\n            ActualInvocationHandler<R, arglist...> *invocationHandler) {\n            ActualInvocationHandler<R, arglist...> *mock = buildMatchedInvocationHandler(matcher, invocationHandler);\n            std::shared_ptr<Destructible> destructable{mock};\n            _invocationHandlers.push_back(destructable);\n        }\n\n        void reset() {\n            _invocationHandlers.clear();\n            _actualInvocations.clear();\n        }\n\n\t\tvoid clear() override {\n\t\t\t_actualInvocations.clear();\n\t\t}\n\n        R handleMethodInvocation(const typename fakeit::production_arg<arglist>::type... args) override {\n            unsigned int ordinal = Invocation::nextInvocationOrdinal();\n            MethodInfo &method = this->getMethod();\n            auto actualInvocation = new ActualInvocation<arglist...>(ordinal, method, std::forward<const typename fakeit::production_arg<arglist>::type>(args)...);\n\n\n            std::shared_ptr<Destructible> actualInvocationDtor{actualInvocation};\n\n            auto invocationHandler = getInvocationHandlerForActualArgs(*actualInvocation);\n            if (invocationHandler) {\n                auto &matcher = invocationHandler->getMatcher();\n                actualInvocation->setActualMatcher(&matcher);\n                _actualInvocations.push_back(actualInvocationDtor);\n                try {\n                    return invocationHandler->handleMethodInvocation(actualInvocation->getActualArguments());\n                } catch (NoMoreRecordedActionException &) {\n                }\n            }\n\n            UnexpectedMethodCallEvent event(UnexpectedType::Unmatched, *actualInvocation);\n            _fakeit.handle(event);\n            std::string format{_fakeit.format(event)};\n            UnexpectedMethodCallException e(format);\n            throw e;\n        }\n\n        void scanActualInvocations(const std::function<void(ActualInvocation<arglist...> &)> &scanner) {\n            for (auto destructablePtr : _actualInvocations) {\n                ActualInvocation<arglist...> &invocation = asActualInvocation(*destructablePtr);\n                scanner(invocation);\n            }\n        }\n\n        void getActualInvocations(std::unordered_set<Invocation *> &into) const override {\n            for (auto destructablePtr : _actualInvocations) {\n                Invocation &invocation = asActualInvocation(*destructablePtr);\n                into.insert(&invocation);\n            }\n        }\n\n        void setMethodDetails(const std::string &mockName, const std::string &methodName) {\n            const std::string fullName{mockName + \".\" + methodName};\n            _method.setName(fullName);\n        }\n\n    };\n\n}\n#include <functional>\n#include <type_traits>\n#include <stdexcept>\n#include <utility>\n#include <functional>\n#include <type_traits>\n\nnamespace fakeit {\n\n    struct Quantity {\n        Quantity(const int q) :\n                quantity(q) {\n        }\n\n        const int quantity;\n    } static Once(1);\n\n    template<typename R>\n    struct Quantifier : public Quantity {\n        Quantifier(const int q, const R &val) :\n                Quantity(q), value(val) {\n        }\n\n        const R &value;\n    };\n\n    template<>\n    struct Quantifier<void> : public Quantity {\n        explicit Quantifier(const int q) :\n                Quantity(q) {\n        }\n    };\n\n    struct QuantifierFunctor : public Quantifier<void> {\n        QuantifierFunctor(const int q) :\n                Quantifier<void>(q) {\n        }\n\n        template<typename R>\n        Quantifier<R> operator()(const R &value) {\n            return Quantifier<R>(quantity, value);\n        }\n    };\n\n    template<int q>\n    struct Times : public Quantity {\n\n        Times<q>() : Quantity(q) { }\n\n        template<typename R>\n        static Quantifier<R> of(const R &value) {\n            return Quantifier<R>(q, value);\n        }\n\n        static Quantifier<void> Void() {\n            return Quantifier<void>(q);\n        }\n    };\n\n#if defined (__GNUG__) || (_MSC_VER >= 1900)\n\n    inline QuantifierFunctor operator\n    \"\"\n\n    _Times(unsigned long long n) {\n        return QuantifierFunctor((int) n);\n    }\n\n    inline QuantifierFunctor operator\n    \"\"\n\n    _Time(unsigned long long n) {\n        if (n != 1)\n            throw std::invalid_argument(\"Only 1_Time is supported. Use X_Times (with s) if X is bigger than 1\");\n        return QuantifierFunctor((int) n);\n    }\n\n#endif\n\n}\n#include <functional>\n#include <atomic>\n#include <tuple>\n#include <type_traits>\n\n\nnamespace fakeit {\n\n    template<typename R, typename ... arglist>\n    struct Action : Destructible {\n        virtual R invoke(const ArgumentsTuple<arglist...> &) = 0;\n\n        virtual bool isDone() = 0;\n    };\n\n    template<typename R, typename ... arglist>\n    struct Repeat : Action<R, arglist...> {\n        virtual ~Repeat() = default;\n\n        Repeat(std::function<R(typename fakeit::test_arg<arglist>::type...)> func) :\n                f(func), times(1) {\n        }\n\n        Repeat(std::function<R(typename fakeit::test_arg<arglist>::type...)> func, long t) :\n                f(func), times(t) {\n        }\n\n        virtual R invoke(const ArgumentsTuple<arglist...> & args) override {\n            times--;\n            return TupleDispatcher::invoke<R, arglist...>(f, args);\n        }\n\n        virtual bool isDone() override {\n            return times == 0;\n        }\n\n    private:\n        std::function<R(typename fakeit::test_arg<arglist>::type...)> f;\n        long times;\n    };\n\n    template<typename R, typename ... arglist>\n    struct RepeatForever : public Action<R, arglist...> {\n\n        virtual ~RepeatForever() = default;\n\n        RepeatForever(std::function<R(typename fakeit::test_arg<arglist>::type...)> func) :\n                f(func) {\n        }\n\n        virtual R invoke(const ArgumentsTuple<arglist...> & args) override {\n            return TupleDispatcher::invoke<R, arglist...>(f, args);\n        }\n\n        virtual bool isDone() override {\n            return false;\n        }\n\n    private:\n        std::function<R(typename fakeit::test_arg<arglist>::type...)> f;\n    };\n\n    template<typename R, typename ... arglist>\n    struct ReturnDefaultValue : public Action<R, arglist...> {\n        virtual ~ReturnDefaultValue() = default;\n\n        virtual R invoke(const ArgumentsTuple<arglist...> &) override {\n            return DefaultValue<R>::value();\n        }\n\n        virtual bool isDone() override {\n            return false;\n        }\n    };\n\n    template<typename R, typename ... arglist>\n    struct ReturnDelegateValue : public Action<R, arglist...> {\n\n        ReturnDelegateValue(std::function<R(const typename fakeit::test_arg<arglist>::type...)> delegate) : _delegate(delegate) { }\n\n        virtual ~ReturnDelegateValue() = default;\n\n        virtual R invoke(const ArgumentsTuple<arglist...> & args) override {\n            return TupleDispatcher::invoke<R, arglist...>(_delegate, args);\n        }\n\n        virtual bool isDone() override {\n            return false;\n        }\n\n    private:\n        std::function<R(const typename fakeit::test_arg<arglist>::type...)> _delegate;\n    };\n\n}\n\nnamespace fakeit {\n\n    template<typename R, typename ... arglist>\n    struct MethodStubbingProgress {\n\n        virtual ~MethodStubbingProgress() THROWS {\n        }\n\n        template<typename U = R>\n        typename std::enable_if<!std::is_reference<U>::value, MethodStubbingProgress<R, arglist...> &>::type\n        Return(const R &r) {\n            return Do([r](const typename fakeit::test_arg<arglist>::type...) -> R { return r; });\n        }\n\n        template<typename U = R>\n        typename std::enable_if<std::is_reference<U>::value, MethodStubbingProgress<R, arglist...> &>::type\n        Return(const R &r) {\n            return Do([&r](const typename fakeit::test_arg<arglist>::type...) -> R { return r; });\n        }\n\n        MethodStubbingProgress<R, arglist...> &\n        Return(const Quantifier<R> &q) {\n            const R &value = q.value;\n            auto method = [value](const arglist &...) -> R { return value; };\n            return DoImpl(new Repeat<R, arglist...>(method, q.quantity));\n        }\n\n        template<typename first, typename second, typename ... tail>\n        MethodStubbingProgress<R, arglist...> &\n        Return(const first &f, const second &s, const tail &... t) {\n            Return(f);\n            return Return(s, t...);\n        }\n\n\n        template<typename U = R>\n        typename std::enable_if<!std::is_reference<U>::value, void>::type\n        AlwaysReturn(const R &r) {\n            return AlwaysDo([r](const typename fakeit::test_arg<arglist>::type...) -> R { return r; });\n        }\n\n        template<typename U = R>\n        typename std::enable_if<std::is_reference<U>::value, void>::type\n        AlwaysReturn(const R &r) {\n            return AlwaysDo([&r](const typename fakeit::test_arg<arglist>::type...) -> R { return r; });\n        }\n\n        MethodStubbingProgress<R, arglist...> &\n        Return() {\n            return Do([](const typename fakeit::test_arg<arglist>::type...) -> R { return DefaultValue<R>::value(); });\n        }\n\n        void AlwaysReturn() {\n            return AlwaysDo([](const typename fakeit::test_arg<arglist>::type...) -> R { return DefaultValue<R>::value(); });\n        }\n\n        template<typename E>\n        MethodStubbingProgress<R, arglist...> &Throw(const E &e) {\n            return Do([e](const typename fakeit::test_arg<arglist>::type...) -> R { throw e; });\n        }\n\n        template<typename E>\n        MethodStubbingProgress<R, arglist...> &\n        Throw(const Quantifier<E> &q) {\n            const E &value = q.value;\n            auto method = [value](const arglist &...) -> R { throw value; };\n            return DoImpl(new Repeat<R, arglist...>(method, q.quantity));\n        }\n\n        template<typename first, typename second, typename ... tail>\n        MethodStubbingProgress<R, arglist...> &\n        Throw(const first &f, const second &s, const tail &... t) {\n            Throw(f);\n            return Throw(s, t...);\n        }\n\n        template<typename E>\n        void AlwaysThrow(const E &e) {\n            return AlwaysDo([e](const typename fakeit::test_arg<arglist>::type...) -> R { throw e; });\n        }\n\n        virtual MethodStubbingProgress<R, arglist...> &\n            Do(std::function<R(const typename fakeit::test_arg<arglist>::type...)> method) {\n            return DoImpl(new Repeat<R, arglist...>(method));\n        }\n\n        template<typename F>\n        MethodStubbingProgress<R, arglist...> &\n        Do(const Quantifier<F> &q) {\n            return DoImpl(new Repeat<R, arglist...>(q.value, q.quantity));\n        }\n\n        template<typename first, typename second, typename ... tail>\n        MethodStubbingProgress<R, arglist...> &\n        Do(const first &f, const second &s, const tail &... t) {\n            Do(f);\n            return Do(s, t...);\n        }\n\n        virtual void AlwaysDo(std::function<R(const typename fakeit::test_arg<arglist>::type...)> method) {\n            DoImpl(new RepeatForever<R, arglist...>(method));\n        }\n\n    protected:\n\n        virtual MethodStubbingProgress<R, arglist...> &DoImpl(Action<R, arglist...> *action) = 0;\n\n    private:\n        MethodStubbingProgress &operator=(const MethodStubbingProgress &other) = delete;\n    };\n\n\n    template<typename ... arglist>\n    struct MethodStubbingProgress<void, arglist...> {\n\n        virtual ~MethodStubbingProgress() THROWS {\n        }\n\n        MethodStubbingProgress<void, arglist...> &Return() {\n            auto lambda = [](const typename fakeit::test_arg<arglist>::type...) -> void {\n                return DefaultValue<void>::value();\n            };\n            return Do(lambda);\n        }\n\n        virtual MethodStubbingProgress<void, arglist...> &Do(\n            std::function<void(const typename fakeit::test_arg<arglist>::type...)> method) {\n            return DoImpl(new Repeat<void, arglist...>(method));\n        }\n\n\n        void AlwaysReturn() {\n            return AlwaysDo([](const typename fakeit::test_arg<arglist>::type...) -> void { return DefaultValue<void>::value(); });\n        }\n\n        MethodStubbingProgress<void, arglist...> &\n        Return(const Quantifier<void> &q) {\n            auto method = [](const arglist &...) -> void { return DefaultValue<void>::value(); };\n            return DoImpl(new Repeat<void, arglist...>(method, q.quantity));\n        }\n\n        template<typename E>\n        MethodStubbingProgress<void, arglist...> &Throw(const E &e) {\n            return Do([e](const typename fakeit::test_arg<arglist>::type...) -> void { throw e; });\n        }\n\n        template<typename E>\n        MethodStubbingProgress<void, arglist...> &\n        Throw(const Quantifier<E> &q) {\n            const E &value = q.value;\n            auto method = [value](const typename fakeit::test_arg<arglist>::type...) -> void { throw value; };\n            return DoImpl(new Repeat<void, arglist...>(method, q.quantity));\n        }\n\n        template<typename first, typename second, typename ... tail>\n        MethodStubbingProgress<void, arglist...> &\n        Throw(const first &f, const second &s, const tail &... t) {\n            Throw(f);\n            return Throw(s, t...);\n        }\n\n        template<typename E>\n        void AlwaysThrow(const E e) {\n            return AlwaysDo([e](const typename fakeit::test_arg<arglist>::type...) -> void { throw e; });\n        }\n\n           template<typename F>\n        MethodStubbingProgress<void, arglist...> &\n        Do(const Quantifier<F> &q) {\n            return DoImpl(new Repeat<void, arglist...>(q.value, q.quantity));\n        }\n\n        template<typename first, typename second, typename ... tail>\n        MethodStubbingProgress<void, arglist...> &\n        Do(const first &f, const second &s, const tail &... t) {\n            Do(f);\n            return Do(s, t...);\n        }\n\n        virtual void AlwaysDo(std::function<void(const typename fakeit::test_arg<arglist>::type...)> method) {\n            DoImpl(new RepeatForever<void, arglist...>(method));\n        }\n\n    protected:\n\n        virtual MethodStubbingProgress<void, arglist...> &DoImpl(Action<void, arglist...> *action) = 0;\n\n    private:\n        MethodStubbingProgress &operator=(const MethodStubbingProgress &other) = delete;\n    };\n\n\n}\n#include <vector>\n#include <functional>\n\nnamespace fakeit {\n\n    class Finally {\n    private:\n        std::function<void()> _finallyClause;\n\n        Finally(const Finally &);\n\n        Finally &operator=(const Finally &);\n\n    public:\n        explicit Finally(std::function<void()> f) :\n                _finallyClause(f) {\n        }\n\n        ~Finally() {\n            _finallyClause();\n        }\n    };\n}\n\nnamespace fakeit {\n\n\n    template<typename R, typename ... arglist>\n    struct ActionSequence : ActualInvocationHandler<R,arglist...> {\n\n        ActionSequence() {\n            clear();\n        }\n\n        void AppendDo(Action<R, arglist...> *action) {\n            append(action);\n        }\n\n        virtual R handleMethodInvocation(ArgumentsTuple<arglist...> & args) override\n        {\n            std::shared_ptr<Destructible> destructablePtr = _recordedActions.front();\n            Destructible &destructable = *destructablePtr;\n            Action<R, arglist...> &action = dynamic_cast<Action<R, arglist...> &>(destructable);\n            std::function<void()> finallyClause = [&]() -> void {\n                if (action.isDone())\n                    _recordedActions.erase(_recordedActions.begin());\n            };\n            Finally onExit(finallyClause);\n            return action.invoke(args);\n        }\n\n    private:\n\n        struct NoMoreRecordedAction : Action<R, arglist...> {\n\n\n\n\n\n\n\n            virtual R invoke(const ArgumentsTuple<arglist...> &) override {\n                throw NoMoreRecordedActionException();\n            }\n\n            virtual bool isDone() override {\n                return false;\n            }\n        };\n\n        void append(Action<R, arglist...> *action) {\n            std::shared_ptr<Destructible> destructable{action};\n            _recordedActions.insert(_recordedActions.end() - 1, destructable);\n        }\n\n        void clear() {\n            _recordedActions.clear();\n            auto actionPtr = std::shared_ptr<Destructible> {new NoMoreRecordedAction()};\n            _recordedActions.push_back(actionPtr);\n        }\n\n        std::vector<std::shared_ptr<Destructible>> _recordedActions;\n    };\n\n}\n\nnamespace fakeit {\n\n    template<typename C, typename DATA_TYPE>\n    class DataMemberStubbingRoot {\n    private:\n\n    public:\n        DataMemberStubbingRoot(const DataMemberStubbingRoot &) = default;\n\n        DataMemberStubbingRoot() = default;\n\n        void operator=(const DATA_TYPE&) {\n        }\n    };\n\n}\n#include <functional>\n#include <utility>\n#include <type_traits>\n#include <tuple>\n#include <memory>\n#include <vector>\n#include <unordered_set>\n#include <set>\n#include <iosfwd>\n\nnamespace fakeit {\n\n    struct Xaction {\n        virtual void commit() = 0;\n    };\n}\n\nnamespace fakeit {\n\n\n    template<typename R, typename ... arglist>\n    struct SpyingContext : Xaction {\n        virtual void appendAction(Action<R, arglist...> *action) = 0;\n\n        virtual std::function<R(arglist&...)> getOriginalMethod() = 0;\n    };\n}\nnamespace fakeit {\n\n\n    template<typename R, typename ... arglist>\n    struct StubbingContext : public Xaction {\n        virtual void appendAction(Action<R, arglist...> *action) = 0;\n    };\n}\n#include <functional>\n#include <type_traits>\n#include <tuple>\n#include <memory>\n#include <vector>\n#include <unordered_set>\n\n\nnamespace fakeit {\n\n    template<unsigned int index, typename ... arglist>\n    class MatchersCollector {\n\n        std::vector<Destructible *> &_matchers;\n\n    public:\n\n\n        template<std::size_t N>\n        using ArgType = typename std::tuple_element<N, std::tuple<arglist...>>::type;\n\n        template<std::size_t N>\n        using NakedArgType = typename naked_type<ArgType<index>>::type;\n\n        template<std::size_t N>\n        using ArgMatcherCreatorType = decltype(std::declval<TypedMatcherCreator<NakedArgType<N>>>());\n\n        MatchersCollector(std::vector<Destructible *> &matchers)\n                : _matchers(matchers) {\n        }\n\n        void CollectMatchers() {\n        }\n\n        template<typename Head>\n        typename std::enable_if<\n                std::is_constructible<NakedArgType<index>, Head>::value, void>\n        ::type CollectMatchers(const Head &value) {\n\n            TypedMatcher<NakedArgType<index>> *d = Eq<NakedArgType<index>>(value).createMatcher();\n            _matchers.push_back(d);\n        }\n\n        template<typename Head, typename ...Tail>\n        typename std::enable_if<\n                std::is_constructible<NakedArgType<index>, Head>::value\n                , void>\n        ::type CollectMatchers(const Head &head, const Tail &... tail) {\n            CollectMatchers(head);\n            MatchersCollector<index + 1, arglist...> c(_matchers);\n            c.CollectMatchers(tail...);\n        }\n\n        template<typename Head>\n        typename std::enable_if<\n                std::is_base_of<TypedMatcherCreator<NakedArgType<index>>, Head>::value, void>\n        ::type CollectMatchers(const Head &creator) {\n            TypedMatcher<NakedArgType<index>> *d = creator.createMatcher();\n            _matchers.push_back(d);\n        }\n\n        template<typename Head, typename ...Tail>\n\n        typename std::enable_if<\n                std::is_base_of<TypedMatcherCreator<NakedArgType<index>>, Head>::value, void>\n        ::type CollectMatchers(const Head &head, const Tail &... tail) {\n            CollectMatchers(head);\n            MatchersCollector<index + 1, arglist...> c(_matchers);\n            c.CollectMatchers(tail...);\n        }\n\n        template<typename Head>\n        typename std::enable_if<\n                std::is_same<AnyMatcher, Head>::value, void>\n        ::type CollectMatchers(const Head &) {\n            TypedMatcher<NakedArgType<index>> *d = Any<NakedArgType<index>>().createMatcher();\n            _matchers.push_back(d);\n        }\n\n        template<typename Head, typename ...Tail>\n        typename std::enable_if<\n                std::is_same<AnyMatcher, Head>::value, void>\n        ::type CollectMatchers(const Head &head, const Tail &... tail) {\n            CollectMatchers(head);\n            MatchersCollector<index + 1, arglist...> c(_matchers);\n            c.CollectMatchers(tail...);\n        }\n\n    };\n\n}\n\nnamespace fakeit {\n\n    template<typename R, typename ... arglist>\n    class MethodMockingContext :\n            public Sequence,\n            public ActualInvocationsSource,\n            public virtual StubbingContext<R, arglist...>,\n            public virtual SpyingContext<R, arglist...>,\n            private Invocation::Matcher {\n    public:\n\n        struct Context : Destructible {\n\n\n            virtual typename std::function<R(arglist&...)> getOriginalMethod() = 0;\n\n            virtual std::string getMethodName() = 0;\n\n            virtual void addMethodInvocationHandler(typename ActualInvocation<arglist...>::Matcher *matcher,\n                ActualInvocationHandler<R, arglist...> *invocationHandler) = 0;\n\n            virtual void scanActualInvocations(const std::function<void(ActualInvocation<arglist...> &)> &scanner) = 0;\n\n            virtual void setMethodDetails(std::string mockName, std::string methodName) = 0;\n\n            virtual bool isOfMethod(MethodInfo &method) = 0;\n\n            virtual ActualInvocationsSource &getInvolvedMock() = 0;\n        };\n\n    private:\n        class Implementation {\n\n            Context *_stubbingContext;\n            ActionSequence<R, arglist...> *_recordedActionSequence;\n            typename ActualInvocation<arglist...>::Matcher *_invocationMatcher;\n            bool _commited;\n\n            Context &getStubbingContext() const {\n                return *_stubbingContext;\n            }\n\n        public:\n\n            Implementation(Context *stubbingContext)\n                    : _stubbingContext(stubbingContext),\n                      _recordedActionSequence(new ActionSequence<R, arglist...>()),\n                      _invocationMatcher\n                              {\n                                      new DefaultInvocationMatcher<arglist...>()}, _commited(false) {\n            }\n\n            ~Implementation() {\n                delete _stubbingContext;\n                if (!_commited) {\n\n                    delete _recordedActionSequence;\n                    delete _invocationMatcher;\n                }\n            }\n\n            ActionSequence<R, arglist...> &getRecordedActionSequence() {\n                return *_recordedActionSequence;\n            }\n\n            std::string format() const {\n                std::string s = getStubbingContext().getMethodName();\n                s += _invocationMatcher->format();\n                return s;\n            }\n\n            void getActualInvocations(std::unordered_set<Invocation *> &into) const {\n                auto scanner = [&](ActualInvocation<arglist...> &a) {\n                    if (_invocationMatcher->matches(a)) {\n                        into.insert(&a);\n                    }\n                };\n                getStubbingContext().scanActualInvocations(scanner);\n            }\n\n\n            bool matches(Invocation &invocation) {\n                MethodInfo &actualMethod = invocation.getMethod();\n                if (!getStubbingContext().isOfMethod(actualMethod)) {\n                    return false;\n                }\n\n                ActualInvocation<arglist...> &actualInvocation = dynamic_cast<ActualInvocation<arglist...> &>(invocation);\n                return _invocationMatcher->matches(actualInvocation);\n            }\n\n            void commit() {\n                getStubbingContext().addMethodInvocationHandler(_invocationMatcher, _recordedActionSequence);\n                _commited = true;\n            }\n\n            void appendAction(Action<R, arglist...> *action) {\n                getRecordedActionSequence().AppendDo(action);\n            }\n\n            void setMethodBodyByAssignment(std::function<R(const typename fakeit::test_arg<arglist>::type...)> method) {\n                appendAction(new RepeatForever<R, arglist...>(method));\n                commit();\n            }\n\n            void setMethodDetails(std::string mockName, std::string methodName) {\n                getStubbingContext().setMethodDetails(mockName, methodName);\n            }\n\n            void getInvolvedMocks(std::vector<ActualInvocationsSource *> &into) const {\n                into.push_back(&getStubbingContext().getInvolvedMock());\n            }\n\n            typename std::function<R(arglist &...)> getOriginalMethod() {\n                return getStubbingContext().getOriginalMethod();\n            }\n\n            void setInvocationMatcher(typename ActualInvocation<arglist...>::Matcher *matcher) {\n                delete _invocationMatcher;\n                _invocationMatcher = matcher;\n            }\n        };\n\n    protected:\n\n        MethodMockingContext(Context *stubbingContext)\n                : _impl{new Implementation(stubbingContext)} {\n        }\n\n        MethodMockingContext(MethodMockingContext &) = default;\n\n\n\n        MethodMockingContext(MethodMockingContext &&other)\n                : _impl(std::move(other._impl)) {\n        }\n\n        virtual ~MethodMockingContext() NO_THROWS { }\n\n        std::string format() const override {\n            return _impl->format();\n        }\n\n        unsigned int size() const override {\n            return 1;\n        }\n\n\n        void getInvolvedMocks(std::vector<ActualInvocationsSource *> &into) const override {\n            _impl->getInvolvedMocks(into);\n        }\n\n        void getExpectedSequence(std::vector<Invocation::Matcher *> &into) const override {\n            const Invocation::Matcher *b = this;\n            Invocation::Matcher *c = const_cast<Invocation::Matcher *>(b);\n            into.push_back(c);\n        }\n\n\n        void getActualInvocations(std::unordered_set<Invocation *> &into) const override {\n            _impl->getActualInvocations(into);\n        }\n\n\n        bool matches(Invocation &invocation) override {\n            return _impl->matches(invocation);\n        }\n\n        void commit() override {\n            _impl->commit();\n        }\n\n        void setMethodDetails(std::string mockName, std::string methodName) {\n            _impl->setMethodDetails(mockName, methodName);\n        }\n\n        void setMatchingCriteria(std::function<bool(arglist &...)> predicate) {\n            typename ActualInvocation<arglist...>::Matcher *matcher{\n                    new UserDefinedInvocationMatcher<arglist...>(predicate)};\n            _impl->setInvocationMatcher(matcher);\n        }\n\n        void setMatchingCriteria(const std::vector<Destructible *> &matchers) {\n            typename ActualInvocation<arglist...>::Matcher *matcher{\n                    new ArgumentsMatcherInvocationMatcher<arglist...>(matchers)};\n            _impl->setInvocationMatcher(matcher);\n        }\n\n\n        void appendAction(Action<R, arglist...> *action) override {\n            _impl->appendAction(action);\n        }\n\n        void setMethodBodyByAssignment(std::function<R(const typename fakeit::test_arg<arglist>::type...)> method) {\n            _impl->setMethodBodyByAssignment(method);\n        }\n\n        template<class ...matcherCreators, class = typename std::enable_if<\n                sizeof...(matcherCreators) == sizeof...(arglist)>::type>\n        void setMatchingCriteria(const matcherCreators &... matcherCreator) {\n            std::vector<Destructible *> matchers;\n\n            MatchersCollector<0, arglist...> c(matchers);\n            c.CollectMatchers(matcherCreator...);\n\n            MethodMockingContext<R, arglist...>::setMatchingCriteria(matchers);\n        }\n\n    private:\n\n        typename std::function<R(arglist&...)> getOriginalMethod() override {\n            return _impl->getOriginalMethod();\n        }\n\n        std::shared_ptr<Implementation> _impl;\n    };\n\n    template<typename R, typename ... arglist>\n    class MockingContext :\n            public MethodMockingContext<R, arglist...> {\n        MockingContext &operator=(const MockingContext &) = delete;\n\n    public:\n\n        MockingContext(typename MethodMockingContext<R, arglist...>::Context *stubbingContext)\n                : MethodMockingContext<R, arglist...>(stubbingContext) {\n        }\n\n        MockingContext(MockingContext &) = default;\n\n        MockingContext(MockingContext &&other)\n                : MethodMockingContext<R, arglist...>(std::move(other)) {\n        }\n\n        MockingContext<R, arglist...> &setMethodDetails(std::string mockName, std::string methodName) {\n            MethodMockingContext<R, arglist...>::setMethodDetails(mockName, methodName);\n            return *this;\n        }\n\n        MockingContext<R, arglist...> &Using(const arglist &... args) {\n            MethodMockingContext<R, arglist...>::setMatchingCriteria(args...);\n            return *this;\n        }\n\n        template<class ...arg_matcher>\n        MockingContext<R, arglist...> &Using(const arg_matcher &... arg_matchers) {\n            MethodMockingContext<R, arglist...>::setMatchingCriteria(arg_matchers...);\n            return *this;\n        }\n\n        MockingContext<R, arglist...> &Matching(std::function<bool(arglist &...)> matcher) {\n            MethodMockingContext<R, arglist...>::setMatchingCriteria(matcher);\n            return *this;\n        }\n\n        MockingContext<R, arglist...> &operator()(const arglist &... args) {\n            MethodMockingContext<R, arglist...>::setMatchingCriteria(args...);\n            return *this;\n        }\n\n        MockingContext<R, arglist...> &operator()(std::function<bool(arglist &...)> matcher) {\n            MethodMockingContext<R, arglist...>::setMatchingCriteria(matcher);\n            return *this;\n        }\n\n        void operator=(std::function<R(arglist &...)> method) {\n            MethodMockingContext<R, arglist...>::setMethodBodyByAssignment(method);\n        }\n\n        template<typename U = R>\n        typename std::enable_if<!std::is_reference<U>::value, void>::type operator=(const R &r) {\n            auto method = [r](const typename fakeit::test_arg<arglist>::type...) -> R { return r; };\n            MethodMockingContext<R, arglist...>::setMethodBodyByAssignment(method);\n        }\n\n        template<typename U = R>\n        typename std::enable_if<std::is_reference<U>::value, void>::type operator=(const R &r) {\n            auto method = [&r](const typename fakeit::test_arg<arglist>::type...) -> R { return r; };\n            MethodMockingContext<R, arglist...>::setMethodBodyByAssignment(method);\n        }\n    };\n\n    template<typename ... arglist>\n    class MockingContext<void, arglist...> :\n            public MethodMockingContext<void, arglist...> {\n        MockingContext &operator=(const MockingContext &) = delete;\n\n    public:\n\n        MockingContext(typename MethodMockingContext<void, arglist...>::Context *stubbingContext)\n                : MethodMockingContext<void, arglist...>(stubbingContext) {\n        }\n\n        MockingContext(MockingContext &) = default;\n\n        MockingContext(MockingContext &&other)\n                : MethodMockingContext<void, arglist...>(std::move(other)) {\n        }\n\n        MockingContext<void, arglist...> &setMethodDetails(std::string mockName, std::string methodName) {\n            MethodMockingContext<void, arglist...>::setMethodDetails(mockName, methodName);\n            return *this;\n        }\n\n        MockingContext<void, arglist...> &Using(const arglist &... args) {\n            MethodMockingContext<void, arglist...>::setMatchingCriteria(args...);\n            return *this;\n        }\n\n        template<class ...arg_matcher>\n        MockingContext<void, arglist...> &Using(const arg_matcher &... arg_matchers) {\n            MethodMockingContext<void, arglist...>::setMatchingCriteria(arg_matchers...);\n            return *this;\n        }\n\n        MockingContext<void, arglist...> &Matching(std::function<bool(arglist &...)> matcher) {\n            MethodMockingContext<void, arglist...>::setMatchingCriteria(matcher);\n            return *this;\n        }\n\n        MockingContext<void, arglist...> &operator()(const arglist &... args) {\n            MethodMockingContext<void, arglist...>::setMatchingCriteria(args...);\n            return *this;\n        }\n\n        MockingContext<void, arglist...> &operator()(std::function<bool(arglist &...)> matcher) {\n            MethodMockingContext<void, arglist...>::setMatchingCriteria(matcher);\n            return *this;\n        }\n\n        void operator=(std::function<void(arglist &...)> method) {\n            MethodMockingContext<void, arglist...>::setMethodBodyByAssignment(method);\n        }\n\n    };\n\n    class DtorMockingContext : public MethodMockingContext<void> {\n    public:\n\n        DtorMockingContext(MethodMockingContext<void>::Context *stubbingContext)\n                : MethodMockingContext<void>(stubbingContext) {\n        }\n\n        DtorMockingContext(DtorMockingContext &other) : MethodMockingContext<void>(other) {\n        }\n\n        DtorMockingContext(DtorMockingContext &&other) : MethodMockingContext<void>(std::move(other)) {\n        }\n\n        void operator=(std::function<void()> method) {\n            MethodMockingContext<void>::setMethodBodyByAssignment(method);\n        }\n\n        DtorMockingContext &setMethodDetails(std::string mockName, std::string methodName) {\n            MethodMockingContext<void>::setMethodDetails(mockName, methodName);\n            return *this;\n        }\n    };\n\n}\n\nnamespace fakeit {\n\n\n    template<typename C, typename ... baseclasses>\n    class MockImpl : private MockObject<C>, public virtual ActualInvocationsSource {\n    public:\n\n        MockImpl(FakeitContext &fakeit, C &obj)\n                : MockImpl<C, baseclasses...>(fakeit, obj, true) {\n        }\n\n        MockImpl(FakeitContext &fakeit)\n                : MockImpl<C, baseclasses...>(fakeit, *(createFakeInstance()), false) {\n            FakeObject<C, baseclasses...> *fake = reinterpret_cast<FakeObject<C, baseclasses...> *>(_instance);\n            fake->getVirtualTable().setCookie(1, this);\n        }\n\n        virtual ~MockImpl() NO_THROWS {\n            _proxy.detach();\n            if (_isOwner) {\n                FakeObject<C, baseclasses...> *fake = reinterpret_cast<FakeObject<C, baseclasses...> *>(_instance);\n                delete fake;\n            }\n        }\n\n        void detach() {\n            _isOwner = false;\n            _proxy.detach();\n        }\n\n\n        void getActualInvocations(std::unordered_set<Invocation *> &into) const override {\n            std::vector<ActualInvocationsSource *> vec;\n            _proxy.getMethodMocks(vec);\n            for (ActualInvocationsSource *s : vec) {\n                s->getActualInvocations(into);\n            }\n        }\n\n\t    void initDataMembersIfOwner()\n\t    {\n\t\t    if (_isOwner) {\n\t\t\t    FakeObject<C, baseclasses...> *fake = reinterpret_cast<FakeObject<C, baseclasses...> *>(_instance);\n\t\t\t    fake->initializeDataMembersArea();\n\t\t    }\n\t    }\n\n\t    void reset() {\n            _proxy.Reset();\n\t\t    initDataMembersIfOwner();\n\t    }\n\n\t\tvoid clear()\n        {\n\t\t\tstd::vector<ActualInvocationsContainer *> vec;\n\t\t\t_proxy.getMethodMocks(vec);\n\t\t\tfor (ActualInvocationsContainer *s : vec) {\n\t\t\t\ts->clear();\n\t\t\t}\n\t\t\tinitDataMembersIfOwner();\n        }\n\n        virtual C &get() override {\n            return _proxy.get();\n        }\n\n        virtual FakeitContext &getFakeIt() override {\n            return _fakeit;\n        }\n\n        template<class DATA_TYPE, typename T, typename ... arglist, class = typename std::enable_if<std::is_base_of<T, C>::value>::type>\n        DataMemberStubbingRoot<C, DATA_TYPE> stubDataMember(DATA_TYPE T::*member, const arglist &... ctorargs) {\n            _proxy.stubDataMember(member, ctorargs...);\n            return DataMemberStubbingRoot<T, DATA_TYPE>();\n        }\n\n        template<int id, typename R, typename T, typename ... arglist, class = typename std::enable_if<std::is_base_of<T, C>::value>::type>\n        MockingContext<R, arglist...> stubMethod(R(T::*vMethod)(arglist...)) {\n            return MockingContext<R, arglist...>(new UniqueMethodMockingContextImpl < id, R, arglist... >\n                   (*this, vMethod));\n        }\n\n        DtorMockingContext stubDtor() {\n            return DtorMockingContext(new DtorMockingContextImpl(*this));\n        }\n\n    private:\n        DynamicProxy<C, baseclasses...> _proxy;\n        C *_instance;\n        bool _isOwner;\n        FakeitContext &_fakeit;\n\n        template<typename R, typename ... arglist>\n        class MethodMockingContextBase : public MethodMockingContext<R, arglist...>::Context {\n        protected:\n            MockImpl<C, baseclasses...> &_mock;\n\n            virtual RecordedMethodBody<R, arglist...> &getRecordedMethodBody() = 0;\n\n        public:\n            MethodMockingContextBase(MockImpl<C, baseclasses...> &mock) : _mock(mock) { }\n\n            virtual ~MethodMockingContextBase() = default;\n\n            void addMethodInvocationHandler(typename ActualInvocation<arglist...>::Matcher *matcher,\n                ActualInvocationHandler<R, arglist...> *invocationHandler) {\n                getRecordedMethodBody().addMethodInvocationHandler(matcher, invocationHandler);\n            }\n\n            void scanActualInvocations(const std::function<void(ActualInvocation<arglist...> &)> &scanner) {\n                getRecordedMethodBody().scanActualInvocations(scanner);\n            }\n\n            void setMethodDetails(std::string mockName, std::string methodName) {\n                getRecordedMethodBody().setMethodDetails(mockName, methodName);\n            }\n\n            bool isOfMethod(MethodInfo &method) {\n                return getRecordedMethodBody().isOfMethod(method);\n            }\n\n            ActualInvocationsSource &getInvolvedMock() {\n                return _mock;\n            }\n\n            std::string getMethodName() {\n                return getRecordedMethodBody().getMethod().name();\n            }\n\n        };\n\n        template<typename R, typename ... arglist>\n        class MethodMockingContextImpl : public MethodMockingContextBase<R, arglist...> {\n        protected:\n\n            R (C::*_vMethod)(arglist...);\n\n        public:\n            virtual ~MethodMockingContextImpl() = default;\n\n            MethodMockingContextImpl(MockImpl<C, baseclasses...> &mock, R (C::*vMethod)(arglist...))\n                    : MethodMockingContextBase<R, arglist...>(mock), _vMethod(vMethod) {\n            }\n\n\n            virtual std::function<R(arglist&...)> getOriginalMethod() override {\n                void *mPtr = MethodMockingContextBase<R, arglist...>::_mock.getOriginalMethod(_vMethod);\n                C * instance = &(MethodMockingContextBase<R, arglist...>::_mock.get());\n                return [=](arglist&... args) -> R {\n                    auto m = union_cast<typename VTableMethodType<R,arglist...>::type>(mPtr);\n                    return m(instance, std::forward<arglist>(args)...);\n                };\n            }\n        };\n\n\n        template<int id, typename R, typename ... arglist>\n        class UniqueMethodMockingContextImpl : public MethodMockingContextImpl<R, arglist...> {\n        protected:\n\n            virtual RecordedMethodBody<R, arglist...> &getRecordedMethodBody() override {\n                return MethodMockingContextBase<R, arglist...>::_mock.template stubMethodIfNotStubbed<id>(\n                        MethodMockingContextBase<R, arglist...>::_mock._proxy,\n                        MethodMockingContextImpl<R, arglist...>::_vMethod);\n            }\n\n        public:\n\n            UniqueMethodMockingContextImpl(MockImpl<C, baseclasses...> &mock, R (C::*vMethod)(arglist...))\n                    : MethodMockingContextImpl<R, arglist...>(mock, vMethod) {\n            }\n        };\n\n        class DtorMockingContextImpl : public MethodMockingContextBase<void> {\n\n        protected:\n\n            virtual RecordedMethodBody<void> &getRecordedMethodBody() override {\n                return MethodMockingContextBase<void>::_mock.stubDtorIfNotStubbed(\n                        MethodMockingContextBase<void>::_mock._proxy);\n            }\n\n        public:\n            virtual ~DtorMockingContextImpl() = default;\n\n            DtorMockingContextImpl(MockImpl<C, baseclasses...> &mock)\n                    : MethodMockingContextBase<void>(mock) {\n            }\n\n            virtual std::function<void()> getOriginalMethod() override {\n                C &instance = MethodMockingContextBase<void>::_mock.get();\n                return [=, &instance]() -> void {\n                };\n            }\n\n        };\n\n        static MockImpl<C, baseclasses...> *getMockImpl(void *instance) {\n            FakeObject<C, baseclasses...> *fake = reinterpret_cast<FakeObject<C, baseclasses...> *>(instance);\n            MockImpl<C, baseclasses...> *mock = reinterpret_cast<MockImpl<C, baseclasses...> *>(fake->getVirtualTable().getCookie(\n                    1));\n            return mock;\n        }\n\n        void unmocked() {\n            ActualInvocation<> invocation(Invocation::nextInvocationOrdinal(), UnknownMethod::instance());\n            UnexpectedMethodCallEvent event(UnexpectedType::Unmocked, invocation);\n            auto &fakeit = getMockImpl(this)->_fakeit;\n            fakeit.handle(event);\n\n            std::string format = fakeit.format(event);\n            UnexpectedMethodCallException e(format);\n            throw e;\n        }\n\n        static C *createFakeInstance() {\n            FakeObject<C, baseclasses...> *fake = new FakeObject<C, baseclasses...>();\n            void *unmockedMethodStubPtr = union_cast<void *>(&MockImpl<C, baseclasses...>::unmocked);\n            fake->getVirtualTable().initAll(unmockedMethodStubPtr);\n            return reinterpret_cast<C *>(fake);\n        }\n\n        template<typename R, typename ... arglist>\n        void *getOriginalMethod(R (C::*vMethod)(arglist...)) {\n            auto vt = _proxy.getOriginalVT();\n            auto offset = VTUtils::getOffset(vMethod);\n            void *origMethodPtr = vt.getMethod(offset);\n            return origMethodPtr;\n        }\n\n        void *getOriginalDtor() {\n            auto vt = _proxy.getOriginalVT();\n            auto offset = VTUtils::getDestructorOffset<C>();\n            void *origMethodPtr = vt.getMethod(offset);\n            return origMethodPtr;\n        }\n\n        template<unsigned int id, typename R, typename ... arglist>\n        RecordedMethodBody<R, arglist...> &stubMethodIfNotStubbed(DynamicProxy<C, baseclasses...> &proxy,\n                                                                  R (C::*vMethod)(arglist...)) {\n            if (!proxy.isMethodStubbed(vMethod)) {\n                proxy.template stubMethod<id>(vMethod, createRecordedMethodBody < R, arglist... > (*this, vMethod));\n            }\n            Destructible *d = proxy.getMethodMock(vMethod);\n            RecordedMethodBody<R, arglist...> *methodMock = dynamic_cast<RecordedMethodBody<R, arglist...> *>(d);\n            return *methodMock;\n        }\n\n        RecordedMethodBody<void> &stubDtorIfNotStubbed(DynamicProxy<C, baseclasses...> &proxy) {\n            if (!proxy.isDtorStubbed()) {\n                proxy.stubDtor(createRecordedDtorBody(*this));\n            }\n            Destructible *d = proxy.getDtorMock();\n            RecordedMethodBody<void> *dtorMock = dynamic_cast<RecordedMethodBody<void> *>(d);\n            return *dtorMock;\n        }\n\n        MockImpl(FakeitContext &fakeit, C &obj, bool isSpy)\n                : _proxy{obj}, _instance(&obj), _isOwner(!isSpy), _fakeit(fakeit) {\n        }\n\n        template<typename R, typename ... arglist>\n        static RecordedMethodBody<R, arglist...> *createRecordedMethodBody(MockObject<C> &mock,\n                                                                           R(C::*vMethod)(arglist...)) {\n            return new RecordedMethodBody<R, arglist...>(mock.getFakeIt(), typeid(vMethod).name());\n        }\n\n        static RecordedMethodBody<void> *createRecordedDtorBody(MockObject<C> &mock) {\n            return new RecordedMethodBody<void>(mock.getFakeIt(), \"dtor\");\n        }\n\n    };\n}\nnamespace fakeit {\n\n    template<typename R, typename... Args>\n    struct Prototype;\n\n    template<typename R, typename... Args>\n    struct Prototype<R(Args...)> {\n\n        typedef R Type(Args...);\n\n        typedef R ConstType(Args...) const;\n\n        template<class C>\n        struct MemberType {\n\n            typedef Type(C::*type);\n            typedef ConstType(C::*cosntType);\n\n            static type get(type t) {\n                return t;\n            }\n\n            static cosntType getconst(cosntType t) {\n                return t;\n            }\n\n        };\n\n    };\n\n    template<int X, typename R, typename C, typename... arglist>\n    struct UniqueMethod {\n        R (C::*method)(arglist...);\n\n        UniqueMethod(R (C::*vMethod)(arglist...)) : method(vMethod) { }\n\n        int uniqueId() {\n            return X;\n        }\n\n\n\n\n    };\n\n}\n\n\nnamespace fakeit {\n    namespace internal {\n    }\n    using namespace fakeit;\n    using namespace fakeit::internal;\n\n    template<typename C, typename ... baseclasses>\n    class Mock : public ActualInvocationsSource {\n        MockImpl<C, baseclasses...> impl;\n    public:\n        virtual ~Mock() = default;\n\n        static_assert(std::is_polymorphic<C>::value, \"Can only mock a polymorphic type\");\n\n        Mock() : impl(Fakeit) {\n        }\n\n        explicit Mock(C &obj) : impl(Fakeit, obj) {\n        }\n\n        virtual C &get() {\n            return impl.get();\n        }\n\n        C &operator()() {\n            return get();\n        }\n\n        void Reset() {\n            impl.reset();\n        }\n\n\t\tvoid ClearInvocationHistory() {\n\t\t\timpl.clear();\n\t\t}\n\n        template<class DATA_TYPE, typename ... arglist,\n                class = typename std::enable_if<std::is_member_object_pointer<DATA_TYPE C::*>::value>::type>\n        DataMemberStubbingRoot<C, DATA_TYPE> Stub(DATA_TYPE C::* member, const arglist &... ctorargs) {\n            return impl.stubDataMember(member, ctorargs...);\n        }\n\n        template<int id, typename R, typename T, typename ... arglist, class = typename std::enable_if<\n                !std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<R, arglist...> stub(R (T::*vMethod)(arglist...) const) {\n            auto methodWithoutConstVolatile = reinterpret_cast<R (T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                !std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<R, arglist...> stub(R(T::*vMethod)(arglist...) volatile) {\n            auto methodWithoutConstVolatile = reinterpret_cast<R(T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                !std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<R, arglist...> stub(R(T::*vMethod)(arglist...) const volatile) {\n            auto methodWithoutConstVolatile = reinterpret_cast<R(T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                !std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<R, arglist...> stub(R(T::*vMethod)(arglist...)) {\n            return impl.template stubMethod<id>(vMethod);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<void, arglist...> stub(R(T::*vMethod)(arglist...) const) {\n            auto methodWithoutConstVolatile = reinterpret_cast<void (T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<void, arglist...> stub(R(T::*vMethod)(arglist...) volatile) {\n            auto methodWithoutConstVolatile = reinterpret_cast<void (T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<void, arglist...> stub(R(T::*vMethod)(arglist...) const volatile) {\n            auto methodWithoutConstVolatile = reinterpret_cast<void (T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        template<int id, typename R, typename T, typename... arglist, class = typename std::enable_if<\n                std::is_void<R>::value && std::is_base_of<T, C>::value>::type>\n        MockingContext<void, arglist...> stub(R(T::*vMethod)(arglist...)) {\n            auto methodWithoutConstVolatile = reinterpret_cast<void (T::*)(arglist...)>(vMethod);\n            return impl.template stubMethod<id>(methodWithoutConstVolatile);\n        }\n\n        DtorMockingContext dtor() {\n            return impl.stubDtor();\n        }\n\n        void getActualInvocations(std::unordered_set<Invocation *> &into) const override {\n            impl.getActualInvocations(into);\n        }\n\n    };\n\n}\n\n#include <exception>\n\nnamespace fakeit {\n\n    class RefCount {\n    private:\n        int count;\n\n    public:\n        void AddRef() {\n            count++;\n        }\n\n        int Release() {\n            return --count;\n        }\n    };\n\n    template<typename T>\n    class smart_ptr {\n    private:\n        T *pData;\n        RefCount *reference;\n\n    public:\n        smart_ptr() : pData(0), reference(0) {\n            reference = new RefCount();\n            reference->AddRef();\n        }\n\n        smart_ptr(T *pValue) : pData(pValue), reference(0) {\n            reference = new RefCount();\n            reference->AddRef();\n        }\n\n        smart_ptr(const smart_ptr<T> &sp) : pData(sp.pData), reference(sp.reference) {\n            reference->AddRef();\n        }\n\n        ~smart_ptr() THROWS {\n            if (reference->Release() == 0) {\n                delete reference;\n                delete pData;\n            }\n        }\n\n        T &operator*() {\n            return *pData;\n        }\n\n        T *operator->() {\n            return pData;\n        }\n\n        smart_ptr<T> &operator=(const smart_ptr<T> &sp) {\n            if (this != &sp) {\n\n\n                if (reference->Release() == 0) {\n                    delete reference;\n                    delete pData;\n                }\n\n\n\n                pData = sp.pData;\n                reference = sp.reference;\n                reference->AddRef();\n            }\n            return *this;\n        }\n    };\n\n}\n\nnamespace fakeit {\n\n    class WhenFunctor {\n\n        struct StubbingChange {\n\n            friend class WhenFunctor;\n\n            virtual ~StubbingChange() THROWS {\n\n                if (std::uncaught_exception()) {\n                    return;\n                }\n\n                _xaction.commit();\n            }\n\n            StubbingChange(StubbingChange &other) :\n                    _xaction(other._xaction) {\n            }\n\n        private:\n\n            StubbingChange(Xaction &xaction)\n                    : _xaction(xaction) {\n            }\n\n            Xaction &_xaction;\n        };\n\n    public:\n\n        template<typename R, typename ... arglist>\n        struct MethodProgress : MethodStubbingProgress<R, arglist...> {\n\n            friend class WhenFunctor;\n\n            virtual ~MethodProgress() override = default;\n\n            MethodProgress(MethodProgress &other) :\n                    _progress(other._progress), _context(other._context) {\n            }\n\n            MethodProgress(StubbingContext<R, arglist...> &xaction) :\n                    _progress(new StubbingChange(xaction)), _context(xaction) {\n            }\n\n        protected:\n\n            virtual MethodStubbingProgress<R, arglist...> &DoImpl(Action<R, arglist...> *action) override {\n                _context.appendAction(action);\n                return *this;\n            }\n\n        private:\n            smart_ptr<StubbingChange> _progress;\n            StubbingContext<R, arglist...> &_context;\n        };\n\n\n        WhenFunctor() {\n        }\n\n        template<typename R, typename ... arglist>\n        MethodProgress<R, arglist...> operator()(const StubbingContext<R, arglist...> &stubbingContext) {\n            StubbingContext<R, arglist...> &rootWithoutConst = const_cast<StubbingContext<R, arglist...> &>(stubbingContext);\n            MethodProgress<R, arglist...> progress(rootWithoutConst);\n            return progress;\n        }\n\n    };\n\n}\nnamespace fakeit {\n\n    class FakeFunctor {\n    private:\n        template<typename R, typename ... arglist>\n        void fake(const StubbingContext<R, arglist...> &root) {\n            StubbingContext<R, arglist...> &rootWithoutConst = const_cast<StubbingContext<R, arglist...> &>(root);\n            rootWithoutConst.appendAction(new ReturnDefaultValue<R, arglist...>());\n            rootWithoutConst.commit();\n        }\n\n        void operator()() {\n        }\n\n    public:\n\n        template<typename H, typename ... M>\n        void operator()(const H &head, const M &... tail) {\n            fake(head);\n            this->operator()(tail...);\n        }\n\n    };\n\n}\n#include <set>\n#include <set>\n\n\nnamespace fakeit {\n\n    struct InvocationUtils {\n\n        static void sortByInvocationOrder(std::unordered_set<Invocation *> &ivocations,\n                                          std::vector<Invocation *> &result) {\n            auto comparator = [](Invocation *a, Invocation *b) -> bool {\n                return a->getOrdinal() < b->getOrdinal();\n            };\n            std::set<Invocation *, bool (*)(Invocation *a, Invocation *b)> sortedIvocations(comparator);\n            for (auto i : ivocations)\n                sortedIvocations.insert(i);\n\n            for (auto i : sortedIvocations)\n                result.push_back(i);\n        }\n\n        static void collectActualInvocations(std::unordered_set<Invocation *> &actualInvocations,\n                                             std::vector<ActualInvocationsSource *> &invocationSources) {\n            for (auto source : invocationSources) {\n                source->getActualInvocations(actualInvocations);\n            }\n        }\n\n        static void selectNonVerifiedInvocations(std::unordered_set<Invocation *> &actualInvocations,\n                                                 std::unordered_set<Invocation *> &into) {\n            for (auto invocation : actualInvocations) {\n                if (!invocation->isVerified()) {\n                    into.insert(invocation);\n                }\n            }\n        }\n\n        static void collectInvocationSources(std::vector<ActualInvocationsSource *> &) {\n        }\n\n        template<typename ... list>\n        static void collectInvocationSources(std::vector<ActualInvocationsSource *> &into,\n                                             const ActualInvocationsSource &mock,\n                                             const list &... tail) {\n            into.push_back(const_cast<ActualInvocationsSource *>(&mock));\n            collectInvocationSources(into, tail...);\n        }\n\n        static void collectSequences(std::vector<Sequence *> &) {\n        }\n\n        template<typename ... list>\n        static void collectSequences(std::vector<Sequence *> &vec, const Sequence &sequence, const list &... tail) {\n            vec.push_back(&const_cast<Sequence &>(sequence));\n            collectSequences(vec, tail...);\n        }\n\n        static void collectInvolvedMocks(std::vector<Sequence *> &allSequences,\n                                         std::vector<ActualInvocationsSource *> &involvedMocks) {\n            for (auto sequence : allSequences) {\n                sequence->getInvolvedMocks(involvedMocks);\n            }\n        }\n\n        template<class T>\n        static T &remove_const(const T &s) {\n            return const_cast<T &>(s);\n        }\n\n    };\n\n}\n\n#include <memory>\n\n#include <vector>\n#include <unordered_set>\n\nnamespace fakeit {\n    struct MatchAnalysis {\n        std::vector<Invocation *> actualSequence;\n        std::vector<Invocation *> matchedInvocations;\n        int count;\n\n        void run(InvocationsSourceProxy &involvedInvocationSources, std::vector<Sequence *> &expectedPattern) {\n            getActualInvocationSequence(involvedInvocationSources, actualSequence);\n            count = countMatches(expectedPattern, actualSequence, matchedInvocations);\n        }\n\n    private:\n        static void getActualInvocationSequence(InvocationsSourceProxy &involvedMocks,\n                                                std::vector<Invocation *> &actualSequence) {\n            std::unordered_set<Invocation *> actualInvocations;\n            collectActualInvocations(involvedMocks, actualInvocations);\n            InvocationUtils::sortByInvocationOrder(actualInvocations, actualSequence);\n        }\n\n        static int countMatches(std::vector<Sequence *> &pattern, std::vector<Invocation *> &actualSequence,\n                                std::vector<Invocation *> &matchedInvocations) {\n            int end = -1;\n            int count = 0;\n            int startSearchIndex = 0;\n            while (findNextMatch(pattern, actualSequence, startSearchIndex, end, matchedInvocations)) {\n                count++;\n                startSearchIndex = end;\n            }\n            return count;\n        }\n\n        static void collectActualInvocations(InvocationsSourceProxy &involvedMocks,\n                                             std::unordered_set<Invocation *> &actualInvocations) {\n            involvedMocks.getActualInvocations(actualInvocations);\n        }\n\n        static bool findNextMatch(std::vector<Sequence *> &pattern, std::vector<Invocation *> &actualSequence,\n                                  int startSearchIndex, int &end,\n                                  std::vector<Invocation *> &matchedInvocations) {\n            for (auto sequence : pattern) {\n                int index = findNextMatch(sequence, actualSequence, startSearchIndex);\n                if (index == -1) {\n                    return false;\n                }\n                collectMatchedInvocations(actualSequence, matchedInvocations, index, sequence->size());\n                startSearchIndex = index + sequence->size();\n            }\n            end = startSearchIndex;\n            return true;\n        }\n\n\n        static void collectMatchedInvocations(std::vector<Invocation *> &actualSequence,\n                                              std::vector<Invocation *> &matchedInvocations, int start,\n                                              int length) {\n            int indexAfterMatchedPattern = start + length;\n            for (; start < indexAfterMatchedPattern; start++) {\n                matchedInvocations.push_back(actualSequence[start]);\n            }\n        }\n\n\n        static bool isMatch(std::vector<Invocation *> &actualSequence,\n                            std::vector<Invocation::Matcher *> &expectedSequence, int start) {\n            bool found = true;\n            for (unsigned int j = 0; found && j < expectedSequence.size(); j++) {\n                Invocation *actual = actualSequence[start + j];\n                Invocation::Matcher *expected = expectedSequence[j];\n                found = found && expected->matches(*actual);\n            }\n            return found;\n        }\n\n        static int findNextMatch(Sequence *&pattern, std::vector<Invocation *> &actualSequence, int startSearchIndex) {\n            std::vector<Invocation::Matcher *> expectedSequence;\n            pattern->getExpectedSequence(expectedSequence);\n            for (int i = startSearchIndex; i < ((int) actualSequence.size() - (int) expectedSequence.size() + 1); i++) {\n                if (isMatch(actualSequence, expectedSequence, i)) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n    };\n}\n\nnamespace fakeit {\n\n    struct SequenceVerificationExpectation {\n\n        friend class SequenceVerificationProgress;\n\n        ~SequenceVerificationExpectation() THROWS {\n            if (std::uncaught_exception()) {\n                return;\n            }\n            VerifyExpectation(_fakeit);\n        }\n\n        void setExpectedPattern(std::vector<Sequence *> expectedPattern) {\n            _expectedPattern = expectedPattern;\n        }\n\n        void setExpectedCount(const int count) {\n            _expectedCount = count;\n        }\n\n        void setFileInfo(const char * file, int line, const char * callingMethod) {\n            _file = file;\n            _line = line;\n            _testMethod = callingMethod;\n        }\n\n    private:\n\n        VerificationEventHandler &_fakeit;\n        InvocationsSourceProxy _involvedInvocationSources;\n        std::vector<Sequence *> _expectedPattern;\n        int _expectedCount;\n\n        const char * _file;\n        int _line;\n\t\tconst char * _testMethod;\n        bool _isVerified;\n\n        SequenceVerificationExpectation(\n                VerificationEventHandler &fakeit,\n                InvocationsSourceProxy mocks,\n                std::vector<Sequence *> &expectedPattern) :\n                _fakeit(fakeit),\n                _involvedInvocationSources(mocks),\n                _expectedPattern(expectedPattern),\n                _expectedCount(-1),\n                _line(0),\n                _isVerified(false) {\n        }\n\n\n        void VerifyExpectation(VerificationEventHandler &verificationErrorHandler) {\n            if (_isVerified)\n                return;\n            _isVerified = true;\n\n            MatchAnalysis ma;\n            ma.run(_involvedInvocationSources, _expectedPattern);\n\n            if (isAtLeastVerification() && atLeastLimitNotReached(ma.count)) {\n                return handleAtLeastVerificationEvent(verificationErrorHandler, ma.actualSequence, ma.count);\n            }\n\n            if (isExactVerification() && exactLimitNotMatched(ma.count)) {\n                return handleExactVerificationEvent(verificationErrorHandler, ma.actualSequence, ma.count);\n            }\n\n            markAsVerified(ma.matchedInvocations);\n        }\n\n        std::vector<Sequence *> &collectSequences(std::vector<Sequence *> &vec) {\n            return vec;\n        }\n\n        template<typename ... list>\n        std::vector<Sequence *> &collectSequences(std::vector<Sequence *> &vec, const Sequence &sequence,\n                                                  const list &... tail) {\n            vec.push_back(&const_cast<Sequence &>(sequence));\n            return collectSequences(vec, tail...);\n        }\n\n\n        static void markAsVerified(std::vector<Invocation *> &matchedInvocations) {\n            for (auto i : matchedInvocations) {\n                i->markAsVerified();\n            }\n        }\n\n        bool isAtLeastVerification() {\n\n            return _expectedCount < 0;\n        }\n\n        bool isExactVerification() {\n            return !isAtLeastVerification();\n        }\n\n        bool atLeastLimitNotReached(int count) {\n            return count < -_expectedCount;\n        }\n\n        bool exactLimitNotMatched(int count) {\n            return count != _expectedCount;\n        }\n\n        void handleExactVerificationEvent(VerificationEventHandler &verificationErrorHandler,\n                                          std::vector<Invocation *> actualSequence, int count) {\n            SequenceVerificationEvent evt(VerificationType::Exact, _expectedPattern, actualSequence, _expectedCount,\n                                          count);\n            evt.setFileInfo(_file, _line, _testMethod);\n            return verificationErrorHandler.handle(evt);\n        }\n\n        void handleAtLeastVerificationEvent(VerificationEventHandler &verificationErrorHandler,\n                                            std::vector<Invocation *> actualSequence, int count) {\n            SequenceVerificationEvent evt(VerificationType::AtLeast, _expectedPattern, actualSequence, -_expectedCount,\n                                          count);\n            evt.setFileInfo(_file, _line, _testMethod);\n            return verificationErrorHandler.handle(evt);\n        }\n\n    };\n\n}\nnamespace fakeit {\n    class ThrowFalseEventHandler : public VerificationEventHandler {\n\n        void handle(const SequenceVerificationEvent &) override {\n            throw false;\n        }\n\n        void handle(const NoMoreInvocationsVerificationEvent &) override {\n            throw false;\n        }\n    };\n}\n#include <string>\n#include <sstream>\n#include <iomanip>\n\nnamespace fakeit {\n\n    template<typename T>\n    static std::string to_string(const T &n) {\n        std::ostringstream stm;\n        stm << n;\n        return stm.str();\n    }\n\n}\n\n\nnamespace fakeit {\n\n    struct FakeitContext;\n\n    class SequenceVerificationProgress {\n\n        friend class UsingFunctor;\n\n        friend class VerifyFunctor;\n\n        friend class UsingProgress;\n\n        smart_ptr<SequenceVerificationExpectation> _expectationPtr;\n\n        SequenceVerificationProgress(SequenceVerificationExpectation *ptr) : _expectationPtr(ptr) {\n        }\n\n        SequenceVerificationProgress(\n                FakeitContext &fakeit,\n                InvocationsSourceProxy sources,\n                std::vector<Sequence *> &allSequences) :\n                SequenceVerificationProgress(new SequenceVerificationExpectation(fakeit, sources, allSequences)) {\n        }\n\n        virtual void verifyInvocations(const int times) {\n            _expectationPtr->setExpectedCount(times);\n        }\n\n        class Terminator {\n            smart_ptr<SequenceVerificationExpectation> _expectationPtr;\n\n            bool toBool() {\n                try {\n                    ThrowFalseEventHandler eh;\n                    _expectationPtr->VerifyExpectation(eh);\n                    return true;\n                }\n                catch (bool e) {\n                    return e;\n                }\n            }\n\n        public:\n            Terminator(smart_ptr<SequenceVerificationExpectation> expectationPtr) : _expectationPtr(expectationPtr) { };\n\n            operator bool() {\n                return toBool();\n            }\n\n            bool operator!() const { return !const_cast<Terminator *>(this)->toBool(); }\n        };\n\n    public:\n\n        ~SequenceVerificationProgress() THROWS { };\n\n        operator bool() {\n            return Terminator(_expectationPtr);\n        }\n\n        bool operator!() const { return !Terminator(_expectationPtr); }\n\n        Terminator Never() {\n            Exactly(0);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator Once() {\n            Exactly(1);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator Twice() {\n            Exactly(2);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator AtLeastOnce() {\n            verifyInvocations(-1);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator Exactly(const int times) {\n            if (times < 0) {\n                throw std::invalid_argument(std::string(\"bad argument times:\").append(fakeit::to_string(times)));\n            }\n            verifyInvocations(times);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator Exactly(const Quantity &q) {\n            Exactly(q.quantity);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator AtLeast(const int times) {\n            if (times < 0) {\n                throw std::invalid_argument(std::string(\"bad argument times:\").append(fakeit::to_string(times)));\n            }\n            verifyInvocations(-times);\n            return Terminator(_expectationPtr);\n        }\n\n        Terminator AtLeast(const Quantity &q) {\n            AtLeast(q.quantity);\n            return Terminator(_expectationPtr);\n        }\n\n        SequenceVerificationProgress setFileInfo(const char * file, int line, const char * callingMethod) {\n            _expectationPtr->setFileInfo(file, line, callingMethod);\n            return *this;\n        }\n    };\n}\n\nnamespace fakeit {\n\n    class UsingProgress {\n        fakeit::FakeitContext &_fakeit;\n        InvocationsSourceProxy _sources;\n\n        void collectSequences(std::vector<fakeit::Sequence *> &) {\n        }\n\n        template<typename ... list>\n        void collectSequences(std::vector<fakeit::Sequence *> &vec, const fakeit::Sequence &sequence,\n                              const list &... tail) {\n            vec.push_back(&const_cast<fakeit::Sequence &>(sequence));\n            collectSequences(vec, tail...);\n        }\n\n    public:\n\n        UsingProgress(fakeit::FakeitContext &fakeit, InvocationsSourceProxy source) :\n                _fakeit(fakeit),\n                _sources(source) {\n        }\n\n        template<typename ... list>\n        SequenceVerificationProgress Verify(const fakeit::Sequence &sequence, const list &... tail) {\n            std::vector<fakeit::Sequence *> allSequences;\n            collectSequences(allSequences, sequence, tail...);\n            SequenceVerificationProgress progress(_fakeit, _sources, allSequences);\n            return progress;\n        }\n\n    };\n}\n\nnamespace fakeit {\n\n    class UsingFunctor {\n\n        friend class VerifyFunctor;\n\n        FakeitContext &_fakeit;\n\n    public:\n\n        UsingFunctor(FakeitContext &fakeit) : _fakeit(fakeit) {\n        }\n\n        template<typename ... list>\n        UsingProgress operator()(const ActualInvocationsSource &head, const list &... tail) {\n            std::vector<ActualInvocationsSource *> allMocks{&InvocationUtils::remove_const(head),\n                                                            &InvocationUtils::remove_const(tail)...};\n            InvocationsSourceProxy aggregateInvocationsSource{new AggregateInvocationsSource(allMocks)};\n            UsingProgress progress(_fakeit, aggregateInvocationsSource);\n            return progress;\n        }\n\n    };\n}\n#include <set>\n\nnamespace fakeit {\n\n    class VerifyFunctor {\n\n        FakeitContext &_fakeit;\n\n\n    public:\n\n        VerifyFunctor(FakeitContext &fakeit) : _fakeit(fakeit) {\n        }\n\n        template<typename ... list>\n        SequenceVerificationProgress operator()(const Sequence &sequence, const list &... tail) {\n            std::vector<Sequence *> allSequences{&InvocationUtils::remove_const(sequence),\n                                                 &InvocationUtils::remove_const(tail)...};\n\n            std::vector<ActualInvocationsSource *> involvedSources;\n            InvocationUtils::collectInvolvedMocks(allSequences, involvedSources);\n            InvocationsSourceProxy aggregateInvocationsSource{new AggregateInvocationsSource(involvedSources)};\n\n            UsingProgress usingProgress(_fakeit, aggregateInvocationsSource);\n            return usingProgress.Verify(sequence, tail...);\n        }\n\n    };\n\n}\n#include <set>\n#include <memory>\nnamespace fakeit {\n\n    class VerifyNoOtherInvocationsVerificationProgress {\n\n        friend class VerifyNoOtherInvocationsFunctor;\n\n        struct VerifyNoOtherInvocationsExpectation {\n\n            friend class VerifyNoOtherInvocationsVerificationProgress;\n\n            ~VerifyNoOtherInvocationsExpectation() THROWS {\n                if (std::uncaught_exception()) {\n                    return;\n                }\n\n                VerifyExpectation(_fakeit);\n            }\n\n            void setFileInfo(const char * file, int line, const char * callingMethod) {\n                _file = file;\n                _line = line;\n                _callingMethod = callingMethod;\n            }\n\n        private:\n\n            VerificationEventHandler &_fakeit;\n            std::vector<ActualInvocationsSource *> _mocks;\n\n\t\t\tconst char * _file;\n            int _line;\n\t\t\tconst char * _callingMethod;\n            bool _isVerified;\n\n            VerifyNoOtherInvocationsExpectation(VerificationEventHandler &fakeit,\n                                                std::vector<ActualInvocationsSource *> mocks) :\n                    _fakeit(fakeit),\n                    _mocks(mocks),\n                    _line(0),\n                    _isVerified(false) {\n            }\n\n            VerifyNoOtherInvocationsExpectation(VerifyNoOtherInvocationsExpectation &other) = default;\n\n            void VerifyExpectation(VerificationEventHandler &verificationErrorHandler) {\n                if (_isVerified)\n                    return;\n                _isVerified = true;\n\n                std::unordered_set<Invocation *> actualInvocations;\n                InvocationUtils::collectActualInvocations(actualInvocations, _mocks);\n\n                std::unordered_set<Invocation *> nonVerifiedInvocations;\n                InvocationUtils::selectNonVerifiedInvocations(actualInvocations, nonVerifiedInvocations);\n\n                if (nonVerifiedInvocations.size() > 0) {\n                    std::vector<Invocation *> sortedNonVerifiedInvocations;\n                    InvocationUtils::sortByInvocationOrder(nonVerifiedInvocations, sortedNonVerifiedInvocations);\n\n                    std::vector<Invocation *> sortedActualInvocations;\n                    InvocationUtils::sortByInvocationOrder(actualInvocations, sortedActualInvocations);\n\n                    NoMoreInvocationsVerificationEvent evt(sortedActualInvocations, sortedNonVerifiedInvocations);\n                    evt.setFileInfo(_file, _line, _callingMethod);\n                    return verificationErrorHandler.handle(evt);\n                }\n            }\n\n        };\n\n        fakeit::smart_ptr<VerifyNoOtherInvocationsExpectation> _ptr;\n\n        VerifyNoOtherInvocationsVerificationProgress(VerifyNoOtherInvocationsExpectation *ptr) :\n                _ptr(ptr) {\n        }\n\n        VerifyNoOtherInvocationsVerificationProgress(FakeitContext &fakeit,\n                                                     std::vector<ActualInvocationsSource *> &invocationSources)\n                : VerifyNoOtherInvocationsVerificationProgress(\n                new VerifyNoOtherInvocationsExpectation(fakeit, invocationSources)\n        ) {\n        }\n\n        bool toBool() {\n            try {\n                ThrowFalseEventHandler ev;\n                _ptr->VerifyExpectation(ev);\n                return true;\n            }\n            catch (bool e) {\n                return e;\n            }\n        }\n\n    public:\n\n\n        ~VerifyNoOtherInvocationsVerificationProgress() THROWS {\n        };\n\n        VerifyNoOtherInvocationsVerificationProgress setFileInfo(const char * file, int line,\n\t\t\tconst char * callingMethod) {\n            _ptr->setFileInfo(file, line, callingMethod);\n            return *this;\n        }\n\n        operator bool() {\n            return toBool();\n        }\n\n        bool operator!() const { return !const_cast<VerifyNoOtherInvocationsVerificationProgress *>(this)->toBool(); }\n\n    };\n\n}\n\n\nnamespace fakeit {\n    class VerifyNoOtherInvocationsFunctor {\n\n        FakeitContext &_fakeit;\n\n    public:\n\n        VerifyNoOtherInvocationsFunctor(FakeitContext &fakeit) : _fakeit(fakeit) {\n        }\n\n        void operator()() {\n        }\n\n        template<typename ... list>\n        VerifyNoOtherInvocationsVerificationProgress operator()(const ActualInvocationsSource &head,\n                                                                const list &... tail) {\n            std::vector<ActualInvocationsSource *> invocationSources{&InvocationUtils::remove_const(head),\n                                                                     &InvocationUtils::remove_const(tail)...};\n            VerifyNoOtherInvocationsVerificationProgress progress{_fakeit, invocationSources};\n            return progress;\n        }\n    };\n\n}\nnamespace fakeit {\n\n    class SpyFunctor {\n    private:\n\n        template<typename R, typename ... arglist>\n        void spy(const SpyingContext<R, arglist...> &root) {\n            SpyingContext<R, arglist...> &rootWithoutConst = const_cast<SpyingContext<R, arglist...> &>(root);\n            auto methodFromOriginalVT = rootWithoutConst.getOriginalMethod();\n            rootWithoutConst.appendAction(new ReturnDelegateValue<R, arglist...>(methodFromOriginalVT));\n            rootWithoutConst.commit();\n        }\n\n        void operator()() {\n        }\n\n    public:\n\n        template<typename H, typename ... M>\n        void operator()(const H &head, const M &... tail) {\n            spy(head);\n            this->operator()(tail...);\n        }\n\n    };\n\n}\n\n#include <vector>\n#include <set>\n\nnamespace fakeit {\n    class VerifyUnverifiedFunctor {\n\n        FakeitContext &_fakeit;\n\n    public:\n\n        VerifyUnverifiedFunctor(FakeitContext &fakeit) : _fakeit(fakeit) {\n        }\n\n        template<typename ... list>\n        SequenceVerificationProgress operator()(const Sequence &sequence, const list &... tail) {\n            std::vector<Sequence *> allSequences{&InvocationUtils::remove_const(sequence),\n                                                 &InvocationUtils::remove_const(tail)...};\n\n            std::vector<ActualInvocationsSource *> involvedSources;\n            InvocationUtils::collectInvolvedMocks(allSequences, involvedSources);\n\n            InvocationsSourceProxy aggregateInvocationsSource{new AggregateInvocationsSource(involvedSources)};\n            InvocationsSourceProxy unverifiedInvocationsSource{\n                    new UnverifiedInvocationsSource(aggregateInvocationsSource)};\n\n            UsingProgress usingProgress(_fakeit, unverifiedInvocationsSource);\n            return usingProgress.Verify(sequence, tail...);\n        }\n\n    };\n\n    class UnverifiedFunctor {\n    public:\n        UnverifiedFunctor(FakeitContext &fakeit) : Verify(fakeit) {\n        }\n\n        VerifyUnverifiedFunctor Verify;\n\n        template<typename ... list>\n        UnverifiedInvocationsSource operator()(const ActualInvocationsSource &head, const list &... tail) {\n            std::vector<ActualInvocationsSource *> allMocks{&InvocationUtils::remove_const(head),\n                                                            &InvocationUtils::remove_const(tail)...};\n            InvocationsSourceProxy aggregateInvocationsSource{new AggregateInvocationsSource(allMocks)};\n            UnverifiedInvocationsSource unverifiedInvocationsSource{aggregateInvocationsSource};\n            return unverifiedInvocationsSource;\n        }\n\n\n\n\n\n\n\n\n\n\n\n\n\n    };\n}\n\nnamespace fakeit {\n\n    static UsingFunctor Using(Fakeit);\n    static VerifyFunctor Verify(Fakeit);\n    static VerifyNoOtherInvocationsFunctor VerifyNoOtherInvocations(Fakeit);\n    static UnverifiedFunctor Unverified(Fakeit);\n    static SpyFunctor Spy;\n    static FakeFunctor Fake;\n    static WhenFunctor When;\n\n    template<class T>\n    class SilenceUnusedVariableWarnings {\n\n        void use(void *) {\n        }\n\n        SilenceUnusedVariableWarnings() {\n            use(&Fake);\n            use(&When);\n            use(&Spy);\n            use(&Using);\n            use(&Verify);\n            use(&VerifyNoOtherInvocations);\n            use(&_);\n        }\n    };\n\n}\n#ifdef _MSC_VER\n#define __func__ __FUNCTION__\n#endif\n\n#define MOCK_TYPE(mock) \\\n    std::remove_reference<decltype(mock.get())>::type\n\n#define OVERLOADED_METHOD_PTR(mock, method, prototype) \\\n    fakeit::Prototype<prototype>::MemberType<MOCK_TYPE(mock)>::get(&MOCK_TYPE(mock)::method)\n\n#define CONST_OVERLOADED_METHOD_PTR(mock, method, prototype) \\\n    fakeit::Prototype<prototype>::MemberType<MOCK_TYPE(mock)>::getconst(&MOCK_TYPE(mock)::method)\n\n#define Dtor(mock) \\\n    mock.dtor().setMethodDetails(#mock,\"destructor\")\n\n#define Method(mock, method) \\\n    mock.template stub<__COUNTER__>(&MOCK_TYPE(mock)::method).setMethodDetails(#mock,#method)\n\n#define OverloadedMethod(mock, method, prototype) \\\n    mock.template stub<__COUNTER__>(OVERLOADED_METHOD_PTR( mock , method, prototype )).setMethodDetails(#mock,#method)\n\n#define ConstOverloadedMethod(mock, method, prototype) \\\n    mock.template stub<__COUNTER__>(CONST_OVERLOADED_METHOD_PTR( mock , method, prototype )).setMethodDetails(#mock,#method)\n\n#define Verify(...) \\\n        Verify( __VA_ARGS__ ).setFileInfo(__FILE__, __LINE__, __func__)\n\n#define Using(...) \\\n        Using( __VA_ARGS__ )\n\n#define VerifyNoOtherInvocations(...) \\\n    VerifyNoOtherInvocations( __VA_ARGS__ ).setFileInfo(__FILE__, __LINE__, __func__)\n\n#define Fake(...) \\\n    Fake( __VA_ARGS__ )\n\n#define When(call) \\\n    When(call)\n\n\n#endif\n"
  },
  {
    "path": "ci/.gitattributes",
    "content": "*.sh test eol=lf\n"
  },
  {
    "path": "ci/build.sh",
    "content": "#!/bin/sh\n\nsource /opt/qt511/bin/qt511-env.sh\nif [ ! -d build ]; then\n    mkdir build\nfi\ncd build\n# build\necho Building\ncmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build . || exit 1\n# if succeeds, run unit tests\necho Running unit tests\n./cliTest/cliTest && ./GuiUnitTest/GuiUnitTest && ./mgraph440Test/mgraph440Test && ./salaTest/salaTest && ./genlibTest/genlibTest && ./depthmapXTest/depthmapXTest && ./moduleTest/moduleTest || exit 1\n# if that succeeds, run regression tests\necho testing regression test framework\ncd ../RegressionTest/test && echo pwd && python3.5 -u test_main.py || exit 1\necho running standard regression tests\ncd .. && pwd && python3.5 -u RegressionTestRunner.py || exit 1\necho running agent test\npython3.5 -u RegressionTestRunner.py regressionconfig_agents.json || exit 1\n# search the modules directory for regression tests and run them\nfor subdir in ../modules/*/; do\n    regressionFile=\"${subdir}RegressionTest/regressionconfig.json\"\n    if [ -e \"$regressionFile\" ]; then\n        python3.5 -u RegressionTestRunner.py \"${regressionFile}\" || exit 1\n    fi \ndone\n"
  },
  {
    "path": "cliTest/CMakeLists.txt",
    "content": "set(cliTest cliTest)\nset(cliTest_SRCS \n    main.cpp\n    ../depthmapXcli/printcommunicator.cpp\n    ../depthmapXcli/commandlineparser.cpp\n    testcommandlineparser.cpp\n    testradiusconverter.cpp\n    ../depthmapXcli/radiusconverter.cpp\n    testsimpletimer.cpp\n    testvgaparser.cpp\n    ../depthmapXcli/vgaparser.cpp\n    testlinkparser.cpp\n    ../depthmapXcli/linkparser.cpp\n    testagentparser.cpp\n    ../depthmapXcli/agentparser.cpp\n    testargumentholder.cpp\n    ../depthmapXcli/performancewriter.cpp\n    testperformancewriter.cpp\n    testselfcleaningfile.cpp\n    ../depthmapXcli/runmethods.cpp\n    ../depthmapXcli/modeparserregistry.cpp\n    testvisprepparser.cpp\n    ../depthmapXcli/visprepparser.cpp\n    testaxialparser.cpp\n    ../depthmapXcli/axialparser.cpp\n    testparsingutils.cpp\n    ../depthmapXcli/parsingutils.cpp\n    testisovistparser.cpp\n    ../depthmapXcli/isovistparser.cpp\n    testexportparser.cpp\n    ../depthmapXcli/exportparser.cpp\n    ../depthmapXcli/importparser.cpp\n    testimportparser.cpp\n    ../depthmapXcli/stepdepthparser.cpp\n    teststepdepthparser.cpp\n    ../depthmapXcli/segmentparser.cpp\n    testsegmentparser.cpp\n    ../depthmapXcli/mapconvertparser.cpp\n    testmapconvertparser.cpp)\n\n\ninclude_directories(\"../ThirdParty/Catch\" \"../ThirdParty/FakeIt\")\n\nset(LINK_LIBS salalib genlib mgraph440)\n\nset(modules_cliTest \"\" CACHE INTERNAL \"modules_cliTest\" FORCE)\nset(MODULES_GUI FALSE)\nset(MODULES_CLI FALSE)\nset(MODULES_CLI_TEST TRUE)\nset(MODULES_CORE FALSE)\nset(MODULES_CORE_TEST FALSE)\nadd_subdirectory(../modules modules)\n\nadd_executable(${cliTest} ${cliTest_SRCS})\ntarget_link_libraries(${cliTest} ${LINK_LIBS} ${modules_cli} ${modules_cliTest} ${modules_core})\n\n"
  },
  {
    "path": "cliTest/argumentholder.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef ARGUMENTHOLDER_H\n#define ARGUMENTHOLDER_H\n#include <vector>\n#include <string>\nclass ArgumentHolder{\npublic:\n    ArgumentHolder(std::initializer_list<std::string> l ): mArguments(l){\n        for (auto& arg : mArguments) {\n               mArgv.push_back(arg.data());\n        }\n    }\n\n    char** argv() const{\n        return (char**) mArgv.data();\n    }\n\n    size_t argc() const{\n        return mArgv.size();\n    }\n\nprivate:\n    std::vector<std::string> mArguments;\n    std::vector<const char *> mArgv;\n};\n\n#endif // ARGUMENTHOLDER_H\n"
  },
  {
    "path": "cliTest/main.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n\n\n"
  },
  {
    "path": "cliTest/selfcleaningfile.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n#include <stdio.h>\nclass SelfCleaningFile\n{\npublic:\n    SelfCleaningFile(const std::string &filename) : _filename(filename)\n    {}\n    ~SelfCleaningFile()\n    {\n        std::remove(_filename.c_str());\n    }\n\n    const std::string &Filename()\n    {\n        return _filename;\n    }\n\n\n\n\nprivate:\n    const std::string _filename;\n\n};\n"
  },
  {
    "path": "cliTest/testagentparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/agentparser.h\"\n#include \"argumentholder.h\"\n#include \"selfcleaningfile.h\"\n\nTEST_CASE(\"AgentParserFail\", \"Parsing errors\")\n{\n    // missing arguments\n\n    SECTION(\"Missing argument to -am\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-am\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-am requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -ats\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-ats requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -arr\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-arr\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-arr requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -afov\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-afov\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-afov requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -asteps\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-asteps\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-asteps requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -alife\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alife\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alife requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -alife\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alife\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alife requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -alocseed\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alocseed\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alocseed requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -alocfile\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alocfile\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alocfile requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -aloc\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-aloc\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-aloc requires an argument\"));\n    }\n\n    // rubbish input\n\n    SECTION(\"Non-numeric input to -ats\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-ats must be a number >0, got foo\"));\n    }\n\n    SECTION(\"Non-numeric input to -arr\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-arr\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-arr must be a number >0, got foo\"));\n    }\n\n    SECTION(\"Non-numeric input to -atrails\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-atrails\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-atrails must be a number >=1 or 0 for all (max possible = 50), got foo\"));\n    }\n\n    SECTION(\"Non-numeric input to -afov\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-afov\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-afov must be a number between 1 and 32, got foo\"));\n    }\n\n    SECTION(\"Out of range input to -afov (0)\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-afov\", \"0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-afov must be a number between 1 and 32, got 0\"));\n    }\n\n    SECTION(\"Out of range input to -afov (33)\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-afov\", \"33\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-afov must be a number between 1 and 32, got 33\"));\n    }\n\n    SECTION(\"Non-numeric input to -asteps\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-asteps\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-asteps must be a number >0, got foo\"));\n    }\n\n    SECTION(\"Non-numeric input to -alife\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alife\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alife must be a number >0, got foo\"));\n    }\n\n    SECTION(\"Rubbish input to -alocseed\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alocseed\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid starting location seed provided (foo). Should only contain digits\"));\n    }\n\n    SECTION(\"Rubbish input to -aloc\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-aloc\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid starting point provided (foo). Should only contain digits dots and commas\"));\n    }\n\n    SECTION(\"Define graph output twice\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ot\", \"graph\", \"-ot\", \"graph\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Same output type argument (graph) provided twice\"));\n    }\n\n    SECTION(\"Define gatecounts output twice\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ot\", \"gatecounts\", \"-ot\", \"gatecounts\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Same output type argument (gatecounts) provided twice\"));\n    }\n\n    SECTION(\"Define trails output twice\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ot\", \"trails\", \"-ot\", \"trails\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Same output type argument (trails) provided twice\"));\n    }\n}\nTEST_CASE(\"AgentParserInputFail\", \"Bad or missing input\")\n{\n    SECTION(\"-ats not provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\", \"-alocseed\", \"0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Total number of timesteps (-ats <timesteps>) is required\"));\n    }\n\n    SECTION(\"-arr not provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\", \"5000\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\", \"-alocseed\", \"0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Release rate (-arr <rate>) is required\"));\n    }\n\n    SECTION(\"-afov not provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-asteps\", \"3\", \"-alife\", \"1000\", \"-alocseed\", \"0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Agent field-of-view (-afov <bins>) is required\"));\n    }\n\n    SECTION(\"-asteps not provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-alife\", \"1000\", \"-alocseed\", \"0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Agent number of steps before turn decision (-asteps <steps>) is required\"));\n    }\n\n    SECTION(\"-alife not provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alocseed\", \"0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Agent life in timesteps (-alife <timesteps>) is required\"));\n    }\n\n    SECTION(\"No random starting poins, manual points or point file provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Either -aloc, -alocfile or -alocseed must be given\"));\n    }\n\n    SECTION(\"Manual points and pointfile provided\")\n    {\n        AgentParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-aloc\", \"0.1,5.2\", \"-alocfile\", \"testpoints.csv\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alocfile cannot be used together with -aloc\"));\n    }\n\n    SECTION(\"Pointfile and manual points provided\")\n    {\n        AgentParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-alocfile\", \"testpoints.csv\", \"-aloc\", \"0.1,5.2\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-aloc cannot be used together with -alocfile\"));\n    }\n\n    SECTION(\"Manual points and random points provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-aloc\", \"0.1,5.2\", \"-alocseed\", \"0\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alocseed cannot be used together with -aloc\"));\n    }\n\n    SECTION(\"Pointfile and random points provided\")\n    {\n        AgentParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-alocfile\", \"testpoints.csv\", \"-alocseed\", \"0\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alocseed cannot be used together with -alocfile\"));\n    }\n\n    SECTION(\"Random points and manual points provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alocseed\", \"0\", \"-aloc\", \"0.1,5.2\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-aloc cannot be used together with -alocseed\"));\n    }\n\n    SECTION(\"Random points and Pointfile provided\")\n    {\n        AgentParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-alocseed\", \"0\", \"-alocfile\", \"testpoints.csv\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-alocfile cannot be used together with -alocseed\"));\n    }\n\n    SECTION(\"Non-existing file provided\")\n    {\n        AgentParser parser;\n        ArgumentHolder ah{\"prog\", \"-alocfile\", \"foo.csv\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Failed to load file foo.csv, error\"));\n    }\n\n    SECTION(\"Malformed pointfile\")\n    {\n        AgentParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-alocfile\", \"testpoints.csv\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Error parsing line: 1\"));\n    }\n\n    SECTION(\"Malformed point arg\")\n    {\n        AgentParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-aloc\", \"0.1\", \"-ats\", \"5000\", \"-arr\", \"0.1\", \"-afov\",\"15\", \"-asteps\", \"3\", \"-alife\", \"1000\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Error parsing line: 0.1\"));\n    }\n}\n\nTEST_CASE(\"AgentParserSuccess\", \"Read successfully\")\n{\n    AgentParser parser;\n    double x1 = 1.0;\n    double y1 = 2.0;\n    double x2 = 1.1;\n    double y2 = 1.2;\n\n    int totalTimeSteps = 5000;\n    std::stringstream ats;\n    ats << totalTimeSteps << std::flush;\n\n    double releaseRate = 0.1;\n    std::stringstream arr;\n    arr << releaseRate << std::flush;\n\n    int agentFOV = 15;\n    std::stringstream afov;\n    afov << agentFOV << std::flush;\n\n    int agentStepsBeforeTurnDecision = 3;\n    std::stringstream asteps;\n    asteps << agentStepsBeforeTurnDecision << std::flush;\n\n    int agentLifeTimesteps = 1000;\n    std::stringstream alife;\n    alife << agentLifeTimesteps << std::flush;\n\n    SECTION(\"Random starting locations (points vector should be empty, seed 0)\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"0\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto points = parser.getReleasePoints();\n        REQUIRE(points.size() == 0);\n        REQUIRE(parser.randomReleaseLocationSeed() == 0);\n    }\n\n    SECTION(\"Random starting locations (points vector should be empty, seed 1)\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"1\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto points = parser.getReleasePoints();\n        REQUIRE(points.size() == 0);\n        REQUIRE(parser.randomReleaseLocationSeed() == 1);\n    }\n\n    SECTION(\"Read from commandline\")\n    {\n        std::stringstream p1;\n        p1 << x1 << \",\" << y1 << std::flush;\n        std::stringstream p2;\n        p2 << x2 << \",\" << y2 << std::flush;\n\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-aloc\", p1.str(), \"-aloc\", p2.str()};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto points = parser.getReleasePoints();\n        REQUIRE(points.size() == 2);\n        REQUIRE(points[0].x == Approx(x1));\n        REQUIRE(points[0].y == Approx(y1));\n        REQUIRE(points[1].x == Approx(x2));\n        REQUIRE(points[1].y == Approx(y2));\n    }\n\n    SECTION(\"Read from file\")\n    {\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(scf.Filename().c_str());\n            f << \"x\\ty\\n\" << x1 << \"\\t\" << y1 << \"\\n\"\n                          << x2 << \"\\t\" << y2 << \"\\n\" << std::flush;\n        }\n\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocfile\", scf.Filename()};\n        parser.parse(ah.argc(), ah.argv() );\n\n        auto points = parser.getReleasePoints();\n        REQUIRE(points.size() == 2);\n        REQUIRE(points[0].x == Approx(x1));\n        REQUIRE(points[0].y == Approx(y1));\n        REQUIRE(points[1].x == Approx(x2));\n        REQUIRE(points[1].y == Approx(y2));\n    }\n\n    SECTION(\"Output type not set\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"0\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto outputTypes = parser.outputTypes();\n        REQUIRE(outputTypes.size() == 0);\n    }\n\n    SECTION(\"Set output type to graph\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"0\", \"-ot\", \"graph\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto outputTypes = parser.outputTypes();\n        REQUIRE(outputTypes.size() == 1);\n        REQUIRE(outputTypes[0] == AgentParser::OutputType::GRAPH);\n    }\n\n    SECTION(\"Set output type to gatecounts\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"0\", \"-ot\", \"gatecounts\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto outputTypes = parser.outputTypes();\n        REQUIRE(outputTypes.size() == 1);\n        REQUIRE(outputTypes[0] == AgentParser::OutputType::GATECOUNTS);\n    }\n\n    SECTION(\"Set output type to trails\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"0\", \"-atrails\", \"1\", \"-ot\", \"trails\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto noOfTrails = parser.recordTrailsForAgents();\n        REQUIRE(noOfTrails == 1);\n\n        auto outputTypes = parser.outputTypes();\n        REQUIRE(outputTypes.size() == 1);\n        REQUIRE(outputTypes[0] == AgentParser::OutputType::TRAILS);\n    }\n\n    SECTION(\"Set two output types\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ats\", ats.str(), \"-arr\", arr.str(), \"-afov\", afov.str(), \"-asteps\", asteps.str(), \"-alife\", alife.str(), \"-alocseed\", \"0\", \"-ot\", \"graph\", \"-ot\", \"gatecounts\"};\n        parser.parse(ah.argc(), ah.argv());\n\n        auto outputTypes = parser.outputTypes();\n        REQUIRE(outputTypes.size() == 2);\n        REQUIRE(outputTypes[0] == AgentParser::OutputType::GRAPH);\n        REQUIRE(outputTypes[1] == AgentParser::OutputType::GATECOUNTS);\n    }\n\n    REQUIRE(parser.totalSystemTimestemps() == totalTimeSteps);\n    REQUIRE(parser.releaseRate() == Approx(releaseRate));\n    REQUIRE(parser.agentFOV() == agentFOV);\n    REQUIRE(parser.agentStepsBeforeTurnDecision() == agentStepsBeforeTurnDecision);\n    REQUIRE(parser.agentLifeTimesteps() == agentLifeTimesteps);\n\n}\n"
  },
  {
    "path": "cliTest/testargumentholder.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"argumentholder.h\"\n#include <cstring>\n\n\n\nTEST_CASE(\"Test ArgumentHolder\", \"Constructor\")\n{\n    ArgumentHolder ah{\"foo\", \"bar\"};\n    REQUIRE(ah.argc() == 2);\n    REQUIRE(std::strcmp(ah.argv()[0], \"foo\") == 0 );\n    REQUIRE(std::strcmp(ah.argv()[1], \"bar\") == 0 );\n}\n\n"
  },
  {
    "path": "cliTest/testaxialparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n\n#include \"../depthmapXcli/axialparser.h\"\n#include \"argumentholder.h\"\n\nTEST_CASE(\"Test mode and help\")\n{\n    AxialParser parser;\n    REQUIRE(parser.getModeName() == \"AXIAL\");\n    REQUIRE(parser.getHelp() == \"Mode options for Axial Analysis:\\n\"\\\n                                \"  -xl <x>,<y> Calculate all lines map from this seed point (can be used more than once)\\n\"\n                                \"  -xf Calculate fewest lines map from all lines map\\n\"\\\n                                \"  -xa <radius/list of radii> run axial anlysis with specified radii\\n\"\\\n                                \" All modes expect to find the required input in the in graph\\n\"\\\n                                \" Any combination of flags above can be specified, they will always be run in the order -aa -af -au -ax\\n\"\\\n                                \" Further flags for axial analysis are:\\n\"\\\n                                \"   -xac Include choice (betweenness)\\n\"\\\n                                \"   -xal Include local measures\\n\"\\\n                                \"   -xar Include RA, RRA and total depth\\n\"\\\n                                \"   -xaw <map attribute name> perform weighted analysis using this attribute\\n\"\\\n                                \"\\n\");\n\n}\n\nTEST_CASE(\"Test Parsing Exceptions\",\"\")\n{\n    AxialParser parser;\n    SECTION(\"No axial mode\")\n    {\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"No axial analysis mode present\" );\n    }\n\n    SECTION(\"Argument missing\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xl\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-xl requires an argument\" );\n    }\n}\n\nTEST_CASE(\"Test mode parsing\", \"\")\n{\n    AxialParser parser;\n    SECTION(\"All lines\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xl\", \"1.2,1.5\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.runAllLines());\n        REQUIRE(parser.getAllAxesRoots().size() == 1);\n        REQUIRE(parser.getAllAxesRoots()[0].x == Approx(1.2));\n        REQUIRE(parser.getAllAxesRoots()[0].y == Approx(1.5));\n        REQUIRE_FALSE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE_FALSE(parser.runAnalysis());\n    }\n    SECTION(\"Fewest lines\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xf\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.runAllLines());\n        REQUIRE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE_FALSE(parser.runAnalysis());\n    }\n    SECTION(\"Analysis\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xa\", \"n\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.runAllLines());\n        REQUIRE_FALSE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE(parser.runAnalysis());\n        REQUIRE_FALSE(parser.calculateRRA());\n        REQUIRE_FALSE(parser.useChoice());\n        REQUIRE_FALSE(parser.useLocal());\n    }\n    SECTION(\"Analysis -rra\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xa\", \"n\", \"-xar\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.runAllLines());\n        REQUIRE_FALSE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE(parser.runAnalysis());\n        REQUIRE(parser.calculateRRA());\n        REQUIRE_FALSE(parser.useChoice());\n        REQUIRE_FALSE(parser.useLocal());\n    }\n    SECTION(\"Analysis + choice\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xa\", \"n\", \"-xac\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.runAllLines());\n        REQUIRE_FALSE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE(parser.runAnalysis());\n        REQUIRE_FALSE(parser.calculateRRA());\n        REQUIRE(parser.useChoice());\n        REQUIRE_FALSE(parser.useLocal());\n    }\n    SECTION(\"Analysis + local\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xa\", \"n\", \"-xal\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.runAllLines());\n        REQUIRE_FALSE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE(parser.runAnalysis());\n        REQUIRE_FALSE(parser.calculateRRA());\n        REQUIRE_FALSE(parser.useChoice());\n        REQUIRE(parser.useLocal());\n    }\n\n    SECTION(\"Multiple\")\n    {\n        ArgumentHolder ah{\"prog\", \"-xl\", \"1.2,1.5\", \"-xa\", \"n\", \"-xl\", \"2.4,1.0\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.runAllLines());\n        REQUIRE(parser.getAllAxesRoots().size() == 2);\n        REQUIRE(parser.getAllAxesRoots()[0].x == Approx(1.2));\n        REQUIRE(parser.getAllAxesRoots()[0].y == Approx(1.5));\n        REQUIRE(parser.getAllAxesRoots()[1].x == Approx(2.4));\n        REQUIRE(parser.getAllAxesRoots()[1].y == Approx(1.0));\n        REQUIRE_FALSE(parser.runFewestLines());\n        REQUIRE_FALSE(parser.runUnlink());\n        REQUIRE(parser.runAnalysis());\n    }\n\n}\n"
  },
  {
    "path": "cliTest/testcommandlineparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"Catch/fakeit.hpp\"\n#include \"../depthmapXcli/commandlineparser.h\"\n#include \"../depthmapXcli/imodeparser.h\"\n#include \"../depthmapXcli/imodeparserfactory.h\"\n#include <cstring>\n#include <sstream>\n#include \"argumentholder.h\"\n\n\nusing namespace fakeit;\n\nclass TestParser: public IModeParser\n{\npublic:\n    TestParser(const std::string &modeName) : _parseCalled(false), _runCalled(false), _modeName(modeName)\n    {\n    }\n\n    virtual std::string getModeName()const\n    {\n        return _modeName;\n    }\n\n    virtual std::string getHelp() const\n    {\n        return formatTestHelpString(_runCalled, _parseCalled);\n    }\n\n    virtual void parse(int , char ** )\n    {\n        _parseCalled = true;\n    }\n\n    virtual void run(const CommandLineParser &, IPerformanceSink &) const\n    {\n        _runCalled = true;\n    }\n\n    static std::string formatTestHelpString(bool runCalled, bool parseCalled)\n    {\n        std::stringstream buf;\n        buf << \"runCalled \" << (runCalled ? \"yes\" : \"no\")\n            << \" : parseCalled \"  << (parseCalled? \"yes\": \"no\")\n            << std::flush;\n        return buf.str();\n    }\n\nprivate:\n    bool _parseCalled;\n    mutable bool _runCalled;\n    std::string _modeName;\n};\n\n\nTEST_CASE(\"Invalid Parser\",\"Constructor\"){\n    std::vector<std::unique_ptr<IModeParser> > parsers;\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST1\")));\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST2\")));\n\n    Mock<IModeParserFactory> factoryMock;\n    When(Method(factoryMock,getModeParsers)).AlwaysReturn(parsers);\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        REQUIRE_THROWS_WITH(cmdP.parse(0, 0), Catch::Contains(\"No commandline parameters provided - don't know what to do\"));\n    }\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), \"-m requires an argument\");\n    }\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-f\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), \"-f requires an argument\");\n    }\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-o\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), \"-o requires an argument\");\n    }\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-t\", \"-o\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), \"-t requires an argument\");\n    }\n\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"-f\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), \"-m requires an argument\");\n    }\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"LaLaLa\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), \"Invalid mode: LaLaLa\");\n    }\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), Catch::Contains(\"-m for mode is required\"));\n    }\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-m\", \"TEST2\",\"-f\", \"inputfile.graph\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), Catch::Contains(\"-m can only be used once\"));\n    }\n\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-o\", \"outputfile.graph\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), Catch::Contains(\"-f for input file is required\"));\n    }\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\"};\n        REQUIRE_THROWS_WITH(cmdP.parse(ah.argc(), ah.argv()), Catch::Contains(\"-o for output file is required\"));\n    }\n\n}\n\nTEST_CASE(\"Valid Parser\",\"CheckValues\"){\n    std::vector<std::unique_ptr<IModeParser> > parsers;\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST1\")));\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST2\")));\n\n    Mock<IModeParserFactory> factoryMock;\n    When(Method(factoryMock,getModeParsers)).AlwaysReturn(parsers);\n\n    SECTION(\"Parser test2 used\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST2\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\", \"-lnk\", \"1.2,3.4,5.6,7.8\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.isValid());\n        REQUIRE(cmdP.getTimingFile().empty());\n        REQUIRE(parsers[0]->getHelp() == TestParser::formatTestHelpString(false, false));\n        REQUIRE(parsers[1]->getHelp() == TestParser::formatTestHelpString(false, true));\n    }\n    SECTION(\"Parser test1 used\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.isValid());\n        REQUIRE_FALSE(cmdP.simpleMode());\n        REQUIRE(cmdP.getTimingFile().empty());\n        REQUIRE(cmdP.modeOptions().getModeName() == \"TEST1\");\n        REQUIRE(parsers[0]->getHelp() == TestParser::formatTestHelpString(false, true));\n        REQUIRE(parsers[1]->getHelp() == TestParser::formatTestHelpString(false, false));\n    }\n    SECTION(\"Parser test1 used, timings file, simple mode\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\", \"-s\", \"-t\", \"timings.csv\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.isValid());\n        REQUIRE(cmdP.simpleMode());\n        REQUIRE(cmdP.getTimingFile() == \"timings.csv\");\n        REQUIRE(parsers[0]->getHelp() == TestParser::formatTestHelpString(false, true));\n        REQUIRE(parsers[1]->getHelp() == TestParser::formatTestHelpString(false, false));\n    }\n\n}\n\nTEST_CASE(\"Run Tests\",\"Check we only run if it's appropriate\"){\n    std::vector<std::unique_ptr<IModeParser> > parsers;\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST1\")));\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST2\")));\n\n    Mock<IModeParserFactory> factoryMock;\n    When(Method(factoryMock,getModeParsers)).AlwaysReturn(parsers);\n\n    Mock<IPerformanceSink> perfSink;\n\n    SECTION(\"Fail - run without parsing\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        REQUIRE_THROWS_WITH(cmdP.run(perfSink.get()), Catch::Contains(\"Trying to run with invalid command line parameters\"));\n    }\n\n    SECTION(\"Fail run with help on the command line\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-h\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(cmdP.isValid());\n        REQUIRE_THROWS_WITH(cmdP.run(perfSink.get()), Catch::Contains(\"Trying to run with invalid command line parameters\"));\n    }\n\n    SECTION(\"Fail run with version on the command line\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-v\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(cmdP.isValid());\n        REQUIRE_THROWS_WITH(cmdP.run(perfSink.get()), Catch::Contains(\"Trying to run with invalid command line parameters\"));\n    }\n\n    SECTION(\"Fail run with version on the command line as last parameter\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\", \"-v\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(cmdP.isValid());\n        REQUIRE_THROWS_WITH(cmdP.run(perfSink.get()), Catch::Contains(\"Trying to run with invalid command line parameters\"));\n    }\n\n    SECTION(\"Fail run without sub parser\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\" \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\"};\n        REQUIRE_THROWS(cmdP.parse(ah.argc(), ah.argv()));\n        REQUIRE_FALSE(cmdP.isValid());\n        REQUIRE_THROWS_WITH(cmdP.run(perfSink.get()), Catch::Contains(\"Trying to run with invalid command line parameters\"));\n    }\n\n\n    SECTION(\"Parser test1 used, timings file, simple mode\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{\"prog\", \"-m\", \"TEST1\", \"-f\", \"inputfile.graph\", \"-o\", \"outputfile.graph\", \"-s\", \"-t\", \"timings.csv\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.isValid());\n        REQUIRE(cmdP.simpleMode());\n        REQUIRE(cmdP.getTimingFile() == \"timings.csv\");\n        REQUIRE(parsers[0]->getHelp() == TestParser::formatTestHelpString(false, true));\n        REQUIRE(parsers[1]->getHelp() == TestParser::formatTestHelpString(false, false));\n        cmdP.run(perfSink.get());\n        REQUIRE(parsers[0]->getHelp() == TestParser::formatTestHelpString(true, true));\n        REQUIRE(parsers[1]->getHelp() == TestParser::formatTestHelpString(false, false));\n\n    }\n\n}\n\n\nTEST_CASE(\"Invalid Parser Need Help\", \"CheckForHelp\")\n{\n    std::vector<std::unique_ptr<IModeParser> > parsers;\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST1\")));\n    parsers.push_back(std::unique_ptr<IModeParser>(new TestParser(\"TEST2\")));\n\n    Mock<IModeParserFactory> factoryMock;\n    When(Method(factoryMock,getModeParsers)).AlwaysReturn(parsers);\n\n    SECTION(\"Help requested\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{ \"prog\", \"-h\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(cmdP.isValid());\n    }\n    SECTION(\"Version requested\")\n    {\n        CommandLineParser cmdP(factoryMock.get());\n        ArgumentHolder ah{ \"prog\", \"-v\"};\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(cmdP.isValid());\n    }\n}\n"
  },
  {
    "path": "cliTest/testexportparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/exportparser.h\"\n#include \"argumentholder.h\"\n\nTEST_CASE(\"ExportParser Fail\", \"Parsing errors\")\n{\n    // missing arguments\n\n    SECTION(\"Missing argument to -em\")\n    {\n        ExportParser parser;\n        ArgumentHolder ah{\"prog\", \"-em\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-em requires an argument\"));\n    }\n}\n\nTEST_CASE(\"ExportParser Success\", \"Read successfully\")\n{\n    ExportParser parser;\n\n    SECTION(\"Correctly parse mode pointmap-connections-csv\")\n    {\n        ArgumentHolder ah{\"prog\", \"-em\", \"pointmap-connections-csv\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.getExportMode() == ExportParser::POINTMAP_CONNECTIONS_CSV);\n    }\n\n    SECTION(\"Correctly parse mode pointmap-data-csv\")\n    {\n        ArgumentHolder ah{\"prog\", \"-em\", \"pointmap-data-csv\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.getExportMode() == ExportParser::POINTMAP_DATA_CSV);\n    }\n\n    SECTION(\"Correctly parse mode pointmap-links-csv\")\n    {\n        ArgumentHolder ah{\"prog\", \"-em\", \"pointmap-links-csv\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.getExportMode() == ExportParser::POINTMAP_LINKS_CSV);\n    }\n}\n"
  },
  {
    "path": "cliTest/testimportparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/importparser.h\"\n#include \"argumentholder.h\"\n\nTEST_CASE(\"Import args valid\", \"valid\")\n{\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"IMPORT\", \"-if\", \"importfile\"};\n        ImportParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getFilesToImport().size() == 1);\n        REQUIRE(cmdP.getFilesToImport()[0] == \"importfile\");\n    }\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"IMPORT\", \"-if\", \"importfile1\", \"-if\", \"importfile2\"};\n        ImportParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getFilesToImport().size() == 2);\n        REQUIRE(cmdP.getFilesToImport()[0] == \"importfile1\");\n        REQUIRE(cmdP.getFilesToImport()[1] == \"importfile2\");\n    }\n}\n"
  },
  {
    "path": "cliTest/testisovistparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"catch.hpp\"\n#include \"depthmapXcli/isovistparser.h\"\n#include \"argumentholder.h\"\n#include \"selfcleaningfile.h\"\n\nTEST_CASE(\"Isovistparser string constants\")\n{\n    IsovistParser parser;\n    REQUIRE(parser.getModeName() == \"ISOVIST\");\n    REQUIRE(parser.getHelp() == \"Arguments for isovist mode:\\n\" \\\n                                \"  -ii <x,y[,angle,viewangle]> Define an isoivist at position x,y with\\n\"\\\n                                \"    optional direction angle and view angle for partial isovists\\n\"\\\n                                \"  -if <isovist file> load isovist definitions from a file (csv)\\n\"\\\n                                \"    the relevant headers must be called x, y, angle and viewangle\\n\"\\\n                                \"    the latter two are optional.\\n\"\\\n                                \"  Those two arguments cannot be mixed\\n\"\\\n                                \"  Angles for partial isovists are in degrees, counted anti-clockwise with 0°\\n\"\\\n                                \"  pointing to the right.\\n\\n\" );\n}\n\nTEST_CASE(\"Parse isovist on the command line\")\n{\n    ArgumentHolder ah{\"prog\", \"-ii\", \"1,2\", \"-ii\", \"1,5,27,180\"};\n    IsovistParser parser;\n    parser.parse(ah.argc(), ah.argv());\n\n    REQUIRE(parser.getIsovists().size() == 2);\n    REQUIRE(parser.getIsovists()[0].getLocation().y == Approx(2.0));\n    REQUIRE(parser.getIsovists()[0].getViewAngle() == 0.0);\n\n    REQUIRE(parser.getIsovists()[1].getLocation().y == Approx(5.0));\n    REQUIRE(parser.getIsovists()[1].getViewAngle() == Approx(3.141592));\n\n}\n\n\nTEST_CASE(\"Parse isovists from file\")\n{\n    IsovistParser parser;\n\n    SECTION(\"Full isovists\")\n    {\n        SelfCleaningFile scf(\"fullisovists.csv\");\n        {\n            std::ofstream file(scf.Filename());\n            file << \"id,x,y,angle\\n1,1,1,27\\n2,2.2,1.1,190\\n\" << std::flush;\n        }\n\n        ArgumentHolder ah{\"prog\", \"-if\", scf.Filename()};\n        parser.parse(ah.argc(), ah.argv());\n\n        REQUIRE(parser.getIsovists().size() == 2);\n        REQUIRE(parser.getIsovists()[0].getLocation().y == Approx(1.0));\n        REQUIRE(parser.getIsovists()[0].getAngle() == 0.0);\n        REQUIRE(parser.getIsovists()[0].getViewAngle() == 0.0);\n\n        REQUIRE(parser.getIsovists()[1].getLocation().y == Approx(1.1));\n        REQUIRE(parser.getIsovists()[1].getAngle() == 0.0);\n        REQUIRE(parser.getIsovists()[1].getViewAngle() == 0.0);\n    }\n\n    SECTION(\"Partial isovists\")\n    {\n        SelfCleaningFile scf(\"fullisovists.csv\");\n        {\n            std::ofstream file(scf.Filename());\n            file << \"id,x,y,angle,foo,ViewAngle\\n1,1,1,27,bar,180\\n2,2.2,1.1,180,baz,90\\n\" << std::flush;\n        }\n\n        ArgumentHolder ah{\"prog\", \"-if\", scf.Filename()};\n        parser.parse(ah.argc(), ah.argv());\n\n        REQUIRE(parser.getIsovists().size() == 2);\n        REQUIRE(parser.getIsovists()[0].getLocation().y == Approx(1.0));\n        REQUIRE(parser.getIsovists()[0].getAngle() == Approx(0.4712388) );\n        REQUIRE(parser.getIsovists()[0].getViewAngle() == Approx(3.141592));\n\n        REQUIRE(parser.getIsovists()[1].getLocation().y == Approx(1.1));\n        REQUIRE(parser.getIsovists()[1].getAngle() == Approx(3.141592));\n        REQUIRE(parser.getIsovists()[1].getViewAngle() == Approx(1.57079));\n    }\n\n}\n\nTEST_CASE(\"Command line failures\")\n{\n    IsovistParser parser;\n\n    SECTION( \"Missing arguments for -ii\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ii\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-ii requires an argument\"));\n    }\n\n    SECTION( \"Missing arguments for -if\")\n    {\n        ArgumentHolder ah{\"prog\", \"-if\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-if requires an argument\"));\n    }\n\n    SECTION( \"Using -if twice\")\n    {\n        ArgumentHolder ah{\"prog\", \"-if\", \"foo.csv\", \"-if\", \"bar.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-if can only be used once\"));\n    }\n\n    SECTION( \"Using -ii and -if\")\n    {\n        ArgumentHolder ah{\"prog\", \"-ii\", \"1,1\", \"-if\", \"bar.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-if cannot be used together with -ii\"));\n\n    }\n\n    SECTION( \"Using -if and -ii\")\n    {\n        ArgumentHolder ah{\"prog\", \"-if\", \"foo.csv\", \"-ii\", \"1,1\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-ii cannot be used together with -if\"));\n    }\n\n    SECTION(\"Nothing to do\")\n    {\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"No isovists defined. Use -ii or -if\"));\n    }\n\n\n}\n"
  },
  {
    "path": "cliTest/testlinkparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/linkparser.h\"\n#include \"argumentholder.h\"\n\nTEST_CASE(\"LINK args invalid\", \"\")\n{\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lf\"};\n        LinkParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-lf requires an argument\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lnk\"};\n        LinkParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-lnk requires an argument\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lf\", \"linksfile1\", \"-lf\", \"linksfile2\"};\n        LinkParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-lf can only be used once at the moment\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lf\", \"linksfile1\", \"-lnk\", \"0,0,0,0\"};\n        LinkParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-lf can not be used in conjunction with -lnk\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lnk\", \"LaLaLaLa\"};\n        LinkParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid link provided\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lnk\", \"1.2;3.4;5.6;7.8\"};\n        LinkParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid link provided\"));\n    }\n}\n\nTEST_CASE(\"LINK args valid\", \"valid\")\n{\n    // for this set of tests a difference less than 0.001 should\n    // suffice to signify that two floats are the same\n    const float EPSILON = 0.001f;\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lnk\", \"1.2,3.4,5.6,7.8\"};\n        LinkParser cmdP;\n        cmdP.parse(int(ah.argc()), ah.argv());\n        REQUIRE(cmdP.getManualLinks().size() == 1);\n        REQUIRE(cmdP.getManualLinks()[0] == \"1.2,3.4,5.6,7.8\");\n        REQUIRE(cmdP.getLinkMode() == cmdP.LinkMode::LINK);\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lnk\", \"1.2,3.4,5.6,7.8\", \"-lnk\", \"0.1,0.2,0.3,0.4\"};\n        LinkParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getManualLinks().size() == 2);\n        REQUIRE(cmdP.getManualLinks()[0] == \"1.2,3.4,5.6,7.8\");\n        REQUIRE(cmdP.getManualLinks()[1] == \"0.1,0.2,0.3,0.4\");\n        REQUIRE(cmdP.getLinkMode() == cmdP.LinkMode::LINK);\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"LINK\", \"-lnk\", \"1.2,3.4,5.6,7.8\", \"-lnk\", \"0.1,0.2,0.3,0.4\",\n                          \"-lm\", \"unlink\", \"-lmt\", \"pointmaps\"};\n        LinkParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getManualLinks().size() == 2);\n        REQUIRE(cmdP.getManualLinks()[0] == \"1.2,3.4,5.6,7.8\");\n        REQUIRE(cmdP.getManualLinks()[1] == \"0.1,0.2,0.3,0.4\");\n        REQUIRE(cmdP.getLinkMode() == cmdP.LinkMode::UNLINK);\n    }\n}\n"
  },
  {
    "path": "cliTest/testmapconvertparser.cpp",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include \"depthmapXcli/mapconvertparser.h\"\n#include \"argumentholder.h\"\n#include \"selfcleaningfile.h\"\n\nTEST_CASE(\"MapConvertParserFail\", \"Error cases\")\n{\n    SECTION(\"Missing argument to co\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-co\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-co requires an argument\"));\n    }\n    SECTION(\"Missing argument to con\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-con\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-con requires an argument\"));\n    }\n    SECTION(\"Missing argument to crsl\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-crsl\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-crsl requires an argument\"));\n    }\n\n    SECTION(\"Non-numeric input to -crsl\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-crsl\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-crsl must be a number >0, got foo\"));\n    }\n\n    SECTION(\"Under-zero input to -crsl\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-crsl\", \"-1\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-crsl must be a number >0, got -1\"));\n    }\n\n    SECTION(\"Zero input to -crsl\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-crsl\", \"-1\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-crsl must be a number >0, got -1\"));\n    }\n\n    SECTION(\"rubbish input to -co\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-co\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"Invalid map output (-co) type: foo\"));\n    }\n\n    SECTION(\"output type (-co) provided twice\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-co\", \"axial\", \"-co\", \"drawing\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"-co can only be used once, modes are mutually exclusive\"));\n    }\n\n    SECTION(\"Don't provide output type\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"A valid output map type (-co) is required\"));\n    }\n\n    SECTION(\"Don't provide output name\")\n    {\n        MapConvertParser parser;\n        ArgumentHolder ah{\"prog\", \"-co\", \"axial\"};\n        REQUIRE_THROWS_WITH(parser.parse(int(ah.argc()), ah.argv()), Catch::Contains(\"A valid output map name (-con) is required\"));\n    }\n}\n\nTEST_CASE(\"MapConvertParserSuccess\", \"Read successfully\")\n{\n    MapConvertParser parser;\n\n    SECTION(\"Plain axial\")\n    {\n        ArgumentHolder ah{\"prog\", \"-co\", \"axial\", \"-con\", \"new_axial\"};\n        parser.parse(int(ah.argc()), ah.argv());\n        REQUIRE(parser.outputMapName() == \"new_axial\");\n        REQUIRE(parser.outputMapType() == ShapeMap::AXIALMAP);\n    }\n}\n"
  },
  {
    "path": "cliTest/testparsingutils.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/parsingutils.h\"\n\nTEST_CASE(\"AxialRadiusParsing success\")\n{\n    std::string testString = \"5,1,n\";\n    auto result = depthmapX::parseRadiusList(testString);\n    std::vector<double> expectedResult = {1.0 ,5.0,-1.0};\n    REQUIRE( result == expectedResult );\n}\n\nTEST_CASE(\"AxialRadiusParsing failure\")\n{\n    REQUIRE_THROWS_WITH(depthmapX::parseRadiusList(\"5,1.1\"), Catch::Contains(\"Found non integer radius 1.1\"));\n    REQUIRE_THROWS_WITH(depthmapX::parseRadiusList(\"5,foo\"), Catch::Contains(\"Found either 0 or unparsable radius foo\"));\n    REQUIRE_THROWS_WITH(depthmapX::parseRadiusList(\"5,0\"), Catch::Contains(\"Found either 0 or unparsable radius 0\"));\n    REQUIRE_THROWS_WITH(depthmapX::parseRadiusList(\"5,-1\"), Catch::Contains(\"Radius must be either n or a positive integer\"));\n}\n\n"
  },
  {
    "path": "cliTest/testperformancewriter.cpp",
    "content": "#include <catch.hpp>\n#include \"../depthmapXcli/performancewriter.h\"\n#include \"selfcleaningfile.h\"\n#include <fstream>\n\nTEST_CASE(\"TestPerformanceWriting\", \"Simple test case\")\n{\n    SelfCleaningFile scf(\"timertest.csv\");\n    PerformanceWriter writer(scf.Filename());\n\n    writer.addData(\"test1\", 100.0);\n    writer.addData(\"test2\", 200.0 );\n\n    writer.write();\n\n    std::ifstream f(scf.Filename());\n    REQUIRE(f.good());\n    char line[1000];\n    std::vector<std::string> lines;\n    while( !f.eof())\n    {\n        f.getline(line, 1000);\n        lines.push_back(line);\n    }\n    std::vector<std::string> expected{\"\\\"action\\\",\\\"duration\\\"\", \"\\\"test1\\\",100\", \"\\\"test2\\\",200\", \"\"};\n    REQUIRE(lines == expected);\n\n}\n\nTEST_CASE(\"TestPerformanceNotWriting\", \"No filename no writing\")\n{\n    SelfCleaningFile scf(\"timertest.csv\");\n    PerformanceWriter writer(\"\");\n\n    writer.addData(\"test1\", 100.0);\n    writer.addData(\"test2\", 200.0 );\n\n    writer.write();\n\n    std::ifstream f(scf.Filename());\n    REQUIRE_FALSE(f.good());\n}\n"
  },
  {
    "path": "cliTest/testradiusconverter.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/radiusconverter.h\"\n\nTEST_CASE(\"ConvertForMetric\",\"\")\n{\n    RadiusConverter converter;\n    REQUIRE(converter.ConvertForMetric(\"2\") == Approx(2.0));\n    REQUIRE(converter.ConvertForMetric(\"n\") == Approx(-1.0));\n    REQUIRE(converter.ConvertForMetric(\"2.6\") == Approx(2.6));\n    REQUIRE(converter.ConvertForMetric(\"2.3e12\") == Approx(2.3e12));\n    REQUIRE_THROWS_WITH(converter.ConvertForMetric(\"-1\"), Catch::Contains(\"Radius for metric vga must be n for the whole range or a positive number. Got -1\"));\n    REQUIRE_THROWS_WITH(converter.ConvertForMetric(\"foo\"), Catch::Contains(\"Radius for metric vga must be n for the whole range or a positive number. Got foo\"));\n    REQUIRE_THROWS_WITH(converter.ConvertForMetric(\"NaN\"), Catch::Contains(\"Radius NaN?! Really?\"));\n    REQUIRE_THROWS_WITH(converter.ConvertForMetric(\"INFINITY\"), Catch::Contains(\"Radius inf?! Who are you kidding?\"));\n}\n"
  },
  {
    "path": "cliTest/testsegmentparser.cpp",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n\n#include \"../depthmapXcli/segmentparser.h\"\n#include \"argumentholder.h\"\n\nTEST_CASE(\"Test segment mode and help\")\n{\n    SegmentParser parser;\n    REQUIRE(parser.getModeName() == \"SEGMENT\");\n    REQUIRE(parser.getHelp() == \"Mode options for Segment Analysis:\\n\"\\\n                                \"  -st  <type of analysis> one of:\\n\"\n                                \"       tulip (Angular Tulip - Faster)\\n\"\\\n                                \"       angular (Angular Full - Slower)\\n\"\\\n                                \"       topological\\n\"\\\n                                \"       metric\\n\"\\\n                                \"  -sr  <radius/list of radii>\\n\"\\\n                                \"  -srt <radius type> (only for Tulip) one of:\\n\"\\\n                                \"       steps\\n\"\\\n                                \"       metric\\n\"\\\n                                \"       angular\\n\"\\\n                                \"  -sic to include choice (only for Tulip)\\n\"\\\n                                \"  -stb <tulip bins> (4 to 1024, 1024 approximates full angular)\\n\"\\\n                                \"  -swa <map attribute name> perform weighted analysis using this attribute (only for Tulip)\\n\");\n\n}\n\nTEST_CASE(\"Test Segment Parsing Exceptions\",\"\")\n{\n    SegmentParser parser;\n    SECTION(\"No segment mode\")\n    {\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"No analysis type given\" );\n    }\n\n    SECTION(\"Argument missing -st\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-st requires an argument\" );\n    }\n\n    SECTION(\"Invalid SEGMENT mode\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"Invalid SEGMENT mode: foo\" );\n    }\n\n    SECTION(\"Argument missing -sr\")\n    {\n        ArgumentHolder ah{\"prog\", \"-sr\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-sr requires an argument\" );\n    }\n\n    SECTION(\"Argument missing -srt\")\n    {\n        ArgumentHolder ah{\"prog\", \"-srt\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-srt requires an argument\" );\n    }\n\n    SECTION(\"Invalid SEGMENT radius type\")\n    {\n        ArgumentHolder ah{\"prog\", \"-srt\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"Invalid SEGMENT radius type: foo\" );\n    }\n\n    SECTION(\"Argument missing -stb\")\n    {\n        ArgumentHolder ah{\"prog\", \"-stb\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-stb requires an argument\" );\n    }\n\n    SECTION(\"Missung radius metric\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"metric\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"At least one radius must be provided\" );\n    }\n\n    SECTION(\"Missung radius topological\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"topological\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"At least one radius must be provided\" );\n    }\n\n    SECTION(\"Missung radius angular\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"angular\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"At least one radius must be provided\" );\n    }\n\n    SECTION(\"Missung radius tulip\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"tulip\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"At least one radius must be provided\" );\n    }\n\n    SECTION(\"Missing tulip radius type\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"tulip\", \"-sr\", \"n\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"Radius type is required for tulip analysis\" );\n    }\n\n    SECTION(\"Missing tulip bins\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"tulip\", \"-sr\", \"n\", \"-srt\", \"steps\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"Tulip bins are required for tulip analysis\" );\n    }\n\n    SECTION(\"Tulip bins out of range\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"tulip\", \"-sr\", \"n\", \"-srt\", \"steps\", \"-stb\", \"2\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-stb must be a number between 4 and 1024, got 2\" );\n    }\n\n    SECTION(\"Tulip bins out of range\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"tulip\", \"-sr\", \"n\", \"-srt\", \"steps\", \"-stb\", \"1025\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), \"-stb must be a number between 4 and 1024, got 1025\" );\n    }\n}\n\nTEST_CASE(\"Test segment mode parsing\", \"\")\n{\n    SegmentParser parser;\n    SECTION(\"Analysis Metric\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"metric\", \"-sr\", \"n\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.includeChoice());\n        REQUIRE(parser.getTulipBins() == 0);\n        REQUIRE(parser.getAnalysisType() == SegmentParser::AnalysisType::METRIC);\n        REQUIRE(parser.getRadiusType() == SegmentParser::RadiusType::NONE);\n        REQUIRE(parser.getRadii().size() == 1);\n        REQUIRE(int(parser.getRadii()[0]) == -1);\n    }\n    SECTION(\"Analysis Angular Full\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"angular\", \"-sr\", \"n\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.includeChoice());\n        REQUIRE(parser.getTulipBins() == 0);\n        REQUIRE(parser.getAnalysisType() == SegmentParser::AnalysisType::ANGULAR_FULL);\n        REQUIRE(parser.getRadiusType() == SegmentParser::RadiusType::NONE);\n        REQUIRE(parser.getRadii().size() == 1);\n        REQUIRE(int(parser.getRadii()[0]) == -1);\n    }\n    SECTION(\"Analysis Topological\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"topological\", \"-sr\", \"n\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE_FALSE(parser.includeChoice());\n        REQUIRE(parser.getTulipBins() == 0);\n        REQUIRE(parser.getAnalysisType() == SegmentParser::AnalysisType::TOPOLOGICAL);\n        REQUIRE(parser.getRadiusType() == SegmentParser::RadiusType::NONE);\n        REQUIRE(parser.getRadii().size() == 1);\n        REQUIRE(int(parser.getRadii()[0]) == -1);\n    }\n    SECTION(\"Analysis Tulip\")\n    {\n        ArgumentHolder ah{\"prog\", \"-st\", \"tulip\", \"-sr\", \"n\", \"-srt\", \"steps\", \"-stb\", \"1024\", \"-sic\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.includeChoice());\n        REQUIRE(parser.getTulipBins() == 1024);\n        REQUIRE(parser.getAnalysisType() == SegmentParser::AnalysisType::ANGULAR_TULIP);\n        REQUIRE(parser.getRadiusType() == SegmentParser::RadiusType::SEGMENT_STEPS);\n        REQUIRE(parser.getRadii().size() == 1);\n        REQUIRE(int(parser.getRadii()[0]) == -1);\n    }\n\n}\n"
  },
  {
    "path": "cliTest/testselfcleaningfile.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"catch.hpp\"\n#include \"selfcleaningfile.h\"\n#include <fstream>\n\nnamespace\n{\n    bool fileExists(const std::string &filename)\n    {\n        std::ifstream f(filename.c_str());\n        return f.good();\n    }\n\n    bool writeToFile(const std::string &filename, const std::string &content)\n    {\n        std::ofstream f(filename.c_str());\n        if (!f.good())\n        {\n            return false;\n        }\n        f << content;\n        f.flush();\n        return true;\n    }\n}\n\n\nTEST_CASE(\"TestSelfCleaningFile\", \"Check it is deleted, doesn't fail when not present\")\n{\n    {\n        SelfCleaningFile scf(\"foo.txt\");\n        REQUIRE(scf.Filename() == \"foo.txt\");\n        REQUIRE(fileExists(\"foo.txt\") == false);\n        REQUIRE(writeToFile(scf.Filename(), \"bla bla bla\"));\n        REQUIRE(fileExists(scf.Filename()));\n    }\n    REQUIRE(fileExists(\"foo.txt\") == false);\n\n    {\n        SelfCleaningFile scf(\"foo.txt\");\n        REQUIRE(scf.Filename() == \"foo.txt\");\n        REQUIRE(fileExists(\"foo.txt\") == false);\n    }\n    REQUIRE(fileExists(\"foo.txt\") == false);\n\n}\n\n"
  },
  {
    "path": "cliTest/testsimpletimer.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/simpletimer.h\"\n#include <thread>\n#include <chrono>\n\nTEST_CASE(\"TestSimpleTimer\", \"\")\n{\n    SimpleTimer timer;\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    REQUIRE(timer.getTimeInSeconds() == Approx(0.5).epsilon(0.2));\n}\n\nTEST_CASE(\"TestSimpleTimerReset\", \"\")\n{\n    SimpleTimer timer1;\n    SimpleTimer timer2;\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    REQUIRE(timer1.getTimeInSeconds() == Approx(0.5).epsilon(0.2));\n    REQUIRE(timer2.getTimeInSeconds() == Approx(0.5).epsilon(0.2));\n    timer2.reset();\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    REQUIRE(timer1.getTimeInSeconds() == Approx(1.0).epsilon(0.2));\n    REQUIRE(timer2.getTimeInSeconds() == Approx(0.5).epsilon(0.2));\n}\n\n"
  },
  {
    "path": "cliTest/teststepdepthparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include \"depthmapXcli/stepdepthparser.h\"\n#include \"argumentholder.h\"\n#include \"selfcleaningfile.h\"\n\nTEST_CASE(\"StepDepthParserFail\", \"Error cases\")\n{\n    SECTION(\"Missing argument to -sdp\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\", \"-sdp\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sdp requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -sdf\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\", \"-sdf\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sdf requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -sdt\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\", \"-sdt\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sdt requires an argument\"));\n    }\n\n    SECTION(\"rubbish input to -sdp\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\", \"-sdp\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid step depth point provided (foo). Should only contain digits dots and commas\"));\n    }\n\n    SECTION(\"rubbish input to -sdt\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\", \"-sdt\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid step type: foo\"));\n    }\n\n    SECTION(\"Non-existing file provided\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\", \"-sdf\", \"foo.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Failed to load file foo.csv, error\"));\n    }\n\n    SECTION(\"Neiter points nor point file provided\")\n    {\n        StepDepthParser parser;\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Either -sdp or -sdf must be given\"));\n    }\n\n    SECTION(\"Points and pointfile provided\")\n    {\n        StepDepthParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-sdp\", \"0.1,5.2\", \"-sdf\", \"testpoints.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sdf cannot be used together with -sdp\"));\n    }\n\n    SECTION(\"Pointfile and points provided\")\n    {\n        StepDepthParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-sdf\", \"testpoints.csv\", \"-sdp\", \"0.1,5.2\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sdp cannot be used together with -sdf\"));\n    }\n\n    SECTION(\"Malformed pointfile\")\n    {\n        StepDepthParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-sdf\", \"testpoints.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Error parsing line: 1\"));\n    }\n\n    SECTION(\"Malformed point arg\")\n    {\n        StepDepthParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-sdp\", \"0.1\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Error parsing line: 0.1\"));\n    }\n\n}\n\nTEST_CASE(\"StepDepthParserSuccess\", \"Read successfully\")\n{\n    StepDepthParser parser;\n    double x1 = 1.0;\n    double y1 = 2.0;\n    double x2 = 1.1;\n    double y2 = 1.2;\n\n    SECTION(\"Read from commandline\")\n    {\n        std::stringstream p1;\n        p1 << x1 << \",\" << y1 << std::flush;\n        std::stringstream p2;\n        p2 << x2 << \",\" << y2 << std::flush;\n\n        ArgumentHolder ah{\"prog\", \"-sdp\", p1.str(), \"-sdp\", p2.str(), \"-sdt\", \"visual\"};\n        parser.parse(ah.argc(), ah.argv());\n    }\n\n    SECTION(\"Read from file\")\n    {\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(scf.Filename().c_str());\n            f << \"x\\ty\\n\" << x1 << \"\\t\" << y1 << \"\\n\"\n                          << x2 << \"\\t\" << y2 << \"\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-sdf\", scf.Filename(), \"-sdt\", \"visual\"};\n        parser.parse(ah.argc(), ah.argv() );\n    }\n\n    auto points = parser.getStepDepthPoints();\n    REQUIRE(points.size() == 2);\n    REQUIRE(points[0].x == Approx(x1));\n    REQUIRE(points[0].y == Approx(y1));\n    REQUIRE(points[1].x == Approx(x2));\n    REQUIRE(points[1].y == Approx(y2));\n}\n"
  },
  {
    "path": "cliTest/testvgaparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapXcli/vgaparser.h\"\n#include \"argumentholder.h\"\n\nTEST_CASE(\"VGA args invalid\", \"\")\n{\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-vm requires an argument\"));\n    }\n\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"foo\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid VGA mode: foo\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"visibility\", \"-vm\", \"metric\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-vm can only be used once\"));\n    }\n\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"visibility\", \"-vg\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"Global measures in VGA/visibility analysis require a radius, use -vr <radius>\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"visibility\", \"-vg\", \"-vr\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"-vr requires an argument\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"visibility\", \"-vg\", \"-vr\", \"foo\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"Radius must be a positive integer number or n, got foo\"));\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"metric\"};\n        VgaParser p;\n        REQUIRE_THROWS_WITH(p.parse(ah.argc(), ah.argv()), Catch::Contains(\"Metric vga requires a radius, use -vr <radius>\"));\n    }\n}\n\nTEST_CASE(\"VGA args valid\", \"valid\")\n{\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\"};\n        VgaParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getVgaMode() == VgaParser::VgaMode::ISOVIST);\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"isovist\"};\n        VgaParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getVgaMode() == VgaParser::VgaMode::ISOVIST);\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"visibility\"};\n        VgaParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getVgaMode() == VgaParser::VgaMode::VISBILITY);\n        REQUIRE_FALSE(cmdP.localMeasures());\n        REQUIRE_FALSE(cmdP.globalMeasures());\n        REQUIRE(cmdP.getRadius().empty());\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"visibility\", \"-vl\", \"-vg\", \"-vr\", \"4\"};\n        VgaParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getVgaMode() == VgaParser::VgaMode::VISBILITY);\n        REQUIRE(cmdP.globalMeasures());\n        REQUIRE(cmdP.localMeasures());\n        REQUIRE(cmdP.getRadius() == \"4\");\n    }\n\n    {\n        ArgumentHolder ah{\"prog\", \"-f\", \"infile\", \"-o\", \"outfile\", \"-m\", \"VGA\", \"-vm\", \"thruvision\"};\n        VgaParser cmdP;\n        cmdP.parse(ah.argc(), ah.argv());\n        REQUIRE(cmdP.getVgaMode() == VgaParser::VgaMode::THRU_VISION);\n    }\n\n\n}\n"
  },
  {
    "path": "cliTest/testvisprepparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include \"depthmapXcli/visprepparser.h\"\n#include \"argumentholder.h\"\n#include \"selfcleaningfile.h\"\n\nTEST_CASE(\"VisPrepParserFail\", \"Error cases\")\n{\n    SECTION(\"Missing argument to pg\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pg\", \"-pp\", \"1.2,1.3\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pg requires an argument\"));\n    }\n    SECTION(\"Missing argument to pp\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pp\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pp requires an argument\"));\n    }\n    SECTION(\"Missing argument to pf\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pf\", \"-pg\", \"1.2\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pf requires an argument\"));\n    }\n\n    SECTION(\"Non-numeric input to -pg\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pg\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pg must be a number >0, got foo\"));\n    }\n\n    SECTION(\"rubbish input to -pp\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pp\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid fill point provided (foo). Should only contain digits dots and commas\"));\n    }\n\n    SECTION(\"Non-existing file provide\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pg\", \"0.1\", \"-pf\", \"foo.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Failed to load file foo.csv, error\"));\n    }\n\n    SECTION(\"Neither points nor point file provided\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pg\", \"0.1\", \"-pm\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Either -pp or -pf must be given\"));\n    }\n\n    SECTION(\"Nothing to do\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Nothing to do\"));\n    }\n\n    SECTION(\"Points and pointfile provided\")\n    {\n        VisPrepParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-pg\", \"0.1\", \"-pp\", \"0.1,5.2\", \"-pf\", \"testpoints.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pf cannot be used together with -pp\"));\n    }\n\n    SECTION(\"Pointfile and points provided\")\n    {\n        VisPrepParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\t2\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-pg\", \"0.1\", \"-pf\", \"testpoints.csv\", \"-pp\", \"0.1,5.2\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pp cannot be used together with -pf\"));\n    }\n\n    SECTION(\"Malformed pointfile\")\n    {\n        VisPrepParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-pg\", \"0.1\", \"-pf\", \"testpoints.csv\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Error parsing line: 1\"));\n    }\n\n    SECTION(\"Malformed point arg\")\n    {\n        VisPrepParser parser;\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(\"testpoints.csv\");\n            f << \"x\\ty\\n1\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-pg\", \"0.1\", \"-pp\", \"0.1\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Error parsing line: 0.1\"));\n    }\n\n    SECTION(\"Nonsensical visibility restriction\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pr\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Restricted visibility of 'foo' makes no sense, use a positive number or -1 for unrestricted\"));\n    }\n\n    SECTION(\"Nonsensical visibility restriction\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pr\", \"0.0\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Restricted visibility of '0.0' makes no sense, use a positive number or -1 for unrestricted\"));\n    }\n\n    SECTION(\"Make and unmake\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pm\", \"-pu\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pu cannot be used together with -pm\"));\n    }\n\n    SECTION(\"Grid and unmake\")\n    {\n        VisPrepParser parser;\n        ArgumentHolder ah{\"prog\", \"-pg\", \"1\", \"-pu\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-pu can not be used with any other option apart from -pl\"));\n    }\n}\n\nTEST_CASE(\"VisprepParserMakeSuccess\", \"Read successfully - Make\")\n{\n    VisPrepParser parser;\n    double x1 = 1.0;\n    double y1 = 2.0;\n    double x2 = 1.1;\n    double y2 = 1.2;\n    double grid = 0.5;\n    std::stringstream gstring;\n    gstring << grid << std::flush;\n\n    SECTION(\"Read from commandline\")\n    {\n        std::stringstream p1;\n        p1 << x1 << \",\" << y1 << std::flush;\n        std::stringstream p2;\n        p2 << x2 << \",\" << y2 << std::flush;\n\n        ArgumentHolder ah{\"prog\", \"-pg\", gstring.str(), \"-pp\", p1.str(), \"-pp\", p2.str(), \"-pb\", \"-pr\", \"2.1\", \"-pm\"};\n        parser.parse(ah.argc(), ah.argv());\n        REQUIRE(parser.getBoundaryGraph());\n        REQUIRE(parser.getMakeGraph());\n        REQUIRE_FALSE(parser.getUnmakeGraph());\n        REQUIRE_FALSE(parser.getRemoveLinksWhenUnmaking());\n        REQUIRE(parser.getMaxVisibility() == Approx(2.1));\n    }\n\n    SECTION(\"Read from file\")\n    {\n        SelfCleaningFile scf(\"testpoints.csv\");\n        {\n            std::ofstream f(scf.Filename().c_str());\n            f << \"x\\ty\\n\" << x1 << \"\\t\" << y1 << \"\\n\"\n                          << x2 << \"\\t\" << y2 << \"\\n\" << std::flush;\n        }\n        ArgumentHolder ah{\"prog\", \"-pg\", gstring.str(), \"-pf\", scf.Filename()};\n        parser.parse(ah.argc(), ah.argv() );\n        REQUIRE_FALSE(parser.getBoundaryGraph());\n        REQUIRE_FALSE(parser.getMakeGraph());\n        REQUIRE_FALSE(parser.getUnmakeGraph());\n        REQUIRE_FALSE(parser.getRemoveLinksWhenUnmaking());\n        REQUIRE(parser.getMaxVisibility() == Approx(-1.0));\n    }\n\n    REQUIRE(parser.getGrid() == Approx(grid));\n    auto points = parser.getFillPoints();\n    REQUIRE(points.size() == 2);\n    REQUIRE(points[0].x == Approx(x1));\n    REQUIRE(points[0].y == Approx(y1));\n    REQUIRE(points[1].x == Approx(x2));\n    REQUIRE(points[1].y == Approx(y2));\n}\n\nTEST_CASE(\"VisprepParserUnmakeSuccess\", \"Read successfully - Unmake\")\n{\n    VisPrepParser parser;\n    ArgumentHolder ah{\"prog\", \"-pu\", \"-pl\"};\n    parser.parse(ah.argc(), ah.argv());\n    REQUIRE_FALSE(parser.getBoundaryGraph());\n    REQUIRE_FALSE(parser.getMakeGraph());\n    REQUIRE(parser.getUnmakeGraph());\n    REQUIRE(parser.getRemoveLinksWhenUnmaking());\n}\n"
  },
  {
    "path": "depthmapX/CMakeLists.txt",
    "content": "set(depthmapX depthmapX)\n\n# Find includes in corresponding build directories\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n# Instruct CMake to run moc automatically when needed\nset(CMAKE_AUTOMOC ON)\n# Create code from a list of Qt designer ui files\n# set(CMAKE_AUTOUIC ON)\n# set(CMAKE_AUTORCC ON)\n\n# Find the QtWidgets library\nfind_package(Qt5 COMPONENTS Core Widgets Gui OpenGL REQUIRED)\n\nadd_compile_definitions(_DEPTHMAP)\n\nset(depthmapX_SRCS\n    GraphDoc.cpp\n    indexWidget.cpp\n    mainwindow.cpp\n    mdichild.cpp\n    renderthread.cpp\n    treeWindow.cpp\n    mainwindowfactory.cpp\n    settingsimpl.cpp\n\tcompatibilitydefines.h\n\tmainwindow.h\n        settings.h\n\tGraphDoc.h\n\tmainwindowfactory.h\n\tsettingsimpl.h\n\tindexWidget.h\n\tmdichild.h\n\ttreeWindow.h\n\tmain.cpp\n\tcoreapplication.cpp\n        coreapplication.h\n        mainwindowhelpers.cpp\n        mainwindowmoduleregistry.cpp\n        imainwindowmodulefactory.h)\n\nqt5_wrap_ui(UI_HDRS\n    UI/TopoMetDlg.ui\n    UI/SegmentAnalysisDlg.ui\n    UI/RenameObjectDlg.ui\n    UI/PushDialog.ui\n    UI/PromptReplace.ui\n    UI/OptionsDlg.ui\n    UI/NewLayerDlg.ui\n    UI/MakeOptionsDlg.ui\n    UI/MakeLayerDlg.ui\n    UI/LicenceDialog.ui\n    UI/LayerChooserDlg.ui\n    UI/IsovistPathDlg.ui\n    UI/InsertColumnDlg.ui\n    UI/GridDialog.ui\n    UI/FindLocDlg.ui\n    UI/FilePropertiesDlg.ui\n    UI/FewestLineOptionsDlg.ui\n    UI/EditConnectionsDlg.ui\n    UI/DepthmapOptionsDlg.ui\n    UI/DepthmapAlert.ui\n    UI/ConvertShapesDlg.ui\n    UI/ColumnPropertiesDlg.ui\n    UI/ColourScaleDlg.ui\n    UI/AxialAnalysisOptionsDlg.ui\n    UI/AttributeSummary.ui\n    UI/AttributeChooserDlg.ui\n    UI/AgentAnalysisDlg.ui\n    UI/AboutDlg.ui\n    UI/licenseagreement.ui)\n\nqt5_add_resources(DM_RSRC resource.qrc dialogs/settings/settingsdialog.qrc)\n\nif (WIN32)\n        add_executable(${depthmapX} WIN32 ${depthmapX_SRCS} ${UI_HDRS} ${DM_RSRC} icons.rc)\n        if(MINGW)\n            # https://stackoverflow.com/a/18138926\n            # MinGW compilation does not bring in the required DLLs to make the executable self-contained\n            # The missing DLLs are:\n            # - libstdc++-6.dll\n            # - libwinpthread-1.dll\n            # - libgcc_s_seh-1.dll\n            # Additionally, windeployqt does not drag them into the build directory, so it might be\n            # necessary to manually find and copy them after compilation\n            set(CMAKE_CXX_STANDARD_LIBRARIES \"-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CXX_STANDARD_LIBRARIES}\")\n            set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive\")\n        endif(MINGW)\nendif(WIN32)\nif(UNIX AND NOT APPLE)\n        add_executable(${depthmapX} ${depthmapX_SRCS} ${UI_HDRS} ${DM_RSRC})\n        if (Qt5_POSITION_INDEPENDENT_CODE)\n            SET(CMAKE_POSITION_INDEPENDENT_CODE ON)\n        endif()\nendif()\nif(APPLE)\n        set(MACOSX_BUNDLE_ICON_FILE depthmapX.icns)\n        set(depthmapX_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icons/depthmapX.icns)\n        set_source_files_properties(${depthmapX_ICON} PROPERTIES\n               MACOSX_PACKAGE_LOCATION \"Resources\")\n        set(graph_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icons/graph.icns)\n        set_source_files_properties(${graph_ICON} PROPERTIES\n               MACOSX_PACKAGE_LOCATION \"Resources\")\n        add_definitions(-DGL_SILENCE_DEPRECATION)\n        add_executable(${depthmapX} MACOSX_BUNDLE ${depthmapX_ICON} ${graph_ICON}\n            ${depthmapX_SRCS} ${UI_HDRS} ${DM_RSRC})\n        set_target_properties(${depthmapX} PROPERTIES\n            MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/resources/Info.plist)\nendif(APPLE)\n\nfind_package(OpenGL REQUIRED)\n\nset(modules_gui \"\" CACHE INTERNAL \"modules_gui\" FORCE)\nset(MODULES_GUI TRUE)\nset(MODULES_CLI FALSE)\nset(MODULES_CLI_TEST FALSE)\nset(MODULES_CORE FALSE)\nset(MODULES_CORE_TEST FALSE)\nadd_subdirectory(../modules modules)\n\ntarget_link_libraries(${depthmapX} salalib genlib mgraph440 Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL\n    OpenGL::GL OpenGL::GLU ${modules_gui} ${modules_core})\n\nadd_subdirectory(dialogs)\nadd_subdirectory(views)\n\n"
  },
  {
    "path": "depthmapX/GraphDoc.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include <QMessageBox>\r\n#include <QString>\r\n#include <QFile>\r\n#include <QtCore/QFile>\r\n#include <QtWidgets/QFileDialog>\r\n#include <QtWidgets/QMessageBox>\r\n#include <QtWidgets/QPushButton>\r\n#include <stdio.h>\r\n\r\n#include \"mainwindow.h\"\r\n\r\n#include \"dialogs/MakeLayerDlg.h\"\r\n#include \"dialogs/OptionsDlg.h\"\r\n#include \"dialogs/AxialAnalysisOptionsDlg.h\"\r\n#include \"dialogs/SegmentAnalysisDlg.h\"\r\n#include \"dialogs/GridDialog.h\"\r\n#include \"dialogs/MakeOptionsDlg.h\"\r\n#include \"dialogs/EditConnectionsDlg.h\"\r\n#include \"dialogs/ColourScaleDlg.h\"\r\n#include \"dialogs/FewestLineOptionsDlg.h\"\r\n#include \"dialogs/PromptReplace.h\"\r\n#include \"dialogs/FilePropertiesDlg.h\"\r\n#include \"dialogs/InsertColumnDlg.h\"\r\n#include \"dialogs/PushDialog.h\"\r\n#include \"dialogs/AgentAnalysisDlg.h\"\r\n#include \"dialogs/NewLayerDlg.h\"\r\n#include \"dialogs/AttributeChooserDlg.h\"\r\n#include \"dialogs/LayerChooserDlg.h\"\r\n#include \"dialogs/RenameObjectDlg.h\"\r\n#include \"dialogs/ColumnPropertiesDlg.h\"\r\n#include \"dialogs/IsovistPathDlg.h\"\r\n#include \"dialogs/ConvertShapesDlg.h\"\r\n#include \"dialogs/TopoMetDlg.h\"\r\n#include \"dialogs/AttributeSummary.h\"\r\n\r\n#include \"views/depthmapview/depthmapview.h\"\r\n#include \"views/viewhelpers.h\"\r\n\r\n#include <QMetaType>\r\n\r\n#ifdef _WIN32\r\n#include <windows.h>\r\n#endif\r\n#include \"compatibilitydefines.h\"\r\n#include \"salalib/importutils.h\"\r\n\r\nQT_BEGIN_NAMESPACE\r\nQ_DECLARE_METATYPE(std::string)\r\n\r\nQGraphDoc::QGraphDoc(const QString &author, const QString &organisation)\r\n{\r\n   m_opened_name = \"\";\r\n   m_flag_lock = false;\r\n   for (int i = 0; i < VIEW_TYPES; i++) \r\n   {\r\n      m_redraw_flag[i] = REDRAW_DONE;\r\n      m_remenu_flag[i] = false;\r\n\t  m_view[i] = NULL;\r\n   }\r\n   m_communicator = NULL;\r\n\r\n   m_make_algorithm = 0;   // algorithm to make graph\r\n   m_make_maxdist = -1.0;  // maximum distance you can see (set to -1.0 for infinite)\r\n\r\n   m_meta_graph = new MetaGraph;\r\n\r\n   modifiedFlag = false;\r\n\r\n   modify_prog = false;\r\n   m_num_steps = 0;\r\n   m_record = 0;\r\n   m_step = 0;\r\n   m_num_records = 0;\r\n\r\n   std::string date = ViewHelpers::getCurrentDate();\r\n   QString version = QString(TITLE_BASE);\r\n\r\n   m_meta_graph->setProperties(author.toStdString(),organisation.toStdString(),date,version.toStdString());\r\n\r\n    qRegisterMetaType< std::string >();\r\n    connect(&m_thread, &RenderThread::runtimeExceptionThrown, this, &QGraphDoc::exceptionThrownInRenderThread);\r\n    connect(&m_thread, &RenderThread::showWarningMessage, this, &QGraphDoc::messageFromRenderThread);\r\n    connect(&m_thread, &RenderThread::closeWaitDialog, this, &QGraphDoc::DestroyWaitDialog);\r\n}\r\nvoid QGraphDoc::exceptionThrownInRenderThread(int type, std::string message) {\r\n    if(type == depthmapX::PointMapExceptionType::NO_ISOVIST_ANALYSIS) {\r\n        std::stringstream message;\r\n        message << \"This operation requires isovist analysis. To run it go to: \";\r\n        message << \"Tools -> Visibility -> Run Visibility Graph Analysis... \";\r\n        message << \"and select \\\"Calculate isovist properties\\\"\";\r\n        QMessageBox::warning(this, tr(\"Warning\"), tr(message.str().c_str()),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::messageFromRenderThread(QString title, QString message) {\r\n    QMessageBox::warning(this, title, message, QMessageBox::Ok, QMessageBox::Ok);\r\n}\r\n\r\nbool QGraphDoc::SetRedrawFlag(int viewtype, int flag, int reason, QWidget *originator) // (almost) thread safe\r\n{\r\n\r\n    if(viewtype == VIEW_ALL && flag != REDRAW_DONE)\r\n    {\r\n        ((MainWindow *) m_mainFrame)->updateGLWindows(true, flag == REDRAW_TOTAL);\r\n    }\r\n    if(viewtype == VIEW_MAP && flag == REDRAW_TOTAL)\r\n    {\r\n        ((MainWindow *) m_mainFrame)->updateGLWindows(false, true);\r\n    }\r\n\r\n   if (!m_flag_lock) {\r\n      m_flag_lock = true;\r\n      if (viewtype) {\r\n         // it's the view calling itself\r\n         if (m_redraw_flag[viewtype] < flag) \r\n\t\t {\r\n            m_redraw_flag[viewtype] = flag;\r\n            QApplication::postEvent(m_view[viewtype], new QEvent(QEvent::FocusIn));\r\n\r\n         }\r\n         if (flag == REDRAW_DONE) {\r\n            m_redraw_flag[viewtype] = flag;\r\n         }\r\n      }\r\n      else {\r\n         for (int i = 1; i < VIEW_TYPES; i++) {\r\n            if (m_view[i] && m_redraw_flag[i] < flag) \r\n\t\t    {\r\n               m_redraw_flag[i] = flag;\r\n               QApplication::postEvent(m_view[i], new QEvent(QEvent::FocusIn));\r\n            }\r\n         }\r\n      }\r\n      m_flag_lock = false;\r\n      return true;\r\n   }\r\n   return false;\r\n}\r\n\r\nvoid QGraphDoc::UpdateMainframestatus()\r\n{\r\n    QString s1, s2, s3;\r\n    if (!m_meta_graph->viewingNone()) {\r\n       int n = 0;\r\n       int state = m_meta_graph->getState();\r\n       // showing the axial graph\r\n       if ((state & MetaGraph::SHAPEGRAPHS) && m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n          n = (int) m_meta_graph->getDisplayedShapeGraph().getShapeCount();\r\n       }\r\n       else if ((state & MetaGraph::DATAMAPS) && m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n          n = (int) m_meta_graph->getDisplayedDataMap().getShapeCount();\r\n       }\r\n       // either showing or constructing the VGA graph\r\n       else if ((state & MetaGraph::POINTMAPS) && m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n          n = (int) m_meta_graph->getDisplayedPointMap().getFilledPointCount();\r\n       }\r\n       if (n > 0) {\r\n          s1 = QString(\"%1   \").arg(n);\r\n       }\r\n       QtRegion r = m_meta_graph->getBoundingBox();\r\n       s2 = QString(\"%1,  %2   \").arg(r.width()).arg(r.height());\r\n       s3 = QString(\"%1,  %2   \").arg(m_position.x).arg(m_position.y);\r\n       ((MainWindow *)m_mainFrame)->UpdateStatus(s1, s2, s3);\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::SetUpdateFlag(int type, bool modified)\r\n{\r\n   switch (type) {\r\n   case NEW_FILE:\r\n        QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_LOADALL));\r\n      break;\r\n   case NEW_DATA:\r\n        QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_LOADATTRIBUTES));\r\n      break;\r\n   case NEW_TABLE:\r\n        QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_LOADGRAPH));\r\n      break;\r\n   case DELETED_TABLE:\r\n        QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_RELOADGRAPH));\r\n      break;\r\n   }\r\n   SetRemenuFlag(VIEW_ALL,true);     // Tell the views to update their menus\r\n   if (modified) {\r\n\t   modifiedFlag = true;\r\n   }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// QGraphDoc commands\r\n\r\n// New layer and delete layer\r\n\r\nvoid QGraphDoc::OnLayerNew() \r\n{\r\n   CNewLayerDlg dlg;\r\n   if (QDialog::Accepted == dlg.exec()) {\r\n      // insert a new layer of the correct type\r\n      // for now, 0 = axial map, and 1 = data map\r\n      ShapeMap *map;\r\n      if (dlg.m_layer_type == 0) {\r\n          int ref = m_meta_graph->addShapeMap(dlg.m_name.toStdString());\r\n          m_meta_graph->setDisplayedDataMapRef(ref);\r\n          map = &(m_meta_graph->getDataMaps()[ref]);\r\n      }\r\n      else if (dlg.m_layer_type == 1) {\r\n          int ref = m_meta_graph->addShapeGraph(dlg.m_name.toStdString(),ShapeMap::CONVEXMAP);\r\n          m_meta_graph->setDisplayedShapeGraphRef(ref);\r\n          map = m_meta_graph->getShapeGraphs()[size_t(ref)].get();\r\n      }\r\n      else if (dlg.m_layer_type == 2) {\r\n          int ref = m_meta_graph->addShapeGraph(dlg.m_name.toStdString(),ShapeMap::AXIALMAP);\r\n          m_meta_graph->setDisplayedShapeGraphRef(ref);\r\n          map = m_meta_graph->getShapeGraphs()[size_t(ref)].get();\r\n      }\r\n      else if (dlg.m_layer_type == 3) {\r\n          int ref = m_meta_graph->addShapeGraph(dlg.m_name.toStdString(),ShapeMap::PESHMAP);\r\n          m_meta_graph->setDisplayedShapeGraphRef(ref);\r\n          map = m_meta_graph->getShapeGraphs()[size_t(ref)].get();\r\n      }\r\n\r\n      QtRegion r = m_meta_graph->getBoundingBox();\r\n      if (r.atZero()) {\r\n         r = QtRegion(Point2f(-50.0,-50.0),Point2f(50.0,50.0));\r\n      }\r\n      map->init(0,r);\r\n      map->setEditable(true);\r\n\r\n      SetUpdateFlag(NEW_TABLE);\r\n      SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH, NEW_DATA);\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnLayerDelete() \r\n{\r\n   // Delete the currently displayed map\r\n    if (QMessageBox::Yes == QMessageBox::question(this, tr(\"depthmapX\"), tr(\"Are you sure you want to delete this map?\\nThis action cannot be undone\"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No))\r\n   {\r\n      m_meta_graph->removeDisplayedMap();\r\n      SetUpdateFlag(DELETED_TABLE);\r\n      SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH, NEW_DATA);\r\n   }\r\n}\r\n\r\n// Note: import and export are now on the Layer menu, not the file menu\r\n\r\n// Import file types: .cat, .dxf, .ntf\r\n// Txt files for points and lines (shapes)\r\nvoid QGraphDoc::CreateWaitDialog(const QString& description, QWidget *pr)\r\n{\r\n\tmodify_prog = false;\r\n\tm_waitdlg = new QProgressDialog();\r\n\tconnect(m_waitdlg, SIGNAL(canceled()), this, SLOT(cancel_wait()));\r\n\tm_waitdlg->setCancelButtonText(tr(\"&Cancel\"));\r\n\tm_waitdlg->setWindowTitle(description);\r\n\tm_waitdlg->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Dialog);\r\n\tm_waitdlg->show();\r\n\tTid_progress = startTimer(50);\r\n\tm_timer.start();\r\n}\r\n\r\nvoid QGraphDoc::DestroyWaitDialog()\r\n{\r\n\tmodify_prog = true;\r\n\tkillTimer(Tid_progress);\r\n\tQApplication::postEvent((QObject*)m_waitdlg, new QEvent(QEvent::Close));\r\n}\r\n\r\nvoid QGraphDoc::cancel_wait()\r\n{\r\n\tif (m_communicator) {\r\n\t\tm_waitdlg->setLabelText(QString(\" attempting to cancel\"));\r\n\t\tif (m_communicator->IsCancelled()) {\r\n\t\t}\r\n\t\telse {\r\n\t\t\tm_communicator->Cancel();\r\n\t\t}\r\n\t// Don't cancel --- cancel should be handled by the thread! \r\n\t}\r\n}\r\n\r\nvoid QGraphDoc::timerEvent(QTimerEvent *event)\r\n{\r\n\tif (event->timerId() == Tid_progress)\r\n\t{\r\n\t\tif(modify_prog) {\r\n\t\t\tQApplication::postEvent((QObject*)m_waitdlg, new QEvent(QEvent::Close));\r\n\t\t\tkillTimer(Tid_progress);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tQString lstr = QString(\"Step %1 of %2\").arg(m_step).arg(m_num_steps);\r\n\t\tm_waitdlg->setValue(m_record);\r\n\r\n\t\tdouble percent = (100.0 * double(m_record)) / double(m_num_records);\r\n\t\tQString str;\r\n\t\tint timeleft = 1 + int((100.0 / percent - 1.0) * double(m_timer.elapsed()/1000));\r\n        if (percent > 0.5) {\r\n\t\t\tif (timeleft >= 3600) {\r\n\t\t\t\tstr = QString(\" : Estimated %1 hours %2 minutes remaining\").arg(timeleft / 3600).arg((timeleft / 60) % 60 );\r\n            }\r\n            else if (timeleft >= 60) {\r\n\t\t\t\tstr = QString(\" : Estimated %1 minutes %2 seconds remaining\").arg((timeleft / 60) % 60).arg(timeleft % 60 );\r\n\t\t\t}\r\n            else {\r\n\t\t\t\tstr = QString(\" : Estimated %1 seconds remaining\").arg(timeleft % 60);\r\n\t\t\t}\r\n        }\r\n\t\tlstr += str;\r\n\t\tm_waitdlg->setLabelText(lstr);\r\n\t}\r\n}\r\n\r\nvoid QGraphDoc::ProcPostMessage(int m, int x)\r\n{\r\n\tswitch (m) {\r\n\tcase Communicator::NUM_STEPS:\r\n\t\tm_num_steps = x;\r\n\t\tbreak;\r\n\tcase Communicator::NUM_RECORDS:\r\n\t\tif(!modify_prog) m_waitdlg->setRange(0, x);\r\n\t\t m_record = 0;\r\n\t\t m_num_records = x;\r\n\t\t break;\r\n\tcase Communicator::CURRENT_STEP:\r\n\t\t m_step = x;\r\n         break;\r\n    case Communicator::CURRENT_RECORD:\r\n\t\t m_record = x;\r\n\t\t if (m_record > m_num_records) m_record = m_num_records;\r\n         break;\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::OnVGALinksFileImport()\r\n{\r\n    if (m_communicator) {\r\n        return; // Locked\r\n    }\r\n\r\n    // change the view before loading the file to make the changes apparent\r\n    if(m_view[VIEW_MAP])\r\n        ((QDepthmapView*)m_view[VIEW_MAP])->m_showlinks = true;\r\n    SetRedrawFlag(VIEW_MAP,REDRAW_POINTS, NEW_DEPTHMAPVIEW_SETUP);\r\n\r\n    QString template_string;\r\n    template_string += \"Text files (*.txt *.csv)\\n\";\r\n    template_string += \"All files (*.*)\";\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString infile = QFileDialog::getOpenFileName(\r\n                                0, tr(\"Import Links File\"),\r\n                                \"\",\r\n                                template_string,\r\n                                &selectedFilter,\r\n                                options);\r\n\r\n    if (!infile.size())\r\n    {\r\n        // no file selected\r\n        return;\r\n    }\r\n\r\n    std::string fileName = infile.toStdString();\r\n\r\n    std::ifstream fileStream(fileName);\r\n    if (fileStream.fail())\r\n    {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to read text file.\\nPlease check that another program is not using it.\"),\r\n                           QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n    }\r\n    else\r\n    {\r\n        try\r\n        {\r\n            PointMap& currentMap = m_meta_graph->getDisplayedPointMap();\r\n            std::vector<PixelRefPair> newLinks = depthmapX::pixelateMergeLines(\r\n                        EntityParsing::parseLines(fileStream, '\\t'), currentMap);\r\n            depthmapX::mergePixelPairs(newLinks, currentMap);\r\n            SetRedrawFlag(VIEW_MAP,REDRAW_POINTS, NEW_DEPTHMAPVIEW_SETUP);\r\n        }\r\n        catch (EntityParsing::EntityParseException& e)\r\n        {\r\n            std::stringstream message;\r\n            message << \"Unable to parse text file\\n\\n\";\r\n            message << fileName;\r\n            message << \"\\n\\n Error: \";\r\n            message << e.what();\r\n            QMessageBox::warning(this, tr(\"Warning\"), tr(message.str().c_str()),\r\n                                                   QMessageBox::Ok, QMessageBox::Ok);\r\n        }\r\n        catch (depthmapX::InvalidLinkException& e)\r\n        {\r\n            std::stringstream message;\r\n            message << \"Unable to import links\\n\\n\";\r\n            message << fileName;\r\n            message << \"\\n\\n Error: \";\r\n            message << e.what();\r\n            QMessageBox::warning(this, tr(\"Warning\"), tr(message.str().c_str()),\r\n                                                   QMessageBox::Ok, QMessageBox::Ok);\r\n        }\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::OnGenerateIsovistsFromFile() {\r\n    if (m_communicator) {\r\n        return; // Locked\r\n    }\r\n\r\n    QString template_string;\r\n    template_string += \"Text files (*.txt *.csv)\\n\";\r\n    template_string += \"All files (*.*)\";\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString infile =\r\n        QFileDialog::getOpenFileName(0, tr(\"Import Isovists File\"), \"\", template_string, &selectedFilter, options);\r\n\r\n    if (!infile.size()) {\r\n        // no file selected\r\n        return;\r\n    }\r\n\r\n    std::string fileName = infile.toStdString();\r\n\r\n    std::ifstream fileStream(fileName);\r\n    if (fileStream.fail()) {\r\n        QMessageBox::warning(this, tr(\"Warning\"),\r\n                             tr(\"Unable to read text file.\\nPlease check that another program is not using it.\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    } else {\r\n        // communicator and wait dialog to prevent draw while this operation is in progress\r\n        // and also because the isovist generation requires both\r\n        m_communicator = new CMSCommunicator;\r\n        m_communicator->SetInfile2(qPrintable(infile));\r\n        CreateWaitDialog(tr(\"Generating isovists...\"));\r\n        m_communicator->SetFunction(CMSCommunicator::MAKEISOVISTSFROMFILE);\r\n        m_thread.render(this);\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::OnFileImport()\r\n{\r\n   if (m_communicator) {\r\n      return; // Locked\r\n   }\r\n\r\n   QString template_string;\r\n   template_string += \"All formats(*.dxf *.ntf *.gml *.cat *.rt1 *.mif *.txt *.csv)\\n\";\r\n   template_string += \"Drawing files (*.dxf *.ntf *.gml *.cat *.rt1)\\nMapInfo map (*.mif)\\nText files (*.txt *.csv)\\n\";\r\n   \r\n   template_string += \"All files (*.*)\";\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QStringList infiles = QFileDialog::getOpenFileNames(\r\n                                0, tr(\"Import Files\"),\r\n                                \"\",\r\n                                template_string,\r\n                                &selectedFilter,\r\n                                options);\r\n\r\n   if (!infiles.size()) {\r\n      return;\r\n   }\r\n\r\n    // this is placed here as a proxy to be queried later so that we can find\r\n    // if there was something else in the graph after importing. If there was\r\n    // then the view should not be reset, if there wasn't then the view can\r\n    // be reset to point to the newly imported objects\r\n    bool graphHadNullBoundsBeforeImport = m_meta_graph->getBoundingBox().atZero();\r\n\r\n   QFilePath filepath(infiles[0]);\r\n   QString ext = filepath.m_ext;\r\n   if (ext == tr(\"CAT\") || ext == tr(\"DXF\") || ext == tr(\"NTF\") || ext == tr(\"RT1\") || ext == tr(\"MIF\") || ext == tr(\"GML\") || ext == tr(\"\")) {\r\n      for (int i = 1; i < infiles.size(); i++) {\r\n         QFilePath filepath(infiles[i]);\r\n         if (filepath.m_ext != ext || !(filepath.m_ext == tr(\"RT1\") || filepath.m_ext == tr(\"NTF\") || filepath.m_ext == tr(\"GML\") || filepath.m_ext == tr(\"\"))) {\r\n\t\t\t QMessageBox::warning(this, tr(\"Warning\"), tr(\"You have selected more than one file.  Unfortunately, this feature is only currently available with NTF, GML and Tiger line files.\\nPlease select a single file to import only.\"),\r\n                 QMessageBox::Ok, QMessageBox::Ok);\r\n            return;\r\n         }\r\n      }\r\n      // OS files don't have GML suffix for some bizarre reason\r\n      if (ext == tr(\"\")) {\r\n         ext = tr(\"GML\");\r\n      }\r\n      int graph_option = MetaGraph::ADD;\r\n      bool ok = true;\r\n\r\n      if (ok) {\r\n         m_communicator = new CMSCommunicator;\r\n         if (ext != tr(\"RT1\") && ext != tr(\"NTF\") && ext != tr(\"GML\")) {  // ntf, gml & rt1 use filesets (all others use standard file at a time)\r\n            m_communicator->SetInfile( qPrintable(infiles[0]) );\r\n         }\r\n         if (ext != tr(\"MIF\")) {\r\n            CreateWaitDialog(tr(\"Importing file...\"));\r\n            m_communicator->SetFunction( CMSCommunicator::IMPORT );\r\n            if (ext == tr(\"CAT\")) {\r\n               m_communicator->SetOption( MetaGraph::CAT | graph_option );\r\n            }\r\n            else if (ext == tr(\"DXF\")) {\r\n               m_communicator->SetOption( MetaGraph::DXF | graph_option );\r\n            }\r\n            else if (ext == tr(\"NTF\")) {\r\n               m_communicator->SetOption( MetaGraph::NTF | graph_option );\r\n               m_communicator->SetFileSet( infiles );\r\n            }\r\n            else if (ext == tr(\"GML\")) {\r\n               m_communicator->SetOption( MetaGraph::GML | graph_option );\r\n               m_communicator->SetFileSet( infiles );\r\n            }\r\n            else if (ext == tr(\"RT1\")) {\r\n               m_communicator->SetOption( MetaGraph::RT1 | graph_option );\r\n               m_communicator->SetFileSet( infiles );\r\n            }\r\n         }\r\n         else {\r\n            int thedot = infiles[0].lastIndexOf('.');\r\n            QString infile2 = infiles[0].left(thedot+1) + tr(\"mid\");\r\n            m_communicator->SetInfile2( qPrintable(infile2));\r\n            CreateWaitDialog(tr(\"Importing file...\"));\r\n            m_communicator->SetFunction( CMSCommunicator::IMPORTMIF );\r\n         }\r\n         m_thread.render(this);\r\n      }\r\n   }\r\n   else if (ext == tr(\"TXT\") || ext == tr(\"CSV\")) {\r\n      std::ifstream file( infiles[0].toLatin1() );\r\n      if (file.fail()) {\r\n\t\t QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to read text file.\\nPlease check that another program is not using it.\"),\r\n             QMessageBox::Ok, QMessageBox::Ok);\r\n      }\r\n      else {\r\n         std::unique_ptr<Communicator> comm(new ICommunicator());\r\n         bool mapParsed = depthmapX::importFile(*m_meta_graph,\r\n                                                file,\r\n                                                comm.get(),\r\n                                                filepath.m_name.toStdString(),\r\n                                                depthmapX::ImportType::DATAMAP,\r\n                                                (ext == tr(\"CSV\")) ? depthmapX::ImportFileType::CSV : depthmapX::ImportFileType::TSV);\r\n         if(mapParsed) {\r\n            // This should have added a new data map:\r\n            SetUpdateFlag(NEW_TABLE);\r\n\r\n            if(graphHadNullBoundsBeforeImport) {\r\n                SetRedrawFlag(VIEW_ALL, REDRAW_TOTAL, NEW_TABLE);\r\n            } else {\r\n                SetRedrawFlag(VIEW_ALL, REDRAW_GRAPH, NEW_TABLE);\r\n            }\r\n         }\r\n         else {\r\n\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to import text file.\\n \\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tUnable to import text file.\\n\\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tDepthmap can import tab-delimited or comma separated files.\\n\\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tThere must be some spatial data.\\n\\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tThe spatial data can either be:\\n\\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tPoints with X and Y values, or\\n\\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpoints with Easting and Northing values, or\\n\\\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tlines with X1,Y1 and X2,Y2 values\"),\r\n                                                    QMessageBox::Ok, QMessageBox::Ok);\r\n         }\r\n      }\r\n   }\r\n   else {\r\n\t  QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unrecognised file format.  Sorry, unable to import this file.\"),\r\n         QMessageBox::Ok, QMessageBox::Ok);\r\n   }\r\n}\r\n\r\n// Export file types: .txt (point files)\r\n\r\nvoid QGraphDoc::OnFileExport() \r\n{\r\n   if (m_communicator) {\r\n\t QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n     return;  // Locked\r\n   }\r\n   if (m_meta_graph->viewingNone()) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;  // No graph to export\r\n   }\r\n\r\n   QString suffix;\r\n   int mode = -1;\r\n\r\n   int view_class = m_meta_graph->getViewClass();\r\n   if (view_class & MetaGraph::VIEWAXIAL) {\r\n       mode = 0;\r\n       suffix = m_meta_graph->getDisplayedShapeGraph().getName().c_str();\r\n   }\r\n   else if (view_class & MetaGraph::VIEWDATA) {\r\n       mode = 1;\r\n       suffix = m_meta_graph->getDisplayedDataMap().getName().c_str();\r\n   }\r\n   else if (view_class & MetaGraph::VIEWVGA) {\r\n      if (m_meta_graph->getDisplayedPointMap().isProcessed()) {\r\n          mode = 2;\r\n          suffix = tr(\"vga\");\r\n      }\r\n      else {\r\n         mode = 3;\r\n         suffix = tr(\"points\");\r\n      }\r\n   }\r\n\r\n   if (mode == -1) {\r\n      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, depthmapX does not support saving the currently displayed layer\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   suffix.replace(' ','_');\r\n\r\n   QFilePath path(m_opened_name);\r\n   QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n   QString template_string = tr(\"Tab-delimited text file (*.txt)\\n\");\r\n   if (mode < 3) {\r\n\t   template_string += tr(\"Comma separated values file (*.csv)\\n\");\r\n\t   template_string += tr(\"Graph file (*.graph)\\n\");\r\n\t   template_string += tr(\"MapInfo file (*.mif)\\n\");\r\n\t   template_string += tr(\"Pajek (*.net)\\n\");\r\n   }\r\n   template_string += tr(\"All files (*.*)\");\r\n\r\n   QFileDialog::Options options = 0;\r\n   QString selectedFilter;\r\n   QString outfile = QFileDialog::getSaveFileName(\r\n                               0, tr(\"Save Output As\"),\r\n                               defaultname,\r\n                               template_string,\r\n                               &selectedFilter,\r\n                               options);\r\n   if(outfile.isEmpty())\r\n   {\r\n\t\treturn;\r\n   }\r\n\r\n   FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n   fclose(fp);\r\n\r\n   QFilePath filepath(outfile);\r\n   QString ext = filepath.m_ext;\r\n\r\n   if (ext != tr(\"MIF\") && ext != tr(\"GRAPH\") && ext != tr(\"NET\")) \r\n   {\r\n       std::ofstream stream(outfile.toLatin1());\r\n       char delimiter = '\\t';\r\n       if (ext == tr(\"CSV\")) {\r\n          delimiter = ',';\r\n       }\r\n       if (stream.fail() || stream.bad()) {\r\n\t      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n          mode = -1;\r\n       }\r\n\r\n       switch (mode) {\r\n       case 0:\r\n          m_meta_graph->getDisplayedShapeGraph().output(stream, delimiter);\r\n          break;\r\n       case 1:\r\n          m_meta_graph->getDisplayedDataMap().output(stream, delimiter);\r\n          break;\r\n       case 2:\r\n          m_meta_graph->getDisplayedPointMap().outputSummary( stream, delimiter );\r\n          break;\r\n       case 3:\r\n          m_meta_graph->getDisplayedPointMap().outputPoints( stream, delimiter );\r\n          break;\r\n       default:\r\n          break;\r\n       }\r\n       stream.close();\r\n    }\r\n    else if (ext == tr(\"GRAPH\")) {\r\n        if (mode >= 3) {\r\n           QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, depthmapX only supports exporting VGA, axial and shape data to graph files\"), QMessageBox::Ok, QMessageBox::Ok);\r\n            return;\r\n        }\r\n\r\n        if (m_meta_graph->write(outfile.toStdString(), METAGRAPH_VERSION, true) != MetaGraph::OK) { // <- true writes current layer only\r\n\t        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n        }\r\n    }\r\n    else if (ext == tr(\"NET\")) {\r\n         if (mode != 0 && mode != 2) {\r\n            QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, depthmapX can only export VGA graphs or shape graphs to Pajek .net files\"), QMessageBox::Ok, QMessageBox::Ok);\r\n            return;\r\n         }\r\n         std::ofstream stream(outfile.toLatin1());\r\n         if (!stream) {\r\n\t        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n         }\r\n         else {\r\n            if (mode == 0) {\r\n               m_meta_graph->getDisplayedShapeGraph().outputNet(stream);\r\n            }\r\n            else if (mode == 2) {\r\n               m_meta_graph->getDisplayedPointMap().outputNet(stream);\r\n           }\r\n       }\r\n    }\r\n    else {\r\n         if (mode >= 3) {\r\n            QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, depthmapX currently only supports exporting VGA, axial and shape data to MapInfo tables\"), QMessageBox::Ok, QMessageBox::Ok);\r\n            return;\r\n         }\r\n\r\n         int thedot = outfile.indexOf('.');\r\n         QString outfile2 = outfile.left(thedot+1) + tr(\"mid\");\r\n\r\n         std::ofstream miffile(outfile.toLatin1());\r\n         if (miffile.fail() || miffile.bad()) {\r\n\t        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n            mode = -1;\r\n         }\r\n\r\n         std::ofstream midfile(outfile2.toLatin1());\r\n         if (midfile.fail() || midfile.bad()) {\r\n\t        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open associated .mid file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n            mode = -1;\r\n         }\r\n\r\n         if (mode == 0) {\r\n            m_meta_graph->getDisplayedShapeGraph().outputMifMap(miffile,midfile);\r\n         }\r\n         else if (mode == 1) {\r\n            m_meta_graph->getDisplayedDataMap().outputMifMap(miffile,midfile);\r\n         }\r\n         else if (mode == 2) {\r\n            m_meta_graph->getDisplayedPointMap().outputMif(miffile,midfile);\r\n        }\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::OnFileExportMapGeometry() {\r\n    if (m_communicator) {\r\n        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return; // Locked\r\n    }\r\n    if (m_meta_graph->viewingNone()) {\r\n        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return; // No graph to export\r\n    }\r\n\r\n    QString suffix;\r\n    int mode = -1;\r\n\r\n    int view_class = m_meta_graph->getViewClass();\r\n    if (view_class & MetaGraph::VIEWAXIAL) {\r\n        mode = 0;\r\n        suffix = m_meta_graph->getDisplayedShapeGraph().getName().c_str();\r\n    } else if (view_class & MetaGraph::VIEWDATA) {\r\n        mode = 1;\r\n        suffix = m_meta_graph->getDisplayedDataMap().getName().c_str();\r\n    }\r\n\r\n    if (mode == -1) {\r\n        QMessageBox::warning(this, tr(\"Notice\"),\r\n                             tr(\"Sorry, depthmapX does not support saving the currently displayed layer\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n    suffix.replace(' ', '_');\r\n\r\n    QFilePath path(m_opened_name);\r\n    QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n    QString template_string = tr(\"Chiron and Alasdair Transfer Format file (*.cat)\\n\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile =\r\n        QFileDialog::getSaveFileName(0, tr(\"Save Output As\"), defaultname, template_string, &selectedFilter, options);\r\n    if (outfile.isEmpty()) {\r\n        return;\r\n    }\r\n\r\n    FILE *fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    QFilePath filepath(outfile);\r\n    QString ext = filepath.m_ext;\r\n\r\n    if (ext == \"CAT\") {\r\n        std::ofstream stream(outfile.toLatin1());\r\n        if (stream.fail() || stream.bad()) {\r\n            QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok,\r\n                                 QMessageBox::Ok);\r\n            mode = -1;\r\n        }\r\n\r\n        switch (mode) {\r\n        case 0:\r\n            m_meta_graph->writeMapShapesAsCat(m_meta_graph->getDisplayedShapeGraph(), stream);\r\n            break;\r\n        case 1:\r\n            m_meta_graph->writeMapShapesAsCat(m_meta_graph->getDisplayedDataMap(), stream);\r\n            break;\r\n        default:\r\n            break;\r\n        }\r\n        stream.close();\r\n    }\r\n}\r\n\r\nvoid QGraphDoc::OnFileExportLinks()\r\n{\r\n    if (m_communicator) {\r\n        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n        return;  // Locked\r\n    }\r\n    if (m_meta_graph->viewingNone()) {\r\n        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n        return;  // No graph to export\r\n    }\r\n\r\n    QString suffix;\r\n    int mode = -1;\r\n\r\n    int view_class = m_meta_graph->getViewClass();\r\n    if (view_class & MetaGraph::VIEWAXIAL) {\r\n        mode = 5;\r\n        suffix = tr(\"unlinks\");\r\n    }\r\n    else if (view_class & MetaGraph::VIEWDATA) {\r\n        mode = 6;\r\n        suffix = tr(\"links\");\r\n    }\r\n    else if (view_class & MetaGraph::VIEWVGA) {\r\n        if (m_meta_graph->getDisplayedPointMap().isProcessed()) {\r\n            mode = 4;\r\n            suffix = tr(\"merge_lines\");\r\n        }\r\n    }\r\n\r\n    if (mode == -1) {\r\n        QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, depthmapX does not support saving the currently displayed layer\"), QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n    suffix.replace(' ','_');\r\n\r\n    QFilePath path(m_opened_name);\r\n    QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n    QString template_string = tr(\"Tab-delimited text file (*.txt)\\n\");\r\n    template_string += tr(\"Comma separated values file (*.csv)\\n\");\r\n    template_string += tr(\"All files (*.*)\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile = QFileDialog::getSaveFileName(\r\n                0, tr(\"Save Output As\"),\r\n                defaultname,\r\n                template_string,\r\n                &selectedFilter,\r\n                options);\r\n    if(outfile.isEmpty())\r\n    {\r\n        return;\r\n    }\r\n\r\n    FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    QFilePath filepath(outfile);\r\n    QString ext = filepath.m_ext;\r\n\r\n    std::ofstream stream(outfile.toLatin1());\r\n    char delimiter = '\\t';\r\n    if (ext == \"CSV\") {\r\n      delimiter = ',';\r\n    }\r\n    if (stream.fail() || stream.bad()) {\r\n      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      mode = -1;\r\n    }\r\n\r\n    switch (mode) {\r\n    case 0:\r\n      m_meta_graph->getDisplayedShapeGraph().output(stream, delimiter);\r\n      break;\r\n    case 1:\r\n      m_meta_graph->getDisplayedDataMap().output(stream, delimiter);\r\n      break;\r\n    case 2:\r\n      m_meta_graph->getDisplayedPointMap().outputSummary( stream, delimiter );\r\n      break;\r\n    case 3:\r\n      m_meta_graph->getDisplayedPointMap().outputPoints( stream, delimiter );\r\n      break;\r\n    case 4:\r\n      m_meta_graph->getDisplayedPointMap().outputMergeLines( stream, delimiter );\r\n      break;\r\n    case 5:\r\n      // note: specific to line graphs\r\n      m_meta_graph->getDisplayedShapeGraph().outputUnlinkPoints( stream, delimiter );\r\n      break;\r\n    default:\r\n      break;\r\n    }\r\n    stream.close();\r\n}\r\n\r\nvoid QGraphDoc::OnAxialConnectionsExportAsDot()\r\n{\r\n    if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;  // Locked\r\n    }\r\n    if (m_meta_graph->viewingNone()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;  // No graph to export\r\n    }\r\n\r\n    ShapeGraph& shapeGraph = m_meta_graph->getDisplayedShapeGraph();\r\n\r\n    QString suffix = tr(\"axial_connections\");\r\n\r\n    QFilePath path(m_opened_name);\r\n    QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n    QString template_string = tr(\"Dot graph file (*.dot)\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile = QFileDialog::getSaveFileName(\r\n                                0, tr(\"Save Output As\"),\r\n                                defaultname,\r\n                                template_string,\r\n                                &selectedFilter,\r\n                                options);\r\n    if(outfile.isEmpty())\r\n    {\r\n        return;\r\n    }\r\n\r\n    FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    std::ofstream stream(outfile.toLatin1());\r\n\r\n    if (stream.fail() || stream.bad()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;\r\n    }\r\n    shapeGraph.writeAxialConnectionsAsDotGraph(stream);\r\n\r\n    stream.close();\r\n}\r\n\r\nvoid QGraphDoc::OnAxialConnectionsExportAsPairCSV()\r\n{\r\n    if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;  // Locked\r\n    }\r\n    if (m_meta_graph->viewingNone()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;  // No graph to export\r\n    }\r\n\r\n    ShapeGraph& shapeGraph = m_meta_graph->getDisplayedShapeGraph();\r\n\r\n    QString suffix = tr(\"axial_connections\");\r\n\r\n    QFilePath path(m_opened_name);\r\n    QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n    QString template_string = tr(\"CSV graph file (*.csv)\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile = QFileDialog::getSaveFileName(\r\n                                0, tr(\"Save Output As\"),\r\n                                defaultname,\r\n                                template_string,\r\n                                &selectedFilter,\r\n                                options);\r\n    if(outfile.isEmpty())\r\n    {\r\n        return;\r\n    }\r\n\r\n    FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    std::ofstream stream(outfile.toLatin1());\r\n\r\n    if (stream.fail() || stream.bad()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;\r\n    }\r\n    shapeGraph.writeAxialConnectionsAsPairsCSV(stream);\r\n\r\n    stream.close();\r\n}\r\n\r\nvoid QGraphDoc::OnSegmentConnectionsExportAsPairCSV()\r\n{\r\n    if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;  // Locked\r\n    }\r\n    if (m_meta_graph->viewingNone()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;  // No graph to export\r\n    }\r\n\r\n    ShapeGraph& shapeGraph = m_meta_graph->getDisplayedShapeGraph();\r\n\r\n    QString suffix = tr(\"segment_connections\");\r\n\r\n    QFilePath path(m_opened_name);\r\n    QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n    QString template_string = tr(\"CSV graph file (*.csv)\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile = QFileDialog::getSaveFileName(\r\n                                0, tr(\"Save Output As\"),\r\n                                defaultname,\r\n                                template_string,\r\n                                &selectedFilter,\r\n                                options);\r\n    if(outfile.isEmpty())\r\n    {\r\n        return;\r\n    }\r\n\r\n    FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    std::ofstream stream(outfile.toLatin1());\r\n\r\n    if (stream.fail() || stream.bad()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;\r\n    }\r\n    shapeGraph.writeSegmentConnectionsAsPairsCSV(stream);\r\n\r\n    stream.close();\r\n}\r\n\r\nvoid QGraphDoc::OnPointmapExportConnectionsAsCSV()\r\n{\r\n    if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;  // Locked\r\n    }\r\n    if (m_meta_graph->viewingNone()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, cannot export as there is no data to export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;  // No graph to export\r\n    }\r\n    if (!(m_meta_graph->getViewClass() & MetaGraph::VIEWVGA)) {\r\n       QMessageBox::warning(this, tr(\"Error\"), tr(\"Make sure a Visibility Graph is visible\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;  // No graph to export\r\n    }\r\n    if (!m_meta_graph->viewingProcessedPoints()) {\r\n       QMessageBox::warning(this, tr(\"Error\"),\r\n                            tr(\"Make sure the visibility graph was created (Tools -> Visibility -> Make Visibility Graph)\"),\r\n                            QMessageBox::Ok, QMessageBox::Ok);\r\n       return;  // No graph to export\r\n    }\r\n\r\n    PointMap& pointMap = m_meta_graph->getDisplayedPointMap();\r\n\r\n    QString suffix = tr(\"connectivity\");\r\n\r\n    QFilePath path(m_opened_name);\r\n    QString defaultname = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name) + tr(\"_\") + suffix;\r\n\r\n    QString template_string = tr(\"CSV graph file (*.csv)\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile = QFileDialog::getSaveFileName(\r\n                                0, tr(\"Save Output As\"),\r\n                                defaultname,\r\n                                template_string,\r\n                                &selectedFilter,\r\n                                options);\r\n    if(outfile.isEmpty())\r\n    {\r\n        return;\r\n    }\r\n\r\n    FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    std::ofstream stream(outfile.toLatin1());\r\n\r\n    if (stream.fail() || stream.bad()) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, unable to open file for export\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;\r\n    }\r\n    pointMap.outputConnectionsAsCSV(stream, \",\");\r\n\r\n    stream.close();\r\n}\r\n\r\nvoid QGraphDoc::OnSwapColours() \r\n{\r\n   DisplayParams displayparams;\r\n   if (m_meta_graph->getViewClass() & MetaGraph::VIEWVGA ) {\r\n      displayparams = m_meta_graph->getDisplayedPointMap().getDisplayParams();\r\n      float blue = displayparams.blue;\r\n      displayparams.blue = displayparams.red;\r\n      displayparams.red = blue;\r\n      m_meta_graph->getDisplayedPointMap().setDisplayParams( displayparams );\r\n   }\r\n   else if (m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n      displayparams = m_meta_graph->getDisplayedShapeGraph().getDisplayParams();\r\n      float blue = displayparams.blue;\r\n      displayparams.blue = displayparams.red;\r\n      displayparams.red = blue;\r\n      m_meta_graph->getDisplayedShapeGraph().setDisplayParams( displayparams );\r\n   }\r\n   else if (m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n      displayparams = m_meta_graph->getDisplayedDataMap().getDisplayParams();\r\n      float blue = displayparams.blue;\r\n      displayparams.blue = displayparams.red;\r\n      displayparams.red = blue;\r\n      m_meta_graph->getDisplayedDataMap().setDisplayParams( displayparams );\r\n   }\r\n\r\n   SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, NEW_DEPTHMAPVIEW_SETUP);\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnEditGrid() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   bool newmap = false;\r\n\r\n   if (m_meta_graph->getPointMaps().empty() || m_meta_graph->getDisplayedPointMap().isProcessed()) {\r\n      // this can happen if there are no displayed maps -- so flag new map required:\r\n      newmap = true;\r\n   }\r\n   else if (m_meta_graph->getDisplayedPointMap().getFilledPointCount() != 0) {\r\n      if ( QMessageBox::Yes != QMessageBox::question(this, tr(\"depthmapX\"), tr(\"This will clear existing points.  Do you want to continue?\"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No) )\r\n         return;\r\n   }\r\n   QtRegion r = m_meta_graph->getRegion();\r\n   CGridDialog dlg(__max(r.width(), r.height()));\r\n   if (QDialog::Accepted == dlg.exec())\r\n   {\r\n      if (newmap) {\r\n         m_meta_graph->addNewPointMap();\r\n      }\r\n      m_meta_graph->setGrid( dlg.getSpacing(), Point2f(0.0f, 0.0f) );\r\n      m_meta_graph->m_showgrid = true;\r\n      SetUpdateFlag(NEW_TABLE);\r\n      SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH, NEW_DATA);\r\n   }\r\n}\r\n\r\n// AV TV // semifilled\r\nvoid QGraphDoc::OnFillPoints( const Point2f& p, int fill_type ) // semifilled = 0 (intention to use semifilled steps for part filled)\r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (~state & MetaGraph::LINEDATA) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, line drawing data must be loaded before points may be filled\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (~state & MetaGraph::POINTMAPS) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please make grid before filling\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (m_meta_graph->viewingProcessed()) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, once the graph has been constructed, more points may not be added\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   m_communicator = new CMSCommunicator();\r\n   m_communicator->SetSeedPoint( p );\r\n   m_communicator->SetOption( fill_type ); // AV TV\r\n   CreateWaitDialog(tr(\"Generating grid points...\"));\r\n   m_communicator->SetFunction( CMSCommunicator::MAKEPOINTS );\r\n\r\n   m_thread.render(this);\r\n}\r\n\r\n// convert any shape layer to any other (certain rules apply)\r\n\r\nvoid QGraphDoc::OnLayerConvert() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   CMakeLayerDlg dlg;\r\n\r\n   dlg.m_mapin = MAKELAYER_DATA;    // mapin is a data map (assume)\r\n   dlg.m_mapout = 0;   // no possible map out\r\n\r\n   if (m_meta_graph->viewingProcessedLines()) {\r\n      int type = m_meta_graph->getDisplayedShapeGraph().getMapType();\r\n      // map in is an axial map (of sorts, something with a graph...)\r\n      dlg.m_mapin = MAKELAYER_AXIAL;\r\n      dlg.m_origin = QString(\"Shape Graphs: \") + QString(m_meta_graph->getDisplayedShapeGraph().getName().c_str());\r\n      if (type == ShapeMap::AXIALMAP) {\r\n         // note, ShapeMap::ALLLINEMAP is deliberately excluded, as making a segment map from it would overproduce segments:\r\n         dlg.m_mapout = MAKELAYER_DRAWING | MAKELAYER_DATA | MAKELAYER_SEGMENT;\r\n      }\r\n      else {\r\n         // convex, segment, pesh and all line maps cannot be converted to segment maps:\r\n         dlg.m_mapout = MAKELAYER_DRAWING | MAKELAYER_DATA;\r\n      }\r\n   }\r\n   else if (m_meta_graph->viewingProcessedShapes()) {\r\n      //\r\n      dlg.m_origin = QString(\"Data Maps: \") + QString(m_meta_graph->getDisplayedDataMap().getName().c_str());\r\n      // possible to go to anything apart from a data map\r\n      dlg.m_mapout = MAKELAYER_DRAWING | MAKELAYER_AXIAL | MAKELAYER_CONVEX | MAKELAYER_SEGMENT;\r\n   }\r\n\r\n   if (dlg.m_mapout != 0 && QDialog::Accepted == dlg.exec()) {\r\n      m_communicator = new CMSCommunicator();\r\n      m_communicator->SetString( dlg.m_layer_name );\r\n      m_communicator->SetOption( dlg.m_keeporiginal ? 1 : 0, 0);  // <- option 0 used for retain original flag\r\n      m_communicator->SetOption( dlg.m_push_values ? 1 : 0, 1);   // <- option 1 used for push values flag\r\n      //\r\n      if (dlg.m_mapout == MAKELAYER_DRAWING) {\r\n         // this one new: data or graph (any sort) -> drawing\r\n         m_communicator->SetOption( dlg.m_mapin == MAKELAYER_DATA ? 0 : 1, 1); // <- option 1 in this case signifies base as graph or data\r\n         // (option 1 overidden, as data cannot be pushed to a drawing layer)\r\n         CreateWaitDialog(tr(\"Constructing segment map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKEDRAWING );\r\n      }\r\n      if (dlg.m_mapout == MAKELAYER_DATA) {\r\n         // this one new: graph (any sort) -> data\r\n         CreateWaitDialog(tr(\"Constructing segment map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKEGATESMAP );\r\n      }\r\n      else if (dlg.m_mapout == MAKELAYER_CONVEX) {\r\n         // this one new: data -> convex map\r\n         CreateWaitDialog(tr(\"Constructing convex map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKECONVEXMAP );\r\n      }\r\n      else if (dlg.m_mapout == MAKELAYER_AXIAL) {\r\n         // this one originally data -> axial map\r\n         CreateWaitDialog(tr(\"Constructing axial map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKEUSERMAPSHAPE );\r\n      }\r\n      else if (dlg.m_mapout == MAKELAYER_SEGMENT) { \r\n         if (dlg.m_mapin == MAKELAYER_AXIAL) {\r\n            // this one originally axial -> segment map\r\n            // use option 2 to specify percentage removal\r\n            m_communicator->SetOption( dlg.m_remove_stubs ? dlg.m_percentage : 0, 2);\r\n            CreateWaitDialog(tr(\"Constructing segment map...\"));\r\n            m_communicator->SetFunction( CMSCommunicator::MAKESEGMENTMAP );\r\n         }\r\n         else {\r\n            // this one originally data -> segment map\r\n            CreateWaitDialog(tr(\"Constructing segment map...\"));\r\n            m_communicator->SetFunction( CMSCommunicator::MAKEUSERSEGMAPSHAPE );\r\n         }\r\n      }\r\n\t  m_thread.render(this);      \r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnLayerConvertDrawing() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   CMakeLayerDlg dlg;\r\n\r\n   dlg.m_mapin = MAKELAYER_DRAWING;    // mapin is a drawing map\r\n   dlg.m_mapout = MAKELAYER_DATA | MAKELAYER_AXIAL | MAKELAYER_CONVEX | MAKELAYER_SEGMENT;\r\n   dlg.m_origin = QString(tr(\"Drawing Layers: All Displayed\"));\r\n\r\n   if (QDialog::Accepted == dlg.exec()) {\r\n      m_communicator = new CMSCommunicator();\r\n      m_communicator->SetString( dlg.m_layer_name );\r\n      m_communicator->SetOption( dlg.m_keeporiginal ? 1 : 0, 0);  // <- option 0 used for retain original flag\r\n      m_communicator->SetOption( -1, 1);  // this is used to distinguish between 0 or 1 used when converting data layer\r\n      //\r\n      if (dlg.m_mapout == MAKELAYER_DATA) {\r\n         // this one originally drawing -> data map\r\n         CreateWaitDialog(tr(\"Constructing data map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKEGATESMAP );\r\n      }\r\n      else if (dlg.m_mapout == MAKELAYER_AXIAL) {\r\n         // this one originally drawing -> axial map\r\n         CreateWaitDialog(tr(\"Constructing axial map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKEUSERMAP );\r\n      }\r\n      else if (dlg.m_mapout == MAKELAYER_CONVEX) {\r\n         // this one new: drawing -> convex map\r\n         CreateWaitDialog(tr(\"Constructing convex map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKECONVEXMAP );\r\n      }\r\n      else if (dlg.m_mapout == MAKELAYER_SEGMENT) {\r\n         // this one originally drawing -> seg map\r\n         CreateWaitDialog(tr(\"Constructing segment map...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::MAKEUSERSEGMAP );\r\n      }\r\n      m_thread.render(this);     \r\n   }\r\n}\r\n\r\n\r\n// arbitrary isovist\r\nvoid QGraphDoc::OnMakeIsovist(const Point2f& seed, double angle)\r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (~state & MetaGraph::LINEDATA) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, line drawing data must be loaded before an isovist can be constructed\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   m_communicator = new CMSCommunicator();\r\n   m_communicator->SetSeedPoint(seed);\r\n   m_communicator->SetSeedAngle(angle);\r\n\r\n   if (angle >= 0) {\r\n       CIsovistPathDlg dlg;\r\n       if (dlg.exec() == QDialog::Accepted) {\r\n           m_communicator->SetSeedFoV(dlg.fov_angle);\r\n       }\r\n   }\r\n\r\n   CreateWaitDialog(tr(\"Constructing BSP tree to calculate isovist...\"));\r\n   m_communicator->SetFunction(CMSCommunicator::MAKEISOVIST);\r\n\r\n   m_thread.render(this);\r\n}\r\n\r\nvoid QGraphDoc::OnToolsIsovistpath()\r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (state & MetaGraph::LINEDATA) {\r\n      int view = m_meta_graph->getViewClass();\r\n      if ((view & (MetaGraph::VIEWDATA | MetaGraph::VIEWAXIAL)) != 0 && m_meta_graph->isSelected()) {\r\n         CIsovistPathDlg dlg;\r\n\t\t if (dlg.exec() == QDialog::Accepted) {\r\n            double angle = dlg.fov_angle;\r\n            m_communicator = new CMSCommunicator();\r\n            m_communicator->SetSeedAngle( angle );\r\n            CreateWaitDialog(tr(\"Constructing BSP tree to calculate isovists...\"));\r\n            m_communicator->SetFunction( CMSCommunicator::MAKEISOVISTPATH );\r\n            m_thread.render(this);\r\n         }\r\n      }\r\n      else {\r\n         // an explanation of what you need to do as it isn't obvious!\r\n\t\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"To get a path you will need some lines for a path.\\nTo do so, have an active map which is either a data map or line map of some sort.\\nNext, select lines or polylines that you wish to turn into isovist paths.\\nThere is no need for you to have a grid set.\\n\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      }\r\n   }\r\n}\r\n\r\n\r\n\r\n// all line map\r\nvoid QGraphDoc::OnToolsAxialMap(const Point2f& seed) \r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (~state & MetaGraph::LINEDATA) {\r\n\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, line drawing data must be loaded before an axial map can be constructed\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   if (m_meta_graph->hasAllLineMap()) {\r\n\t  int ret = QMessageBox::warning(this, tr(\"My Application\"),\r\n\t\t\t\t\t\t\t\t\t\ttr(\"This will overwrite your existing all-line map, do you want to continue?\"),\r\n\t\t\t\t\t\t\t\t\t\tQMessageBox::Yes | QMessageBox::No\r\n\t\t\t\t\t\t\t\t\t\t| QMessageBox::Yes,\r\n\t\t\t\t\t\t\t\t\t\tQMessageBox::No);\r\n\t  if(ret != QMessageBox::Yes) return;\r\n   }\r\n\r\n   // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n   m_communicator = new CMSCommunicator();\r\n   m_communicator->SetSeedPoint( seed );\r\n   CreateWaitDialog(tr(\"Constructing all line axial map...\"));\r\n   m_communicator->SetFunction( CMSCommunicator::MAKEALLLINEMAP );\r\n   m_thread.render(this);\r\n}\r\n\r\n// fewest line map\r\nvoid QGraphDoc::OnToolsMakeFewestLineMap() \r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (~state & MetaGraph::SHAPEGRAPHS) {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Sorry, all line map must exist in order to construct fewest line map\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   else if (!m_meta_graph->hasAllLineMap()) {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Sorry, all line map must exist in order to construct fewest line map\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   int replace = 0;\r\n\r\n   // check for existing axial maps and warn user if necessary:\r\n   if (m_meta_graph->hasFewestLineMaps()) {\r\n      CPromptReplace dlg;\r\n      dlg.m_message = tr(\"There is already a fewest line axial map, would you like to add to it or replace it?\");\r\n      int result = dlg.exec();\r\n\t  if (result == QDialog::Rejected) {\r\n         return;\r\n      }\r\n      else if (result == 2) {\r\n         replace = 1;\r\n      }\r\n   }\r\n\r\n   // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n   m_communicator = new CMSCommunicator();\r\n   CreateWaitDialog(tr(\"Constructing fewest line axial map...\"));\r\n   m_communicator->SetFunction( CMSCommunicator::MAKEFEWESTLINEMAP );\r\n   m_communicator->SetOption( replace );\r\n   m_thread.render(this);\r\n}\r\n\r\nvoid QGraphDoc::OnToolsRunAxa() \r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   CAxialAnalysisOptionsDlg dlg(m_meta_graph);\r\n\r\n   if (QDialog::Accepted == dlg.exec()) {\r\n      m_communicator = new CMSCommunicator();\r\n      CreateWaitDialog(tr(\"Performing axial line analysis...\"));\r\n      m_communicator->SetFunction( CMSCommunicator::AXIALANALYSIS );\r\n      m_thread.render(this);\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnToolsRunSeg() \r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   CSegmentAnalysisDlg dlg(m_meta_graph);\r\n\r\n   if (QDialog::Accepted == dlg.exec()) {\r\n      m_communicator = new CMSCommunicator();\r\n      CreateWaitDialog(tr(\"Performing segment line analysis...\"));\r\n      m_communicator->SetFunction( dlg.m_analysis_type == 1 ? CMSCommunicator::SEGMENTANALYSISANGULAR :\r\n                                                              CMSCommunicator::SEGMENTANALYSISTULIP );\r\n      m_thread.render(this);\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnToolsTopomet()\r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   CTopoMetDlg dlg;\r\n\r\n   if (QDialog::Accepted == dlg.exec()) {\r\n      m_communicator = new CMSCommunicator();\r\n      ((MainWindow*)m_mainFrame)->m_options.output_type = dlg.m_topological;\r\n      ((MainWindow*)m_mainFrame)->m_options.radius = dlg.m_dradius;\r\n      ((MainWindow*)m_mainFrame)->m_options.sel_only = dlg.m_selected_only;\r\n      if (dlg.isAnalysisTopological()) {\r\n         CreateWaitDialog(tr(\"Performing topological analysis...\"));\r\n      }\r\n      else {\r\n         CreateWaitDialog(tr(\"Performing metric analysis...\"));\r\n      }\r\n      m_communicator->SetFunction( CMSCommunicator::TOPOMETANALYSIS );\r\n      m_thread.render(this);\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// New agent functionality:\r\n\r\nvoid QGraphDoc::OnToolsAgentRun() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   AgentEngine& eng = m_meta_graph->getAgentEngine();\r\n\r\n   // set up eng here...\r\n   if (!eng.agentSets.size()) {\r\n      eng.agentSets.push_back(AgentSet());\r\n   }\r\n\r\n   CAgentAnalysisDlg dlg;\r\n   dlg.m_timesteps = eng.m_timesteps;\r\n   dlg.m_release_rate = eng.agentSets.back().m_release_rate;\r\n   dlg.m_release_location = eng.agentSets.back().m_release_locations.size() ? 1 : 0;\r\n   dlg.m_frames = eng.agentSets.back().m_lifetime;\r\n   if (eng.agentSets.back().m_vbin == -1) {\r\n      dlg.m_fov = 32;\r\n   }\r\n   else {\r\n      dlg.m_fov = eng.agentSets.back().m_vbin * 2 + 1;\r\n   }\r\n   dlg.m_steps = eng.agentSets.back().m_steps;\r\n   dlg.m_record_trails = eng.m_record_trails;\r\n   dlg.m_trail_count = eng.m_trail_count;\r\n   dlg.m_names.push_back(\"<None>\");\r\n   for (size_t i = 0; i < m_meta_graph->getDataMaps().size(); i++) {\r\n       dlg.m_names.push_back(m_meta_graph->getDataMaps()[i].getName());\r\n   }\r\n   dlg.m_gatelayer = eng.m_gatelayer;\r\n\r\n   if (QDialog::Accepted != dlg.exec()) {\r\n      return;\r\n   }\r\n\r\n   eng.m_timesteps = dlg.m_timesteps;\r\n   eng.agentSets.back().m_release_rate = dlg.m_release_rate;\r\n   eng.agentSets.back().m_lifetime = dlg.m_frames;\r\n   if (dlg.m_fov == 32) {\r\n      eng.agentSets.back().m_vbin = -1;\r\n   }\r\n   else {\r\n      eng.agentSets.back().m_vbin = (dlg.m_fov - 1) / 2;\r\n   }\r\n   eng.agentSets.back().m_steps = dlg.m_steps;\r\n   if (dlg.m_occlusion == 0) {\r\n      eng.agentSets.back().m_sel_type = AgentProgram::SEL_STANDARD;\r\n   }\r\n   else if (dlg.m_occlusion == 1) {\r\n      eng.agentSets.back().m_sel_type = AgentProgram::SEL_LOS;\r\n   }\r\n   else if (dlg.m_occlusion == 2) {\r\n      eng.agentSets.back().m_sel_type = AgentProgram::SEL_LOS_OCC;\r\n   }\r\n   else {\r\n      // (dlg.m_occlusion - 2) should be from 1...8\r\n      eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCCLUSION + (dlg.m_occlusion - 2);\r\n   }\r\n   if (dlg.m_release_location == 1) {\r\n      std::set<int> selected = m_meta_graph->getSelSet();\r\n      std::copy(selected.begin(), selected.end(), std::back_inserter(eng.agentSets.back().m_release_locations));;\r\n   }\r\n   else {\r\n      eng.agentSets.back().m_release_locations.clear();\r\n   }\r\n   eng.m_gatelayer = dlg.m_gatelayer;\r\n\r\n   // note, trails currently per run, but output per engine\r\n   if (dlg.m_record_trails) {\r\n      eng.m_record_trails = true;\r\n      eng.m_trail_count = dlg.m_trail_count;\r\n   }\r\n\r\n   // then go:\r\n\r\n   m_communicator = new CMSCommunicator();\r\n   CreateWaitDialog(tr(\"Performing agent analysis...\"));\r\n   m_communicator->SetFunction( CMSCommunicator::AGENTANALYSIS );\r\n\r\n   m_thread.render(this);\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnEditUndo() \r\n{\r\n\tif (!m_meta_graph->canUndo()) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Sorry, no undo available for this map\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\treturn;\r\n\t}\r\n\r\n\tm_meta_graph->undo();\r\n\tmodifiedFlag = true;\r\n\tSetRedrawFlag(VIEW_ALL, REDRAW_GRAPH, NEW_DATA );\r\n}\r\n\r\n\r\nvoid QGraphDoc::OnEditClear() \r\n{\r\n   int state = m_meta_graph->getState();\r\n\r\n   int editable = m_meta_graph->isEditable();\r\n   if (editable == MetaGraph::NOT_EDITABLE) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot delete: the geometry forming this graph cannot be edited.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   else if (editable == MetaGraph::EDITABLE_OFF) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot delete: this graph is currently uneditable.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   bool modified = false;\r\n   if (m_meta_graph->viewingUnprocessedPoints()) {\r\n      modified = m_meta_graph->clearPoints();\r\n   }\r\n   else if (m_meta_graph->viewingProcessedLines()) {\r\n      modified = m_meta_graph->getDisplayedShapeGraph().removeSelected();\r\n   }\r\n   else if (m_meta_graph->viewingProcessedShapes()) {\r\n      modified = m_meta_graph->getDisplayedDataMap().removeSelected();\r\n   }\r\n\r\n   if(modified) {\r\n       modifiedFlag = true;\r\n   }\r\n\r\n   SetRedrawFlag(VIEW_ALL, REDRAW_GRAPH, NEW_DATA );\r\n}\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnToolsMakeGraph() \r\n{\r\n   int state = m_meta_graph->getState();\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   if (!m_meta_graph->viewingUnprocessedPoints()) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Sorry, you need an unprocessed set of points to make the visibility graph\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   CMakeOptionsDlg dlg;\r\n   dlg.m_boundarygraph = false;\r\n   if (dlg.exec() != QDialog::Accepted) {\r\n      return;\r\n   }\r\n   if (dlg.m_boundarygraph) {\r\n      m_make_algorithm = 1;\r\n   }\r\n   else {\r\n      m_make_algorithm = 0;\r\n   }\r\n   if (dlg.m_restrict_visibility) {\r\n      m_make_maxdist = dlg.m_maxdist;\r\n   }\r\n   else {\r\n      m_make_maxdist = -1.0;\r\n   }\r\n \r\n   m_communicator = new CMSCommunicator();\r\n   CreateWaitDialog(tr(\"Constructing graph...\"));\r\n   m_communicator->SetFunction( CMSCommunicator::MAKEGRAPH );\r\n\r\n   m_thread.render(this);\r\n}\r\n\r\nvoid QGraphDoc::OnToolsUnmakeGraph()\r\n{\r\n    int state = m_meta_graph->getState();\r\n    if (m_communicator) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;\r\n    }\r\n    if (~state & MetaGraph::POINTMAPS) {\r\n       QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please make grid before filling\"), QMessageBox::Ok, QMessageBox::Ok);\r\n       return;\r\n    }\r\n    if (m_meta_graph->viewingProcessed()) {\r\n       if ( QMessageBox::Yes != QMessageBox::question(this, tr(\"Notice\"),\r\n                                                      tr(\"This will clear existing data and attributes. Do you want to continue?\"),\r\n                                                      QMessageBox::Yes|QMessageBox::No, QMessageBox::No) )\r\n        return;\r\n    }\r\n    bool removeLinks = false;\r\n    if(m_meta_graph->getDisplayedPointMap().getMergedPixelPairs().size() > 0) {\r\n        removeLinks = QMessageBox::Yes == QMessageBox::question(this, tr(\"Notice\"),\r\n                                                                     tr(\"Would you also like to clear the links?\"),\r\n                                                                     QMessageBox::Yes|QMessageBox::No, QMessageBox::No);\r\n    }\r\n    bool ok = m_meta_graph->unmakeGraph(removeLinks);\r\n    if (ok) {\r\n       SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n    }\r\n    SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnToolsRun() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another task is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   // This is easy!\r\n   COptionsDlg dlg;\r\n\r\n   dlg.m_layer_names.push_back(\"<None>\");\r\n   for (auto& dataMap: m_meta_graph->getDataMaps()) {\r\n       dlg.m_layer_names.push_back(dataMap.getName());\r\n   }\r\n\r\n   if (QDialog::Accepted != dlg.exec()) {\r\n      return;\r\n   }\r\n\r\n   // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n   m_communicator = new CMSCommunicator();\r\n   CreateWaitDialog(tr(\"Analysing graph...\"));\r\n   m_communicator->SetFunction( CMSCommunicator::ANALYSEGRAPH );\r\n\r\n   m_thread.render(this);\r\n}\r\n\r\nvoid QGraphDoc::OnToolsPD() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   if (m_meta_graph->viewingProcessed()) {\r\n      if (m_meta_graph->isSelected()) {\r\n\r\n         // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n         m_communicator = new CMSCommunicator();\r\n         CreateWaitDialog(tr(\"Calculating step depth...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::POINTDEPTH );\r\n\r\n         m_thread.render(this);\r\n      }\r\n   }\r\n}\r\n\r\n\r\nvoid QGraphDoc::OnToolsMPD() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   if (m_meta_graph->viewingProcessedPoints() || (m_meta_graph->viewingProcessedLines() && m_meta_graph->getDisplayedShapeGraph().isSegmentMap())) {\r\n      if (m_meta_graph->isSelected()) {\r\n\r\n         // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n         m_communicator = new CMSCommunicator();\r\n         CreateWaitDialog(tr(\"Calculating metric depth...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::METRICPOINTDEPTH );\r\n\r\n         m_thread.render(this);\r\n      }\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnToolsAPD() \r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   if (m_meta_graph->viewingProcessedPoints()) {\r\n      if (m_meta_graph->isSelected()) {\r\n\r\n         // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n         m_communicator = new CMSCommunicator();\r\n         CreateWaitDialog(tr(\"Calculating angular depth...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::ANGULARPOINTDEPTH );\r\n\r\n         m_thread.render(this);\r\n      }\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnToolsTPD()\r\n{\r\n   if (m_communicator) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   if (m_meta_graph->viewingProcessedLines() && m_meta_graph->getDisplayedShapeGraph().isSegmentMap()) {\r\n      if (m_meta_graph->isSelected()) {\r\n\r\n         // This is easy too... too easy... hmm... crossed-fingers, here goes:\r\n         m_communicator = new CMSCommunicator();\r\n         CreateWaitDialog(tr(\"Calculating topological depth...\"));\r\n         m_communicator->SetFunction( CMSCommunicator::TOPOLOGICALPOINTDEPTH );\r\n\r\n         m_thread.render(this);\r\n      }\r\n   }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\nstatic int sequenceNumber = 1;\r\nbool QGraphDoc::OnNewDocument()\r\n{\r\n\tm_base_title = tr(\"Untitled%1\").arg(sequenceNumber++);\r\n\t\r\n\tSetRemenuFlag(QGraphDoc::VIEW_ALL, true);\r\n\treturn TRUE;\r\n}\r\n\r\nint QGraphDoc::OnOpenDocument(char* lpszPathName) \r\n{\r\n   if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return FALSE;\r\n   }\r\n\r\n   m_opened_name = QString(lpszPathName);\r\n\r\n   int ok = m_meta_graph->readFromFile( lpszPathName );\r\n   QFilePath path(m_opened_name);\r\n\r\n   SetUpdateFlag(QGraphDoc::NEW_FILE,false);\r\n   int ret = FALSE;\r\n\r\n   switch (ok) {\r\n   case MetaGraph::OK:\r\n\t  m_base_title = path.m_name;\r\n      ret = TRUE;\r\n      break;\r\n   case MetaGraph::WARN_BUGGY_VERSION:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"this graph was made with a version of depthmapX that contained slight errors\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      ret = TRUE;\r\n      break;\r\n   case MetaGraph::WARN_CONVERTED:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Warning: this graph was made with an older version of depthmapX.\\n\" \\\r\n          \"Some aspects of the graph may not have been translated to the new depthmapX properly.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      ret = TRUE;\r\n      break;\r\n   case MetaGraph::NOT_A_GRAPH:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to open graph: not recognised as a graph file.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      break;\r\n   case MetaGraph::DAMAGED_FILE:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to open graph: the graph file is damaged.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      break;\r\n   case MetaGraph::DISK_ERROR:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to open graph: an error occurred while trying to read from the disk.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      break;\r\n   case MetaGraph::NEWER_VERSION:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to open graph: this graph has been written by a newer version of depthmapX.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      break;\r\n   case MetaGraph::DEPRECATED_VERSION:\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to open graph: this is a graph file format not supported by this version of depthmapX.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      break;\r\n   default:\r\n      {\r\n         std::string err = dXstring::formatString(ok);\r\n         QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to open graph: error number \"), QMessageBox::Ok, QMessageBox::Ok);\r\n      }\r\n      break;\r\n   }\r\n\r\n   return ret;\r\n}\r\n\r\nbool QGraphDoc::OnFileSave()\r\n{\r\n\tQString newName = m_opened_name;\r\n\tif (newName.isEmpty()) {\r\n        newName = m_base_title + tr(\".graph\");\r\n\t\tQFileDialog::Options options = 0;\r\n\t\tQString outfile = QFileDialog::getSaveFileName(\r\n\t\t\t\t\t\t\t\t   0, tr(\"Save As\"),\r\n\t\t\t\t\t\t\t\t   newName,\r\n\t\t\t\t\t\t\t\t   tr(\"Graph file (*.graph)\\nAll files (*.*)\"),\r\n\t\t\t\t\t\t\t\t   0,\r\n\t\t\t\t\t\t\t\t   options);\r\n        if (outfile.isEmpty()) return false;\r\n\r\n\t\tm_opened_name = outfile;\r\n\r\n        FILE* fp = fopen(m_opened_name.toLatin1(), \"wb\");\r\n\t\tfclose(fp);\r\n\r\n        OnSaveDocument(outfile);\r\n\r\n        QFilePath path(m_opened_name);\r\n        m_base_title = path.m_name;\r\n        return true;\r\n\t}\r\n\t\r\n    OnSaveDocument(newName);\r\n    return true;\r\n}\r\n\r\nbool QGraphDoc::OnFileSaveAs()\r\n{\r\n   // This is based on Microsoft's \"DoSave\" function, but\r\n   // it allows two options for saving: one as the current \r\n   // graph format, and one as the original\r\n\r\n\tQString newName = m_opened_name;\r\n \tif (newName.isEmpty()) {\r\n       newName = m_base_title + tr(\".graph\");\r\n\t}\r\n\r\n\tQFileDialog::Options options = 0;\r\n\tQString outfile = QFileDialog::getSaveFileName(\r\n                               0, tr(\"Save As\"),\r\n                               newName,\r\n                               tr(\"Graph file (*.graph)\\ndepthmapX 8 graph (*.graph)\\nAll files (*.*)\"),\r\n                               0,\r\n                               options);\r\n\r\n\tif (outfile.isEmpty())\r\n        return false;\r\n\r\n    FILE* fp = fopen(outfile.toLatin1(), \"wb\");\r\n\tfclose(fp);\r\n\r\n    OnSaveDocument(outfile.toLatin1());\r\n\t\r\n\t// reset the title and change the document name\r\n    m_opened_name = outfile;\r\n    QFilePath path(m_opened_name);\r\n    m_base_title = path.m_name;\r\n    return true;\r\n}\r\n\r\nint QGraphDoc::OnSaveDocument(QString lpszPathName) \r\n{\r\n   // default: save in current version format\r\n   int version = m_meta_graph->getVersion();\r\n   // version == -1 is unsaved, which is fine to save in current version\r\n   if (version != -1 && version != METAGRAPH_VERSION) {\r\n      if(QMessageBox::Yes == QMessageBox::question(this, tr(\"depthmapX\"), tr(\"This will overwrite the file with the latest graph format, which may not be readable by previous versions of depthmapX.\\nDo you want to overwrite it?\"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No))\r\n         return OnSaveDocument(lpszPathName, METAGRAPH_VERSION);\r\n      else return TRUE;\r\n   }\r\n   return OnSaveDocument(lpszPathName, METAGRAPH_VERSION);\r\n}\r\n\r\nint QGraphDoc::OnSaveDocument(QString lpszPathName, int version)\r\n{\r\n   if (m_communicator) {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return FALSE;\r\n   }\r\n\r\n   if (m_meta_graph->getState() & MetaGraph::BUGGY) {\r\n      if(QMessageBox::No == QMessageBox::question(this, tr(\"depthmapX\"), tr(\"This graph file was created by a version of depthmapX with slight errors.  Are you sure you want to save it?\"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No))\r\n         return FALSE;\r\n   }\r\n\r\n   modifiedFlag = true;\r\n\r\n   int ok = m_meta_graph->write( lpszPathName.toStdString(), version );\r\n   if (ok == MetaGraph::OK) {\r\n\t   modifiedFlag = false;\r\n      return TRUE;\r\n   }\r\n   else if (ok == MetaGraph::DISK_ERROR) {\r\n      QMessageBox::warning(this, tr(\"Warning\"), tr(\"Unable to save graph: is there enough disk space?\"), QMessageBox::Ok, QMessageBox::Ok);\r\n   }\r\n\r\n   return FALSE;\r\n}\r\n\r\nbool QGraphDoc::OnCloseDocument(int index) \r\n{\r\n    if (m_communicator) {\r\n        QMessageBox::warning(this, tr(\"Warning\"), tr(\"depthmapX is processing, please kill the process to continue\"), QMessageBox::Ok, QMessageBox::Ok);\r\n        return false;\r\n    }\r\n    int i;\r\n    for (i = 1; i < VIEW_TYPES; i++) if (m_view[i]) break;\r\n\r\n\r\n    if(modifiedFlag)\r\n    {\r\n        int result = QMessageBox::question(this, tr(\"depthmapX\"), tr(\"Do you want to save the changes?\"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, QMessageBox::Cancel);\r\n        if(QMessageBox::Yes == result)\r\n        {\r\n            OnFileSave();\r\n            if (i == VIEW_TYPES)\r\n            {\r\n                modifiedFlag = false;\r\n                QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_DESTROYALL));\r\n            }\r\n            return true;\r\n        }\r\n        else if (QMessageBox::No == result)\r\n        {\r\n            if (i == VIEW_TYPES)\r\n            {\r\n                modifiedFlag = false;\r\n                QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_DESTROYALL));\r\n            }\r\n            return true;\r\n        }\r\n        else\r\n            return false;\r\n    }\r\n    if (i == VIEW_TYPES)\r\n    {\r\n        QApplication::postEvent((QObject*)m_mainFrame, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)this, CONTROLS_DESTROYALL));\r\n    }\r\n    return true;\r\n}\r\n\r\nvoid QGraphDoc::OnPushToLayer() \r\n{\r\n   if (m_meta_graph->viewingProcessed()) {\r\n      int toplayerclass = (m_meta_graph->getViewClass() & MetaGraph::VIEWFRONT);\r\n      std::string origin_layer;\r\n      std::string origin_attribute;\r\n      std::map<std::pair<int, int>, std::string> names;\r\n      // I'm just going to allow push from any layer to any other layer\r\n      // (apart from VGA graphs, which cannot map onto themselves\r\n      if (toplayerclass == MetaGraph::VIEWVGA) {\r\n         // bit clunky just to get two names out...\r\n         PointMap& map = m_meta_graph->getDisplayedPointMap();\r\n         origin_layer = std::string(\"Visibility Graphs: \") + map.getName();\r\n         origin_attribute = map.getAttributeTable().getColumnName(map.getDisplayedAttribute());\r\n      }\r\n      else if (toplayerclass == MetaGraph::VIEWAXIAL) {\r\n         // bit clunky just to get two names out...\r\n         ShapeGraph& map = m_meta_graph->getDisplayedShapeGraph();\r\n         origin_layer = std::string(\"Shape Graphs: \") + map.getName();\r\n         origin_attribute = map.getAttributeTable().getColumnName(map.getDisplayedAttribute());\r\n      }\r\n      else if (toplayerclass == MetaGraph::VIEWDATA) {\r\n         // bit clunky just to get two names out...\r\n         ShapeMap& map = m_meta_graph->getDisplayedDataMap();\r\n         origin_layer = std::string(\"Data Maps: \") + map.getName();\r\n         origin_attribute = map.getAttributeTable().getColumnName(map.getDisplayedAttribute());\r\n      }\r\n      else {\r\n         // eek!\r\n\t\t  QMessageBox::warning(this, tr(\"Warning\"), tr(\"No valid map displayed from which to push data\"), QMessageBox::Ok, QMessageBox::Ok);\r\n         return;\r\n      }\r\n      // layers to push to:\r\n      size_t i;\r\n      std::vector<ShapeMap>& datamaps = m_meta_graph->getDataMaps();\r\n      for (i = 0; i < datamaps.size(); i++) {\r\n         if (toplayerclass != MetaGraph::VIEWDATA || i != m_meta_graph->getDisplayedDataMapRef()) {\r\n            names.insert(std::make_pair(std::pair<int, int>(MetaGraph::VIEWDATA,int(i)),std::string(\"Data Maps: \") + datamaps[i].getName()));\r\n         }\r\n      }\r\n      auto& shapegraphs = m_meta_graph->getShapeGraphs();\r\n      for (i = 0; i < shapegraphs.size(); i++) {\r\n         if (toplayerclass != MetaGraph::VIEWAXIAL || i != m_meta_graph->getDisplayedShapeGraphRef()) {\r\n            names.insert(std::make_pair(std::pair<int, int>(MetaGraph::VIEWAXIAL,int(i)),\r\n                                        std::string(\"Shape Graphs: \") + shapegraphs[i]->getName()));\r\n         }\r\n      }\r\n      for (i = 0; i < m_meta_graph->getPointMaps().size(); i++) {\r\n         // note 1: no VGA graph can push to another VGA graph (point onto point transforms)\r\n         if (toplayerclass != MetaGraph::VIEWVGA) {\r\n            names.insert(std::make_pair(std::pair<int, int>(MetaGraph::VIEWVGA,int(i)),std::string(\"Visibility Graphs: \") + m_meta_graph->getPointMaps()[i].getName()));\r\n         }\r\n      }\r\n      CPushDialog dlg(names);\r\n      dlg.m_origin_layer = QString(origin_layer.c_str());\r\n      dlg.m_origin_attribute = QString(origin_attribute.c_str());\r\n\t  if (QDialog::Accepted == dlg.exec()) {\r\n         m_communicator = new CMSCommunicator;   // dummy value to prevent draw while this operation is in progress\r\n         // now have to separate vga and axial layers again:\r\n         int sel = dlg.m_layer_selection;\r\n         std::pair<int, int> dest = depthmapX::getMapAtIndex(names, sel)->first;\r\n//         CWaitCursor c;\r\n         m_meta_graph->pushValuesToLayer(dest.first, dest.second, dlg.m_function, dlg.m_count_intersections);\r\n         delete m_communicator;\r\n         m_communicator = NULL;\r\n         SetUpdateFlag(NEW_TABLE);\r\n      }\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnAddColumn() \r\n{\r\n   CRenameObjectDlg dlg(tr(\"Column\"));  // using the constructor without a column name sets rename column dialog to insert column name mode\r\n   bool success = false;\r\n   while (dlg.exec() == QDialog::Accepted && !success) {\r\n      if (dlg.m_object_name.isEmpty()) {\r\n\t\t  QMessageBox::warning(this, tr(\"Warning\"), tr(\"Column name cannot be empty\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      }\r\n      else {\r\n         AttributeTable& tab = m_meta_graph->getAttributeTable();\r\n         bool found = false;\r\n         for (int i = 0; i < tab.getNumColumns(); i++) {\r\n            if (tab.getColumnName(i) == dlg.m_object_name.toStdString()) {\r\n\t\t\t\tQMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, another column already has this name, please choose a unique column name\"), QMessageBox::Ok, QMessageBox::Ok);\r\n               found = true;\r\n               break;\r\n            }\r\n         }\r\n         if (!found) {\r\n            success = true;\r\n            break;\r\n         }\r\n      }\r\n   }\r\n   if (success) {\r\n      int col = m_meta_graph->addAttribute(dlg.m_object_name.toStdString());\r\n      m_meta_graph->setDisplayedAttribute(col);\r\n      SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n      // Tell the views to update their menus\r\n      SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_COLUMN );\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnRenameColumn() \r\n{\r\n   AttributeTable *tab = &(m_meta_graph->getAttributeTable());\r\n   int col = m_meta_graph->getDisplayedAttribute();\r\n   // -1 is reference number, -2 is displaying nothing (-2 shouldn't happen but is)\r\n   if (col == -1 || col == -2 || m_meta_graph->isAttributeLocked(col)) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot rename locked column\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   int newcol = RenameColumn(tab,col);\r\n   if (newcol != -1) {\r\n      m_meta_graph->setDisplayedAttribute(newcol);\r\n      SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n      SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_COLUMN );\r\n   }\r\n}\r\n\r\nint QGraphDoc::RenameColumn(AttributeTable *tab, int col)\r\n{\r\n   QString colname = QString(tab->getColumnName(col).c_str());\r\n   CRenameObjectDlg dlg(\"Column\",colname);  // using the column name sets the dialog to replace column name mode\r\n   bool success = false;\r\n   while (dlg.exec() == QDialog::Accepted && !success && dlg.m_object_name != colname) {\r\n       std::string newColName = dlg.m_object_name.toStdString();\r\n      if (tab->hasColumn(newColName)) {\r\n\t\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Sorry, another column already has this name, please choose a unique column name\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      }\r\n      else {\r\n         tab->renameColumn(tab->getColumnName(col), newColName);\r\n         return tab->getColumnIndex(newColName);\r\n      }\r\n   }\r\n   return -1;\r\n}\r\n\r\nvoid QGraphDoc::OnColumnProperties() \r\n{\r\n   AttributeTable *tab = &(m_meta_graph->getAttributeTable());\r\n   LayerManagerImpl *layers = &(m_meta_graph->getLayers());\r\n   int col = m_meta_graph->getDisplayedAttribute();\r\n\r\n   CColumnPropertiesDlg dlg(tab, layers, col);\r\n   \r\n   dlg.exec();\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnUpdateColumn() \r\n{\r\n   int col = m_meta_graph->getDisplayedAttribute();\r\n   // -1 is reference number, -2 is displaying nothing (-2 shouldn't happen but is)\r\n   if (col == -1 || col == -2 || m_meta_graph->isAttributeLocked(col)) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot edit locked column\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   PointMap *pointmap = NULL;\r\n   ShapeMap *shapemap = NULL;\r\n   int vc = m_meta_graph->getViewClass();\r\n   if (vc & MetaGraph::VIEWVGA) {\r\n      pointmap = &(m_meta_graph->getDisplayedPointMap());\r\n   }\r\n   else if (vc & MetaGraph::VIEWAXIAL) {\r\n      shapemap = &(m_meta_graph->getDisplayedShapeGraph());\r\n   }\r\n   else if (vc & MetaGraph::VIEWDATA) {\r\n      shapemap = &(m_meta_graph->getDisplayedDataMap());\r\n   }\r\n\r\n   if (ReplaceColumnContents(pointmap,shapemap,col)) {\r\n      m_meta_graph->setDisplayedAttribute(col);\r\n      SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n      SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n   }\r\n}\r\n\r\n// Either shapemap or pointmap should be NULL:\r\nbool QGraphDoc::ReplaceColumnContents(PointMap *pointmap, ShapeMap *shapemap, int col)\r\n{\r\n   SalaObj program_context;\r\n   SalaGrf graph;\r\n   if (pointmap != NULL) {\r\n      graph.map.point = pointmap;\r\n      program_context = SalaObj(SalaObj::S_POINTMAPOBJ, graph);\r\n   }\r\n   else if (shapemap != NULL) {\r\n      SalaGrf graph;\r\n      graph.map.shape = shapemap;\r\n      program_context = SalaObj(SalaObj::S_SHAPEMAPOBJ, graph);\r\n   }\r\n   else {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Replace column contents requires either a shape map or visibility graph\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return false;\r\n   }\r\n\r\n   AttributeTable *table = program_context.getTable();\r\n\r\n   // insert dialog is a misnomer now!\r\n   CInsertColumnDlg dlg(table,col);  // Using a column number sets it to use the replace text rather than select text\r\n   \r\n   bool error = true;\r\n   while (error && QDialog::Accepted == dlg.exec()) {\r\n      error = false;\r\n      size_t n = dlg.m_formula_text.length();\r\n      char *text = new char[n+1];\r\n      if (n == 0) {\r\n\t\t  QMessageBox::warning(this, tr(\"Notice\"), tr(\"Please enter a formula\"), QMessageBox::Ok, QMessageBox::Ok);\r\n         error = true;\r\n      }\r\n      else {\r\n         strcpy(text,dlg.m_formula_text.c_str());\r\n         std::istringstream stream(text);\r\n         SalaProgram proggy(program_context);\r\n         if (!proggy.parse(stream)) {\r\n            QString msg = QString(\"There was an error parsing your formula:\\n\\n\") + \r\n               proggy.getLastErrorMessage().c_str();\r\n\t\t\tQMessageBox::warning(this, tr(\"Warning\"), msg, QMessageBox::Ok, QMessageBox::Ok);\r\n            error = true;\r\n         }\r\n         else {\r\n            // just check you really are viewing the layers:\r\n            bool retvar;\r\n            if (dlg.m_selection_only) {\r\n               retvar = proggy.runupdate(col,pointmap ? pointmap->getSelSet() : shapemap->getSelSet());\r\n            }\r\n            else {\r\n               retvar = proggy.runupdate(col);\r\n            }\r\n            if (!retvar) {\r\n               QString msg = QString(\"There was an error running your formula:\\n\\n\") + \r\n                  proggy.getLastErrorMessage().c_str();\r\n               QMessageBox::warning(this, tr(\"Warning\"), msg, QMessageBox::Ok, QMessageBox::Ok);\r\n               error = true;\r\n            }\r\n         }\r\n      }\r\n      if (!error) {\r\n         table->getColumn(col).setFormula(text);\r\n      }\r\n      delete [] text;\r\n   }\r\n   return !error;\r\n}\r\n\r\nvoid QGraphDoc::OnEditQuery() \r\n{\r\n   PointMap *pointmap = NULL;\r\n   ShapeMap *shapemap = NULL;\r\n   int vc = m_meta_graph->getViewClass();\r\n   if (vc & MetaGraph::VIEWVGA) {\r\n      pointmap = &(m_meta_graph->getDisplayedPointMap());\r\n   }\r\n   else if (vc & MetaGraph::VIEWAXIAL) {\r\n      shapemap = &(m_meta_graph->getDisplayedShapeGraph());\r\n   }\r\n   else if (vc & MetaGraph::VIEWDATA) {\r\n      shapemap = &(m_meta_graph->getDisplayedDataMap());\r\n   }\r\n\r\n   if (SelectByQuery(pointmap,shapemap)) {\r\n      SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n   }\r\n}\r\n\r\n// Either shapemap or pointmap should be NULL:\r\nbool QGraphDoc::SelectByQuery(PointMap *pointmap, ShapeMap *shapemap)\r\n{\r\n   SalaObj program_context;\r\n   SalaGrf graph;\r\n   if (pointmap != NULL) {\r\n      graph.map.point = pointmap;\r\n      program_context = SalaObj(SalaObj::S_POINTMAPOBJ, graph);\r\n   }\r\n   else if (shapemap != NULL) {\r\n      SalaGrf graph;\r\n      graph.map.shape = shapemap;\r\n      program_context = SalaObj(SalaObj::S_SHAPEMAPOBJ, graph);\r\n   }\r\n   else {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Replace column contents requires either a shape map or visibility graph\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return false;\r\n   }\r\n\r\n   AttributeTable *table = program_context.getTable();\r\n   // insert dialog is a misnomer now!\r\n   CInsertColumnDlg dlg(table,-1);  // -1 sets it to use the select text rather than replace text\r\n   bool error = true;\r\n   while (error && QDialog::Accepted == dlg.exec()) {\r\n      error = false;\r\n      std::string multibytetext(((MainWindow*)m_mainFrame)->m_formula_cache.toStdString());\r\n      char *text = new char[multibytetext.length()+1];\r\n      strcpy(text,multibytetext.c_str());\r\n      std::istringstream stream(text);\r\n      SalaProgram proggy(program_context);\r\n      if (!proggy.parse(stream)) {\r\n         QString msg = QString(\"There was an error parsing your formula:\\n\") + \r\n            QString(proggy.getLastErrorMessage().c_str());\r\n         QMessageBox::warning(this, tr(\"depthmapX\"), msg, QMessageBox::Ok, QMessageBox::Ok);\r\n         error = true;\r\n      }\r\n      else {\r\n         // just check you really are viewing the layers:\r\n         bool retvar;\r\n         std::vector<int> selset;\r\n         if (dlg.m_selection_only) {\r\n            retvar = proggy.runselect(selset,pointmap ? pointmap->getSelSet() : shapemap->getSelSet());\r\n         }\r\n         else {\r\n            retvar = proggy.runselect(selset);\r\n         }\r\n         if (!retvar) {\r\n            QString msg = QString(\"There was an error running your formula:\\n\") + \r\n               QString(proggy.getLastErrorMessage().c_str());\r\n            QMessageBox::warning(this, tr(\"depthmapX\"), msg, QMessageBox::Ok, QMessageBox::Ok);\r\n            error = true;\r\n         }\r\n         else {\r\n            // make the selection using the selset:\r\n            if (pointmap) {\r\n               pointmap->setCurSel(selset);\r\n            }\r\n            else {\r\n               // note, shape maps have been working with rowids directly:\r\n               shapemap->setCurSelDirect(selset);\r\n            }\r\n         }\r\n      }\r\n      delete [] text;\r\n      if (!error) {\r\n         return true;\r\n      }\r\n   }\r\n   return false;\r\n}\r\n\r\nvoid QGraphDoc::OnEditSelectToLayer()\r\n{\r\n   if ((m_meta_graph->getViewClass() & (MetaGraph::VIEWAXIAL|MetaGraph::VIEWDATA))\r\n      && m_meta_graph->isSelected()) {\r\n\r\n      CRenameObjectDlg dlg(\"Layer\"); // note, without specifying existing layer name, this defaults to \"New layer\" behaviour\r\n      if (QDialog::Accepted == dlg.exec()) {\r\n\r\n         auto layer_name = dlg.m_object_name.toStdString();\r\n         if (layer_name.empty()) {\r\n            layer_name = \"Untitled\";\r\n         }\r\n\r\n         bool retvar = false;\r\n         if (m_meta_graph->getViewClass() & (MetaGraph::VIEWAXIAL)) {\r\n            retvar = m_meta_graph->getDisplayedShapeGraph().selectionToLayer(layer_name);\r\n         }\r\n         else {\r\n            retvar = m_meta_graph->getDisplayedDataMap().selectionToLayer(layer_name);\r\n         }\r\n         if (retvar) {\r\n            SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH, NEW_DATA);\r\n            SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n         }\r\n         else {\r\n\t\t\t QMessageBox::warning(this, tr(\"Warning\"), tr(\"Couldn't create new layer.\\nPlease note there is a limit of 64 layers per map.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnRemoveColumn() \r\n{\r\n  // just check you really are viewing the layers:\r\n   int col = m_meta_graph->getDisplayedAttribute();\r\n   // -1 is reference number, -2 is displaying nothing (-2 shouldn't happen but is)\r\n   if (col == -1 || col == -2 || m_meta_graph->isAttributeLocked(col)) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot remove locked column\"), QMessageBox::Ok, QMessageBox::Ok);\r\n   }\r\n   else if (QMessageBox::Yes == QMessageBox::question(this, tr(\"depthmapX\"), tr(\"Are you sure you want to delete the currently displayed column?\"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No)) {\r\n      // note this -1 simply means shift back one\r\n      m_meta_graph->setDisplayedAttribute(col-1);\r\n      m_meta_graph->removeAttribute(col);\r\n      SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n      SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_COLUMN );\r\n   }\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid QGraphDoc::OnFileProperties() \r\n{\r\n   if (!m_meta_graph) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"No graph\"), QMessageBox::Ok, QMessageBox::Ok);\r\n   }\r\n   else {\r\n      CFilePropertiesDlg dlg;\r\n      // editables\r\n\t   dlg.m_title = QString(m_meta_graph->getTitle().c_str());\r\n\t   dlg.m_location = QString(m_meta_graph->getLocation().c_str());\r\n\t   dlg.m_description = QString(m_meta_graph->getDescription().c_str());\r\n      // non-editables\r\n\t   dlg.m_author = QString(m_meta_graph->getPerson().c_str());\r\n\t   dlg.m_create_date = QString(m_meta_graph->getDate().c_str());\r\n\t   dlg.m_create_program = QString(m_meta_graph->getProgram().c_str());\r\n\t   dlg.m_organization = QString(m_meta_graph->getOrganization().c_str());\r\n      if (m_meta_graph && m_meta_graph->getVersion() != -1) {\r\n         QString info;\r\n         info.sprintf(\"%d\", m_meta_graph->getVersion());\r\n         dlg.m_file_version = info;\r\n      }\r\n      else {\r\n         dlg.m_file_version = tr(\"<Unsaved>\");\r\n      }\r\n      if (QDialog::Accepted == dlg.exec()) {\r\n         m_meta_graph->setTitle(dlg.m_title.toStdString());\r\n         m_meta_graph->setLocation(dlg.m_location.toStdString());\r\n         m_meta_graph->setDescription(dlg.m_description.toStdString());\r\n      }\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnViewShowGrid() \r\n{\r\n   if (m_meta_graph->m_showgrid) {\r\n      m_meta_graph->m_showgrid = false;\r\n   }\r\n   else {\r\n      m_meta_graph->m_showgrid = true;\r\n   }\r\n   SetRedrawFlag(VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP);\r\n}\r\n\r\n//#include \"AttributeSummary.h\"\r\n\r\nvoid QGraphDoc::OnViewSummary() \r\n{\r\n   CAttributeSummary dlg(this);\r\n   dlg.exec();\r\n}\r\n\r\nvoid QGraphDoc::OnToolsPointConvShapeMap() \r\n{\r\n   //CWaitCursor wait;\r\n   m_meta_graph->getDisplayedPointMap().mergeFromShapeMap(m_meta_graph->getDisplayedDataMap());\r\n   m_meta_graph->setViewClass(MetaGraph::SHOWVGATOP);\r\n   SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n   SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH, NEW_DATA);\r\n}\r\n\r\n// this is unlink from a set of points!\r\nvoid QGraphDoc::OnToolsAxialConvShapeMap() \r\n{\r\n   if (m_meta_graph->getDataMaps().empty()) {\r\n\t   QMessageBox::warning(this, tr(\"Warning\"), tr(\"No data source layers for unlink points\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n\r\n   std::vector<std::string> names;\r\n   for (size_t i = 0; i < m_meta_graph->getDataMaps().size(); i++) {\r\n      names.push_back(std::string(\"Data Maps: \") + m_meta_graph->getDataMaps()[i].getName());\r\n   }\r\n\r\n   // choose shape map...\r\n   CLayerChooserDlg dlg(names);\r\n   dlg.m_text = tr(\"Please select source layer for unlink points\");\r\n\r\n   if (dlg.exec()) {\r\n      //CWaitCursor wait;\r\n      m_meta_graph->getDisplayedShapeGraph().unlinkFromShapeMap(m_meta_graph->getDataMaps()[dlg.m_layer]);\r\n      m_meta_graph->setViewClass(MetaGraph::SHOWAXIALTOP);\r\n      SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n      SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH, NEW_DATA);\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnToolsLineLoadUnlinks() \r\n{\r\n   // Get file from user \r\n   QFileDialog::Options options = 0;\r\n   QString outfile = QFileDialog::getOpenFileName(\r\n                               0, tr(\"Import Unlink IDs\"),\r\n                               \"\",\r\n                               tr(\"Text files (*.txt)\\nAll files (*.*)\"),\r\n                               0,\r\n                               options);\r\n   if(outfile.isEmpty()) return;\r\n\r\n   std::ifstream stream(outfile.toLatin1());\r\n   if (stream.fail()) {\r\n\t  QMessageBox::warning(this, tr(\"Warning\"), tr(\"There was an error opening the file.\\nPlease check the file is not already open\"), QMessageBox::Ok, QMessageBox::Ok);\r\n      return;\r\n   }\r\n   // Check to see if they want to use another key column for the unlink:\r\n   CAttributeChooserDlg dlg(m_meta_graph->getDisplayedShapeGraph().getAttributeTable());\r\n   dlg.m_text = tr(\"Please select the attribute the file uses as the key for the unlinks\");\r\n   if (dlg.exec() == QDialog::Accepted) {\r\n      // Run the process\r\n      if (!m_meta_graph->getDisplayedShapeGraph().unlinkShapeSet(stream,dlg.m_attribute)) {\r\n          QMessageBox::warning(this, tr(\"Warning\"), tr(\"There was an error reading the unlink file.\\ndepthmapX is expecting a tab delimited set of unlink IDs\"), QMessageBox::Ok, QMessageBox::Ok);\r\n          return;\r\n      }\r\n      m_meta_graph->setViewClass(MetaGraph::SHOWAXIALTOP);\r\n      SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n      SetRedrawFlag(VIEW_ALL,REDRAW_GRAPH,NEW_DATA);\r\n   }\r\n}\r\n\r\nvoid QGraphDoc::OnConvertMapShapes()\r\n{\r\n   if (m_meta_graph && m_meta_graph->viewingShapes()) {\r\n      CConvertShapesDlg dlg;\r\n      if (QDialog::Accepted == dlg.exec()) {\r\n         int viewclass = m_meta_graph->getViewClass();\r\n         if (viewclass & MetaGraph::VIEWDATA) {\r\n            m_meta_graph->getDisplayedDataMap().convertPointsToPolys(dlg.m_radius,dlg.m_selected_only);\r\n         }\r\n         else if (viewclass & MetaGraph::VIEWAXIAL) {\r\n            m_meta_graph->getDisplayedDataMap().convertPointsToPolys(dlg.m_radius,dlg.m_selected_only);\r\n         }\r\n         else {\r\n\t\t\t QMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot perform conversion on this map type\"), QMessageBox::Ok, QMessageBox::Ok);\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nQT_END_NAMESPACE\r\n"
  },
  {
    "path": "depthmapX/GraphDoc.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef GRAPHDOC_H\r\n#define GRAPHDOC_H\r\n\r\n#include <QMutex>\r\n#include <QSize>\r\n#include <QTime>\r\n#include <QThread>\r\n#include <QApplication>\r\n#include <QWaitCondition>\r\n#include <QProgressDialog>\r\n\r\n// My standard stuff:\r\n#include <iomanip>\r\n#include <sstream>\r\n#include <math.h>\r\n#include <float.h>\r\n#include <genlib/comm.h>\r\n#include <genlib/exceptions.h>\r\n// Sala\r\n#include <salalib/mgraph.h>\r\n#include \"salalib/salaprogram.h\"\r\n#include <salalib/entityparsing.h>\r\n#include <salalib/linkutils.h>\r\n#include \"salalib/ianalysis.h\"\r\n\r\n\r\nQT_BEGIN_NAMESPACE\r\n\r\n//! [0]\r\nclass RenderThread : public QThread\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    RenderThread(QObject *parent = 0);\r\n    ~RenderThread();\r\n\r\n\tvoid* m_parent;\r\n    bool simple_version;\r\n    void render(void* param);\r\n\r\nsignals:\r\n    void renderedImage(const QImage &image, double scaleFactor);\r\n    void runtimeExceptionThrown(int type, std::string message);\r\n    void showWarningMessage(QString title, QString message);\r\n    void closeWaitDialog();\r\n\r\nprotected:\r\n    void run();\r\n\r\nprivate:\r\n    bool restart;\r\n    bool abort;\r\n    QMutex mutex;\r\n    QWaitCondition condition;\r\n};\r\n\r\nclass QGraphDoc; // forward declaration required by CMSCommunicator::run(QGraphDoc *)\r\n\r\nclass CMSCommunicator : public Communicator\r\n{\r\npublic:\r\n   enum { IMPORT, IMPORTMIF, MAKEPOINTS, MAKEGRAPH, ANALYSEGRAPH,\r\n          POINTDEPTH, METRICPOINTDEPTH, ANGULARPOINTDEPTH, TOPOLOGICALPOINTDEPTH,\r\n          MAKEISOVIST, MAKEISOVISTPATH, MAKEISOVISTSFROMFILE,\r\n          MAKEALLLINEMAP, MAKEFEWESTLINEMAP, MAKEDRAWING,\r\n          MAKEUSERMAP, MAKEUSERMAPSHAPE, MAKEUSERSEGMAP, MAKEUSERSEGMAPSHAPE, MAKEGATESMAP, MAKEBOUNDARYMAP, MAKESEGMENTMAP,\r\n          MAKECONVEXMAP,\r\n          AXIALANALYSIS, SEGMENTANALYSISTULIP, SEGMENTANALYSISANGULAR, TOPOMETANALYSIS, AGENTANALYSIS,\r\n        FROMCONNECTOR};\r\npublic:\r\n   CMSCommunicator();\r\n   virtual ~CMSCommunicator();\r\n   virtual void CommPostMessage(int m, int x) const;  // Inline below CWaitDialog\r\n\r\n   void * parent_doc;\r\n\r\n   bool simple_version; // public is not a good thing but will do for now! // TV\r\n\r\n   void SetFunction(int function) { m_function = function; }\r\n   void setAnalysis(int function) { m_function = function; }\r\n   int GetFunction() const { return m_function; }\r\n\r\n   void SetOption(int option, size_t which = 0)\r\n   { while (which >= m_options.size()) m_options.push_back(-1); m_options[which] = option; }\r\n   int GetOption(size_t which = 0) const\r\n   { return (which >= m_options.size()) ? -1 : m_options[which]; }\r\n   void SetSeedPoint(const Point2f& p)\r\n   { m_seed_point = p; }\r\n   const Point2f& GetSeedPoint() const\r\n   { return m_seed_point; }\r\n   void SetSeedAngle(const double angle)\r\n   { m_seed_angle = angle; }\r\n   double GetSeedAngle() const\r\n   { return m_seed_angle; }\r\n   void SetSeedFoV(const double fov)\r\n   { m_seed_fov = fov; }\r\n   double GetSeedFoV() const\r\n   { return m_seed_fov; }\r\n   //\r\n\r\n   void SetString(const QString& str)\r\n   { m_string= str; }\r\n   const QString& GetString() const\r\n   { return m_string; }\r\n   void SetFileSet(QStringList strings)\r\n   {\r\n       m_fileset.clear();\r\n       for (int i = 0; i < strings.size(); i++)\r\n       {\r\n           m_fileset.push_back(strings[i].toStdString());\r\n       }\r\n   }\r\n   void setAnalysis(std::unique_ptr<IAnalysis> analysis) { m_analysis = std::move(analysis); }\r\n   void setSuccessUpdateFlags(int type, bool modified = true) {\r\n       m_successUpdateFlagType = type;\r\n       m_successUpdateFlagModified = modified;\r\n   }\r\n   void setSuccessRedrawFlags(int viewtype, int flag, int reason) {\r\n       m_successRedrawFlagViewType = viewtype;\r\n       m_successRedrawFlag = flag;\r\n       m_successRedrawReason = reason;\r\n   }\r\n\r\n   void runAnalysis(QGraphDoc &graphDoc);\r\n\r\nprotected:\r\n   std::vector<int> m_options;\r\n   int m_function;\r\n   Point2f m_seed_point;\r\n   double m_seed_angle;\r\n   double m_seed_fov;\r\n   //CImportedModule m_module;\r\n   QString m_string;   // for a generic string\r\n   std::unique_ptr<IAnalysis> m_analysis;\r\n   int m_successUpdateFlagType;\r\n   bool m_successUpdateFlagModified = true;\r\n   int m_successRedrawFlagViewType;\r\n   bool m_successRedrawFlag;\r\n   int m_successRedrawReason;\r\n};\r\n\r\nstruct QFilePath {\r\n   QString m_path;\r\n   QString m_name;\r\n   QString m_ext;\r\n   QFilePath(const QString& pathname)\r\n   {\r\n      int dot   = pathname.lastIndexOf('.');\r\n      int slash = pathname.lastIndexOf('\\\\');\r\n      if (slash != -1) {\r\n\t\t m_path = pathname.left(slash+1);\r\n      }\r\n\t  else\r\n\t  {\r\n         slash = pathname.lastIndexOf ('/');\r\n\t\t if (slash != -1) m_path = pathname.left(slash+1);\r\n\t  }\r\n      if (dot != -1) {\r\n         m_name = pathname.mid(slash+1, dot-slash-1);\r\n         m_ext = pathname.mid(dot+1);\r\n         m_ext = m_ext.toUpper();\r\n      }\r\n      else {\r\n         m_name = pathname.mid(slash+1);\r\n      }\r\n   }\r\n};\r\n\r\n\r\nclass QGraphDoc : public QWidget\r\n{\r\n\tQ_OBJECT\r\nprivate:\r\n    void exceptionThrownInRenderThread(int type, std::string message);\r\n    void messageFromRenderThread(QString title, QString message);\r\npublic:\r\n   QGraphDoc(const QString &author, const QString &organisation);\r\n   CMSCommunicator *m_communicator;\r\n\r\n   int m_make_algorithm;   // algorithm to make graph\r\n   double m_make_maxdist;  // maximum distance you can see (set to -1.0 for infinite)\r\n\r\n   MetaGraph *m_meta_graph;\r\n\r\n   QString m_base_title;\r\n   QString m_opened_name;\r\n\r\n   bool modifiedFlag;\r\n\r\n   // Redraw commands\r\n   enum {REDRAW_DONE, REDRAW_POINTS, REDRAW_GRAPH, REDRAW_TOTAL };\r\n   // Redraw reasons\r\n   enum {UNDECLARED, NEW_FOCUS, NEW_DEPTHMAPVIEW_SETUP,\r\n                     NEW_LINESET, NEW_DATA,\r\n                     NEW_SELECTION, NEW_TABLE, NEW_COLUMN, NEW_FILE, DELETED_TABLE };\r\n   // Mainframe table changes:\r\n   enum {CONTROLS_DESTROYALL,CONTROLS_LOADALL,\r\n         CONTROLS_LOADGRAPH,CONTROLS_RELOADGRAPH,CONTROLS_LOADCONVERT,CONTROLS_LOADDRAWING,\r\n         CONTROLS_LOADATTRIBUTES,CONTROLS_CHANGEATTRIBUTE};\r\n\r\n   // Views attached (by viewtypes)\r\n   enum {VIEW_ALL = 0, VIEW_MAP = 1, VIEW_SCATTER = 2, VIEW_TABLE = 3, VIEW_3D = 4, VIEW_MAP_GL = 5, VIEW_TYPES = 6};\r\n\r\n   void* m_mainFrame;\r\n   QWidget *m_view[VIEW_TYPES];\r\n\r\n   // now individual to each view\r\n   bool m_flag_lock;\r\n   int m_redraw_flag[VIEW_TYPES];\r\n\r\n   bool SetRedrawFlag(int viewtype, int flag, int reason = UNDECLARED, QWidget *originator = NULL); // (almost) thread safe\r\n\r\n   int GetRedrawFlag(int viewtype) const\r\n   {\r\n      return m_redraw_flag[viewtype];\r\n   }\r\n\r\n   bool m_remenu_flag[VIEW_TYPES];\r\n   void SetRemenuFlag(int viewtype, bool on) {\r\n      if (viewtype) {\r\n         m_remenu_flag[viewtype] = on;\r\n      }\r\n      else {\r\n         for (int i = 1; i < VIEW_TYPES; i++) {\r\n            m_remenu_flag[i] = on;\r\n         }\r\n      }\r\n   }\r\n\r\n   bool GetRemenuFlag(int viewtype) const {\r\n      return m_remenu_flag[viewtype];\r\n   }\r\n\r\n   void SetUpdateFlag(int type, bool modified = true);\r\n   Point2f m_position;  // Last known mouse position, in DXF units\r\n   // Paths for the March 05 evolved agents\r\n   // (loaded from file using the test button)\r\n   std::vector<std::vector<Point2f>> m_evolved_paths;\r\n   RenderThread m_thread;\r\n\r\n   QProgressDialog* m_waitdlg;\r\n   QString m_base_description;\r\n   bool modify_prog;\r\n   int Tid_progress;\r\n   int m_num_steps;\r\n   int m_record;\r\n   int m_step;\r\n   int m_num_records;\r\n   QTime m_timer;\r\n   void ProcPostMessage(int m, int x);\r\n   void UpdateMainframestatus();\r\n\r\npublic slots:\r\n   void cancel_wait();\r\n\r\n// Operations\r\npublic:\r\n   void CreateWaitDialog(const QString& description, QWidget *pr = NULL);\r\n   void DestroyWaitDialog();\r\n\r\n   void OnFillPoints(const Point2f& p, int fill_type = 0 );\r\n   void OnMakeIsovist(const Point2f& seed, double angle = -1.0);\r\n   void OnToolsAxialMap( const Point2f& seed );\r\n   int RenameColumn(AttributeTable *tab, int col);\r\n   bool ReplaceColumnContents(PointMap* pointmap, ShapeMap *shapemap, int col);\r\n   bool SelectByQuery(PointMap* pointmap, ShapeMap *shapemap);\r\n   void OnToolsTopomet();\r\n\r\n    bool OnNewDocument();\r\n\tint OnSaveDocument(QString lpszPathName);\r\n\tint OnSaveDocument(QString lpszPathName, int version);\r\n\tbool OnCloseDocument(int);\r\n\tint OnOpenDocument(char* lpszPathName);\r\n    void OnToolsTPD();\r\n    void OnVGALinksFileImport();\r\n    void OnGenerateIsovistsFromFile();\r\n    void OnFileImport();\r\n\tvoid OnFileExport();\r\n    void OnFileExportMapGeometry();\r\n    void OnFileExportLinks();\r\n    void OnAxialConnectionsExportAsDot();\r\n    void OnAxialConnectionsExportAsPairCSV();\r\n    void OnSegmentConnectionsExportAsPairCSV();\r\n\tvoid OnToolsMakeGraph();\r\n    void OnToolsUnmakeGraph();\r\n    void OnEditClear();\r\n\tvoid OnToolsRun();\r\n\tvoid OnEditUndo();\r\n    void OnToolsPD();\r\n\tvoid OnPushToLayer();\r\n\tvoid OnEditGrid();\r\n    void OnToolsMPD();\r\n\tvoid OnToolsMakeFewestLineMap();\r\n\tvoid OnToolsRunSeg();\r\n    void OnAddColumn();\r\n    void OnRemoveColumn();\r\n\tvoid OnFileProperties();\r\n\tvoid OnToolsAPD();\r\n\tvoid OnViewShowGrid();\r\n\tvoid OnToolsRunAxa();\r\n\tvoid OnSwapColours();\r\n\tvoid OnViewSummary();\r\n\tvoid OnToolsPointConvShapeMap();\r\n\tvoid OnToolsAxialConvShapeMap();\r\n    void OnUpdateColumn();\r\n    void OnToolsAgentRun();\r\n\tvoid OnRenameColumn();\r\n\tvoid OnEditQuery();\r\n    void OnColumnProperties();\r\n\tvoid OnLayerNew();\r\n\tvoid OnLayerDelete();\r\n\tvoid OnLayerConvert();\r\n\tvoid OnLayerConvertDrawing();\r\n    void OnEditSelectToLayer();\r\n    void OnToolsIsovistpath();\r\n    bool OnFileSave();\r\n    bool OnFileSaveAs();\r\n    void OnConvertMapShapes();\r\n\tvoid OnToolsLineLoadUnlinks();\r\n    void OnPointmapExportConnectionsAsCSV();\r\n\r\nprotected:\r\n    virtual void timerEvent(QTimerEvent *event);\r\n\r\n};\r\n\r\nQT_END_NAMESPACE\r\n\r\n#endif\r\n"
  },
  {
    "path": "depthmapX/UI/AboutDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CAboutDlg</class>\n <widget class=\"QDialog\" name=\"CAboutDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>499</width>\n    <height>420</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>About depthmapX</string>\n  </property>\n  <widget class=\"QWidget\" name=\"layoutWidget\">\n   <property name=\"geometry\">\n    <rect>\n     <x>20</x>\n     <y>20</y>\n     <width>461</width>\n     <height>381</height>\n    </rect>\n   </property>\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <item>\n     <widget class=\"QLabel\" name=\"label\">\n      <property name=\"text\">\n       <string>depthmapX</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"c_version_info\">\n      <property name=\"text\">\n       <string notr=\"true\">Version information</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"c_copyright\">\n      <property name=\"text\">\n       <string>Copyright message (overwritten at runtime)</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"label_3\">\n      <property name=\"text\">\n       <string>In memory of Alasdair Turner</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"label_5\">\n      <property name=\"text\">\n       <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Alasdair_Turner&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://en.wikipedia.org/wiki/Alasdair_Turner&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QTextEdit\" name=\"c_agreement\">\n      <property name=\"verticalScrollBarPolicy\">\n       <enum>Qt::ScrollBarAlwaysOn</enum>\n      </property>\n      <property name=\"readOnly\">\n       <bool>true</bool>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"label_4\">\n      <property name=\"text\">\n       <string>For more information or to submit a bug see:</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"c_vrlink\">\n      <property name=\"text\">\n       <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/SpaceGroupUCL/depthmapX&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/varoudis/depthmapX&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QPushButton\" name=\"c_ok\">\n      <property name=\"text\">\n       <string>OK</string>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CAboutDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>103</x>\n     <y>374</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>209</x>\n     <y>329</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/AgentAnalysisDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CAgentAnalysisDlg</class>\n <widget class=\"QDialog\" name=\"CAgentAnalysisDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>380</width>\n    <height>557</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Agent Analysis Setup</string>\n  </property>\n  <widget class=\"QGroupBox\" name=\"groupBox\">\n   <property name=\"geometry\">\n    <rect>\n     <x>10</x>\n     <y>10</y>\n     <width>361</width>\n     <height>111</height>\n    </rect>\n   </property>\n   <property name=\"title\">\n    <string>Global setup</string>\n   </property>\n   <widget class=\"QWidget\" name=\"\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>30</y>\n      <width>320</width>\n      <height>24</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Analysis length(timesteps)</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_timesteps\"/>\n     </item>\n    </layout>\n   </widget>\n   <widget class=\"QWidget\" name=\"\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>70</y>\n      <width>321</width>\n      <height>26</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Record gate counts in data map</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_layer_selector\">\n       <property name=\"frame\">\n        <bool>true</bool>\n       </property>\n       <property name=\"modelColumn\">\n        <number>0</number>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </widget>\n  </widget>\n  <widget class=\"QGroupBox\" name=\"groupBox_2\">\n   <property name=\"geometry\">\n    <rect>\n     <x>10</x>\n     <y>130</y>\n     <width>361</width>\n     <height>131</height>\n    </rect>\n   </property>\n   <property name=\"title\">\n    <string>Agent set parameters</string>\n   </property>\n   <widget class=\"QRadioButton\" name=\"c_no_release_location\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>60</y>\n      <width>191</width>\n      <height>21</height>\n     </rect>\n    </property>\n    <property name=\"text\">\n     <string>Release from any location</string>\n    </property>\n   </widget>\n   <widget class=\"QRadioButton\" name=\"c_release_location\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>90</y>\n      <width>231</width>\n      <height>21</height>\n     </rect>\n    </property>\n    <property name=\"text\">\n     <string>Release from selected locations</string>\n    </property>\n   </widget>\n   <widget class=\"QWidget\" name=\"\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>30</y>\n      <width>321</width>\n      <height>24</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Release rate (agents per timestep)</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_release_rate\"/>\n     </item>\n    </layout>\n   </widget>\n  </widget>\n  <widget class=\"QGroupBox\" name=\"groupBox_3\">\n   <property name=\"geometry\">\n    <rect>\n     <x>10</x>\n     <y>270</y>\n     <width>361</width>\n     <height>141</height>\n    </rect>\n   </property>\n   <property name=\"title\">\n    <string>Agent program parameters</string>\n   </property>\n   <widget class=\"QWidget\" name=\"\">\n    <property name=\"geometry\">\n     <rect>\n      <x>21</x>\n      <y>31</y>\n      <width>321</width>\n      <height>24</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_4\">\n       <property name=\"text\">\n        <string>Field of view (bins)</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"c_fov\">\n       <property name=\"maximum\">\n        <number>32</number>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </widget>\n   <widget class=\"QWidget\" name=\"\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>70</y>\n      <width>320</width>\n      <height>24</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_5\">\n       <property name=\"text\">\n        <string>Steps before turn decision</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"c_steps\"/>\n     </item>\n    </layout>\n   </widget>\n   <widget class=\"QWidget\" name=\"\">\n    <property name=\"geometry\">\n     <rect>\n      <x>20</x>\n      <y>110</y>\n      <width>321</width>\n      <height>24</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_6\">\n       <property name=\"text\">\n        <string>Timesteps in system</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_frames\"/>\n     </item>\n    </layout>\n   </widget>\n  </widget>\n  <widget class=\"QWidget\" name=\"\">\n   <property name=\"geometry\">\n    <rect>\n     <x>30</x>\n     <y>430</y>\n     <width>321</width>\n     <height>29</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n    <item>\n     <widget class=\"QCheckBox\" name=\"c_record_trails\">\n      <property name=\"text\">\n       <string>Record trails for</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QLineEdit\" name=\"c_trail_count\"/>\n    </item>\n    <item>\n     <widget class=\"QLabel\" name=\"label_7\">\n      <property name=\"text\">\n       <string>agents</string>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QWidget\" name=\"\">\n   <property name=\"geometry\">\n    <rect>\n     <x>30</x>\n     <y>470</y>\n     <width>321</width>\n     <height>26</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n    <item>\n     <widget class=\"QLabel\" name=\"label_8\">\n      <property name=\"text\">\n       <string>Movement rule:</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QComboBox\" name=\"c_occlusion\">\n      <item>\n       <property name=\"text\">\n        <string>Standard</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Line of Sight Length</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Occluded Length</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Any occlusions</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Occlusions Group bins (45 degrees)</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Occlusions Group bins (60 degrees)</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Furthest occlusion per bin</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Per bin far distance weighted</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Per bin angle weighted</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Per bin far distance and angle weighted</string>\n       </property>\n      </item>\n      <item>\n       <property name=\"text\">\n        <string>Per bin memory</string>\n       </property>\n      </item>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QWidget\" name=\"\">\n   <property name=\"geometry\">\n    <rect>\n     <x>190</x>\n     <y>510</y>\n     <width>164</width>\n     <height>32</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n    <item>\n     <widget class=\"QPushButton\" name=\"c_ok\">\n      <property name=\"text\">\n       <string>OK</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QPushButton\" name=\"c_cancel\">\n      <property name=\"text\">\n       <string>Cancel</string>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CAgentAnalysisDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>168</x>\n     <y>536</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>55</x>\n     <y>520</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CAgentAnalysisDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>257</x>\n     <y>537</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>335</x>\n     <y>509</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/AttributeChooserDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CAttributeChooserDlg</class>\n <widget class=\"QDialog\" name=\"CAttributeChooserDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>342</width>\n    <height>152</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Choose Attribute</string>\n  </property>\n  <widget class=\"QLabel\" name=\"c_text\">\n   <property name=\"geometry\">\n    <rect>\n     <x>20</x>\n     <y>20</y>\n     <width>311</width>\n     <height>51</height>\n    </rect>\n   </property>\n   <property name=\"text\">\n    <string>Attribute\nAtrribute</string>\n   </property>\n  </widget>\n  <widget class=\"QWidget\" name=\"\">\n   <property name=\"geometry\">\n    <rect>\n     <x>20</x>\n     <y>80</y>\n     <width>301</width>\n     <height>26</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n    <item>\n     <widget class=\"QLabel\" name=\"label\">\n      <property name=\"text\">\n       <string>Attribute</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QComboBox\" name=\"c_attribute_chooser\"/>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QWidget\" name=\"\">\n   <property name=\"geometry\">\n    <rect>\n     <x>160</x>\n     <y>110</y>\n     <width>164</width>\n     <height>32</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n    <item>\n     <widget class=\"QPushButton\" name=\"c_ok\">\n      <property name=\"text\">\n       <string>OK</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"QPushButton\" name=\"c_cancel\">\n      <property name=\"text\">\n       <string>Cancel</string>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CAttributeChooserDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>174</x>\n     <y>135</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>56</x>\n     <y>123</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CAttributeChooserDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>267</x>\n     <y>136</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>126</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/AttributeSummary.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CAttributeSummary</class>\n <widget class=\"QDialog\" name=\"CAttributeSummary\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>531</width>\n    <height>319</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Attribute Summary</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTableWidget\" name=\"c_list\"/>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>388</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CAttributeSummary</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>464</x>\n     <y>286</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>316</x>\n     <y>280</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnDblclkList(QModelIndex)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/AxialAnalysisOptionsDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CAxialAnalysisOptionsDlg</class>\n <widget class=\"QDialog\" name=\"CAxialAnalysisOptionsDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>276</width>\n    <height>296</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Axial Analysis Options</string>\n  </property>\n  <property name=\"layoutDirection\">\n   <enum>Qt::LeftToRight</enum>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Radius / list of radii, e.g., 2,3,n</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_radius\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_choice\">\n       <property name=\"layoutDirection\">\n        <enum>Qt::LeftToRight</enum>\n       </property>\n       <property name=\"autoFillBackground\">\n        <bool>false</bool>\n       </property>\n       <property name=\"text\">\n        <string>Include choice (betweenness)</string>\n       </property>\n       <property name=\"tristate\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_local\">\n       <property name=\"layoutDirection\">\n        <enum>Qt::LeftToRight</enum>\n       </property>\n       <property name=\"text\">\n        <string>Include local measures</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_rra\">\n       <property name=\"text\">\n        <string>Include RA, RRA and total depth</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_weighted\">\n       <property name=\"text\">\n        <string>Include weighted measures</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Weight by</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_attribute_chooser\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>58</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_radius</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CAxialAnalysisOptionsDlg</receiver>\n   <slot>OnUpdateRadius()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>102</x>\n     <y>51</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>148</x>\n     <y>66</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_weighted</sender>\n   <signal>clicked()</signal>\n   <receiver>CAxialAnalysisOptionsDlg</receiver>\n   <slot>OnWeighted()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>187</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>156</x>\n     <y>205</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CAxialAnalysisOptionsDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>53</x>\n     <y>292</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>107</x>\n     <y>254</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CAxialAnalysisOptionsDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>158</x>\n     <y>289</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>186</x>\n     <y>256</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnUpdateRadius()</slot>\n  <slot>OnWeighted()</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/ColourScaleDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CColourScaleDlg</class>\n <widget class=\"QDialog\" name=\"CColourScaleDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>347</width>\n    <height>376</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string> depthmapX - Set Colour Scale</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QComboBox\" name=\"c_color_type\">\n     <property name=\"enabled\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QSlider\" name=\"c_blue_slider_ctrl\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_blue\">\n       <property name=\"text\">\n        <string>Blue</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_blue_value_window\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QSlider\" name=\"c_red_slider_ctrl\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_red\">\n       <property name=\"text\">\n        <string>Red</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_red_value_window\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_show_lines\">\n       <property name=\"text\">\n        <string>Show polygon edges</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_show_centroids\">\n       <property name=\"text\">\n        <string>Show polygon centroids</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_show_fill\">\n       <property name=\"text\">\n        <string>Show polygons filled</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>Apply</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_applytoall\">\n       <property name=\"text\">\n        <string>Apply to All</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Close</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_blue_value_window</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnChangeBlueValue()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>202</x>\n     <y>102</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>184</x>\n     <y>78</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_red_value_window</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnChangeRedValue()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>252</x>\n     <y>199</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>258</x>\n     <y>224</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_red_slider_ctrl</sender>\n   <signal>sliderMoved(int)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnReleasedRedSlider(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>50</x>\n     <y>150</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>51</x>\n     <y>172</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_blue_slider_ctrl</sender>\n   <signal>sliderMoved(int)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnReleasedBlueSlider(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>110</x>\n     <y>53</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>116</x>\n     <y>80</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_color_type</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnSelchangeColor(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>223</x>\n     <y>28</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>256</x>\n     <y>47</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_show_lines</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedShowLines(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>111</x>\n     <y>237</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>301</x>\n     <y>248</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_show_fill</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedShowFill(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>189</x>\n     <y>292</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>308</x>\n     <y>322</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_show_centroids</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedShowCentroids(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>229</x>\n     <y>269</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>335</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_applytoall</sender>\n   <signal>clicked()</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedApplytoall()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>142</x>\n     <y>337</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>15</x>\n     <y>322</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>81</x>\n     <y>343</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>23</x>\n     <y>354</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>336</x>\n     <y>344</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>321</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnChangeBlueValue()</slot>\n  <slot>OnChangeRedValue()</slot>\n  <slot>OnReleasedRedSlider()</slot>\n  <slot>OnReleasedBlueSlider()</slot>\n  <slot>OnSelchangeColor(int)</slot>\n  <slot>OnBnClickedShowLines(bool)</slot>\n  <slot>OnBnClickedShowFill(bool)</slot>\n  <slot>OnBnClickedShowCentroids(bool)</slot>\n  <slot>OnBnClickedApplytoall()</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n  <slot>OnReleasedRedSlider(int)</slot>\n  <slot>OnReleasedBlueSlider(int)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/ColourScaleDlg.ui.bak",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CColourScaleDlg</class>\n <widget class=\"QDialog\" name=\"CColourScaleDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>347</width>\n    <height>376</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string> depthmapX - Set Colour Scale</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QComboBox\" name=\"c_color_type\">\n     <property name=\"enabled\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QSlider\" name=\"c_blue_slider_ctrl\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_blue\">\n       <property name=\"text\">\n        <string>Blue</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_blue_value_window\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QSlider\" name=\"c_red_slider_ctrl\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_red\">\n       <property name=\"text\">\n        <string>Red</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_red_value_window\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_show_lines\">\n       <property name=\"text\">\n        <string>Show polygon edges</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_show_centroids\">\n       <property name=\"text\">\n        <string>Show polygon centroids</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_show_fill\">\n       <property name=\"text\">\n        <string>Show polygons filled</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>Apply</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_applytoall\">\n       <property name=\"text\">\n        <string>Apply to All</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Close</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_blue_value_window</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnChangeBlueValue()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>166</x>\n     <y>120</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>184</x>\n     <y>78</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_red_value_window</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnChangeRedValue()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>217</x>\n     <y>204</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>258</x>\n     <y>224</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_red_slider_ctrl</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnReleasedRedSlider(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>41</x>\n     <y>157</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>51</x>\n     <y>172</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_blue_slider_ctrl</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnReleasedBlueSlider(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>101</x>\n     <y>70</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>116</x>\n     <y>80</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_color_type</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnSelchangeColor(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>214</x>\n     <y>29</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>256</x>\n     <y>47</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_show_lines</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedShowLines(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>111</x>\n     <y>237</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>301</x>\n     <y>248</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_show_fill</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedShowFill(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>179</x>\n     <y>304</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>308</x>\n     <y>322</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_show_centroids</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedShowCentroids(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>219</x>\n     <y>271</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>335</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_applytoall</sender>\n   <signal>clicked()</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnBnClickedApplytoall()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>142</x>\n     <y>337</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>15</x>\n     <y>322</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>81</x>\n     <y>343</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>23</x>\n     <y>354</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CColourScaleDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>242</x>\n     <y>350</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>321</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnChangeBlueValue()</slot>\n  <slot>OnChangeRedValue()</slot>\n  <slot>OnReleasedRedSlider()</slot>\n  <slot>OnReleasedBlueSlider()</slot>\n  <slot>OnSelchangeColor(int)</slot>\n  <slot>OnBnClickedShowLines(bool)</slot>\n  <slot>OnBnClickedShowFill(bool)</slot>\n  <slot>OnBnClickedShowCentroids(bool)</slot>\n  <slot>OnBnClickedApplytoall()</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/ColumnPropertiesDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CColumnPropertiesDlg</class>\n <widget class=\"QDialog\" name=\"CColumnPropertiesDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>440</width>\n    <height>565</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Attribute Properties</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_name_text\">\n       <property name=\"text\">\n        <string>Name</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_name\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Values</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QTableWidget\" name=\"c_summary\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Formula</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QTextEdit\" name=\"c_formula\">\n       <property name=\"verticalScrollBarPolicy\">\n        <enum>Qt::ScrollBarAlwaysOn</enum>\n       </property>\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"c_formula_note\">\n     <property name=\"text\">\n      <string>Note: the formula may have been applied to a subset of objects</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>248</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CColumnPropertiesDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>339</x>\n     <y>527</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>224</x>\n     <y>517</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/ConvertShapesDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CConvertShapesDlg</class>\n <widget class=\"QDialog\" name=\"CConvertShapesDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>320</width>\n    <height>180</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Convert Map Shapes</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QComboBox\" name=\"c_conversion_type\">\n     <item>\n      <property name=\"text\">\n       <string>Convert points to polygons;</string>\n      </property>\n     </item>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Polygon radius</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_radius\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"c_selected_only\">\n     <property name=\"text\">\n      <string>Apply to selected shapes only</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>98</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CConvertShapesDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>125</x>\n     <y>156</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>42</x>\n     <y>147</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CConvertShapesDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>212</x>\n     <y>154</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>295</x>\n     <y>138</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/DepthmapAlert.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CDepthmapAlert</class>\n <widget class=\"QDialog\" name=\"CDepthmapAlert\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>515</width>\n    <height>263</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string> depthmapX Alert</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QTextEdit\" name=\"c_message\"/>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>To see this and other depthmapX alerts, please visit:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"c_alert_link\">\n       <property name=\"text\">\n        <string>(Not USED!) http://www.vr.ucl.ac.uk/depthmap/alerts</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_read_it\">\n       <property name=\"text\">\n        <string>I have read this message, please do not display it again</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>Continue</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CDepthmapAlert</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>282</x>\n     <y>259</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>171</x>\n     <y>242</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/DepthmapOptionsDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CDepthmapOptionsDlg</class>\n <widget class=\"QDialog\" name=\"CDepthmapOptionsDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>365</width>\n    <height>192</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>depthmapX Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>'depthmapX' runs with basic measures by default,\nonly change it if you know what you are doing...</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"c_show_simple_version\">\n     <property name=\"text\">\n      <string>Simple Version</string>\n     </property>\n     <property name=\"checked\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>37</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"c_show_research_toolbar\">\n     <property name=\"text\">\n      <string>Show research toolbar (Don't USE!)</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CDepthmapOptionsDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>267</x>\n     <y>148</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>16</x>\n     <y>81</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CDepthmapOptionsDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>352</x>\n     <y>148</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>192</x>\n     <y>53</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/EditConnectionsDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CEditConnectionsDlg</class>\n <widget class=\"QDialog\" name=\"CEditConnectionsDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>302</width>\n    <height>256</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Edit Connections</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Change to make</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n        <item>\n         <widget class=\"QRadioButton\" name=\"c_join_type\">\n          <property name=\"text\">\n           <string>&amp;Add connections</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"c_radio2\">\n          <property name=\"text\">\n           <string>&amp;Merge connections</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"c_radio3\">\n          <property name=\"text\">\n           <string>&amp;Break connections</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox_2\">\n     <property name=\"title\">\n      <string>GroupBox</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n      <item>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"c_pin_to_sel\">\n          <property name=\"text\">\n           <string>&amp;Selected area</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"c_sel_to_pin\">\n          <property name=\"text\">\n           <string>&amp;Pinned area</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CEditConnectionsDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>256</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>38</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CEditConnectionsDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>189</x>\n     <y>262</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>270</x>\n     <y>253</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/FewestLineOptionsDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CFewestLineOptionsDlg</class>\n <widget class=\"QDialog\" name=\"CFewestLineOptionsDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>261</width>\n    <height>99</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Make Fewest Line Map Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QRadioButton\" name=\"c_option\">\n     <property name=\"text\">\n      <string>Remove all subsets</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QRadioButton\" name=\"c_radio2\">\n     <property name=\"text\">\n      <string>Reduce to fewest connections</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CFewestLineOptionsDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>96</x>\n     <y>119</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>26</x>\n     <y>97</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CFewestLineOptionsDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>193</x>\n     <y>115</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>242</x>\n     <y>60</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/FilePropertiesDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CFilePropertiesDlg</class>\n <widget class=\"QDialog\" name=\"CFilePropertiesDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>430</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Graph File Properties</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Title</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_title\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Location</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_location\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <widget class=\"QLabel\" name=\"label_3\">\n         <property name=\"text\">\n          <string>Description</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QTextEdit\" name=\"c_description\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_4\">\n       <property name=\"text\">\n        <string>Author</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_author\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_5\">\n       <property name=\"text\">\n        <string>Organization</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_organization\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_6\">\n       <property name=\"text\">\n        <string>Created on</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_create_date\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_7\">\n       <property name=\"text\">\n        <string>Created by</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_create_program\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_8\">\n       <property name=\"text\">\n        <string>File version</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_file_version\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CFilePropertiesDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>180</x>\n     <y>396</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>80</x>\n     <y>386</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CFilePropertiesDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>268</x>\n     <y>392</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>330</x>\n     <y>389</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/FindLocDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CFindLocDlg</class>\n <widget class=\"QDialog\" name=\"CFindLocDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>207</width>\n    <height>150</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Find Location</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>x</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_x\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label2\">\n       <property name=\"text\">\n        <string>y</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_y\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CFindLocDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>49</x>\n     <y>119</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>16</x>\n     <y>118</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CFindLocDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>148</x>\n     <y>130</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>192</x>\n     <y>114</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/GridDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CGridDialog</class>\n <widget class=\"QDialog\" name=\"CGridDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>248</width>\n    <height>93</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Set Grid Properties</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Spacing</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QDoubleSpinBox\" name=\"c_spacing_ctrl\">\n       <property name=\"decimals\">\n        <number>3</number>\n       </property>\n       <property name=\"singleStep\">\n        <double>0.001000000000000</double>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_spacing_ctrl</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>CGridDialog</receiver>\n   <slot>OnDeltaposSpinSpacing(double)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>189</x>\n     <y>39</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>40</x>\n     <y>55</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CGridDialog</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>110</x>\n     <y>82</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>37</x>\n     <y>77</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CGridDialog</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>212</x>\n     <y>86</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>271</x>\n     <y>73</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnDeltaposSpinSpacing(double)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/InsertColumnDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CInsertColumnDlg</class>\n <widget class=\"QDialog\" name=\"CInsertColumnDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>546</width>\n    <height>296</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Replace Attribute Values</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <widget class=\"QLabel\" name=\"c_formula_desc\">\n         <property name=\"text\">\n          <string>Formula</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QTextEdit\" name=\"c_formula\"/>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QLabel\" name=\"label\">\n         <property name=\"text\">\n          <string>Existing attributes</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QListWidget\" name=\"c_column_names\"/>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_selection_desc\">\n       <property name=\"text\">\n        <string>Apply formula to selected objects only</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_use_column\">\n       <property name=\"text\">\n        <string>&lt;&lt; Use attribute</string>\n       </property>\n       <property name=\"checkable\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_use_column</sender>\n   <signal>clicked()</signal>\n   <receiver>CInsertColumnDlg</receiver>\n   <slot>OnUseAttribute()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>318</x>\n     <y>191</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>292</x>\n     <y>206</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CInsertColumnDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>283</x>\n     <y>253</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>138</x>\n     <y>241</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CInsertColumnDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>338</x>\n     <y>252</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>372</x>\n     <y>212</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnUseAttribute()</slot>\n  <slot>OnSelChangeColumnNames(QModelIndex)</slot>\n  <slot>OnDblclkColumnNames(QModelIndex)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/IsovistPathDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CIsovistPathDlg</class>\n <widget class=\"QDialog\" name=\"CIsovistPathDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>317</width>\n    <height>116</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Isovist Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Isovist field of view</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_fov_selection\">\n       <item>\n        <property name=\"text\">\n         <string>Quarter isovist (90 degrees)</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Third isovist (120 degrees)</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Half isovist (180 degrees)</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Full isovist (360 degrees)</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CIsovistPathDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>149</x>\n     <y>113</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>44</x>\n     <y>103</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CIsovistPathDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>217</x>\n     <y>117</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>291</x>\n     <y>101</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/LayerChooserDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CLayerChooserDlg</class>\n <widget class=\"QDialog\" name=\"CLayerChooserDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>274</width>\n    <height>134</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Choose Layer</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_text\">\n       <property name=\"text\">\n        <string>Layer\nLayer</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <widget class=\"QLabel\" name=\"label\">\n         <property name=\"text\">\n          <string>Layer</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QComboBox\" name=\"c_layer_selector\"/>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CLayerChooserDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>95</x>\n     <y>117</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>18</x>\n     <y>112</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CLayerChooserDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>170</x>\n     <y>124</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>242</x>\n     <y>121</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/LicenceDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CLicenceDialog</class>\n <widget class=\"QDialog\" name=\"CLicenceDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>364</width>\n    <height>274</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>depthmapX</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Welcome to depthmapX</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <widget class=\"QLabel\" name=\"c_message\">\n         <property name=\"text\">\n          <string>Licence message</string>\n         </property>\n         <property name=\"textFormat\">\n          <enum>Qt::AutoText</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"horizontalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Horizontal</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>40</width>\n           <height>20</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QTextEdit\" name=\"c_agreement\">\n       <property name=\"verticalScrollBarPolicy\">\n        <enum>Qt::ScrollBarAlwaysOn</enum>\n       </property>\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>Accept</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CLicenceDialog</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>189</x>\n     <y>246</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>64</x>\n     <y>229</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CLicenceDialog</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>270</x>\n     <y>240</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>343</x>\n     <y>234</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/MakeLayerDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CMakeLayerDlg</class>\n <widget class=\"QDialog\" name=\"CMakeLayerDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>511</width>\n    <height>318</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Create New Map</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Orgin Map</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_origin\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>New Map Type</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_layer_type\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>New Map Name</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_layer_name\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_keeporiginal\">\n       <property name=\"text\">\n        <string>Retain original map</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_push_values\">\n       <property name=\"text\">\n        <string>Copy attributes to new map</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <widget class=\"QCheckBox\" name=\"c_remove_stubs\">\n         <property name=\"text\">\n          <string>Remove axial stubs less than</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLineEdit\" name=\"c_percentage\">\n         <property name=\"enabled\">\n          <bool>false</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"label_4\">\n         <property name=\"text\">\n          <string>% of line length</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_layer_type</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CMakeLayerDlg</receiver>\n   <slot>OnSelchangeLayerType(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>167</x>\n     <y>114</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>196</x>\n     <y>80</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_remove_stubs</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CMakeLayerDlg</receiver>\n   <slot>OnRemoveStubs(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>103</x>\n     <y>292</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>64</x>\n     <y>321</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CMakeLayerDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>141</x>\n     <y>344</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>49</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CMakeLayerDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>250</x>\n     <y>349</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>315</x>\n     <y>330</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnSelchangeLayerType(int)</slot>\n  <slot>OnRemoveStubs(bool)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/MakeOptionsDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CMakeOptionsDlg</class>\n <widget class=\"QDialog\" name=\"CMakeOptionsDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>385</width>\n    <height>118</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Make Graph Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QCheckBox\" name=\"c_restrict_visibility\">\n       <property name=\"text\">\n        <string>Restrict visibile distance to </string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_maxdist\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"c_boundarygraph\">\n     <property name=\"text\">\n      <string>Make boundary graph</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_restrict_visibility</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CMakeOptionsDlg</receiver>\n   <slot>OnRestrict(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>117</x>\n     <y>28</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>209</x>\n     <y>46</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CMakeOptionsDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>104</x>\n     <y>94</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>29</x>\n     <y>81</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CMakeOptionsDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>204</x>\n     <y>96</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>279</x>\n     <y>82</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnRestrict(bool)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/NewLayerDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CNewLayerDlg</class>\n <widget class=\"QDialog\" name=\"CNewLayerDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>255</width>\n    <height>126</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>New Map</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Map type</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_layer_selector\">\n       <item>\n        <property name=\"text\">\n         <string>Data Map</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Convex Map</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Axial Map</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Pesh Map</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Name</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_name\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_layer_selector</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CNewLayerDlg</receiver>\n   <slot>OnSelchangeLayerType(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>147</x>\n     <y>40</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>75</x>\n     <y>10</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CNewLayerDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>108</x>\n     <y>121</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>22</x>\n     <y>118</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CNewLayerDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>207</x>\n     <y>120</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>248</x>\n     <y>98</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnSelchangeLayerType(int)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/OptionsDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>COptionsDlg</class>\n <widget class=\"QDialog\" name=\"COptionsDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>577</width>\n    <height>338</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Analysis Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Analysis Type</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_output_type\">\n        <property name=\"text\">\n         <string>Calculate isovist properties</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_radio1\">\n        <property name=\"text\">\n         <string>Calculate visibility relationships</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"c_global\">\n          <property name=\"text\">\n           <string>Include &amp;global measures |    Select radius (n or number)-&gt;</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLineEdit\" name=\"c_radius\"/>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"c_local\">\n        <property name=\"text\">\n         <string>Include &amp;local measures</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_radio2\">\n        <property name=\"text\">\n         <string>Calculate metric relationships</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n        <item>\n         <widget class=\"QLabel\" name=\"label\">\n          <property name=\"text\">\n           <string>Radius</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLineEdit\" name=\"c_radius2\"/>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_radio3\">\n        <property name=\"text\">\n         <string>Calculate angular relationships</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_radio4\">\n        <property name=\"text\">\n         <string>Calculate through vision</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n        <item>\n         <widget class=\"QLabel\" name=\"label_2\">\n          <property name=\"text\">\n           <string>Record gate counts in data map</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"c_layer_selector\"/>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_output_type</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnOutputType(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>92</x>\n     <y>35</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>246</x>\n     <y>1</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radio1</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnOutputType(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>148</x>\n     <y>72</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>330</x>\n     <y>52</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radio2</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnOutputType(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>141</x>\n     <y>156</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>329</x>\n     <y>164</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radio3</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnOutputType(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>132</x>\n     <y>231</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>328</x>\n     <y>231</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radio4</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnOutputType(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>122</x>\n     <y>256</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>324</x>\n     <y>315</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radius</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnUpdateRadius(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>106</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>331</x>\n     <y>93</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radius2</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnUpdateRadius2(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>110</x>\n     <y>188</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>331</x>\n     <y>192</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>115</x>\n     <y>337</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>29</x>\n     <y>324</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>COptionsDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>249</x>\n     <y>330</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>301</x>\n     <y>328</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOutputType(bool)</slot>\n  <slot>OnUpdateRadius(QString)</slot>\n  <slot>OnUpdateRadius2(QString)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/PromptReplace.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CPromptReplace</class>\n <widget class=\"QDialog\" name=\"CPromptReplace\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>362</width>\n    <height>112</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>depthmapX</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"c_message\">\n     <property name=\"text\">\n      <string>You already have line data loaded.  Do you want to\n add this new file to the existing line data, replace \nthe existing line data, or cancel?</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QPushButton\" name=\"c_add\">\n       <property name=\"text\">\n        <string>Add</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_replace\">\n       <property name=\"text\">\n        <string>Replace</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_add</sender>\n   <signal>clicked()</signal>\n   <receiver>CPromptReplace</receiver>\n   <slot>OnAdd()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>79</x>\n     <y>92</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>25</x>\n     <y>87</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_replace</sender>\n   <signal>clicked()</signal>\n   <receiver>CPromptReplace</receiver>\n   <slot>OnReplace()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>170</x>\n     <y>97</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>231</x>\n     <y>65</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CPromptReplace</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>264</x>\n     <y>93</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>291</x>\n     <y>92</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnAdd()</slot>\n  <slot>OnReplace()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/PushDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CPushDialog</class>\n <widget class=\"QDialog\" name=\"CPushDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>337</width>\n    <height>329</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Push Values to Map</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Origin map</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_origin_layer\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Origin attribute</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_origin_attribute\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Push values to</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_layer_selector\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_4\">\n       <property name=\"text\">\n        <string>If destination object intersects more than\n one object in origin map</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"c_function\">\n       <item>\n        <property name=\"text\">\n         <string>Take maximum attribute value</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Take minimum attribute value</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Take average attribute value</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Take total of attribute values</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"c_count_intersections\">\n     <property name=\"text\">\n      <string>Record object intersection count</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CPushDialog</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>133</x>\n     <y>288</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>46</x>\n     <y>277</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CPushDialog</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>206</x>\n     <y>289</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>248</x>\n     <y>271</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/RenameObjectDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CRenameObjectDlg</class>\n <widget class=\"QDialog\" name=\"CRenameObjectDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>264</width>\n    <height>114</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Rename Column</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"c_prompt\">\n       <property name=\"text\">\n        <string>Rename column to:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_object_name\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CRenameObjectDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>107</x>\n     <y>110</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>26</x>\n     <y>103</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CRenameObjectDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>211</x>\n     <y>113</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>250</x>\n     <y>103</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/SegmentAnalysisDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CSegmentAnalysisDlg</class>\n <widget class=\"QDialog\" name=\"CSegmentAnalysisDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>319</width>\n    <height>501</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Segment Analysis Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Analysis Type</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_analysis_type\">\n        <property name=\"text\">\n         <string>Tulip Analysis (Faster)</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n        <item>\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n          <item>\n           <widget class=\"QLabel\" name=\"label\">\n            <property name=\"layoutDirection\">\n             <enum>Qt::LeftToRight</enum>\n            </property>\n            <property name=\"text\">\n             <string>Tulip Bins (4 to 1024)</string>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <widget class=\"QLineEdit\" name=\"c_tulip_bins\"/>\n          </item>\n         </layout>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"label_2\">\n          <property name=\"text\">\n           <string>(1024 approximates full angular analysis)</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"c_choice\">\n        <property name=\"text\">\n         <string>Include choice (betweenness)</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_radio2\">\n        <property name=\"text\">\n         <string>Full Angular (Slower)</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox_2\">\n     <property name=\"title\">\n      <string>Radius Type</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_radius_type\">\n        <property name=\"text\">\n         <string>Segment Steps</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n        <item>\n         <widget class=\"QRadioButton\" name=\"radioButton\">\n          <property name=\"text\">\n           <string>Metric</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"c_radio3\">\n          <property name=\"text\">\n           <string>Angular</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n        <item>\n         <widget class=\"QLabel\" name=\"label_3\">\n          <property name=\"text\">\n           <string>Radius / List of radii</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLineEdit\" name=\"c_radius\"/>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox_3\">\n     <property name=\"title\">\n      <string>Weighted measures</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n      <item>\n       <widget class=\"QCheckBox\" name=\"c_weighted\">\n        <property name=\"text\">\n         <string>Include weighted measures</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n        <item>\n         <widget class=\"QLabel\" name=\"label_4\">\n          <property name=\"text\">\n           <string>Weight by</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"c_attribute\"/>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_analysis_type</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CSegmentAnalysisDlg</receiver>\n   <slot>OnAnalysisType(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>170</x>\n     <y>44</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>332</x>\n     <y>64</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radio2</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CSegmentAnalysisDlg</receiver>\n   <slot>OnAnalysisTulip(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>82</x>\n     <y>158</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>328</x>\n     <y>184</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_radius</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CSegmentAnalysisDlg</receiver>\n   <slot>OnUpdateRadius(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>250</x>\n     <y>304</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>328</x>\n     <y>304</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_weighted</sender>\n   <signal>clicked(bool)</signal>\n   <receiver>CSegmentAnalysisDlg</receiver>\n   <slot>OnWeighted(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>196</x>\n     <y>358</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>327</x>\n     <y>361</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CSegmentAnalysisDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>151</x>\n     <y>460</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>63</x>\n     <y>455</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>c_cancel</sender>\n   <signal>clicked()</signal>\n   <receiver>CSegmentAnalysisDlg</receiver>\n   <slot>OnCancel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>225</x>\n     <y>466</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>314</x>\n     <y>456</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnAnalysisType(bool)</slot>\n  <slot>OnAnalysisTulip(bool)</slot>\n  <slot>OnUpdateRadius(QString)</slot>\n  <slot>OnWeighted(bool)</slot>\n  <slot>OnOK()</slot>\n  <slot>OnCancel()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/TopoMetDlg.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CTopoMetDlg</class>\n <widget class=\"QDialog\" name=\"CTopoMetDlg\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>311</width>\n    <height>214</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Analysis Options</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Analysis Type</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n      <item>\n       <widget class=\"QRadioButton\" name=\"c_topological\">\n        <property name=\"text\">\n         <string>Topological (Axial)</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"radioButton\">\n        <property name=\"text\">\n         <string>Metric (Physical Distance)</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Radius (Metric units)</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"c_radius\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBox\">\n     <property name=\"text\">\n      <string>Selected segments only\n(Note: does not perform choice calculation)</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_ok\">\n       <property name=\"text\">\n        <string>OK</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"c_cancel\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>c_ok</sender>\n   <signal>clicked()</signal>\n   <receiver>CTopoMetDlg</receiver>\n   <slot>OnOK()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>147</x>\n     <y>205</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>45</x>\n     <y>192</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>OnOK()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "depthmapX/UI/doAll.sh",
    "content": "uic -o ../CompiledUI/ui_AboutDlg.h AboutDlg.ui\nuic -o ../CompiledUI/ui_AgentAnalysisDlg.h AgentAnalysisDlg.ui\nuic -o ../CompiledUI/ui_AttributeChooserDlg.h AttributeChooserDlg.ui\nuic -o ../CompiledUI/ui_AttributeSummary.h AttributeSummary.ui\nuic -o ../CompiledUI/ui_AxialAnalysisOptionsDlg.h AxialAnalysisOptionsDlg.ui\nuic -o ../CompiledUI/ui_ColourScaleDlg.h ColourScaleDlg.ui\nuic -o ../CompiledUI/ui_ColumnPropertiesDlg.h ColumnPropertiesDlg.ui\nuic -o ../CompiledUI/ui_ConvertShapesDlg.h ConvertShapesDlg.ui\nuic -o ../CompiledUI/ui_DepthmapAlert.h DepthmapAlert.ui\nuic -o ../CompiledUI/ui_DepthmapOptionsDlg.h DepthmapOptionsDlg.ui\nuic -o ../CompiledUI/ui_EditConnectionsDlg.h EditConnectionsDlg.ui\nuic -o ../CompiledUI/ui_FewestLineOptionsDlg.h FewestLineOptionsDlg.ui\nuic -o ../CompiledUI/ui_FilePropertiesDlg.h FilePropertiesDlg.ui\nuic -o ../CompiledUI/ui_FindLocDlg.h FindLocDlg.ui\nuic -o ../CompiledUI/ui_GridDialog.h GridDialog.ui\nuic -o ../CompiledUI/ui_InsertColumnDlg.h InsertColumnDlg.ui\nuic -o ../CompiledUI/ui_IsovistPathDlg.h IsovistPathDlg.ui\nuic -o ../CompiledUI/ui_LayerChooserDlg.h LayerChooserDlg.ui\nuic -o ../CompiledUI/ui_LicenceDialog.h LicenceDialog.ui\nuic -o ../CompiledUI/ui_MakeLayerDlg.h MakeLayerDlg.ui\nuic -o ../CompiledUI/ui_MakeOptionsDlg.h MakeOptionsDlg.ui\nuic -o ../CompiledUI/ui_NewLayerDlg.h NewLayerDlg.ui\nuic -o ../CompiledUI/ui_OptionsDlg.h OptionsDlg.ui\nuic -o ../CompiledUI/ui_PromptReplace.h PromptReplace.ui\nuic -o ../CompiledUI/ui_PushDialog.h PushDialog.ui\nuic -o ../CompiledUI/ui_RenameObjectDlg.h RenameObjectDlg.ui\nuic -o ../CompiledUI/ui_SegmentAnalysisDlg.h SegmentAnalysisDlg.ui\nuic -o ../CompiledUI/ui_TopoMetDlg.h TopoMetDlg.ui\n"
  },
  {
    "path": "depthmapX/UI/licenseagreement.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>LicenseAgreement</class>\n <widget class=\"QDialog\" name=\"LicenseAgreement\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>661</width>\n    <height>509</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Dialog</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n       <item>\n        <widget class=\"QLabel\" name=\"label_2\">\n         <property name=\"text\">\n          <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/images/depthmapX.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"label_3\">\n         <property name=\"minimumSize\">\n          <size>\n           <width>426</width>\n           <height>0</height>\n          </size>\n         </property>\n         <property name=\"text\">\n          <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:24pt;&quot;&gt;depthmapX&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-size:12pt;&quot;&gt;Multi-Platform Spatial Network Analysis Software&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/varoudis/depthmapX&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/varoudis/depthmapX&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;(C) 2000-2010 University College London, Alasdair Turner, Eva Friedrich&lt;br/&gt;(C) 2011-2014 Tasos Varoudis, UCL&lt;br/&gt;(C) 2017 Christian Sailer, Petros Koutsolampros&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-size:12pt;&quot;&gt;In memory of Alasdair Turner &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QTextBrowser\" name=\"textBrowser\">\n       <property name=\"html\">\n        <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;\n&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;\np, li { white-space: pre-wrap; }\n&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-size:14pt; color:#000000;&quot;&gt;(c) 2000-2010 University College London, Alasdair Turner, Eva Friedrich&lt;br /&gt;(c) 2011-2014, Tasos Varoudis&lt;br /&gt;(c) 2017 Christian Sailer, Petros Koutsolampros&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-size:14pt; color:#000000;&quot;&gt;This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-size:14pt; color:#000000;&quot;&gt;This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;\n&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Courier New,courier'; font-size:14pt; color:#000000;&quot;&gt;You should have received a copy of the GNU General Public License along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Click &quot;OK&quot; to Accept the License or Cancel to Exit...</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>68</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>LicenseAgreement</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>LicenseAgreement</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "depthmapX/compatibilitydefines.h",
    "content": "#ifndef COMPATIBILITYDEFINES_H\n#define COMPATIBILITYDEFINES_H\n\n#ifndef _WIN32\n#define TRUE 1\n#define FALSE 0\n\n#define LOBYTE(w)           ((unsigned char)((w) & 0xff))\n#define GetRValue(rgb)      (LOBYTE(rgb))\n#define GetGValue(rgb)      (LOBYTE((rgb) >> 8))\n#define GetBValue(rgb)      (LOBYTE((rgb)>>16))\n#endif\n\n#ifdef _WIN32\n#  ifdef MODULE_API_EXPORTS\n#    define MODULE_API __declspec(dllexport)\n#  else\n#    define MODULE_API __declspec(dllimport)\n#  endif\n#else\n#  define MODULE_API\n#endif\n\n#endif // COMPATIBILITYDEFINES_H\n"
  },
  {
    "path": "depthmapX/coreapplication.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"depthmapX/coreapplication.h\"\n#include <QDesktopWidget>\n\nint CoreApplication::exec() {\n    SettingsImpl settings(new DefaultSettingsFactory);\n\n    if (!settings.readSetting(SettingTag::licenseAccepted, false).toBool())\n    {\n        auto dummy = MainWindowFactory::getLicenseDialog();\n        dummy->setModal(true);\n        dummy->setWindowTitle(TITLE_BASE);\n        dummy->exec();\n        if ( dummy->result() == QDialog::Rejected) {\n            return 0;\n        }\n        settings.writeSetting(SettingTag::licenseAccepted, true);\n    }\n\n    auto args = arguments();\n    QString fileToLoad = mFileToLoad;\n    if (args.length() == 2)\n    {\n        fileToLoad = args[1];\n    }\n\n    mMainWindow = MainWindowFactory::getMainWindow(fileToLoad, settings);\n    mMainWindow->show();\n\n    QApplication::setWindowIcon(QIcon(\":/images/depthmapX.png\"));\n\n    return QApplication::exec();\n}\n"
  },
  {
    "path": "depthmapX/coreapplication.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/mainwindowfactory.h\"\n#include \"version.h\"\n#include \"settingsimpl.h\"\n#include <QApplication>\n#include <QFileOpenEvent>\n#include <QtDebug>\n\nclass CoreApplication : public QApplication\n{\nprivate:\n    QString mFileToLoad;\n    std::unique_ptr<MainWindow> mMainWindow;\npublic:\n    CoreApplication(int &argc, char **argv)\n        : QApplication(argc, argv)\n    {\n    }\n\n    bool event(QEvent *event)\n    {\n        // this event is triggered in macOS, either by calling \"Open with...\"\n        // in Finder, or by dropping a file on the depthmapX icon on the dock\n        // more info: http://doc.qt.io/qt-5/qfileopenevent.html\n        if (event->type() == QEvent::FileOpen) {\n            QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);\n            mFileToLoad = openEvent->file();\n            mMainWindow->loadFile(openEvent->file());\n        }\n\n        return QApplication::event(event);\n    }\n\n    int exec();\n};\n"
  },
  {
    "path": "depthmapX/dialogs/AboutDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"AboutDlg.h\"\r\n#include \"version.h\"\r\n\r\nCAboutDlg::CAboutDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tQString m_version_info;\r\n    m_version_info = QString(tr(\"Version %1.%2.%3 (%4, %5)\")).arg(DEPTHMAPX_MAJOR_VERSION).arg(DEPTHMAPX_MINOR_VERSION).arg(DEPTHMAPX_REVISION_VERSION).arg(APP_GIT_BRANCH).arg(APP_GIT_COMMIT);\r\n\tQString m_copyright;\r\n    m_copyright = QString(tr(\"(C) 2000-2010 University College London, Alasdair Turner, Eva Friedrich\\n(C) 2011-2014 Tasos Varoudis\\n(C) 2017 Christian Sailer, Petros Koutsolampros\"));\r\n\tQString m_agreement;\r\n    m_agreement = QString(tr(\"This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\x0D\\x0D\\x0A\\x0D\\x0D\\x0AThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\\x0D\\x0D\\x0A\\x0D\\x0D\\x0AYou should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.\"));\r\n\r\n    c_version_info->setText(m_version_info);\r\n\tc_copyright->setText(m_copyright);\r\n\tc_agreement->setText(m_agreement);\r\n}\r\n\r\nvoid CAboutDlg::OnOK()\r\n{\r\n\taccept();\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/AboutDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_AboutDlg.h\"\r\n\r\nclass CAboutDlg : public QDialog, public Ui::CAboutDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCAboutDlg(QWidget *parent = 0);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/AgentAnalysisDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"AgentAnalysisDlg.h\"\r\n\r\nCAgentAnalysisDlg::CAgentAnalysisDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_release_location = -1;\r\n\tm_fov = 0;\r\n\tm_frames = 0;\r\n\tm_release_rate = 0.0;\r\n\tm_steps = 0;\r\n\tm_timesteps = 0;\r\n\tm_occlusion = -1;\r\n\tm_record_trails = false;\r\n\tm_trail_count = 0;\r\n\t\r\n\tm_trail_count = 50;\r\n\tm_occlusion = 0;\r\n\tm_gatelayer = -1;\r\n\tm_release_location = 0;\r\n}\r\n\r\nvoid CAgentAnalysisDlg::OnOK()\r\n{\r\n\tm_timesteps = c_timesteps->text().toInt();\r\n\tm_release_location = c_release_location->isChecked();\r\n\tm_release_rate = c_release_rate->text().toDouble();\r\n\tm_fov = c_fov->text().toInt();\r\n\tm_steps = c_steps->text().toInt();\r\n\tm_frames = c_frames->text().toInt();\r\n\tif (c_record_trails->checkState())\r\n\t{\r\n\t\tm_record_trails = true;\r\n\t}\r\n\telse\r\n\t\tm_record_trails = false;\r\n\tm_occlusion = c_occlusion->currentIndex();\r\n\tm_trail_count = c_trail_count->text().toInt();\r\n\tm_gatelayer = c_layer_selector->currentIndex() - 1;\r\n\taccept();\r\n}\r\n\r\nvoid CAgentAnalysisDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CAgentAnalysisDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t}\r\n\telse\r\n\t{\r\n\r\n\t}\r\n}\r\n\r\nvoid CAgentAnalysisDlg::showEvent(QShowEvent * event)\r\n{\r\n\tc_timesteps->setText(QString(\"%1\").arg(m_timesteps));\r\n\tc_release_location->setChecked(m_release_location);\r\n\tc_release_rate->setText(QString(\"%1\").arg(m_release_rate));\r\n    c_fov->setValue(m_fov);\r\n    c_steps->setValue(m_steps);\r\n\tc_frames->setText(QString(\"%1\").arg(m_frames));\r\n\tif (m_record_trails)\r\n\t{\r\n\t\tc_record_trails->setCheckState(Qt::Checked);\r\n\t}\r\n\telse\r\n\t\tc_record_trails->setCheckState(Qt::Unchecked);\r\n\tc_occlusion->setCurrentIndex(m_occlusion);\r\n\tc_trail_count->setText(QString(\"%1\").arg(m_trail_count));\r\n\tfor (size_t i = 0; i < m_names.size(); i++) {\r\n\t\tc_layer_selector->addItem( QString(m_names[i].c_str()) );\r\n\t}\r\n\tc_layer_selector->setCurrentIndex(m_gatelayer + 1);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/AgentAnalysisDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_AgentAnalysisDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nclass CAgentAnalysisDlg : public QDialog, public Ui::CAgentAnalysisDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCAgentAnalysisDlg(QWidget *parent = 0);\r\n\tint\t\tm_release_location;\r\n\tint\t\tm_fov;\r\n\tint\t\tm_frames;\r\n\tdouble\tm_release_rate;\r\n\tint\t\tm_steps;\r\n\tint\t\tm_timesteps;\r\n\tint\t\tm_occlusion;\r\n\tbool\tm_record_trails;\r\n\tint\t\tm_trail_count;\r\n\t//}}AFX_DATA\r\n\r\n\tint m_gatelayer;\r\n    std::vector<std::string> m_names;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/AttributeChooserDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"AttributeChooserDlg.h\"\r\n\r\nCAttributeChooserDlg::CAttributeChooserDlg(AttributeTable& table, QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tc_attribute_chooser->setCurrentIndex(-1);//m_attribute = -1;\r\n\tc_text->setText(QString(tr(\"\")));\r\n\tm_table = &table;\r\n}\r\n\r\nvoid CAttributeChooserDlg::OnOK()\r\n{\r\n\tm_attribute = c_attribute_chooser->currentIndex();\r\n\tm_text = c_text->text();\r\n\tm_attribute--;\r\n\taccept();\r\n}\r\n\r\nvoid CAttributeChooserDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CAttributeChooserDlg::UpdateData(bool value)\r\n{\r\n\r\n}\r\n\r\nvoid CAttributeChooserDlg::showEvent(QShowEvent * event)\r\n{\r\n\tc_attribute_chooser->addItem(QString(tr(\"Ref Number\")));\r\n    for (int i = 0; i < m_table->getNumColumns(); i++) {\r\n\t\tc_attribute_chooser->addItem( QString(m_table->getColumnName(i).c_str()) );\r\n\t}\r\n\tc_attribute_chooser->setCurrentIndex(0);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/AttributeChooserDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_AttributeChooserDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nclass CAttributeChooserDlg : public QDialog, public Ui::CAttributeChooserDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n    CAttributeChooserDlg(AttributeTable& table, QWidget *parent = 0);\r\n\tint\t\tm_attribute;\r\n\tQString\tm_text;\r\n    AttributeTable *m_table;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/AttributeSummary.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"AttributeSummary.h\"\r\n#include \"GraphDoc.h\"\r\n#include \"ColumnPropertiesDlg.h\"\r\n\r\nCAttributeSummary::CAttributeSummary(QGraphDoc *pDoc, QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_pDoc = pDoc;\r\n}\r\n\r\nvoid CAttributeSummary::OnOK()\r\n{\r\n\taccept();\r\n}\r\n\r\nvoid CAttributeSummary::OnDblclkList(int row, int column)\r\n{\r\n\tif (row != -1) {\r\n        CColumnPropertiesDlg dlg(&(m_pDoc->m_meta_graph->getAttributeTable()), &(m_pDoc->m_meta_graph->getLayers()), row);\r\n\t\tdlg.exec();\r\n\t}\r\n}\r\n\r\nvoid CAttributeSummary::UpdateData(bool value)\r\n{\r\n\r\n}\r\n\r\nvoid CAttributeSummary::showEvent(QShowEvent * event)\r\n{\r\n    const AttributeTable& table = m_pDoc->m_meta_graph->getAttributeTable();\r\n\t\r\n\tc_list->setSelectionBehavior(QAbstractItemView::SelectRows);\r\n\r\n    c_list->setColumnCount(4);\r\n\t\r\n\tQTableWidgetItem *Item;\r\n\tItem = new QTableWidgetItem(\"Attribute\");\r\n\tc_list->setColumnWidth(0, 220);\r\n\tItem->setTextAlignment(Qt::AlignLeft);\r\n\tc_list->setHorizontalHeaderItem(0, Item);\r\n\r\n\tItem = new QTableWidgetItem(\"Minimum\");\r\n\tc_list->setColumnWidth(1, 100);\r\n\tItem->setTextAlignment(Qt::AlignRight);\r\n\tc_list->setHorizontalHeaderItem(1, Item);\r\n\r\n\tItem = new QTableWidgetItem(\"Average\");\r\n\tc_list->setColumnWidth(2, 100);\r\n\tItem->setTextAlignment(Qt::AlignRight);\r\n\tc_list->setHorizontalHeaderItem(2, Item);\r\n\r\n\tItem = new QTableWidgetItem(\"Maximum\");\r\n\tc_list->setColumnWidth(3, 100);\r\n\tItem->setTextAlignment(Qt::AlignRight);\r\n\tc_list->setHorizontalHeaderItem(3, Item);\r\n\t\r\n\tc_list->clearContents();\r\n\r\n    c_list->setRowCount(table.getNumColumns());\r\n    for (int i = 0; i < table.getNumColumns(); i++) {\r\n        const AttributeColumn& column = table.getColumn(i);\r\n        Item = new QTableWidgetItem(QString(column.getName().c_str()));\r\n\t\tItem->setFlags(Qt::NoItemFlags);\r\n\t\tc_list->setRowHeight(i, 20);\r\n\t\tc_list->setItem(i, 0, Item);\r\n\t\t//\r\n\t\tchar text[64];\r\n\t\t// Min\r\n        sprintf(text, \"%g\", column.getStats().min);\r\n\t\tItem = new QTableWidgetItem(QString(text));\r\n\t\tItem->setFlags(Qt::NoItemFlags);\r\n\t\tc_list->setItem(i, 1, Item);\r\n\t\t// Avg\r\n        sprintf(text,\"%g\", column.getStats().total/table.getNumRows());\r\n\t\tItem = new QTableWidgetItem(QString(text));\r\n\t\tItem->setFlags(Qt::NoItemFlags);\r\n\t\tc_list->setItem(i, 2, Item);\r\n\t\t// Max\r\n        sprintf(text,\"%g\",column.getStats().max);\r\n\t\tItem = new QTableWidgetItem(QString(text));\r\n\t\tItem->setFlags(Qt::NoItemFlags);\r\n\t\tc_list->setItem(i, 3, Item);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/AttributeSummary.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_AttributeSummary.h\"\r\n\r\nclass QGraphDoc;\r\n\r\nclass CAttributeSummary : public QDialog, public Ui::CAttributeSummary\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCAttributeSummary(QGraphDoc *pDoc, QWidget *parent = 0);\r\n\tQGraphDoc *m_pDoc;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnDblclkList(int row, int column);\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/AxialAnalysisOptionsDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2018, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"AxialAnalysisOptionsDlg.h\"\r\n#include \"mainwindow.h\"\r\n#include <QMessageBox>\r\n\r\nCAxialAnalysisOptionsDlg::CAxialAnalysisOptionsDlg(MetaGraph *graph, QWidget *parent) : QDialog(parent) {\r\n    setupUi(this);\r\n    m_radius = QString(tr(\"\"));\r\n    m_choice = false;\r\n    m_attribute = -1;\r\n    m_weighted = false;\r\n    m_rra = false;\r\n    m_local = false;\r\n\r\n    m_meta_graph = graph;\r\n\r\n    foreach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n        MainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n        if (mainWin) {\r\n            m_choice = mainWin->m_options.choice;\r\n            m_local = mainWin->m_options.local;\r\n            m_rra = mainWin->m_options.fulloutput;\r\n\r\n            m_radius = QString(tr(\"n\"));\r\n\r\n            if (mainWin->m_options.weighted_measure_col == -1) {\r\n                m_weighted = false;\r\n                m_attribute = -1;\r\n            } else {\r\n                m_weighted = true;\r\n                m_attribute = 0;\r\n            }\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (m_choice)\r\n        c_choice->setCheckState(Qt::Checked);\r\n    else\r\n        c_choice->setCheckState(Qt::Unchecked);\r\n\r\n    if (m_local)\r\n        c_local->setCheckState(Qt::Checked);\r\n    else\r\n        c_local->setCheckState(Qt::Unchecked);\r\n\r\n    if (m_rra)\r\n        c_rra->setCheckState(Qt::Checked);\r\n    else\r\n        c_rra->setCheckState(Qt::Unchecked);\r\n\r\n    if (m_weighted)\r\n        c_weighted->setCheckState(Qt::Checked);\r\n    else\r\n        c_weighted->setCheckState(Qt::Unchecked);\r\n\r\n    c_attribute_chooser->setCurrentIndex(m_attribute);\r\n    c_radius->setText(m_radius);\r\n}\r\n\r\nvoid CAxialAnalysisOptionsDlg::OnUpdateRadius() {\r\n    QString text;\r\n    text = c_radius->text();\r\n    if (!text.isEmpty() && text.indexOf(\"n\") == -1 && text.indexOf(\"N\") == -1 && text.indexOf(\"1\") == -1 &&\r\n        text.indexOf(\"2\") == -1 && text.indexOf(\"3\") == -1 && text.indexOf(\"4\") == -1 && text.indexOf(\"5\") == -1 &&\r\n        text.indexOf(\"6\") == -1 && text.indexOf(\"7\") == -1 && text.indexOf(\"8\") == -1 && text.indexOf(\"9\") == -1) {\r\n        QMessageBox::warning(this, tr(\"Warning\"),\r\n                             tr(\"The radius must either be numeric or 'n'\\n Alternatively, for multiple radii, type a \"\r\n                                \"list of comma separated numeric radii (you can include 'n')\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        c_radius->setText(tr(\"n\"));\r\n        c_radius->setFocus(Qt::OtherFocusReason);\r\n    }\r\n}\r\n\r\nvoid CAxialAnalysisOptionsDlg::OnWeighted() {\r\n    if (c_weighted->checkState()) {\r\n        UpdateData(true);\r\n        c_attribute_chooser->setEnabled(true);\r\n        m_attribute = 0;\r\n        UpdateData(false);\r\n    } else {\r\n        UpdateData(true);\r\n        c_attribute_chooser->setEnabled(false);\r\n        m_attribute = -1;\r\n        UpdateData(false);\r\n    }\r\n}\r\n\r\nvoid CAxialAnalysisOptionsDlg::OnOK() {\r\n    UpdateData(true);\r\n\r\n    if (m_radius.isEmpty() ||\r\n        (m_radius.indexOf(\"n\") == -1 && m_radius.indexOf(\"N\") == -1 && m_radius.indexOf(\"1\") == -1 &&\r\n         m_radius.indexOf(\"2\") == -1 && m_radius.indexOf(\"3\") == -1 && m_radius.indexOf(\"4\") == -1 &&\r\n         m_radius.indexOf(\"5\") == -1 && m_radius.indexOf(\"6\") == -1 && m_radius.indexOf(\"7\") == -1 &&\r\n         m_radius.indexOf(\"8\") == -1 && m_radius.indexOf(\"9\") == -1)) {\r\n        QMessageBox::warning(this, tr(\"Warning\"),\r\n                             tr(\"The radius must either be numeric or 'n'\\n Alternatively, for multiple radii, type a \"\r\n                                \"list of comma separated numeric radii (you can include 'n')\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        m_radius = tr(\"n\");\r\n        UpdateData(false);\r\n        c_radius->setFocus(Qt::OtherFocusReason);\r\n        return;\r\n    }\r\n    // now parse radius list:\r\n    foreach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n        MainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n        if (mainWin) {\r\n            mainWin->m_options.radius_set.clear();\r\n            QString curr_radius;\r\n            int curr_comma = -1, last_comma = 0;\r\n            bool add_rn = false;\r\n            do {\r\n                curr_comma = m_radius.indexOf(',', last_comma);\r\n                if (curr_comma != -1) {\r\n                    curr_radius = m_radius.mid(last_comma, curr_comma - last_comma);\r\n                    last_comma = curr_comma + 1;\r\n                } else {\r\n                    curr_radius = m_radius.mid(last_comma);\r\n                }\r\n                if (!curr_radius.isEmpty()) {\r\n                    if (curr_radius == \"n\" || curr_radius == \"N\") {\r\n                        add_rn = true;\r\n                    } else {\r\n                        int radius = curr_radius.toInt();\r\n                        if (radius <= 0) {\r\n                            QMessageBox::warning(\r\n                                this, tr(\"Warning\"),\r\n                                tr(\"Each radius in the list must either be 'n' or a number in the range 1-99\"),\r\n                                QMessageBox::Ok, QMessageBox::Ok);\r\n                            c_radius->setFocus(Qt::OtherFocusReason);\r\n                            return;\r\n                        }\r\n                        mainWin->m_options.radius_set.insert(static_cast<double>(radius));\r\n                    }\r\n                }\r\n            } while (curr_comma != -1);\r\n            if (mainWin->m_options.radius_set.size() == 0 || add_rn) {\r\n                mainWin->m_options.radius_set.insert(-1);\r\n            }\r\n\r\n            mainWin->m_options.choice = m_choice;\r\n            mainWin->m_options.local = m_local;\r\n            mainWin->m_options.fulloutput = m_rra;\r\n\r\n            // attributes:\r\n            if (!m_weighted) {\r\n                mainWin->m_options.weighted_measure_col = -1;\r\n            } else {\r\n                mainWin->m_options.weighted_measure_col = m_attribute;\r\n            }\r\n            break;\r\n        }\r\n    }\r\n\r\n    accept();\r\n}\r\n\r\nvoid CAxialAnalysisOptionsDlg::UpdateData(bool value) {\r\n    if (value) {\r\n        m_radius = c_radius->text();\r\n        if (c_choice->checkState())\r\n            m_choice = true;\r\n        else\r\n            m_choice = false;\r\n\r\n        m_attribute = c_attribute_chooser->currentIndex();\r\n\r\n        if (c_weighted->checkState())\r\n            m_weighted = true;\r\n        else\r\n            m_weighted = false;\r\n\r\n        if (c_rra->checkState())\r\n            m_rra = true;\r\n        else\r\n            m_rra = false;\r\n\r\n        if (c_local->checkState())\r\n            m_local = true;\r\n        else\r\n            m_local = false;\r\n    } else {\r\n        c_radius->setText(m_radius);\r\n        if (m_choice)\r\n            c_choice->setCheckState(Qt::Checked);\r\n        else\r\n            c_choice->setCheckState(Qt::Unchecked);\r\n\r\n        c_attribute_chooser->setCurrentIndex(m_attribute);\r\n        if (m_weighted)\r\n            c_weighted->setCheckState(Qt::Checked);\r\n        else\r\n            c_weighted->setCheckState(Qt::Unchecked);\r\n\r\n        if (m_rra)\r\n            c_rra->setCheckState(Qt::Checked);\r\n        else\r\n            c_rra->setCheckState(Qt::Unchecked);\r\n\r\n        if (m_local)\r\n            c_local->setCheckState(Qt::Checked);\r\n        else\r\n            c_local->setCheckState(Qt::Unchecked);\r\n    }\r\n}\r\n\r\nvoid CAxialAnalysisOptionsDlg::showEvent(QShowEvent *event) {\r\n    const ShapeGraph &map = m_meta_graph->getDisplayedShapeGraph();\r\n    const AttributeTable &table = map.getAttributeTable();\r\n    for (int i = 0; i < table.getNumColumns(); i++) {\r\n        c_attribute_chooser->addItem(QString(table.getColumnName(i).c_str()));\r\n    }\r\n\r\n    if (m_weighted) {\r\n        c_attribute_chooser->setEnabled(true);\r\n        m_attribute = 0;\r\n        c_attribute_chooser->setCurrentIndex(m_attribute);\r\n    } else {\r\n        m_attribute = -1;\r\n        c_attribute_chooser->setCurrentIndex(m_attribute);\r\n        c_attribute_chooser->setEnabled(true);\r\n    }\r\n\r\n    // UpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/AxialAnalysisOptionsDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_AxialAnalysisOptionsDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nclass CAxialAnalysisOptionsDlg : public QDialog, public Ui::CAxialAnalysisOptionsDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCAxialAnalysisOptionsDlg(MetaGraph *graph, QWidget *parent = 0);\r\n\tvoid UpdateData(bool value);\r\n\tQString\tm_radius;\r\n\tbool\tm_choice;\r\n\tint\t\tm_attribute;\r\n\tbool\tm_weighted;\r\n\tbool\tm_rra;\r\n\tbool\tm_local;\r\n\tMetaGraph *m_meta_graph;\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnUpdateRadius();\r\n\t\tvoid OnWeighted();\r\n\t\tvoid OnOK();\r\n        void OnCancel() { reject(); }\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/CMakeLists.txt",
    "content": "target_sources(depthmapX\n    PUBLIC\n        TopoMetDlg.h\n        SegmentAnalysisDlg.h\n        RenameObjectDlg.h\n        PushDialog.h\n        PromptReplace.h\n        OptionsDlg.h\n        NewLayerDlg.h\n        MakeOptionsDlg.h\n        MakeLayerDlg.h\n        LicenceDialog.h\n        LayerChooserDlg.h\n        IsovistPathDlg.h\n        InsertColumnDlg.h\n        GridDialog.h\n        FindLocDlg.h\n        FilePropertiesDlg.h\n        FewestLineOptionsDlg.h\n        EditConnectionsDlg.h\n        ConvertShapesDlg.h\n        ColumnPropertiesDlg.h\n        ColourScaleDlg.h\n        AxialAnalysisOptionsDlg.h\n        AttributeSummary.h\n        AttributeChooserDlg.h\n        AgentAnalysisDlg.h\n        AboutDlg.h\n        licenseagreement.h\n        settings/generalpage.h\n        settings/interfacepage.h\n        settings/settingspage.h\n        settings/settingsdialog.h\n    PRIVATE\n        TopoMetDlg.cpp\n        SegmentAnalysisDlg.cpp\n        RenameObjectDlg.cpp\n        PushDialog.cpp\n        PromptReplace.cpp\n        OptionsDlg.cpp\n        NewLayerDlg.cpp\n        MakeOptionsDlg.cpp\n        MakeLayerDlg.cpp\n        LicenceDialog.cpp\n        LayerChooserDlg.cpp\n        IsovistPathDlg.cpp\n        InsertColumnDlg.cpp\n        GridDialog.cpp\n        FindLocDlg.cpp\n        FilePropertiesDlg.cpp\n        FewestLineOptionsDlg.cpp\n        EditConnectionsDlg.cpp\n        ConvertShapesDlg.cpp\n        ColumnPropertiesDlg.cpp\n        ColourScaleDlg.cpp\n        AxialAnalysisOptionsDlg.cpp\n        AttributeSummary.cpp\n        AttributeChooserDlg.cpp\n        AgentAnalysisDlg.cpp\n        AboutDlg.cpp\n        licenseagreement.cpp\n        settings/generalpage.cpp\n        settings/interfacepage.cpp\n        settings/settingsdialog.cpp)\n"
  },
  {
    "path": "depthmapX/dialogs/ColourScaleDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"mainwindow.h\"\r\n\r\nCColourScaleDlg::CColourScaleDlg(QWidget *parent) : QDialog(parent) {\r\n    setupUi(this);\r\n    setWindowFlags(Qt::WindowStaysOnTopHint);\r\n\r\n    m_show_lines = false;\r\n    m_show_fill = false;\r\n    m_show_centroids = false;\r\n    m_blue = tr(\"\");\r\n    m_red = tr(\"\");\r\n    m_color = -1;\r\n\r\n    m_docked = false;\r\n\r\n    m_viewDoc = NULL;\r\n\r\n    m_red_brush.setColor(QColor(255, 128, 128)); // CreateSolidBrush(RGB(255,128,128));\r\n    m_blue_brush.setColor(QColor(128, 128, 255));\r\n\r\n    c_blue_slider_ctrl->setMinimum(0);\r\n    c_blue_slider_ctrl->setMaximum(100);\r\n    c_red_slider_ctrl->setMinimum(0);\r\n    c_red_slider_ctrl->setMaximum(100);\r\n    c_blue_slider_ctrl->setTickInterval(10);\r\n    c_red_slider_ctrl->setTickInterval(10);\r\n\r\n    // these are out of order...\r\n    c_color_type->addItem(QString(tr(\"Equal Ranges (3-Colour)\")));            // AXMANESQUE\r\n    c_color_type->addItem(QString(tr(\"Equal Ranges (Blue-Red)\")));            // BLUERED\r\n    c_color_type->addItem(QString(tr(\"Equal Ranges (Purple-Orange)\")));       // PURPLEORANGE\r\n    c_color_type->addItem(QString(tr(\"depthmapX Classic\")));                  // DEPTHMAPCLASSIC\r\n    c_color_type->addItem(QString(tr(\"Equal Ranges (Greyscale)\")));           // GREYSCALE\r\n    c_color_type->addItem(QString(tr(\"Equal Ranges (Monochrome)\")));          // MONOCHROME\r\n    c_color_type->addItem(QString(tr(\"Equal Ranges (3-Colour Hue Only)\")));   // HUEONLYAXMANESQUE\r\n\r\n    m_color_type_map.push_back(DisplayParams::AXMANESQUE);\r\n    m_color_type_map.push_back(DisplayParams::BLUERED);\r\n    m_color_type_map.push_back(DisplayParams::PURPLEORANGE);\r\n    m_color_type_map.push_back(DisplayParams::DEPTHMAPCLASSIC);\r\n    m_color_type_map.push_back(DisplayParams::GREYSCALE);\r\n    m_color_type_map.push_back(DisplayParams::MONOCHROME);\r\n    m_color_type_map.push_back(DisplayParams::HUEONLYAXMANESQUE);\r\n\r\n    Clear();\r\n\r\n    UpdateData(false);\r\n}\r\n\r\nvoid CColourScaleDlg::OnChangeBlueValue() {\r\n    QString str;\r\n    str = c_blue_value_window->text();\r\n    m_displayparams.blue = GetNormValue(str.toDouble());\r\n    c_blue_slider_ctrl->setValue(m_displayparams.blue * 100.0);\r\n    c_ok->setEnabled(true);\r\n    c_applytoall->setEnabled(true);\r\n}\r\n\r\nvoid CColourScaleDlg::OnChangeRedValue() {\r\n    QString str;\r\n    str = c_red_value_window->text();\r\n    m_displayparams.red = GetNormValue(str.toDouble());\r\n    c_red_slider_ctrl->setValue(m_displayparams.red * 100);\r\n    c_ok->setEnabled(true);\r\n    c_applytoall->setEnabled(true);\r\n}\r\n\r\nvoid CColourScaleDlg::OnReleasedRedSlider(int val) {\r\n    double value = double(c_red_slider_ctrl->value()) / 100.0;\r\n    QString text;\r\n    text.sprintf(\"%.2f\", GetActualValue(value));\r\n    c_red_value_window->setText(text);\r\n}\r\n\r\nvoid CColourScaleDlg::OnReleasedBlueSlider(int val) {\r\n    double value = double(c_blue_slider_ctrl->value()) / 100.0;\r\n    QString text;\r\n    text.sprintf(\"%.2f\", GetActualValue(value));\r\n    c_blue_value_window->setText(text);\r\n}\r\n\r\nvoid CColourScaleDlg::OnSelchangeColor(int value) {\r\n    UpdateData(true);\r\n\r\n    if (m_color_type_map.size() <= (size_t)value)\r\n        return;\r\n\r\n    m_color = m_color_type_map[value];\r\n\r\n    if (m_color == 0 || m_color == 3 || m_color == 5 || m_color == 6) {\r\n        m_red = \"Red\";\r\n        m_blue = \"Blue\";\r\n    } else if (m_color == 4) {\r\n        m_red = \"Orange\";\r\n        m_blue = \"Purple\";\r\n    } else if (m_color == 1) {\r\n        m_red = \"White\";\r\n        m_blue = \"Black\";\r\n    } else {\r\n        m_red = \"Thick\";\r\n        m_blue = \"Thin\";\r\n    }\r\n\r\n    UpdateData(false);\r\n\r\n    c_ok->setEnabled(true);\r\n    c_applytoall->setEnabled(true);\r\n}\r\n\r\nvoid CColourScaleDlg::OnBnClickedShowLines(bool value) { c_ok->setEnabled(true); }\r\n\r\nvoid CColourScaleDlg::OnBnClickedShowFill(bool value) { c_ok->setEnabled(true); }\r\n\r\nvoid CColourScaleDlg::OnBnClickedShowCentroids(bool value) { c_ok->setEnabled(true); }\r\n\r\nvoid CColourScaleDlg::OnBnClickedApplytoall() {\r\n    MyUpdateData(true, true);\r\n\r\n    // don't destroy\r\n    c_ok->setEnabled(false);\r\n    c_applytoall->setEnabled(false);\r\n}\r\n\r\nvoid CColourScaleDlg::OnOK() {\r\n    MyUpdateData(true, false);\r\n\r\n    // don't destroy\r\n    c_ok->setEnabled(false);\r\n}\r\n\r\nvoid CColourScaleDlg::OnCancel() {\r\n    // don't destroy, simply hide:\r\n    hide();\r\n}\r\n\r\nvoid CColourScaleDlg::UpdateData(bool value) {\r\n    if (value) {\r\n        m_blue = c_blue->text();\r\n        m_red = c_red->text();\r\n        if (c_show_lines->checkState())\r\n            m_show_lines = true;\r\n        else\r\n            m_show_lines = false;\r\n\r\n        if (c_show_fill->checkState())\r\n            m_show_fill = true;\r\n        else\r\n            m_show_fill = false;\r\n\r\n        if (c_show_centroids->checkState())\r\n            m_show_centroids = true;\r\n        else\r\n            m_show_centroids = false;\r\n    } else // push data to controls:\r\n    {\r\n        c_blue->setText(m_blue);\r\n        c_red->setText(m_red);\r\n        if (m_show_lines)\r\n            c_show_lines->setCheckState(Qt::Checked);\r\n        else\r\n            c_show_lines->setCheckState(Qt::Unchecked);\r\n\r\n        if (m_show_fill)\r\n            c_show_fill->setCheckState(Qt::Checked);\r\n        else\r\n            c_show_fill->setCheckState(Qt::Unchecked);\r\n\r\n        if (m_show_centroids)\r\n            c_show_centroids->setCheckState(Qt::Checked);\r\n        else\r\n            c_show_centroids->setCheckState(Qt::Unchecked);\r\n    }\r\n}\r\n\r\nvoid CColourScaleDlg::Clear() {\r\n    m_color = -1;\r\n    c_color_type->setEnabled(false);\r\n    m_blue = \"Min\";\r\n    m_red = \"Max\";\r\n    c_blue_value_window->setEnabled(false);\r\n    c_blue_value_window->setText(tr(\"\"));\r\n    c_red_value_window->setEnabled(false);\r\n    c_red_value_window->setText(tr(\"\"));\r\n    c_blue_slider_ctrl->setEnabled(false);\r\n    c_blue_slider_ctrl->setValue(0);\r\n    c_red_slider_ctrl->setEnabled(false);\r\n    c_red_slider_ctrl->setValue(100);\r\n    c_ok->setEnabled(false);\r\n    c_applytoall->setEnabled(false);\r\n\r\n    UpdateData(false);\r\n}\r\n\r\ndouble CColourScaleDlg::GetActualValue(double sliderpos) {\r\n    return sliderpos * (m_display_max - m_display_min) + m_display_min;\r\n}\r\n\r\nfloat CColourScaleDlg::GetNormValue(double actualval) {\r\n    return ((actualval - m_display_min) / (m_display_max - m_display_min));\r\n}\r\n\r\nvoid CColourScaleDlg::Fill() {\r\n    if (m_color == 0 || m_color == 3 || m_color == 5) {\r\n        m_red = \"Red\";\r\n        m_blue = \"Blue\";\r\n    } else if (m_color == 4) {\r\n        m_red = \"Orange\";\r\n        m_blue = \"Purple\";\r\n    } else if (m_color == 1) {\r\n        m_red = \"White\";\r\n        m_blue = \"Black\";\r\n    } else {\r\n        m_red = \"Thick\";\r\n        m_blue = \"Thin\";\r\n    }\r\n\r\n    QString text;\r\n    text.sprintf(\"%.2f\", GetActualValue(m_displayparams.blue));\r\n    c_blue_value_window->setText(text);\r\n    text.sprintf(\"%.2f\", GetActualValue(m_displayparams.red));\r\n    c_red_value_window->setText(text);\r\n\r\n    c_blue_slider_ctrl->setValue(int(m_displayparams.blue * 100));\r\n    c_red_slider_ctrl->setValue(int(m_displayparams.red * 100));\r\n\r\n    c_color_type->setEnabled(true);\r\n    c_blue_value_window->setEnabled(true);\r\n    c_red_value_window->setEnabled(true);\r\n    c_blue_slider_ctrl->setEnabled(true);\r\n    c_red_slider_ctrl->setEnabled(true);\r\n    c_ok->setEnabled(false);\r\n    c_applytoall->setEnabled(false);\r\n\r\n    UpdateData(false);\r\n}\r\n\r\nvoid CColourScaleDlg::OnFocusGraph(QGraphDoc *pDoc, int lParam) {\r\n    if (lParam == QGraphDoc::CONTROLS_DESTROYALL && pDoc == m_viewDoc) { // Lost graph\r\n        m_viewDoc = NULL;\r\n        MyUpdateData(false, false);\r\n    } else if (lParam == QGraphDoc::CONTROLS_LOADALL &&\r\n               pDoc != m_viewDoc) { // [Possible] change of window (sent on focus)\r\n        m_viewDoc = pDoc;\r\n        MyUpdateData(false, false);\r\n    } else if (lParam != QGraphDoc::CONTROLS_LOADALL && pDoc == m_viewDoc) { // Force update if match current window\r\n        MyUpdateData(false, false);\r\n    }\r\n}\r\n\r\nvoid CColourScaleDlg::MyUpdateData(bool dir, bool apply_to_all) {\r\n    if (dir == false) {\r\n        // push data to controls:\r\n        if (m_viewDoc == NULL) {\r\n            Clear();\r\n        } else {\r\n            MetaGraph *graph = m_viewDoc->m_meta_graph;\r\n            if (graph->viewingProcessed()) {\r\n                if (graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                    PointMap &map = graph->getDisplayedPointMap();\r\n                    m_display_min = map.getDisplayMinValue();\r\n                    m_display_max = map.getDisplayMaxValue();\r\n                    m_displayparams = map.getDisplayParams();\r\n                    m_color = m_displayparams.colorscale;\r\n                } else if (graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                    ShapeGraph &map = graph->getDisplayedShapeGraph();\r\n                    if (map.getShapeCount() > 0) {\r\n                        m_display_min = map.getDisplayMinValue();\r\n                        m_display_max = map.getDisplayMaxValue();\r\n                    }\r\n                    m_displayparams = map.getDisplayParams();\r\n                    m_color = m_displayparams.colorscale;\r\n                    bool show_lines = m_show_lines, show_fill = m_show_fill, show_centroids = m_show_centroids;\r\n                    map.getPolygonDisplay(show_lines, show_fill, show_centroids);\r\n                    m_show_lines = show_lines;\r\n                    m_show_fill = show_fill;\r\n                    m_show_centroids = show_centroids;\r\n                } else if (graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n                    ShapeMap &map = graph->getDisplayedDataMap();\r\n                    if (map.getShapeCount() > 0) {\r\n                        m_display_min = map.getDisplayMinValue();\r\n                        m_display_max = map.getDisplayMaxValue();\r\n                    }\r\n                    m_displayparams = map.getDisplayParams();\r\n                    m_color = m_displayparams.colorscale;\r\n                    bool show_lines = m_show_lines, show_fill = m_show_fill, show_centroids = m_show_centroids;\r\n                    map.getPolygonDisplay(show_lines, show_fill, show_centroids);\r\n                    m_show_lines = show_lines;\r\n                    m_show_fill = show_fill;\r\n                    m_show_centroids = show_centroids;\r\n                }\r\n                for (size_t i = 0; i < m_color_type_map.size(); i++) {\r\n                    if (m_color == m_color_type_map[i]) {\r\n                        c_color_type->setCurrentIndex(i);\r\n                    }\r\n                }\r\n                Fill();\r\n            } else {\r\n                Clear();\r\n            }\r\n        }\r\n        UpdateData(false);\r\n    } else {\r\n        // get data from controls:\r\n        UpdateData(true);\r\n\r\n        if (m_viewDoc != NULL) {\r\n            MetaGraph *graph = m_viewDoc->m_meta_graph;\r\n            m_color = m_color_type_map[c_color_type->currentIndex()];\r\n            m_displayparams.colorscale = m_color;\r\n            if (graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                graph->getDisplayedPointMap().setDisplayParams(m_displayparams, apply_to_all);\r\n            } else if (graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                graph->getDisplayedShapeGraph().setDisplayParams(m_displayparams, apply_to_all);\r\n                graph->getDisplayedShapeGraph().setPolygonDisplay(m_show_lines, m_show_fill, m_show_centroids);\r\n            } else if (graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n                graph->getDisplayedDataMap().setDisplayParams(m_displayparams, apply_to_all);\r\n                graph->getDisplayedDataMap().setPolygonDisplay(m_show_lines, m_show_fill, m_show_centroids);\r\n            }\r\n        }\r\n        m_viewDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP);\r\n    }\r\n}\r\n\r\nvoid CColourScaleDlg::showEvent(QShowEvent *event) {\r\n    // UpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/ColourScaleDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#ifndef ColourScaleDlg_H\r\n#define ColourScaleDlg_H\r\n\r\n#include \"depthmapX/GraphDoc.h\"\r\n#include \"depthmapX/ui_ColourScaleDlg.h\"\r\n\r\nclass CColourScaleDlg : public QDialog, public Ui::CColourScaleDlg {\r\n    Q_OBJECT\r\n  public:\r\n    CColourScaleDlg(QWidget *parent = 0);\r\n    QGraphDoc *m_viewDoc;\r\n    QString m_blue;\r\n    QString m_red;\r\n    int m_color;\r\n\r\n    bool m_docked;\r\n\r\n    double m_display_min;\r\n    double m_display_max;\r\n    double GetActualValue(double sliderpos);\r\n    float GetNormValue(double actualval);\r\n\r\n    QBrush m_red_brush;\r\n    QBrush m_blue_brush;\r\n    DisplayParams m_displayparams;\r\n\r\n    void MyUpdateData(bool dir, bool apply_to_all);\r\n    void Clear();\r\n    void Fill();\r\n    bool m_show_lines;\r\n    bool m_show_fill;\r\n    bool m_show_centroids;\r\n    std::vector<int> m_color_type_map;\r\n    void UpdateData(bool value);\r\n    void showEvent(QShowEvent *event);\r\n    void OnFocusGraph(QGraphDoc *pDoc, int lParam);\r\n\r\n  private slots:\r\n    void OnChangeBlueValue();\r\n    void OnChangeRedValue();\r\n    void OnReleasedRedSlider(int);\r\n    void OnReleasedBlueSlider(int);\r\n    void OnSelchangeColor(int);\r\n    void OnBnClickedShowLines(bool);\r\n    void OnBnClickedShowFill(bool);\r\n    void OnBnClickedShowCentroids(bool);\r\n    void OnBnClickedApplytoall();\r\n    void OnOK();\r\n    void OnCancel();\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "depthmapX/dialogs/ColumnPropertiesDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ColumnPropertiesDlg.h\"\r\n\r\n#include \"genlib/stringutils.h\"\r\n\r\nCColumnPropertiesDlg::CColumnPropertiesDlg(AttributeTable *table, LayerManagerImpl *layers, int col, QWidget *parent)\r\n    : QDialog(parent) {\r\n    setupUi(this);\r\n    m_formula = tr(\"\");\r\n    m_name = tr(\"\");\r\n    m_name_text = tr(\"\");\r\n    m_creator = tr(\"\");\r\n    m_formula_note = tr(\"\");\r\n\r\n    m_table = table;\r\n    m_layers = layers;\r\n    m_col = col;\r\n\r\n    AttributeColumn &column = m_table->getColumn(m_col);\r\n    m_name = column.getName().c_str();\r\n    m_formula = column.getFormula().c_str();\r\n\r\n    if (!column.isLocked()) {\r\n        m_name_text = \"Name\";\r\n    } else {\r\n        m_name_text = \"Name (column locked and cannot be edited)\";\r\n    }\r\n\r\n    if (m_formula.isEmpty()) {\r\n        // m_formula_note.Empty();\r\n    } else {\r\n        m_formula_note = tr(\"Note: the formula may have been applied to a subset of objects\");\r\n    }\r\n\r\n    UpdateData(false);\r\n}\r\n\r\nvoid CColumnPropertiesDlg::OnOK() {\r\n    UpdateData(true);\r\n    accept();\r\n}\r\n\r\nvoid CColumnPropertiesDlg::UpdateData(bool value) {\r\n    std::vector<QString> rows;\r\n    std::vector<double> summary_all;\r\n    std::vector<double> summary_sel;\r\n\r\n    rows.push_back(tr(\"Average\"));\r\n    rows.push_back(tr(\"Minimum\"));\r\n    rows.push_back(tr(\"Maximum\"));\r\n    rows.push_back(tr(\"Std Dev\"));\r\n    rows.push_back(tr(\"Count\"));\r\n\r\n    int i;\r\n    for (i = 0; i < 15; i++) {\r\n        if (i == 1 || i == 2) {\r\n            // minimum and maximum\r\n            summary_all.push_back(-1.0);\r\n            summary_sel.push_back(-1.0);\r\n        } else {\r\n            summary_all.push_back(0.0);\r\n            summary_sel.push_back(0.0);\r\n        }\r\n    }\r\n\r\n    for (auto iter = m_table->begin(); iter != m_table->end(); iter++) {\r\n        auto &row = iter->getRow();\r\n        double val = row.getValue(m_col);\r\n        if (val != -1.0 && isObjectVisible(*m_layers, iter->getRow())) {\r\n            summary_all[0] += val;\r\n            summary_all[4] += 1.0;\r\n            if (summary_all[1] == -1.0 || val < summary_all[1]) {\r\n                summary_all[1] = val;\r\n            }\r\n            if (summary_all[2] == -1.0 || val > summary_all[2]) {\r\n                summary_all[2] = val;\r\n            }\r\n            if (row.isSelected()) {\r\n                summary_sel[0] += val;\r\n                summary_sel[4] += 1.0;\r\n                if (summary_sel[1] == -1.0 || val < summary_sel[1]) {\r\n                    summary_sel[1] = val;\r\n                }\r\n                if (summary_sel[2] == -1.0 || val > summary_sel[2]) {\r\n                    summary_sel[2] = val;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    bool freqrows = false;\r\n    double unit;\r\n    if (summary_all[1] != -1.0 && summary_all[2] != -1.0 && summary_all[1] != summary_all[2]) {\r\n        freqrows = true;\r\n        unit = (summary_all[2] - summary_all[1]) / 10.0;\r\n        for (int i = 0; i < 10; i++) {\r\n            std::string name;\r\n            if (i == 0) {\r\n                name = dXstring::formatString(summary_all[1] + unit, \"< %f\");\r\n            } else if (i == 9) {\r\n                name = dXstring::formatString(summary_all[2] - unit, \"> %f\");\r\n            } else {\r\n                name = dXstring::formatString(summary_all[1] + unit * i, \"%f\") + \" to \" +\r\n                       dXstring::formatString(summary_all[1] + unit * (i + 1), \"%f\");\r\n            }\r\n            // Unicode conversion a bit of a mess here AT (01.02.11)\r\n            rows.push_back(QString(name.c_str()));\r\n        }\r\n    }\r\n\r\n    if (summary_all[4] != 0) {\r\n        summary_all[0] /= summary_all[4];\r\n    }\r\n    if (summary_sel[4] != 0) {\r\n        summary_sel[0] /= summary_sel[4];\r\n    }\r\n\r\n    // count of things rows: just for visible at the moment\r\n\r\n    double var_all = 0.0;\r\n    double var_sel = 0.0;\r\n    for (auto iter = m_table->begin(); iter != m_table->end(); iter++) {\r\n        auto &row = iter->getRow();\r\n        double val = row.getValue(m_col);\r\n        if (val != -1.0 && isObjectVisible(*m_layers, iter->getRow())) {\r\n            var_all += sqr(val - summary_all[0]);\r\n            if (freqrows) {\r\n                int pos = floor((val - summary_all[1]) / unit);\r\n                if (pos == 10)\r\n                    pos = 9; // irritating exactly equal to max\r\n                summary_all[5 + pos] += 1;\r\n            }\r\n            if (row.isSelected()) {\r\n                var_sel += sqr(val - summary_sel[0]);\r\n                if (freqrows) {\r\n                    // note: must use summary_all even on selected to make difference\r\n                    int pos = floor((val - summary_all[1]) / unit);\r\n                    if (pos == 10)\r\n                        pos = 9; // irritating exactly equal to max\r\n                    summary_sel[5 + pos] += 1;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (summary_all[4] != 0) {\r\n        summary_all[3] = sqrt(var_all / summary_all[4]);\r\n    }\r\n    if (summary_sel[4] != 0) {\r\n        summary_sel[3] = sqrt(var_sel / summary_sel[4]);\r\n    }\r\n\r\n    c_summary->setSelectionBehavior(QAbstractItemView::SelectRows);\r\n    c_summary->setColumnCount(3);\r\n\r\n    QTableWidgetItem *Item;\r\n    Item = new QTableWidgetItem(\"Value\");\r\n    c_summary->setColumnWidth(0, 100);\r\n    Item->setTextAlignment(Qt::AlignLeft);\r\n    c_summary->setHorizontalHeaderItem(0, Item);\r\n\r\n    Item = new QTableWidgetItem(\"Attribute\");\r\n    c_summary->setColumnWidth(1, 100);\r\n    Item->setTextAlignment(Qt::AlignRight);\r\n    c_summary->setHorizontalHeaderItem(1, Item);\r\n\r\n    Item = new QTableWidgetItem(\"Selection\");\r\n    c_summary->setColumnWidth(2, 100);\r\n    Item->setTextAlignment(Qt::AlignRight);\r\n    c_summary->setHorizontalHeaderItem(2, Item);\r\n\r\n    c_summary->clearContents();\r\n\r\n    c_summary->setRowCount(15);\r\n    for (i = 0; i < 15; i++) {\r\n        if (i == 5 && !freqrows) {\r\n            break;\r\n        }\r\n        Item = new QTableWidgetItem(rows[i]);\r\n        Item->setFlags(Qt::NoItemFlags);\r\n        c_summary->setRowHeight(i, 20);\r\n        c_summary->setItem(i, 0, Item);\r\n        //\r\n        char text[64];\r\n        // All\r\n        if (i == 4 || summary_all[4] != 0) {\r\n            sprintf(text, \"%g\", summary_all[i]);\r\n        } else {\r\n            strcpy(text, \"No Value\");\r\n        }\r\n        Item = new QTableWidgetItem(QString(text));\r\n        Item->setFlags(Qt::NoItemFlags);\r\n        c_summary->setItem(i, 1, Item);\r\n        // Sel\r\n        if (i == 4 || summary_sel[4] != 0) {\r\n            sprintf(text, \"%g\", summary_sel[i]);\r\n        } else {\r\n            strcpy(text, \"No Value\");\r\n        }\r\n        Item = new QTableWidgetItem(QString(text));\r\n        Item->setFlags(Qt::NoItemFlags);\r\n        c_summary->setItem(i, 2, Item);\r\n    }\r\n    if (value) {\r\n        m_formula = c_formula->toPlainText();\r\n        m_name = c_name->text();\r\n        m_name_text = c_name_text->text();\r\n        m_formula_note = c_formula_note->text();\r\n    } else {\r\n        c_formula->setPlainText(m_formula);\r\n        c_name->setText(m_name);\r\n        c_name_text->setText(m_name_text);\r\n        c_formula_note->setText(m_formula_note);\r\n    }\r\n}\r\n\r\nvoid CColumnPropertiesDlg::showEvent(QShowEvent *event) { UpdateData(false); }\r\n"
  },
  {
    "path": "depthmapX/dialogs/ColumnPropertiesDlg.h",
    "content": "#// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_ColumnPropertiesDlg.h\"\r\n#include <salalib/axialmap.h>\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n\r\nclass CColumnPropertiesDlg : public QDialog, public Ui::CColumnPropertiesDlg {\r\n    Q_OBJECT\r\n  public:\r\n    CColumnPropertiesDlg(AttributeTable *table = NULL, LayerManagerImpl *layers = NULL, int col = -1,\r\n                         QWidget *parent = 0);\r\n    AttributeTable *m_table;\r\n    LayerManagerImpl *m_layers;\r\n    int m_col;\r\n    QString m_formula;\r\n    QString m_name;\r\n    QString m_name_text;\r\n    QString m_creator;\r\n    QString m_formula_note;\r\n    void UpdateData(bool value);\r\n    void showEvent(QShowEvent *event);\r\n\r\n  private slots:\r\n    void OnOK();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/ConvertShapesDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ConvertShapesDlg.h\"\r\n\r\nCConvertShapesDlg::CConvertShapesDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_radius = 10.0;\r\n\tm_selected_only = false;\r\n\tm_conversion_type = 0;\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CConvertShapesDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CConvertShapesDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CConvertShapesDlg::UpdateData(bool value)\r\n{\r\n    double m_radius = 0.0;\r\n\tif (value)\r\n\t{\r\n        m_radius = c_radius->text().toDouble();\r\n\t\tif (c_selected_only->checkState())\r\n\t\t\tm_selected_only = true;\r\n\t\telse\r\n\t\t\tm_selected_only = false;\r\n\r\n\t\tm_conversion_type = c_conversion_type->currentIndex();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_radius->setText(QString(\"%1\").arg(m_radius));\r\n\t\tif (m_selected_only)\r\n\t\t\tc_selected_only->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_selected_only->setCheckState(Qt::Unchecked);\r\n\r\n\t\tc_conversion_type->setCurrentIndex(m_conversion_type);\r\n\t}\r\n}\r\n\r\nvoid CConvertShapesDlg::showEvent(QShowEvent *event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n\r\n"
  },
  {
    "path": "depthmapX/dialogs/ConvertShapesDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_ConvertShapesDlg.h\"\r\n\r\nclass CConvertShapesDlg : public QDialog, public Ui::CConvertShapesDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCConvertShapesDlg(QWidget *parent = 0);\r\n\tdouble m_radius;\r\n\tbool m_selected_only;\r\n\tint m_conversion_type;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/EditConnectionsDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"EditConnectionsDlg.h\"\r\n\r\nCEditConnectionsDlg::CEditConnectionsDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_pin_to_sel = true;\r\n\tm_sel_to_pin = true;\r\n\tm_join_type = false;\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CEditConnectionsDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CEditConnectionsDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CEditConnectionsDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_join_type = c_join_type->isChecked();\r\n\t\tif (c_sel_to_pin->checkState())\r\n\t\t\tm_sel_to_pin = true;\r\n\t\telse\r\n\t\t\tm_sel_to_pin = false;\r\n\r\n\t\tif (c_pin_to_sel->checkState())\r\n\t\t\tm_pin_to_sel = true;\r\n\t\telse\r\n\t\t\tm_pin_to_sel = false;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_join_type->setChecked(m_join_type);\r\n\t\tif (m_sel_to_pin)\r\n\t\t\tc_sel_to_pin->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_sel_to_pin->setCheckState(Qt::Unchecked);\r\n\r\n\t\tif (m_pin_to_sel)\r\n\t\t\tc_pin_to_sel->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_pin_to_sel->setCheckState(Qt::Unchecked);\r\n\t}\r\n}\r\n\r\nvoid CEditConnectionsDlg::showEvent(QShowEvent *event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/EditConnectionsDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_EditConnectionsDlg.h\"\r\n\r\nclass CEditConnectionsDlg : public QDialog, public Ui::CEditConnectionsDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCEditConnectionsDlg(QWidget *parent = 0);\r\n\tbool\tm_join_type;\r\n\tbool\tm_sel_to_pin;\r\n\tbool\tm_pin_to_sel;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/FewestLineOptionsDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"FewestLineOptionsDlg.h\"\r\n\r\nCFewestLineOptionsDlg::CFewestLineOptionsDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_option = false;\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CFewestLineOptionsDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CFewestLineOptionsDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CFewestLineOptionsDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_option = c_option->isChecked();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_option->setChecked(m_option);\r\n\t}\r\n}\r\n\r\nvoid CFewestLineOptionsDlg::showEvent(QShowEvent *event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/FewestLineOptionsDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_FewestLineOptionsDlg.h\"\r\n\r\nclass CFewestLineOptionsDlg : public QDialog, public Ui::CFewestLineOptionsDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCFewestLineOptionsDlg(QWidget *parent = 0);\r\n\tbool\tm_option;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/FilePropertiesDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"FilePropertiesDlg.h\"\r\n\r\nCFilePropertiesDlg::CFilePropertiesDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_author = tr(\"\");\r\n\tm_create_date = tr(\"\");\r\n\tm_create_program = tr(\"\");\r\n\tm_description = tr(\"\");\r\n\tm_location = tr(\"\");\r\n\tm_organization = tr(\"\");\r\n\tm_title = tr(\"\");\r\n\tm_file_version = tr(\"\");\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CFilePropertiesDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CFilePropertiesDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CFilePropertiesDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_author = c_author->text();\r\n\t\tm_create_date = c_create_date->text();\r\n\t\tm_create_program = c_create_program->text();\r\n\t\tm_description = c_description->toPlainText();\r\n\t\tm_location = c_location->text();\r\n\t\tm_organization = c_organization->text();\r\n\t\tm_title = c_title->text();\r\n\t\tm_file_version = c_file_version->text();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_author->setText(m_author);\r\n\t\tc_create_date->setText(m_create_date);\r\n\t\tc_create_program->setText(m_create_program);\r\n\t\tc_description->setPlainText(m_description);\r\n\t\tc_location->setText(m_location);\r\n\t\tc_organization->setText(m_organization);\r\n\t\tc_title->setText(m_title);\r\n\t\tc_file_version->setText(m_file_version);\r\n\t}\r\n}\r\n\r\nvoid CFilePropertiesDlg::showEvent(QShowEvent *event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/FilePropertiesDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_FilePropertiesDlg.h\"\r\n\r\nclass CFilePropertiesDlg : public QDialog, public Ui::CFilePropertiesDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCFilePropertiesDlg(QWidget *parent = 0);\r\n\tQString\tm_author;\r\n\tQString\tm_create_date;\r\n\tQString\tm_create_program;\r\n\tQString\tm_description;\r\n\tQString\tm_location;\r\n\tQString\tm_organization;\r\n\tQString\tm_title;\r\n\tQString\tm_file_version;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/FindLocDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"FindLocDlg.h\"\r\n#include <QMessageBox>\r\n\r\nCFindLocDlg::CFindLocDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_x = 0.0;\r\n\tm_y = 0.0;\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CFindLocDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\tQPoint p((int)m_x, (int)m_y);\r\n\tif (!m_bounds.contains(p)) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"This point is outside the bounds of your map\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\treturn;\r\n\t}\r\n\taccept();\r\n}\r\n\r\nvoid CFindLocDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CFindLocDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_x = c_x->text().toDouble();\r\n\t\tm_y = c_y->text().toDouble();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_x->setText(QString(\"%1\").arg(m_x));\r\n\t\tc_y->setText(QString(\"%1\").arg(m_y));\r\n\t}\r\n}\r\n\r\nvoid CFindLocDlg::showEvent(QShowEvent *event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/FindLocDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_FindLocDlg.h\"\r\n\r\nclass CFindLocDlg : public QDialog, public Ui::CFindLocDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCFindLocDlg(QWidget *parent = 0);\r\n\tdouble m_x;\r\n\tdouble m_y;\r\n\tQRegion m_bounds;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/GridDialog.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2017 Christian Sailer\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"GridDialog.h\"\r\n#include <QMessageBox>\r\n#include <salalib/gridproperties.h>\r\n\r\nCGridDialog::CGridDialog(double maxDimension, QWidget *parent)\r\n: QDialog(parent), m_maxdimension(maxDimension)\r\n{\r\n\tsetupUi(this);\r\n\tm_spacing = 0.01;\r\n}\r\n\r\nvoid CGridDialog::showEvent(QShowEvent * event)\r\n{\r\n    GridProperties gp(m_maxdimension);\r\n    m_spacing = gp.getDefault();\r\n\r\n    c_spacing_ctrl->setRange(gp.getMin(), gp.getMax());\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CGridDialog::OnDeltaposSpinSpacing(double iDelta)\r\n{\r\n   // New slot for this ready userValue(double value) // slot link here though // TV\r\n   // m_spacing = c_spacing_ctrl->value(); // bug or not?\r\n\r\n    if (int(iDelta / 1.0) > 1)\tc_spacing_ctrl->setSingleStep(1);\r\n    else if (int(iDelta / 0.1) > 1)\tc_spacing_ctrl->setSingleStep(0.1);\r\n    else if (int(iDelta / 0.01) > 1)\tc_spacing_ctrl->setSingleStep(0.01);\r\n    else\tc_spacing_ctrl->setSingleStep(0.001);\r\n\r\n}\r\n\r\nvoid CGridDialog::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CGridDialog::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CGridDialog::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_spacing = c_spacing_ctrl->value();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_spacing_ctrl->setValue(m_spacing);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/GridDialog.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2017 Christian Sailer\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_GridDialog.h\"\r\n\r\nclass CGridDialog : public QDialog, public Ui::CGridDialog\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n    CGridDialog(double maxDimension, QWidget *parent = 0);\r\n    void UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n    double getSpacing() const { return m_spacing; }\r\n\r\nprivate:\r\n    double\tm_spacing;\r\n    double m_maxdimension;\r\n\r\nprivate slots:\r\n\t\tvoid OnDeltaposSpinSpacing(double);\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/InsertColumnDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"InsertColumnDlg.h\"\r\n#include \"mainwindow.h\"\r\n\r\nCInsertColumnDlg::CInsertColumnDlg(AttributeTable *table, int col, QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_selection_only = false;\r\n\tm_col = col;\r\n\r\n\tm_col_names.push_back(\"Ref Number\");\r\n    for (int i = 0; i < table->getNumColumns(); i++) {\r\n\t\tm_col_names.push_back(table->getColumnName(i));\r\n\t}\r\n\tif (m_col == -1) {\r\n\t\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\t\tif (mainWin)\r\n\t\t\t{\r\n                m_formula_text = mainWin->m_formula_cache.toStdString();\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse {\r\n        m_formula_text = table->getColumn(m_col).getFormula();\r\n\t}\r\n\tc_use_column->setEnabled(true);\r\n}\r\n\r\nvoid CInsertColumnDlg::OnUseAttribute()\r\n{\r\n\t// take the currently selected list item and use in formula\t\r\n\r\n\tQString string;\r\n\tstring = c_column_names->item(c_column_names->currentRow())->text();\r\n\tstring = tr(\"value(\\\"\") + string + tr(\"\\\")\");\r\n\tc_formula->insertPlainText(string);\r\n\tc_formula->setFocus();\r\n}\r\n\r\nvoid CInsertColumnDlg::OnSelChangeColumnNames()\r\n{\r\n   c_use_column->setEnabled(true);\r\n}\r\n\r\nvoid CInsertColumnDlg::OnDblclkColumnNames(QListWidgetItem * item)\r\n{\r\n\tQString string;\r\n\tstring = c_column_names->item(c_column_names->currentRow())->text();\r\n\tstring = tr(\"value(\\\"\") + string + tr(\"\\\")\");\r\n\tc_formula->insertPlainText(string);\r\n\tc_formula->setFocus();\r\n}\r\n\r\nvoid CInsertColumnDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\tQString text;\r\n\ttext = c_formula->toPlainText();\r\n\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\tif (mainWin)\r\n\t\t{\r\n\t\t\tmainWin->m_formula_cache = text;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n    m_formula_text = text.toStdString();\r\n\r\n\t// note formula text for column will have to be updated by calling function\r\n\taccept();\r\n}\r\n\r\nvoid CInsertColumnDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CInsertColumnDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tif (c_selection_desc->checkState())\r\n\t\t\tm_selection_only = true;\r\n\t\telse\r\n\t\t\tm_selection_only = false;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (m_selection_only)\r\n\t\t\tc_selection_desc->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_selection_desc->setCheckState(Qt::Unchecked);\r\n\t}\r\n}\r\n\r\nvoid CInsertColumnDlg::showEvent(QShowEvent * event)\r\n{\r\n\tfor (size_t i = 0; i < m_col_names.size(); i++) {\r\n\t\tc_column_names->addItem(QString(m_col_names[i].c_str()));\r\n\t}\r\n\tc_formula->setPlainText(QString(m_formula_text.c_str()));\r\n\tc_column_names->setCurrentRow(-1);\r\n\t//c_use_column->setEnabled(false);\r\n\r\n\tif (m_col == -1) {\r\n\t\t// use for selection query\r\n\t\t// override title and names:\r\n\t\tsetWindowTitle(tr(\"Make selection\"));\r\n\r\n\t\tc_formula_desc->setText(tr(\"Query\"));\r\n\t\tc_selection_desc->setText(tr(\"Apply query to selected objects only\"));\r\n\t}\r\n\telse {\r\n\t\t// it's important for the user to know the column name:\r\n\t\t// (note our column names lookup has \"Ref Number\" in the zero position, so add one:\r\n\t\tsetWindowTitle(QString(\"Replace values for \") + QString(m_col_names[m_col+1].c_str()));\r\n\r\n\t\tc_formula_desc->setText(tr(\"Formula\"));\r\n\t\tc_selection_desc->setText(tr(\"Apply formula to selected objects only\"));\r\n\t}\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/InsertColumnDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_InsertColumnDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n#include <string>\r\n#include <vector>\r\n\r\nclass CInsertColumnDlg : public QDialog, public Ui::CInsertColumnDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n    CInsertColumnDlg(AttributeTable *table = NULL, int col = -1, QWidget *parent = 0);\r\n\tbool\tm_selection_only;\r\n\tint m_col;\r\n    std::vector<std::string> m_col_names;\r\n    std::string m_formula_text;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnUseAttribute();\r\n\t\tvoid OnSelChangeColumnNames();\r\n\t\tvoid OnDblclkColumnNames(QListWidgetItem * item);\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/IsovistPathDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"IsovistPathDlg.h\"\r\n\r\n#ifndef M_PI\r\n#define M_PI 3.1415926535897932384626433832795\r\n#endif\r\n\r\n\r\nCIsovistPathDlg::CIsovistPathDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tfov_selection = 0;\r\n\tfov_angle = 0.0;\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CIsovistPathDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\r\n\tswitch (fov_selection) {\r\n\t  case 0:\r\n\t\t  fov_angle = M_PI * 0.5;\r\n\t\t  break;\r\n\t  case 1:\r\n\t\t  fov_angle = 2.0 * M_PI / 3.0;\r\n\t\t  break;\r\n\t  case 2:\r\n\t\t  fov_angle = M_PI;\r\n\t\t  break;\r\n\t  case 3:\r\n\t\t  fov_angle = 2.0 * M_PI;\r\n\t\t  break;\r\n\t  default:\r\n\t\t  fov_angle = 2.0 * M_PI;\r\n\t\t  break;\r\n\t}\r\n\taccept();\r\n}\r\n\r\nvoid CIsovistPathDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CIsovistPathDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tfov_selection = c_fov_selection->currentIndex();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_fov_selection->setCurrentIndex(fov_selection);\r\n\t}\r\n}\r\n\r\nvoid CIsovistPathDlg::showEvent(QShowEvent * event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/IsovistPathDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_IsovistPathDlg.h\"\r\n\r\nclass CIsovistPathDlg : public QDialog, public Ui::CIsovistPathDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCIsovistPathDlg(QWidget *parent = 0);\r\n\tdouble fov_angle;\r\n\tint fov_selection;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/LayerChooserDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"LayerChooserDlg.h\"\r\n\r\nCLayerChooserDlg::CLayerChooserDlg(const std::vector<std::string>& names, QWidget *parent)\r\n: QDialog(parent),  m_names(names)\r\n{\r\n\tsetupUi(this);\r\n\tm_text = tr(\"\");\r\n\tm_layer = 0;\r\n}\r\n\r\nvoid CLayerChooserDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CLayerChooserDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CLayerChooserDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_text = c_text->text();\r\n\t\tm_layer = c_layer_selector->currentIndex();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_text->setText(m_text);\r\n\t\tc_layer_selector->setCurrentIndex(m_layer);\r\n\t}\r\n}\r\n\r\nvoid CLayerChooserDlg::showEvent(QShowEvent * event)\r\n{\r\n\tfor (size_t i = 0; i < m_names.size(); i++) {\r\n\t\tc_layer_selector->addItem(QString(m_names[i].c_str()));\r\n\t}\r\n\tc_layer_selector->setCurrentIndex(0);\r\n\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/LayerChooserDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_LayerChooserDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\n\r\nclass CLayerChooserDlg : public QDialog, public Ui::CLayerChooserDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n    CLayerChooserDlg(const std::vector<std::string>& names = std::vector<std::string>(), QWidget *parent = 0);\r\n\tQString\tm_text;\r\n\tint\t\tm_layer;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n    const std::vector<std::string>& m_names;\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/LicenceDialog.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"LicenceDialog.h\"\r\n\r\nconst char *g_agreement = \"see http://www.gnu.org/licenses/\";\r\n\r\nCLicenceDialog::CLicenceDialog(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_message = tr(\"\");\r\n\tm_agreement = tr(\"\");\r\n}\r\n\r\nvoid CLicenceDialog::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CLicenceDialog::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CLicenceDialog::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_message = c_message->text();\r\n\t\tm_agreement = c_agreement->toPlainText();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_message->setText(m_message);\r\n\t\tc_agreement->setPlainText(m_agreement);\r\n\t}\r\n}\r\n\r\nvoid CLicenceDialog::showEvent(QShowEvent * event)\r\n{\r\n\tsetWindowTitle(m_title);\r\n\r\n\tm_message =\r\n        tr(\"old\");\r\n\tm_agreement = \r\n        QString(\"old\") + tr(\"old\") +\r\n        QString(\"old\") + g_agreement;\r\n\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/LicenceDialog.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_LicenceDialog.h\"\r\n\r\nclass CLicenceDialog : public QDialog, public Ui::CLicenceDialog\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCLicenceDialog(QWidget *parent = 0);\r\n\tQString\tm_message;\r\n\tQString\tm_agreement;\r\n\r\n\tQString  m_title;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/MakeLayerDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"MakeLayerDlg.h\"\r\n\r\nCMakeLayerDlg::CMakeLayerDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_keeporiginal = true;\r\n\tm_remove_stubs = false;\r\n\tm_push_values = false;\r\n\tm_percentage = 0;\r\n\tm_origin = tr(\"\");\r\n\tm_layer_name = tr(\"\");\r\n\tm_mapin = 0;\r\n\tm_mapout = 0;\r\n}\r\n\r\nvoid CMakeLayerDlg::OnRemoveStubs(bool value)\r\n{\r\n\tif (value) {\r\n        c_percentage->setText(tr(\"40\")); // Bill: 40% (old 25)\r\n\t\tc_percentage->setEnabled(true);\r\n\t}\r\n\telse {\r\n\t\tc_percentage->setText(tr(\"0\"));\r\n\t\tc_percentage->setEnabled(false);\r\n\t}\r\n}\r\n\r\nvoid CMakeLayerDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\tm_mapout = m_lookup[c_layer_type->currentIndex()];\r\n\taccept();\r\n}\r\n\r\nvoid CMakeLayerDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CMakeLayerDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tif (c_remove_stubs->checkState())\r\n\t\t\tm_remove_stubs = true;\r\n\t\telse\r\n\t\t\tm_remove_stubs = false;\r\n\t\t\r\n\t\tif (c_push_values->checkState())\r\n\t\t\tm_push_values = true;\r\n\t\telse\r\n\t\t\tm_push_values = false;\r\n\t\tm_percentage = c_percentage->text().toInt();\r\n\t\tm_origin = c_origin->text();\r\n\t\tm_layer_name = c_layer_name->text();\r\n\r\n\t\tif (c_keeporiginal->checkState())\r\n\t\t\tm_keeporiginal = true;\r\n\t\telse\r\n\t\t\tm_keeporiginal = false;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (m_remove_stubs)\r\n\t\t\tc_remove_stubs->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_remove_stubs->setCheckState(Qt::Unchecked);\r\n\t\t\r\n\t\tif (m_push_values)\r\n\t\t\tc_push_values->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_push_values->setCheckState(Qt::Unchecked);\r\n\t\t\r\n\t\tc_percentage->setText(QString(tr(\"%1\")).arg(m_percentage));\r\n\t\tc_origin->setText(m_origin);\r\n\t\tc_layer_name->setText(m_layer_name);\r\n\r\n\t\tif (m_keeporiginal)\r\n\t\t\tc_keeporiginal->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_keeporiginal->setCheckState(Qt::Unchecked);\r\n\t}\r\n}\r\n\r\nstatic int item_process = 0;\r\nvoid CMakeLayerDlg::showEvent(QShowEvent * event)\r\n{\r\n\titem_process = 1;\r\n\tif (m_mapout & MAKELAYER_DRAWING) {\r\n\t\tc_layer_type->addItem(QString(tr(\"Drawing Map\")));\r\n\t\tm_lookup.push_back(MAKELAYER_DRAWING);\r\n\t}\r\n\tif (m_mapout & MAKELAYER_DATA) {\r\n\t\tc_layer_type->addItem(QString(tr(\"Data Map\")));\r\n\t\tm_lookup.push_back(MAKELAYER_DATA);\r\n\t}\r\n\tif (m_mapout & MAKELAYER_AXIAL) {\r\n\t\tc_layer_type->addItem(QString(tr(\"Axial Map\")));\r\n\t\tm_lookup.push_back(MAKELAYER_AXIAL);\r\n\t}\r\n\tif (m_mapout & MAKELAYER_CONVEX) {\r\n\t\tc_layer_type->addItem(QString(tr(\"Convex Map\")));\r\n\t\tm_lookup.push_back(MAKELAYER_CONVEX);\r\n\t}\r\n\tif (m_mapout & MAKELAYER_SEGMENT) {\r\n\t\tc_layer_type->addItem(QString(tr(\"Segment Map\")));\r\n\t\tm_lookup.push_back(MAKELAYER_SEGMENT);\r\n\t}\r\n\r\n\tc_layer_type->setCurrentIndex(0);\r\n\r\n\tif (m_mapin == MAKELAYER_DRAWING) {\r\n\t\t// hide push values:\r\n\t\tc_push_values->hide();\r\n\t\t// hide retain map:\r\n\t\tc_keeporiginal->hide();\r\n\t\t// make the dialog a bit smaller...\r\n\t\tQRect winrect;\r\n\t\twinrect = geometry();\r\n\t\twinrect.setBottom(winrect.bottom() - 75);\r\n\t\tsetGeometry(winrect);\r\n\t\twinrect = c_ok->geometry();\r\n\t\twinrect.setTop(winrect.top() - 75);\r\n\t\twinrect.setBottom(winrect.bottom() - 75);\r\n\t\tc_ok->setGeometry(winrect);\r\n\t\t//wnd = GetDlgItem(IDCANCEL);\r\n\t\twinrect = c_cancel->geometry();\r\n\t\twinrect.setTop(winrect.top() - 75);\r\n\t\twinrect.setBottom(winrect.bottom() - 75);\r\n\t\tc_cancel->setGeometry(winrect);\r\n\t}\r\n\tif (m_mapin != MAKELAYER_AXIAL) {\r\n\t\t// hide remove stubs:\r\n\t\tc_remove_stubs->hide();\r\n\t\tc_percentage->hide();\r\n\t\tlabel_4->hide();\r\n\t}\r\n\r\n\tc_layer_type->setCurrentIndex(0);\r\n\r\n\tUpdateData(false);\r\n\titem_process = 0;\r\n    OnSelchangeLayerType(0);\r\n}\r\n\r\nvoid CMakeLayerDlg::OnSelchangeLayerType(int value)\r\n{\r\n\tif(item_process) return;\r\n\tint which = m_lookup[value];\r\n\r\n\tswitch (which) {\r\n\tcase MAKELAYER_DRAWING:\r\n\t   c_layer_name->setText(tr(\"Drawing Map\"));\r\n\t   break;\r\n\tcase MAKELAYER_DATA:\r\n\t   c_layer_name->setText(tr(\"Gate Map\"));\r\n\t   break;\r\n\tcase MAKELAYER_AXIAL:\r\n\t   c_layer_name->setText(tr(\"Axial Map\"));\r\n\t   break;\r\n\tcase MAKELAYER_CONVEX:\r\n\t   c_layer_name->setText(tr(\"Convex Map\"));//GetDlgItem(IDC_LAYER_NAME)->SetWindowText(_T(\"Convex Map\"));\r\n\t   break;\r\n\tcase MAKELAYER_SEGMENT:\r\n\t   c_layer_name->setText(tr(\"Segment Map\"));\r\n\t   break;\r\n\t}\r\n\r\n\tif (which == MAKELAYER_SEGMENT) {\r\n\t\tc_keeporiginal->setEnabled(true);\r\n\t\tc_push_values->setEnabled(true);\r\n\t\tc_remove_stubs->setEnabled(true);\r\n\t\tc_percentage->setEnabled(true);\r\n\t\tlabel_4->setEnabled(true);\r\n\t}\r\n\telse if (which == MAKELAYER_DRAWING) {\r\n\t\tc_keeporiginal->setEnabled(false);\r\n\t\tc_keeporiginal->setCheckState(Qt::Checked);\r\n\t\tc_push_values->setEnabled(false);\r\n\t\tc_push_values->setCheckState(Qt::Unchecked);\r\n\t\tc_remove_stubs->setEnabled(false);\r\n\t\tc_remove_stubs->setCheckState(Qt::Unchecked);\r\n\t\tc_percentage->setEnabled(false);\r\n\t\tc_percentage->setText(tr(\"0\"));//GetDlgItem(IDC_PERCENTAGE_LENGTH)->SetWindowText(_T(\"0\"));\r\n\t\tlabel_4->setEnabled(false);\r\n\t}\r\n\telse {\r\n\t\tc_keeporiginal->setEnabled(true);\r\n\t\tc_push_values->setEnabled(true);\r\n\t\tc_remove_stubs->setEnabled(false);\r\n\t\tc_percentage->setEnabled(false);\r\n\t\tlabel_4->setEnabled(false);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/MakeLayerDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_MakeLayerDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nenum {MAKELAYER_DRAWING = 1, \r\nMAKELAYER_DATA = 2,\r\nMAKELAYER_AXIAL = 4,\r\nMAKELAYER_CONVEX = 8, \r\nMAKELAYER_GENERIC = 16,\r\nMAKELAYER_SEGMENT = 32\r\n};\r\n\r\nclass CMakeLayerDlg : public QDialog, public Ui::CMakeLayerDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCMakeLayerDlg(QWidget *parent = 0);\r\n\tbool\tm_remove_stubs;\r\n\tbool\tm_push_values;\r\n\tint\t\tm_percentage;\r\n\tQString\tm_origin;\r\n\tQString\tm_layer_name;\r\n\r\n\tint m_mapin;\r\n\tint m_mapout;\r\n\r\n    std::vector<int> m_lookup;\r\n\tbool m_keeporiginal;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\nprivate slots:\r\n\t\tvoid OnSelchangeLayerType(int);\r\n\t\tvoid OnRemoveStubs(bool);\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/MakeOptionsDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"MakeOptionsDlg.h\"\r\n#include <QMessageBox>\r\n\r\nCMakeOptionsDlg::CMakeOptionsDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_boundarygraph = false;\r\n\tm_maxdist = 0.0;\r\n\tm_restrict_visibility = false;\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CMakeOptionsDlg::OnRestrict(bool)\r\n{\r\n\tUpdateData(true);\r\n\r\n\tif (m_restrict_visibility) {\r\n\t\tc_maxdist->setEnabled(true);\r\n\t}\r\n\telse {\r\n\t\tc_maxdist->setEnabled(false);\r\n\t}\r\n}\r\n\r\nvoid CMakeOptionsDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\r\n\tif (m_restrict_visibility && m_maxdist <= 0.0) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Maximum distance must be over 0.0 if visibility is restricted\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\treturn;\r\n\t}\r\n\r\n\taccept();\r\n}\r\n\r\nvoid CMakeOptionsDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CMakeOptionsDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tif (c_boundarygraph->checkState())\r\n\t\t\tm_boundarygraph = true;\r\n\t\telse\r\n\t\t\tm_boundarygraph = false;\r\n\r\n\t\tm_maxdist = c_maxdist->text().toDouble();\r\n\t\t\r\n\t\tif (c_restrict_visibility->checkState())\r\n\t\t\tm_restrict_visibility = true;\r\n\t\telse\r\n\t\t\tm_restrict_visibility = false;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (m_boundarygraph)\r\n\t\t\tc_boundarygraph->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_boundarygraph->setCheckState(Qt::Unchecked);\r\n\r\n\t\tc_maxdist->setText(QString(\"%1\").arg(m_maxdist));\r\n\r\n\t\tif (m_restrict_visibility)\r\n\t\t\tc_restrict_visibility->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_restrict_visibility->setCheckState(Qt::Unchecked);\r\n\t}\r\n}\r\n\r\nvoid CMakeOptionsDlg::showEvent(QShowEvent * event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/MakeOptionsDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_MakeOptionsDlg.h\"\r\n\r\nclass CMakeOptionsDlg : public QDialog, public Ui::CMakeOptionsDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCMakeOptionsDlg(QWidget *parent = 0);\r\n\tbool\tm_boundarygraph;\r\n\tdouble\tm_maxdist;\r\n\tbool\tm_restrict_visibility;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnRestrict(bool);\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/NewLayerDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"NewLayerDlg.h\"\r\n#include <QMessageBox>\r\n\r\nCNewLayerDlg::CNewLayerDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_layer_type = 0;\r\n\tm_name = tr(\"Gate Map\");\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CNewLayerDlg::OnSelchangeLayerType(int value)\r\n{\r\n\tint which = value;\r\n\r\n\tswitch (which) {\r\n\tcase 0:\r\n\t   c_name->setText(tr(\"Gate Map\"));\r\n\t   break;\r\n\tcase 1:\r\n\t   c_name->setText(tr(\"Convex Map\"));\r\n\t   break;\r\n\tcase 2:\r\n\t   c_name->setText(tr(\"Axial Map\"));\r\n\t   break;\r\n\tcase 3:\r\n\t   c_name->setText(tr(\"Pesh Map\"));\r\n\t   break;\r\n\t}\r\n}\r\n\r\nvoid CNewLayerDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\r\n\tif (m_name.isEmpty()) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Please enter a name for the new map\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\treturn;\r\n\t}\r\n\taccept();\r\n}\r\n\r\nvoid CNewLayerDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CNewLayerDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_layer_type = c_layer_selector->currentIndex();\r\n\t\tm_name = c_name->text();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_layer_selector->setCurrentIndex(m_layer_type);\r\n\t\tc_name->setText(m_name);\r\n\t}\r\n}\r\n\r\nvoid CNewLayerDlg::showEvent(QShowEvent *event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/NewLayerDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_NewLayerDlg.h\"\r\n\r\nclass CNewLayerDlg : public QDialog, public Ui::CNewLayerDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCNewLayerDlg(QWidget *parent = 0);\r\n\tint\t\tm_layer_type;\r\n\tQString\tm_name;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnSelchangeLayerType(int);\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/OptionsDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"OptionsDlg.h\"\r\n#include \"mainwindow.h\"\r\n#include <QMessageBox>\r\n\r\nCOptionsDlg::COptionsDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_global = false;\r\n\tm_local = false;\r\n\tm_radius = tr(\"\");\r\n\tm_gates_only = false;\r\n\tm_output_type = -1;\r\n\tm_radius2 = tr(\"\");\r\n\r\n\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\tif (mainWin)\r\n\t\t{\r\n\t\t\tm_output_type = mainWin->m_options.output_type;\r\n\r\n\t\t\tm_local   = mainWin->m_options.local;\r\n\t\t\tm_global  = mainWin->m_options.global;\r\n\t\t\tm_gates_only = mainWin->m_options.gates_only;\r\n\r\n\t\t\tif ((int) mainWin->m_options.radius == -1) {\r\n\t\t\t\tm_radius = QString(\"n\");\r\n\t\t\t\tm_radius2 = QString(\"n\");\r\n\t\t\t}\r\n\t\t\telse if (m_output_type == Options::OUTPUT_VISUAL) {\r\n\t\t\t\tchar number[2];\r\n\t\t\t\tsprintf( number, \"%d\", (int) mainWin->m_options.radius );\r\n\t\t\t\tm_radius = QString(number);\r\n\t\t\t\tm_radius2 = tr(\"n\");\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tchar number[32];\r\n\t\t\t\tsprintf( number, \"%g\", mainWin->m_options.radius );\r\n\t\t\t\tm_radius = tr(\"n\");\r\n\t\t\t\tm_radius2 = QString(number);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid COptionsDlg::OnOutputType(bool value)\r\n{\r\n\tUpdateData(true);\r\n\r\n\tif (m_output_type == Options::OUTPUT_VISUAL) {\r\n\t\tc_local->setEnabled(true);\r\n\t\tc_global->setEnabled(true);\r\n\t\tc_radius->setEnabled(true);\r\n\t}\r\n\telse {\r\n\t\tc_local->setEnabled(false);\r\n\t\tc_global->setEnabled(false);\r\n\t\tc_radius->setEnabled(false);\r\n\t\tc_radius->setText(tr(\"n\"));// <- essentially, undo changes\r\n\t}\r\n\r\n\tif (m_output_type == Options::OUTPUT_METRIC) {\r\n\t\tc_radius2->setEnabled(true);\r\n\t}\r\n\telse {\r\n\t\tc_radius2->setText(tr(\"n\"));// <- essentially, undo changes\r\n\t\tc_radius2->setEnabled(false);\r\n\t}\r\n}\r\n\r\nvoid COptionsDlg::OnUpdateRadius(QString text)\r\n{\r\n\tif (text.length()) {\r\n\t\tif (!text.toInt() && text != tr(\"n\")) {\r\n\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be n or number in range 1-99\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\tc_radius->setText(tr(\"n\"));\r\n\t\t}\r\n\t}\t\t\r\n}\r\n\r\nvoid COptionsDlg::OnUpdateRadius2(QString text)\r\n{\r\n\tif (text.length()) {\r\n\t\tif (text.toDouble() == 0.0 && text != tr(\"n\")) {\r\n\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be n or a positive number\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\tc_radius2->setText(tr(\"n\"));\r\n\t\t}\r\n\t}\t\t\r\n}\r\n\r\nvoid COptionsDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\r\n\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\tif (mainWin)\r\n\t\t{\r\n\t\t\tmainWin->m_options.local  = m_local;\r\n\t\t\tmainWin->m_options.global = m_global;\r\n\t\t\tmainWin->m_options.output_type = m_output_type;\r\n\t\t\tmainWin->m_options.gates_only = m_gates_only;\r\n\t\t\tmainWin->m_options.gatelayer = c_layer_selector->currentIndex() - 1;\r\n\r\n\t\t\tif (m_output_type == Options::OUTPUT_VISUAL) {\r\n\t\t\t\tif (m_radius.compare(tr(\"n\")) == 0) { // 0 means identical\r\n\t\t\t\t\tmainWin->m_options.radius = -1.0;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tmainWin->m_options.radius = (double) m_radius.toInt();\r\n\t\t\t\t\tif (mainWin->m_options.radius <= 0.0) {\r\n\t\t\t\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be n or a number in the range 1-99\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (m_radius2.compare(tr(\"n\")) == 0) { // 0 means identical\r\n\t\t\t\t\tmainWin->m_options.radius = -1.0;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tmainWin->m_options.radius = m_radius2.toDouble();\r\n\t\t\t\t\tif (mainWin->m_options.radius <= 0.0) {\r\n\t\t\t\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be n or a positive number\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\taccept();\r\n}\r\n\r\nvoid COptionsDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid COptionsDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tif (c_global->checkState())\r\n\t\t\tm_global = true;\r\n\t\telse\r\n\t\t\tm_global = false;\r\n\r\n\t\tif (c_local->checkState())\r\n\t\t\tm_local = true;\r\n\t\telse\r\n\t\t\tm_local = false;\r\n\r\n\t\tm_radius = c_radius->text();\r\n\t\t\r\n\t\tif (c_output_type->isChecked())\r\n\t\t\tm_output_type = 0;\r\n\t\telse if (c_radio1->isChecked())\r\n\t\t\tm_output_type = 1;\r\n\t\telse if (c_radio2->isChecked())\r\n\t\t\tm_output_type = 2;\r\n\t\telse if (c_radio3->isChecked())\r\n\t\t\tm_output_type = 3;\r\n\t\telse if (c_radio4->isChecked())\r\n\t\t\tm_output_type = 4;\r\n\t\telse\r\n\t\t\tm_output_type = -1;\r\n\t\tm_radius2 = c_radius2->text();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (m_global)\r\n\t\t\tc_global->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_global->setCheckState(Qt::Unchecked);\r\n\r\n\t\tif (m_local)\r\n\t\t\tc_local->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_local->setCheckState(Qt::Unchecked);\r\n\r\n\t\tc_radius->setText(m_radius);\r\n\r\n\t\tswitch (m_output_type)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\t\tc_output_type->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tc_radio1->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tc_radio2->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tc_radio3->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 4:\r\n\t\t\tc_radio4->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tc_radius2->setText(m_radius2);\r\n\t}\r\n}\r\n\r\nvoid COptionsDlg::showEvent(QShowEvent * event)\r\n{\r\n\tfor (size_t i = 0; i < m_layer_names.size(); i++) {\r\n\t\tc_layer_selector->addItem(QString(m_layer_names[i].c_str()));\r\n\t}\r\n\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\tif (mainWin)\r\n\t\t{\r\n\t\t\tc_layer_selector->setCurrentIndex(mainWin->m_options.gatelayer + 1);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tOnOutputType(false);\r\n\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/OptionsDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_OptionsDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nclass COptionsDlg : public QDialog, public Ui::COptionsDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCOptionsDlg(QWidget *parent = 0);\r\n\tbool\tm_global;\r\n\tbool\tm_local;\r\n\tQString\tm_radius;\r\n\tbool\tm_gates_only;\r\n\tint\t\tm_output_type;\r\n\tQString\tm_radius2;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n    std::vector<std::string> m_layer_names;\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOutputType(bool);\r\n\t\tvoid OnUpdateRadius(QString);\r\n\t\tvoid OnUpdateRadius2(QString);\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/PromptReplace.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"PromptReplace.h\"\r\n\r\nCPromptReplace::CPromptReplace(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_message = tr(\"\");\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CPromptReplace::OnAdd()\r\n{\r\n\tUpdateData(true);\r\n\tdone(1);\r\n}\r\n\r\nvoid CPromptReplace::OnReplace()\r\n{\r\n\tUpdateData(true);\r\n\tdone(2);\r\n}\r\n\r\nvoid CPromptReplace::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CPromptReplace::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t\tm_message = c_message->text();\r\n\telse\r\n\t\tc_message->setText(m_message);\r\n}\r\n\r\nvoid CPromptReplace::showEvent(QShowEvent * event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/PromptReplace.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_PromptReplace.h\"\r\n\r\nclass CPromptReplace : public QDialog, public Ui::CPromptReplace\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCPromptReplace(QWidget *parent = 0);\r\n\tQString\tm_message;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnAdd();\r\n\t\tvoid OnReplace();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/PushDialog.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"PushDialog.h\"\r\n\r\nCPushDialog::CPushDialog(std::map<std::pair<int, int>, std::string> &names, QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_layer_selection = -1;\r\n\tm_origin_attribute = tr(\"\");\r\n\tm_origin_layer = tr(\"\");\r\n\tm_count_intersections = false;\r\n\tm_function = -1;\r\n\r\n\tm_function = 0;\r\n\r\n    for (auto name: names) {\r\n        m_names.push_back(name.second);\r\n\t}\r\n}\r\n\r\nvoid CPushDialog::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CPushDialog::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CPushDialog::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_layer_selection = c_layer_selector->currentIndex();\r\n\t\tm_origin_attribute = c_origin_attribute->text();\r\n\t\tm_origin_layer = c_origin_layer->text();\r\n\t\tif (c_count_intersections->checkState())\r\n\t\t\tm_count_intersections = true;\r\n\t\telse\r\n\t\t\tm_count_intersections = false;\r\n\t\tm_function = c_function->currentIndex();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_layer_selector->setCurrentIndex(m_layer_selection);\r\n\t\tc_origin_attribute->setText(m_origin_attribute);\r\n\t\tc_origin_layer->setText(m_origin_layer);\r\n\t\tif (m_count_intersections)\r\n\t\t\tc_count_intersections->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_count_intersections->setCheckState(Qt::Unchecked);\r\n\t\tc_function->setCurrentIndex(m_function);\r\n\t}\r\n}\r\n\r\nvoid CPushDialog::showEvent(QShowEvent * event)\r\n{\r\n\tfor (size_t i = 0; i < m_names.size(); i++) {\r\n\t\tc_layer_selector->addItem(QString(m_names[i].c_str()));\r\n\t}\r\n\tc_layer_selector->setCurrentIndex(0);\r\n\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/PushDialog.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_PushDialog.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nclass CPushDialog : public QDialog, public Ui::CPushDialog\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n    CPushDialog(std::map<std::pair<int, int>, std::string>& names, QWidget *parent = 0);\r\n\tint\t\tm_layer_selection;\r\n\tQString\tm_origin_attribute;\r\n\tQString\tm_origin_layer;\r\n\tbool\tm_count_intersections;\r\n\tint\t\tm_function;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n    std::vector<std::string> m_names;\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/RenameObjectDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"RenameObjectDlg.h\"\r\n\r\nCRenameObjectDlg::CRenameObjectDlg(const QString& object_type, const QString& existing_name, QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_prompt = tr(\"\");\r\n\tm_object_name = tr(\"\");\r\n\tm_object_name = existing_name;\r\n\r\n\tm_object_type = object_type; // e.g., Column, Layer, etc\r\n}\r\n\r\nvoid CRenameObjectDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\taccept();\r\n}\r\n\r\nvoid CRenameObjectDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CRenameObjectDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tm_object_name = c_object_name->text();\r\n\t\tm_prompt = c_prompt->text();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tc_object_name->setText(m_object_name);\r\n\t\tc_prompt->setText(m_prompt);\r\n\t}\r\n}\r\n\r\nvoid CRenameObjectDlg::showEvent(QShowEvent * event)\r\n{\r\n\tQString lower_object_type = m_object_type;\r\n\tlower_object_type = lower_object_type.toLower();\r\n\r\n\tif (m_object_name.isEmpty()) {\r\n\t\tQString title = QString(\"New \") + m_object_type;\r\n\t\tsetWindowTitle(title);\r\n\t\tm_prompt = QString(\"New \") + lower_object_type + QString(\" name:\");\r\n\t\tm_object_name = QString(\"<New \") + m_object_type + QString(\">\");\r\n\t}\r\n\telse {\r\n\t\tQString title = QString(\"Rename \") + m_object_type;\r\n\t\tsetWindowTitle(title);\r\n\t\tm_prompt = QString(\"Rename \") + lower_object_type + QString(\" to:\");\r\n\t}\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/RenameObjectDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_RenameObjectDlg.h\"\r\n\r\nclass CRenameObjectDlg : public QDialog, public Ui::CRenameObjectDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCRenameObjectDlg(const QString& object_type, const QString& existing_name = QString(), QWidget *parent = 0);\r\n\tQString\tm_object_name;\r\n\tQString m_object_type;\r\n\tQString m_prompt;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n\t\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/SegmentAnalysisDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"SegmentAnalysisDlg.h\"\r\n#include \"mainwindow.h\"\r\n#include <QMessageBox>\r\n\r\nCSegmentAnalysisDlg::CSegmentAnalysisDlg(MetaGraph *graph, QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n\tm_analysis_type = -1;\r\n\tm_radius = tr(\"\");\r\n\tm_tulip_bins = 0;\r\n\tm_radius_type = -1;\r\n\tm_choice = false;\r\n\tm_weighted = false;\r\n\tm_attribute = -1;\r\n\r\n\tm_meta_graph = graph;\r\n\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\tif (mainWin)\r\n\t\t{\r\n\t\t\tif (mainWin->m_options.tulip_bins == 0) {\r\n\t\t\t\tm_analysis_type = 1;\r\n\t\t\t\tm_tulip_bins = 1024;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tm_analysis_type = 0;\r\n\t\t\t\tm_tulip_bins = mainWin->m_options.tulip_bins;\r\n\t\t\t}\r\n\t\t\tm_choice = mainWin->m_options.choice;\r\n\t\t\tm_radius_type = mainWin->m_options.radius_type;\r\n\t\t\tif ((int) mainWin->m_options.radius == -1) {\r\n\t\t\t\tm_radius = QString(\"n\");\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tchar number[32];\r\n\t\t\t\tsprintf( number, \"%g\", mainWin->m_options.radius );\r\n\t\t\t\tm_radius = QString(number);\r\n\t\t\t}\r\n\t\t\tif (mainWin->m_options.weighted_measure_col == -1) {\r\n\t\t\t\tm_weighted = false;\r\n\t\t\t\tm_attribute = -1;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tm_weighted = true;\r\n\t\t\t\tm_attribute = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::OnAnalysisType(bool value)\r\n{\r\n\tUpdateData(true);\r\n\tc_tulip_bins->setEnabled(true);\r\n\tc_choice->setEnabled(true);\r\n\tc_radius_type->setEnabled(true);\r\n\tradioButton->setEnabled(true);\r\n\tc_weighted->setEnabled(true);\r\n\tc_attribute->setEnabled(false);\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::OnAnalysisTulip(bool value)\r\n{\r\n\t// actually, not tulip -- they're switched, this is on analyse angular!!\r\n\tUpdateData(true);\r\n\tm_choice = false;\r\n\tm_radius_type = 2;\r\n\tm_analysis_type = 1;\r\n\tm_weighted = false;\r\n\tm_attribute = -1;\r\n\tUpdateData(false);\r\n\tc_tulip_bins->setEnabled(false);\r\n\tc_choice->setEnabled(false);\r\n\tc_radius_type->setEnabled(false);\r\n\tradioButton->setEnabled(false);\r\n\tc_weighted->setEnabled(false);\r\n\tc_attribute->setEnabled(false);\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::OnUpdateRadius(QString text)\r\n{\r\n\tif (!text.isEmpty() && text.indexOf(\"n\") == -1 && text.indexOf(\"N\") == -1 &&\r\n\t\ttext.indexOf(\"1\") == -1 && text.indexOf(\"2\") == -1 && text.indexOf(\"3\") == -1 && \r\n\t\ttext.indexOf(\"4\") == -1 &&  text.indexOf(\"5\") == -1 &&  text.indexOf(\"6\") == -1 &&\r\n\t\ttext.indexOf(\"7\") == -1 &&  text.indexOf(\"8\") == -1 &&  text.indexOf(\"9\") == -1) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be numeric or 'n'\\nAlternatively, for multiple radii, type a list of comma separated numeric radii (you can include 'n')\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\tc_radius->setText(tr(\"n\"));\r\n\t\tc_radius->setFocus(Qt::OtherFocusReason);\r\n\t}\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::OnWeighted(bool value)\r\n{\r\n\tif (value) {\r\n\t\tUpdateData(true);\r\n\t\tc_attribute->setEnabled(true);\r\n\t\tm_attribute = 0;\r\n\t\tUpdateData(false);\r\n\t}\r\n\telse {\r\n\t\tUpdateData(true);\r\n\t\tc_attribute->setEnabled(false);\r\n\t\tm_attribute = -1;\r\n\t\tUpdateData(false);\r\n\t}\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\r\n\t// my own validate on the radius (note: on fail to convert, atoi returns 0)\r\n\tif (m_radius.isEmpty() || (m_radius.indexOf(\"n\") == -1 && m_radius.indexOf(\"N\") == -1 &&\r\n\t\tm_radius.indexOf(\"1\") == -1 && m_radius.indexOf(\"2\") == -1 && m_radius.indexOf(\"3\") == -1 && \r\n\t\tm_radius.indexOf(\"4\") == -1 &&  m_radius.indexOf(\"5\") == -1 &&  m_radius.indexOf(\"6\") == -1 &&\r\n\t\tm_radius.indexOf(\"7\") == -1 &&  m_radius.indexOf(\"8\") == -1 &&  m_radius.indexOf(\"9\") == -1)) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be numeric or 'n'\\nAlternatively, for multiple radii, type a list of comma separated numeric radii (you can include 'n')\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\tm_radius = tr(\"n\");\r\n\t\tUpdateData(false);\r\n\t\tc_radius->setFocus(Qt::OtherFocusReason);\r\n\t\treturn;\r\n\t}\r\n\t// now parse radius list:\r\n\tforeach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n\t\tMainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n\t\tif (mainWin)\r\n\t\t{\r\n\t\t\tmainWin->m_options.radius_set.clear();\r\n\t\t\tQString curr_radius;\r\n\t\t\tint curr_comma = -1, last_comma = 0;\r\n\t\t\tbool add_rn = false;\r\n\t\t\tdo {\r\n\t\t\t\tcurr_comma = m_radius.indexOf(',',last_comma);\r\n\t\t\t\tif (curr_comma != -1) {\r\n\t\t\t\t\tcurr_radius = m_radius.mid(last_comma, curr_comma-last_comma);\r\n\t\t\t\t\tlast_comma = curr_comma + 1;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcurr_radius = m_radius.mid(last_comma);\r\n\t\t\t\t}\r\n\t\t\t\t/*curr_radius.TrimLeft(' ');\r\n\t\t\t\tcurr_radius.TrimRight(' ');*/\r\n\t\t\t\tif (!curr_radius.isEmpty()) {\r\n\t\t\t\t\tif (curr_radius == \"n\" || curr_radius == \"N\") {\r\n\t\t\t\t\t\tadd_rn = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tdouble radius;\r\n\t\t\t\t\t\tif (m_radius_type == 0) {\r\n\t\t\t\t\t\t\tradius = curr_radius.toDouble();\r\n\t\t\t\t\t\t\tif (radius < 1 || radius > 99) {\r\n\t\t\t\t\t\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Each radius in the list must either be 'n' or a number in the range 1-99\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\t\t\t\t\t\tc_radius->setFocus(Qt::OtherFocusReason);\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tradius = curr_radius.toDouble();\r\n\t\t\t\t\t\t\tif (radius <= 0.0) {\r\n\t\t\t\t\t\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"Each radius in the list must either be 'n' or a number in the range 0.0 to infinity\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\t\t\t\t\t\tc_radius->setFocus(Qt::OtherFocusReason);\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n                        mainWin->m_options.radius_set.insert(double(radius));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twhile (curr_comma != -1);\r\n\t\t\tif (mainWin->m_options.radius_set.size() == 0 || add_rn) {\r\n                mainWin->m_options.radius_set.insert(-1);\r\n\t\t\t}\r\n\r\n\t\t\tif (m_tulip_bins % 2 != 0) { \r\n\t\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The number of tulip bins must be an even number\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tmainWin->m_options.choice = m_choice;\r\n\t\t\tmainWin->m_options.radius_type = m_radius_type;\r\n\r\n\t\t\tif (m_analysis_type == 1) {\r\n\t\t\t\tmainWin->m_options.tulip_bins = 0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tmainWin->m_options.tulip_bins = m_tulip_bins;\r\n\t\t\t}\r\n\r\n\t\t\t// attributes:\r\n\t\t\tif (!m_weighted) {\r\n\t\t\t\tmainWin->m_options.weighted_measure_col = -1;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tmainWin->m_options.weighted_measure_col = m_attribute;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\taccept();\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::OnCancel()\r\n{\r\n\treject();\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n        if (c_analysis_type->isChecked()) {\r\n            c_radio2->setChecked(false);\r\n\t\t\tm_analysis_type = 0;\r\n        }\r\n        else if (c_radio2->isChecked()) {\r\n\t\t\tm_analysis_type = 1;\r\n            c_analysis_type->setChecked(false);\r\n        }\r\n\t\telse\r\n\t\t\tm_analysis_type = -1;\r\n\r\n\t\tm_radius = c_radius->text();\r\n\t\tm_tulip_bins = c_tulip_bins->text().toInt();\r\n\r\n\t\tif (c_radius_type->isChecked())\r\n\t\t\tm_radius_type = 0;\r\n\t\telse if (radioButton->isChecked())\r\n\t\t\tm_radius_type = 1;\r\n\t\telse if (c_radio3->isChecked())\r\n\t\t\tm_radius_type = 2;\r\n\t\telse\r\n\t\t\tm_radius_type = -1;\r\n\r\n\t\tif (c_choice->checkState())\r\n\t\t\tm_choice = true;\r\n\t\telse\r\n\t\t\tm_choice = false;\r\n\t\tif (c_weighted->checkState())\r\n\t\t\tm_weighted = true;\r\n\t\telse\r\n\t\t\tm_weighted = false;\r\n\t\tm_attribute = c_attribute->currentIndex();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tswitch (m_analysis_type)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\t\tc_analysis_type->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tc_analysis_type->setChecked(false);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tc_radius->setText(m_radius);\r\n\t\tc_tulip_bins->setText(QString(\"%1\").arg(m_tulip_bins));\r\n\t\tswitch (m_radius_type)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\t\tc_radius_type->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tradioButton->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tc_radio3->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (m_choice)\r\n\t\t\tc_choice->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_choice->setCheckState(Qt::Unchecked);\r\n\t\t\r\n\t\tif (m_weighted)\r\n\t\t\tc_weighted->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tc_weighted->setCheckState(Qt::Unchecked);\r\n\t\tc_attribute->setCurrentIndex(m_attribute);\r\n\t}\r\n}\r\n\r\nvoid CSegmentAnalysisDlg::showEvent(QShowEvent * event)\r\n{\r\n\tconst ShapeGraph& map = m_meta_graph->getDisplayedShapeGraph();\r\n    const AttributeTable& table = map.getAttributeTable();\r\n    for (int i = 0; i < table.getNumColumns(); i++) {\r\n\t\tc_attribute->addItem(QString(table.getColumnName(i).c_str()));\r\n\t}\r\n\r\n\tif (m_analysis_type == 1) {\r\n\t\tm_choice = false;\r\n\t\tm_radius_type = 2;\r\n\t\tm_weighted = false;\r\n\t\tUpdateData(false);\r\n\t\tc_tulip_bins->setEnabled(false);\r\n\t\tc_choice->setEnabled(false);\r\n\t\tc_radius_type->setEnabled(false);\r\n\t\tradioButton->setEnabled(false);\r\n\t\tc_weighted->setEnabled(false);\r\n\t\tc_attribute->setEnabled(false);\r\n\t}\r\n\telse {\r\n\t\tc_tulip_bins->setEnabled(true);\r\n\t\tc_choice->setEnabled(true);\r\n\t\tc_radius_type->setEnabled(true);\r\n\t\tradioButton->setEnabled(true);\r\n\t\tc_weighted->setEnabled(true);\r\n\t\tif (m_weighted) {\r\n\t\t\tc_attribute->setEnabled(true);\r\n\t\t\tm_attribute = 0;  \r\n\t\t\tUpdateData(false);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tm_attribute = -1;\r\n\t\t\tc_attribute->setEnabled(false);\r\n\t\t}\r\n\t}\r\n\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/SegmentAnalysisDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include \"ui_SegmentAnalysisDlg.h\"\r\n#include <salalib/mgraph.h>\r\n#include <salalib/shapemap.h>\r\n#include <salalib/axialmap.h>\r\n\r\nclass CSegmentAnalysisDlg : public QDialog, public Ui::CSegmentAnalysisDlg\r\n{\r\n\tQ_OBJECT\r\npublic:\r\n\tCSegmentAnalysisDlg(MetaGraph *graph = NULL, QWidget *parent = 0);\r\n\tint\t\tm_analysis_type;\r\n\tQString\tm_radius;\r\n\tint\t\tm_tulip_bins;\r\n\tint\t\tm_radius_type;\r\n\tbool\tm_choice;\r\n\tbool\tm_weighted;\r\n\tint\t\tm_attribute;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n\tMetaGraph *m_meta_graph;\r\n\r\nprivate slots:\r\n\tvoid OnAnalysisType(bool);\r\n\tvoid OnAnalysisTulip(bool);\r\n\tvoid OnUpdateRadius(QString);\r\n\tvoid OnWeighted(bool);\r\n\tvoid OnOK();\r\n\tvoid OnCancel();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/TopoMetDlg.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"TopoMetDlg.h\"\r\n#include <QMessageBox>\r\n\r\nCTopoMetDlg::CTopoMetDlg(QWidget *parent)\r\n: QDialog(parent)\r\n{\r\n\tsetupUi(this);\r\n    m_topological = TOPOMET_METHOD_TOPOLOGICAL;\r\n\tm_selected_only = false;\r\n\tm_radius = tr(\"n\");\r\n\r\n\tUpdateData(false);\r\n}\r\n\r\nvoid CTopoMetDlg::OnOK()\r\n{\r\n\tUpdateData(true);\r\n\r\n\t/*m_radius.TrimLeft(' ');\r\n\tm_radius.TrimRight(' ');*/\r\n\r\n\t// my own validate on the radius (note: on fail to convert, atoi returns 0)\r\n\tif (m_radius.isEmpty() || (m_radius.indexOf(\"n\") == -1 && m_radius.indexOf(\"N\") == -1 &&\r\n\t\tm_radius.indexOf(\"1\") == -1 && m_radius.indexOf(\"2\") == -1 && m_radius.indexOf(\"3\") == -1 && \r\n\t\tm_radius.indexOf(\"4\") == -1 &&  m_radius.indexOf(\"5\") == -1 &&  m_radius.indexOf(\"6\") == -1 &&\r\n\t\tm_radius.indexOf(\"7\") == -1 &&  m_radius.indexOf(\"8\") == -1 &&  m_radius.indexOf(\"9\") == -1)) {\r\n\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be numeric or 'n'\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\tm_radius = tr(\"n\");\r\n\t\tUpdateData(false);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (m_radius == \"n\" || m_radius == \"N\") {\r\n\t\tm_dradius = -1.0;\r\n\t}\r\n\telse {\r\n\t\tm_dradius = m_radius.toDouble();\r\n\t\tif (m_dradius <= 0.0) {\r\n\t\t\tQMessageBox::warning(this, tr(\"Warning\"), tr(\"The radius must either be 'n' or a number in the range 0.0 to infinity\"), QMessageBox::Ok, QMessageBox::Ok);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\taccept();\r\n}\r\n\r\nvoid CTopoMetDlg::UpdateData(bool value)\r\n{\r\n\tif (value)\r\n\t{\r\n\t\tif (c_topological->isChecked())\r\n            m_topological = TOPOMET_METHOD_TOPOLOGICAL;\r\n\t\telse if (radioButton->isChecked())\r\n            m_topological = TOPOMET_METHOD_METRIC;\r\n\t\telse\r\n\t\t\tm_topological = -1;\r\n\t\tm_radius = c_radius->text();\r\n\t\tif (checkBox->checkState())\r\n\t\t\tm_selected_only = true;\r\n\t\telse\r\n\t\t\tm_selected_only = false;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tswitch(m_topological)\r\n\t\t{\r\n        case TOPOMET_METHOD_TOPOLOGICAL:\r\n\t\t\tc_topological->setChecked(true);\r\n\t\t\tbreak;\r\n        case TOPOMET_METHOD_METRIC:\r\n\t\t\tradioButton->setChecked(true);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tc_radius->setText(m_radius);\r\n\t\tif (m_selected_only)\r\n\t\t\tcheckBox->setCheckState(Qt::Checked);\r\n\t\telse\r\n\t\t\tcheckBox->setCheckState(Qt::Unchecked);\r\n\t}\r\n}\r\n\r\nvoid CTopoMetDlg::showEvent(QShowEvent * event)\r\n{\r\n\tUpdateData(false);\r\n}\r\n"
  },
  {
    "path": "depthmapX/dialogs/TopoMetDlg.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"ui_TopoMetDlg.h\"\r\n\r\nclass CTopoMetDlg : public QDialog, public Ui::CTopoMetDlg\r\n{\r\n    Q_OBJECT\r\nprivate:\r\n    enum {TOPOMET_METHOD_TOPOLOGICAL = 0, TOPOMET_METHOD_METRIC = 1};\r\npublic:\r\n\tCTopoMetDlg(QWidget *parent = 0);\r\n\tint m_topological;\r\n\tQString m_radius;\r\n\tdouble m_dradius;\r\n\tbool m_selected_only;\r\n\tvoid UpdateData(bool value);\r\n\tvoid showEvent(QShowEvent * event);\r\n\r\n    bool isAnalysisTopological() {\r\n        return m_topological == TOPOMET_METHOD_TOPOLOGICAL;\r\n    }\r\n\r\n\tprivate slots:\r\n\t\tvoid OnOK();\r\n};\r\n"
  },
  {
    "path": "depthmapX/dialogs/licenseagreement.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"licenseagreement.h\"\n\nLicenseAgreement::LicenseAgreement(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::LicenseAgreement)\n{\n    ui->setupUi(this);\n}\n\nLicenseAgreement::~LicenseAgreement()\n{\n    delete ui;\n}\n"
  },
  {
    "path": "depthmapX/dialogs/licenseagreement.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef LICENSEAGREEMENT_H\n#define LICENSEAGREEMENT_H\n\n#include <QDialog>\n#include \"ui_licenseagreement.h\"\n#include \"compatibilitydefines.h\"\n\nnamespace Ui {\nclass LicenseAgreement;\n}\n\nclass LicenseAgreement : public QDialog\n{\n    Q_OBJECT\n    \npublic:\n    explicit LicenseAgreement(QWidget *parent = 0);\n    ~LicenseAgreement();\n    \nprivate:\n    Ui::LicenseAgreement *ui;\n};\n\n#endif // LICENSEAGREEMENT_H\n"
  },
  {
    "path": "depthmapX/dialogs/settings/generalpage.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"generalpage.h\"\n#include <QtWidgets>\n#include \"depthmapX/settings.h\"\n\nGeneralPage::GeneralPage(Settings &settings, QWidget *parent)\n    : SettingsPage(settings, parent)\n{\n    readSettings(settings);\n    QGroupBox *configGroup = new QGroupBox(tr(\"General configuration\"));\n    QCheckBox *simpleModeCheckBox = new QCheckBox(tr(\"Simple mode\"));\n    simpleModeCheckBox->setToolTip(tr(\"If enabled, only Integration [HH] will be calulcated (or Visual Integration [HH] for VGA)\"));\n    simpleModeCheckBox->setChecked(m_simpleVersion);\n    connect(simpleModeCheckBox, &QCheckBox::stateChanged, [=] () {m_simpleVersion = !m_simpleVersion;});\n\n    QVBoxLayout *configLayout = new QVBoxLayout;\n    configLayout->addWidget(simpleModeCheckBox);\n    configGroup->setLayout(configLayout);\n\n    QVBoxLayout *mainLayout = new QVBoxLayout;\n    mainLayout->addWidget(configGroup);\n    mainLayout->addStretch(1);\n    setLayout(mainLayout);\n}\n"
  },
  {
    "path": "depthmapX/dialogs/settings/generalpage.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <QWidget>\n#include \"settingspage.h\"\n#include <iostream>\n\nclass GeneralPage : public SettingsPage\n{\nprivate:\n    bool m_simpleVersion = false;    \n    void readSettings(Settings &settings) {\n        m_simpleVersion = settings.readSetting(SettingTag::simpleVersion, true).toBool();\n    }\npublic:\n    GeneralPage(Settings &settings, QWidget *parent = 0);\n    virtual void writeSettings(Settings &settings) override {\n        settings.writeSetting(SettingTag::simpleVersion, m_simpleVersion);\n    }\n};\n"
  },
  {
    "path": "depthmapX/dialogs/settings/interfacepage.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"interfacepage.h\"\n#include <QtWidgets>\n#include <QColorDialog>\n\nInterfacePage::InterfacePage(Settings &settings, QWidget *parent)\n    : SettingsPage(settings, parent)\n{\n    readSettings(settings);\n\n    QGroupBox *generalGroup = new QGroupBox(tr(\"General\"));\n    QCheckBox *legacyMapCheckBox = new QCheckBox(tr(\"Legacy map window as default\"));\n    legacyMapCheckBox->setChecked(m_defaultMapWindowIsLegacy);\n    connect(legacyMapCheckBox, &QCheckBox::stateChanged, [=] () {m_defaultMapWindowIsLegacy = !m_defaultMapWindowIsLegacy;});\n    QCheckBox *hoverCheckBox = new QCheckBox(tr(\"Allow highlighting shapes on hover\"));\n    hoverCheckBox->setChecked(m_highlightOnHover);\n    connect(hoverCheckBox, &QCheckBox::stateChanged, [=] () {m_highlightOnHover = !m_highlightOnHover;});\n\n    QVBoxLayout *generalLayout = new QVBoxLayout;\n    generalLayout->addWidget(legacyMapCheckBox);\n    generalLayout->addWidget(hoverCheckBox);\n    generalGroup->setLayout(generalLayout);\n\n    QGroupBox *interfaceColoursGroup = new QGroupBox(tr(\"Interface colours\"));\n    QListWidget *interfaceColoursList = new QListWidget;\n    connect(interfaceColoursList, SIGNAL(itemDoubleClicked(QListWidgetItem*)),\n                this, SLOT(onInterfaceColourlItemClicked(QListWidgetItem*)));\n\n    QListWidgetItem *bgItem = new QListWidgetItem(interfaceColoursList);\n    bgItem->setText(tr(\"Background\"));\n    QPixmap pixmap(20,20);\n    pixmap.fill(m_background);\n    QIcon bgColourIcon(pixmap);\n    bgItem->setIcon(bgColourIcon);\n    colourMap.insert(std::pair<QListWidgetItem *, QColor *>(bgItem, &m_background));\n\n    QListWidgetItem *fgItem = new QListWidgetItem(interfaceColoursList);\n    fgItem->setText(tr(\"Foreground\"));\n    pixmap.fill(m_foreground);\n    QIcon fgColourIcon(pixmap);\n    fgItem->setIcon(fgColourIcon);\n    colourMap.insert(std::pair<QListWidgetItem *, QColor *>(fgItem, &m_foreground));\n\n    QVBoxLayout *interfaceColoursLayout = new QVBoxLayout;\n    interfaceColoursLayout->addWidget(interfaceColoursList);\n    interfaceColoursGroup->setLayout(interfaceColoursLayout);\n    QGroupBox *glOptionsGroup = new QGroupBox(tr(\"OpenGL view options\"));\n\n    QLabel *samplesLabel = new QLabel(tr(\"Number of antialising samples:\"));\n    QComboBox *samplesCombo = new QComboBox;\n    samplesCombo->addItem(tr(\"0 (fastest)\"), 0);\n    samplesCombo->addItem(tr(\"2\"), 2);\n    samplesCombo->addItem(tr(\"4\"), 4);\n    samplesCombo->addItem(tr(\"8\"), 8);\n    samplesCombo->addItem(tr(\"16 (prettiest)\"), 16);\n    samplesCombo->setToolTip(tr(\"This will make lines smoother if higher, \"\n                                \"but also the overall rendering slower. \"\n                                \"To see the change close and reopen the file\"));\n\n    int index = samplesCombo->findData(m_antialiasingSamples);\n    if ( index != -1 ) {\n       samplesCombo->setCurrentIndex(index);\n    }\n\n    connect(samplesCombo, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated),\n        [=](int index){ m_antialiasingSamples = samplesCombo->itemData(index).toInt();});\n\n    QHBoxLayout *samplesLayout = new QHBoxLayout;\n    samplesLayout->addWidget(samplesLabel);\n    samplesLayout->addWidget(samplesCombo);\n\n    QVBoxLayout *configLayout = new QVBoxLayout;\n    configLayout->addLayout(samplesLayout);\n    glOptionsGroup->setLayout(configLayout);\n\n    QVBoxLayout *mainLayout = new QVBoxLayout;\n    mainLayout->addWidget(generalGroup);\n    mainLayout->addSpacing(1);\n    mainLayout->addWidget(interfaceColoursGroup);\n    mainLayout->addSpacing(1);\n    mainLayout->addWidget(glOptionsGroup);\n    mainLayout->addStretch(1);\n    setLayout(mainLayout);\n}\n\nvoid InterfacePage::onInterfaceColourlItemClicked(QListWidgetItem* item)\n{\n    QColor colour = QColorDialog::getColor();\n    colourMap[item]->setRed(colour.red());\n    colourMap[item]->setGreen(colour.green());\n    colourMap[item]->setBlue(colour.blue());\n    QPixmap pixmap(100,100);\n    pixmap.fill(colour);\n    QIcon bgColourIcon(pixmap);\n    item->setIcon(bgColourIcon);\n}\n"
  },
  {
    "path": "depthmapX/dialogs/settings/interfacepage.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <QWidget>\n#include <QtWidgets>\n#include \"settingspage.h\"\n#include <map>\n#include <memory>\n\nclass InterfacePage : public SettingsPage\n{\n    Q_OBJECT\n\nprivate:\n    QColor m_background;\n    QColor m_foreground;\n    std::map<QListWidgetItem *, QColor *> colourMap;\n    int m_antialiasingSamples = 0;\n    bool m_defaultMapWindowIsLegacy = false;\n    bool m_highlightOnHover = true;\n    void readSettings(Settings &settings) {\n        m_foreground = QColor(settings.readSetting(SettingTag::foregroundColour, qRgb(128,255,128)).toInt());\n        m_background = QColor(settings.readSetting(SettingTag::backgroundColour, qRgb(0,0,0)).toInt());\n        m_antialiasingSamples = settings.readSetting(SettingTag::antialiasingSamples, 0).toInt();\n        m_defaultMapWindowIsLegacy = settings.readSetting(SettingTag::legacyMapWindow, false).toBool();\n        m_highlightOnHover = settings.readSetting(SettingTag::highlightOnHover, true).toBool();\n    }\nprivate slots:\n    void onInterfaceColourlItemClicked(QListWidgetItem *item);\npublic:\n    InterfacePage(Settings &settings, QWidget *parent = 0);\n    virtual void writeSettings(Settings &settings) override {\n        settings.writeSetting(SettingTag::backgroundColour, m_background.rgb());\n        settings.writeSetting(SettingTag::foregroundColour, m_foreground.rgb());\n        settings.writeSetting(SettingTag::antialiasingSamples, m_antialiasingSamples);\n        settings.writeSetting(SettingTag::legacyMapWindow, m_defaultMapWindowIsLegacy);\n        settings.writeSetting(SettingTag::highlightOnHover, m_highlightOnHover);\n    }\n};\n"
  },
  {
    "path": "depthmapX/dialogs/settings/settingsdialog.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <QtWidgets>\n\n#include \"settingsdialog.h\"\n#include \"generalpage.h\"\n#include \"interfacepage.h\"\n\nSettingsDialog::SettingsDialog(Settings &settings) : m_settings(settings)\n{\n    contentsWidget = new QListWidget;\n    contentsWidget->setIconSize(QSize(96, 84));\n    contentsWidget->setMovement(QListView::Static);\n    contentsWidget->setMaximumWidth(150);\n    contentsWidget->setSpacing(5);\n\n    pagesWidget = new QStackedWidget;\n    settingsPages.push_back(std::unique_ptr<SettingsPage>(new GeneralPage(m_settings)));\n    settingsPages.push_back(std::unique_ptr<SettingsPage>(new InterfacePage(m_settings)));\n\n    std::vector<std::unique_ptr<SettingsPage>>::iterator iter = settingsPages.begin(),\n                                                         end = settingsPages.end();\n    for ( ; iter != end; ++iter )\n    {\n        pagesWidget->addWidget((*iter).get());\n    }\n\n    QPushButton *saveButton = new QPushButton(tr(\"Save\"));\n    connect(saveButton, &QAbstractButton::clicked, this, &SettingsDialog::saveChangesAndClose);\n\n    QPushButton *cancelButton = new QPushButton(tr(\"Cancel\"));\n    connect(cancelButton, &QAbstractButton::clicked, this, &QDialog::reject);\n\n    createIcons();\n    contentsWidget->setCurrentRow(0);\n\n\n    QHBoxLayout *horizontalLayout = new QHBoxLayout;\n    horizontalLayout->addWidget(contentsWidget);\n    horizontalLayout->addWidget(pagesWidget, 1);\n\n    QHBoxLayout *buttonsLayout = new QHBoxLayout;\n    buttonsLayout->addStretch(1);\n    buttonsLayout->addWidget(saveButton);\n    buttonsLayout->addWidget(cancelButton);\n\n    QVBoxLayout *mainLayout = new QVBoxLayout;\n    mainLayout->addLayout(horizontalLayout);\n    mainLayout->addStretch(1);\n    mainLayout->addSpacing(12);\n    mainLayout->addLayout(buttonsLayout);\n    setLayout(mainLayout);\n\n    setWindowTitle(tr(\"Settings\"));\n}\n\nvoid SettingsDialog::saveChanges() {\n    std::vector<std::unique_ptr<SettingsPage>>::iterator iter = settingsPages.begin(),\n                                        end = settingsPages.end();\n    for ( ; iter != end; ++iter )\n    {\n        (*iter)->writeSettings(m_settings);\n    }\n}\n\nvoid SettingsDialog::saveChangesAndClose() {\n    saveChanges();\n    QDialog::accept();\n}\n\nvoid SettingsDialog::createIcons()\n{\n    QListWidgetItem *generalButton = new QListWidgetItem(contentsWidget);\n    generalButton->setIcon(QIcon(\":/images/general.png\"));\n    generalButton->setText(tr(\"General\"));\n    generalButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);\n\n    QListWidgetItem *interfaceButton = new QListWidgetItem(contentsWidget);\n    interfaceButton->setIcon(QIcon(\":/images/interface.png\"));\n    interfaceButton->setText(tr(\"Interface\"));\n    interfaceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);\n\n    connect(contentsWidget, &QListWidget::currentItemChanged, this, &SettingsDialog::changePage);\n}\n\nvoid SettingsDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous)\n{\n    if (!current)\n        current = previous;\n\n    pagesWidget->setCurrentIndex(contentsWidget->row(current));\n}\n"
  },
  {
    "path": "depthmapX/dialogs/settings/settingsdialog.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"settingspage.h\"\n\n#include <QDialog>\n#include \"depthmapX/settings.h\"\n#include <vector>\n#include <memory>\n\nclass QListWidget;\nclass QListWidgetItem;\nclass QStackedWidget;\n\nclass SettingsDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    SettingsDialog(Settings &settings);\n\npublic slots:\n    void changePage(QListWidgetItem *current, QListWidgetItem *previous);\n\nprivate:\n    void createIcons();\n    std::vector<std::unique_ptr<SettingsPage>> settingsPages;\n    QListWidget *contentsWidget;\n    QStackedWidget *pagesWidget;\n    Settings &m_settings;\n    void saveChanges();\n    void saveChangesAndClose();\n};\n"
  },
  {
    "path": "depthmapX/dialogs/settings/settingsdialog.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>images/general.png</file>\n        <file>images/interface.png</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "depthmapX/dialogs/settings/settingspage.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/settings.h\"\n\n#include <QWidget>\n\nclass SettingsPage : public QWidget\n{\npublic:\n    SettingsPage(Settings &settings, QWidget *parent = 0) : QWidget(parent) {}\n    virtual void writeSettings(Settings &settings) = 0;\n};\n"
  },
  {
    "path": "depthmapX/icons.rc",
    "content": "IDI_ICON1               ICON    DISCARDABLE     \"icons\\\\depthmapX.ico\"\n"
  },
  {
    "path": "depthmapX/imainwindowmodule.h",
    "content": "// Copyright (C) 2020, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <QAction>\n#include <QMenuBar>\n#include <iostream>\n\nclass MainWindow;\n\nclass IMainWindowModule : public QObject {\n    Q_OBJECT\n\n  public:\n    virtual bool createMenus(MainWindow *m_mainWindow) = 0;\n    virtual ~IMainWindowModule() {}\n};\n"
  },
  {
    "path": "depthmapX/imainwindowmodulefactory.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imainwindowmodule.h\"\n#include <memory>\n#include <vector>\n\ntypedef std::vector<std::unique_ptr<IMainWindowModule>> MainWindowModuleVec;\n\nclass IMainWindowModuleFactory {\n  public:\n    virtual const MainWindowModuleVec &getModules() const = 0;\n    virtual ~IMainWindowModuleFactory() {}\n};\n"
  },
  {
    "path": "depthmapX/indexWidget.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include <QtCore/QEvent>\r\n#include <QtCore/QDebug>\r\n\r\n#include <QtWidgets/QMenu>\r\n#include <QtWidgets/QLayout>\r\n#include <QtGui/QKeyEvent>\r\n#include <QtWidgets/QMessageBox>\r\n#include <QtWidgets/QHeaderView>\r\n#include <QtWidgets/QListWidgetItem>\r\n#include <QtGui/QFocusEvent>\r\n\r\n#include \"mainwindow.h\"\r\n\r\nQT_BEGIN_NAMESPACE\r\n\r\nAttribWindow::AttribWindow(QWidget *parent, bool custom)\r\n    : QListWidget(parent)\r\n{\r\n    custom = false;\r\n\r\n\tmain_frm = parent;\r\n    installEventFilter(this);\r\n    setContextMenuPolicy(Qt::CustomContextMenu);\r\n\r\n\tconnect(this, SIGNAL(customContextMenuRequested(const QPoint&)), \r\n        this, SLOT(showContextMenu(const QPoint&)));\r\n\r\n\tconnect(this, SIGNAL(itemSelectionChanged()), parent, SLOT(OnSelchangingList()));\r\n}\r\n\r\nAttribWindow::~AttribWindow()\r\n{\r\n    // nothing todo\r\n}\r\n\r\nvoid AttribWindow::showContextMenu(const QPoint &point)\r\n{\r\n\tQListWidgetItem *item = itemAt(point);\r\n    if (!item) return;\r\n\r\n    QPoint ptt(mapToGlobal(point));\r\n\r\n    ((MainWindow *)main_frm)->showContextMenu(ptt);\r\n}\r\n\r\nQT_END_NAMESPACE\r\n"
  },
  {
    "path": "depthmapX/indexWidget.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef treeWindow_H\r\n#define treeWindow_H\r\n#include <QListWidget>\r\n\r\nQT_BEGIN_NAMESPACE\r\n\r\nclass QEvent;\r\nclass QListWidgetItem;\r\n\r\nclass AttribWindow : public QListWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    AttribWindow(QWidget *parent = 0, bool custom = true);\r\n    ~AttribWindow();\r\n\r\n\tQWidget* main_frm;\r\n\r\nprivate slots:\r\n    void showContextMenu(const QPoint &point);\r\n};\r\n\r\nQT_END_NAMESPACE\r\n\r\n#endif\r\n"
  },
  {
    "path": "depthmapX/main.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <QPixmap>\n#include <QDir>\n#include <QDateTime>\n\n#include \"coreapplication.h\"\n\n#ifdef _WIN32\n#include <windows.h>\n#endif\n\n\nint main(int argc, char *argv[])\n{\n    Q_INIT_RESOURCE(resource);\n    Q_INIT_RESOURCE(settingsdialog);\n\n    CoreApplication app(argc, argv);\n\n    return app.exec();\n}\n"
  },
  {
    "path": "depthmapX/mainwindow.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n#include \"mainwindow.h\"\r\n\r\n#include \"depthmapX/views/depthmapview/depthmapview.h\"\r\n#include \"depthmapX/views/3dview/3dview.h\"\r\n#include \"depthmapX/views/plotview/plotview.h\"\r\n#include \"depthmapX/views/tableview/tableview.h\"\r\n#include \"dialogs/AboutDlg.h\"\r\n#include \"dialogs/settings/settingsdialog.h\"\r\n\r\n#include <QtGui>\r\n#include <QDesktopServices>\r\n#include <QtWidgets/QMdiArea>\r\n#include <QtWidgets/QDockWidget>\r\n#include <QtWidgets/QToolButton>\r\n#include <QtWidgets/QFileDialog>\r\n#include <QtWidgets/QStatusBar>\r\n#include <QtWidgets/QMenu>\r\n#include <QtWidgets/QColorDialog>\r\n#include <QtWidgets/QMdiSubWindow>\r\n#include <QtWidgets/QToolBar>\r\n#include <QtWidgets/QMenuBar>\r\n#include <QtWidgets/QMessageBox>\r\n\r\n\r\nstatic int current_view_type = 0;\r\n\r\nconst QString editstatetext[] = {\"Not Editable\", \"Editable Off\", \"Editable On\"};\r\n\r\nQmyEvent::QmyEvent(Type type, void* wp, int lp)\r\n    : QEvent(type)\r\n{\r\n    registerEventType(type);\r\n    wparam = wp;\r\n    lparam = lp;\r\n}\r\n\r\nvoid MainWindow::actionEvent ( QActionEvent * event )\r\n{\r\n    int id;\r\n    if((id = event->action()->data().toInt()))\r\n    {\r\n    }\r\n}\r\n\r\nbool MainWindow::eventFilter(QObject *object, QEvent *e)\r\n{\r\n    if (object == this && e->type() == (QEvent::Type)FOCUSGRAPH)\r\n    {\r\n        OnFocusGraph((QGraphDoc*)((QmyEvent*)e)->wparam, ((QmyEvent*)e)->lparam);\r\n        return true;\r\n    }\r\n    return QObject::eventFilter(object, e);\r\n}\r\n\r\nMainWindow::MainWindow(const QString &fileToLoad, Settings &settings) : mSettings(settings)\r\n{\r\n    m_treeDoc = NULL;\r\n    mdiArea = new QMdiArea;\r\n    setCentralWidget(mdiArea);\r\n    connect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(updateActiveWindows()));\r\n\r\n    windowMapper = new QSignalMapper(this);\r\n    connect(windowMapper, SIGNAL(mapped(QWidget *)), this, SLOT(setActiveSubWindow(QWidget *)));\r\n\r\n\r\n    m_indexWidget = new IndexWidget(this);\r\n    QDockWidget *indexDock = new QDockWidget(tr(\"Index\"), this);\r\n    indexDock->setObjectName(QLatin1String(\"IndexWindow\"));\r\n    indexDock->setWidget(m_indexWidget);\r\n    addDockWidget(Qt::LeftDockWidgetArea, indexDock);\r\n\r\n    QDockWidget *AttributesListDock = new QDockWidget(tr(\"AttributesList\"), this);\r\n    AttributesListDock->setObjectName(QLatin1String(\"AttributesListWindow\"));\r\n    AttributesListDock->setWidget(setupAttributesListWidget());\r\n    addDockWidget(Qt::LeftDockWidgetArea, AttributesListDock);\r\n\r\n    readSettings(); // read setting or generate default\r\n    setWindowTitle(TITLE_BASE);\r\n\r\n    createActions();\r\n    createMenus();\r\n    createToolBars();\r\n    createStatusBar();\r\n    updateToolbar();\r\n    updateActiveWindows();\r\n    updateGLWindows(true, true);\r\n\r\n    installEventFilter(this);\r\n//\tsetWindowIcon(QIcon(tr(\":/images/cur/icon-1-1.png\")));\r\n\r\n    if (fileToLoad.length()>0)\r\n    {\r\n        loadFile(fileToLoad);\r\n    }\r\n}\r\n\r\nQWidget * MainWindow::setupAttributesListWidget()\r\n{\r\n    QWidget *widget = new QWidget(this);\r\n\r\n    QLayout *vlayout = new QVBoxLayout(widget);\r\n    vlayout->setMargin(1);\r\n\r\n    QLayout *hlayout = new QHBoxLayout();\r\n    vlayout->addWidget(m_attrWindow = new AttribWindow(this, false));\r\n    vlayout->addItem(hlayout);\r\n\r\n    hlayout->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));\r\n\r\n    attr_add_button = new QToolButton(widget);\r\n    attr_add_button->setText(tr(\"Add\"));\r\n    attr_add_button->setIcon(QIcon(tr(\":/images/win/b-5-19.png\")));\r\n    attr_add_button->setAutoRaise(true);\r\n    attr_add_button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);\r\n    hlayout->addWidget(attr_add_button);\r\n    connect(attr_add_button, SIGNAL(clicked()), this, SLOT(OnAddColumn()));\r\n\r\n    attr_del_button = new QToolButton(widget);\r\n    attr_del_button->setText(tr(\"Remove\"));\r\n    attr_del_button->setIcon(QIcon(tr(\":/images/win/b-5-21.png\")));\r\n    attr_del_button->setAutoRaise(true);\r\n    attr_del_button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);\r\n    hlayout->addWidget(attr_del_button);\r\n    connect(attr_del_button, SIGNAL(clicked()), this, SLOT(OnRemoveColumn()));\r\n\r\n    return widget;\r\n}\r\n\r\nvoid MainWindow::closeEvent(QCloseEvent *event)\r\n{\r\n    mdiArea->closeAllSubWindows();\r\n    if (activeMapView()) {\r\n         event->ignore();\r\n    } else {\r\n        QApplication::postEvent((QObject*)&m_wndColourScale, new QEvent(QEvent::Close));\r\n         writeSettings();\r\n         event->accept();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnFileNew()\r\n{\r\n    MapView *child = createMapView();\r\n    child->getGraphDoc()->OnNewDocument();\r\n    child->setCurrentFile(\"\");\r\n    child->postLoadFile();\r\n    child->show();\r\n    OnFocusGraph(child->getGraphDoc(), QGraphDoc::CONTROLS_LOADALL);\r\n}\r\n\r\nvoid MainWindow::loadFile(QString fileName) {\r\n    QMdiSubWindow *existing = findMapView(fileName);\r\n    if (existing) {\r\n          mdiArea->setActiveSubWindow(existing);\r\n          return;\r\n    }\r\n    MapView *child = createMapView();\r\n    QByteArray ba = fileName.toUtf8(); // quick fix for weird chars (russian filename bug report)\r\n    char *file = ba.data(); // quick fix for weird chars (russian filename bug report)\r\n    if(child->getGraphDoc()->OnOpenDocument(file)) // quick fix for weird chars (russian filename bug report)\r\n    {\r\n         child->setCurrentFile(fileName);\r\n         child->postLoadFile();\r\n         statusBar()->showMessage(tr(\"File loaded\"), 2000);\r\n         child->show();\r\n         OnFocusGraph(child->getGraphDoc(), QGraphDoc::CONTROLS_LOADALL);\r\n         setCurrentFile(fileName);\r\n    } else {\r\n         child->close();\r\n         QMessageBox::warning(this, \"Failed to load\", QString(\"Failed to load file \")+fileName, QMessageBox::Ok, QMessageBox::Ok );\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnFileOpen()\r\n{\r\n   QString template_string;\r\n   template_string += \"Graph Files (*.graph)\\nAll files (*.*)\";\r\n\r\n   QFileDialog::Options options = 0;\r\n   QString selectedFilter;\r\n     QString fileName = QFileDialog::getOpenFileName(\r\n       0, tr(\"Open\"),\r\n       \"\",\r\n       template_string,\r\n       &selectedFilter,\r\n       options);\r\n     if (!fileName.isEmpty()) {\r\n          loadFile(fileName);\r\n     }\r\n}\r\n\r\nvoid MainWindow::showContextMenu(QPoint &point)\r\n{\r\n    QMenu menu;\r\n    menu.addAction(renameColumnAct);\r\n    menu.addAction(updateColumAct);\r\n    menu.addAction(removeColumAct);\r\n    menu.addSeparator();\r\n    menu.addAction(columnPropertiesAct);\r\n\r\n    menu.exec(point);\r\n}\r\n\r\nvoid MainWindow::OnFilePrint()\r\n{\r\n\r\n}\r\n\r\nvoid MainWindow::OnFilePrintPreview()\r\n{\r\n\r\n}\r\n\r\nvoid MainWindow::OnFilePrintSetup()\r\n{\r\n\r\n}\r\n\r\nvoid MainWindow::OnEditUndo()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnEditUndo();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnEditCopyData()\r\n{\r\n}\r\n\r\nvoid MainWindow::OnEditCopy()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p) m_p->OnEditCopy();\r\n}\r\n\r\nvoid MainWindow::OnEditSave()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p)\r\n    {\r\n        m_p->OnEditSave();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnEditClear()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnEditClear();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnEditQuery()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnEditQuery();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnViewZoomsel()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p) m_p->OnViewZoomsel();\r\n}\r\n\r\nvoid MainWindow::OnEditSelectToLayer()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnEditSelectToLayer();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnFileImport()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnFileImport();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnLayerNew()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnLayerNew();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnLayerDelete()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnLayerDelete();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnLayerConvert()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnLayerConvert();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnLayerConvertDrawing()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnLayerConvertDrawing();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnConvertMapShapes()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnConvertMapShapes();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnFileExport()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnFileExport();\r\n    }\r\n}\r\n\r\n\r\nvoid MainWindow::OnFileExportMapGeometry()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnFileExportMapGeometry();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnFileExportLinks()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnFileExportLinks();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnAxialConnectionsExportAsDot()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnAxialConnectionsExportAsDot();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnAxialConnectionsExportAsPairCSV()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnAxialConnectionsExportAsPairCSV();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnSegmentConnectionsExportAsPairCSV()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnSegmentConnectionsExportAsPairCSV();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnPointmapExportConnectionsAsCSV()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnPointmapExportConnectionsAsCSV();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnAddColumn()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnAddColumn();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnRenameColumn()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnRenameColumn();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnUpdateColumn()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnUpdateColumn();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnRemoveColumn()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnRemoveColumn();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnColumnProperties()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnColumnProperties();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnPushToLayer()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnPushToLayer();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnEditGrid()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnEditGrid();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsMakeGraph()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsMakeGraph();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsUnmakeGraph()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsUnmakeGraph();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsImportVGALinks()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnVGALinksFileImport();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsGenerateIsovistsFromFile()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnGenerateIsovistsFromFile();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsRun()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsRun();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsAgentRun()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsAgentRun();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsIsovistpath()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsIsovistpath();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsAgentLoadProgram()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        if(m_p->m_view[QGraphDoc::VIEW_3D])\r\n            ((Q3DView*)m_p->m_view[QGraphDoc::VIEW_3D])->OnToolsAgentLoadProgram();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsRunAxa()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsRunAxa();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsPD()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsPD();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsMakeFewestLineMap()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsMakeFewestLineMap();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsAxialConvShapeMap()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsAxialConvShapeMap();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsLineLoadUnlinks()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsLineLoadUnlinks();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsRunSeg()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsRunSeg();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsTopomet()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsTopomet();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsTPD()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsTPD();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsMPD()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsMPD();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsPointConvShapeMap()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsPointConvShapeMap();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsAPD()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnToolsAPD();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnToolsOptions()\r\n{\r\n    SettingsDialog dialog(mSettings);\r\n    if(QDialog::Accepted == dialog.exec()) {\r\n        readSettings();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnViewCentreView()\r\n{\r\n    activeMapDoc()->SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_TOTAL, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n}\r\n\r\nvoid MainWindow::OnViewShowGrid()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnViewShowGrid();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnViewSummary()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        m_p->OnViewSummary();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnViewColourRange()\r\n{\r\n    if (m_wndColourScale.isVisible()) {\r\n        m_wndColourScale.hide();\r\n    }\r\n    else {\r\n        QRect recta,rectb;\r\n        recta = geometry();\r\n        rectb = m_wndColourScale.geometry();\r\n        m_wndColourScale.setGeometry(recta.right() - 7 - rectb.width(), recta.top() + 68, rectb.width(), rectb.height());\r\n        m_wndColourScale.m_docked = true;\r\n        m_wndColourScale.show();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnHelpBugs()\r\n{\r\n    bool foo = QDesktopServices::openUrl( QUrl(\"https://github.com/SpaceGroupUCL/depthmapX/issues\") );\r\n}\r\n\r\nvoid MainWindow::OnHelpManual()\r\n{\r\n    bool foo = QDesktopServices::openUrl( QUrl(\"http://www.vr.ucl.ac.uk/depthmap/depthmap4r1.pdf\") );\r\n}\r\n\r\nvoid MainWindow::OnHelpTutorials()\r\n{\r\n    bool foo = QDesktopServices::openUrl( QUrl(\"http://www.vr.ucl.ac.uk/depthmap/tutorials/\") );\r\n}\r\n\r\nvoid MainWindow::OnHelpSalaManual()\r\n{\r\n    bool foo = QDesktopServices::openUrl( QUrl(\"http://www.vr.ucl.ac.uk/depthmap/scripting/\") );\r\n}\r\n\r\nvoid MainWindow::OnFileClose()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p) QApplication::postEvent((QObject*)m_p, new QEvent(QEvent::Close));\r\n}\r\n\r\nvoid MainWindow::OnFileSave()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        bool saved = m_p->OnFileSave();\r\n        if(saved) {\r\n            statusBar()->showMessage(tr(\"File saved\"), 2000);\r\n            setCurrentFile(m_p->m_opened_name);\r\n            updateSubWindowTitles(m_p->m_base_title);\r\n        } else {\r\n            statusBar()->showMessage(tr(\"File not saved\"), 2000);\r\n        }\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnFileSaveAs()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(m_p)\r\n    {\r\n        bool saved = m_p->OnFileSaveAs();\r\n        if(saved) {\r\n            statusBar()->showMessage(tr(\"File saved\"), 2000);\r\n            setCurrentFile(m_p->m_opened_name);\r\n            updateSubWindowTitles(m_p->m_base_title);\r\n        } else {\r\n            statusBar()->showMessage(tr(\"File not saved\"), 2000);\r\n        }\r\n    }\r\n}\r\nvoid MainWindow::updateSubWindowTitles(QString newTitle) {\r\n    QList<QMdiSubWindow *> windowList = mdiArea->subWindowList();\r\n    QList<QMdiSubWindow *>::iterator iter = windowList.begin(), end =\r\n    windowList.end();\r\n    for ( ; iter != end; ++iter )\r\n    {\r\n        QWidget *p = 0;\r\n        if (QMdiSubWindow *subWindow = *iter)\r\n        {\r\n            p = qobject_cast<MapView *>(subWindow->widget());\r\n            if(p) subWindow->setWindowTitle(newTitle +\":Map View\");\r\n            p = qobject_cast<QPlotView *>(subWindow->widget());\r\n            if(p) subWindow->setWindowTitle(newTitle +\":Scatter Plot\");\r\n            p = qobject_cast<TableView *>(subWindow->widget());\r\n            if(p) subWindow->setWindowTitle(newTitle +\":Table View\");\r\n            p = qobject_cast<Q3DView *>(subWindow->widget());\r\n            if(p) subWindow->setWindowTitle(newTitle +\":3D View\");\r\n        }\r\n    }\r\n\r\n}\r\n\r\nvoid MainWindow::OnAppAbout()\r\n{\r\n    CAboutDlg aboutDlg;\r\n    aboutDlg.exec();\r\n}\r\n\r\nMapView *MainWindow::createMapView()\r\n{\r\n    QGraphDoc* doc = new QGraphDoc(\"\", \"\");\r\n    doc->m_mainFrame = this;\r\n\r\n    if(m_defaultMapWindowIsLegacy)\r\n    {\r\n        QDepthmapView *child = new QDepthmapView(*doc, mSettings);\r\n        mdiArea->addSubWindow(child);\r\n        return child;\r\n    }\r\n    else\r\n    {\r\n        GLView *child = new GLView(*doc, mSettings);\r\n        mdiArea->addSubWindow(child);\r\n        return child;\r\n    }\r\n\r\n}\r\n\r\nMapView *MainWindow::activeMapView()\r\n{\r\n    QWidget *p = 0;\r\n    if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())\r\n    {\r\n        p = qobject_cast<MapView *>(activeSubWindow->widget());\r\n        if(p) return (MapView *)p;\r\n        if(!p)\r\n        {\r\n            p = qobject_cast<QPlotView *>(activeSubWindow->widget());\r\n            if(p) return (MapView *)(((QPlotView*)p)->pDoc->m_view[1]);\r\n        }\r\n        if(!p)\r\n        {\r\n            p = qobject_cast<TableView *>(activeSubWindow->widget());\r\n            if(p) return (MapView *)(((TableView*)p)->pDoc->m_view[1]);\r\n        }\r\n        if(!p)\r\n        {\r\n            p = qobject_cast<Q3DView *>(activeSubWindow->widget());\r\n            if(p) return (MapView *)(((Q3DView*)p)->pDoc->m_view[1]);\r\n        }\r\n    }\r\n    current_view_type = 0;\r\n    return 0;\r\n}\r\n\r\nQGraphDoc *MainWindow::activeMapDoc()\r\n{\r\n    QWidget *p = 0;\r\n    if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow())\r\n    {\r\n        p = qobject_cast<MapView *>(activeSubWindow->widget());\r\n        if(p) return ((MapView *)p)->getGraphDoc();\r\n        p = qobject_cast<QPlotView *>(activeSubWindow->widget());\r\n        if(p) return ((QPlotView *)p)->pDoc;\r\n        p = qobject_cast<TableView *>(activeSubWindow->widget());\r\n        if(p) return ((TableView *)p)->pDoc;\r\n        p = qobject_cast<Q3DView *>(activeSubWindow->widget());\r\n        if(p) return ((Q3DView *)p)->pDoc;\r\n    }\r\n    return 0;\r\n}\r\n\r\nQMdiSubWindow *MainWindow::findMapView(const QString &fileName)\r\n{\r\n    QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath();\r\n\r\n    foreach (QMdiSubWindow *window, mdiArea->subWindowList()) {\r\n        MapView *mdiChild = qobject_cast<MapView *>(window->widget());\r\n          if (mdiChild && mdiChild->getCurrentFile() == canonicalFilePath) return window;\r\n    }\r\n    return 0;\r\n}\r\n\r\nvoid MainWindow::OnWindowMap()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p)\r\n    {\r\n        if(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_MAP])\r\n            return setActiveSubWindow(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_MAP]);\r\n        QDepthmapView *child = new QDepthmapView(*m_p->getGraphDoc(), mSettings);\r\n        mdiArea->addSubWindow(child);\r\n        child->show();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnViewTable()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p)\r\n    {\r\n        if(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_TABLE])\r\n            return setActiveSubWindow(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_TABLE]);\r\n        TableView *child = new TableView(mSettings, this, m_p->getGraphDoc());\r\n        child->pDoc = m_p->getGraphDoc();\r\n        mdiArea->addSubWindow(child);\r\n        child->show();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnWindow3dView()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p)\r\n    {\r\n        if(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_3D])\r\n            return setActiveSubWindow(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_3D]);\r\n        Q3DView *child = new Q3DView(this, m_p->getGraphDoc());\r\n        child->pDoc = m_p->getGraphDoc();\r\n        mdiArea->addSubWindow(child);\r\n        child->show();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnWindowGLView()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p)\r\n    {\r\n        if(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_MAP_GL])\r\n            return setActiveSubWindow(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_MAP_GL]);\r\n        GLView *child = new GLView(*m_p->getGraphDoc(), mSettings);\r\n        mdiArea->addSubWindow(child);\r\n        child->show();\r\n    }\r\n}\r\n\r\nvoid MainWindow::OnViewScatterplot()\r\n{\r\n    MapView* m_p = activeMapView();\r\n    if(m_p)\r\n    {\r\n        if(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_SCATTER])\r\n            return setActiveSubWindow(m_p->getGraphDoc()->m_view[QGraphDoc::VIEW_SCATTER]);\r\n        QPlotView *child = new QPlotView;\r\n        child->pDoc = m_p->getGraphDoc();\r\n        child->m_parent = this;\r\n        mdiArea->addSubWindow(child);\r\n        child->show();\r\n    }\r\n}\r\n\r\nvoid MainWindow::update3DToolbar()\r\n{\r\n    updateActiveWindows();\r\n}\r\n\r\nvoid MainWindow::updateActiveWindows()\r\n{\r\n    current_view_type = 0;\r\n    QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow();\r\n    if(!activeSubWindow)\r\n    {\r\n        editToolBar->hide();\r\n        thirdViewToolBar->hide();\r\n        plotToolBar->hide();\r\n        return;\r\n    }\r\n\r\n    QWidget* p = qobject_cast<QPlotView *>(activeSubWindow->widget());\r\n    if(p)\r\n    {\r\n        editToolBar->hide();\r\n        thirdViewToolBar->hide();\r\n        plotToolBar->show();\r\n        current_view_type = QGraphDoc::VIEW_SCATTER;\r\n        OnFocusGraph(((QPlotView*)p)->pDoc, QGraphDoc::CONTROLS_LOADALL);\r\n        RedoPlotViewMenu(((QPlotView*)p)->pDoc);\r\n\r\n        if(((QPlotView*)p)->m_view_monochrome) toggleColor->setChecked(true);\r\n        else toggleColor->setChecked(false);\r\n        if(((QPlotView*)p)->m_view_origin) toggleOrg->setChecked(true);\r\n        else toggleOrg->setChecked(false);\r\n        if(((QPlotView*)p)->m_view_trend_line) viewTrend->setChecked(true);\r\n        else viewTrend->setChecked(false);\r\n        if(((QPlotView*)p)->m_view_equation) yx->setChecked(true);\r\n        else yx->setChecked(false);\r\n        if(((QPlotView*)p)->m_view_rsquared) Rtwo->setChecked(true);\r\n        else Rtwo->setChecked(false);\r\n    }\r\n    else if(qobject_cast<TableView *>(activeSubWindow->widget()))\r\n    {\r\n        editToolBar->hide();\r\n        thirdViewToolBar->hide();\r\n        plotToolBar->hide();\r\n        current_view_type = QGraphDoc::VIEW_TABLE;\r\n        QGraphDoc* m_p = activeMapDoc();\r\n        OnFocusGraph(m_p, QGraphDoc::CONTROLS_LOADALL);\r\n        m_p->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_FOCUS );\r\n        return;\r\n    }\r\n    else if((p = qobject_cast<Q3DView *>(activeSubWindow->widget())))\r\n    {\r\n        editToolBar->hide();\r\n        plotToolBar->hide();\r\n        thirdViewToolBar->show();\r\n        QGraphDoc* pDoc = activeMapDoc();\r\n        Q3DView *ptr = (Q3DView *)p;\r\n\r\n        if(ptr->m_animating) toolsAgentsPlayAct->setChecked(true);\r\n        else toolsAgentsPlayAct->setChecked(0);\r\n        if(!ptr->m_animating) toolsAgentsPauseAct->setChecked(true);\r\n        else toolsAgentsPauseAct->setChecked(0);\r\n\r\n        if(ptr->m_mouse_mode == ID_3D_PAN) thirdPanAct->setChecked(true);\r\n        else thirdPanAct->setChecked(0);\r\n        if(ptr->m_mouse_mode == ID_3D_ROT) thirdRotAct->setChecked(true);\r\n        else thirdRotAct->setChecked(0);\r\n        if(ptr->m_mouse_mode == ID_3D_ZOOM) thirdZoomAct->setChecked(true);\r\n        else thirdZoomAct->setChecked(0);\r\n        if(ptr->m_mouse_mode == ID_3D_PLAY_LOOP) playLoopAct->setChecked(true);\r\n        else playLoopAct->setChecked(0);\r\n        if(ptr->m_fill) thirdFilledAct->setChecked(true);\r\n        else thirdFilledAct->setChecked(0);\r\n\r\n        if (pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessedPoints())\r\n            toolsImportTracesAct->setEnabled(true);\r\n        else\r\n            toolsImportTracesAct->setEnabled(false);\r\n\r\n        if (!pDoc->m_meta_graph || !pDoc->m_meta_graph->viewingProcessedPoints())\r\n        {\r\n            if (ptr->m_mouse_mode == ID_ADD_AGENT) ptr->m_mouse_mode = ID_3D_ROT;\r\n            addAgentAct->setEnabled(false);\r\n        }\r\n        else\r\n        {\r\n            addAgentAct->setEnabled(true);\r\n            if (ptr->m_mouse_mode == ID_ADD_AGENT) addAgentAct->setChecked(1);\r\n            else addAgentAct->setChecked(0);\r\n        }\r\n\r\n        if (ptr->m_mannequins.size())\r\n        {\r\n            toolsAgentsPlayAct->setEnabled(true);\r\n            toolsAgentsPauseAct->setEnabled(true);\r\n            toolsAgentsStopAct->setEnabled(true);\r\n\r\n            if (((Q3DView *)p)->m_animating) toolsAgentsPlayAct->setChecked(true);\r\n            else toolsAgentsPlayAct->setChecked(false);\r\n        }\r\n        else\r\n        {\r\n            toolsAgentsPlayAct->setChecked(false);\r\n            toolsAgentsPlayAct->setEnabled(false);\r\n            toolsAgentsPauseAct->setEnabled(false);\r\n            toolsAgentsStopAct->setEnabled(false);\r\n        }\r\n\r\n        if (ptr->m_mannequins.size()) {\r\n            toolsAgentsPauseAct->setEnabled(true);\r\n            if (!ptr->m_animating) {\r\n                toolsAgentsPauseAct->setChecked(true);\r\n            }\r\n            else {\r\n                toolsAgentsPauseAct->setChecked(false);\r\n            }\r\n        }\r\n        else {\r\n            toolsAgentsPauseAct->setChecked(false);\r\n            toolsAgentsPauseAct->setEnabled(false);\r\n        }\r\n\r\n        if (ptr->m_mannequins.size()) {\r\n            toolsAgentsStopAct->setEnabled(true);\r\n        }\r\n        else {\r\n            toolsAgentsStopAct->setEnabled(false);\r\n        }\r\n\r\n        if (ptr->m_drawtrails) {\r\n            agentTrailsAct->setChecked(1);\r\n        }\r\n        else {\r\n            agentTrailsAct->setChecked(0);\r\n        }\r\n\r\n        if (ptr->m_fill) {\r\n            thirdFilledAct->setChecked(1);\r\n        }\r\n        else {\r\n            thirdFilledAct->setChecked(0);\r\n        }\r\n        current_view_type = QGraphDoc::VIEW_3D;\r\n        return;\r\n    }\r\n    else if((p = qobject_cast<MapView *>(activeSubWindow->widget())))\r\n    {\r\n        editToolBar->show();\r\n        thirdViewToolBar->hide();\r\n        plotToolBar->hide();\r\n        current_view_type = QGraphDoc::VIEW_MAP;\r\n        QWidget* v = qobject_cast<MapView *>(activeSubWindow->widget());\r\n        if(v) current_view_type = QGraphDoc::VIEW_MAP_GL;\r\n        switch(m_selected_mapbar_item)\r\n        {\r\n        case ID_MAPBAR_ITEM_SELECT:\r\n            SelectButton->setChecked(true);\r\n            activeMapView()->OnEditSelect();\r\n            break;\r\n        case ID_MAPBAR_ITEM_MOVE:\r\n            DragButton->setChecked(true);\r\n            activeMapView()->OnViewPan();\r\n            break;\r\n        case ID_MAPBAR_ITEM_ZOOM_IN:\r\n            zoomToolButton->setIcon(QIcon(\":/images/win/b-5-3.png\"));\r\n            zoomToolButton->setChecked(true);\r\n            zoomInAct->setChecked(true);\r\n            activeMapView()->OnViewZoomIn();\r\n            break;\r\n        case ID_MAPBAR_ITEM_ZOOM_OUT:\r\n            zoomToolButton->setIcon(QIcon(\":/images/win/b-5-4.png\"));\r\n            zoomToolButton->setChecked(true);\r\n            zoomOutAct->setChecked(true);\r\n            activeMapView()->OnViewZoomOut();\r\n            break;\r\n        case ID_MAPBAR_ITEM_FILL:\r\n            fillColorToolButton->setChecked(true);\r\n            activeMapView()->OnEditFill();\r\n            break;\r\n        case ID_MAPBAR_ITEM_SEMIFILL:\r\n            fillColorToolButton->setChecked(true);\r\n            activeMapView()->OnEditSemiFill();\r\n            break;\r\n        case ID_MAPBAR_ITEM_AUGMENT_FILL: // AV TV\r\n            fillColorToolButton->setChecked(true);\r\n            activeMapView()->OnEditAugmentFill();\r\n            break;\r\n        case ID_MAPBAR_ITEM_PENCIL:\r\n            SelectPenButton->setChecked(true);\r\n            activeMapView()->OnEditPencil();\r\n            break;\r\n        case ID_MAPBAR_ITEM_LINETOOL:\r\n            lineToolButton->setIcon(QIcon(\":/images/win/b-5-10.png\"));\r\n            lineToolButton->setChecked(true);\r\n            SelectLineAct->setChecked(true);\r\n            activeMapView()->OnEditLineTool();\r\n            break;\r\n        case ID_MAPBAR_ITEM_POLYGON:\r\n            lineToolButton->setIcon(QIcon(\":/images/win/b-5-11.png\"));\r\n            lineToolButton->setChecked(true);\r\n            SelectPolyLineAct->setChecked(true);\r\n            activeMapView()->OnEditPolygonTool();\r\n            break;\r\n        case ID_MAPBAR_ITEM_ISOVIST:\r\n            newisoToolButton->setIcon(QIcon(\":/images/win/b-5-12.png\"));\r\n            newisoToolButton->setChecked(true);\r\n            MakeIosAct->setChecked(true);\r\n            activeMapView()->OnModeIsovist();\r\n            break;\r\n        case ID_MAPBAR_ITEM_HALFISOVIST:\r\n            newisoToolButton->setIcon(QIcon(\":/images/win/b-5-13.png\"));\r\n            newisoToolButton->setChecked(true);\r\n            PartialMakeIosAct->setChecked(true);\r\n            activeMapView()->OnModeTargetedIsovist();\r\n            break;\r\n        case ID_MAPBAR_ITEM_AL2:\r\n            AxialMapButton->setChecked(true);\r\n            activeMapView()->OnModeSeedAxial();\r\n            break;\r\n        case ID_MAPBAR_ITEM_JOIN:\r\n            JoinToolButton->setIcon(QIcon(\":/images/win/b-5-16.png\"));\r\n            JoinToolButton->setChecked(true);\r\n            JoinAct->setChecked(true);\r\n            activeMapView()->OnModeJoin();\r\n            break;\r\n        case ID_MAPBAR_ITEM_UNJOIN:\r\n            JoinToolButton->setIcon(QIcon(\":/images/win/b-5-17.png\"));\r\n            JoinToolButton->setChecked(true);\r\n            JoinUnlinkAct->setChecked(true);\r\n            activeMapView()->OnModeUnjoin();\r\n            break;\r\n        default:\r\n            SelectButton->setChecked(true);\r\n            SelectButton->setChecked(false);\r\n            activeMapView()->OnEditSelect();\r\n            break;\r\n        }\r\n        QGraphDoc* m_p = activeMapDoc();\r\n        OnFocusGraph(m_p, QGraphDoc::CONTROLS_LOADALL);\r\n        m_p->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_FOCUS );\r\n    }\r\n}\r\n\r\nvoid MainWindow::updateGLWindows(bool datasetChanged, bool recentreView) {\r\n    QList<QMdiSubWindow *> windows = mdiArea->subWindowList();\r\n    for (int i = 0; i < windows.size(); ++i) {\r\n        GLView *child = qobject_cast<GLView*>(windows.at(i)->widget());\r\n        if(!child) continue;\r\n        if(datasetChanged) child->notifyDatasetChanged();\r\n        if(recentreView) child->matchViewToCurrentMetaGraph();\r\n    }\r\n}\r\n\r\nvoid MainWindow::setActiveSubWindow(QWidget *win)\r\n{\r\n    if (!win) return;\r\n    foreach (QMdiSubWindow *window, mdiArea->subWindowList())\r\n    {\r\n        if(window->widget() == win)\r\n        {\r\n            mdiArea->setActiveSubWindow(window);\r\n            return;\r\n        }\r\n    }\r\n    QString t = QString(TITLE_BASE);\r\n    setWindowTitle(t+\" \"+windowTitle());\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////////\r\nstatic bool in_FocusGraph;\r\nint MainWindow::OnFocusGraph(QGraphDoc* pDoc, int lParam)\r\n{\r\n    in_FocusGraph = true;\r\n    updateToolbar();\r\n    x_coord->clear();\r\n    y_coord->clear();\r\n\r\n    // Replacement for m_linelayer_chooser is my tree ctrl:\r\n    if (lParam == QGraphDoc::CONTROLS_DESTROYALL && pDoc == m_treeDoc) {        // Lost graph\r\n        delete pDoc;\r\n        m_treeDoc = NULL;\r\n        m_topgraph = NULL;\r\n        m_backgraph = NULL;\r\n        m_attrWindow->clear();\r\n        m_indexWidget->clear();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_LOADALL && pDoc != m_treeDoc) {     // [Possible] change of window (sent on focus)\r\n        m_treeDoc = pDoc;\r\n        m_topgraph = NULL;\r\n        m_backgraph = NULL;\r\n        MakeTree();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_LOADGRAPH && pDoc == m_treeDoc) {     // Force update if match current window\r\n        m_topgraph = NULL;\r\n        m_backgraph = NULL;\r\n        m_attrWindow->clear();\r\n        m_indexWidget->clear();\r\n        ClearGraphTree();\r\n        MakeGraphTree();\r\n        // also make drawing tree as this overrides layer visible status sometimes:\r\n        MakeDrawingTree();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_RELOADGRAPH && pDoc == m_treeDoc) {     // Force reload of graph tree if match current window\r\n        m_topgraph = NULL;\r\n        m_backgraph = NULL;\r\n        m_attrWindow->clear();\r\n        m_indexWidget->clear();\r\n        ClearGraphTree();\r\n        MakeTree();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_LOADDRAWING && pDoc == m_treeDoc) {     // Force update if match current window\r\n        m_backgraph = NULL;\r\n        m_attrWindow->clear();\r\n        m_indexWidget->clear();\r\n        ClearGraphTree();\r\n        MakeGraphTree();\r\n        MakeDrawingTree();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_LOADATTRIBUTES && pDoc == m_treeDoc) {     // Force update if match current window\r\n        MakeAttributeList();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_CHANGEATTRIBUTE && pDoc == m_treeDoc) {     // Force update if match current window\r\n        SetAttributeChecks();\r\n    }\r\n    else if (lParam == QGraphDoc::CONTROLS_LOADCONVERT && pDoc == m_treeDoc) {\r\n        m_topgraph = NULL;\r\n        m_backgraph = NULL;\r\n        m_attrWindow->clear();\r\n        m_indexWidget->clear();\r\n        ClearGraphTree();\r\n        MakeGraphTree();\r\n        // conversions typically turn off drawing layers:\r\n        SetDrawingTreeChecks();\r\n    }\r\n    if (m_treeDoc == NULL) {\r\n//\t\ttree.EnableWindow(FALSE);\r\n        // Stop some strange auto scroll property:\r\n//\t\tSetTreeStyle(TVS_NOSCROLL, TRUE);\r\n    }\r\n    else {\r\n//\t\ttree.EnableWindow(TRUE);\r\n        // Stop some strange auto scroll property:\r\n//\t\tSetTreeStyle(TVS_NOSCROLL, FALSE);\r\n    }\r\n\r\n    m_wndColourScale.OnFocusGraph(pDoc, lParam);\r\n\r\n    in_FocusGraph = false;\r\n    return 0;\r\n}\r\n\r\nvoid MainWindow::MakeTree()\r\n{\r\n    m_indexWidget->clear();\r\n    m_treegraphmap.clear();\r\n    m_treedrawingmap.clear();\r\n\r\n    for (int i = 0; i < 5; i++) m_treeroots[i] = NULL;\r\n\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n    if (!graph) return;\r\n\r\n    int state = graph->getState();\r\n    int viewclass = graph->getViewClass();\r\n\r\n    MakeGraphTree();\r\n    MakeDrawingTree();\r\n}\r\n\r\nvoid MainWindow::OnSelchangingList()\r\n{\r\n    if(in_FocusGraph) return;\r\n\r\n    int row = -1;\r\n    row = m_attrWindow->currentRow();\r\n    if(row > -1 && m_treeDoc){\r\n      MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n      if (graph->viewingProcessed()) {\r\n         graph->setDisplayedAttribute(row - 1);\r\n      }\r\n      m_treeDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_FOCUS );\r\n      SetAttributeChecks();\r\n      OnFocusGraph(m_treeDoc, QGraphDoc::CONTROLS_CHANGEATTRIBUTE); // Bug Test TV\r\n   }\r\n\r\n   // this *does* work here (but only if they click on a valid attribute):\r\n}\r\n\r\nvoid MainWindow::OnSelchangingTree(QTreeWidgetItem* hItem, int col)\r\n{\r\n    if(in_FocusGraph) return;\r\n\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n    bool update = false;\r\n\r\n    // look it up in the table to see what to do:\r\n    auto iter = m_treegraphmap.find(hItem);\r\n    if (iter != m_treegraphmap.end()) {\r\n        ItemTreeEntry entry = iter->second;\r\n        bool remenu = false;\r\n        if (entry.m_cat != -1) {\r\n            if (entry.m_subcat == -1 && m_indexWidget->isMapColumn(col)) {\r\n                switch (entry.m_type) {\r\n                case 0:\r\n                    if (graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                        if (graph->getDisplayedPointMapRef() == entry.m_cat) {\r\n                            graph->setViewClass(MetaGraph::SHOWHIDEVGA);\r\n                        }\r\n                        else {\r\n                            graph->setDisplayedPointMapRef(entry.m_cat);\r\n                        }\r\n                    }\r\n                    else {\r\n                        graph->setDisplayedPointMapRef(entry.m_cat);\r\n                        graph->setViewClass(MetaGraph::SHOWVGATOP);\r\n                    }\r\n                    remenu = true;\r\n                    break;\r\n                case 1:\r\n                   if (graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                      if (graph->getDisplayedShapeGraphRef() == entry.m_cat) {\r\n                         graph->setViewClass(MetaGraph::SHOWHIDEAXIAL);\r\n                      }\r\n                      else {\r\n                         graph->setDisplayedShapeGraphRef(entry.m_cat);\r\n                      }\r\n                   }\r\n                   else {\r\n                      graph->setDisplayedShapeGraphRef(entry.m_cat);\r\n                      graph->setViewClass(MetaGraph::SHOWAXIALTOP);\r\n                   }\r\n                    remenu = true;\r\n                    break;\r\n                case 2:\r\n                   if (graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n                      if (graph->getDisplayedDataMapRef() == entry.m_cat) {\r\n                         graph->setViewClass(MetaGraph::SHOWHIDESHAPE);\r\n                      }\r\n                      else {\r\n                         graph->setDisplayedDataMapRef(entry.m_cat);\r\n                      }\r\n                   }\r\n                   else {\r\n                      graph->setDisplayedDataMapRef(entry.m_cat);\r\n                      graph->setViewClass(MetaGraph::SHOWSHAPETOP);\r\n                   }\r\n                    remenu = true;\r\n                    break;\r\n                case 4:\r\n                    // slightly different for this one\r\n                    break;\r\n                }\r\n                if (remenu) {\r\n                    SetGraphTreeChecks();\r\n                    m_treeDoc->SetRemenuFlag(QGraphDoc::VIEW_ALL, true);\r\n                    OnFocusGraph(m_treeDoc, QGraphDoc::CONTROLS_CHANGEATTRIBUTE);\r\n                }\r\n                m_treeDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_TABLE );\r\n            }\r\n            else if (entry.m_subcat == -1 && m_indexWidget->isEditableColumn(col)) {\r\n                // hit editable box\r\n                if (entry.m_type == 1) {\r\n                    int type = graph->getShapeGraphs()[entry.m_cat]->getMapType();\r\n                    if (type != ShapeMap::SEGMENTMAP && type != ShapeMap::ALLLINEMAP) {\r\n                        graph->getShapeGraphs()[entry.m_cat]->setEditable(m_indexWidget->isItemSetEditable(hItem));\r\n                        update = true;\r\n                    }\r\n                }\r\n                if (entry.m_type == 2) {\r\n                    graph->getDataMaps()[entry.m_cat].setEditable(m_indexWidget->isItemSetEditable(hItem));\r\n                    update = true;\r\n                }\r\n                if (update) {\r\n                    // Depending on if the map is displayed you may have to redraw -- I'm just going to redraw *anyway*\r\n                    // (it may be worth switching it to topmost when they do click here)\r\n                    OnFocusGraph(m_treeDoc, QGraphDoc::CONTROLS_CHANGEATTRIBUTE);\r\n                }\r\n            }\r\n            else {\r\n                // They've clicked on the displayed layers\r\n                if (entry.m_type == 1) {\r\n                   update = true;\r\n                   graph->getShapeGraphs()[entry.m_cat]->setLayerVisible(entry.m_subcat, m_indexWidget->isItemSetVisible(hItem));\r\n                }\r\n                else if (entry.m_type == 2) {\r\n                   update = true;\r\n                   graph->getDataMaps()[entry.m_cat].setLayerVisible(entry.m_subcat, m_indexWidget->isItemSetVisible(hItem));\r\n                }\r\n                if (update) {\r\n                    m_treeDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_TABLE );\r\n                    OnFocusGraph(m_treeDoc, QGraphDoc::CONTROLS_CHANGEATTRIBUTE);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        auto iter = m_treedrawingmap.find(hItem);\r\n        if (iter != m_treedrawingmap.end()) {\r\n            ItemTreeEntry entry = iter->second;\r\n            if (entry.m_subcat != -1) {\r\n                if (graph->getLineLayer(entry.m_cat,entry.m_subcat).isShown()) {\r\n                    graph->getLineLayer(entry.m_cat,entry.m_subcat).setShow(false);\r\n                    graph->redoPointMapBlockLines();\r\n                    graph->resetBSPtree();\r\n                }\r\n                else {\r\n                    graph->getLineLayer(entry.m_cat,entry.m_subcat).setShow(true);\r\n                    graph->redoPointMapBlockLines();\r\n                    graph->resetBSPtree();\r\n                }\r\n            }\r\n            m_treeDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_LINESET );\r\n        }\r\n    }\r\n}\r\n\r\nvoid MainWindow::SetGraphTreeChecks()\r\n{\r\n    in_FocusGraph = true;\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n    int viewclass = graph->getViewClass();\r\n    for (auto item: m_treegraphmap) {\r\n        QTreeWidgetItem* key = item.first;\r\n        ItemTreeEntry entry = item.second;\r\n        int checkstyle = 7;\r\n        if (entry.m_cat != -1) {\r\n            if (entry.m_subcat == -1) {\r\n                // this is the main type box hit\r\n                switch (entry.m_type) {\r\n                    case 0:\r\n                        if (viewclass & MetaGraph::VIEWVGA && graph->getDisplayedPointMapRef() == entry.m_cat) {\r\n                            checkstyle = 5;\r\n                            m_topgraph = key;\r\n                        }\r\n                        else if (viewclass & MetaGraph::VIEWBACKVGA && graph->getDisplayedPointMapRef() == entry.m_cat) {\r\n                            checkstyle = 6;\r\n                            m_backgraph = key;\r\n                        }\r\n                        break;\r\n                    case 1:\r\n                        if (viewclass & MetaGraph::VIEWAXIAL && graph->getDisplayedShapeGraphRef() == entry.m_cat) {\r\n                            checkstyle = 5;\r\n                            m_topgraph = key;\r\n                        }\r\n                        else if (viewclass & MetaGraph::VIEWBACKAXIAL && graph->getDisplayedShapeGraphRef() == entry.m_cat) {\r\n                            checkstyle = 6;\r\n                            m_backgraph = key;\r\n                        }\r\n                        break;\r\n                    case 2:\r\n                        if (viewclass & MetaGraph::VIEWDATA && graph->getDisplayedDataMapRef() == entry.m_cat) {\r\n                            checkstyle = 5;\r\n                            m_topgraph = key;\r\n                        }\r\n                        else if (viewclass & MetaGraph::VIEWBACKDATA && graph->getDisplayedDataMapRef() == entry.m_cat) {\r\n                            checkstyle = 6;\r\n                            m_backgraph = key;\r\n                        }\r\n                        break;\r\n                }\r\n\r\n                if(checkstyle == 5)\r\n                    m_indexWidget->setItemVisibility(key, Qt::Checked);\r\n                else if(checkstyle == 6)\r\n                    m_indexWidget->setItemVisibility(key, Qt::PartiallyChecked);\r\n                else if(checkstyle == 7)\r\n                    m_indexWidget->setItemVisibility(key, Qt::Unchecked);\r\n\r\n                // the editable box\r\n                int editable = MetaGraph::NOT_EDITABLE;\r\n                switch (entry.m_type) {\r\n                    case 0:\r\n                        if (graph->getPointMaps()[entry.m_cat].isProcessed()) {\r\n                            editable = MetaGraph::NOT_EDITABLE;\r\n                        }\r\n                        else {\r\n                            editable = MetaGraph::EDITABLE_ON;\r\n                        }\r\n                        break;\r\n                    case 1:\r\n                        {\r\n                            int type = graph->getShapeGraphs()[entry.m_cat]->getMapType();\r\n                            if (type == ShapeMap::SEGMENTMAP || type == ShapeMap::ALLLINEMAP) {\r\n                                editable = MetaGraph::NOT_EDITABLE;\r\n                            }\r\n                            else {\r\n                                editable = graph->getShapeGraphs()[entry.m_cat]->isEditable() ? MetaGraph::EDITABLE_ON : MetaGraph::EDITABLE_OFF;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case 2:\r\n                        editable = graph->getDataMaps()[entry.m_cat].isEditable() ? MetaGraph::EDITABLE_ON : MetaGraph::EDITABLE_OFF;\r\n                        break;\r\n                }\r\n                switch (editable) {\r\n                    case MetaGraph::NOT_EDITABLE:\r\n                        m_indexWidget->setItemReadOnly(key);\r\n                        break;\r\n                    case MetaGraph::EDITABLE_OFF:\r\n                        m_indexWidget->setItemEditability(key, Qt::Unchecked);\r\n                        break;\r\n                    case MetaGraph::EDITABLE_ON:\r\n                        m_indexWidget->setItemEditability(key, Qt::Checked);\r\n                    break;\r\n                }\r\n            }\r\n            else {\r\n                // the displayed layers (note that VGA graphs (type 0)\r\n                // do not currently have layers supported\r\n                bool show = false;\r\n                if (entry.m_type == 1) {\r\n                    show = graph->getShapeGraphs()[entry.m_cat]->isLayerVisible(entry.m_subcat);\r\n                }\r\n                else if (entry.m_type == 2) {\r\n                    show = graph->getDataMaps()[entry.m_cat].isLayerVisible(entry.m_subcat);\r\n                }\r\n                if (show) {\r\n                      m_indexWidget->setItemVisibility(key, Qt::Checked);\r\n                }\r\n                else {\r\n                      m_indexWidget->setItemVisibility(key, Qt::Unchecked);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    MakeAttributeList();\r\n    in_FocusGraph = false;\r\n}\r\n\r\nvoid MainWindow::SetDrawingTreeChecks()\r\n{\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n    int viewclass = graph->getViewClass();\r\n    for (auto iter: m_treedrawingmap) {\r\n        ItemTreeEntry entry = iter.second;\r\n        if (entry.m_subcat != -1) {\r\n            if (graph->getLineLayer(entry.m_cat,entry.m_subcat).isShown()) {\r\n                  iter.first->setIcon(0, m_tree_icon[12]);\r\n            }\r\n            else {\r\n                  iter.first->setIcon(0, m_tree_icon[13]);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// clear the graph tree (not the drawing tree) but also clear the attribute list\r\n\r\nvoid MainWindow::ClearGraphTree()\r\n{\r\n    m_attribute_locked.clear();\r\n\r\n    for (int i = 2; i >= 0; i--) {\r\n        if (m_treeroots[i]) {\r\n            m_treeroots[i] = NULL;\r\n        }\r\n    }\r\n    m_treegraphmap.clear();\r\n}\r\n\r\nvoid MainWindow::MakeGraphTree()\r\n{\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n\r\n    int state = graph->getState();\r\n\r\n    if (state & MetaGraph::POINTMAPS) {\r\n        if (!m_treeroots[0]) {\r\n            QTreeWidgetItem* hItem = m_indexWidget->addNewItem(tr(\"Visibility Graphs\"));\r\n            hItem->setIcon(0, m_tree_icon[0]);\r\n            ItemTreeEntry entry(0,-1,-1);\r\n            m_treegraphmap[hItem] = entry;\r\n            m_treeroots[0] = hItem;\r\n        }\r\n        int i = 0;\r\n        for (auto& pointmap: m_treeDoc->m_meta_graph->getPointMaps()) {\r\n            QString name = QString(pointmap.getName().c_str());\r\n            QTreeWidgetItem* hItem = m_indexWidget->addNewItem(name, m_treeroots[0]);\r\n            m_indexWidget->setItemVisibility(hItem, Qt::Unchecked);\r\n            m_indexWidget->setItemEditability(hItem, Qt::Unchecked);\r\n            ItemTreeEntry entry(0,(short)i,-1);\r\n            m_treegraphmap.insert(std::make_pair(hItem,entry));\r\n            i++;\r\n        }\r\n    }\r\n    else if (m_treeroots[0]) {\r\n        m_treeroots[0]->removeChild(m_treeroots[0]);\r\n        auto iter = m_treegraphmap.find(m_treeroots[0]);\r\n        if(iter != m_treegraphmap.end()) {\r\n            m_treegraphmap.erase(iter);\r\n        }\r\n        m_treeroots[0] = NULL;\r\n    }\r\n\r\n    if (state & MetaGraph::SHAPEGRAPHS) {\r\n        if (!m_treeroots[1]) {\r\n            QTreeWidgetItem* hItem = m_indexWidget->addNewItem(tr(\"Shape Graphs\"));\r\n            hItem->setIcon(0, m_tree_icon[1]);\r\n            ItemTreeEntry entry(1,-1,-1);\r\n            m_treegraphmap[hItem] = entry;\r\n            m_treeroots[1] = hItem;\r\n        }\r\n        for (size_t i = 0; i < m_treeDoc->m_meta_graph->getShapeGraphs().size(); i++) {\r\n            QString name = QString(m_treeDoc->m_meta_graph->getShapeGraphs()[i]->getName().c_str());\r\n            QTreeWidgetItem* hItem = m_indexWidget->addNewItem(name, m_treeroots[1]);\r\n            m_indexWidget->setItemVisibility(hItem, Qt::Unchecked);\r\n            m_indexWidget->setItemEditability(hItem, Qt::Unchecked);\r\n            ItemTreeEntry entry(1,(short)i,-1);\r\n            m_treegraphmap.insert(std::make_pair(hItem,entry));\r\n            LayerManagerImpl& layers = m_treeDoc->m_meta_graph->getShapeGraphs()[i]->getLayers();\r\n            if(layers.getNumLayers() > 1) {\r\n                for (int j = 0; j < layers.getNumLayers(); j++) {\r\n                    QString name = QString(layers.getLayerName(j).c_str());\r\n                    QTreeWidgetItem* hNewItem = m_indexWidget->addNewItem(name, hItem);\r\n                    ItemTreeEntry entry(1,(short)i,j);\r\n                    m_treegraphmap[hNewItem] = entry;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if (m_treeroots[1]) {\r\n        m_treeroots[1]->removeChild(m_treeroots[1]);\r\n        auto iter = m_treegraphmap.find(m_treeroots[1]);\r\n        if(iter != m_treegraphmap.end()) {\r\n            m_treegraphmap.erase(iter);\r\n        }\r\n        m_treeroots[1] = NULL;\r\n    }\r\n\r\n    if (state & MetaGraph::DATAMAPS) {\r\n        if (!m_treeroots[2]) {\r\n            QTreeWidgetItem* hItem = m_indexWidget->addNewItem(tr(\"Data Maps\"));\r\n            hItem->setIcon(0, m_tree_icon[2]);\r\n            ItemTreeEntry entry(2,-1,-1);\r\n            m_treegraphmap[hItem] = entry;\r\n            m_treeroots[2] = hItem;\r\n        }\r\n        for (size_t i = 0; i < m_treeDoc->m_meta_graph->getDataMaps().size(); i++) {\r\n            QString name = QString(m_treeDoc->m_meta_graph->getDataMaps()[i].getName().c_str());\r\n            QTreeWidgetItem* hItem = m_indexWidget->addNewItem(name, m_treeroots[2]);\r\n            m_indexWidget->setItemVisibility(hItem, Qt::Unchecked);\r\n            m_indexWidget->setItemEditability(hItem, Qt::Unchecked);\r\n            ItemTreeEntry entry(2,(short)i,-1);\r\n            m_treegraphmap[hItem] = entry;\r\n\r\n            LayerManagerImpl layers = m_treeDoc->m_meta_graph->getDataMaps()[i].getLayers();\r\n            if(layers.getNumLayers() > 1) {\r\n                for (int j = 0; j < layers.getNumLayers(); j++) {\r\n                    QString name = QString(layers.getLayerName(j).c_str());\r\n                    QTreeWidgetItem* hNewItem = m_indexWidget->addNewItem(name, hItem);\r\n                    m_indexWidget->setItemVisibility(hNewItem, Qt::Unchecked);\r\n                    ItemTreeEntry entry(2,(short)i,j);\r\n                    m_treegraphmap.insert(std::make_pair(hNewItem,entry));\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if (m_treeroots[2]) {\r\n        m_treeroots[2]->removeChild(m_treeroots[2]);\r\n        auto iter = m_treegraphmap.find(m_treeroots[2]);\r\n        if(iter != m_treegraphmap.end()) {\r\n            m_treegraphmap.erase(iter);\r\n        }\r\n        m_treeroots[2] = NULL;\r\n    }\r\n\r\n    SetGraphTreeChecks();\r\n}\r\n\r\nvoid MainWindow::MakeDrawingTree()\r\n{\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n\r\n    int state = graph->getState();\r\n\r\n    if (state & MetaGraph::LINEDATA) {\r\n        if (m_treeroots[4]) {\r\n            m_treeroots[4] = NULL;\r\n            m_treedrawingmap.clear();\r\n        }\r\n        // we'll do all of these if it works...\r\n        QTreeWidgetItem* root = m_indexWidget->addNewItem(tr(\"Drawing Layers\"));\r\n        root->setIcon(0, m_tree_icon[4]);\r\n        ItemTreeEntry entry(4,0,-1);\r\n        m_treedrawingmap.insert(std::make_pair(root,entry));\r\n        m_treeroots[4] = root;\r\n        for (int i = 0; i < m_treeDoc->m_meta_graph->getLineFileCount(); i++) {\r\n\r\n            QTreeWidgetItem* subroot = m_indexWidget->addNewItem(QString(m_treeDoc->m_meta_graph->getLineFileName(i).c_str()), m_treeroots[4]);\r\n            subroot->setIcon(0, m_tree_icon[8]);\r\n            ItemTreeEntry entry(4,i,-1);\r\n            m_treedrawingmap.insert(std::make_pair(subroot,entry));\r\n\r\n            for (int j = 0; j < m_treeDoc->m_meta_graph->getLineLayerCount(i); j++) {\r\n                QString name(m_treeDoc->m_meta_graph->getLineLayer(i,j).getName().c_str());\r\n                QTreeWidgetItem* hItem = m_indexWidget->addNewItem(name, subroot);\r\n                if (m_treeDoc->m_meta_graph->getLineLayer(i,j).isShown()) {\r\n                    m_indexWidget->setItemVisibility(hItem, Qt::Checked);\r\n                }\r\n                else {\r\n                    m_indexWidget->setItemVisibility(hItem, Qt::Unchecked);\r\n                }\r\n                ItemTreeEntry entry(4,i,j);\r\n                m_treedrawingmap.insert(std::make_pair(hItem,entry));\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid MainWindow::MakeAttributeList()\r\n{\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n    if (graph == NULL) {\r\n        return;\r\n    }\r\n    auto lock = graph->getLockDeferred();\r\n    if (lock.try_lock()) {\r\n\r\n        // just doing this the simple way to start off with\r\n        // (when you add new attributes, list is cleared and re\r\n        m_attribute_locked.clear();\r\n        m_attrWindow->clear();\r\n\r\n        int cx = 0;\r\n        QString name;\r\n        if (graph->viewingProcessed()) {\r\n            const AttributeTable& table = graph->getAttributeTable();\r\n            m_attrWindow->addItem(tr(\"Ref Number\"));\r\n            m_attribute_locked.push_back(true);\r\n\r\n            for (int i = 0; i < table.getNumColumns(); i++) {\r\n                name = QString(table.getColumnName(i).c_str());\r\n                    m_attrWindow->addItem(name);\r\n                    m_attribute_locked.push_back(table.getColumn(i).isLocked());\r\n                //}\r\n            }\r\n        }\r\n    }\r\n\r\n    SetAttributeChecks();\r\n}\r\n\r\nvoid MainWindow::SetAttributeChecks()\r\n{\r\n    MetaGraph *graph = m_treeDoc->m_meta_graph;\r\n    if (graph == NULL) return;\r\n\r\n    QListWidgetItem * it;\r\n    if (graph->viewingProcessed()) {\r\n        int image, displayed_attribute = graph->getDisplayedAttribute();\r\n        for (int i = 0; ; i++) {\r\n            it = m_attrWindow->item(i);\r\n            if(!it) break;\r\n            if ((i-1) == displayed_attribute) {\r\n                if (!m_attribute_locked[i]) {\r\n                    image = 9;\r\n                }\r\n                else {\r\n                    image = 17;\r\n                }\r\n            }\r\n            else {\r\n                if (!m_attribute_locked[i]) {\r\n                    image = 10;\r\n                }\r\n                else {\r\n                    image = 18;\r\n                }\r\n            }\r\n            it->setIcon(m_tree_icon[image]);\r\n        }\r\n    }\r\n}\r\n\r\nvoid MainWindow::chooseAttributeOnIndex(int attributeIdx) {\r\n    SetAttributeChecks();\r\n    m_attrWindow->setCurrentRow(attributeIdx);\r\n}\r\n\r\nvoid MainWindow::OninvertColor()\r\n{\r\n    activeMapDoc()->OnSwapColours();\r\n}\r\n\r\nvoid MainWindow::OnzoomTo()\r\n{\r\n    activeMapView()->OnViewZoomsel();\r\n}\r\n\r\nvoid MainWindow::SelectButtonTriggered()\r\n{\r\n    m_selected_mapbar_item = ID_MAPBAR_ITEM_SELECT;\r\n    activeMapView()->OnEditSelect();\r\n}\r\n\r\nvoid MainWindow::DragButtonTriggered()\r\n{\r\n    m_selected_mapbar_item = ID_MAPBAR_ITEM_MOVE;\r\n    activeMapView()->OnViewPan();\r\n}\r\n\r\nvoid MainWindow::SelectPenTriggered()\r\n{\r\n    m_selected_mapbar_item = ID_MAPBAR_ITEM_PENCIL;\r\n    activeMapView()->OnEditPencil();\r\n}\r\n\r\nvoid MainWindow::AxialMapTriggered()\r\n{\r\n    m_selected_mapbar_item = ID_MAPBAR_ITEM_AL2;\r\n    activeMapView()->OnModeSeedAxial();\r\n}\r\n\r\nvoid MainWindow::StepDepthTriggered()\r\n{\r\n    activeMapDoc()->OnToolsPD();\r\n}\r\n\r\nvoid MainWindow::zoomButtonTriggered()\r\n{\r\n    int id = zoomInAct->data().value<int>();\r\n    if(id == ID_MAPBAR_ITEM_ZOOM_IN)\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_ZOOM_IN;\r\n        activeMapView()->OnViewZoomIn();\r\n    }\r\n    else\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_ZOOM_OUT;\r\n        activeMapView()->OnViewZoomOut();\r\n    }\r\n}\r\n\r\nvoid MainWindow::FillButtonTriggered()\r\n{\r\n    int id;// = qVariantValue<int>(STDFillColorAct->data());\r\n    if( qobject_cast<QAction *>(sender()) ) { // Not sure // Hack TV\r\n        QAction* temp = qobject_cast<QAction *>(sender());\r\n        id = temp->data().value<int>();\r\n        delete temp;\r\n    } else {\r\n        id = STDFillColorAct->data().value<int>();\r\n    }\r\n\r\n    if(id == ID_MAPBAR_ITEM_FILL)\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_FILL;\r\n        activeMapView()->OnEditFill();\r\n    }\r\n    else if (id == ID_MAPBAR_ITEM_SEMIFILL)         // AV TV\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_SEMIFILL;\r\n        activeMapView()->OnEditSemiFill();\r\n    }\r\n    else\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_AUGMENT_FILL;\r\n        activeMapView()->OnEditAugmentFill(); // AV TV\r\n    }\r\n}\r\n\r\nvoid MainWindow::LineButtonTriggered()\r\n{\r\n    int id = SelectLineAct->data().value<int>();\r\n    if(id == ID_MAPBAR_ITEM_LINETOOL)\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_LINETOOL;\r\n        activeMapView()->OnEditLineTool();\r\n    }\r\n    else\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_POLYGON;\r\n        activeMapView()->OnEditPolygonTool();\r\n    }\r\n}\r\n\r\nvoid MainWindow::isoButtonTriggered()\r\n{\r\n    int id = MakeIosAct->data().value<int>();\r\n    if(id == ID_MAPBAR_ITEM_ISOVIST)\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_ISOVIST;\r\n        activeMapView()->OnModeIsovist();\r\n    }\r\n    else\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_HALFISOVIST;\r\n        activeMapView()->OnModeTargetedIsovist();\r\n    }\r\n}\r\n\r\nvoid MainWindow::joinButtonTriggered()\r\n{\r\n    int id = JoinAct->data().value<int>();\r\n    if(id == ID_MAPBAR_ITEM_JOIN)\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_JOIN;\r\n        activeMapView()->OnModeJoin();\r\n    }\r\n    else\r\n    {\r\n        m_selected_mapbar_item = ID_MAPBAR_ITEM_UNJOIN;\r\n        activeMapView()->OnModeUnjoin();\r\n    }\r\n}\r\n\r\nvoid MainWindow::zoomModeTriggered()\r\n{\r\n    zoomInAct = qobject_cast<QAction *>(sender());\r\n    if(zoomInAct->data() == ID_MAPBAR_ITEM_ZOOM_IN)\r\n        zoomToolButton->setIcon(QIcon(\":/images/win/b-5-3.png\"));\r\n    else\r\n        zoomToolButton->setIcon(QIcon(\":/images/win/b-5-4.png\"));\r\n\r\n    zoomToolButton->setChecked(1);\r\n    zoomButtonTriggered();\r\n}\r\n\r\nvoid MainWindow::FillModeTriggered()\r\n{\r\n    fillColorToolButton->setChecked(1);\r\n    FillButtonTriggered();\r\n}\r\n\r\nvoid MainWindow::LineModeTriggered()\r\n{\r\n    SelectLineAct = qobject_cast<QAction *>(sender());\r\n    if(SelectLineAct->data() == ID_MAPBAR_ITEM_LINETOOL)\r\n        lineToolButton->setIcon(QIcon(\":/images/win/b-5-10.png\"));\r\n    else\r\n        lineToolButton->setIcon(QIcon(\":/images/win/b-5-11.png\"));\r\n    lineToolButton->setChecked(1);\r\n    LineButtonTriggered();\r\n}\r\n\r\nvoid MainWindow::isoModeTriggered()\r\n{\r\n    MakeIosAct = qobject_cast<QAction *>(sender());\r\n    if(MakeIosAct->data() == ID_MAPBAR_ITEM_ISOVIST)\r\n        newisoToolButton->setIcon(QIcon(\":/images/win/b-5-12.png\"));\r\n    else\r\n        newisoToolButton->setIcon(QIcon(\":/images/win/b-5-13.png\"));\r\n\r\n    newisoToolButton->setChecked(1);\r\n    isoButtonTriggered();\r\n}\r\n\r\nvoid MainWindow::joinTriggered()\r\n{\r\n    JoinAct = qobject_cast<QAction *>(sender());\r\n    if(JoinAct->data() == ID_MAPBAR_ITEM_JOIN)\r\n        JoinToolButton->setIcon(QIcon(\":/images/win/b-5-16.png\"));\r\n    else\r\n        JoinToolButton->setIcon(QIcon(\":/images/win/b-5-17.png\"));\r\n\r\n    JoinToolButton->setChecked(1);\r\n    joinButtonTriggered();\r\n}\r\n\r\nvoid MainWindow::OnFileProperties()\r\n{\r\n   QGraphDoc* gd = activeMapView()->getGraphDoc();\r\n   gd->OnFileProperties();\r\n}\r\n\r\n// PlotView message\r\nvoid MainWindow::OntoggleColor()\r\n{\r\n   QGraphDoc* gd = activeMapDoc();\r\n   if(((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER]))\r\n       ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->OnViewColor();\r\n}\r\n\r\nvoid MainWindow::OntoggleOrg()\r\n{\r\n   QGraphDoc* gd = activeMapDoc();\r\n   if(((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER]))\r\n     ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->OnViewOrigin();\r\n}\r\n\r\nvoid MainWindow::OnviewTrend()\r\n{\r\n   QGraphDoc* gd = activeMapDoc();\r\n   if(((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER]))\r\n      ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->OnViewTrendLine();\r\n}\r\n\r\nvoid MainWindow::OnYX()\r\n{\r\n   QGraphDoc* gd = activeMapDoc();\r\n   if(((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER]))\r\n      ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->OnViewEquation();\r\n}\r\n\r\nvoid MainWindow::OnRtwo()\r\n{\r\n   QGraphDoc* gd = activeMapDoc();\r\n   if(((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER]))\r\n        ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->OnViewRsquared();\r\n}\r\n\r\nvoid MainWindow::OnToolsImportTraces()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnToolsImportTraces();\r\n}\r\n\r\nvoid MainWindow::OnAddAgent()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnAddAgent();\r\n}\r\n\r\nvoid MainWindow::OnToolsAgentsPlay()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnToolsAgentsPlay();\r\n}\r\n\r\nvoid MainWindow::OnToolsAgentsPause()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnToolsAgentsPause();\r\n}\r\n\r\nvoid MainWindow::OnToolsAgentsStop()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnToolsAgentsStop();\r\n    updateActiveWindows();\r\n}\r\n\r\nvoid MainWindow::OnAgentTrails()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnAgentTrails();\r\n}\r\n\r\nvoid MainWindow::On3dRot()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->On3dRot();\r\n}\r\n\r\nvoid MainWindow::On3dPan()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->On3dPan();\r\n}\r\n\r\nvoid MainWindow::On3dZoom()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->On3dZoom();\r\n}\r\n\r\nvoid MainWindow::OnPlayLoop()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->OnPlayLoop();\r\n}\r\n\r\nvoid MainWindow::On3dFilled()\r\n{\r\n    QGraphDoc* gd = activeMapDoc();\r\n    if(((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D]))\r\n        ((Q3DView*)gd->m_view[QGraphDoc::VIEW_3D])->On3dFilled();\r\n}\r\n\r\n///////////////////////////////////////\r\nvoid MainWindow::createStatusBar()\r\n{\r\n    statusBar()->showMessage(tr(\"Ready\"));\r\n    g_info_curr = new QLabel;\r\n    g_info_curr->setText(\"      \");\r\n    statusBar()->addPermanentWidget(g_info_curr);\r\n    g_size = new QLabel;\r\n    g_size->setText(\"      \");\r\n    statusBar()->addPermanentWidget(g_size);\r\n    g_pos_curr = new QLabel;\r\n    g_pos_curr->setText(\"      \");\r\n    statusBar()->addPermanentWidget(g_pos_curr);\r\n}\r\n\r\nvoid MainWindow::readSettings()\r\n{\r\n    auto settings = mSettings.getTransaction();\r\n    QPoint pos = settings->readSetting(SettingTag::position, QPoint(200, 200)).toPoint();\r\n    QSize size = settings->readSetting(SettingTag::size, QSize(400, 400)).toSize();\r\n    m_foreground = settings->readSetting(SettingTag::foregroundColour, qRgb(128,255,128)).toInt();\r\n    m_background = settings->readSetting(SettingTag::backgroundColour, qRgb(0,0,0)).toInt();\r\n    m_simpleVersion = settings->readSetting(SettingTag::simpleVersion, true).toBool();\r\n    m_defaultMapWindowIsLegacy = settings->readSetting(SettingTag::legacyMapWindow, false).toBool();\r\n    if (settings->readSetting(SettingTag::mwMaximised, true).toBool())\r\n    {\r\n         setWindowState(Qt::WindowMaximized);\r\n    }\r\n    else{\r\n        move(pos);\r\n        resize(size);\r\n    }\r\n}\r\n\r\nvoid MainWindow::writeSettings()\r\n{\r\n    auto settings = mSettings.getTransaction();\r\n    settings->writeSetting(SettingTag::position, pos());\r\n    settings->writeSetting(SettingTag::size, size());\r\n    settings->writeSetting(SettingTag::mwMaximised, windowState() == Qt::WindowMaximized);\r\n}\r\n\r\nvoid MainWindow::setCurrentFile(const QString &fileName)\r\n{\r\n\r\n    auto settings = mSettings.getTransaction();\r\n\r\n    QStringList files = settings->readSetting(SettingTag::recentFileList).toStringList();\r\n    files.removeAll(fileName);\r\n    files.prepend(fileName);\r\n    while (files.size() > MaxRecentFiles)\r\n        files.removeLast();\r\n\r\n    settings->writeSetting(SettingTag::recentFileList, files);\r\n\r\n    updateRecentFileActions(files);\r\n}\r\n\r\nvoid MainWindow::updateRecentFileActions(const QStringList &files)\r\n{\r\n    int numRecentFiles = qMin(files.size(), MaxRecentFiles);\r\n\r\n    for (int i = 0; i < numRecentFiles; ++i) {\r\n        QString text = tr(\"&%1 %2\").arg(i + 1).arg(strippedName(files[i]));\r\n        recentFileActs[i]->setText(text);\r\n        recentFileActs[i]->setData(files[i]);\r\n        recentFileActs[i]->setVisible(true);\r\n    }\r\n    for (int j = numRecentFiles; j < MaxRecentFiles; ++j)\r\n        recentFileActs[j]->setVisible(false);\r\n\r\n    separatorAct->setVisible(numRecentFiles > 0);\r\n}\r\n\r\nQString MainWindow::strippedName(const QString &fullFileName)\r\n{\r\n    return QFileInfo(fullFileName).fileName();\r\n}\r\n\r\nvoid MainWindow::openRecentFile()\r\n{\r\n    QAction *action = qobject_cast<QAction *>(sender());\r\n    if (action)\r\n    {\r\n        QMdiSubWindow *existing = findMapView(action->data().toString());\r\n        if (existing) {\r\n            mdiArea->setActiveSubWindow(existing);\r\n            return;\r\n        }\r\n        MapView *child = createMapView();\r\n        QByteArray ba = action->data().toString().toUtf8(); // quick fix for weird chars (russian filename bug report)\r\n        char *file = ba.data(); // quick fix for weird chars (russian filename bug report)\r\n        if(child->getGraphDoc()->OnOpenDocument(file)) // quick fix for weird chars (russian filename bug report)\r\n        {\r\n            child->setCurrentFile(action->data().toString());\r\n            child->postLoadFile();\r\n            setCurrentFile(action->data().toString());\r\n            statusBar()->showMessage(tr(\"File loaded\"), 2000);\r\n            child->show();\r\n            OnFocusGraph(child->getGraphDoc(), QGraphDoc::CONTROLS_LOADALL);\r\n        }\r\n        else child->close();\r\n    }\r\n}\r\n\r\nvoid MainWindow::RedoPlotViewMenu(QGraphDoc* pDoc)\r\n{\r\n   if(!pDoc->m_view[QGraphDoc::VIEW_SCATTER]) return;\r\n   in_FocusGraph = true;\r\n\r\n   // this will be used to distinguish between viewing VGA and axial maps\r\n   int view_class = pDoc->m_meta_graph->getViewClass() & (MetaGraph::VIEWVGA | MetaGraph::VIEWAXIAL | MetaGraph::VIEWDATA);\r\n   int curr_j = 0;\r\n\r\n   {\r\n       auto lock = pDoc->m_meta_graph->getLockDeferred();\r\n       if (lock.try_lock()) {\r\n          m_view_map_entries.clear();\r\n          if (view_class == MetaGraph::VIEWVGA) {\r\n             PointMap& map = pDoc->m_meta_graph->getDisplayedPointMap();\r\n\r\n             const AttributeTable& table = map.getAttributeTable();\r\n             m_view_map_entries.insert(std::make_pair(0, \"Ref Number\"));\r\n             for (int i = 0; i < table.getNumColumns(); i++) {\r\n                m_view_map_entries.insert(std::make_pair(i+1, table.getColumnName(i)));\r\n                if (map.getDisplayedAttribute() == i) {\r\n                   curr_j = i + 1;\r\n                }\r\n             }\r\n          }\r\n          else if (view_class == MetaGraph::VIEWAXIAL) {\r\n             // using attribute tables is very, very simple...\r\n             const ShapeGraph& map = pDoc->m_meta_graph->getDisplayedShapeGraph();\r\n             const AttributeTable& table = map.getAttributeTable();\r\n             m_view_map_entries.insert(std::make_pair(0, \"Ref Number\"));\r\n             curr_j = 0;\r\n             for (int i = 0; i < table.getNumColumns(); i++) {\r\n                m_view_map_entries.insert(std::make_pair(i+1, table.getColumnName(i)));\r\n                if (map.getDisplayedAttribute() == i) {\r\n                   curr_j = i + 1;\r\n                }\r\n             }\r\n          }\r\n          else if (view_class == MetaGraph::VIEWDATA) {\r\n             // using attribute tables is very, very simple...\r\n             const ShapeMap& map = pDoc->m_meta_graph->getDisplayedDataMap();\r\n             const AttributeTable& table = map.getAttributeTable();\r\n             m_view_map_entries.insert(std::make_pair(0, \"Ref Number\"));\r\n             curr_j = 0;\r\n             for (int i = 0; i < table.getNumColumns(); i++) {\r\n                m_view_map_entries.insert(std::make_pair(i+1, table.getColumnName(i)));\r\n                if (map.getDisplayedAttribute() == i) {\r\n                   curr_j = i + 1;\r\n                }\r\n             }\r\n          }\r\n       }\r\n    }\r\n\r\n   int t, cur_sel = 0;\r\n   x_coord->clear();\r\n   y_coord->clear();\r\n\r\n   int i = 0;\r\n   for (auto view_map_entry: m_view_map_entries) {\r\n      if (curr_j == view_map_entry.first) cur_sel = i;\r\n      x_coord->addItem( QString(view_map_entry.second.c_str()) );\r\n      y_coord->addItem( QString(view_map_entry.second.c_str()) );\r\n      i++;\r\n   }\r\n\r\n   t = ((QPlotView*)pDoc->m_view[QGraphDoc::VIEW_SCATTER])->curr_y;\r\n   if(t != -1) cur_sel = t;\r\n   ((QPlotView*)pDoc->m_view[QGraphDoc::VIEW_SCATTER])->SetAxis(1, cur_sel - 1, true);\r\n   y_coord->setCurrentIndex(cur_sel);\r\n\r\n   t = ((QPlotView*)pDoc->m_view[QGraphDoc::VIEW_SCATTER])->curr_x;\r\n   if(t != -1) cur_sel = t;\r\n   ((QPlotView*)pDoc->m_view[QGraphDoc::VIEW_SCATTER])->SetAxis(0, cur_sel - 1, true);\r\n   x_coord->setCurrentIndex(cur_sel);\r\n\r\n   in_FocusGraph = false;\r\n}\r\n\r\nvoid MainWindow::OnSelchangeViewSelector_X(const QString &string)\r\n{\r\n   if(in_FocusGraph) return;\r\n\r\n   int i = x_coord->currentIndex();\r\n\r\n   QGraphDoc* gd = activeMapDoc();\r\n   ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->SetAxis(0, /*m_view_selection*/i - 1, true);\r\n   ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->curr_x = i;\r\n\r\n   // note: this is only attached to a scatter view, and changing the attribute only\r\n   // affects the scatter view, so only send draw to the map:\r\n   gd->SetRedrawFlag(QGraphDoc::VIEW_SCATTER, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_COLUMN );\r\n}\r\n\r\nvoid MainWindow::OnSelchangeViewSelector_Y(const QString &string)\r\n{\r\n   if(in_FocusGraph) return;\r\n   int i = y_coord->currentIndex();\r\n\r\n   QGraphDoc* gd = activeMapDoc();\r\n   ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->SetAxis(1, i - 1, true);\r\n   ((QPlotView*)gd->m_view[QGraphDoc::VIEW_SCATTER])->curr_y = i;\r\n\r\n   // note: this is only attached to a scatter view, and changing the attribute only\r\n   // affects the scatter view, so only send draw to the map:\r\n   gd->SetRedrawFlag(QGraphDoc::VIEW_SCATTER, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_COLUMN );\r\n}\r\n\r\n\r\nvoid MainWindow::updateViewMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        RecentAct->setEnabled(0);\r\n        showGridAct->setEnabled(0);\r\n        attributeSummaryAct->setEnabled(0);\r\n        return;\r\n    }\r\n    RecentAct->setEnabled(true);\r\n    showGridAct->setEnabled(true);\r\n\r\n    if(m_p->m_meta_graph->m_showgrid) showGridAct->setChecked(true);\r\n    else showGridAct->setChecked(false);\r\n\r\n    attributeSummaryAct->setEnabled(true);\r\n    if (!m_p->m_communicator && m_p->m_meta_graph && !m_p->m_meta_graph->viewingNone())\r\n        attributeSummaryAct->setEnabled(true);\r\n    else attributeSummaryAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateVisibilitySubMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        SetGridAct->setEnabled(0);\r\n        makeVisibilityGraphAct->setEnabled(0);\r\n        unmakeVisibilityGraphAct->setEnabled(0);\r\n        importVGALinksAct->setEnabled(0);\r\n        makeIsovistPathAct->setEnabled(0);\r\n        runVisibilityGraphAnalysisAct->setEnabled(0);\r\n        convertDataMapLinesAct->setEnabled(0);\r\n        return;\r\n    }\r\n    if (m_p->m_meta_graph->getState() & MetaGraph::LINEDATA || m_p->m_meta_graph->viewingUnprocessedPoints())\r\n        SetGridAct->setEnabled(true);\r\n    else SetGridAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->viewingUnprocessedPoints()) {\r\n        makeVisibilityGraphAct->setEnabled(true);\r\n        unmakeVisibilityGraphAct->setEnabled(false);\r\n    } else {\r\n        makeVisibilityGraphAct->setEnabled(false);\r\n        unmakeVisibilityGraphAct->setEnabled(true);\r\n    }\r\n\r\n    int state = m_p->m_meta_graph->getState();\r\n    if (state & MetaGraph::LINEDATA)\r\n        makeIsovistPathAct->setEnabled(true);\r\n    else makeIsovistPathAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->viewingProcessedPoints()) {\r\n        importVGALinksAct->setEnabled(true);\r\n        runVisibilityGraphAnalysisAct->setEnabled(true);\r\n    }\r\n    else\r\n    {\r\n        importVGALinksAct->setEnabled(0);\r\n        runVisibilityGraphAnalysisAct->setEnabled(0);\r\n    }\r\n\r\n    if ( !m_p->m_communicator &&\r\n         m_p->m_meta_graph->viewingProcessedShapes() &&\r\n        (m_p->m_meta_graph->getState() & MetaGraph::POINTMAPS) &&\r\n         m_p->m_meta_graph->getDisplayedPointMap().isProcessed())\r\n        convertDataMapLinesAct->setEnabled(true);\r\n    else convertDataMapLinesAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateStepDepthSubMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        visibilityStepAct->setEnabled(0);\r\n        metricStepAct->setEnabled(0);\r\n        angularStepAct->setEnabled(0);\r\n        return;\r\n    }\r\n    if (m_p->m_meta_graph->viewingProcessed() && m_p->m_meta_graph->isSelected())\r\n        visibilityStepAct->setEnabled(true);\r\n    else visibilityStepAct->setEnabled(0);\r\n\r\n    if ((m_p->m_meta_graph->viewingProcessedPoints() || (m_p->m_meta_graph->viewingProcessedLines() && m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap())) && m_p->m_meta_graph->isSelected())\r\n        metricStepAct->setEnabled(true);\r\n    else metricStepAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->viewingProcessedPoints() && m_p->m_meta_graph->isSelected())\r\n        angularStepAct->setEnabled(true);\r\n    else angularStepAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateAgentToolsSubMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        runAgentAnalysisAct->setEnabled(0);\r\n        loadAgentProgramAct->setEnabled(0);\r\n        return;\r\n    }\r\n    if (m_p->m_meta_graph && m_p->m_meta_graph->viewingProcessedPoints() && !m_p->m_communicator)\r\n        runAgentAnalysisAct->setEnabled(true);\r\n    else runAgentAnalysisAct->setEnabled(0);\r\n    if(current_view_type == QGraphDoc::VIEW_3D) loadAgentProgramAct->setEnabled(true);\r\n    else loadAgentProgramAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateSegmentSubMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        runAngularSegmentAnalysisAct->setEnabled(0);\r\n        runTopologicalOrMetricAnalysisAct->setEnabled(0);\r\n        return;\r\n    }\r\n    if (m_p->m_meta_graph->viewingProcessedLines() && m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap())\r\n        runAngularSegmentAnalysisAct->setEnabled(true);\r\n    else runAngularSegmentAnalysisAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->viewingProcessedLines() && m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap())\r\n        runTopologicalOrMetricAnalysisAct->setEnabled(true);\r\n    else runTopologicalOrMetricAnalysisAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateSegmentStepDepthSubMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        segmentAngularStepAct->setEnabled(0);\r\n        topologicalStepAct->setEnabled(0);\r\n        segmentMetricStepAct->setEnabled(0);\r\n        return;\r\n    }\r\n    if (m_p->m_meta_graph->viewingProcessed() && m_p->m_meta_graph->isSelected())\r\n        segmentAngularStepAct->setEnabled(true);\r\n    else segmentAngularStepAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->viewingProcessedLines() && m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap() && m_p->m_meta_graph->isSelected())\r\n        topologicalStepAct->setEnabled(true);\r\n    else topologicalStepAct->setEnabled(0);\r\n\r\n    if ((m_p->m_meta_graph->viewingProcessedPoints() || (m_p->m_meta_graph->viewingProcessedLines() &&\r\n        m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap())) && m_p->m_meta_graph->isSelected())\r\n        segmentMetricStepAct->setEnabled(true);\r\n    else segmentMetricStepAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateAxialSubMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        runGraphAnaysisAct->setEnabled(0);\r\n        stepDepthAct->setEnabled(0);\r\n        reduceToFewestLineMapAct->setEnabled(0);\r\n        convertDataMapPointsAct->setEnabled(0);\r\n        loadUnlinksFromFileAct->setEnabled(0);\r\n        return;\r\n    }\r\n    int state = m_p->m_meta_graph->getState();\r\n    // non-segment maps only\r\n    if (state & MetaGraph::SHAPEGRAPHS && !m_p->m_communicator &&\r\n       !m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap())\r\n        runGraphAnaysisAct->setEnabled(true);\r\n    else runGraphAnaysisAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->viewingProcessed() && m_p->m_meta_graph->isSelected())\r\n        stepDepthAct->setEnabled(true);\r\n    else stepDepthAct->setEnabled(0);\r\n\r\n    state = m_p->m_meta_graph->getState();\r\n    if (state & MetaGraph::SHAPEGRAPHS && !m_p->m_communicator &&\r\n        m_p->m_meta_graph->getDisplayedShapeGraph().isAllLineMap())\r\n        reduceToFewestLineMapAct->setEnabled(true);\r\n    else reduceToFewestLineMapAct->setEnabled(0);\r\n\r\n    if ( !m_p->m_communicator && m_p->m_meta_graph &&\r\n         m_p->m_meta_graph->viewingProcessedLines() &&\r\n         m_p->m_meta_graph->getDisplayedShapeGraph().getMapType() == ShapeMap::AXIALMAP)\r\n        convertDataMapPointsAct->setEnabled(true);\r\n    else convertDataMapPointsAct->setEnabled(0);\r\n\r\n    if ( !m_p->m_communicator && m_p->m_meta_graph &&\r\n         m_p->m_meta_graph->viewingProcessedLines() &&\r\n         !m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap())\r\n        loadUnlinksFromFileAct->setEnabled(true);\r\n    else loadUnlinksFromFileAct->setEnabled(0);\r\n}\r\n\r\nvoid MainWindow::updateAttributesMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        addColumAct->setEnabled(0);\r\n        updateColumAct->setEnabled(0);\r\n        renameColumnAct->setEnabled(0);\r\n        removeColumAct->setEnabled(0);\r\n        pushValueAct->setEnabled(0);\r\n        columnPropertiesAct->setEnabled(0);\r\n        return;\r\n    }\r\n    if (!m_p->m_communicator && m_p->m_meta_graph->viewingProcessed())\r\n    {\r\n        addColumAct->setEnabled(true);\r\n        columnPropertiesAct->setEnabled(true);\r\n        int col = m_p->m_meta_graph->getDisplayedAttribute();\r\n        if (col == -1 || col == -2 || m_p->m_meta_graph->isAttributeLocked(col))\r\n        {\r\n            renameColumnAct->setEnabled(0);\r\n            updateColumAct->setEnabled(0);\r\n            removeColumAct->setEnabled(0);\r\n            pushValueAct->setEnabled(0);\r\n        }\r\n        else {\r\n            renameColumnAct->setEnabled(true);\r\n            updateColumAct->setEnabled(true);\r\n            removeColumAct->setEnabled(true);\r\n            pushValueAct->setEnabled(true);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        addColumAct->setEnabled(0);\r\n        updateColumAct->setEnabled(0);\r\n        renameColumnAct->setEnabled(0);\r\n        removeColumAct->setEnabled(0);\r\n        pushValueAct->setEnabled(0);\r\n        columnPropertiesAct->setEnabled(0);\r\n    }\r\n}\r\n\r\nvoid MainWindow::updateMapMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        mapNewAct->setEnabled(0);\r\n        deleteAct->setEnabled(0);\r\n        convertActiveMapAct->setEnabled(0);\r\n        convertDrawingMapAct->setEnabled(0);\r\n        convertMapShapesAct->setEnabled(0);\r\n        importAct->setEnabled(0);\r\n        exportAct->setEnabled(0);\r\n        exportGeometryAct->setEnabled(false);\r\n        exportLinksAct->setEnabled(0);\r\n        exportAxialConnectionsDotAct->setEnabled(0);\r\n        exportAxialConnectionsPairAct->setEnabled(0);\r\n        exportSegmentConnectionsPairAct->setEnabled(0);\r\n        return;\r\n    }\r\n    mapNewAct->setEnabled(true);\r\n    importAct->setEnabled(true);\r\n    if (!m_p->m_meta_graph->viewingNone() && !m_p->m_communicator)\r\n        deleteAct->setEnabled(true);\r\n    else deleteAct->setEnabled(0);\r\n\r\n    if (!m_p->m_communicator && (m_p->m_meta_graph->viewingProcessedLines() || m_p->m_meta_graph->viewingProcessedShapes()))\r\n        convertActiveMapAct->setEnabled(true);\r\n    else convertActiveMapAct->setEnabled(0);\r\n\r\n    if (!m_p->m_communicator && (m_p->m_meta_graph->getState() & MetaGraph::LINEDATA) == MetaGraph::LINEDATA)\r\n        convertDrawingMapAct->setEnabled(true);\r\n    else convertDrawingMapAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph && m_p->m_meta_graph->viewingShapes())\r\n        convertMapShapesAct->setEnabled(true);\r\n    else convertMapShapesAct->setEnabled(0);\r\n\r\n    if (!m_p->m_meta_graph->viewingNone() && !m_p->m_communicator)\r\n    {\r\n        exportAct->setEnabled(true);\r\n        exportGeometryAct->setEnabled(true);\r\n        exportLinksAct->setEnabled(true);\r\n        exportAxialConnectionsDotAct->setEnabled(true);\r\n        exportAxialConnectionsPairAct->setEnabled(true);\r\n        exportSegmentConnectionsPairAct->setEnabled(true);\r\n    }\r\n    else\r\n    {\r\n        exportAct->setEnabled(0);\r\n        exportGeometryAct->setEnabled(false);\r\n        exportLinksAct->setEnabled(0);\r\n        exportAxialConnectionsDotAct->setEnabled(0);\r\n        exportAxialConnectionsPairAct->setEnabled(0);\r\n        exportSegmentConnectionsPairAct->setEnabled(0);\r\n    }\r\n}\r\n\r\n\r\nvoid MainWindow::updateEditMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    if(!m_p)\r\n    {\r\n        copyDataAct->setEnabled(0);\r\n        undoAct->setEnabled(0);\r\n        copyScreenAct->setEnabled(0);\r\n        exportScreenAct->setEnabled(0);\r\n        clearAct->setEnabled(0);\r\n        selectByQueryAct->setEnabled(0);\r\n        //zoomToSelectionAct->setEnabled(0);\r\n        selectionToLayerAct->setEnabled(0);\r\n        return;\r\n    }\r\n    copyScreenAct->setEnabled(true);\r\n    exportScreenAct->setEnabled(true);\r\n    if(m_p->m_meta_graph->isEditable()) clearAct->setEnabled(true);\r\n    else clearAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph->canUndo()) undoAct->setEnabled(true);\r\n    else undoAct->setEnabled(0);\r\n\r\n    if (m_p->m_meta_graph && !m_p->m_communicator && m_p->m_meta_graph->viewingProcessed())\r\n        selectByQueryAct->setEnabled(true);\r\n    else selectByQueryAct->setEnabled(0);\r\n\r\n    if(m_p->m_meta_graph->isSelected())\r\n    {\r\n        //zoomToSelectionAct->setEnabled(true);\r\n        selectionToLayerAct->setEnabled(true);\r\n    }\r\n    else\r\n    {\r\n        //zoomToSelectionAct->setEnabled(0);\r\n        selectionToLayerAct->setEnabled(0);\r\n    }\r\n}\r\n\r\nvoid MainWindow::updateFileMenu()\r\n{\r\n    if(mdiArea->activeSubWindow())\r\n    {\r\n        closeAct->setEnabled( true );\r\n        saveAct->setEnabled( true );\r\n        saveAsAct->setEnabled( true );\r\n        propertiesAct->setEnabled( true );\r\n        if(current_view_type == QGraphDoc::VIEW_3D)\r\n        {\r\n            printAct->setEnabled( 0 );\r\n            printPreviewAct->setEnabled( 0 );\r\n        }\r\n        else\r\n        {\r\n            printAct->setEnabled( true );\r\n            printPreviewAct->setEnabled( true );\r\n        }\r\n    }\r\n    else\r\n    {\r\n        closeAct->setEnabled( 0 );\r\n        saveAct->setEnabled( 0 );\r\n        saveAsAct->setEnabled( 0 );\r\n        propertiesAct->setEnabled( 0 );\r\n        printAct->setEnabled( 0 );\r\n        printPreviewAct->setEnabled( 0 );\r\n    }\r\n}\r\n\r\nvoid MainWindow::updateWindowMenu()\r\n{\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    windowMenu->clear();\r\n    windowMenu->addAction(mapAct);\r\n\r\n    if(m_p && m_p->m_view[QGraphDoc::VIEW_MAP]) mapAct->setChecked(true);\r\n    else mapAct->setChecked(false);\r\n\r\n    windowMenu->addAction(scatterPlotAct);\r\n    if(m_p && m_p->m_view[QGraphDoc::VIEW_SCATTER]) scatterPlotAct->setChecked(true);\r\n    else scatterPlotAct->setChecked(false);\r\n\r\n    windowMenu->addAction(tableAct);\r\n    if(m_p && m_p->m_view[QGraphDoc::VIEW_TABLE]) tableAct->setChecked(true);\r\n    else tableAct->setChecked(false);\r\n\r\n    windowMenu->addAction(thirdDViewAct);\r\n    if(m_p && m_p->m_view[QGraphDoc::VIEW_3D]) thirdDViewAct->setChecked(true);\r\n    else thirdDViewAct->setChecked(false);\r\n\r\n    windowMenu->addAction(glViewAct);\r\n    if(m_p && m_p->m_view[QGraphDoc::VIEW_MAP_GL]) glViewAct->setChecked(true);\r\n    else glViewAct->setChecked(false);\r\n\r\n    windowMenu->addSeparator();\r\n    windowMenu->addAction(colourRangeAct);\r\n    windowMenu->addSeparator();\r\n    windowMenu->addAction(cascadeAct);\r\n    windowMenu->addAction(tileAct);\r\n    windowMenu->addAction(arrangeIconsAct);\r\n    windowMenu->addAction(separatorAct);\r\n\r\n    if(!m_p)\r\n    {\r\n        mapAct->setEnabled(0);\r\n        scatterPlotAct->setEnabled(0);\r\n        tableAct->setEnabled(0);\r\n        thirdDViewAct->setEnabled(0);\r\n        glViewAct->setEnabled(0);\r\n    }\r\n    else\r\n    {\r\n        thirdDViewAct->setEnabled(true);\r\n        mapAct->setEnabled(true);\r\n        glViewAct->setEnabled(true);\r\n        if (m_p->m_meta_graph && m_p->m_meta_graph->viewingProcessed())\r\n        {\r\n            tableAct->setEnabled(true);\r\n            scatterPlotAct->setEnabled(true);\r\n        }\r\n        else {\r\n            tableAct->setEnabled(0);\r\n            scatterPlotAct->setEnabled(0);\r\n        }\r\n    }\r\n\r\n    QList<QMdiSubWindow *> windows = mdiArea->subWindowList();\r\n    int find_count = 1;\r\n    for (int i = 0; i < windows.size(); ++i) {\r\n        MapView *child = qobject_cast<MapView*>(windows.at(i)->widget());\r\n        if(!child) continue;\r\n\r\n        QString text;\r\n        text = tr(\"&%1 %2\").arg(find_count++).arg(child->windowTitle());\r\n        QAction *action  = windowMenu->addAction(text);\r\n        action->setCheckable(true);\r\n        action ->setChecked(child == activeMapView());\r\n        connect(action, SIGNAL(triggered()), windowMapper, SLOT(map()));\r\n        windowMapper->setMapping(action, windows.at(i)->widget());\r\n    }\r\n}\r\n\r\nvoid MainWindow::UpdateStatus(QString s1, QString s2, QString s3)\r\n{\r\n    g_info_curr->setText(s1);\r\n    g_info_curr->update();\r\n    g_size->setText(s2);\r\n    g_size->update();\r\n    g_pos_curr->setText(s3);\r\n    g_pos_curr->update();\r\n}\r\n\r\nvoid MainWindow::updateToolbar()\r\n{\r\n    importAct->setEnabled(0);\r\n    saveAct->setEnabled(0);\r\n    addColumAct->setEnabled(0);\r\n    updateColumAct->setEnabled(0);\r\n    removeColumAct->setEnabled(0);\r\n    pushValueAct->setEnabled(0);\r\n    invertColorAct->setEnabled(0);\r\n    SelectButton->setEnabled(0);\r\n    DragButton->setEnabled(0);\r\n    zoomToolButton->setEnabled(0);\r\n    zoomToAct->setEnabled(0);\r\n    RecentAct->setEnabled(0);\r\n    SetGridAct->setEnabled(0);\r\n    fillColorToolButton->setEnabled(0);\r\n    SelectPenButton->setEnabled(0);\r\n    lineToolButton->setEnabled(0);\r\n    newisoToolButton->setEnabled(0);\r\n    AxialMapButton->setEnabled(0);\r\n    StepDepthButton->setEnabled(0);\r\n    JoinToolButton->setEnabled(0);\r\n    attr_del_button->setEnabled(0);\r\n    attr_add_button->setEnabled(0);\r\n\r\n    QGraphDoc* m_p = activeMapDoc();\r\n    MapView* tmpView = activeMapView();\r\n    if(m_p)\r\n    {\r\n        importAct->setEnabled(true);\r\n        saveAct->setEnabled(true);\r\n        if(m_p->m_meta_graph->getDisplayedMapRef() != -1)\r\n            addColumAct->setEnabled(true);\r\n        SelectButton->setEnabled(true);\r\n        DragButton->setEnabled(true);\r\n        RecentAct->setEnabled(true);\r\n\r\n        if(m_p->m_meta_graph->isSelected())\r\n            zoomToAct->setEnabled(true);\r\n\r\n        if (m_p->m_meta_graph->isShown())   // zoom bug VGA // TV\r\n            zoomToolButton->setEnabled(true);\r\n        if (m_p->m_meta_graph->viewingProcessed())\r\n            zoomToolButton->setEnabled(true);\r\n\r\n        if (m_p->m_meta_graph->getState() & MetaGraph::LINEDATA || m_p->m_meta_graph->viewingUnprocessedPoints())\r\n            SetGridAct->setEnabled(true);\r\n\r\n        if (m_p->m_meta_graph->viewingUnprocessedPoints())\r\n        {\r\n            fillColorToolButton->setEnabled(true);\r\n            SelectPenButton->setEnabled(true);\r\n        }\r\n        else\r\n        {\r\n            if (tmpView)\r\n            {\r\n                if (m_selected_mapbar_item == ID_MAPBAR_ITEM_FILL\r\n                        || m_selected_mapbar_item == ID_MAPBAR_ITEM_SEMIFILL\r\n                        || m_selected_mapbar_item == ID_MAPBAR_ITEM_PENCIL)\r\n                {\r\n                    tmpView->OnEditSelect();\r\n                    SelectButton->setChecked(true);\r\n                }\r\n            }\r\n        }\r\n\r\n        int type = m_p->m_meta_graph->getDisplayedMapType();\r\n        if ((type == ShapeMap::DATAMAP && m_p->m_meta_graph->getDisplayedDataMap().isEditable()) ||\r\n            ((type == ShapeMap::AXIALMAP || type == ShapeMap::CONVEXMAP || type == ShapeMap::PESHMAP) &&\r\n            m_p->m_meta_graph->getDisplayedShapeGraph().isEditable()))\r\n            lineToolButton->setEnabled(true);\r\n        else\r\n        {\r\n            if (tmpView)\r\n            {\r\n                if (m_selected_mapbar_item == ID_MAPBAR_ITEM_LINETOOL\r\n                        || m_selected_mapbar_item == ID_MAPBAR_ITEM_POLYGON)\r\n                {\r\n                    tmpView->OnEditSelect();\r\n                    SelectButton->setChecked(true);\r\n                }\r\n            }\r\n        }\r\n\r\n        type = m_p->m_meta_graph->getState();\r\n        if (!(~type & MetaGraph::LINEDATA))\r\n            newisoToolButton->setEnabled(true);\r\n        else\r\n        {\r\n            if (tmpView)\r\n            {\r\n                if (m_selected_mapbar_item == ID_MAPBAR_ITEM_ISOVIST || m_selected_mapbar_item == ID_MAPBAR_ITEM_HALFISOVIST)\r\n                {\r\n                    tmpView->OnEditSelect();\r\n                    SelectButton->setChecked(true);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (( ( (m_p->m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) &&\r\n               (m_p->m_meta_graph->getDisplayedPointMap().getFilledPointCount() > 1)) ||\r\n             (((m_p->m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) &&\r\n               (m_p->m_meta_graph->getState() & MetaGraph::SHAPEGRAPHS)) &&\r\n               (!m_p->m_meta_graph->getDisplayedShapeGraph().isSegmentMap()) ) ))\r\n            JoinToolButton->setEnabled(true);\r\n        else\r\n        {\r\n            if (tmpView)\r\n            {\r\n                if (m_selected_mapbar_item == ID_MAPBAR_ITEM_JOIN || m_selected_mapbar_item == ID_MAPBAR_ITEM_UNJOIN)\r\n                {\r\n                    tmpView->OnEditSelect();\r\n                    SelectButton->setChecked(true);\r\n                }\r\n            }\r\n        }\r\n\r\n        type = m_p->m_meta_graph->getState();\r\n        if (!(~type & MetaGraph::LINEDATA)) AxialMapButton->setEnabled(true);\r\n        else\r\n        {\r\n            if (tmpView)\r\n            {\r\n                if (m_selected_mapbar_item == ID_MAPBAR_ITEM_AL2)\r\n                {\r\n                    tmpView->OnEditSelect();\r\n                    SelectButton->setChecked(true);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (m_p->m_meta_graph->viewingProcessed() && m_p->m_meta_graph->isSelected())\r\n            StepDepthButton->setEnabled(true);\r\n\r\n        if (!m_p->m_communicator && m_p->m_meta_graph->viewingProcessed())\r\n        {\r\n            int col = m_p->m_meta_graph->getDisplayedAttribute();\r\n            if (!(col == -1 || col == -2 || m_p->m_meta_graph->isAttributeLocked(col))) {\r\n                renameColumnAct->setEnabled(true);\r\n                updateColumAct->setEnabled(true);\r\n                removeColumAct->setEnabled(true);\r\n                pushValueAct->setEnabled(true);\r\n                invertColorAct->setEnabled(true);\r\n                attr_del_button->setEnabled(true);\r\n                attr_add_button->setEnabled(true);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid MainWindow::createActions()\r\n{\r\n    newAct = new QAction(QIcon(\":/images/new.png\"), tr(\"&New\"), this);\r\n    newAct->setShortcut(tr(\"Ctrl+N\"));\r\n    newAct->setStatusTip(tr(\"Create a new graph workspace\\nNew Workspace\"));\r\n    connect(newAct, SIGNAL(triggered()), this, SLOT(OnFileNew()));\r\n\r\n    openAct = new QAction(QIcon(\":/images/open.png\"), tr(\"&Open...\"), this);\r\n    openAct->setShortcut(tr(\"Ctrl+O\"));\r\n    openAct->setStatusTip(tr(\"Change the printing options\\nPage Setup\"));\r\n    connect(openAct, SIGNAL(triggered()), this, SLOT(OnFileOpen()));\r\n\r\n    closeAct = new QAction(tr(\"&Close\"), this);\r\n    closeAct->setStatusTip(tr(\"Close the active graph workspace\\nClose Workspace\"));\r\n    connect(closeAct, SIGNAL(triggered()), this, SLOT(OnFileClose()));\r\n\r\n    saveAct = new QAction(QIcon(\":/images/save.png\"), tr(\"&Save\"), this);\r\n    saveAct->setShortcut(tr(\"Ctrl+S\"));\r\n    saveAct->setStatusTip(tr(\"Save the active graph workspace\\nSave workspace\"));\r\n    connect(saveAct, SIGNAL(triggered()), this, SLOT(OnFileSave()));\r\n\r\n    saveAsAct = new QAction(tr(\"Save &As...\"), this);\r\n    saveAsAct->setStatusTip(tr(\"Save the active graph workspace with a new name\\nSave Workspace As\"));\r\n    connect(saveAsAct, SIGNAL(triggered()), this, SLOT(OnFileSaveAs()));\r\n\r\n    propertiesAct = new QAction(tr(\"Properties...\"), this);\r\n    propertiesAct->setStatusTip(tr(\"Edit graph workspace properties\\nWorkspace Properties\"));\r\n    connect(propertiesAct, SIGNAL(triggered()), this, SLOT(OnFileProperties()));\r\n\r\n    printAct = new QAction(tr(\"&Print...\"), this);\r\n    printAct->setShortcut(tr(\"Ctrl+P\"));\r\n    printAct->setStatusTip(tr(\"Print the active graph workspace\\nPrint Workspace\"));\r\n    connect(printAct, SIGNAL(triggered()), this, SLOT(OnFilePrint()));\r\n\r\n    printPreviewAct = new QAction(tr(\"Print Pre&view\"), this);\r\n    printPreviewAct->setStatusTip(tr(\"Display full pages\\nPrint Preview\"));\r\n    connect(printPreviewAct, SIGNAL(triggered()), this, SLOT(OnFilePrintPreview()));\r\n\r\n    printSetupAct = new QAction(tr(\"P&rint Setup...\"), this);\r\n    printSetupAct->setStatusTip(tr(\"Change the printer and printing options\\nPrint Setup\"));\r\n    connect(printSetupAct, SIGNAL(triggered()), this, SLOT(OnFilePrintSetup()));\r\n\r\n    for (int i = 0; i < MaxRecentFiles; ++i) {\r\n        recentFileActs[i] = new QAction(this);\r\n        recentFileActs[i]->setVisible(false);\r\n        connect(recentFileActs[i], SIGNAL(triggered()),\r\n                this, SLOT(openRecentFile()));\r\n    }\r\n\r\n    exitAct = new QAction(tr(\"E&xit\"), this);\r\n    exitAct->setStatusTip(tr(\"Quit the application; prompts to save documents\\nExit\"));\r\n    connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));\r\n\r\n    //Edit Menu Actions\r\n    undoAct = new QAction(tr(\"&Undo\"), this);\r\n    undoAct->setShortcut(tr(\"Ctrl+Z\"));\r\n    undoAct->setStatusTip(tr(\"Undo the last action\\nUndo\"));\r\n    connect(undoAct, SIGNAL(triggered()), this, SLOT(OnEditUndo()));\r\n\r\n    copyDataAct = new QAction(tr(\"Copy &Data\"), this);\r\n    connect(copyDataAct, SIGNAL(triggered()), this, SLOT(OnEditCopyData()));\r\n\r\n    copyScreenAct = new QAction(tr(\"Copy &Screen\"), this);\r\n    copyScreenAct->setShortcut(tr(\"Ctrl+C\"));\r\n    copyScreenAct->setStatusTip(tr(\"Copy the screen contents to clipboard\\nCopy Screen\"));\r\n    connect(copyScreenAct, SIGNAL(triggered()), this, SLOT(OnEditCopy()));\r\n\r\n    exportScreenAct = new QAction(tr(\"&Export Screen...\"), this);\r\n    exportScreenAct->setStatusTip(tr(\"Export the screen as an Encapsulated Postscript file\\nExport Screen\"));\r\n    connect(exportScreenAct, SIGNAL(triggered()), this, SLOT(OnEditSave()));\r\n\r\n    clearAct = new QAction(tr(\"&Clear\"), this);\r\n    clearAct->setShortcut(tr(\"Del\"));\r\n    clearAct->setShortcutContext(Qt::ApplicationShortcut);\r\n    clearAct->setStatusTip(tr(\"Erase the selection\\nErase\"));\r\n    connect(clearAct, SIGNAL(triggered()), this, SLOT(OnEditClear()));\r\n\r\n    selectByQueryAct = new QAction(tr(\"Select by &Query\"), this);\r\n    selectByQueryAct->setShortcut(tr(\"Ctrl+Q\"));\r\n    connect(selectByQueryAct, SIGNAL(triggered()), this, SLOT(OnEditQuery()));\r\n\r\n    //zoomToSelectionAct = new QAction(tr(\"&Zoom to Selection\"), this);\r\n    //zoomToSelectionAct->setStatusTip(tr(\"Zoom in around current selection\\nZoom to Selection\"));\r\n    //connect(zoomToSelectionAct, SIGNAL(triggered()), this, SLOT(OnViewZoomsel()));\r\n\r\n    selectionToLayerAct = new QAction(tr(\"Selection to &Layer...\"), this);\r\n    selectionToLayerAct->setStatusTip(tr(\"Convert the current selection to a new map layer\"));\r\n    connect(selectionToLayerAct, SIGNAL(triggered()), this, SLOT(OnEditSelectToLayer()));\r\n\r\n    //Map Menu Actions\r\n    mapNewAct = new QAction(tr(\"&New...\"), this);\r\n    mapNewAct->setStatusTip(tr(\"Create a new map\"));\r\n    connect(mapNewAct, SIGNAL(triggered()), this, SLOT(OnLayerNew()));\r\n\r\n    deleteAct = new QAction(tr(\"&Delete...\"), this);\r\n    deleteAct->setStatusTip(tr(\"Delete the active map\"));\r\n    connect(deleteAct, SIGNAL(triggered()), this, SLOT(OnLayerDelete()));\r\n\r\n    convertActiveMapAct = new QAction(tr(\"&Convert Active Map...\"), this);\r\n    convertActiveMapAct->setStatusTip(tr(\"Create a new map from the active map\"));\r\n    connect(convertActiveMapAct, SIGNAL(triggered()), this, SLOT(OnLayerConvert()));\r\n\r\n    convertDrawingMapAct = new QAction(tr(\"Convert Drawing &Map...\"), this);\r\n    convertDrawingMapAct->setStatusTip(tr(\"Create a new map from the displayed drawing maps\"));\r\n    connect(convertDrawingMapAct, SIGNAL(triggered()), this, SLOT(OnLayerConvertDrawing()));\r\n\r\n    convertMapShapesAct = new QAction(tr(\"Convert Map &Shapes...\"), this);\r\n    convertMapShapesAct->setStatusTip(tr(\"Convert shapes to other shapes within the current map\"));\r\n    connect(convertMapShapesAct, SIGNAL(triggered()), this, SLOT(OnConvertMapShapes()));\r\n\r\n    importAct = new QAction(QIcon(\":/images/down.png\"), tr(\"&Import...\"), this);\r\n    importAct->setShortcut(tr(\"Ctrl+I\"));\r\n    importAct->setStatusTip(tr(\"Import a DXF or points file\\nImport Map\"));\r\n    connect(importAct, SIGNAL(triggered()), this, SLOT(OnFileImport()));\r\n\r\n    exportAct = new QAction(tr(\"&Export map...\"), this);\r\n    exportAct->setShortcut(tr(\"Ctrl+E\"));\r\n    exportAct->setStatusTip(tr(\"Export the active map\"));\r\n    connect(exportAct, SIGNAL(triggered()), this, SLOT(OnFileExport()));\r\n\r\n    exportGeometryAct = new QAction(tr(\"&Export map geometry...\"), this);\r\n    exportGeometryAct->setStatusTip(tr(\"Export the geometry of the active map\"));\r\n    connect(exportGeometryAct, SIGNAL(triggered()), this, SLOT(OnFileExportMapGeometry()));\r\n\r\n    exportLinksAct = new QAction(tr(\"&Export links...\"), this);\r\n    exportLinksAct->setStatusTip(tr(\"Export the links of the active map\"));\r\n    connect(exportLinksAct, SIGNAL(triggered()), this, SLOT(OnFileExportLinks()));\r\n\r\n    exportAxialConnectionsPairAct = new QAction(tr(\"&Axial Connections as CSV...\"), this);\r\n    exportAxialConnectionsPairAct->setStatusTip(tr(\"Export a list of line-line intersections\"));\r\n    connect(exportAxialConnectionsPairAct, SIGNAL(triggered()), this, SLOT(OnAxialConnectionsExportAsPairCSV()));\r\n\r\n    exportAxialConnectionsDotAct = new QAction(tr(\"&Axial Connections as Dot...\"), this);\r\n    exportAxialConnectionsDotAct->setStatusTip(tr(\"Export a list of line-line intersections\"));\r\n    connect(exportAxialConnectionsDotAct, SIGNAL(triggered()), this, SLOT(OnAxialConnectionsExportAsDot()));\r\n\r\n    exportSegmentConnectionsPairAct = new QAction(tr(\"&Segment Connections as CSV...\"), this);\r\n    exportSegmentConnectionsPairAct->setStatusTip(tr(\"Export a list of line-line intersections and weights\"));\r\n    connect(exportSegmentConnectionsPairAct, SIGNAL(triggered()), this, SLOT(OnSegmentConnectionsExportAsPairCSV()));\r\n\r\n    exportPointmapConnectionsPairAct = new QAction(tr(\"Visibility Graph Connections as CSV...\"), this);\r\n    exportPointmapConnectionsPairAct->setStatusTip(tr(\"Export connections between cells in a visibility graph as an adjacency list\"));\r\n    connect(exportPointmapConnectionsPairAct, SIGNAL(triggered()), this, SLOT(OnPointmapExportConnectionsAsCSV()));\r\n\r\n    //Attributes Menu Actions\r\n    renameColumnAct = new QAction(tr(\"&Rename Column...\"), this);\r\n    renameColumnAct->setStatusTip(tr(\"Rename the currently displayed attribute\"));\r\n    connect(renameColumnAct, SIGNAL(triggered()), this, SLOT(OnRenameColumn()));\r\n\r\n    columnPropertiesAct = new QAction(tr(\"Column &Properties...\"), this);\r\n    columnPropertiesAct->setStatusTip(tr(\"Summary statistics for the active attribute\"));\r\n    connect(columnPropertiesAct, SIGNAL(triggered()), this, SLOT(OnColumnProperties()));\r\n\r\n    //Tools Menu Actions\r\n    makeVisibilityGraphAct = new QAction(tr(\"Make &Visibility Graph...\"), this);\r\n    connect(makeVisibilityGraphAct, SIGNAL(triggered()), this, SLOT(OnToolsMakeGraph()));\r\n\r\n    unmakeVisibilityGraphAct = new QAction(tr(\"Unmake &Visibility Graph...\"), this);\r\n    connect(unmakeVisibilityGraphAct, SIGNAL(triggered()), this, SLOT(OnToolsUnmakeGraph()));\r\n\r\n    importVGALinksAct = new QAction(tr(\"Import VGA links from file...\"), this);\r\n    connect(importVGALinksAct, SIGNAL(triggered()), this, SLOT(OnToolsImportVGALinks()));\r\n\r\n    generateIsovistsAct = new QAction(tr(\"Generate isovists from file...\"), this);\r\n    connect(generateIsovistsAct, SIGNAL(triggered()), this, SLOT(OnToolsGenerateIsovistsFromFile()));\r\n\r\n    makeIsovistPathAct = new QAction(tr(\"Make &Isovist Path...\"), this);\r\n    connect(makeIsovistPathAct, SIGNAL(triggered()), this, SLOT(OnToolsIsovistpath()));\r\n\r\n    runVisibilityGraphAnalysisAct = new QAction(tr(\"&Run Visibility Graph Analysis...\"), this);\r\n    connect(runVisibilityGraphAnalysisAct, SIGNAL(triggered()), this, SLOT(OnToolsRun()));\r\n\r\n    visibilityStepAct = new QAction(tr(\"&Visibility Step\"), this);\r\n    visibilityStepAct->setStatusTip(tr(\"Step depth from current selection\\nStep Depth\"));\r\n    connect(visibilityStepAct, SIGNAL(triggered()), this, SLOT(OnToolsPD()));\r\n\r\n    metricStepAct = new QAction(tr(\"&Metric Step\"), this);\r\n    metricStepAct->setStatusTip(tr(\"Distance from current selection\\nMetric Depth\"));\r\n    connect(metricStepAct, SIGNAL(triggered()), this, SLOT(OnToolsMPD()));\r\n\r\n    angularStepAct = new QAction(tr(\"&Angular Step\"), this);\r\n    angularStepAct->setStatusTip(tr(\"Angular distance from current selection\\nAngular Depth\"));\r\n    connect(angularStepAct, SIGNAL(triggered()), this, SLOT(OnToolsAPD()));\r\n\r\n    convertDataMapLinesAct = new QAction(tr(\"Convert Data Map Lines to Merge Points\"), this);\r\n    convertDataMapLinesAct->setStatusTip(tr(\"Convert displayed data map lines to merge points for current visibility graph\"));\r\n    connect(convertDataMapLinesAct, SIGNAL(triggered()), this, SLOT(OnToolsPointConvShapeMap()));\r\n\r\n    runAgentAnalysisAct = new QAction(tr(\"&Run Agent Analysis\"), this);\r\n    connect(runAgentAnalysisAct, SIGNAL(triggered()), this, SLOT(OnToolsAgentRun()));\r\n\r\n    loadAgentProgramAct = new QAction(tr(\"&Load Agent Program\"), this);\r\n    connect(loadAgentProgramAct, SIGNAL(triggered()), this, SLOT(OnToolsAgentLoadProgram()));\r\n\r\n    runGraphAnaysisAct = new QAction(tr(\"&Run Graph Analysis...\"), this);\r\n    runGraphAnaysisAct->setStatusTip(tr(\"Analyse currently displayed axial line map\\nAxial analysis\"));\r\n    connect(runGraphAnaysisAct, SIGNAL(triggered()), this, SLOT(OnToolsRunAxa()));\r\n\r\n    stepDepthAct = new QAction(tr(\"Step &Depth\"), this);\r\n    stepDepthAct->setShortcut(tr(\"Ctrl+D\"));\r\n    stepDepthAct->setStatusTip(tr(\"Step depth from current selection\\nStep Depth\"));\r\n    connect(stepDepthAct, SIGNAL(triggered()), this, SLOT(OnToolsPD()));\r\n\r\n    reduceToFewestLineMapAct = new QAction(tr(\"Reduce to &Fewest Line Map...\"), this);\r\n    connect(reduceToFewestLineMapAct, SIGNAL(triggered()), this, SLOT(OnToolsMakeFewestLineMap()));\r\n\r\n    convertDataMapPointsAct = new QAction(tr(\"Convert Data Map Points to Unlinks\"), this);\r\n    convertDataMapPointsAct->setStatusTip(tr(\"Convert displayed data map points to unlinks for current axial map\"));\r\n    connect(convertDataMapPointsAct, SIGNAL(triggered()), this, SLOT(OnToolsAxialConvShapeMap()));\r\n\r\n    loadUnlinksFromFileAct = new QAction(tr(\"Load Unlinks from File...\"), this);\r\n    connect(loadUnlinksFromFileAct, SIGNAL(triggered()), this, SLOT(OnToolsLineLoadUnlinks()));\r\n\r\n    runAngularSegmentAnalysisAct = new QAction(tr(\"&Run Angular Segment Analysis...\"), this);\r\n    connect(runAngularSegmentAnalysisAct, SIGNAL(triggered()), this, SLOT(OnToolsRunSeg()));\r\n\r\n    runTopologicalOrMetricAnalysisAct = new QAction(tr(\"Run &Topological or Metric Analysis...\"), this);\r\n    connect(runTopologicalOrMetricAnalysisAct, SIGNAL(triggered()), this, SLOT(OnToolsTopomet()));\r\n\r\n    segmentAngularStepAct = new QAction(tr(\"&Angular Step\"), this);\r\n    segmentAngularStepAct->setShortcut(tr(\"Ctrl+D\"));\r\n    segmentAngularStepAct->setStatusTip(tr(\"Step depth from current selection\\nStep Depth\"));\r\n    connect(segmentAngularStepAct, SIGNAL(triggered()), this, SLOT(OnToolsPD()));\r\n\r\n    topologicalStepAct = new QAction(tr(\"&Topological Step\"), this);\r\n    connect(topologicalStepAct, SIGNAL(triggered()), this, SLOT(OnToolsTPD()));\r\n\r\n    segmentMetricStepAct = new QAction(tr(\"&Metric Step\"), this);\r\n    connect(segmentMetricStepAct, SIGNAL(triggered()), this, SLOT(OnToolsMPD()));\r\n\r\n    optionsAct = new QAction(tr(\"Options...\"), this);\r\n    connect(optionsAct, SIGNAL(triggered()), this, SLOT(OnToolsOptions()));\r\n\r\n    //View Menu Actions\r\n    showGridAct = new QAction(tr(\"Show &Grid\"), this);\r\n    showGridAct->setStatusTip(tr(\"Display grid\"));\r\n    showGridAct->setCheckable(true);\r\n    connect(showGridAct, SIGNAL(triggered()), this, SLOT(OnViewShowGrid()));\r\n\r\n    attributeSummaryAct = new QAction(tr(\"&Attribute Summary...\"), this);\r\n    attributeSummaryAct->setStatusTip(tr(\"Show summarised attribute information for selected points\"));\r\n    connect(attributeSummaryAct, SIGNAL(triggered()), this, SLOT(OnViewSummary()));\r\n\r\n    //Window Menu Actions\r\n    mapAct = new QAction(tr(\"&Map\"), this);\r\n    mapAct->setCheckable(true);\r\n    connect(mapAct, SIGNAL(triggered()), this, SLOT(OnWindowMap()));\r\n\r\n    scatterPlotAct = new QAction(tr(\"&Scatter Plot\"), this);\r\n    scatterPlotAct->setCheckable(true);\r\n    connect(scatterPlotAct, SIGNAL(triggered()), this, SLOT(OnViewScatterplot()));\r\n\r\n    tableAct = new QAction(tr(\"&Table\"), this);\r\n    tableAct->setCheckable(true);\r\n    connect(tableAct, SIGNAL(triggered()), this, SLOT(OnViewTable()));\r\n\r\n    thirdDViewAct = new QAction(tr(\"&3D View\"), this);\r\n    thirdDViewAct->setCheckable(true);\r\n    connect(thirdDViewAct, SIGNAL(triggered()), this, SLOT(OnWindow3dView()));\r\n\r\n    glViewAct = new QAction(tr(\"Map (Open&GL)\"), this);\r\n    glViewAct->setCheckable(true);\r\n    connect(glViewAct, SIGNAL(triggered()), this, SLOT(OnWindowGLView()));\r\n\r\n    colourRangeAct = new QAction(tr(\"&Colour Range\"), this);\r\n    connect(colourRangeAct, SIGNAL(triggered()), this, SLOT(OnViewColourRange()));\r\n\r\n    cascadeAct = new QAction(tr(\"C&ascade\"), this);\r\n    cascadeAct->setStatusTip(tr(\"Arrange windows so they overlap\\nCascade Windows\"));\r\n    connect(cascadeAct, SIGNAL(triggered()), mdiArea, SLOT(cascadeSubWindows()));\r\n\r\n    tileAct = new QAction(tr(\"T&ile\"), this);\r\n    tileAct->setStatusTip(tr(\"Arrange windows as non-overlapping tiles\\nTile Windows\"));\r\n    connect(tileAct, SIGNAL(triggered()), mdiArea, SLOT(tileSubWindows()));\r\n\r\n    arrangeIconsAct = new QAction(tr(\"A&rrange Icons\"), this);\r\n    arrangeIconsAct->setStatusTip(tr(\"Arrange icons at the bottom of the window\\nArrange Icons\"));\r\n//\tconnect(arrangeIconsAct, SIGNAL(triggered()), mdiArea, SLOT(arrangeSubWindows()));\r\n\r\n    //Help Menu Actions\r\n    onlineBugsAct = new QAction(tr(\"Submit Problems/Ideas\"), this);\r\n    onlineBugsAct->setStatusTip(tr(\"View or Submit Problems and Ideas online\"));\r\n    connect(onlineBugsAct, SIGNAL(triggered()), this, SLOT(OnHelpBugs()));\r\n\r\n    onlineHandbookAct = new QAction(tr(\"Get the PDF &Handbook\"), this);\r\n    onlineHandbookAct->setStatusTip(tr(\"View the Original Depthmap Researchers' Handbook\"));\r\n    connect(onlineHandbookAct, SIGNAL(triggered()), this, SLOT(OnHelpManual()));\r\n\r\n    onlineTutorialsAct = new QAction(tr(\"Online &Tutorials\"), this);\r\n    onlineTutorialsAct->setStatusTip(tr(\"View the Original Depthmap tutorials online\"));\r\n    connect(onlineTutorialsAct, SIGNAL(triggered()), this, SLOT(OnHelpTutorials()));\r\n\r\n    onlineScriptingManualAct = new QAction(tr(\"Online &Scripting Manual\"), this);\r\n    onlineScriptingManualAct->setStatusTip(tr(\"See the Original SalaScript web page\"));\r\n    connect(onlineScriptingManualAct, SIGNAL(triggered()), this, SLOT(OnHelpSalaManual()));\r\n\r\n    aboutDepthMapAct = new QAction(tr(\"About &depthmapX...\"), this);\r\n    aboutDepthMapAct->setStatusTip(tr(\"Display program information, version number and copyright\\nAbout\"));\r\n    connect(aboutDepthMapAct, SIGNAL(triggered()), this, SLOT(OnAppAbout()));\r\n// ToolBar actions\r\n\r\n    invertColorAct = new QAction(QIcon(\":/images/win/b-5-18.png\"), tr(\"Invert Colour Range\"), this);\r\n    invertColorAct->setStatusTip(tr(\"Invert the colour range\\nInvert Colour Range\"));\r\n    connect(invertColorAct, SIGNAL(triggered()), this, SLOT(OninvertColor()));\r\n\r\n    addColumAct = new QAction(QIcon(\":/images/win/b-5-19.png\"), tr(\"&Add Column\"), this);\r\n    addColumAct->setStatusTip(tr(\"Add column to the active map\\nAdd Column\"));\r\n    connect(addColumAct, SIGNAL(triggered()), this, SLOT(OnAddColumn()));\r\n\r\n    updateColumAct = new QAction(QIcon(\":/images/win/b-5-20.png\"), tr(\"&Update Column\"), this);\r\n    updateColumAct->setStatusTip(tr(\"Replace column contents using a SalaScript command\\nUpdate Column\"));\r\n    connect(updateColumAct, SIGNAL(triggered()), this, SLOT(OnUpdateColumn()));\r\n\r\n    removeColumAct = new QAction(QIcon(\":/images/win/b-5-21.png\"), tr(\"&Remove Column\"), this);\r\n    removeColumAct->setStatusTip(tr(\"Remove column from the active map\\nRemove column\"));\r\n    connect(removeColumAct, SIGNAL(triggered()), this, SLOT(OnRemoveColumn()));\r\n\r\n    pushValueAct = new QAction(QIcon(\":/images/win/b-5-22.png\"), tr(\"&Push Values\"), this);\r\n    pushValueAct->setStatusTip(tr(\"Push values from active map to another map\\npushValue\"));\r\n    connect(pushValueAct, SIGNAL(triggered()), this, SLOT(OnPushToLayer()));\r\n\r\n    zoomToAct = new QAction(QIcon(\":/images/win/b-5-5.png\"), tr(\"Zoom to Selection\"), this);\r\n    zoomToAct->setStatusTip(tr(\"Zoom in on current selected items\\nZoom to Selection\"));\r\n    connect(zoomToAct, SIGNAL(triggered()), this, SLOT(OnzoomTo()));\r\n\r\n    RecentAct = new QAction(QIcon(\":/images/win/b-5-6.png\"), tr(\"&Recentre View\"), this);\r\n    RecentAct->setStatusTip(tr(\"Fit map to window\\nRecentre\"));\r\n    connect(RecentAct, SIGNAL(triggered()), this, SLOT(OnViewCentreView()));\r\n\r\n    SetGridAct = new QAction(QIcon(\":/images/win/b-5-7.png\"), tr(\"Set Grid\"), this);\r\n    SetGridAct->setStatusTip(tr(\"Overlay grid on plan\\nSet Grid\"));\r\n    connect(SetGridAct, SIGNAL(triggered()), this, SLOT(OnEditGrid()));\r\n\r\n    toggleColor = new QAction(QIcon(\":/images/win/b-7-1.png\"), tr(\"Toggle Colour\"), this);\r\n    toggleColor->setCheckable(1);\r\n    toggleColor->setStatusTip(tr(\"Toggle colour display on and off\\nToggle Colour\"));\r\n    connect(toggleColor, SIGNAL(triggered()), this, SLOT(OntoggleColor()));\r\n\r\n    toggleOrg = new QAction(QIcon(\":/images/win/b-7-2.png\"), tr(\"Toggle origin on/off\"), this);\r\n    toggleOrg->setCheckable(1);\r\n    toggleOrg->setStatusTip(tr(\"Toggle graph intersect at origin of X, Y values\\nToggle origin on/off\"));\r\n    connect(toggleOrg, SIGNAL(triggered()), this, SLOT(OntoggleOrg()));\r\n\r\n    viewTrend = new QAction(QIcon(\":/images/win/b-7-3.png\"), tr(\"View trend line\"), this);\r\n    viewTrend->setCheckable(1);\r\n    viewTrend->setStatusTip(tr(\"Show regression line\\nView trend line\"));\r\n    connect(viewTrend, SIGNAL(triggered()), this, SLOT(OnviewTrend()));\r\n\r\n    yx = new QAction(QIcon(\":/images/win/b-7-4.png\"), tr(\"\"), this);\r\n    yx->setCheckable(1);\r\n    yx->setStatusTip(tr(\"\"));\r\n    connect(yx, SIGNAL(triggered()), this, SLOT(OnYX()));\r\n\r\n    Rtwo = new QAction(QIcon(\":/images/win/b-7-5.png\"), tr(\"\"), this);\r\n    Rtwo->setCheckable(1);\r\n    Rtwo->setStatusTip(tr(\"\"));\r\n    connect(Rtwo, SIGNAL(triggered()), this, SLOT(OnRtwo()));\r\n\r\n///////////////////////////////////////////////////////////\r\n//Popup toolbar\r\n    {\r\n        zoomToolButton = new QToolButton;\r\n        zoomToolButton->setPopupMode(QToolButton::MenuButtonPopup);\r\n        QMenu *zoomMenu = new QMenu;\r\n        zoomInAct = new QAction(tr(\"Zoom in\"), this);\r\n        zoomInAct->setStatusTip(tr(\"Zoom into or out of (using Alt-key) view of map\\nZoom In\"));\r\n        zoomInAct->setCheckable(1);\r\n        zoomInAct->setChecked(1);\r\n        zoomInAct->setData(ID_MAPBAR_ITEM_ZOOM_IN);\r\n        connect(zoomInAct, SIGNAL(triggered()), this, SLOT(zoomModeTriggered()));\r\n        zoomMenu->addAction(zoomInAct);\r\n        zoomOutAct = new QAction(tr(\"Zoom out\"), this);\r\n        zoomOutAct->setStatusTip(tr(\"Zoom out of or into (using Alt-key) view of map\\nZoom Out\"));\r\n        zoomOutAct->setCheckable(1);\r\n        zoomOutAct->setData(ID_MAPBAR_ITEM_ZOOM_OUT);\r\n        connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(zoomModeTriggered()));\r\n        zoomMenu->addAction(zoomOutAct);\r\n        zoomMenu->setDefaultAction(zoomInAct);\r\n        zoomToolButton->setMenu(zoomMenu);\r\n        zoomToolButton->setIcon(QIcon(\":/images/win/b-5-3.png\"));\r\n        zoomToolButton->setCheckable(1);\r\n        connect(zoomToolButton, SIGNAL(clicked()), this, SLOT(zoomButtonTriggered()));\r\n\r\n        QActionGroup* tGroup = new QActionGroup(this);\r\n        tGroup->addAction(zoomInAct);\r\n        tGroup->addAction(zoomOutAct);\r\n    }\r\n    {\r\n        fillColorToolButton = new QToolButton;\r\n        fillColorToolButton->setPopupMode(QToolButton::MenuButtonPopup);\r\n        QMenu *fillColorMenu = new QMenu;\r\n\r\n        STDFillColorAct = new QAction(tr(\"Standard Fill\"), this);\r\n        STDFillColorAct->setStatusTip(tr(\"Standard Fill grid spaces with points\\nFill\"));\r\n        STDFillColorAct->setCheckable(1);\r\n        STDFillColorAct->setChecked(1);\r\n        STDFillColorAct->setData(ID_MAPBAR_ITEM_FILL);\r\n        connect(STDFillColorAct, SIGNAL(triggered()), this, SLOT(FillModeTriggered()));\r\n\r\n        ContextFillColorAct = new QAction(tr(\"Context Fill\"), this);\r\n        ContextFillColorAct->setStatusTip(tr(\"Context Fill grid spaces with points\\nFill\"));\r\n        ContextFillColorAct->setCheckable(1);\r\n        ContextFillColorAct->setData(ID_MAPBAR_ITEM_SEMIFILL);\r\n        connect(ContextFillColorAct, SIGNAL(triggered()), this, SLOT(FillModeTriggered()));\r\n\r\n        // AV test - TV\r\n        AugmentFillColorAct = new QAction(tr(\"Augmented Fill\"), this);\r\n        AugmentFillColorAct->setStatusTip(tr(\"Augmented Fill grid spaces with points\\nFill\"));\r\n        AugmentFillColorAct->setCheckable(1);\r\n        AugmentFillColorAct->setData(ID_MAPBAR_ITEM_AUGMENT_FILL);\r\n        //connect(AugmentFillColorAct, SIGNAL(triggered()), this, SLOT(FillModeTriggered()));\r\n\r\n        fillColorMenu->addAction(STDFillColorAct);\r\n        fillColorMenu->addAction(ContextFillColorAct);\r\n        //fillColorMenu->addAction(AugmentFillColorAct); // AV TV\r\n        fillColorMenu->setDefaultAction(STDFillColorAct);\r\n        fillColorToolButton->setMenu(fillColorMenu);\r\n        fillColorToolButton->setIcon(QIcon(\":/images/win/b-5-8.png\"));\r\n        fillColorToolButton->setCheckable(1);\r\n        connect(fillColorToolButton, SIGNAL(clicked()), this, SLOT(FillButtonTriggered()));\r\n\r\n        QActionGroup* tGroup = new QActionGroup(this);\r\n        tGroup->addAction(STDFillColorAct);\r\n        tGroup->addAction(ContextFillColorAct);\r\n        tGroup->addAction(AugmentFillColorAct); // AV TV\r\n    }\r\n    {\r\n        lineToolButton = new QToolButton;\r\n        lineToolButton->setPopupMode(QToolButton::MenuButtonPopup);\r\n        QMenu *lineToolMenu = new QMenu;\r\n        SelectLineAct = new QAction(tr(\"Line\"), this);\r\n        SelectLineAct->setStatusTip(tr(\"Draw a new line\\nLine\"));\r\n        SelectLineAct->setCheckable(1);\r\n        SelectLineAct->setChecked(1);\r\n        SelectLineAct->setData(ID_MAPBAR_ITEM_LINETOOL);\r\n        connect(SelectLineAct, SIGNAL(triggered()), this, SLOT(LineModeTriggered()));\r\n        SelectPolyLineAct = new QAction(tr(\"Polygon\"), this);\r\n        SelectPolyLineAct->setStatusTip(tr(\"Draw a new polygon\\nPolygon\"));\r\n        SelectPolyLineAct->setCheckable(1);\r\n        SelectPolyLineAct->setData(ID_MAPBAR_ITEM_POLYGON);\r\n        connect(SelectPolyLineAct, SIGNAL(triggered()), this, SLOT(LineModeTriggered()));\r\n        lineToolMenu->addAction(SelectLineAct);\r\n        lineToolMenu->addAction(SelectPolyLineAct);\r\n        lineToolMenu->setDefaultAction(SelectLineAct);\r\n        lineToolButton->setMenu(lineToolMenu);\r\n        lineToolButton->setIcon(QIcon(\":/images/win/b-5-10.png\"));\r\n        lineToolButton->setCheckable(1);\r\n        connect(lineToolButton, SIGNAL(clicked()), this, SLOT(LineButtonTriggered()));\r\n\r\n        QActionGroup* tGroup = new QActionGroup(this);\r\n        tGroup->addAction(SelectLineAct);\r\n        tGroup->addAction(SelectPolyLineAct);\r\n    }\r\n    {\r\n        newisoToolButton = new QToolButton;\r\n        newisoToolButton->setPopupMode(QToolButton::MenuButtonPopup);\r\n        QMenu *isoToolMenu = new QMenu;\r\n        MakeIosAct = new QAction(tr(\"Isovisit\"), this);\r\n        MakeIosAct->setStatusTip(tr(\"Make a new isovist\\nIsovist\"));\r\n        MakeIosAct->setCheckable(1);\r\n        MakeIosAct->setChecked(1);\r\n        MakeIosAct->setData(ID_MAPBAR_ITEM_ISOVIST);\r\n        connect(MakeIosAct, SIGNAL(triggered()), this, SLOT(isoModeTriggered()));\r\n        PartialMakeIosAct = new QAction(tr(\"Partial isovisist\"), this);\r\n        PartialMakeIosAct->setStatusTip(tr(\"Make a new partial isovist\\nPartial Isovist\"));\r\n        PartialMakeIosAct->setCheckable(1);\r\n        PartialMakeIosAct->setData(ID_MAPBAR_ITEM_HALFISOVIST);\r\n        connect(PartialMakeIosAct, SIGNAL(triggered()), this, SLOT(isoModeTriggered()));\r\n        isoToolMenu->addAction(MakeIosAct);\r\n        isoToolMenu->addAction(PartialMakeIosAct);\r\n        isoToolMenu->setDefaultAction(MakeIosAct);\r\n        newisoToolButton->setMenu(isoToolMenu);\r\n        newisoToolButton->setIcon(QIcon(\":/images/win/b-5-12.png\"));\r\n        newisoToolButton->setCheckable(1);\r\n        connect(newisoToolButton, SIGNAL(clicked()), this, SLOT(isoButtonTriggered()));\r\n\r\n        QActionGroup* tGroup = new QActionGroup(this);\r\n        tGroup->addAction(MakeIosAct);\r\n        tGroup->addAction(PartialMakeIosAct);\r\n    }\r\n    {\r\n        JoinToolButton = new QToolButton;\r\n        JoinToolButton->setPopupMode(QToolButton::MenuButtonPopup);\r\n        QMenu *joinToolMenu = new QMenu;\r\n        JoinAct = new QAction(tr(\"Link\"), this);\r\n        JoinAct->setStatusTip(tr(\"merge points together\\nLink\"));\r\n        JoinAct->setCheckable(1);\r\n        JoinAct->setChecked(1);\r\n        JoinAct->setData(ID_MAPBAR_ITEM_JOIN);\r\n        connect(JoinAct, SIGNAL(triggered()), this, SLOT(joinTriggered()));\r\n        JoinUnlinkAct = new QAction(tr(\"unLink\"), this);\r\n        JoinUnlinkAct->setStatusTip(tr(\"unmerge points\\nUnlink\"));\r\n        JoinUnlinkAct->setCheckable(1);\r\n        JoinUnlinkAct->setData(ID_MAPBAR_ITEM_UNJOIN);\r\n        connect(JoinUnlinkAct, SIGNAL(triggered()), this, SLOT(joinTriggered()));\r\n        joinToolMenu->addAction(JoinAct);\r\n        joinToolMenu->addAction(JoinUnlinkAct);\r\n        joinToolMenu->setDefaultAction(JoinAct);\r\n        JoinToolButton->setMenu(joinToolMenu);\r\n        JoinToolButton->setIcon(QIcon(\":/images/win/b-5-16.png\"));\r\n        JoinToolButton->setCheckable(1);\r\n        connect(JoinToolButton, SIGNAL(clicked()), this, SLOT(joinButtonTriggered()));\r\n\r\n        QActionGroup* tGroup = new QActionGroup(this);\r\n        tGroup->addAction(JoinAct);\r\n        tGroup->addAction(JoinUnlinkAct);\r\n    }\r\n\r\n    SelectButton = new QToolButton;\r\n    SelectButton->setStatusTip(tr(\"Select a grid point\\nSelect\"));\r\n    SelectButton->setIcon(QIcon(\":/images/win/b-5-1.png\"));\r\n    SelectButton->setCheckable(1);\r\n    connect(SelectButton, SIGNAL(clicked()), this, SLOT(SelectButtonTriggered()));\r\n    DragButton = new QToolButton;\r\n    DragButton->setStatusTip(tr(\"Click and drag to move map\\nDrag\"));\r\n    DragButton->setIcon(QIcon(\":/images/win/b-5-2.png\"));\r\n    DragButton->setCheckable(1);\r\n    connect(DragButton, SIGNAL(clicked()), this, SLOT(DragButtonTriggered()));\r\n    SelectPenButton = new QToolButton;\r\n    SelectPenButton->setStatusTip(tr(\"Fill grid spaces individually (or click on a filled space to clear)\\nPencil\"));\r\n    SelectPenButton->setIcon(QIcon(\":/images/win/b-5-9.png\"));\r\n    SelectPenButton->setCheckable(1);\r\n    connect(SelectPenButton, SIGNAL(clicked()), this, SLOT(SelectPenTriggered()));\r\n    AxialMapButton = new QToolButton;\r\n    AxialMapButton->setStatusTip(tr(\"Construct all line axial map from a seed point\\nAxial Map\"));\r\n    AxialMapButton->setIcon(QIcon(\":/images/win/b-5-14.png\"));\r\n    AxialMapButton->setCheckable(1);\r\n    connect(AxialMapButton, SIGNAL(clicked()), this, SLOT(AxialMapTriggered()));\r\n    StepDepthButton = new QToolButton;\r\n    StepDepthButton->setStatusTip(tr(\"Step depth from current selection\\nStep Depth\"));\r\n    StepDepthButton->setIcon(QIcon(\":/images/win/b-5-15.png\"));\r\n    StepDepthButton->setCheckable(1);\r\n    connect(StepDepthButton, SIGNAL(clicked()), this, SLOT(StepDepthTriggered()));\r\n\r\n    QButtonGroup* pointerTypeGroup = new QButtonGroup;\r\n    pointerTypeGroup->addButton(JoinToolButton, ID_MAPBAR_JOIN_ITEMS);\r\n    pointerTypeGroup->addButton(zoomToolButton, ID_MAPBAR_ZOOM_ITEMS);\r\n    pointerTypeGroup->addButton(fillColorToolButton, ID_MAPBAR_FILL_ITEMS);\r\n    pointerTypeGroup->addButton(lineToolButton, ID_MAPBAR_DRAW_ITEMS);\r\n    pointerTypeGroup->addButton(newisoToolButton, ID_MAPBAR_ISOVIST_ITEMS);\r\n    pointerTypeGroup->addButton(SelectButton, ID_MAPBAR_ITEM_SELECT);\r\n    pointerTypeGroup->addButton(DragButton, ID_MAPBAR_ITEM_MOVE);\r\n    pointerTypeGroup->addButton(SelectPenButton, ID_MAPBAR_ITEM_PENCIL);\r\n    pointerTypeGroup->addButton(AxialMapButton, ID_MAPBAR_ITEM_AL2);\r\n    pointerTypeGroup->addButton(StepDepthButton, ID_MAPBAR_ITEM_PD);\r\n\r\n    {\r\n        toolsImportTracesAct = new QAction(QIcon(\":/images/win/b-4-1.png\"), tr(\"Import Traces\"), this);\r\n        toolsImportTracesAct->setStatusTip(tr(\"Import agent traces from a file\\nImport Traces\"));\r\n        connect(toolsImportTracesAct, SIGNAL(triggered()), this, SLOT(OnToolsImportTraces()));\r\n\r\n        addAgentAct = new QAction(QIcon(\":/images/win/b-4-2.png\"), tr(\"Add Agent\"), this);\r\n        addAgentAct->setCheckable(1);\r\n        connect(addAgentAct, SIGNAL(triggered()), this, SLOT(OnAddAgent()));\r\n\r\n        QActionGroup *tGroup = new QActionGroup(this);\r\n        tGroup->addAction(toolsImportTracesAct);\r\n        tGroup->addAction(addAgentAct);\r\n    }\r\n    {\r\n        toolsAgentsPlayAct = new QAction(QIcon(\":/images/win/b-4-3.png\"), tr(\"Agents Play\"), this);\r\n        toolsAgentsPlayAct->setCheckable(1);\r\n        connect(toolsAgentsPlayAct, SIGNAL(triggered()), this, SLOT(OnToolsAgentsPlay()));\r\n\r\n        toolsAgentsPauseAct = new QAction(QIcon(\":/images/win/b-4-4.png\"), tr(\"Agents Pause\"), this);\r\n        toolsAgentsPauseAct->setCheckable(1);\r\n        connect(toolsAgentsPauseAct, SIGNAL(triggered()), this, SLOT(OnToolsAgentsPause()));\r\n\r\n        toolsAgentsStopAct = new QAction(QIcon(\":/images/win/b-4-5.png\"), tr(\"Agents Stop\"), this);\r\n        connect(toolsAgentsStopAct, SIGNAL(triggered()), this, SLOT(OnToolsAgentsStop()));\r\n\r\n        QActionGroup *tGroup = new QActionGroup(this);\r\n        tGroup->addAction(toolsAgentsPlayAct);\r\n        tGroup->addAction(toolsAgentsPauseAct);\r\n        tGroup->addAction(toolsAgentsStopAct);\r\n    }\r\n    agentTrailsAct = new QAction(QIcon(\":/images/win/b-4-6.png\"), tr(\"Agent Trails\"), this);\r\n    agentTrailsAct->setCheckable(1);\r\n    connect(agentTrailsAct, SIGNAL(triggered()), this, SLOT(OnAgentTrails()));\r\n    {\r\n        thirdRotAct = new QAction(QIcon(\":/images/win/b-4-7.png\"), tr(\"3D Rot\"), this);\r\n        thirdRotAct->setCheckable(1);\r\n        connect(thirdRotAct, SIGNAL(triggered()), this, SLOT(On3dRot()));\r\n\r\n        thirdPanAct = new QAction(QIcon(\":/images/win/b-4-8.png\"), tr(\"3D Pan\"), this);\r\n        thirdPanAct->setCheckable(1);\r\n        connect(thirdPanAct, SIGNAL(triggered()), this, SLOT(On3dPan()));\r\n\r\n        thirdZoomAct = new QAction(QIcon(\":/images/win/b-4-9.png\"), tr(\"3D Zoom\"), this);\r\n        thirdZoomAct->setCheckable(1);\r\n        connect(thirdZoomAct, SIGNAL(triggered()), this, SLOT(On3dZoom()));\r\n\r\n        playLoopAct = new QAction(QIcon(\":/images/win/b-4-10.png\"), tr(\"Play Loop\"), this);\r\n        playLoopAct->setCheckable(1);\r\n        connect(playLoopAct, SIGNAL(triggered()), this, SLOT(OnPlayLoop()));\r\n\r\n        QActionGroup *tGroup = new QActionGroup(this);\r\n        tGroup->addAction(thirdRotAct);\r\n        tGroup->addAction(thirdPanAct);\r\n        tGroup->addAction(thirdZoomAct);\r\n        tGroup->addAction(playLoopAct);\r\n        tGroup->addAction(addAgentAct);\r\n    }\r\n    thirdFilledAct = new QAction(QIcon(\":/images/win/b-4-11.png\"), tr(\"3D Filled\"), this);\r\n    thirdFilledAct->setCheckable(1);\r\n    connect(thirdFilledAct, SIGNAL(triggered()), this, SLOT(On3dFilled()));\r\n}\r\n\r\nvoid MainWindow::createMenus()\r\n{\r\n    fileMenu = menuBar()->addMenu(tr(\"&File\"));\r\n    fileMenu->addAction(newAct);\r\n    fileMenu->addAction(openAct);\r\n    fileMenu->addAction(closeAct);\r\n    fileMenu->addAction(saveAct);\r\n    fileMenu->addAction(saveAsAct);\r\n    fileMenu->addSeparator();\r\n    fileMenu->addAction(propertiesAct);\r\n    fileMenu->addSeparator();\r\n    fileMenu->addAction(printAct);\r\n    fileMenu->addAction(printPreviewAct);\r\n    fileMenu->addAction(printSetupAct);\r\n    separatorAct = fileMenu->addSeparator();\r\n    for (int i = 0; i < MaxRecentFiles; ++i)\r\n        fileMenu->addAction(recentFileActs[i]);\r\n    fileMenu->addSeparator();\r\n    fileMenu->addAction(exitAct);\r\n    updateRecentFileActions(mSettings.readSetting(SettingTag::recentFileList).toStringList());\r\n\r\n    editMenu = menuBar()->addMenu(tr(\"&Edit\"));\r\n    editMenu->addAction(undoAct);\r\n    editMenu->addSeparator();\r\n    editMenu->addAction(copyDataAct);\r\n    editMenu->addAction(copyScreenAct);\r\n    editMenu->addAction(exportScreenAct);\r\n    editMenu->addSeparator();\r\n    editMenu->addAction(clearAct);\r\n    editMenu->addSeparator();\r\n    editMenu->addAction(selectByQueryAct);\r\n    //editMenu->addAction(zoomToSelectionAct);\r\n    editMenu->addAction(selectionToLayerAct);\r\n\r\n    mapMenu = menuBar()->addMenu(tr(\"&Map\"));\r\n    mapMenu->addAction(mapNewAct);\r\n    mapMenu->addAction(deleteAct);\r\n    mapMenu->addSeparator();\r\n    mapMenu->addAction(convertActiveMapAct);\r\n    mapMenu->addAction(convertDrawingMapAct);\r\n    mapMenu->addAction(convertMapShapesAct);\r\n    mapMenu->addSeparator();\r\n    mapMenu->addAction(importAct);\r\n    exportSubMenu = mapMenu->addMenu(tr(\"&Export\"));\r\n    exportSubMenu->addAction(exportAct);\r\n    exportSubMenu->addAction(exportGeometryAct);\r\n    exportSubMenu->addAction(exportLinksAct);\r\n    exportSubMenu->addAction(exportAxialConnectionsDotAct);\r\n    exportSubMenu->addAction(exportAxialConnectionsPairAct);\r\n    exportSubMenu->addAction(exportSegmentConnectionsPairAct);\r\n    exportSubMenu->addAction(exportPointmapConnectionsPairAct);\r\n\r\n    attributesMenu = menuBar()->addMenu(tr(\"&Attributes\"));\r\n    attributesMenu->addAction(addColumAct);\r\n    attributesMenu->addSeparator();\r\n    attributesMenu->addAction(renameColumnAct);\r\n    attributesMenu->addAction(updateColumAct);\r\n    attributesMenu->addAction(removeColumAct);\r\n    attributesMenu->addAction(columnPropertiesAct);\r\n    attributesMenu->addSeparator();\r\n    attributesMenu->addAction(pushValueAct);\r\n\r\n    toolsMenu = menuBar()->addMenu(tr(\"&Tools\"));\r\n    visibilitySubMenu = toolsMenu->addMenu(tr(\"&Visibility\"));\r\n    visibilitySubMenu->addAction(SetGridAct);\r\n    visibilitySubMenu->addAction(makeVisibilityGraphAct);\r\n    visibilitySubMenu->addAction(unmakeVisibilityGraphAct);\r\n    visibilitySubMenu->addAction(importVGALinksAct);\r\n    visibilitySubMenu->addAction(generateIsovistsAct);\r\n    visibilitySubMenu->addAction(makeIsovistPathAct);\r\n    visibilitySubMenu->addSeparator();\r\n    visibilitySubMenu->addAction(runVisibilityGraphAnalysisAct);\r\n    stepDepthSubMenu = visibilitySubMenu->addMenu(tr(\"Step &Depth\"));\r\n    stepDepthSubMenu->addAction(visibilityStepAct);\r\n    stepDepthSubMenu->addAction(metricStepAct);\r\n    stepDepthSubMenu->addAction(angularStepAct);\r\n    visibilitySubMenu->addSeparator();\r\n    visibilitySubMenu->addAction(convertDataMapLinesAct);\r\n    agentToolsSubMenu = toolsMenu->addMenu(tr(\"&Agent Tools\"));\r\n    agentToolsSubMenu->addAction(runAgentAnalysisAct);\r\n    agentToolsSubMenu->addAction(loadAgentProgramAct);\r\n\r\n    axialSubMenu = toolsMenu->addMenu(tr(\"A&xial / Convex / Pesh\"));\r\n    axialSubMenu->addAction(runGraphAnaysisAct);\r\n    axialSubMenu->addAction(stepDepthAct);\r\n    axialSubMenu->addSeparator();\r\n    axialSubMenu->addAction(reduceToFewestLineMapAct);\r\n    axialSubMenu->addSeparator();\r\n    axialSubMenu->addAction(convertDataMapPointsAct);\r\n    axialSubMenu->addAction(loadUnlinksFromFileAct);\r\n\r\n    segmentSubMenu = toolsMenu->addMenu(tr(\"&Segment\"));\r\n    segmentSubMenu->addAction(runAngularSegmentAnalysisAct);\r\n    segmentSubMenu->addAction(runTopologicalOrMetricAnalysisAct);\r\n    segmentStepDepthSubMenu = segmentSubMenu->addMenu(tr(\"Step &Depth\"));\r\n    segmentStepDepthSubMenu->addAction(segmentAngularStepAct);\r\n    segmentStepDepthSubMenu->addAction(topologicalStepAct);\r\n    segmentStepDepthSubMenu->addAction(segmentMetricStepAct);\r\n\r\n    toolsMenu->addSeparator();\r\n    toolsMenu->addAction(optionsAct);\r\n\r\n    viewMenu = menuBar()->addMenu(tr(\"&View\"));\r\n    viewMenu->addAction(RecentAct);\r\n    viewMenu->addAction(showGridAct);\r\n    viewMenu->addAction(attributeSummaryAct);\r\n\r\n    windowMenu = menuBar()->addMenu(tr(\"&Window\"));\r\n    windowMenu->addAction(mapAct);\r\n    windowMenu->addAction(scatterPlotAct);\r\n    windowMenu->addAction(tableAct);\r\n    windowMenu->addAction(thirdDViewAct);\r\n    windowMenu->addAction(glViewAct);\r\n    windowMenu->addSeparator();\r\n    windowMenu->addAction(colourRangeAct);\r\n    windowMenu->addSeparator();\r\n    windowMenu->addAction(cascadeAct);\r\n    windowMenu->addAction(tileAct);\r\n    windowMenu->addAction(arrangeIconsAct);\r\n\r\n    helpMenu = menuBar()->addMenu(tr(\"&Help\"));\r\n    helpMenu->addAction(onlineBugsAct);\r\n    helpMenu->addAction(onlineHandbookAct);\r\n    helpMenu->addAction(onlineTutorialsAct);\r\n    helpMenu->addAction(onlineScriptingManualAct);\r\n    helpMenu->addSeparator();\r\n    helpMenu->addAction(aboutDepthMapAct);\r\n\r\n    for(auto &&mainWindowModule: mainWindowPluginRegistry.getModules()) {\r\n        mainWindowModule->createMenus(this);\r\n    }\r\n\r\n    connect(viewMenu, SIGNAL(aboutToShow()), this, SLOT(updateViewMenu()));\r\n    connect(visibilitySubMenu, SIGNAL(aboutToShow()), this, SLOT(updateVisibilitySubMenu()));\r\n    connect(stepDepthSubMenu, SIGNAL(aboutToShow()), this, SLOT(updateStepDepthSubMenu()));\r\n    connect(agentToolsSubMenu, SIGNAL(aboutToShow()), this, SLOT(updateAgentToolsSubMenu()));\r\n    connect(segmentSubMenu, SIGNAL(aboutToShow()), this, SLOT(updateSegmentSubMenu()));\r\n    connect(segmentStepDepthSubMenu, SIGNAL(aboutToShow()), this, SLOT(updateSegmentStepDepthSubMenu()));\r\n    connect(axialSubMenu, SIGNAL(aboutToShow()), this, SLOT(updateAxialSubMenu()));\r\n    connect(attributesMenu, SIGNAL(aboutToShow()), this, SLOT(updateAttributesMenu()));\r\n    connect(mapMenu, SIGNAL(aboutToShow()), this, SLOT(updateMapMenu()));\r\n    connect(editMenu, SIGNAL(aboutToShow()), this, SLOT(updateEditMenu()));\r\n    connect(fileMenu, SIGNAL(aboutToShow()), this, SLOT(updateFileMenu()));\r\n    connect(windowMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowMenu()));\r\n}\r\n\r\nvoid MainWindow::createToolBars()\r\n{\r\n    fileToolBar = addToolBar(tr(\"File\"));\r\n    fileToolBar->addAction(newAct);\r\n    fileToolBar->addAction(openAct);\r\n    fileToolBar->addAction(importAct);\r\n    fileToolBar->addAction(saveAct);\r\n    fileToolBar->addSeparator();\r\n    fileToolBar->addAction(addColumAct);\r\n    fileToolBar->addAction(updateColumAct);\r\n    fileToolBar->addAction(removeColumAct);\r\n    fileToolBar->addAction(pushValueAct);\r\n    fileToolBar->addSeparator();\r\n    fileToolBar->addAction(invertColorAct);\r\n    fileToolBar->setIconSize(QSize(16,16));\r\n    fileToolBar->setMovable(0);\r\n\r\n    editToolBar = addToolBar(tr(\"Edit\"));\r\n    editToolBar->addWidget(SelectButton);\r\n    editToolBar->addWidget(DragButton);\r\n    editToolBar->addWidget(zoomToolButton);\r\n    editToolBar->addSeparator();\r\n    //editToolBar->addAction(zoomToAct);\r\n    editToolBar->addAction(RecentAct);\r\n    editToolBar->addSeparator();\r\n    editToolBar->addAction(SetGridAct);\r\n    editToolBar->addWidget(fillColorToolButton);\r\n    editToolBar->addWidget(SelectPenButton);\r\n    editToolBar->addWidget(lineToolButton);\r\n    editToolBar->addSeparator();\r\n    editToolBar->addWidget(newisoToolButton);\r\n    editToolBar->addWidget(AxialMapButton);\r\n    editToolBar->addWidget(StepDepthButton);\r\n    editToolBar->addWidget(JoinToolButton);\r\n    editToolBar->setIconSize(QSize(16,16));\r\n    editToolBar->setMovable(0);\r\n\r\n    x_coord = new QComboBox(this);\r\n    x_coord->setMinimumContentsLength(20);\r\n    y_coord = new QComboBox(this);\r\n    y_coord->setMinimumContentsLength(20);\r\n\r\n    connect(x_coord, SIGNAL(currentIndexChanged(const QString &)),\r\n            this, SLOT(OnSelchangeViewSelector_X(const QString &)));\r\n    connect(y_coord, SIGNAL(currentIndexChanged(const QString &)),\r\n            this, SLOT(OnSelchangeViewSelector_Y(const QString &)));\r\n\r\n\r\n    QAction* xx = new QAction(tr(\"X = \"), this);\r\n    xx->setEnabled(0);\r\n    QAction* yy = new QAction(tr(\"Y = \"), this);\r\n    yy->setEnabled(0);\r\n\r\n    plotToolBar = addToolBar(tr(\"PlotEdit\"));\r\n    plotToolBar->addAction(xx);\r\n    plotToolBar->addWidget(x_coord);\r\n    plotToolBar->addSeparator();\r\n    plotToolBar->addAction(yy);\r\n    plotToolBar->addWidget(y_coord);\r\n    plotToolBar->addSeparator();\r\n    plotToolBar->addAction(toggleColor);\r\n    plotToolBar->addAction(toggleOrg);\r\n    plotToolBar->addAction(viewTrend);\r\n    plotToolBar->addAction(yx);\r\n    plotToolBar->addAction(Rtwo);\r\n    plotToolBar->setIconSize(QSize(16,16));\r\n    plotToolBar->setMovable(0);\r\n\r\n    thirdViewToolBar = addToolBar(tr(\"3DView\"));\r\n    thirdViewToolBar->addAction(toolsImportTracesAct);\r\n    thirdViewToolBar->addAction(addAgentAct);\r\n    thirdViewToolBar->addSeparator();\r\n    thirdViewToolBar->addAction(toolsAgentsPlayAct);\r\n    thirdViewToolBar->addAction(toolsAgentsPauseAct);\r\n    thirdViewToolBar->addAction(toolsAgentsStopAct);\r\n    thirdViewToolBar->addSeparator();\r\n    thirdViewToolBar->addAction(agentTrailsAct);\r\n    thirdViewToolBar->addSeparator();\r\n    thirdViewToolBar->addAction(thirdRotAct);\r\n    thirdViewToolBar->addAction(thirdPanAct);\r\n    thirdViewToolBar->addAction(thirdZoomAct);\r\n    thirdViewToolBar->addAction(playLoopAct);\r\n    thirdViewToolBar->addSeparator();\r\n    thirdViewToolBar->addAction(thirdFilledAct);\r\n    thirdViewToolBar->setIconSize(QSize(16,16));\r\n    thirdViewToolBar->setMovable(0);\r\n\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-1.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-2.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-3.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-4.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-5.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-6.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-7.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-8.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-9.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-10.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-11.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-12.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-13.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-14.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-15.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-16.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-17.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-18.png\")));\r\n    m_tree_icon.push_back(QIcon(tr(\":/images/win/b-1-19.png\")));\r\n}\r\n"
  },
  {
    "path": "depthmapX/mainwindow.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef MAINWINDOW_H\r\n#define MAINWINDOW_H\r\n\r\n#include \"depthmapX/indexWidget.h\"\r\n#include \"depthmapX/treeWindow.h\"\r\n#include \"depthmapX/GraphDoc.h\"\r\n#include \"depthmapX/compatibilitydefines.h\"\r\n#include \"depthmapX/settings.h\"\r\n#include \"depthmapX/mainwindowmoduleregistry.hpp\"\r\n\r\n#include \"depthmapX/dialogs/ColourScaleDlg.h\"\r\n#include \"depthmapX/views/glview/glview.h\"\r\n\r\n#include \"version.h\"\r\n\r\n#include <QMainWindow>\r\n#include <QButtonGroup>\r\n#include <QComboBox>\r\n\r\nclass ItemTreeEntry\r\n{\r\npublic:\r\n   ItemTreeEntry() { m_type = -1; m_cat = -1; m_subcat = -1; }\r\n   ItemTreeEntry(char t, short c, short sc)\r\n   { m_type = t; m_cat = c; m_subcat = sc; }\r\n   char m_type;\r\n   short m_cat;\r\n   short m_subcat;\r\n};\r\n\r\nclass QDepthmapView;\r\nclass QGraphDoc;\r\n\r\nQT_BEGIN_NAMESPACE\r\nclass QAction;\r\nclass QMenu;\r\nclass QMdiArea;\r\nclass QMdiSubWindow;\r\nclass QSignalMapper;\r\nclass QToolButton;\r\nQT_END_NAMESPACE\r\n\r\nconst int  MaxRecentFiles = 5;\r\n\r\nenum { FOCUSGRAPH = 1001, AllTransactionsDone = 1002 };\r\n\r\nclass QmyEvent : public QEvent\r\n{\r\npublic:\r\n    void* wparam;\r\n    int lparam;\r\n    QmyEvent(Type type, void* wp, int lp);\r\n\r\n};\r\n\r\nclass MainWindow : public QMainWindow\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    MainWindow(const QString &fileToLoad, Settings &settings);\r\n   // Graph analysis options\r\n    QString m_formula_cache;\r\n    Options m_options;\r\n    QRgb m_foreground;\r\n    QRgb m_background;\r\n\r\n    MainWindowModuleRegistry mainWindowPluginRegistry;\r\n\r\n    QGraphDoc *activeMapDoc();\r\n\r\n    bool m_simpleVersion;  // bool that replaces compile defines\r\n\r\n    void RedoPlotViewMenu(QGraphDoc* pDoc);\r\n    void updateToolbar();\r\n    void update3DToolbar();\r\n    void showContextMenu(QPoint &point);\r\n    void UpdateStatus(QString s1, QString s2, QString s3);\r\n    void updateGLWindows(bool datasetChanged, bool recentreView);\r\n    void loadFile(QString fileName);\r\n\r\n    void chooseAttributeOnIndex(int attributeIdx);\r\n\r\nprotected:\r\n    QGraphDoc* m_treeDoc;\r\n    void closeEvent(QCloseEvent *event);\r\n    bool eventFilter(QObject *object, QEvent *e);\r\n    virtual void actionEvent( QActionEvent * event );\r\n\r\nprivate slots:\r\n    void updateActiveWindows();\r\n    void updateSubWindowTitles(QString newTitle);\r\n    void updateWindowMenu();\r\n    void setActiveSubWindow(QWidget *window);\r\n    void OnSelchangingTree(QTreeWidgetItem* item, int col);\r\n    void OnSelchangingList();\r\n    void OnFileNew();\r\n    void OnFileImport();\r\n    void OnFileOpen();\r\n    void OnFileClose();\r\n    void OnFileSave();\r\n    void OnFileSaveAs();\r\n    void OnFileProperties();\r\n    void OnFilePrint();\r\n    void OnFilePrintPreview();\r\n    void OnFilePrintSetup();\r\n    void OnEditUndo();\r\n    void OnEditCopyData();\r\n    void OnEditCopy();\r\n    void OnEditSave();\r\n    void OnEditClear();\r\n    void OnEditQuery();\r\n    void OnViewZoomsel();\r\n    void OnEditSelectToLayer();\r\n    void OnAppAbout();\r\n    void OnLayerNew();\r\n    void OnLayerDelete();\r\n    void OnLayerConvert();\r\n    void OnLayerConvertDrawing();\r\n    void OnConvertMapShapes();\r\n    void OnFileExport();\r\n    void OnFileExportMapGeometry();\r\n    void OnFileExportLinks();\r\n    void OnAxialConnectionsExportAsDot();\r\n    void OnAxialConnectionsExportAsPairCSV();\r\n    void OnSegmentConnectionsExportAsPairCSV();\r\n    void OnPointmapExportConnectionsAsCSV();\r\n    void OnAddColumn();\r\n    void OnRenameColumn();\r\n    void OnUpdateColumn();\r\n    void OnRemoveColumn();\r\n    void OnColumnProperties();\r\n    void OnPushToLayer();\r\n    void OnToolsMakeGraph();\r\n    void OnToolsUnmakeGraph();\r\n    void OnToolsImportVGALinks();\r\n    void OnToolsGenerateIsovistsFromFile();\r\n    void OnToolsIsovistpath();\r\n    void OnToolsAgentLoadProgram();\r\n    void OnToolsRunAxa();\r\n    void OnToolsPD();\r\n    void OnToolsAPD();\r\n    void OnToolsMakeFewestLineMap();\r\n    void OnToolsAxialConvShapeMap();\r\n    void OnToolsLineLoadUnlinks();\r\n    void OnToolsRunSeg();\r\n    void OnToolsTopomet();\r\n    void OnToolsTPD();\r\n    void OnToolsMPD();\r\n    void OnToolsPointConvShapeMap();\r\n    void OnToolsOptions();\r\n    void OnViewCentreView();\r\n    void OnViewShowGrid();\r\n    void OnViewSummary();\r\n    void OnViewColourRange();\r\n    void OnHelpBugs();\r\n    void OnHelpManual();\r\n    void OnHelpTutorials();\r\n    void OnHelpSalaManual();\r\n    void OnEditGrid();\r\n    void OnWindowMap();\r\n    void OnViewTable();\r\n    void OnWindow3dView();\r\n    void OnWindowGLView();\r\n    void OnViewScatterplot();\r\n    void OnToolsRun();\r\n    void OnToolsAgentRun();\r\n// MapView message\r\n    void zoomModeTriggered();\r\n    void FillModeTriggered();\r\n    void LineModeTriggered();\r\n    void isoModeTriggered();\r\n    void joinTriggered();\r\n    void zoomButtonTriggered();\r\n    void FillButtonTriggered();\r\n    void LineButtonTriggered();\r\n    void isoButtonTriggered();\r\n    void joinButtonTriggered();\r\n    void openRecentFile();\r\n    void StepDepthTriggered();\r\n    void AxialMapTriggered();\r\n    void SelectPenTriggered();\r\n    void DragButtonTriggered();\r\n    void SelectButtonTriggered();\r\n    void OnSelchangeViewSelector_X(const QString &string);\r\n    void OnSelchangeViewSelector_Y(const QString &string);\r\n    void OninvertColor();\r\n    void OnzoomTo();\r\n// PlotView message\r\n    void OntoggleColor();\r\n    void OntoggleOrg();\r\n    void OnviewTrend();\r\n    void OnYX();\r\n    void OnRtwo();\r\n//Menu Update slots\r\n    void updateViewMenu();\r\n    void updateAttributesMenu();\r\n    void updateMapMenu();\r\n    void updateEditMenu();\r\n    void updateFileMenu();\r\n    void updateVisibilitySubMenu();\r\n    void updateStepDepthSubMenu();\r\n    void updateSegmentStepDepthSubMenu();\r\n    void updateAgentToolsSubMenu();\r\n    void updateSegmentSubMenu();\r\n    void updateAxialSubMenu();\r\n//3D View ToolBar slots\r\n    void OnToolsImportTraces();\r\n    void OnAddAgent();\r\n    void OnToolsAgentsPlay();\r\n    void OnToolsAgentsPause();\r\n    void OnToolsAgentsStop();\r\n    void OnAgentTrails();\r\n    void On3dRot();\r\n    void On3dPan();\r\n    void On3dZoom();\r\n    void OnPlayLoop();\r\n    void On3dFilled();\r\nprivate:\r\n    int OnFocusGraph(QGraphDoc* pDoc, int lParam);\r\n    void setCurrentFile(const QString &fileName);\r\n    void updateRecentFileActions(const QStringList &files);\r\n    QString strippedName(const QString &fullFileName);\r\n\r\n    void createActions();\r\n    void createMenus();\r\n    void createToolBars();\r\n    void createStatusBar();\r\n\r\n    // Settings Files\r\n    Settings &mSettings;\r\n    void readSettings();\r\n    void writeSettings();\r\n\r\n    bool m_defaultMapWindowIsLegacy;\r\n\r\n    QWidget * setupAttributesListWidget();\r\n    MapView *createMapView();\r\n    MapView *activeMapView();\r\n    QMdiSubWindow *findMapView(const QString &fileName);\r\n//////////////////////////////////////////////////////\r\n//\ttreeContorl\r\n    QVector<QIcon> m_tree_icon;\r\n    std::map<int, std::string> m_view_map_entries;\r\n\r\n    std::vector<bool> m_attribute_locked;\r\n    std::map<QTreeWidgetItem*, ItemTreeEntry> m_treegraphmap;\r\n    std::map<QTreeWidgetItem*, ItemTreeEntry> m_treedrawingmap;\r\n    QTreeWidgetItem* m_topgraph;\r\n    QTreeWidgetItem* m_backgraph;\r\n    QTreeWidgetItem* m_treeroots[5];\r\n\r\n    void MakeTree();\r\n    void MakeGraphTree();\r\n    void MakeDrawingTree();\r\n    void ClearGraphTree();\r\n    void MakeAttributeList();\r\n    void SetAttributeChecks();\r\n    void SetDrawingTreeChecks();\r\n    void SetGraphTreeChecks();\r\n\r\n////////////////////////////////////////////////////////////\r\n\r\n    QMdiArea *mdiArea;\r\n    QSignalMapper *windowMapper;\r\n    IndexWidget* m_indexWidget;\r\n    AttribWindow* m_attrWindow;\r\n    CColourScaleDlg m_wndColourScale;\r\n\r\n    QLabel *g_size;\r\n    QLabel *g_pos_curr;\r\n    QLabel *g_info_curr;\r\n\r\n    QMenu *fileMenu;\r\n    QMenu *editMenu;\r\n    QMenu *mapMenu;\r\n    QMenu *exportSubMenu;\r\n    QMenu *attributesMenu;\r\n    QMenu *toolsMenu;\r\n    QMenu *visibilitySubMenu;\r\n    QMenu *stepDepthSubMenu;\r\n    QMenu *agentToolsSubMenu;\r\n    QMenu *axialSubMenu;\r\n    QMenu *segmentSubMenu;\r\n    QMenu *segmentStepDepthSubMenu;\r\n    QMenu *viewMenu;\r\n    QMenu *windowMenu;\r\n    QMenu *helpMenu;\r\n\r\n    QToolBar *fileToolBar;\r\n    QToolBar *editToolBar;\r\n    QToolBar *plotToolBar;\r\n    QToolBar *thirdViewToolBar;\r\n    QToolButton *fillColorToolButton;\r\n    QToolButton *zoomToolButton;\r\n    QToolButton *lineToolButton;\r\n    QToolButton *newisoToolButton;\r\n    QToolButton *JoinToolButton;\r\n    QToolButton *SelectButton;\r\n    QToolButton *DragButton;\r\n    QToolButton *SelectPenButton;\r\n    QToolButton *AxialMapButton;\r\n    QToolButton *StepDepthButton;\r\n    QToolButton *attr_add_button;\r\n    QToolButton *attr_del_button;\r\n\r\n\r\n    //File Menu Actions\r\n    QAction *newAct;\r\n    QAction *openAct;\r\n    QAction *closeAct;\r\n    QAction *saveAct;\r\n    QAction *saveAsAct;\r\n    QAction *propertiesAct;\r\n    QAction *printAct;\r\n    QAction *printPreviewAct;\r\n    QAction *printSetupAct;\r\n    QAction *recentFileActs[MaxRecentFiles];\r\n    QAction *separatorAct;\r\n    QAction *exitAct;\r\n\r\n    //Edit Menu Actions\r\n    QAction *undoAct;\r\n    QAction *copyDataAct;\r\n    QAction *copyScreenAct;\r\n    QAction *exportScreenAct;\r\n    QAction *clearAct;\r\n    QAction *selectByQueryAct;\r\n    QAction *selectionToLayerAct;\r\n\r\n    //Map Menu Actions\r\n    QAction *mapNewAct;\r\n    QAction *deleteAct;\r\n    QAction *convertActiveMapAct;\r\n    QAction *convertDrawingMapAct;\r\n    QAction *convertMapShapesAct;\r\n    QAction *importAct;\r\n    QAction *exportAct;\r\n    QAction *exportGeometryAct;\r\n    QAction *exportLinksAct;\r\n    QAction *exportAxialConnectionsDotAct;\r\n    QAction *exportAxialConnectionsPairAct;\r\n    QAction *exportSegmentConnectionsPairAct;\r\n    QAction *exportPointmapConnectionsPairAct;\r\n\r\n    //Attributes Menu Actions\r\n    QAction *renameColumnAct;\r\n    QAction *columnPropertiesAct;\r\n\r\n    //Tools Menu Actions\r\n    QAction *makeVisibilityGraphAct;\r\n    QAction *unmakeVisibilityGraphAct;\r\n    QAction *importVGALinksAct;\r\n    QAction *generateIsovistsAct;\r\n    QAction *makeIsovistPathAct;\r\n    QAction *runVisibilityGraphAnalysisAct;\r\n    QAction *visibilityStepAct;\r\n    QAction *metricStepAct;\r\n    QAction *angularStepAct;\r\n    QAction *convertDataMapLinesAct;\r\n    QAction *runAgentAnalysisAct;\r\n    QAction *loadAgentProgramAct;\r\n    QAction *runGraphAnaysisAct;\r\n    QAction *stepDepthAct;\r\n    QAction *reduceToFewestLineMapAct;\r\n    QAction *convertDataMapPointsAct;\r\n    QAction *loadUnlinksFromFileAct;\r\n    QAction *runAngularSegmentAnalysisAct;\r\n    QAction *runTopologicalOrMetricAnalysisAct;\r\n    QAction *segmentAngularStepAct;\r\n    QAction *topologicalStepAct;\r\n    QAction *segmentMetricStepAct;\r\n    QAction *optionsAct;\r\n\r\n    //View Menu Actions\r\n    QAction *showGridAct;\r\n    QAction *attributeSummaryAct;\r\n\r\n    //Window Menu Actions\r\n    QAction *mapAct;\r\n    QAction *scatterPlotAct;\r\n    QAction *tableAct;\r\n    QAction *thirdDViewAct;\r\n    QAction *glViewAct;\r\n    QAction *colourRangeAct;\r\n    QAction *cascadeAct;\r\n    QAction *tileAct;\r\n    QAction *arrangeIconsAct;\r\n\r\n    //Help Menu Actions\r\n    QAction *onlineBugsAct;\r\n    QAction *onlineHandbookAct;\r\n    QAction *onlineTutorialsAct;\r\n    QAction *onlineScriptingManualAct;\r\n    QAction *aboutDepthMapAct;\r\n\r\n//depthmapX Contorl\r\n    QAction *addColumAct;\r\n    QAction *updateColumAct;\r\n    QAction *removeColumAct;\r\n    QAction *pushValueAct;\r\n    QAction *invertColorAct;\r\n    QAction *zoomInAct;\r\n    QAction *zoomOutAct;\r\n    QAction *zoomToAct;\r\n    QAction *RecentAct;\r\n    QAction *SetGridAct;\r\n    QAction *STDFillColorAct;\r\n    QAction *ContextFillColorAct;\r\n    QAction *AugmentFillColorAct; // AV test - TV\r\n    QAction *SelectLineAct;\r\n    QAction *SelectPolyLineAct;\r\n    QAction *MakeIosAct;\r\n    QAction *PartialMakeIosAct;\r\n    QAction *JoinAct;\r\n    QAction *JoinUnlinkAct;\r\n//PlotMap control\r\n\r\n    QComboBox *x_coord;\r\n    QComboBox *y_coord;\r\n    QAction *toggleColor;\r\n    QAction *toggleOrg;\r\n    QAction *viewTrend;\r\n    QAction *yx;\r\n    QAction *Rtwo;\r\n//3D View ToolBar\r\n    QAction *toolsImportTracesAct;\r\n    QAction *addAgentAct;\r\n    QAction *toolsAgentsPlayAct;\r\n    QAction *toolsAgentsPauseAct;\r\n    QAction *toolsAgentsStopAct;\r\n    QAction *agentTrailsAct;\r\n    QAction *thirdRotAct;\r\n    QAction *thirdPanAct;\r\n    QAction *thirdZoomAct;\r\n    QAction *playLoopAct;\r\n    QAction *thirdFilledAct;\r\n\r\n    int m_selected_mapbar_item = -1;\r\n\r\n\r\n    enum {\r\n       ID_MAPBAR_ZOOM_ITEMS = 2,\r\n       ID_MAPBAR_FILL_ITEMS = 8,\r\n       ID_MAPBAR_DRAW_ITEMS = 10,\r\n       ID_MAPBAR_ISOVIST_ITEMS = 12,\r\n       ID_MAPBAR_JOIN_ITEMS = 15\r\n    };\r\n\r\n    enum {\r\n       ID_MAPBAR_ITEM_SELECT = 0,\r\n       ID_MAPBAR_ITEM_MOVE = 1,\r\n       ID_MAPBAR_ITEM_ZOOM_IN = 2,\r\n       ID_MAPBAR_ITEM_ZOOM_OUT = 3,\r\n       ID_MAPBAR_ITEM_FILL = 7,\r\n       ID_MAPBAR_ITEM_SEMIFILL = 8,\r\n       ID_MAPBAR_ITEM_PENCIL = 9,\r\n       ID_MAPBAR_ITEM_LINETOOL = 10,\r\n       ID_MAPBAR_ITEM_POLYGON = 11,\r\n       ID_MAPBAR_ITEM_ISOVIST = 12,\r\n       ID_MAPBAR_ITEM_HALFISOVIST = 13,\r\n       ID_MAPBAR_ITEM_AL2 = 14,\r\n       ID_MAPBAR_ITEM_PD = 15,\r\n       ID_MAPBAR_ITEM_JOIN = 16,\r\n       ID_MAPBAR_ITEM_UNJOIN = 17,\r\n       ID_MAPBAR_ITEM_AUGMENT_FILL = 18 // AV test - TV\r\n    };\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "depthmapX/mainwindowfactory.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"mainwindowfactory.h\"\n#include \"mainwindow.h\"\n#include \"dialogs/licenseagreement.h\"\n#include <memory>\n\nnamespace MainWindowFactory{\n    std::unique_ptr<MainWindow> getMainWindow(const QString& fileToLoad, Settings &settings)\n    {\n        return std::unique_ptr<MainWindow>(new MainWindow(fileToLoad, settings));\n    }\n\n    std::unique_ptr<QDialog> getLicenseDialog()\n    {\n        return std::unique_ptr<QDialog>(new LicenseAgreement);\n    }\n}\n"
  },
  {
    "path": "depthmapX/mainwindowfactory.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef MAINWINDOWFACTORY_H\n#define MAINWINDOWFACTORY_H\n\n#include <mainwindow.h>\n#include <QDialog>\n#include <memory>\n\nclass Settings;\n\nnamespace MainWindowFactory{\n    std::unique_ptr<MainWindow> getMainWindow(const QString &fileToLoad, Settings &settings);\n    std::unique_ptr<QDialog> getLicenseDialog();\n}\n#endif // MAINWINDOWFACTORY_H\n"
  },
  {
    "path": "depthmapX/mainwindowhelpers.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"depthmapX/mainwindowhelpers.h\"\n#include \"depthmapX/mainwindow.h\"\n\nQMenu *MainWindowHelpers::getOrAddRootMenu(MainWindow *mainWindow, QString menuTitle) {\n    QMenuBar *menuBar = mainWindow->menuBar();\n    QMenu *menu = nullptr;\n    foreach (QAction *action, menuBar->actions()) {\n        if (action->menu()) {\n            QMenu *childMenu = action->menu();\n            if (childMenu != nullptr && childMenu->title() == menuTitle) {\n                menu = childMenu;\n            }\n        }\n    }\n    if (menu == nullptr) {\n        menu = menuBar->addMenu(menuTitle);\n    }\n    return menu;\n}\n\nQMenu *MainWindowHelpers::getOrAddMenu(QMenu *parent, QString menuTitle) {\n    QMenu *menu = nullptr;\n    foreach (QAction *action, parent->actions()) {\n        if (action->menu()) {\n            QMenu *childMenu = action->menu();\n            if (childMenu != nullptr && childMenu->title() == menuTitle) {\n                menu = childMenu;\n            }\n        }\n    }\n    if (menu == nullptr) {\n        menu = parent->addMenu(menuTitle);\n    }\n    return menu;\n}\n"
  },
  {
    "path": "depthmapX/mainwindowhelpers.h",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"mainwindow.h\"\n\n#include <QMenu>\n\nnamespace MainWindowHelpers {\n    QMenu *getOrAddRootMenu(MainWindow *mainWindow, QString menuTitle);\n    QMenu *getOrAddMenu(QMenu *parent, QString menuTitle);\n} // namespace MainWindowHelpers\n"
  },
  {
    "path": "depthmapX/mainwindowmodulefactory.cpp",
    "content": "// Copyright (C) 2020, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"mainwindowpluginfactory.hpp\"\n\nMainWindowPluginFactory::PluginMap *MainWindowPluginFactory::map = NULL;\n"
  },
  {
    "path": "depthmapX/mainwindowmoduleregistry.cpp",
    "content": "// Copyright (C) 2017, Christian Sailer\n// Copyright (C) 2020, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"mainwindowmoduleregistry.hpp\"\n#include \"modules/segmentshortestpaths/gui/segmentpathsmainwindow.h\"\n\nvoid MainWindowModuleRegistry::populateModules() {\n    // Register any main window modules here\n    REGISTER_MAIN_WINDOW_MODULE(SegmentPathsMainWindow);\n    // *********\n}\n"
  },
  {
    "path": "depthmapX/mainwindowmoduleregistry.hpp",
    "content": "// Copyright (C) 2017, Christian Sailer\n// Copyright (C) 2020, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imainwindowmodule.h\"\n#include \"imainwindowmodulefactory.h\"\n#include <memory>\n#include <vector>\n\nclass MainWindowModuleRegistry : public IMainWindowModuleFactory {\n  public:\n    MainWindowModuleRegistry() { populateModules(); }\n\n    const MainWindowModuleVec &getModules() const { return m_availableModules; }\n\n  private:\n    void populateModules();\n    MainWindowModuleVec m_availableModules;\n};\n\n#define REGISTER_MAIN_WINDOW_MODULE(module)                                                                           \\\n    m_availableModules.push_back(std::unique_ptr<IMainWindowModule>(new module));\n"
  },
  {
    "path": "depthmapX/make_version_header.bat",
    "content": "@echo off\ndel version_defs.h\necho // Copyright (C) 2018 Christian Sailer >> version_defs.h\n\necho // This program is free software: you can redistribute it and/or modify >> version_defs.h\necho // it under the terms of the GNU General Public License as published by >> version_defs.h\necho // the Free Software Foundation, either version 3 of the License, or >> version_defs.h\necho // (at your option) any later version. >> version_defs.h\necho.  >> version_defs.h\necho // This program is distributed in the hope that it will be useful, >> version_defs.h\necho // but WITHOUT ANY WARRANTY; without even the implied warranty of >> version_defs.h\necho // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the >> version_defs.h\necho // GNU General Public License for more details. >> version_defs.h\necho. >> version_defs.h\necho // You should have received a copy of the GNU General Public License >> version_defs.h\necho|set /p=\"// along with this program.  If not, see <http://www.gnu.org/licenses/>.\" >> version_defs.h\necho. >> version_defs.h\necho. >> version_defs.h\necho // This file is autogenerated - do not modify it directly! >> version_defs.h\necho. >> version_defs.h\necho #pragma once >> version_defs.h\necho. >> version_defs.h\n\n:: Get date in correct form (YYYY/MM/DD).\nfor /f \"skip=1\" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x\nfor /f %%x in ('wmic path win32_localtime get /format:list ^| findstr \"=\"') do set %%x\nset fmonth=00%Month%\nset fday=00%Day%\nset today=%Year%/%fmonth:~-2%/%fday:~-2%\n\necho #ifndef APP_DATE >> version_defs.h\necho #define APP_DATE \"%today%\" >> version_defs.h\necho #endif >> version_defs.h\necho. >> version_defs.h\nfor /f \"delims=\" %%A in ('git rev-parse --abbrev-ref HEAD') do set \"mybranch=%%A\"\necho #ifndef APP_GIT_BRANCH >> version_defs.h\necho #define APP_GIT_BRANCH \"%mybranch%\" >> version_defs.h\necho #endif >> version_defs.h\necho. >> version_defs.h\nfor /f \"delims=\" %%A in ('git log \"--pretty=format:%%h\" -n 1') do set \"mycommit=%%A\"\necho #ifndef APP_GIT_COMMIT >> version_defs.h\necho #define APP_GIT_COMMIT \"%mycommit%\" >> version_defs.h\necho #endif >> version_defs.h\n"
  },
  {
    "path": "depthmapX/make_version_header.sh",
    "content": "rm version_defs.h\nprintf \"// Copyright (C) 2018 Christian Sailer\\n\" >> version_defs.h\n\nprintf \"// This program is free software: you can redistribute it and/or modify\\n\" >> version_defs.h\nprintf \"// it under the terms of the GNU General Public License as published by\\n\" >> version_defs.h\nprintf \"// the Free Software Foundation, either version 3 of the License, or\\n\" >> version_defs.h\nprintf \"// (at your option) any later version.\\n\\n\" >> version_defs.h\nprintf \"// This program is distributed in the hope that it will be useful,\\n\" >> version_defs.h\nprintf \"// but WITHOUT ANY WARRANTY\\; without even the implied warranty of\\n\" >> version_defs.h\nprintf \"// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\n\" >> version_defs.h\nprintf \"// GNU General Public License for more details.\\n\\n\" >> version_defs.h\nprintf \"// You should have received a copy of the GNU General Public License\\n\" >> version_defs.h\nprintf \"// along with this program.  If not, see <http://www.gnu.org/licenses/>.\\n\\n\" >> version_defs.h\n\nprintf \"// This file is autogenerated - do not modify it directly!\\n\\n\" >> version_defs.h\n\nprintf \"#pragma once\\n\\n\" >> version_defs.h\n\nprintf \"#ifndef APP_DATE\\n\" >> version_defs.h\nprintf \"#define APP_DATE \\\"`date +%Y/%m/%d`\\\"\\n\" >> version_defs.h\nprintf \"#endif\\n\\n\" >> version_defs.h\n\nprintf \"#ifndef APP_GIT_BRANCH\\n\" >> version_defs.h\nprintf \"#define APP_GIT_BRANCH \\\"`git rev-parse --abbrev-ref HEAD`\\\"\\n\" >> version_defs.h\nprintf \"#endif\\n\\n\" >> version_defs.h\n\nprintf \"#ifndef APP_GIT_COMMIT\\n\" >> version_defs.h\nprintf \"#define APP_GIT_COMMIT \\\"`git log --pretty=format:'%h' -n 1`\\\"\\n\" >> version_defs.h\nprintf \"#endif\\n\" >> version_defs.h\n\n"
  },
  {
    "path": "depthmapX/mdichild.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include <QtGui/QCloseEvent>\r\n#include <QtWidgets/QMessageBox>\r\n#include <QtCore/QTextStream>\r\n#include <QtCore/QFile>\r\n#include <QtWidgets/QApplication>\r\n#include <QtWidgets/QFileDialog>\r\n#include \"mdichild.h\"\r\n\r\nMdiChild::MdiChild()\r\n{\r\n    setAttribute(Qt::WA_DeleteOnClose);\r\n    isUntitled = true;\r\n}\r\n\r\nvoid MdiChild::newFile()\r\n{\r\n    static int sequenceNumber = 1;\r\n\r\n    isUntitled = true;\r\n    curFile = tr(\"document%1.txt\").arg(sequenceNumber++);\r\n    setWindowTitle(curFile + \"[*]\");\r\n\r\n    connect(document(), SIGNAL(contentsChanged()),\r\n            this, SLOT(documentWasModified()));\r\n}\r\n\r\nbool MdiChild::loadFile(const QString &fileName)\r\n{\r\n    QFile file(fileName);\r\n    if (!file.open(QFile::ReadOnly | QFile::Text)) {\r\n        QMessageBox::warning(this, tr(\"MDI\"),\r\n                             tr(\"Cannot read file %1:\\n%2.\")\r\n                             .arg(fileName)\r\n                             .arg(file.errorString()));\r\n        return false;\r\n    }\r\n\r\n    QTextStream in(&file);\r\n    QApplication::setOverrideCursor(Qt::WaitCursor);\r\n    setPlainText(in.readAll());\r\n    QApplication::restoreOverrideCursor();\r\n\r\n    setCurrentFile(fileName);\r\n\r\n    connect(document(), SIGNAL(contentsChanged()),\r\n            this, SLOT(documentWasModified()));\r\n\r\n    return true;\r\n}\r\n\r\nbool MdiChild::save()\r\n{\r\n    if (isUntitled) {\r\n        return saveAs();\r\n    } else {\r\n        return saveFile(curFile);\r\n    }\r\n}\r\n\r\nbool MdiChild::saveAs()\r\n{\r\n    QString fileName = QFileDialog::getSaveFileName(this, tr(\"Save As\"),\r\n                                                    curFile);\r\n    if (fileName.isEmpty())\r\n        return false;\r\n\r\n    return saveFile(fileName);\r\n}\r\n\r\nbool MdiChild::saveFile(const QString &fileName)\r\n{\r\n    QFile file(fileName);\r\n    if (!file.open(QFile::WriteOnly | QFile::Text)) {\r\n        QMessageBox::warning(this, tr(\"MDI\"),\r\n                             tr(\"Cannot write file %1:\\n%2.\")\r\n                             .arg(fileName)\r\n                             .arg(file.errorString()));\r\n        return false;\r\n    }\r\n\r\n    QTextStream out(&file);\r\n    QApplication::setOverrideCursor(Qt::WaitCursor);\r\n    out << toPlainText();\r\n    QApplication::restoreOverrideCursor();\r\n\r\n    setCurrentFile(fileName);\r\n    return true;\r\n}\r\n\r\nQString MdiChild::userFriendlyCurrentFile()\r\n{\r\n    return strippedName(curFile);\r\n}\r\n\r\nvoid MdiChild::closeEvent(QCloseEvent *event)\r\n{\r\n    if (maybeSave()) {\r\n        event->accept();\r\n    } else {\r\n        event->ignore();\r\n    }\r\n}\r\n\r\nvoid MdiChild::documentWasModified()\r\n{\r\n    setWindowModified(document()->isModified());\r\n}\r\n\r\nbool MdiChild::maybeSave()\r\n{\r\n    if (document()->isModified()) {\r\n\tQMessageBox::StandardButton ret;\r\n        ret = QMessageBox::warning(this, tr(\"MDI\"),\r\n                     tr(\"'%1' has been modified.\\n\"\r\n                        \"Do you want to save your changes?\")\r\n                     .arg(userFriendlyCurrentFile()),\r\n                     QMessageBox::Save | QMessageBox::Discard\r\n\t\t     | QMessageBox::Cancel);\r\n        if (ret == QMessageBox::Save)\r\n            return save();\r\n        else if (ret == QMessageBox::Cancel)\r\n            return false;\r\n    }\r\n    return true;\r\n}\r\n\r\nvoid MdiChild::setCurrentFile(const QString &fileName)\r\n{\r\n    curFile = QFileInfo(fileName).canonicalFilePath();\r\n    isUntitled = false;\r\n    document()->setModified(false);\r\n    setWindowModified(false);\r\n    setWindowTitle(userFriendlyCurrentFile() + \"[*]\");\r\n}\r\n\r\nQString MdiChild::strippedName(const QString &fullFileName)\r\n{\r\n    return QFileInfo(fullFileName).fileName();\r\n}\r\n"
  },
  {
    "path": "depthmapX/mdichild.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef MDICHILD_H\r\n#define MDICHILD_H\r\n\r\n#include <QTextEdit>\r\n\r\nclass MdiChild : public QTextEdit\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    MdiChild();\r\n\r\n    void newFile();\r\n    bool loadFile(const QString &fileName);\r\n    bool save();\r\n    bool saveAs();\r\n    bool saveFile(const QString &fileName);\r\n    QString userFriendlyCurrentFile();\r\n    QString currentFile() { return curFile; }\r\n\r\nprotected:\r\n    void closeEvent(QCloseEvent *event);\r\n\r\nprivate slots:\r\n    void documentWasModified();\r\n\r\nprivate:\r\n    bool maybeSave();\r\n    void setCurrentFile(const QString &fileName);\r\n    QString strippedName(const QString &fullFileName);\r\n\r\n    QString curFile;\r\n    bool isUntitled;\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "depthmapX/qrc_mdi.cpp",
    "content": "/****************************************************************************\n** Resource object code\n**\n** Created: Sat Mar 10 09:32:20 2012\n**      by: The Resource Compiler for Qt version 4.8.0\n**\n** WARNING! All changes made in this file will be lost!\n*****************************************************************************/\n\n#include <QtCore/qglobal.h>\n\nstatic const unsigned char qt_resource_data[] = {\n  // /work/depthmap/depthmap/images/new.png\n  0x0,0x0,0x3,0x54,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xd6,0xd8,0xd4,0x4f,0x58,0x32,\n  0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,\n  0x0,0x41,0x64,0x6f,0x62,0x65,0x20,0x49,0x6d,0x61,0x67,0x65,0x52,0x65,0x61,0x64,\n  0x79,0x71,0xc9,0x65,0x3c,0x0,0x0,0x2,0xe6,0x49,0x44,0x41,0x54,0x58,0xc3,0xd5,\n  0x97,0xcd,0x4e,0x13,0x61,0x14,0x86,0xeb,0x35,0x94,0x95,0x7b,0x71,0xe1,0xd2,0xc4,\n  0xe0,0x5,0xb8,0xe2,0xe,0x5c,0xb8,0xf4,0x2,0x5c,0xb1,0x30,0xea,0x5,0x18,0x96,\n  0x26,0x62,0x58,0xb8,0xb0,0x91,0x58,0x20,0xd1,0x9d,0xbf,0x89,0xa4,0x14,0xb1,0x52,\n  0xa4,0x48,0x45,0x94,0xfe,0xd0,0x2,0x43,0xff,0xa6,0x9d,0x19,0xa6,0x65,0x80,0xe3,\n  0x79,0x7b,0xfa,0x85,0x51,0x4a,0x82,0xc9,0x21,0x86,0x49,0xde,0x9c,0x33,0xa7,0xf3,\n  0xcd,0xfb,0x9c,0xf3,0x4d,0x9b,0x4e,0x84,0x88,0x22,0xff,0x53,0x91,0x73,0x1,0xc0,\n  0xc7,0xd5,0x90,0x6e,0xff,0xa5,0xfb,0xac,0xc7,0x3d,0x3d,0x64,0xd,0xa9,0x2,0xf0,\n  0x31,0x32,0x3c,0x3c,0xbc,0x6a,0x34,0x3a,0x3a,0xba,0x19,0x56,0x3c,0x1e,0xaf,0x26,\n  0x93,0xc9,0x56,0x3a,0x9d,0x76,0x13,0x89,0x44,0x6b,0x60,0x60,0x20,0xcd,0x6b,0x6e,\n  0x68,0x2,0xa4,0x38,0xd2,0xe1,0xe1,0x71,0x99,0xba,0xef,0xb7,0xc9,0xb2,0x2c,0xda,\n  0xdf,0xdf,0x27,0x86,0xf1,0x78,0xcd,0x18,0xeb,0x8a,0x1a,0x40,0x3f,0xf3,0xb0,0x1c,\n  0xc7,0xa5,0x4c,0x66,0xb9,0xb,0x14,0x4,0x1,0xc5,0x62,0xb1,0x3a,0xaf,0x7b,0x70,\n  0x1a,0x88,0x53,0x1,0x1c,0x1c,0x10,0x77,0x77,0xb2,0x6c,0xdb,0xa1,0xf9,0xf9,0xcf,\n  0x64,0xe,0xd7,0x75,0xe9,0xf9,0xc4,0x44,0x17,0x42,0x5,0x0,0x26,0x7b,0xc1,0xc9,\n  0xaa,0x37,0x1c,0x4a,0xce,0xcd,0x53,0xf8,0x70,0x5d,0xf,0x8b,0x17,0x54,0x0,0x82,\n  0x10,0x40,0x67,0x4f,0x14,0xce,0xed,0xa6,0x47,0x1f,0x67,0x66,0xe9,0xf5,0x9b,0xb7,\n  0x14,0x9f,0x9c,0xa4,0xa9,0xa9,0x69,0x7a,0xf7,0xfe,0x3,0x45,0xa3,0xd1,0x65,0x5e,\n  0x7f,0x41,0x5,0xc0,0xef,0x10,0xed,0xb6,0x25,0x86,0x85,0x9a,0xe3,0x5,0x94,0x5d,\n  0xcd,0xd1,0xe4,0xf4,0x2b,0x7a,0x32,0xfe,0x94,0x9e,0xc5,0x5e,0xd0,0x4c,0x62,0xe,\n  0x8b,0x17,0x55,0x0,0xda,0x81,0x18,0xf5,0x13,0x20,0x3c,0xff,0x90,0x6a,0xcd,0x36,\n  0x15,0x37,0xab,0x94,0x2f,0x6e,0x53,0x89,0x63,0x8d,0xb7,0x85,0xd7,0x7e,0x51,0x1,\n  0xf0,0x79,0xcc,0xcd,0x5d,0x1e,0xb5,0xc7,0x7b,0xdb,0xee,0x9f,0x3b,0xbe,0xe4,0x88,\n  0x5d,0xb8,0xbd,0xee,0xe2,0x94,0xca,0x33,0xe0,0x75,0xe4,0xc6,0x75,0x57,0x62,0xd8,\n  0x10,0x39,0xea,0xe6,0x33,0x44,0xd4,0x1,0xa7,0x6,0xe0,0xf4,0x3a,0xad,0x39,0x22,\n  0x98,0x98,0x68,0x72,0x80,0x98,0x6b,0x50,0x53,0x9d,0x0,0x0,0x2a,0x2d,0xb9,0x31,\n  0xe2,0x4e,0x53,0x8c,0x10,0xd,0x4,0xf2,0x6d,0xfb,0x28,0xb6,0x7c,0x45,0x0,0x9b,\n  0x3b,0xdb,0x6a,0xfc,0x69,0x8e,0x3c,0x6c,0x88,0x1a,0xae,0x39,0x13,0x80,0x3a,0x8f,\n  0xb7,0x54,0x23,0x2a,0xd7,0xc5,0x4,0x6,0x6,0x0,0x35,0x28,0x9c,0x17,0xab,0xbc,\n  0x25,0xbb,0xca,0x13,0xc0,0x4d,0x61,0xe,0x15,0x2a,0x72,0x6e,0xcc,0x7e,0x5a,0x2,\n  0x68,0x6a,0xdd,0xad,0xf1,0x94,0x27,0x0,0x53,0xdc,0x1c,0x71,0x6d,0x5b,0x40,0x60,\n  0x9a,0xab,0x1c,0x75,0x9e,0xeb,0x81,0x41,0x15,0x47,0x11,0xc0,0x6a,0x89,0x31,0xc,\n  0xd6,0x77,0x4,0x20,0xc,0x64,0x26,0x62,0xb6,0x69,0x75,0x8b,0xa8,0xaa,0x9,0x50,\n  0xb6,0xc5,0xbc,0xd0,0x3,0xf8,0xbe,0x29,0x63,0x87,0x29,0x60,0xc,0x18,0x84,0x1c,\n  0x0,0x5b,0x4d,0x45,0x0,0x74,0x3,0x53,0x98,0xad,0x94,0xc5,0x1c,0xe7,0x46,0xe6,\n  0x1c,0x0,0xc8,0x71,0x5d,0xa9,0xa1,0x8,0x80,0xfd,0xfc,0x56,0x12,0x73,0x33,0x1,\n  0x8,0x35,0x18,0x42,0xe8,0xda,0x7c,0x8e,0x29,0xa8,0x4e,0x0,0x5b,0x0,0x3,0xc8,\n  0x98,0x67,0x36,0x4,0x0,0x32,0xe6,0x85,0xde,0xf8,0x17,0xb,0xfc,0x2c,0xd8,0x8a,\n  0x0,0x18,0x67,0x3a,0x4f,0xb4,0x54,0x14,0x23,0x98,0x2,0x0,0x2,0xc,0x3e,0xfb,\n  0xc5,0x53,0x28,0xf0,0x43,0xb8,0x66,0x49,0xf7,0x6b,0xf9,0x52,0x87,0xd7,0xbe,0x54,\n  0x1,0xc8,0x55,0x8f,0xba,0x4e,0xad,0x4b,0xe,0x90,0xaf,0x85,0xde,0xb7,0xc2,0x92,\n  0x3d,0x4f,0xa6,0xb3,0xde,0xa3,0xb1,0x71,0xeb,0xda,0xd0,0xf5,0x15,0x98,0xb3,0x6e,\n  0xa9,0x0,0x6c,0x34,0xa4,0x6b,0x18,0xff,0xe0,0x11,0x7f,0x5a,0x17,0x53,0xd4,0x13,\n  0xb,0x59,0x6f,0xe4,0xee,0xbd,0xe2,0xa5,0xc1,0xcb,0x4b,0x7c,0x6d,0x8c,0x75,0x87,\n  0x35,0xa8,0xfa,0xb7,0x1c,0xdd,0x65,0xd9,0x3c,0x8f,0x1f,0x19,0xfe,0x9e,0xcf,0x1e,\n  0x37,0xbd,0xc9,0xba,0x78,0x26,0x6f,0x46,0x0,0x68,0xf2,0xff,0x81,0x99,0x94,0x9e,\n  0xe9,0x3f,0xbf,0x19,0x1,0x42,0xd3,0xf4,0xfc,0xbd,0x9c,0x9e,0xa5,0x7e,0x3,0x51,\n  0x6c,0x25,0xa1,0x92,0x95,0xa,0x77,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/down.png\n  0x0,0x0,0x2,0x52,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x16,0x0,0x0,0x0,0x16,0x8,0x6,0x0,0x0,0x0,0xc4,0xb4,0x6c,0x3b,\n  0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xd6,0xd8,0xd4,0x4f,0x58,0x32,\n  0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,\n  0x0,0x41,0x64,0x6f,0x62,0x65,0x20,0x49,0x6d,0x61,0x67,0x65,0x52,0x65,0x61,0x64,\n  0x79,0x71,0xc9,0x65,0x3c,0x0,0x0,0x1,0xe4,0x49,0x44,0x41,0x54,0x38,0x8d,0xbd,\n  0xd4,0xcf,0x4f,0xd3,0x60,0x1c,0xc7,0xf1,0xb5,0x5b,0x69,0x3b,0x37,0xcc,0x96,0x68,\n  0x42,0xa6,0x82,0x98,0xa1,0x1c,0x38,0x98,0xe0,0xcd,0x8b,0x28,0xa4,0x12,0xa3,0x19,\n  0x48,0x48,0x20,0x1a,0x6e,0x1a,0x16,0xe5,0xc4,0xc5,0x18,0x42,0x23,0x3a,0xa2,0xc6,\n  0x18,0x63,0xc6,0x8f,0x39,0x6,0x54,0xb3,0xf2,0x40,0x3c,0x29,0x97,0x72,0xf1,0x2f,\n  0xfb,0xf0,0x7d,0x6a,0x4b,0xea,0xb6,0x67,0x3c,0x90,0xe0,0x93,0xbc,0x8f,0x7d,0xf5,\n  0xc9,0xd3,0x6f,0x9f,0x18,0x80,0xd8,0x59,0x74,0x26,0xe8,0xff,0x87,0x69,0x95,0x29,\n  0x48,0xb4,0x46,0x25,0x28,0x45,0x16,0x46,0xfd,0xcf,0xb,0x6c,0x78,0x4f,0x85,0x2d,\n  0xd5,0x6f,0x85,0x78,0x9a,0xe3,0xd2,0xf0,0xa6,0xf7,0x4,0xcb,0x6c,0x50,0xd8,0x33,\n  0xfb,0x7a,0x8,0x77,0x51,0x86,0x34,0xbc,0xe5,0x4d,0xe1,0x3d,0xbb,0x29,0xec,0xb9,\n  0x9d,0xf,0xe1,0x5e,0xea,0x9c,0x34,0xec,0x78,0x93,0xf8,0xc8,0x6,0x84,0xcd,0xda,\n  0xbd,0x21,0xdc,0xc7,0x8f,0x43,0x1a,0xfe,0xe1,0x3d,0xc6,0x27,0xd6,0x2f,0xac,0x68,\n  0x77,0x9f,0xe,0x76,0xbd,0x2,0xbe,0xb0,0xbc,0xb0,0x39,0xfb,0x92,0x1c,0x4c,0x4b,\n  0xa3,0x56,0xc2,0x51,0xda,0x3d,0x78,0x84,0xaf,0xac,0x47,0x58,0xa9,0x72,0x39,0x3a,\n  0x76,0xbf,0xa9,0x51,0x2a,0x1e,0x8e,0x5e,0x14,0x9e,0xb3,0x1e,0x76,0xe1,0xe7,0xc1,\n  0x3,0xbf,0xfa,0xfe,0x6d,0xac,0xb2,0x9c,0xb0,0xb2,0x9b,0xc3,0xda,0xee,0x15,0x54,\n  0xf6,0xae,0x62,0xa6,0x98,0xe1,0xc0,0x2f,0x3e,0x1d,0x94,0xda,0x8,0xeb,0xd4,0xfa,\n  0x90,0x65,0x62,0xd5,0xbd,0x88,0x75,0xd6,0xbe,0xcf,0xb5,0xb,0x98,0x5f,0xcc,0x60,\n  0xb4,0x90,0x44,0x2a,0xad,0x72,0x60,0x3a,0x98,0xe9,0x78,0x23,0xac,0x50,0x29,0xaa,\n  0x76,0xd7,0x32,0x50,0x71,0xb3,0xa8,0xb2,0xe6,0xbe,0xed,0x64,0xb1,0xe2,0x64,0xb0,\n  0xb0,0xdc,0x89,0x3b,0x23,0x6,0x34,0x4d,0xe1,0xf,0x17,0xa9,0x1c,0x95,0x6c,0xda,\n  0x71,0x80,0xf3,0xdf,0x33,0x4b,0x39,0xf7,0xac,0xe,0x6c,0xb8,0x69,0x6c,0xb2,0x7f,\n  0x2b,0xd7,0x52,0x58,0x78,0x97,0xc4,0xd8,0xa4,0xe,0xdd,0xf0,0xd1,0x19,0x2a,0x1f,\n  0x3c,0xd7,0xd1,0x74,0xc6,0xad,0xf0,0x61,0x2b,0x81,0x2d,0xd7,0x84,0xc3,0xfe,0x56,\n  0x75,0x4c,0xd8,0x25,0x1d,0x43,0xc3,0x9,0x98,0xa6,0x8f,0xbe,0x6e,0x85,0xb6,0x1b,\n  0xb7,0x23,0x7c,0xc4,0x52,0xf1,0x7d,0x47,0x43,0x75,0x5b,0x43,0xe9,0x43,0x2,0xe3,\n  0x13,0x2a,0x14,0x25,0x16,0xdd,0x69,0xa6,0x11,0x6d,0x7b,0x6d,0x46,0x71,0xeb,0xbe,\n  0x82,0x37,0x6f,0x55,0x14,0xc6,0x14,0xfa,0x50,0x3e,0xfa,0x4a,0xb4,0x53,0xa9,0xfb,\n  0x38,0xc0,0xf9,0x25,0xb3,0x6d,0x18,0x31,0xe8,0xba,0x8f,0xbe,0x3c,0xe,0x3d,0x16,\n  0x8e,0xe0,0x7c,0x5a,0xae,0x51,0x37,0x82,0x17,0x9d,0x6f,0x87,0x4a,0xc1,0x1,0x1e,\n  0xf,0x20,0x23,0x98,0xf7,0x96,0x97,0xfb,0x89,0xe1,0xd3,0x74,0x8,0x56,0x10,0xa,\n  0xb,0xb1,0xaa,0xe0,0x42,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/save.png\n  0x0,0x0,0x4,0xa3,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xd6,0xd8,0xd4,0x4f,0x58,0x32,\n  0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,\n  0x0,0x41,0x64,0x6f,0x62,0x65,0x20,0x49,0x6d,0x61,0x67,0x65,0x52,0x65,0x61,0x64,\n  0x79,0x71,0xc9,0x65,0x3c,0x0,0x0,0x4,0x35,0x49,0x44,0x41,0x54,0x58,0xc3,0xe5,\n  0x97,0xcd,0x8f,0x54,0x45,0x14,0xc5,0x7f,0xb7,0xea,0xd6,0x7b,0xaf,0xdb,0x6e,0xc7,\n  0xf9,0x40,0x9d,0x89,0x46,0x4d,0x34,0x99,0x44,0x8d,0x1a,0x48,0x98,0xc4,0x8c,0x1f,\n  0x1b,0xfe,0x2,0x4c,0x5c,0xf1,0x7,0x18,0x16,0x2e,0x4d,0x5c,0x6b,0x58,0xc3,0x8e,\n  0xc4,0x8d,0x1b,0x17,0xce,0x82,0x68,0x74,0x41,0x5c,0x18,0xd,0xe2,0xc4,0xc6,0x0,\n  0x3d,0x60,0x50,0x51,0x19,0x60,0x2,0xa2,0xe,0xc,0x83,0xd3,0xfd,0x5e,0xf7,0x94,\n  0x8b,0xaa,0xee,0xf9,0x60,0xe6,0xd,0x84,0x51,0x16,0x56,0x52,0xa9,0xce,0x7b,0xb7,\n  0xeb,0x9e,0x3a,0xf7,0xd4,0xa9,0x7a,0xea,0xbd,0xe7,0x7e,0x36,0xe5,0x3e,0xb7,0x3e,\n  0x80,0x5d,0xbb,0x76,0xbd,0x3,0xec,0xfd,0x8f,0xf2,0x4e,0x35,0x1a,0x8d,0x3,0xeb,\n  0x19,0xd8,0xbb,0xef,0xbd,0xa3,0x3b,0x1f,0x1f,0x76,0x0,0x9c,0x3c,0x3a,0xcf,0xcc,\n  0x97,0x37,0x58,0x9c,0xef,0xdc,0x53,0xa6,0xda,0xa0,0xf2,0xdc,0x6b,0x3,0xbc,0xb8,\n  0x67,0x10,0x80,0x8b,0x7f,0x16,0x7c,0xf8,0xee,0x1e,0x80,0xdb,0x0,0x70,0xfc,0xec,\n  0x1c,0xdf,0x3f,0x30,0x4,0x78,0x2e,0xfd,0xb8,0xc0,0xfe,0xb7,0xce,0x6f,0xcb,0x72,\n  0xf,0x1d,0x79,0x9a,0xb,0x23,0x96,0xd3,0x9f,0x1f,0x64,0xfc,0xd5,0x7d,0x9b,0x6b,\n  0x40,0x45,0xb0,0x16,0x40,0x78,0x70,0x2c,0x23,0xcb,0xb2,0x6d,0x1,0x30,0x30,0x96,\n  0x61,0x8d,0x50,0x1b,0x7c,0x14,0x23,0x25,0x22,0x14,0x2b,0xd8,0x18,0x91,0xd5,0x95,\n  0x73,0xe7,0xce,0x83,0x2a,0xb8,0x4,0xd2,0x14,0xb2,0xc,0xd2,0x2c,0x8c,0x49,0xa,\n  0x49,0x12,0xde,0x77,0x3a,0x90,0xe7,0x90,0xb7,0xa1,0xd5,0x82,0x76,0x2b,0x8e,0x6d,\n  0x28,0x72,0xb2,0xfa,0x38,0xd6,0xa,0xe3,0xaf,0xbc,0x49,0x6b,0xf1,0xfa,0xe6,0x0,\n  0xac,0x15,0xac,0x15,0x4,0xb0,0x46,0xd8,0xbd,0x7b,0xe7,0x16,0x6b,0xeb,0x86,0xae,\n  0x80,0x5a,0xa8,0x56,0x81,0xea,0x6d,0x51,0x8d,0xaf,0x4,0xb5,0x82,0xf7,0xa0,0xa6,\n  0x84,0x1,0x67,0x5,0x35,0x82,0x8,0xa8,0xa,0x95,0x2c,0xc3,0x23,0x20,0x1e,0x8,\n  0xc0,0xf0,0x1e,0x2f,0x2,0xde,0x23,0x12,0x26,0x15,0x7c,0x88,0x23,0xc4,0x21,0x1e,\n  0x3c,0x21,0x5e,0x40,0x4d,0x58,0x18,0x40,0xd7,0x4a,0x89,0x6,0xac,0xa0,0xda,0x63,\n  0x0,0x9a,0x33,0xbf,0x5,0x8a,0x53,0x7,0x69,0x2,0x95,0x4,0xb2,0x34,0xf6,0x4,\n  0x12,0x7,0x4e,0xa1,0xe8,0x40,0x5e,0x40,0x2b,0x8f,0xbd,0x5,0x4b,0x39,0xb4,0x73,\n  0xc8,0xb,0x54,0x87,0x71,0x3d,0x0,0x2a,0xe5,0x25,0x70,0x31,0x40,0xd5,0x30,0x39,\n  0xf9,0xd2,0xd6,0xa,0xf3,0x3e,0xd0,0xaf,0x16,0xaa,0x1b,0x8b,0xf6,0xd8,0x27,0x61,\n  0x61,0xbd,0x1c,0x25,0x25,0x20,0x0,0xf0,0x81,0x8d,0x34,0x4d,0xa3,0x3a,0xc3,0xb3,\n  0x98,0x11,0x89,0x6c,0x7,0xda,0x63,0x9,0x56,0x98,0x5f,0x29,0x46,0xfc,0x61,0xcd,\n  0x72,0x7f,0x61,0x1d,0x2d,0xd1,0x80,0x3a,0x9,0x54,0x49,0x18,0x4f,0x34,0x2f,0xe0,\n  0x9d,0x85,0xc4,0x21,0x89,0xc3,0x67,0x9,0x92,0x69,0xd8,0x11,0x89,0xe2,0x13,0x87,\n  0x58,0x8b,0xef,0x76,0x91,0xbc,0x80,0xbc,0x3,0xed,0x2,0xdf,0x6a,0x23,0xed,0x2,\n  0xf2,0x2,0x9f,0x77,0x50,0x1d,0x45,0xd5,0x20,0x78,0x3a,0xeb,0x54,0x78,0x9b,0x6,\n  0x9c,0x33,0x78,0xf,0x3,0x8f,0x24,0xbc,0xfe,0xf2,0xf3,0x77,0x68,0xe8,0x36,0x68,\n  0xa4,0xbe,0xf1,0xeb,0xc6,0xfc,0xdf,0xb1,0x4,0x52,0x5e,0x82,0x44,0x4d,0x5f,0x84,\n  0x8f,0xd,0xa5,0x38,0xe7,0xb6,0xc5,0x88,0x9e,0x18,0x4b,0xb9,0x76,0xb3,0x3,0x8,\n  0x9d,0x52,0x11,0xaa,0x90,0xb8,0x50,0xef,0x5a,0xc5,0x30,0x7d,0xb1,0xcb,0x40,0xc5,\n  0xb0,0xe,0xf4,0x26,0xad,0x57,0xf9,0x55,0x2e,0xe1,0xe1,0xc6,0xd2,0x32,0xf5,0xcc,\n  0x70,0x7d,0xc9,0x84,0x2d,0xe9,0x4a,0x19,0x10,0x9c,0x1a,0xc0,0x73,0xe5,0x66,0x97,\n  0x2b,0x37,0xbb,0xac,0x51,0x57,0x3f,0xd7,0xaa,0x64,0x7e,0xc5,0x27,0xa2,0x29,0xac,\n  0x5,0x15,0xc3,0x9c,0xb,0xb5,0x77,0xa6,0x6c,0x17,0xa8,0xc1,0xa9,0x20,0xc8,0x1a,\n  0x35,0xaf,0x9b,0x35,0x1a,0x8f,0x59,0x31,0x9e,0xfe,0x7b,0xe9,0xef,0x14,0x0,0xf1,\n  0x82,0xef,0x9b,0x58,0x30,0x2b,0x57,0x56,0x2,0x55,0x21,0xd1,0x90,0xfc,0xe7,0x53,\n  0xdf,0xf2,0xeb,0x99,0x13,0x2c,0x2d,0xde,0xb8,0xa7,0xfa,0x57,0x6a,0x3,0x3c,0xf5,\n  0xec,0x4e,0x9e,0x79,0x61,0x2,0xf,0xa8,0x33,0x5b,0x31,0x10,0x3,0x7c,0x87,0xf7,\n  0xf7,0xbf,0xc1,0xc2,0xc2,0x2,0xb7,0x6e,0xdd,0xa2,0x28,0xa,0x44,0x4,0x6b,0x2d,\n  0xd6,0x5a,0x54,0x15,0x55,0xc5,0x39,0x87,0xaa,0x62,0xad,0xc5,0x98,0xf0,0xdf,0xe5,\n  0xe5,0x65,0xf2,0x3c,0xef,0xf7,0x23,0xcd,0xf9,0xb8,0xf2,0x2d,0x18,0x70,0x56,0x50,\n  0x17,0x18,0xdc,0x31,0x3a,0xb6,0x72,0x4f,0x38,0x7e,0x9c,0xe9,0xe9,0x69,0x8c,0x31,\n  0x78,0xef,0x99,0x98,0x98,0x60,0x72,0x72,0xf2,0x8e,0x59,0xd8,0x31,0x3a,0xd6,0xdf,\n  0x86,0xae,0xd4,0x9,0x55,0x70,0x36,0xac,0xa2,0x56,0xaf,0xf7,0x6b,0x39,0x33,0x33,\n  0xc3,0xd0,0xd0,0x10,0xd6,0x5a,0xbc,0xf7,0x34,0x9b,0xcd,0xbb,0x2,0x50,0xab,0xd7,\n  0x70,0xd1,0x88,0xb4,0xd4,0x88,0x14,0x9c,0xb,0x27,0x5c,0xa0,0x2a,0x0,0xa8,0x56,\n  0xab,0x64,0x59,0xd6,0xa7,0xb8,0x37,0xde,0x69,0x73,0x1a,0xa9,0x17,0x41,0x4b,0xad,\n  0x38,0x1e,0xc7,0xbd,0x23,0xb4,0xd7,0x8c,0x31,0x88,0x44,0xdf,0x8f,0x3a,0xb8,0xab,\n  0x9b,0xaf,0x35,0xa8,0xd,0xf3,0xf6,0x18,0x2e,0x3d,0x8e,0x83,0x29,0x6d,0xe3,0xd5,\n  0xdb,0x12,0xa9,0xf7,0xe5,0x56,0x6c,0xad,0xf4,0x91,0xe,0x8e,0xc,0xc3,0xf2,0xef,\n  0xdb,0x2,0xe0,0xa1,0x91,0x61,0xd4,0xc2,0xb5,0x2b,0x97,0x59,0x9c,0xbf,0xbe,0x5,\n  0x3,0x36,0xf8,0xc0,0x60,0xad,0x2,0xb,0xdb,0xc3,0xc0,0x50,0xad,0xc2,0xec,0xc5,\n  0x4b,0x9c,0xfd,0xee,0x1b,0xce,0x9f,0x9c,0x9e,0x3,0xa6,0x36,0x4,0x60,0x24,0x5e,\n  0x4a,0x5,0x12,0xb,0xed,0x91,0x27,0xa9,0x3d,0xc,0x6f,0x1f,0x38,0xc8,0x66,0xc7,\n  0x81,0x27,0x3a,0xf1,0x2a,0xe7,0x35,0x1e,0x32,0x81,0x14,0x28,0xba,0x70,0xf9,0xea,\n  0x55,0xce,0x34,0x8e,0xd1,0xfc,0xfa,0x8b,0xb9,0xd9,0x1f,0x4e,0x1d,0x2,0xe,0x6f,\n  0x8,0xe0,0xb3,0x8f,0x3e,0xe0,0xa7,0xd3,0x27,0x57,0x99,0xe9,0xda,0xa3,0x86,0x55,\n  0xe6,0xbb,0x1e,0x4,0x1b,0x3c,0x5f,0x1d,0x6f,0x7c,0x77,0xee,0x8f,0xd9,0x5f,0xe,\n  0x1,0x87,0x1b,0x8d,0xc6,0x5f,0x1b,0x1,0x98,0x9a,0xfe,0xf4,0xe3,0x7f,0xf5,0x73,\n  0x6c,0x7d,0xf2,0x35,0x0,0xe2,0xb7,0xda,0x81,0xff,0xdd,0xd7,0xf1,0x3f,0x4d,0xf0,\n  0x4b,0xb9,0xe8,0x46,0x89,0xaf,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/paste.png\n  0x0,0x0,0x6,0x6d,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x6,0x34,0x49,0x44,0x41,0x54,0x78,0x5e,0xad,0x97,0x5b,0x6c,0x54,0xc7,\n  0x1d,0xc6,0x7f,0x73,0xce,0xd9,0x8b,0xbd,0xf6,0xfa,0x16,0xa0,0xbe,0x0,0xe,0xb2,\n  0x69,0x63,0x24,0x42,0x4a,0x21,0x22,0xa1,0x2d,0x95,0x62,0xa5,0x2f,0xee,0x4b,0x68,\n  0x2b,0x95,0xa6,0x55,0xa5,0xc6,0x60,0x55,0xaa,0xda,0xb4,0xaa,0xfa,0x56,0x9,0x55,\n  0xca,0x3,0x94,0x27,0xda,0x7,0x84,0x14,0x29,0xad,0xc4,0x8b,0xa5,0x52,0x83,0x79,\n  0x8,0xc5,0x18,0x39,0xe,0x69,0xd3,0x84,0x9a,0x9b,0x63,0x6a,0xec,0xb2,0x4,0x1b,\n  0x3b,0xbb,0xf6,0x7a,0x8f,0xbd,0xbb,0xde,0xb3,0x67,0xa6,0xc3,0x68,0x85,0xe5,0x72,\n  0x6c,0x88,0xc9,0x27,0x7d,0xfa,0x9f,0x9d,0x87,0xfd,0x7e,0xf3,0x9f,0x99,0x73,0x11,\n  0x4a,0x29,0x82,0x24,0x84,0x78,0x5,0x78,0x9e,0xc7,0x6b,0x48,0x29,0xf5,0x77,0xd6,\n  0x28,0x27,0x20,0xb8,0x43,0xbb,0x1,0x68,0x97,0x52,0xbe,0xc6,0x63,0x64,0x59,0xd6,\n  0x7,0x1a,0xf6,0xbb,0x40,0xb7,0x6,0x39,0xff,0x14,0x0,0x26,0xfc,0xb7,0xed,0xf5,\n  0xe2,0x60,0x5d,0x44,0x44,0x6e,0xce,0x89,0x8a,0x2b,0x57,0xae,0x50,0x5d,0x53,0x8d,\n  0x40,0x0,0xa0,0x50,0x8,0x65,0x28,0x41,0x29,0x66,0xd3,0x69,0x5e,0xa9,0x17,0x2f,\n  0xbc,0xb4,0x4e,0x6c,0x3b,0xf1,0x1f,0xb9,0x47,0x83,0x7c,0x5b,0x43,0x4c,0x3c,0x4d,\n  0x7,0xf6,0xff,0x60,0x8b,0xdd,0x2c,0x25,0xf8,0x4a,0x32,0x3c,0x3c,0x4c,0x65,0x65,\n  0x25,0x2b,0xc9,0x75,0x5d,0x1e,0xc0,0x6e,0xa9,0xb0,0x22,0x1b,0xa2,0x2a,0x72,0x3f,\n  0xa7,0xea,0x81,0xb5,0x3,0x8,0x2d,0x5,0x48,0xa1,0xd,0xf4,0x5d,0xbc,0x48,0x2e,\n  0x97,0xc3,0x2f,0x16,0x51,0x4a,0x91,0xcf,0xe7,0x59,0x5c,0x5c,0xa4,0x50,0x28,0x50,\n  0xd4,0x63,0xb5,0xb5,0xb5,0x94,0x1,0x58,0x80,0xf8,0x82,0xf6,0x80,0x1,0x0,0x36,\n  0x44,0x5,0x1f,0xf,0xbc,0x4b,0x3e,0x3b,0x8f,0x85,0x44,0x95,0x32,0xe2,0xb6,0xc4,\n  0xb6,0x4,0x21,0x21,0x70,0x3e,0x53,0x6c,0x8c,0x3b,0x80,0x44,0x2a,0x4,0xf0,0x9c,\n  0x10,0x2,0xe0,0xcb,0x40,0x5,0x50,0xf,0x34,0x60,0xc4,0x48,0x69,0x9f,0x24,0x2,\n  0x1,0x4e,0x9c,0x38,0x21,0x0,0x81,0x5,0xd2,0x87,0x96,0x96,0x67,0x9,0x65,0x6d,\n  0x14,0xe5,0x28,0xa5,0xb4,0x41,0x8,0x58,0x57,0x19,0x25,0xe2,0xd8,0x44,0x42,0x16,\n  0xc3,0x13,0x73,0x5c,0xbc,0x3d,0x41,0xf7,0x58,0x8e,0x5c,0x24,0xbe,0xa9,0xbd,0x7d,\n  0xf7,0xef,0x2d,0xcb,0x5a,0xdc,0xb1,0x63,0x47,0x59,0x55,0x55,0x95,0xd3,0xd8,0xd8,\n  0x18,0x7e,0xe0,0x86,0x86,0x86,0xd0,0xa5,0x4b,0x97,0xdc,0xae,0xae,0xae,0x8,0xf0,\n  0xd6,0xaa,0x1d,0x0,0x13,0x44,0x55,0x2c,0xc2,0x73,0xd5,0x31,0xf2,0x9e,0x4f,0xa1,\n  0x28,0x91,0x4a,0x61,0x9,0x41,0xd8,0xb1,0x88,0x86,0x6c,0xe6,0x72,0x5,0x12,0xa2,\n  0x8e,0x3f,0x9f,0xff,0x2b,0xd,0x4d,0x1b,0x1,0x22,0xc0,0x66,0x96,0x84,0xef,0xfb,\n  0x78,0x9e,0x47,0x75,0x75,0xb5,0x9e,0x50,0x4b,0xf4,0xea,0xd5,0xab,0x87,0x84,0x10,\n  0x28,0xa5,0xde,0x5a,0x11,0xc0,0xb2,0x41,0x0,0xb6,0x2d,0x90,0xda,0xb6,0x14,0x38,\n  0x8,0xa4,0x12,0x58,0xc2,0x8c,0x1b,0x8f,0x4c,0xb9,0xec,0x7b,0xf5,0x3b,0xd4,0x37,\n  0x36,0x11,0x7c,0x2f,0xc1,0x84,0x67,0x32,0x19,0xca,0xcb,0xcb,0xcd,0x66,0x3e,0x76,\n  0xec,0xd8,0x26,0xbd,0x7f,0xe,0x2e,0x41,0x2c,0x1,0xd0,0xd9,0xd9,0xa9,0xe,0x1d,\n  0x3a,0xa4,0x6c,0x21,0x8,0x59,0x10,0xb6,0x2d,0x1c,0xc7,0xc6,0x42,0x50,0xb4,0xcd,\n  0x1a,0x1b,0x0,0xc7,0xb2,0x88,0x38,0x96,0xae,0x2,0x60,0x59,0x78,0x10,0xc0,0xdc,\n  0xdc,0x1c,0x35,0x35,0x35,0x6,0x20,0x1a,0x8d,0x72,0xe4,0xc8,0x91,0xcd,0xc0,0x3,\n  0x88,0x1b,0x1a,0xa2,0xc7,0x62,0xb9,0xb0,0x6d,0x74,0x30,0x66,0x8d,0xcb,0x23,0x36,\n  0xb1,0xa8,0xa3,0xc7,0x2c,0x32,0x8b,0x1e,0x93,0x99,0x1c,0x63,0xa9,0x79,0xee,0xcc,\n  0x2e,0xe8,0xdf,0x45,0x72,0xf9,0x3c,0xab,0xc8,0x2c,0x41,0x36,0x9b,0x35,0xa7,0x66,\n  0xe9,0xff,0x6d,0xe,0x1c,0x38,0xb0,0x1e,0xe8,0x0,0x58,0x6,0xa0,0xb4,0x74,0x16,\n  0x8e,0xd,0xe1,0x90,0xc0,0x53,0x8a,0xb1,0xa4,0xcb,0x8d,0x8c,0x83,0xd3,0xb2,0x97,\n  0xa6,0x7d,0xaf,0xb3,0xb5,0xe3,0x17,0xac,0xdb,0xfb,0x3a,0xd,0x2f,0xb4,0x73,0xfb,\n  0xce,0x24,0xfd,0xfd,0xfd,0x24,0x93,0x49,0x94,0x52,0xe6,0xfa,0xf8,0xf1,0xe3,0xe8,\n  0xba,0xac,0x33,0xe7,0xce,0x9d,0xe3,0xe8,0xd1,0xa3,0x1c,0x3e,0x7c,0x98,0xde,0xde,\n  0x5e,0x12,0x89,0x84,0x4,0x2c,0xa1,0x15,0xdc,0x1,0xed,0xff,0xce,0xe6,0xf8,0xe7,\n  0x94,0x4f,0x6b,0xc7,0xcf,0xf8,0xe6,0x2f,0xdf,0x26,0xf6,0xf5,0x37,0x99,0x7c,0xa6,\n  0x83,0x6b,0xfe,0x2e,0xae,0xf1,0x2d,0x64,0x6b,0x17,0xad,0x7b,0x7f,0x4e,0x5e,0x56,\n  0x73,0xfa,0x6f,0x67,0xd1,0x77,0x4d,0xee,0xdc,0x9d,0xe2,0x1b,0xaf,0x76,0x72,0xfd,\n  0xfa,0x75,0x3,0xa0,0x67,0x6b,0xd6,0x3f,0x16,0x8b,0x99,0xeb,0x78,0x3c,0x8e,0xe3,\n  0x38,0x25,0x38,0x4,0xc0,0x23,0x0,0x96,0x25,0x98,0xca,0x41,0x3a,0xde,0xca,0xfe,\n  0xdf,0xbd,0x4d,0xd5,0xae,0xd7,0x28,0x84,0x62,0x8,0xdb,0x42,0x59,0x82,0x6c,0x41,\n  0x72,0x7f,0x66,0x91,0x4f,0xee,0x66,0x18,0xb8,0xea,0x72,0xfa,0x1f,0x61,0x64,0xd5,\n  0x5e,0xae,0x8f,0xdc,0x67,0x32,0xd7,0xc6,0x85,0xf,0xee,0x9b,0x0,0xed,0x87,0xa1,\n  0xcd,0xcd,0xcd,0xb4,0xb5,0xb5,0x19,0x37,0x35,0x35,0xa1,0xa1,0x14,0x20,0x83,0x1f,\n  0x46,0x16,0xdc,0x71,0x15,0xdf,0xff,0xe9,0x6f,0xa8,0x6c,0xd8,0x48,0xe2,0xec,0x3b,\n  0x4c,0x8f,0x5e,0xc3,0x89,0x94,0xb1,0xb5,0x79,0x7,0x9b,0x5b,0xb6,0xf3,0x49,0x79,\n  0x25,0x63,0x9,0x97,0xcf,0x66,0xf2,0xdc,0x9d,0xce,0x32,0xa1,0xed,0x88,0xd,0x4c,\n  0x27,0xe7,0xd8,0xb7,0x2b,0xca,0xfa,0x25,0x0,0x33,0x7b,0x3d,0x6b,0xea,0xea,0xea,\n  0x0,0xcc,0x75,0x2a,0x95,0x32,0x0,0x4a,0x2b,0x10,0xa0,0xb9,0x5a,0x70,0xe1,0x9d,\n  0x63,0x28,0x2c,0xca,0xe6,0xc6,0xd9,0x10,0x8f,0x52,0x94,0x92,0x7b,0xc3,0x7d,0x24,\n  0x65,0x5,0xdb,0xda,0x7f,0x4c,0x4d,0xdb,0xcb,0x7c,0x3c,0x9c,0x66,0xd2,0x5f,0xc0,\n  0xcd,0x78,0x2c,0xcc,0x6b,0x2f,0x78,0x20,0x0,0xb5,0x74,0x3a,0x42,0xa1,0x90,0x9,\n  0x2d,0xdd,0xea,0x1f,0x8e,0x1,0x2a,0xf8,0x3e,0x60,0xc1,0xc6,0xb8,0xa0,0x50,0x1c,\n  0x23,0x1c,0x8b,0x53,0xb7,0xa5,0x96,0x92,0x78,0x76,0x7d,0x5,0xe9,0xac,0xc7,0x68,\n  0xff,0x9f,0x98,0xae,0xbc,0x4c,0xcb,0xf6,0x83,0xb8,0xb,0x61,0xbc,0x82,0xa4,0x58,\n  0x94,0x78,0xda,0x21,0xc7,0x42,0x2d,0xaa,0x80,0xe3,0x69,0xa0,0x96,0xd5,0x15,0x1,\n  0x0,0xd6,0xc7,0x43,0x84,0xca,0x23,0xfc,0xbf,0x6a,0x63,0x21,0x9e,0xa9,0xc,0x73,\n  0xe1,0xdf,0x83,0xec,0xd9,0xf9,0x13,0xca,0xa3,0xe,0xb9,0x32,0x47,0x3,0x28,0x3,\n  0x61,0x6b,0x0,0x16,0x4b,0x21,0xa5,0x1c,0x25,0x30,0x2a,0x15,0xa4,0x5c,0x5,0x40,\n  0x58,0xa5,0x2a,0xcc,0xf5,0x23,0xfa,0x70,0x6c,0x86,0xf1,0x59,0x8f,0xef,0xfd,0xfa,\n  0x8f,0xdc,0xca,0xd4,0xe0,0x44,0x5c,0xa2,0x11,0x1b,0xcf,0x93,0x14,0x3d,0x7,0xd3,\n  0x1,0xa5,0x90,0x52,0xf2,0x50,0x6a,0x59,0x1,0x56,0x5,0x10,0x8,0x4c,0xd,0x4,\n  0x18,0x9d,0x76,0xf9,0xd5,0x5f,0x86,0x18,0xbd,0xb7,0x80,0x3d,0x93,0x67,0xd3,0xba,\n  0x32,0xf2,0x79,0x5f,0xbb,0x68,0xea,0xce,0xaf,0xd4,0x70,0xf9,0xdd,0xe0,0x25,0x0,\n  0x9e,0x78,0x9,0x4c,0xb8,0x10,0x3c,0xa2,0xd6,0x2f,0x55,0xf2,0x87,0x1f,0x3e,0xcf,\n  0xf5,0x4f,0x33,0x44,0x1b,0xb7,0xb1,0xf3,0xc5,0x97,0x59,0x12,0x5c,0x4e,0x60,0x8e,\n  0xdb,0x53,0x1,0x28,0xc0,0x12,0x25,0x0,0x6d,0xd4,0x52,0x7d,0xb1,0xb5,0x96,0xdd,\n  0x5b,0xe2,0x74,0xbf,0x97,0xa5,0x6a,0xf7,0x57,0xf9,0xd1,0x1b,0x6f,0x10,0xa0,0xb5,\n  0x3,0x98,0xb5,0x37,0xd5,0xd8,0x8,0x1,0xd2,0xcb,0x53,0x70,0x53,0x78,0xf3,0x33,\n  0x14,0xb3,0x69,0xa,0x19,0x1f,0x25,0xfd,0xd5,0x82,0xd6,0x8,0xf0,0xf0,0x29,0xe7,\n  0xe3,0xe7,0x33,0x14,0xe6,0x75,0xa8,0xe,0xd6,0x0,0xcb,0xf7,0x89,0x10,0xc1,0x33,\n  0x7d,0xfa,0xd7,0x72,0x8c,0xb2,0x13,0x37,0x3,0xc7,0x1,0xb2,0x1e,0xfe,0xad,0x94,\n  0xcc,0x6f,0xf7,0x44,0x54,0x3,0xd8,0x5f,0x70,0x7,0x8,0x92,0x9,0xfd,0xd7,0x3d,\n  0x3f,0xfd,0x7e,0x42,0xa6,0xcf,0xdf,0xf6,0xef,0x2,0xee,0x76,0x3b,0xfc,0x92,0x6,\n  0xa8,0xe3,0x73,0xca,0x75,0x5d,0x1f,0x70,0x57,0xed,0x0,0x40,0x32,0xab,0xa,0x1f,\n  0x7e,0x2a,0xd3,0xbd,0xb7,0xfc,0xd4,0xcd,0x69,0x39,0x5,0xf4,0x3,0x97,0x74,0x68,\n  0xbf,0x10,0xa2,0xd3,0xb6,0xed,0xaf,0x7d,0x9e,0x25,0x58,0x58,0x58,0xf0,0x7,0x6,\n  0x6,0xd2,0x27,0x4f,0x9e,0x9c,0x6,0xba,0x83,0x0,0x3e,0x1a,0x49,0xca,0xad,0xe3,\n  0xb3,0x2a,0xd7,0x3b,0xe2,0xa7,0x6e,0x4c,0xcb,0xd1,0x52,0xe8,0x59,0x1d,0x74,0x8b,\n  0x0,0x3d,0x9,0xc0,0xd0,0xd0,0x90,0xdb,0xd3,0xd3,0x93,0xd2,0x4e,0xcf,0xce,0xce,\n  0x9e,0x2e,0xbd,0x1d,0xdf,0x8,0x2,0xe8,0xee,0xea,0x29,0x0,0x8c,0x4,0x84,0x6,\n  0x85,0xaf,0x8,0x30,0x35,0x35,0x55,0xd0,0x2f,0x22,0xa9,0x53,0xa7,0x4e,0x25,0xc7,\n  0xc7,0xc7,0x2f,0x3,0x67,0x81,0x7e,0x1d,0xec,0xae,0xb8,0x9,0x4b,0xdf,0x76,0xda,\n  0x4f,0x26,0x85,0x1,0x40,0x8,0x40,0x61,0x5a,0xfc,0xde,0xe0,0x60,0xba,0xbb,0xbb,\n  0x3b,0xa5,0xdf,0x8a,0xcc,0x24,0xd0,0x5e,0xed,0x73,0xcd,0x61,0xed,0x9a,0x77,0x33,\n  0x6e,0x11,0x60,0x70,0xf0,0xfd,0x74,0x5f,0x5f,0x5f,0xfa,0xcc,0x99,0x33,0xa6,0xc5,\n  0xa5,0xd0,0x8f,0x78,0x2,0x89,0xb5,0x9e,0x63,0x21,0x44,0x18,0x78,0x13,0xd8,0x4f,\n  0x69,0x73,0x6,0xb4,0xf8,0xb1,0xfa,0x1f,0xbd,0xfa,0x2a,0x5f,0xf2,0xd8,0x15,0x9d,\n  0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/open.png\n  0x0,0x0,0x8,0x19,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xd6,0xd8,0xd4,0x4f,0x58,0x32,\n  0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,\n  0x0,0x41,0x64,0x6f,0x62,0x65,0x20,0x49,0x6d,0x61,0x67,0x65,0x52,0x65,0x61,0x64,\n  0x79,0x71,0xc9,0x65,0x3c,0x0,0x0,0x7,0xab,0x49,0x44,0x41,0x54,0x58,0xc3,0xad,\n  0x57,0x5b,0x50,0x93,0x67,0x1a,0xf6,0xca,0xce,0xec,0xcc,0xf6,0x62,0x2f,0xbc,0xd9,\n  0xe9,0xce,0xec,0x6e,0xbd,0xda,0xd9,0x9b,0xb5,0xce,0xba,0x3b,0x7b,0xb0,0xad,0xcc,\n  0x7a,0xb1,0xce,0xce,0x3a,0xb3,0x76,0x54,0x70,0x75,0xdb,0xe2,0x81,0xd6,0xb6,0x54,\n  0x4,0xbb,0xa5,0x20,0x6d,0xc1,0x82,0x6,0x8,0x7,0x51,0x42,0x80,0x80,0x80,0x2,\n  0x21,0x81,0x10,0x92,0x40,0x48,0x10,0x73,0x24,0x21,0x67,0x72,0x80,0x4,0x42,0x20,\n  0x9c,0x9,0x47,0xb5,0x54,0x78,0xf6,0xfb,0x7e,0x13,0x16,0x30,0x58,0x8b,0x7d,0x67,\n  0x9e,0xf9,0x2f,0x92,0xfc,0xcf,0xfb,0x3e,0xcf,0xfb,0xbe,0xdf,0x97,0x5d,0x0,0x76,\n  0xfd,0x98,0x20,0xf1,0xb,0x82,0x14,0x2,0x3,0xc1,0x75,0x82,0x3,0xcf,0xfd,0xfe,\n  0x8f,0x48,0xbc,0x9b,0x20,0xe1,0x57,0xaf,0xef,0xb5,0x2a,0x8c,0xd6,0x65,0xdb,0x2,\n  0x60,0x19,0x1e,0x5b,0x9,0x27,0xf1,0x33,0xfa,0x19,0x81,0x22,0xfc,0xdc,0x3e,0x76,\n  0x48,0x7e,0x8a,0xa0,0xb9,0xb6,0x59,0x1c,0x32,0xcf,0xad,0x42,0x39,0xfe,0x1d,0x44,\n  0xf6,0x51,0xd8,0xc7,0xe6,0xe8,0x87,0x86,0x3d,0x7b,0xf6,0x58,0x53,0x52,0xae,0x2c,\n  0xca,0x3a,0x3a,0x10,0x4e,0xe2,0xe5,0x49,0xc3,0xc4,0x31,0x4,0xb7,0x3e,0x49,0xf9,\n  0x2c,0x60,0x9b,0x5d,0x59,0x53,0x4d,0x3,0x4d,0xb6,0x11,0x34,0xeb,0xfb,0x20,0x31,\n  0x79,0x60,0x19,0x9d,0xc5,0xbb,0xef,0xbe,0x3f,0xc5,0xab,0xbe,0x83,0xf1,0x89,0x29,\n  0x4c,0x4f,0xcf,0xae,0x92,0xef,0xd7,0xbc,0x74,0x2,0x11,0x9f,0xf,0xbe,0x1d,0xe3,\n  0xb2,0x4,0x43,0x4f,0xb4,0x33,0x40,0x8b,0x7b,0x6,0xcd,0x3d,0x2e,0x34,0xeb,0xec,\n  0xa8,0x57,0xf6,0x20,0x87,0x53,0x85,0x32,0x5e,0x35,0x43,0xbc,0xb0,0xf4,0x90,0x81,\n  0xc1,0x60,0x5c,0x26,0xbf,0x4b,0x7c,0xe1,0x4,0x48,0x1c,0x24,0x38,0x41,0xfd,0xdd,\n  0xea,0x73,0x27,0xf1,0xb9,0x27,0x4,0x48,0x87,0x97,0xc1,0xd7,0xbb,0x20,0x22,0x55,\n  0x37,0xdc,0x37,0xa2,0xb8,0x4e,0x88,0x2c,0x56,0x3e,0xcc,0x56,0xdb,0x3a,0x71,0x4,\n  0x2c,0x16,0x6b,0x2c,0xfc,0xce,0xe7,0x27,0x10,0x91,0x36,0x93,0x95,0x3f,0x46,0x7d,\n  0xa5,0xfe,0x12,0xc4,0x6f,0xf4,0x59,0x31,0xb6,0x2,0x7e,0xef,0x20,0x5a,0x7b,0x9c,\n  0xe0,0x3f,0x30,0xa1,0x4c,0x28,0x43,0x46,0xe,0x1b,0xb2,0xe,0xf9,0x26,0xd2,0xf9,\n  0xc5,0x65,0xcc,0x2d,0x2c,0x21,0x34,0xbf,0x88,0xbd,0x7b,0xf7,0x5a,0xc9,0x3b,0x7e,\n  0xba,0x6d,0x2,0x24,0x7e,0x43,0x90,0x46,0x3d,0x35,0x13,0x69,0x75,0xb3,0x80,0xd2,\n  0x3f,0xf,0xcb,0xc4,0xe2,0x9a,0x50,0xa1,0x5a,0xb4,0x6c,0xf1,0x59,0xa0,0xb6,0xa0,\n  0xa6,0x5d,0x8d,0x2f,0xb2,0x73,0x71,0xb7,0x9e,0xff,0xc,0x31,0x25,0x9d,0x9,0xcd,\n  0x63,0x62,0x6a,0x6,0x83,0x43,0x81,0x27,0xe4,0xdd,0xbc,0x2d,0xd3,0xb0,0x3b,0x92,\n  0x3,0x33,0x26,0xd4,0x53,0xb5,0xd3,0xfb,0x58,0x4f,0x88,0xc5,0x3,0x21,0x88,0x2c,\n  0x43,0x50,0xba,0x46,0xd0,0xed,0x9,0x42,0xe5,0x9b,0x42,0x9b,0x73,0xfc,0xa9,0xcf,\n  0x5a,0x1b,0xee,0x2a,0x74,0xc8,0xbc,0xc9,0x45,0x9,0xa7,0x6c,0x93,0xcf,0x9b,0x88,\n  0x27,0xa7,0x11,0x18,0x1d,0xc3,0x80,0x6f,0x8,0xa2,0xd6,0xd6,0x25,0xc2,0x51,0xdb,\n  0x28,0x12,0x87,0xc6,0x1f,0xaf,0x82,0x2f,0x62,0x94,0x4d,0x89,0x24,0x90,0x22,0xea,\n  0x52,0x2d,0x9a,0x42,0xab,0xe8,0x18,0x79,0x4,0xa1,0xc5,0xcf,0x10,0x53,0x74,0xf6,\n  0xd,0xa3,0xd3,0xe1,0x87,0xd4,0x3c,0x80,0x16,0xbd,0x3,0xd,0x5d,0x6,0x14,0xd5,\n  0xa,0x90,0x91,0x95,0xd,0x2f,0x79,0xf1,0xc6,0xaa,0xa9,0xd4,0xb3,0x73,0xb,0x4c,\n  0xc5,0x94,0xd8,0xdd,0xef,0x85,0xc9,0x62,0x5,0xb7,0xbc,0x12,0xa5,0xe5,0x95,0x4b,\n  0x13,0xf3,0xcb,0xab,0x23,0xf,0x1,0x37,0xd9,0x11,0xe6,0xd9,0x15,0x84,0x97,0x15,\n  0x13,0x6,0xcb,0x3c,0xd0,0x68,0xf2,0xa3,0xdd,0xee,0x5f,0x27,0x96,0x3b,0x86,0x20,\n  0xb3,0x78,0xd7,0x7d,0xe6,0x8,0xa4,0xf8,0x3c,0x33,0x1b,0x2a,0x8d,0x36,0xaa,0xdc,\n  0x53,0x33,0x21,0x8c,0x8e,0x8d,0x33,0x15,0xd3,0x26,0xe4,0x37,0x9,0xf1,0xc1,0xc5,\n  0x8f,0x51,0x73,0xaf,0x1,0xbe,0x65,0x60,0xfc,0x11,0xa0,0x23,0x13,0x23,0xf2,0xce,\n  0xa1,0xbe,0x5d,0xb9,0xb8,0x51,0x1,0x83,0x81,0x74,0x74,0x4d,0xa7,0x1e,0xa,0x67,\n  0x80,0xa9,0xb8,0xdd,0xea,0x83,0xd8,0xe8,0x42,0x93,0xca,0xcc,0xf8,0x7c,0xe5,0xcb,\n  0x2c,0x88,0xda,0x24,0x51,0x89,0xa7,0x67,0xe7,0x18,0x1b,0x86,0x86,0x47,0x60,0x77,\n  0x38,0x49,0x82,0x3a,0x24,0x7c,0xf8,0x21,0xae,0xb3,0xb,0xe1,0x99,0x5c,0x80,0x6f,\n  0x9,0xd0,0x90,0xde,0xe1,0xf,0x2c,0x81,0xab,0x1f,0xc4,0x7d,0xef,0x4,0xdd,0x7,\n  0x1d,0x61,0xeb,0xff,0x9f,0xc0,0x1d,0xb9,0x16,0x1d,0xf6,0x21,0x48,0xcc,0xfd,0x4f,\n  0x7d,0xee,0xd4,0x22,0x9d,0x55,0x84,0xaa,0x9a,0xba,0x4d,0x3e,0x47,0xe4,0x8e,0xf8,\n  0x3c,0x3c,0x12,0x84,0xd3,0xdd,0xf,0xbd,0xc1,0x88,0xc2,0xe2,0x62,0x9c,0x7e,0x2f,\n  0x1e,0x3d,0x3,0x1,0xf4,0x2f,0x2,0x83,0x84,0xbc,0xc5,0xff,0x2d,0xee,0x3a,0x43,\n  0x28,0x51,0x91,0xf7,0xf6,0x5,0xf1,0x4e,0xdc,0xbf,0x7d,0x84,0x33,0x69,0xe3,0x20,\n  0x18,0xf4,0x33,0xab,0xe0,0xc9,0x54,0x68,0x35,0x38,0xd1,0xd8,0xdd,0xb,0x9e,0x58,\n  0x89,0xac,0x5c,0xf6,0x33,0x3e,0x47,0xaa,0x9e,0x9c,0x9e,0x65,0xe4,0xee,0xf7,0xe,\n  0xa2,0xd7,0x6c,0x41,0x43,0x3,0x1f,0x27,0x62,0xe3,0x20,0xe9,0xd6,0xc0,0x45,0xcf,\n  0x1,0x52,0x90,0x24,0xb8,0x86,0xb2,0x9e,0x0,0x6e,0xb4,0xdb,0x50,0xd1,0x1b,0x44,\n  0x85,0xce,0x8b,0x4a,0x7e,0xb,0x6d,0xbe,0x9b,0x5b,0x27,0xd1,0xa0,0x99,0xf8,0x16,\n  0x65,0x22,0x5,0xee,0x29,0xf4,0x28,0x13,0xc8,0x90,0x78,0x35,0xb,0x1a,0xad,0x3e,\n  0xaa,0xdc,0x63,0x13,0x93,0xf0,0xd,0xd,0xc3,0x66,0xef,0x83,0xb4,0x5d,0x8e,0xc4,\n  0x4b,0x97,0x90,0xc3,0xca,0xc3,0xd4,0x63,0xc0,0x4e,0x7a,0x49,0x31,0x4e,0xfa,0x89,\n  0x94,0x7f,0x5b,0x3b,0x84,0x7c,0x85,0x13,0x25,0x6a,0x1f,0x4a,0xd5,0x3,0xe8,0xf2,\n  0x30,0xa3,0x28,0x22,0xf8,0xf9,0x33,0x9,0x74,0x8f,0x2e,0xa1,0xa8,0xbe,0x15,0xa5,\n  0x7c,0x9,0xb2,0x4a,0x2a,0xf0,0xcf,0xe3,0x71,0x51,0xe5,0xf6,0x7,0x46,0xd1,0xe7,\n  0xf2,0x40,0xab,0x37,0x20,0xfd,0x6a,0x6,0x92,0xbf,0x48,0x83,0xcd,0x37,0x2,0x27,\n  0xa9,0xda,0x40,0x1a,0x4c,0xe0,0x7b,0x88,0x52,0x9d,0x1f,0x45,0xdd,0xfd,0xc,0x71,\n  0x41,0x97,0x1b,0xc5,0xdd,0x1e,0x88,0x9c,0x41,0xfc,0xf9,0xcd,0xb7,0x5d,0x84,0xeb,\n  0x6c,0xb4,0x43,0xd0,0x28,0xf7,0x4e,0x23,0xa7,0xfc,0x1e,0xb2,0x4b,0xab,0xf1,0x51,\n  0xea,0x57,0x48,0xfe,0x6f,0xea,0xfa,0x58,0x51,0xb9,0x47,0x82,0xe3,0xf0,0xc,0xf8,\n  0x60,0x34,0x99,0x51,0xc9,0xab,0xc2,0xfb,0x67,0xcf,0x41,0xfe,0x40,0x3,0x3f,0xe9,\n  0x6e,0xb2,0x8d,0x19,0xb9,0x6f,0x69,0x6,0x19,0xd2,0x9b,0x2a,0x2f,0x72,0xe5,0xe,\n  0xe4,0x75,0xf6,0xa1,0xf0,0xbe,0x1b,0x1c,0x95,0x1b,0xf9,0x9c,0xca,0x29,0xc2,0x53,\n  0xb8,0xdd,0x29,0xdc,0x2b,0x76,0x4,0x90,0x51,0xc8,0xc5,0x95,0x6b,0x79,0x38,0x11,\n  0x9f,0x80,0x9b,0xb7,0x6e,0x33,0x63,0x15,0x91,0xdb,0x6a,0x73,0x40,0x22,0x6d,0xc7,\n  0x85,0x84,0xf,0x50,0x74,0xbb,0xc,0xf3,0x2b,0x80,0x9f,0x34,0x58,0xf7,0x24,0x20,\n  0x1c,0x7c,0x84,0x4a,0xd3,0x18,0x38,0xfa,0x61,0x86,0x9c,0x56,0xfd,0x55,0xb3,0x1e,\n  0xac,0xe,0x3b,0xb8,0x3a,0x1f,0xd9,0x21,0x1e,0x7a,0x2f,0xe0,0x13,0xbc,0xba,0x5d,\n  0x2,0x26,0xbe,0xc1,0x83,0x94,0x6f,0xd8,0x38,0x9f,0x9c,0x8a,0x3,0x7f,0x3d,0x4,\n  0x63,0xaf,0x99,0xe9,0x6e,0x2a,0xb7,0x46,0xd7,0x83,0xa4,0xcb,0xc9,0x48,0xff,0x3a,\n  0x8b,0x8c,0xd5,0x3c,0x53,0xb5,0x71,0xf6,0xa9,0xdc,0x35,0xf6,0x69,0x5c,0x97,0x59,\n  0x19,0xd9,0xbf,0x6e,0x21,0xa7,0xa0,0xd4,0x82,0x74,0xbe,0x1a,0x57,0x9b,0x34,0x60,\n  0xc9,0xcc,0x10,0xbb,0x82,0xf8,0xe5,0xaf,0x5f,0xa7,0x67,0xc0,0x3b,0xe1,0x75,0x1f,\n  0x35,0xcc,0x35,0xdd,0x66,0x7c,0x94,0x96,0x85,0xb8,0x73,0x17,0xf1,0x97,0x43,0x31,\n  0x4c,0xd5,0x74,0x99,0xf0,0xaa,0xaa,0x71,0xfa,0xf4,0x19,0x68,0xcc,0xe,0x8c,0x92,\n  0x2d,0x36,0x14,0x1e,0xab,0x5a,0xc7,0xc,0x78,0xe6,0x71,0x70,0xd,0x23,0x4c,0xa3,\n  0x65,0x8a,0xc,0x8c,0xec,0xb4,0xfa,0x9c,0xb6,0x5e,0x94,0x74,0x39,0xd0,0x66,0xf7,\n  0xaf,0x1e,0x3d,0x11,0x4b,0x47,0x2e,0x6f,0xc3,0x79,0x13,0x35,0x2c,0x5c,0x99,0x1a,\n  0xf1,0x97,0x3e,0xc7,0xd1,0xd8,0x33,0xf8,0x38,0x31,0x9,0x86,0x5e,0x13,0x1a,0x9b,\n  0x4,0xf8,0xdd,0x1b,0xfb,0x51,0x4f,0xd4,0xf1,0x90,0x99,0xee,0x9a,0x0,0xaa,0xad,\n  0x93,0x60,0x2b,0x5d,0xc,0x39,0xf5,0xbc,0xf0,0xbe,0x67,0xbd,0xea,0xcc,0x16,0x3d,\n  0x4a,0x55,0x1e,0x8,0x6d,0x1,0x94,0xd4,0xf1,0x43,0xe1,0x65,0x53,0x40,0xf0,0xca,\n  0xf7,0x25,0x60,0x2b,0x6e,0x6a,0xc7,0xa9,0x84,0x44,0xc4,0x1c,0x39,0x8a,0xdc,0x7c,\n  0x36,0x5a,0x5a,0xc5,0x38,0x14,0x13,0x83,0x2f,0x39,0x35,0xc8,0x14,0x6a,0x98,0xe6,\n  0xa2,0xd5,0xd2,0x27,0xf5,0x9a,0x7a,0x4c,0x13,0xa1,0x49,0x64,0xb7,0x99,0x90,0xdb,\n  0x6e,0x46,0xb9,0xda,0x8d,0x6,0xa5,0x76,0x39,0x2c,0x39,0x3d,0xf9,0x4e,0x13,0xec,\n  0xd9,0x72,0xd4,0x47,0xd,0x3b,0xab,0x46,0x88,0x63,0xff,0x39,0x8f,0xdf,0xee,0xfb,\n  0x3d,0x1a,0xf9,0x2,0x9c,0xbf,0x90,0x80,0x93,0xf1,0x17,0x70,0xa3,0xad,0x7,0x19,\n  0xc4,0x4f,0x4a,0x14,0xe9,0x6e,0xba,0x58,0xa8,0xef,0x2c,0xfa,0x94,0x98,0x50,0x28,\n  0xb7,0x40,0xe9,0xe,0x3c,0xf9,0x57,0xec,0x29,0x2a,0x77,0x2d,0xc1,0x67,0x4,0xfb,\n  0xb6,0xb9,0xe4,0x44,0x8d,0xbe,0xcc,0xb2,0x5a,0xfc,0xe3,0xe4,0x19,0x1c,0x3c,0xf4,\n  0x37,0xb0,0x72,0xf3,0xb0,0xef,0xc0,0x1f,0x50,0x20,0xd1,0x21,0x89,0x27,0x65,0x2a,\n  0xa6,0x4b,0x85,0x3e,0xbf,0x21,0xd5,0x46,0xe4,0x2e,0x90,0x5b,0x21,0xb0,0xc,0xae,\n  0xe5,0xdc,0xe2,0xd2,0x11,0x13,0x13,0xe4,0x87,0x6f,0x3c,0xaf,0x3c,0xe7,0x96,0x15,\n  0x35,0x9c,0x69,0x45,0xe5,0xf8,0xfb,0xb1,0x58,0x1c,0x3f,0x19,0x87,0x37,0xf6,0xef,\n  0xc7,0x8d,0x3a,0x11,0x92,0xab,0xa4,0xc,0x21,0xed,0x70,0xea,0x35,0x55,0x21,0x8b,\n  0x34,0x5b,0xc9,0x3,0x37,0x2a,0x34,0x6e,0xd4,0x49,0x3a,0x17,0xc3,0x72,0x73,0x8,\n  0x8e,0x6d,0x95,0xfb,0x87,0x24,0xe0,0x4a,0x65,0x73,0x70,0xe4,0xf8,0x29,0x1c,0x3e,\n  0x7c,0x98,0x8c,0x63,0x2e,0x32,0x5,0x2a,0x5c,0x22,0xd5,0xd3,0x5d,0x7e,0x4d,0xdc,\n  0xb,0x36,0xe9,0x74,0x76,0xa7,0x1d,0x77,0x8c,0xe4,0x88,0xb6,0xf9,0x9e,0x84,0xb7,\n  0x1a,0x95,0xfb,0x22,0xbd,0x49,0xfd,0x80,0xb,0x6d,0xf4,0x4,0x32,0x4a,0x78,0x4c,\n  0xf,0x9c,0x4b,0x49,0xc3,0xb5,0xa6,0x2e,0x7c,0xc2,0x6d,0x65,0x36,0x59,0xf1,0x83,\n  0x1,0x5c,0x97,0x9a,0xc1,0x51,0x7b,0x20,0xf3,0x4,0xd7,0xce,0x25,0x26,0x5,0x36,\n  0xc8,0xfd,0xc7,0x9d,0xc8,0x1d,0xd5,0x82,0xdc,0x1a,0x1,0xce,0x5e,0x4e,0x45,0x81,\n  0x58,0x85,0x78,0xf6,0x5d,0x5c,0xa9,0x55,0x90,0xaa,0xfb,0xc0,0x96,0xdb,0x50,0xad,\n  0x75,0xe3,0xae,0x54,0x41,0x2f,0x10,0xca,0xd,0x72,0xbf,0xba,0xd3,0x6a,0xa3,0x5,\n  0xb7,0xa2,0x51,0xf8,0x1d,0xaf,0x43,0x8d,0x4f,0xb9,0x2d,0x88,0xcb,0xe6,0xe1,0x9a,\n  0x48,0x8f,0xaa,0x1e,0x2f,0x9a,0x35,0xe6,0xc7,0x7f,0x7a,0xf3,0x2d,0x57,0x78,0xac,\n  0xa8,0xdc,0xaf,0xbd,0xac,0xdc,0xd1,0xe2,0x8,0xdd,0x5,0x5c,0x75,0x1f,0xde,0xcb,\n  0xaf,0x45,0xb9,0x76,0x0,0x32,0x67,0x60,0xf5,0xc2,0xa7,0x97,0xa9,0xdc,0xf7,0x8,\n  0xd2,0xa9,0xdc,0x3b,0xf8,0x3,0xf3,0xc2,0xf1,0x13,0x82,0xca,0x1c,0xee,0x9d,0x50,\n  0xb,0x39,0x94,0xb8,0xd,0xc2,0xc8,0x16,0xa3,0x17,0x87,0xc3,0x2f,0x22,0xf7,0xe,\n  0xff,0xda,0x6d,0x8a,0xdd,0x61,0x99,0xd5,0x1b,0xb6,0xd8,0x6b,0xbb,0x5e,0x32,0xbe,\n  0x2f,0x89,0xff,0x1,0x66,0xb9,0x5f,0xfc,0x11,0x80,0x3d,0xcf,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00006.png\n  0x0,0x0,0x1,0x93,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x9,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,\n  0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0xd,0xb8,0x3,0x0,\n  0x2,0x68,0xc0,0x1d,0x0,0x10,0x40,0x2c,0x14,0xea,0x27,0x54,0x8c,0x32,0x12,0x32,\n  0x0,0x20,0x80,0x28,0x71,0xc0,0x7f,0x46,0x46,0xfc,0xe6,0xff,0x87,0x94,0xf3,0x78,\n  0x15,0x1,0x4,0x10,0xb,0x25,0x96,0x13,0xaa,0x47,0xa0,0x6a,0xf0,0x3a,0x2,0x20,\n  0x80,0x98,0x68,0x61,0x39,0xa1,0x90,0x41,0x6,0x0,0x1,0xc4,0x44,0xb,0xcb,0x49,\n  0xa9,0x61,0x1,0x2,0x88,0x69,0x20,0x2d,0x7,0x1,0x80,0x0,0x62,0xa2,0x95,0xe5,\n  0x48,0x7c,0xbc,0xf1,0x1,0x10,0x40,0x4c,0x3,0x69,0x39,0x8,0x0,0x4,0x10,0xb,\n  0xb1,0x59,0x8d,0xd8,0x84,0x45,0x8a,0xe5,0x20,0x0,0x10,0x40,0x44,0x65,0x43,0x62,\n  0xb2,0x1b,0x39,0x96,0x83,0x0,0x40,0x0,0x51,0xad,0x28,0x26,0xc7,0x72,0x10,0x0,\n  0x8,0x20,0x16,0x62,0xd,0x27,0x32,0x94,0x18,0x49,0x75,0x38,0x40,0x0,0xb1,0x50,\n  0x1a,0xfc,0xa4,0x94,0xfb,0xd8,0x0,0x40,0x0,0xb1,0xd0,0xc2,0x50,0x52,0x0,0x40,\n  0x0,0xd,0x78,0x75,0xc,0x10,0x40,0x3,0xee,0x0,0x80,0x0,0x1a,0x70,0x7,0x0,\n  0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0x34,0xe0,0xe,0x0,\n  0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0xd,0xb8,0x3,0x0,0x2,0xc,0x0,0x1f,0xc5,\n  0x4a,0x53,0x9b,0x40,0x18,0xd3,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00007.png\n  0x0,0x0,0x1,0xbb,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x31,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0x10,0xc9,0xe,0x60,0x64,0x64,0xfc,0xf,0xc2,0x84,\n  0xd4,0xe0,0xe3,0x23,0x3,0x80,0x0,0x62,0x22,0xd5,0x72,0x50,0xa2,0x5,0x61,0x5c,\n  0x86,0xc2,0xd4,0xc0,0xe4,0xd1,0xf9,0xe8,0x0,0x20,0x80,0xa8,0x1e,0x5,0x40,0xcb,\n  0x80,0x76,0x31,0xc2,0x1d,0x9,0xa5,0xc1,0xe2,0xd8,0xd4,0x3,0x4,0x10,0x4d,0xd2,\n  0x0,0x9a,0x23,0x70,0x5a,0xe,0x2,0x0,0x1,0x44,0x13,0x7,0xa0,0xf9,0x1c,0x6f,\n  0x1a,0x0,0x8,0x20,0x26,0x4a,0x2d,0x42,0x4f,0x94,0xe8,0xc1,0x4e,0xc8,0x11,0x0,\n  0x1,0xc4,0x42,0x61,0x50,0xc3,0x2c,0x65,0x40,0x73,0x4,0x3c,0xd8,0xa1,0x8e,0xf8,\n  0x8f,0x2b,0x1a,0x0,0x2,0x88,0x89,0x5a,0x59,0xf,0x96,0x3b,0xb0,0x65,0x3d,0x7c,\n  0x69,0x0,0x20,0x80,0x98,0x48,0xc9,0x7a,0xa4,0x84,0xc,0xa1,0xb8,0x87,0x1,0x80,\n  0x0,0x1a,0xf0,0x92,0x10,0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0xc4,0x44,0x4e,0xa2,\n  0x23,0x96,0x4d,0xc,0x0,0x8,0xa0,0x1,0xf,0x1,0x80,0x0,0x1a,0x70,0x7,0x0,\n  0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0xc4,0x44,0x44,0xc2,\n  0x3,0x17,0xa7,0xb4,0x2,0x0,0x1,0xc4,0x44,0x64,0xea,0x27,0xd9,0x11,0x84,0x6a,\n  0x41,0x18,0x0,0x8,0x20,0x46,0x52,0xb2,0xd,0x31,0x25,0x1b,0x31,0xc5,0x2f,0x32,\n  0x0,0x8,0xa0,0x1,0x4f,0x3,0x0,0x1,0xc4,0x38,0xd0,0xfd,0x2,0x80,0x0,0x1a,\n  0xf0,0x10,0x0,0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0xd,0xb8,0x3,0x0,0x2,0x68,\n  0xc0,0x1d,0x0,0x10,0x40,0x3,0xee,0x0,0x80,0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,\n  0x80,0x3b,0x0,0x20,0xc0,0x0,0xbb,0x7f,0x8c,0x33,0xe4,0xfc,0xec,0x2c,0x0,0x0,\n  0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/icon-1-2.png\n  0x0,0x0,0x1,0x19,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x8f,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0xc4,0xc1,0x83,0x7,0x49,0x36,0xc5,0xde,0xde,\n  0x9e,0x11,0x44,0x3,0x4,0x10,0xb,0x4c,0xe0,0xc0,0x81,0x3,0x70,0x49,0x7,0x7,\n  0x7,0xc,0xbe,0x83,0xbd,0x3d,0x9c,0x7f,0xe0,0xe0,0x41,0x38,0x1b,0x20,0x80,0x98,\n  0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0xc4,0x8,0xa,0x44,0x4a,0xc2,\n  0x0,0x20,0x80,0x70,0x86,0x1,0xba,0x9f,0xd1,0xe5,0x61,0x0,0x20,0x80,0x28,0xf6,\n  0x2,0x40,0x0,0x51,0x6c,0x0,0x40,0x0,0x51,0x1c,0x6,0x0,0x1,0x4,0xf,0x3,\n  0x42,0x7e,0xc6,0x15,0x6,0x0,0x1,0x44,0xb1,0x17,0x0,0x2,0x88,0x62,0x3,0x0,\n  0x2,0x88,0xe2,0x30,0x0,0x8,0x20,0x46,0x4a,0x73,0x23,0x40,0x0,0x51,0xec,0x5,\n  0x80,0x0,0x3,0x0,0xad,0x72,0x3a,0x15,0x1f,0xe8,0xcd,0x47,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00008.png\n  0x0,0x0,0x0,0xc7,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x79,0x49,0x44,0x41,0x54,0x38,0x8d,0x9d,\n  0x92,0x4b,0x12,0xc0,0x20,0x8,0x43,0x13,0xc7,0xfb,0x5f,0x99,0x2e,0xfa,0x19,0x94,\n  0x60,0x51,0x76,0xd4,0xf0,0x12,0xb1,0x44,0x2c,0x9b,0x7a,0xa,0x8d,0x3c,0x34,0x0,\n  0x30,0x1b,0xe7,0x49,0x2a,0x6d,0x0,0xd8,0x3c,0x18,0x84,0x37,0x28,0x40,0x5a,0x26,\n  0x76,0xce,0xcb,0x6a,0x15,0xf7,0x27,0x22,0x10,0xf7,0x83,0x2e,0x62,0x86,0x7e,0x65,\n  0x20,0xaf,0xb0,0x53,0x43,0x82,0xd7,0xa9,0xe2,0xec,0x13,0xb0,0xb2,0xb0,0xec,0x15,\n  0x7a,0x94,0xd6,0x9c,0x3f,0xb0,0x9f,0x53,0xc3,0x22,0x1d,0xd3,0xc6,0x83,0x84,0xc6,\n  0xc4,0xb7,0xf5,0x7f,0xfe,0x3,0xd7,0x4b,0xd9,0x85,0x9c,0x0,0x66,0xc8,0x71,0x19,\n  0x0,0x5c,0xfb,0x35,0x27,0x1e,0x97,0x58,0x7e,0x9,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/icon-1-3.png\n  0x0,0x0,0x1,0x87,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xfd,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x70,0x49,0x1c,0x3c,0x78,0x90,0x28,0x93,0x1,0x2,\n  0x88,0x1,0xe4,0x2,0x74,0x7c,0xe0,0xc0,0x81,0xff,0xc4,0x2,0x80,0x0,0x62,0xc1,\n  0x66,0xb3,0xbd,0xbd,0x3d,0x98,0xdd,0xd8,0xd8,0x8,0x17,0xaf,0xaf,0xaf,0x47,0x51,\n  0x7,0x93,0x3,0x8,0x20,0x26,0x42,0x9a,0x1d,0x1c,0x1c,0xc0,0x9a,0x91,0xd,0x43,\n  0x96,0x3,0x8,0x20,0x16,0x6c,0x9a,0x91,0x1,0xd0,0x3b,0x70,0x36,0x23,0x54,0x63,\n  0x3,0x92,0x1c,0x40,0x0,0x31,0xe1,0xd3,0xdc,0x80,0x66,0xc8,0x7f,0xa0,0x4b,0xfe,\n  0x43,0xbd,0x2,0x93,0x3,0x8,0x20,0x26,0x7c,0x9a,0x1b,0x90,0xf8,0xb0,0x30,0x0,\n  0xb9,0x2,0xe4,0x74,0x98,0x1c,0x40,0x0,0x31,0xfe,0x87,0x26,0x4,0x64,0x3f,0x36,\n  0x40,0x6d,0x43,0x6,0x20,0x8d,0x7,0x80,0x1a,0xd1,0x2d,0x3,0x8,0x20,0x16,0xf4,\n  0x40,0x1,0x2b,0x40,0x32,0xc,0xe8,0x42,0x6,0x7,0xa0,0x17,0x40,0x9a,0x61,0x7c,\n  0x64,0x0,0x10,0x40,0x8c,0xd,0xd,0xd,0x28,0x9,0x6,0x66,0x8,0xc8,0x50,0x98,\n  0x4b,0x40,0x9a,0x80,0x62,0x8c,0xd8,0xd2,0x11,0x40,0x0,0xb1,0xe0,0xb,0x75,0x42,\n  0x9a,0x41,0x0,0x20,0x80,0x98,0xb0,0x9,0x22,0x1b,0x42,0x8,0x0,0x4,0x10,0x13,\n  0x7a,0xa,0x43,0xe,0x75,0x42,0xb6,0x83,0x0,0x40,0x0,0x31,0x61,0x4b,0xa6,0xb8,\n  0xc,0xc5,0x6,0x0,0x2,0x88,0x1,0x57,0x26,0x81,0x66,0x28,0x6,0x42,0x18,0x20,\n  0xc0,0x0,0x14,0xdf,0xdc,0x6c,0x9,0x64,0xf5,0x51,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00009.png\n  0x0,0x0,0x0,0xb6,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x68,0x49,0x44,0x41,0x54,0x38,0x8d,0xcd,\n  0x52,0x41,0xe,0x80,0x30,0xc,0x2,0xe3,0xff,0xbf,0x8c,0x7,0x63,0xe2,0x5a,0xec,\n  0xea,0xbc,0xc8,0x6d,0x2b,0xd0,0x76,0x83,0xc8,0x50,0x38,0xd3,0x70,0x6c,0x51,0x0,\n  0x20,0x8d,0x7a,0x92,0x8e,0x9b,0xc,0x14,0x85,0x89,0x78,0x1a,0x25,0x93,0xad,0x54,\n  0x35,0xc0,0x4e,0xf7,0x6a,0x8a,0xdd,0x10,0x12,0xaa,0x6,0x9f,0x57,0x18,0x26,0xe8,\n  0xae,0x72,0xc7,0x3f,0x7e,0xe1,0xc2,0x2c,0x48,0x4e,0x63,0xd3,0xf5,0x14,0x65,0x99,\n  0xbb,0x3a,0xe7,0x13,0x73,0xff,0x28,0x6f,0x4d,0x56,0xc,0xa2,0xc9,0x32,0x4,0x0,\n  0x7,0xc6,0x58,0x21,0x14,0x85,0xdf,0x14,0x1b,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,\n  0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/icon-1-4.png\n  0x0,0x0,0x1,0x5b,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd1,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x3c,0x70,0xe0,0xc0,\n  0x7f,0x6,0xa,0x0,0x40,0x0,0xb1,0x80,0x8,0x7b,0x7b,0x7b,0xb2,0xd,0x0,0x8,\n  0x20,0x16,0x64,0x4e,0x63,0x63,0x23,0x9c,0x5d,0x5f,0x5f,0x8f,0xa1,0x18,0x9b,0x3c,\n  0x40,0x0,0x31,0xa1,0x4b,0x3a,0x38,0x38,0x80,0x25,0x91,0x15,0xe3,0x93,0x7,0x8,\n  0x20,0x16,0x74,0x5b,0x80,0x61,0x2,0x67,0x33,0x22,0x19,0xd2,0x80,0x45,0x1e,0x4,\n  0x0,0x2,0x88,0x5,0x9b,0xbf,0x60,0x8a,0xfe,0x23,0x79,0x3,0xd9,0x45,0xc8,0x86,\n  0x0,0x4,0x10,0x13,0x2e,0x3f,0xa3,0xf3,0x1b,0xd0,0x2c,0x81,0xc9,0x3,0x4,0x10,\n  0xc8,0xb4,0xff,0xc8,0x80,0xa1,0xa1,0xe1,0x3f,0x3a,0xc0,0x26,0x6,0x3,0x0,0x1,\n  0xc4,0x44,0x28,0x9a,0x40,0xe1,0xf0,0x1f,0x4b,0x8c,0xc0,0x0,0x40,0x0,0xb1,0x10,\n  0xa3,0xf9,0xe0,0xc1,0x83,0x38,0xd5,0x0,0x4,0x10,0x46,0x3a,0x68,0x40,0xa2,0x91,\n  0x6d,0x6,0x26,0x36,0x46,0x6c,0x6,0x0,0x4,0x10,0xb,0xb6,0x78,0x6,0xa7,0x4c,\n  0xb4,0x74,0x80,0xb,0x0,0x4,0x10,0xde,0x74,0x40,0xc,0x0,0x8,0x20,0x26,0x7c,\n  0xe9,0x80,0x18,0x0,0x10,0x40,0x44,0xa7,0x3,0x5c,0x0,0x20,0x80,0x58,0xc8,0xd1,\n  0x84,0xc,0x0,0x2,0xc,0x0,0x20,0xbf,0x7e,0xb2,0x45,0xde,0x1f,0x48,0x0,0x0,\n  0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/icon-1-5.png\n  0x0,0x0,0x1,0x24,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x9a,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0xe,0x1e,0x3c,0x48,0xb6,0x9,0xf6,0xf6,0xf6,0x8c,\n  0x0,0x1,0xc4,0x2,0x62,0x1c,0x38,0x70,0x0,0xab,0x2,0x7,0x7,0x7,0xbc,0x72,\n  0x20,0x0,0x10,0x40,0x4c,0xc,0x14,0x2,0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0x62,\n  0x4,0x3a,0x91,0xa2,0x30,0x0,0x8,0x20,0x16,0x88,0x7f,0xb0,0xfb,0xf3,0xc0,0x1,\n  0x7,0x6,0x7b,0x7,0x7b,0xac,0x72,0x7,0xf,0x1c,0x4,0xd3,0x0,0x1,0x44,0xb1,\n  0x17,0x0,0x2,0x88,0x62,0x3,0x0,0x2,0x88,0x5,0xe6,0x54,0x5c,0x0,0xe6,0x54,\n  0x5c,0x0,0x20,0x80,0x20,0x6,0xe0,0x8,0x3,0x7,0xa0,0xc1,0xf8,0xc2,0x7,0x4,\n  0x0,0x2,0x88,0x62,0x2f,0x0,0x4,0x10,0xc5,0x6,0x0,0x4,0x10,0xc5,0xe9,0x0,\n  0x20,0x80,0x18,0x29,0xcd,0x8d,0x0,0x1,0x44,0xb1,0x17,0x0,0x2,0xc,0x0,0xb,\n  0x95,0x28,0x1d,0x48,0xe7,0x5c,0xd0,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/icon-1-1.png\n  0x0,0x0,0x1,0x1,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x77,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xcf,0xc0,0x0,\n  0x44,0x68,0x0,0x53,0x4,0xc,0x18,0xb1,0x48,0x0,0x4,0x10,0x13,0x3,0x85,0x0,\n  0x20,0x80,0x28,0x36,0x0,0x20,0x80,0x28,0x36,0x0,0x20,0x80,0x28,0x36,0x0,0x20,\n  0x80,0x28,0x36,0x0,0x20,0x80,0x40,0x1,0xfb,0x1f,0x33,0x12,0xfe,0x33,0x12,0x6b,\n  0x0,0x40,0x0,0x51,0xec,0x2,0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0xa2,0xd8,0x0,\n  0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0x62,0xc1,0x1a,0x35,\n  0x8c,0xd8,0x73,0xc3,0xff,0xff,0xc,0x18,0xb1,0x3,0x10,0x40,0x14,0xbb,0x0,0x20,\n  0x80,0x28,0x36,0x0,0x20,0x80,0x28,0x36,0x0,0x20,0xc0,0x0,0xb7,0xb3,0xb,0x1b,\n  0x26,0xf4,0x39,0x27,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n  \n    // /work/depthmap/depthmap/images/cur/cur00001.png\n  0x0,0x0,0x1,0xc7,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x3d,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,\n  0x1,0x34,0xe0,0xe,0x0,0x8,0x20,0x16,0x32,0xf5,0x21,0xe7,0x5d,0x46,0x4a,0x1c,\n  0x0,0x10,0x40,0xe4,0x38,0xe0,0x3f,0x23,0x23,0xc2,0xce,0xff,0x90,0x82,0x84,0x6c,\n  0x47,0x0,0x4,0x10,0xb,0x39,0x96,0x23,0x17,0x5e,0x50,0x3e,0xd9,0x8e,0x0,0x8,\n  0x20,0x8a,0xd2,0x0,0x72,0x48,0x90,0xb,0x0,0x2,0x88,0x89,0x12,0xcb,0x61,0x21,\n  0x1,0x75,0x8,0x59,0x65,0x3a,0x40,0x0,0x31,0x51,0x6a,0x39,0x34,0x1d,0x20,0x3b,\n  0x82,0x24,0x87,0x0,0x4,0x10,0x59,0xe,0xc0,0x56,0x81,0xc1,0x1c,0x41,0x6a,0x68,\n  0x0,0x4,0x10,0x13,0x25,0x9,0x10,0x97,0xc3,0x48,0x71,0x4,0x40,0x0,0x31,0x51,\n  0x62,0x39,0x4c,0xc,0x2d,0x5b,0x92,0xe4,0x8,0x80,0x0,0x62,0xa2,0xc4,0xe7,0x30,\n  0xcb,0x29,0x69,0x53,0x0,0x4,0x10,0xc5,0x45,0x31,0xb6,0x50,0x21,0x5,0x0,0x4,\n  0x10,0x31,0xe,0x60,0x44,0xf,0x66,0x62,0x73,0x7,0x31,0x0,0x20,0x80,0x88,0xd,\n  0x1,0x82,0x8e,0x20,0x37,0x2a,0x0,0x2,0x88,0x94,0x28,0xc0,0xe9,0x8,0x24,0xcb,\n  0x49,0x2e,0x1a,0x1,0x2,0x88,0xd4,0x34,0x80,0xe1,0x8,0x4a,0x2c,0x7,0x1,0x80,\n  0x0,0x22,0xa7,0x36,0x4,0x39,0x2,0x5e,0x23,0xe2,0xb2,0x9c,0x58,0x47,0x1,0x4,\n  0x10,0x23,0x5,0x59,0xe8,0x3f,0x8e,0xf6,0xc0,0x7f,0x52,0xda,0x9,0x0,0x1,0xc4,\n  0x42,0x41,0xe,0x64,0x24,0x51,0x1c,0x2b,0x0,0x8,0xa0,0x1,0x6f,0x92,0x1,0x4,\n  0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0x34,0xe0,0xe,0x0,0x8,\n  0xa0,0x1,0x77,0x0,0x40,0x0,0xd,0xb8,0x3,0x0,0x2,0x68,0xc0,0x1d,0x0,0x10,\n  0x60,0x0,0xae,0xad,0x6b,0x42,0x91,0x5,0x45,0xf9,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00002.png\n  0x0,0x0,0x1,0x94,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xa,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,\n  0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0x51,0xcb,0x1,0xff,\n  0xa1,0x98,0x64,0x0,0x10,0x40,0xd4,0x70,0xc0,0x7f,0x46,0x46,0x46,0x6,0x10,0x26,\n  0xc7,0x11,0x0,0x1,0xc4,0x44,0xd,0xcb,0x41,0xa5,0x29,0x8,0x93,0xe3,0x8,0x80,\n  0x0,0x62,0xa2,0x86,0xe5,0x70,0x1,0x32,0x1c,0x1,0x10,0x40,0x14,0x47,0x1,0xd4,\n  0x42,0xb2,0x1,0x40,0x0,0x31,0x51,0x31,0xe8,0x19,0x90,0x42,0x84,0x68,0x57,0x1,\n  0x4,0x10,0x55,0x72,0x1,0xcc,0x11,0xa4,0x5a,0xe,0x2,0x0,0x1,0xc4,0x44,0x8d,\n  0xb8,0xa7,0x4,0x0,0x4,0x10,0x55,0x42,0x80,0x5c,0xdf,0x83,0x0,0x40,0x0,0x31,\n  0xd,0xa4,0xef,0x41,0x0,0x20,0x80,0x98,0x6,0xd2,0xf7,0x20,0x0,0x10,0x40,0x4c,\n  0x3,0x91,0xf5,0x90,0x1,0x40,0x0,0xb1,0x50,0x9a,0xff,0x29,0xf1,0x3d,0x8,0x0,\n  0x4,0x10,0x13,0xa5,0xd9,0x8f,0x12,0xcb,0x41,0x0,0x20,0x80,0x98,0x6,0xd2,0x72,\n  0x10,0x0,0x8,0x20,0xa6,0x81,0xb4,0x1c,0x4,0x0,0x2,0x88,0x69,0x20,0x2d,0x7,\n  0x1,0x80,0x0,0x22,0x35,0x11,0x52,0x2f,0xf9,0x43,0x1,0x40,0x0,0xd,0x78,0x93,\n  0xc,0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,\n  0x0,0x40,0x0,0xd,0xb8,0x3,0x0,0x2,0x68,0xc0,0x1d,0x0,0x10,0x60,0x0,0xcd,\n  0x37,0x44,0x3d,0xf6,0xaf,0xb8,0x50,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00003.png\n  0x0,0x0,0x1,0x86,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xfc,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,\n  0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0xd,0xb8,0x3,0x0,\n  0x2,0x68,0xc0,0x1d,0x0,0x10,0x40,0x2c,0x34,0x30,0x13,0xb9,0x68,0x65,0x24,0xa4,\n  0x18,0x20,0x80,0xa8,0xed,0x80,0xff,0x8c,0x8c,0x8,0x3b,0xff,0x43,0xca,0x79,0xbc,\n  0x8e,0x0,0x8,0x20,0x26,0x5a,0x59,0x4e,0x2c,0x0,0x8,0xa0,0x1,0x4f,0x3,0x0,\n  0x1,0xc4,0x44,0x4d,0xdf,0x23,0xd7,0xac,0x50,0x36,0xc1,0x20,0x1,0x8,0x20,0x16,\n  0x6a,0x5a,0x8e,0xe6,0x8,0xa2,0xe2,0x3,0x20,0x80,0x58,0x68,0x60,0x39,0x49,0x9,\n  0x1,0x20,0x80,0x98,0x6,0xd2,0x72,0x10,0x0,0x8,0x20,0xa6,0x81,0xb4,0x1c,0x4,\n  0x0,0x2,0x88,0x69,0x20,0x2d,0x7,0x1,0x80,0x0,0x62,0x1a,0x48,0xcb,0x41,0x0,\n  0x20,0x80,0x98,0x6,0xd2,0x72,0x10,0x0,0x8,0x20,0xa6,0x81,0xb4,0x1c,0x4,0x0,\n  0x2,0x88,0xa4,0x28,0xa0,0xb6,0xe5,0x20,0x0,0x10,0x40,0x44,0x97,0x3,0xa4,0x16,\n  0x30,0xc4,0x2,0x80,0x0,0x22,0xd6,0x1,0x54,0xb5,0x14,0x19,0x0,0x4,0xd0,0x80,\n  0x57,0x46,0x0,0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0xd,\n  0xb8,0x3,0x0,0x2,0x68,0xc0,0x1d,0x0,0x10,0x40,0x3,0xee,0x0,0x80,0x0,0x3,\n  0x0,0x74,0x64,0x4f,0x47,0x9a,0x77,0x62,0xbf,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,\n  0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00004.png\n  0x0,0x0,0x1,0xb6,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x2c,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,\n  0x1,0x44,0x92,0x3,0x18,0x19,0x19,0xff,0x83,0x30,0x35,0x1d,0x0,0x10,0x40,0x2c,\n  0xa4,0x58,0xe,0xcb,0xb2,0x50,0x36,0x23,0xba,0x3c,0x8c,0x8d,0x2e,0x87,0xf,0x0,\n  0x4,0x10,0x55,0xa2,0x0,0xe6,0x38,0x18,0x46,0xf,0x25,0x7c,0xa1,0x6,0x10,0x40,\n  0x2c,0xd4,0xb2,0x1c,0x48,0x33,0x20,0x85,0x0,0x3c,0x94,0x8,0x45,0x19,0x40,0x0,\n  0xb1,0x50,0xcb,0x72,0xe4,0x60,0x47,0x12,0xc7,0x70,0x1c,0x3a,0x0,0x8,0x20,0x26,\n  0x4a,0x2c,0x87,0xd2,0x18,0x71,0xe,0xf5,0x39,0x3,0x31,0xc5,0x3c,0x40,0x0,0x91,\n  0x1d,0x2,0x48,0x9,0x12,0x23,0x1,0x22,0x27,0x58,0x42,0x0,0x20,0x80,0x58,0x88,\n  0xf5,0x29,0xa9,0x8e,0xc1,0x17,0xec,0xc8,0x0,0x20,0x80,0x58,0x48,0xc8,0x7a,0x24,\n  0x87,0xc,0x31,0xd9,0x11,0x20,0x80,0x6,0xbc,0x24,0x4,0x8,0xa0,0x1,0x77,0x0,\n  0x40,0x0,0x31,0x91,0x9a,0xe8,0x88,0x65,0x13,0xb,0x0,0x2,0x68,0xc0,0x43,0x0,\n  0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,\n  0x40,0x0,0x31,0x11,0x48,0x78,0x8c,0xc4,0xe6,0x7f,0x72,0x1,0x40,0x0,0x31,0x11,\n  0x91,0xfa,0x49,0x76,0x4,0xb1,0x85,0x10,0x8,0x0,0x4,0x10,0x23,0xb1,0x59,0x87,\n  0x94,0x96,0x10,0x29,0xd,0x12,0x80,0x0,0x1a,0xf0,0x34,0x0,0x10,0x40,0x8c,0x3,\n  0xdd,0x33,0x2,0x8,0xa0,0x1,0xf,0x1,0x80,0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,\n  0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0x34,0xe0,0xe,0x0,0x8,0x30,\n  0x0,0x5f,0x54,0x7b,0x41,0xcf,0x3f,0x72,0xbe,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,\n  0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/cur/cur00005.png\n  0x0,0x0,0x1,0xc3,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x39,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0xc3,0x40,0x2,0x80,0x0,0x62,0x62,0x18,0x60,0x0,0x10,0x40,0x3,0xee,0x0,0x80,\n  0x0,0x1a,0x70,0x7,0x0,0x4,0xd0,0x80,0x3b,0x0,0x20,0x80,0x6,0xdc,0x1,0x0,\n  0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,0x40,0x0,0xd,0xb8,0x3,0x0,\n  0x2,0x68,0xc0,0x1d,0x0,0x10,0x40,0x2c,0x84,0x14,0x30,0x32,0x32,0x62,0x2d,0x2a,\n  0x81,0x25,0x28,0x23,0x29,0x6a,0x70,0x1,0x80,0x0,0x62,0x21,0xc6,0x95,0xc8,0xc5,\n  0x35,0xd0,0x32,0xc,0x83,0x41,0x7c,0x90,0x23,0xd0,0xd5,0x11,0x3,0x0,0x2,0x88,\n  0xa4,0x28,0xc0,0x66,0x39,0x9a,0x23,0x48,0x8e,0x2,0x80,0x0,0x62,0x22,0xd1,0x72,\n  0x9c,0xc1,0xd,0xb,0x1,0x52,0x1d,0x1,0x10,0x40,0x4c,0xa4,0xf8,0x1c,0x97,0x23,\n  0x90,0x2d,0x27,0x35,0x24,0x0,0x2,0x88,0x89,0xc8,0x34,0xc0,0x88,0x1c,0xcc,0xc8,\n  0x8e,0x40,0xb7,0x9c,0xd8,0xc4,0x7,0x3,0x0,0x1,0xc4,0x48,0x4e,0x7b,0x0,0x6a,\n  0x29,0x23,0x2e,0x3e,0x29,0x0,0x20,0x80,0x18,0x7,0xba,0x41,0x2,0x10,0x40,0x64,\n  0x15,0x44,0xd8,0xd2,0x0,0xb9,0xe,0x0,0x8,0x20,0x26,0x72,0x2c,0xc3,0x91,0x6,\n  0xc8,0x72,0x14,0x40,0x0,0x31,0x91,0xe2,0x63,0x5c,0x9,0xe,0x5b,0xc2,0x24,0x36,\n  0x4,0x0,0x2,0x88,0xd8,0x5c,0x80,0xd5,0x72,0xf4,0x42,0x8,0x59,0x1d,0xb1,0x0,\n  0x20,0x80,0x88,0x4e,0x3,0xb8,0x2c,0xc7,0xe6,0x8,0x52,0x0,0x40,0x0,0x91,0x94,\n  0x8,0x89,0x29,0x9,0x49,0x5,0x0,0x1,0xc4,0x42,0x6c,0x49,0x48,0xa8,0x1c,0x20,\n  0xa5,0x2,0x42,0x6,0x0,0x1,0x34,0xe0,0xe5,0x0,0x40,0x0,0xd,0x78,0x83,0x4,\n  0x20,0x80,0x6,0xdc,0x1,0x0,0x1,0x34,0xe0,0xe,0x0,0x8,0xa0,0x1,0x77,0x0,\n  0x40,0x0,0xd,0xb8,0x3,0x0,0x2,0x68,0xc0,0x1d,0x0,0x10,0x60,0x0,0x52,0x4,\n  0xa4,0x47,0x89,0x78,0x1c,0xe3,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-5.png\n  0x0,0x0,0x1,0x4d,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc3,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x90,0x39,0x8c,0x8c,0x8c,0x70,0xd3,0x80,0x6,0x33,\n  0x12,0x63,0x0,0x40,0x0,0x31,0x21,0x6b,0xfe,0xcf,0x80,0x80,0xc8,0x86,0xe1,0x3,\n  0x0,0x1,0xc4,0xc4,0x40,0x21,0x0,0x8,0x20,0x26,0x64,0x27,0x33,0x32,0x30,0x32,\n  0x34,0x2,0x21,0x88,0x46,0xf2,0xc2,0x7f,0x7c,0x18,0x20,0x80,0x58,0x90,0xbd,0xd0,\n  0xc0,0xd0,0x0,0x66,0xc3,0xe8,0xc6,0xc6,0xc6,0xff,0xf5,0xf5,0xf5,0x20,0x1a,0xab,\n  0xed,0x20,0x39,0x80,0x0,0x62,0x41,0xf,0x3c,0x1c,0xa,0x31,0x2,0x14,0x64,0x38,\n  0x88,0x6,0x8,0x20,0x26,0x70,0xe0,0x11,0x19,0xe2,0xd8,0x0,0x40,0x0,0xb1,0x20,\n  0x6b,0x86,0x39,0x1d,0x6c,0x2b,0x10,0x12,0x3,0x0,0x2,0x88,0x9,0x3d,0xde,0x49,\n  0x75,0xd,0x40,0x0,0x51,0x1c,0x8d,0x0,0x1,0xc4,0x84,0x2d,0x15,0x92,0x2,0x0,\n  0x2,0x88,0x89,0x12,0xcd,0x20,0x0,0x10,0x40,0x2c,0xd8,0xfc,0x4d,0x4a,0x38,0x0,\n  0x4,0x10,0xb,0x91,0xea,0xfe,0x63,0x4b,0x44,0x20,0x0,0x10,0x40,0x4,0xd,0xc0,\n  0x95,0xa,0x61,0x9,0xc,0x20,0xc0,0x0,0x18,0xc6,0x49,0x9b,0x6d,0x5f,0x0,0xf4,\n  0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-2-4.png\n  0x0,0x0,0x1,0x51,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc7,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x88,0x51,0xd4,0xc8,0xc8,0x88,0xd5,0x96,0xfa,0xff,\n  0xff,0x19,0x1,0x2,0x88,0x89,0x81,0x42,0x0,0x10,0x40,0x14,0x1b,0x0,0x10,0x40,\n  0x18,0x5e,0x60,0xc4,0xe1,0x5c,0x18,0x68,0x40,0xe3,0x3,0x4,0x10,0x86,0x1,0xc0,\n  0x40,0x65,0x4,0x19,0x82,0x2d,0x70,0x81,0xe2,0x18,0x62,0x0,0x1,0x84,0xd5,0xb,\n  0xd,0xd,0xd,0x58,0x15,0x63,0x3,0x0,0x1,0xc4,0x4,0x73,0x76,0x63,0x63,0x23,\n  0xd8,0x4a,0x10,0xd,0x32,0x80,0xd8,0xe8,0x5,0x8,0x20,0xb0,0x42,0xa0,0x86,0xff,\n  0x10,0xd7,0xff,0x87,0xa,0x61,0x7,0x30,0x35,0xc8,0x18,0x20,0x80,0x10,0xc,0xa0,\n  0x24,0xc8,0x20,0x6c,0x86,0xc0,0xf8,0xd8,0xc,0x0,0x8,0x20,0x38,0x3,0xd9,0x15,\n  0xc8,0x86,0xc0,0xc,0x6,0xd1,0xd8,0xc,0x0,0x8,0x20,0x54,0xe,0x92,0x2b,0x70,\n  0xf1,0xd1,0xd,0x0,0x8,0x20,0x14,0xe,0xba,0x2b,0x88,0xc1,0x0,0x1,0x84,0x29,\n  0x80,0x66,0x2b,0x21,0xc,0x10,0x40,0x8c,0xe8,0xd1,0x5,0x4b,0x89,0xa0,0x4,0x45,\n  0x4c,0x2c,0x2,0x4,0x10,0x23,0xa5,0xd9,0x19,0x20,0xc0,0x0,0xda,0x7f,0x29,0xad,\n  0xde,0x4,0x3f,0x86,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n  \n    // /work/depthmap/depthmap/images/win/b-1-9.png\n  0x0,0x0,0x1,0x57,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xcd,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x82,0xcc,0x69,0x6c,\n  0x6c,0x7c,0x88,0xcc,0xaf,0xaf,0xaf,0x97,0x27,0x64,0x0,0x40,0x0,0x31,0x80,0xbc,\n  0x0,0xc2,0xd,0xd,0xd,0xf,0x21,0xcc,0xff,0x50,0xa1,0xff,0xf,0x21,0x62,0xff,\n  0x19,0xf0,0x61,0x80,0x0,0x62,0x4,0x11,0x20,0x9b,0xeb,0xeb,0x1b,0xe4,0x18,0x18,\n  0x40,0xe1,0xc1,0xc8,0x80,0x44,0x3f,0x2,0xca,0x61,0xb5,0x18,0xe6,0x3a,0x80,0x0,\n  0x82,0xd9,0xfe,0x1f,0x3f,0x40,0x71,0xd9,0x7f,0x90,0xcb,0x80,0x7a,0xc1,0xae,0x3,\n  0x8,0x20,0xa4,0x40,0x64,0xc4,0x43,0xa3,0xbb,0x8c,0x41,0xe,0x8a,0x19,0x0,0x2,\n  0x8,0xc9,0x80,0xff,0x38,0x14,0x63,0xa3,0x11,0x0,0x20,0x80,0xd0,0x5c,0x40,0xac,\n  0x21,0x8,0x0,0x10,0x40,0x14,0xbb,0x0,0x20,0x80,0x28,0x76,0x1,0x40,0x0,0x51,\n  0xec,0x2,0x80,0x0,0x82,0xa7,0x3,0x28,0x5f,0x8e,0xd8,0x24,0xc,0x8c,0x4a,0x50,\n  0x9c,0x32,0x2,0x4,0x10,0x23,0x2c,0x33,0x31,0x32,0x32,0x3e,0x24,0x35,0x1f,0x0,\n  0xf5,0xca,0x3,0x4,0x10,0x23,0xa5,0xb9,0x11,0x20,0x80,0x28,0xce,0x8d,0x0,0x1,\n  0x6,0x0,0xa3,0x54,0xad,0x53,0x19,0x46,0x2,0xbd,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-19.png\n  0x0,0x0,0x1,0x50,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc6,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x48,0x51,0xcc,0xc8,0xc0,0xf8,0x1f,0x84,0x91,0xc5,\n  0x0,0x2,0x88,0x68,0x3,0x18,0x1b,0x19,0xb1,0x3a,0x15,0x20,0x80,0x58,0xc0,0x92,\n  0x8c,0x8c,0x38,0xfd,0x1,0xf4,0x22,0x23,0x3e,0x83,0x1,0x2,0x88,0x11,0x14,0x6,\n  0x20,0x3,0x70,0x84,0x5,0x23,0xba,0x93,0xd1,0x1,0x40,0x0,0x31,0xa1,0xaa,0x66,\n  0x84,0x63,0x30,0xb7,0x91,0x91,0x60,0x8,0x3,0x4,0x10,0xb,0x9a,0x73,0x31,0x55,\n  0x34,0x22,0xb1,0xeb,0x51,0xc5,0xfe,0xd7,0xff,0x67,0x4,0x8,0x20,0x98,0xa6,0xff,\n  0x50,0x3f,0xc0,0x31,0x88,0x8b,0x8c,0x19,0x1a,0x80,0xe2,0x50,0x88,0x2c,0xe,0x10,\n  0x40,0xf8,0x5c,0xf0,0x1f,0x25,0x6,0x71,0x0,0x80,0x0,0xc2,0x19,0x6,0x68,0xe1,\n  0x1,0x77,0x3a,0xd0,0x5e,0x14,0xc3,0x0,0x2,0x88,0x50,0x2c,0x10,0x74,0x1,0x40,\n  0x0,0xb1,0xa0,0xbb,0x0,0x77,0x72,0x0,0x5b,0x84,0x91,0x2e,0x0,0x2,0x88,0x70,\n  0x2c,0x10,0x0,0x0,0x1,0x44,0xac,0xb,0x70,0x1a,0xe,0x10,0x40,0x14,0xbb,0x0,\n  0x20,0x80,0x58,0x88,0xb1,0x1d,0x1f,0x0,0x8,0x30,0x0,0xed,0x42,0x5e,0x17,0x5f,\n  0xdd,0xc2,0x9a,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-7-5.png\n  0x0,0x0,0x2,0x5d,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xd3,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x88,\n  0x85,0x81,0x81,0x1,0x84,0x59,0x81,0x98,0x1d,0x4a,0x33,0x33,0x40,0xc0,0x3f,0x20,\n  0xfe,0xb,0xc5,0xff,0xd1,0x30,0x48,0xec,0xf,0x40,0x0,0xb1,0x40,0x15,0x83,0x34,\n  0x72,0x2,0x31,0x37,0x10,0x73,0xa0,0x19,0xf0,0x7,0xc9,0x10,0x64,0x43,0x7f,0x1,\n  0xf1,0x4f,0x80,0x0,0x2,0x19,0xc0,0x6,0xd5,0xc4,0xb,0xc4,0xfc,0x40,0xcc,0x5,\n  0x75,0x5,0x3,0x54,0xe1,0x6f,0x24,0x1b,0xff,0x43,0xd,0x0,0x69,0xfe,0x6,0xc4,\n  0x4c,0x0,0x1,0x4,0x33,0x0,0x64,0x33,0x7f,0xbf,0xb7,0xdd,0x69,0x6,0x2c,0x0,\n  0xe8,0xcd,0x50,0xa8,0x46,0x26,0xa0,0x9a,0xd5,0x50,0x31,0x6b,0x20,0xf5,0x1e,0x20,\n  0x80,0x60,0x5e,0x0,0x19,0xc2,0x9,0x14,0xc,0x3,0x2a,0x58,0x5,0xa4,0x53,0x91,\n  0x5c,0xf0,0x17,0xa4,0x9,0x28,0x96,0x2,0xa4,0xe7,0x40,0xe5,0xbe,0x2,0xd9,0x47,\n  0x81,0x6c,0x63,0x80,0x0,0x62,0x82,0x6a,0x6,0x87,0x1,0x54,0x73,0x6,0xd4,0x4b,\n  0xec,0x50,0x39,0x98,0x77,0xd8,0x80,0x72,0xb9,0x20,0x1a,0xa8,0x6e,0x19,0x90,0xed,\n  0xd,0xb2,0x1c,0x20,0x80,0x90,0x63,0x80,0x3,0xaa,0x90,0x1d,0x2a,0xf6,0xf,0x8a,\n  0x19,0xa1,0xe2,0xe0,0xd0,0x7,0x6a,0x9e,0xa,0xd4,0x1c,0xf,0x13,0x3,0x8,0x20,\n  0x98,0x17,0x58,0xa1,0xb6,0x31,0x20,0x45,0x23,0x38,0xb0,0x80,0x1a,0x66,0x3,0x35,\n  0x24,0x43,0x35,0xcf,0x3,0x29,0x0,0xd2,0xb,0xa1,0xe1,0x60,0x4,0x10,0x40,0x30,\n  0x17,0xc0,0x30,0x48,0xb2,0x7,0x2d,0x0,0x23,0x41,0xd1,0x5,0xc2,0x40,0xb6,0x3b,\n  0x34,0x5c,0x40,0xfc,0xaf,0x40,0xfc,0x11,0x20,0x80,0x58,0xa0,0xd1,0xc6,0xe,0xd4,\n  0xb8,0x1c,0xa8,0x20,0x7,0x6a,0x10,0x28,0xb4,0xfb,0x80,0xfc,0x44,0x24,0xc5,0x5f,\n  0x80,0xf8,0x3b,0x34,0x5d,0x80,0xa2,0xf1,0x7,0x88,0xf,0x10,0x40,0x2c,0x68,0x1,\n  0xf5,0x13,0x1a,0xef,0x30,0x7f,0xff,0x80,0x2a,0xfe,0xe,0x8d,0xf7,0xcf,0x48,0x6a,\n  0xc0,0x6,0x1,0x4,0x10,0x13,0xd4,0xbf,0x30,0xd,0x20,0x5b,0x3e,0x81,0x9c,0x6,\n  0xb4,0x3d,0x1c,0xe4,0x2a,0xa8,0x6,0x64,0x43,0xbe,0x40,0x31,0xc8,0x55,0x3f,0x1,\n  0x2,0x8,0xe4,0x2,0x46,0xa0,0xc2,0xad,0x40,0xd,0xfe,0x50,0x93,0xff,0x42,0x3,\n  0x10,0x6,0xbe,0xc1,0xc2,0x0,0x8a,0xbf,0x43,0xd5,0x81,0xd5,0x0,0x4,0x10,0x23,\n  0x34,0x7a,0x60,0x1,0x66,0x5,0xb5,0xd,0x96,0xee,0x41,0x86,0x9f,0x83,0xca,0x29,\n  0x40,0x6d,0xfe,0x86,0xac,0x6,0x20,0x80,0x18,0x81,0x12,0x5a,0xd0,0x70,0xf8,0x87,\n  0xe4,0x3f,0x98,0x1,0x30,0xef,0xfd,0x85,0xda,0xfc,0x3,0x8a,0xe1,0x2e,0x0,0x8,\n  0x20,0x16,0xa8,0x9f,0x59,0x90,0x32,0xce,0x1f,0x24,0x57,0x31,0x23,0xb9,0xf2,0x17,\n  0x92,0x46,0xb8,0xab,0x1,0x2,0xc,0x0,0x7a,0xaf,0xc0,0x76,0x61,0x4a,0xa9,0x1b,\n  0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-4.png\n  0x0,0x0,0x2,0x4e,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xc4,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x48,\n  0x8a,0x81,0x81,0x41,0x4,0x88,0x25,0x81,0x58,0x2,0xca,0xe6,0x61,0x80,0x80,0x2f,\n  0x40,0xfc,0x6,0x88,0x5f,0x0,0xf1,0x73,0x28,0xfb,0x33,0x10,0x7f,0x7,0xe2,0x3f,\n  0x20,0x5,0x0,0x1,0xc4,0x2,0xd5,0xa0,0x8,0xc4,0x6a,0x40,0xac,0xd4,0xef,0x6d,\n  0x97,0xc1,0x80,0x4,0x80,0x16,0xcc,0x0,0x52,0xf7,0x80,0x98,0x3,0x2a,0xf4,0x17,\n  0x9,0xff,0x7,0x8,0x20,0x26,0xa8,0xcd,0x6a,0xfc,0xa7,0xf7,0x75,0x81,0x34,0xff,\n  0xff,0xff,0x9f,0x1,0x19,0x83,0xc4,0x40,0x72,0x50,0xb,0x40,0x6a,0xf9,0x81,0x98,\n  0xd,0x88,0x41,0x7a,0x19,0x0,0x2,0x88,0x5,0xea,0x6c,0xa5,0x86,0x86,0x6,0xb0,\n  0x6,0x74,0x0,0x12,0x63,0x64,0x64,0x4,0xba,0xc4,0x49,0x9,0xc8,0x7d,0x5,0xc4,\n  0x6f,0x81,0xf8,0x23,0x10,0x7f,0x3,0xb9,0x2,0x20,0x80,0x40,0xa6,0x88,0xc0,0x6c,\n  0xc6,0x5,0x60,0x2e,0x81,0x7a,0x97,0x17,0x88,0xd9,0x61,0x2e,0x0,0x8,0x20,0x16,\n  0xa4,0x0,0x3,0xdb,0x84,0xcb,0x0,0x28,0x0,0x39,0x9f,0x13,0x88,0x59,0x61,0x6,\n  0x0,0x4,0x10,0x13,0x3,0x69,0x80,0x13,0x1a,0x98,0x20,0x3,0x98,0x41,0x2,0x0,\n  0x1,0xc4,0x2,0x8d,0x2a,0x74,0x9b,0x70,0x1,0x36,0xa8,0xf3,0xd9,0xa0,0x7a,0x99,\n  0x1,0x2,0x8,0xe4,0x82,0x37,0xa0,0xa8,0xc2,0xe5,0x7c,0x98,0xd7,0x80,0x6a,0xe,\n  0x40,0x6d,0xe6,0x82,0x7a,0x1b,0xe4,0x1a,0x36,0x80,0x0,0x62,0x82,0x26,0x92,0x7b,\n  0xa0,0x58,0xc0,0x66,0x8,0x4c,0xc,0x18,0x88,0xe,0x50,0xdb,0x41,0xe1,0x20,0x4,\n  0xc4,0x82,0x40,0xcc,0xd,0x10,0x40,0x4c,0xd0,0x14,0x76,0xeb,0xa3,0xa9,0x53,0x19,\n  0xcc,0x25,0xc8,0x18,0x6a,0x33,0xcc,0x90,0x24,0xa8,0x46,0x9,0x28,0x16,0x6,0x8,\n  0x20,0x46,0x1c,0x49,0x19,0x16,0xda,0x6c,0x50,0x67,0xb3,0x43,0x35,0xc3,0x52,0x67,\n  0x25,0x90,0x7a,0xc,0xc4,0xf,0x0,0x2,0x88,0x9,0x9a,0xb6,0x5f,0x2,0xf1,0x7d,\n  0x20,0xbe,0xa,0xc4,0xe7,0x80,0xf8,0x4,0x10,0x1f,0x87,0xd2,0x67,0x41,0xe2,0x40,\n  0x4d,0x2d,0x48,0x2e,0x69,0x7,0x52,0x2,0x20,0xd7,0x0,0x4,0x10,0x13,0x34,0x63,\n  0x7c,0x86,0xa6,0x32,0x90,0xa9,0x77,0x81,0xf8,0x26,0x10,0x5f,0x83,0x1a,0x78,0x1d,\n  0xe4,0x45,0x20,0x7e,0x8,0xb5,0x19,0x66,0xc8,0x14,0x90,0x2b,0x1,0x2,0x8,0xe4,\n  0x5,0x70,0x58,0x41,0xd3,0x4,0x33,0x94,0x86,0xb1,0x59,0xa0,0x5e,0x41,0xf6,0xb7,\n  0x0,0x54,0x33,0x18,0x0,0x4,0x10,0x2c,0x21,0xfd,0x87,0xe6,0xae,0x5f,0x40,0xfc,\n  0x3,0x9a,0xce,0x41,0xae,0xfa,0x4,0xc4,0xef,0xa1,0x5e,0x7c,0x2,0xf2,0x33,0xd4,\n  0x25,0x61,0xd0,0xb0,0x70,0x1,0x8,0x30,0x0,0x10,0x96,0x91,0x99,0x29,0xe6,0xd6,\n  0x25,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-15.png\n  0x0,0x0,0x1,0x24,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x9a,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0x31,\n  0x11,0x52,0xc8,0xc8,0xc8,0x8,0xc6,0xb8,0x0,0x40,0x0,0xb1,0x10,0xd2,0xdc,0xd0,\n  0xd0,0x0,0x67,0x63,0xb,0x2f,0x80,0x0,0x62,0x21,0xc2,0x9f,0x38,0x35,0x83,0x0,\n  0x40,0x0,0x31,0xe1,0xb3,0x9d,0x98,0x18,0x2,0x8,0x20,0xa2,0xc2,0x0,0x9f,0x41,\n  0x0,0x1,0xc4,0x44,0x89,0xed,0x20,0x0,0x10,0x40,0x4c,0x94,0xd8,0xe,0x2,0x0,\n  0x1,0x84,0x37,0xc,0x88,0x1,0x0,0x1,0x84,0xd7,0x5,0xc4,0x78,0x3,0x20,0x80,\n  0x98,0x28,0xd1,0xc,0x2,0x0,0x1,0xc4,0x44,0x89,0x66,0x10,0x0,0x8,0x20,0x16,\n  0xf4,0xb4,0x4d,0x2a,0x0,0x8,0x20,0x46,0x4a,0xb3,0x33,0x40,0x80,0x1,0x0,0x90,\n  0xd3,0x2c,0xa6,0x24,0x2b,0x68,0x0,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-9.png\n  0x0,0x0,0x1,0x3d,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xb3,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x1e,0x0,0x92,0x64,0xc4,0xa7,0x0,0x20,0x80,0x58,0xf0,0x68,0x44,0x67,0x63,\n  0x35,0x8,0x20,0x80,0x98,0x70,0x18,0xc0,0xd8,0xd8,0xd8,0x8,0x66,0x80,0x68,0x18,\n  0x1b,0x1b,0x0,0x8,0x20,0x6,0x90,0x17,0xf0,0xe0,0xff,0xd,0xd,0xd,0xff,0xf1,\n  0xa9,0x1,0x8,0x20,0x26,0x6,0xfc,0x80,0x91,0x80,0x3c,0x3,0x40,0x0,0x31,0x12,\n  0x8,0x44,0x82,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xc8,0x0,0x82,\n  0xce,0x3,0x8,0x20,0x82,0x2e,0x0,0xc6,0x0,0x5e,0x43,0x0,0x2,0x88,0x89,0x44,\n  0x1b,0x31,0xe4,0x1,0x2,0x88,0x9,0x4b,0xa8,0xe3,0x32,0xe4,0x3f,0xb6,0xf4,0x0,\n  0x10,0x40,0x4c,0x58,0x9c,0x8c,0xcd,0x26,0xb0,0xe6,0xfa,0xfa,0x7a,0x8c,0x68,0x5,\n  0x8,0x20,0xac,0x89,0x3,0x9a,0x78,0xe0,0x0,0x5f,0x62,0x2,0x8,0x20,0x9c,0x29,\n  0xc,0x66,0x8,0xa1,0x94,0x8,0x10,0x40,0x78,0x93,0x32,0x21,0xcd,0x20,0xc,0x10,\n  0x40,0x14,0xa7,0x44,0x80,0x0,0x3,0x0,0x16,0x71,0xe1,0x63,0xc4,0xa9,0xe4,0x72,\n  0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-2.png\n  0x0,0x0,0x1,0x5c,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd2,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x0,0xb9,0xa0,0xa1,0xa1,0xe1,0x3f,0x8,0x1c,0x38,\n  0x70,0x0,0xc4,0xfd,0xf,0xe3,0xc3,0x0,0x48,0x9c,0x1,0x49,0x1c,0x4a,0x83,0xf5,\n  0x2,0x4,0x10,0xb,0xcc,0xc4,0x83,0x7,0xf,0xa2,0xd8,0x80,0xce,0xc7,0x25,0xe,\n  0x10,0x40,0x8,0x17,0x30,0x30,0x10,0x8d,0x91,0x5d,0x0,0x10,0x40,0x70,0x17,0x34,\n  0x36,0x34,0x40,0xfd,0xd6,0x0,0xc,0x93,0x6,0xc,0x9b,0x1b,0x80,0xe2,0xd,0x58,\n  0xc4,0x1,0x2,0x88,0x5,0x29,0x50,0x50,0x9c,0x7,0xe2,0x63,0x73,0x36,0x48,0x1c,\n  0x18,0xe8,0x70,0x3e,0x40,0x0,0x31,0x31,0x50,0x8,0x0,0x2,0x88,0x62,0x3,0x0,\n  0x2,0x8,0x6b,0x2c,0x38,0x38,0x38,0x10,0x1d,0xb,0x0,0x1,0x4,0x8f,0x5,0x58,\n  0x20,0x83,0x2,0x17,0x6b,0xe0,0x23,0x89,0x23,0xc7,0x2,0x40,0x0,0xc1,0x5d,0xd0,\n  0xd0,0x80,0x8,0x18,0x64,0x36,0x5c,0xc,0x87,0x38,0x40,0x0,0x51,0x1c,0xb,0x0,\n  0x1,0xc4,0x8,0x72,0x6,0x25,0x79,0x1,0x20,0x80,0x18,0x29,0xcd,0x8d,0x0,0x1,\n  0x44,0x71,0x34,0x2,0x4,0x18,0x0,0x6a,0xb7,0xbc,0x8,0xb8,0x1e,0x95,0x1c,0x0,\n  0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-2-8.png\n  0x0,0x0,0x1,0x2a,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa0,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x82,0xcc,0x69,0x6c,\n  0x6c,0x24,0xd9,0x39,0x0,0x1,0xc4,0x0,0xf2,0x2,0x8,0x37,0x34,0x34,0xc0,0x98,\n  0x60,0x4c,0x1c,0xff,0x3f,0x3,0x40,0x0,0x51,0xa4,0x19,0x84,0x1,0x2,0x88,0x91,\n  0xd2,0x40,0x4,0x8,0x20,0x26,0x46,0x46,0x46,0xb2,0x4c,0x80,0xe9,0x3,0x8,0x20,\n  0xb0,0xb,0xb0,0x19,0x2,0x14,0x67,0x44,0x57,0x8c,0x4d,0x1e,0x20,0x80,0x70,0x7a,\n  0x1,0xa4,0x9,0xa4,0x8,0x46,0xe3,0x72,0x9,0x40,0x0,0xe1,0xd,0x3,0x42,0x9a,\n  0x41,0x0,0x20,0x80,0x28,0xe,0x44,0x80,0x0,0x62,0xa1,0x24,0x11,0xd5,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xd6,0x74,0x40,0xc,0x86,0xa5,0x5,0x80,0x0,0xa2,0x48,0x33,\n  0x8,0x3,0x4,0x10,0xb,0xc4,0xf9,0xd,0xa4,0x3b,0x1d,0xa,0x0,0x2,0x88,0xe2,\n  0x40,0x4,0x8,0x30,0x0,0x43,0x72,0xed,0xe1,0x2c,0xc5,0x5a,0xfe,0x0,0x0,0x0,\n  0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-15.png\n  0x0,0x0,0x1,0x10,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x86,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x40,0x4,0x23,0x23,0xc3,0x7f,0x10,0x6,0xb3,0x19,\n  0x18,0xff,0x83,0x30,0x44,0x1a,0x44,0x33,0x62,0x88,0x23,0xab,0x7,0x8,0x20,0x26,\n  0x6,0xa,0x1,0x40,0x0,0x31,0x52,0xea,0x5,0x80,0x0,0x62,0xc2,0xe7,0x6c,0xa0,\n  0x5b,0xff,0x83,0x31,0x1e,0xef,0x0,0x4,0x10,0xc5,0x5e,0x0,0x8,0x20,0x8a,0xbd,\n  0x0,0x10,0x40,0x4c,0x78,0x9d,0xd,0xa,0x69,0x68,0x68,0xe3,0xf2,0xe,0x40,0x0,\n  0x51,0xec,0x5,0x80,0x0,0xa2,0xd8,0xb,0x0,0x1,0x44,0x71,0x2c,0x0,0x4,0x10,\n  0xc5,0x5e,0x0,0x8,0x20,0x8a,0xbd,0x0,0x10,0x40,0x14,0xe7,0x5,0x80,0x0,0xa2,\n  0xd8,0xb,0x0,0x1,0x44,0xb1,0x17,0x0,0x2,0xc,0x0,0xb6,0x7a,0x44,0x29,0x87,\n  0x6d,0x4a,0x3b,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-3.png\n  0x0,0x0,0x1,0x5c,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd2,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x20,0x14,0xe3,0x7f,0xec,0x34,0xc,0xe0,0x96,0x7,\n  0x8,0x20,0x46,0x5c,0x2e,0x60,0x64,0x44,0x28,0x2,0xaa,0x61,0xc4,0xe5,0x2,0x80,\n  0x0,0xc2,0xea,0x2,0x90,0xe6,0xff,0xc,0x8,0x88,0x30,0xc,0xd3,0x5,0x0,0x1,\n  0x4,0x35,0x0,0x66,0x3,0x6e,0x9b,0x70,0xa9,0x3,0x8,0x20,0xac,0x2e,0x0,0x39,\n  0x99,0x91,0x81,0x91,0xa1,0x11,0x8,0x41,0x34,0xc2,0xb,0x98,0x2e,0x0,0x8,0x20,\n  0xac,0x61,0x0,0x72,0x72,0x3,0x43,0x3,0x9c,0xf,0x62,0xe3,0xa,0x7,0x80,0x0,\n  0x62,0xc2,0x30,0x91,0x91,0xf1,0x3f,0xa1,0x40,0x45,0x56,0xf,0x10,0x40,0x28,0x61,\n  0x0,0xe,0x3c,0x1c,0x36,0x81,0xbd,0x5,0x37,0x4,0xa1,0x6,0x20,0x80,0x98,0xd0,\n  0xfd,0x8e,0x37,0x8,0x31,0xc2,0x82,0x81,0x1,0x20,0x80,0x70,0x86,0x1,0x6e,0xcd,\n  0xa8,0x0,0x20,0x80,0x70,0xc6,0x2,0x36,0x1a,0x5b,0x2c,0x0,0x4,0x10,0xc5,0xe9,\n  0x0,0x20,0x80,0x70,0xa6,0x44,0xec,0x5e,0xc2,0x74,0x1,0x40,0x0,0x61,0xb8,0x0,\n  0x7f,0x34,0x62,0xba,0x0,0x20,0x80,0xa0,0x81,0x8,0x93,0x44,0x56,0xc4,0xc0,0x80,\n  0x9b,0x8f,0x10,0x7,0x8,0x30,0x0,0xae,0x19,0x7b,0xf,0xd3,0xa,0x4a,0xbe,0x0,\n  0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-16.png\n  0x0,0x0,0x1,0x24,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x9a,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0x31,\n  0x11,0x52,0x78,0xf0,0xe0,0x41,0x30,0xc6,0x5,0x0,0x2,0x88,0x89,0x90,0x66,0x6c,\n  0x6c,0x64,0x0,0x10,0x40,0x4,0x5d,0x60,0x6f,0x6f,0x8f,0x42,0xa3,0x3,0x80,0x0,\n  0x62,0xc2,0x67,0x3b,0x2e,0x4d,0xc8,0x0,0x20,0x80,0x88,0xa,0x3,0x7c,0x6,0x1,\n  0x4,0x10,0x13,0x25,0xb6,0x83,0x0,0x40,0x0,0x31,0x51,0x62,0x3b,0x8,0x0,0x4,\n  0x10,0x13,0x31,0x31,0x80,0xf,0x0,0x4,0x10,0x13,0x31,0x31,0x80,0xf,0x0,0x4,\n  0x10,0x13,0x25,0x9a,0x41,0x0,0x20,0x80,0x98,0x28,0xd1,0xc,0x2,0x0,0x1,0xc4,\n  0x82,0x9e,0xb6,0x49,0x5,0x0,0x1,0xc4,0x48,0x69,0x76,0x6,0x8,0x30,0x0,0x1c,\n  0xc,0x29,0xa2,0x83,0x80,0x88,0x54,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-2.png\n  0x0,0x0,0x1,0x72,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xe8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x90,0x39,0x8c,0x8c,0x8c,0x70,0xd3,0x80,0x6,0x33,\n  0x12,0x63,0x0,0x40,0x0,0x31,0x21,0x6b,0xfe,0xcf,0x80,0x80,0xc8,0x86,0xe1,0x3,\n  0x0,0x1,0xc4,0xc4,0x40,0x21,0x0,0x8,0x20,0x26,0x64,0x27,0x33,0x32,0x30,0x32,\n  0x34,0x2,0x21,0x88,0xc6,0xe2,0x85,0xff,0x48,0x18,0xe,0x0,0x2,0x8,0xc5,0xb,\n  0xd,0xc,0xd,0x60,0x36,0x88,0xc6,0xe6,0x85,0xc6,0xc6,0x46,0xc,0x17,0x0,0x4,\n  0x10,0x13,0x7a,0xe0,0x61,0xb,0x54,0xa0,0x46,0x9c,0xe1,0x1,0x10,0x40,0x4c,0xe0,\n  0xc0,0xc3,0x12,0xe2,0xd,0xd,0xd,0x44,0xc5,0x4,0x40,0x0,0x81,0x14,0x31,0x40,\n  0xd3,0x2,0xdc,0x8f,0x30,0xb1,0xff,0x68,0x0,0x68,0x28,0xba,0xd0,0x7f,0x80,0x0,\n  0x62,0x44,0x4e,0x48,0xc8,0xae,0x1,0x39,0xbb,0xbe,0xbe,0x1e,0xab,0xbf,0x61,0x0,\n  0x24,0xf,0x10,0x40,0xc,0x48,0xb6,0x31,0x20,0xdb,0x8e,0xcd,0x36,0x6c,0x62,0x0,\n  0x1,0xc4,0x82,0x2d,0x15,0x62,0xb,0x75,0xb0,0x6d,0x68,0xe2,0x40,0x31,0x46,0x80,\n  0x0,0xc2,0xe7,0x7f,0x6,0x74,0xd7,0x20,0xb9,0x0,0x2e,0x7,0x10,0x40,0x2c,0xa4,\n  0xa4,0x7b,0x6c,0x0,0x20,0x80,0x48,0x4a,0xca,0xc8,0xde,0x80,0x1,0x80,0x0,0x22,\n  0xda,0x0,0x90,0xbf,0xa1,0x7e,0x47,0x71,0x2d,0x40,0x80,0x1,0x0,0x43,0xed,0xd9,\n  0x1b,0xad,0xe9,0x68,0x40,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-5-8.png\n  0x0,0x0,0x2,0x60,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xd6,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x88,\n  0x99,0x81,0x81,0x81,0x1d,0x88,0x39,0x81,0x98,0x17,0x88,0x5,0x81,0x98,0xb,0x88,\n  0x59,0x19,0x20,0xe0,0x3b,0x10,0x7f,0x0,0xe2,0x4f,0x40,0xfc,0x5,0xca,0xff,0x3,\n  0x95,0x63,0x0,0x8,0x20,0x16,0x20,0x6,0x19,0xc0,0x6,0xc4,0xdc,0x40,0x2c,0x2,\n  0xc4,0xd2,0xfd,0xde,0x76,0x1b,0x60,0xa,0x80,0x16,0x24,0x0,0xa9,0x17,0x40,0xfc,\n  0xa,0x88,0xdf,0x20,0x19,0xfa,0x17,0x88,0xff,0x3,0x4,0x10,0xb2,0x1,0x3c,0x40,\n  0x2c,0x4,0xd2,0xc,0xd4,0xd4,0xc,0x64,0xf3,0x83,0xc4,0x81,0xfc,0x5,0x40,0x7e,\n  0x1,0xd4,0x75,0x9c,0x50,0x97,0x81,0x5c,0xf4,0x3,0x88,0x7f,0x1,0x4,0x10,0xb,\n  0xd4,0x15,0x1c,0x50,0x5,0x62,0x50,0x1b,0xd4,0x41,0x6c,0xa0,0x66,0x7,0x28,0xdf,\n  0x18,0xea,0x3a,0x7e,0xa8,0x21,0x20,0x17,0xbd,0x7,0xe2,0xaf,0x0,0x1,0xc4,0x84,\n  0x64,0x3b,0x48,0x81,0xc,0x54,0x3,0x58,0xf3,0xff,0xff,0xff,0xc1,0x1c,0x20,0x3b,\n  0x16,0x48,0x59,0x0,0xb1,0x9,0x10,0xeb,0x2,0xb1,0xa,0x10,0x4b,0x1,0xb1,0x0,\n  0x40,0x0,0xb1,0x40,0x3,0x4c,0x8,0x2a,0xa0,0x8,0xd5,0x0,0xd7,0xc,0x2,0x20,\n  0x36,0x23,0x23,0xa3,0xb,0x90,0xe9,0x2,0xf4,0xce,0x52,0xa8,0x85,0xa0,0x80,0x67,\n  0x0,0x8,0x20,0x90,0x1,0x2,0x40,0x2c,0x1,0xc4,0xf2,0x40,0xac,0x4,0xd3,0x80,\n  0xe,0xa0,0x86,0x80,0xc,0x8f,0x86,0x6,0x6e,0x2d,0x28,0x1c,0x0,0x2,0x8,0xe4,\n  0x5,0x61,0xa8,0xed,0x4a,0x40,0x49,0x17,0x6c,0x9a,0x91,0xd,0x81,0x1,0xa0,0x5a,\n  0x50,0x40,0x8b,0x3,0x4,0x10,0x13,0x34,0xde,0x25,0x81,0x2,0x91,0xe8,0x9a,0x41,\n  0x36,0xc2,0x6c,0xc6,0x66,0x8,0xc8,0xf5,0x0,0x1,0x4,0x32,0x80,0xb,0xa8,0xb9,\n  0x2,0x9f,0xb3,0x91,0xe5,0x8a,0xb6,0x1d,0x3e,0x80,0xa4,0x84,0x1d,0x20,0x80,0x98,\n  0x18,0x8,0x0,0x74,0xcd,0x48,0x51,0xb,0x2,0x4c,0x0,0x1,0x4,0x32,0xe0,0xb,\n  0x30,0x40,0x5a,0x90,0x9d,0x89,0xd,0xc0,0x34,0x3,0xd5,0x22,0xbb,0xe0,0x27,0x40,\n  0x0,0x81,0xc,0x78,0xb,0xc4,0x4f,0x80,0x12,0x73,0x70,0x19,0x82,0xa4,0x79,0x2f,\n  0x34,0x15,0xc2,0xc0,0x67,0x80,0x0,0x2,0x19,0xf0,0x1a,0x88,0x1f,0x0,0xf1,0x35,\n  0xa0,0x82,0x5,0xe8,0x86,0x20,0x69,0x5e,0x8,0xe4,0x5e,0x5,0xe2,0x3b,0x48,0xd2,\n  0x1f,0x1,0x2,0x8,0x94,0xe,0xde,0x41,0xf3,0x3,0x8,0xff,0x5,0x2a,0xfc,0xc,\n  0x34,0x24,0x17,0xe4,0x77,0xa0,0xe6,0xcd,0x40,0xcd,0xbe,0x40,0xb1,0x56,0x90,0x62,\n  0x50,0xd2,0x85,0x66,0x22,0x18,0x78,0x7,0x10,0x40,0x2c,0xd0,0x2c,0xa,0x3,0xbf,\n  0x41,0xce,0x2,0x6a,0xa8,0x0,0x1a,0xd2,0x1,0x64,0x83,0x34,0x67,0xc3,0xd2,0x3d,\n  0x34,0x3,0xc1,0x72,0xa9,0x1b,0x48,0x1c,0x20,0xc0,0x0,0x75,0xe3,0xaf,0x3,0x95,\n  0x9b,0x78,0x44,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-11.png\n  0x0,0x0,0x0,0xdf,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8e,0x7c,0xfb,0x51,0x93,\n  0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,0x25,0x0,0x0,0x80,0x83,\n  0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,0x30,0x0,0x0,0xea,0x60,\n  0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,0x46,0x0,0x0,0x0,0x6a,\n  0x49,0x44,0x41,0x54,0x38,0x4f,0xb5,0x92,0xd1,0xa,0x40,0x21,0x8,0x43,0xeb,0xcf,\n  0xfd,0xf3,0xca,0x60,0x97,0x8,0xe7,0x15,0x25,0x41,0x7a,0xa9,0xe3,0x9a,0xeb,0x63,\n  0x55,0xab,0x94,0x2,0x2a,0xd5,0x2a,0x8f,0xb7,0xfa,0x8,0x40,0x44,0x86,0xb6,0x55,\n  0x61,0x80,0x3e,0xb6,0x20,0x1f,0x0,0x53,0xd8,0x89,0xe9,0x37,0x64,0x3,0xd6,0x12,\n  0xa8,0x44,0x4b,0xf6,0x9,0x49,0x1,0xce,0xef,0xa4,0x0,0x54,0x81,0xe7,0xc3,0xaf,\n  0x7,0xea,0x3,0x6b,0x4c,0x74,0xb7,0xc0,0xf2,0x0,0x83,0xd3,0x39,0x80,0x2a,0x3a,\n  0x20,0x92,0x44,0xef,0x4e,0x28,0x89,0x4f,0x1,0x13,0xe0,0xe0,0x63,0xf8,0x6d,0x51,\n  0x7b,0x8e,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-2-1.png\n  0x0,0x0,0x1,0x39,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xaf,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x84,0x61,0x0,0x23,0x23,\n  0xe3,0x7f,0x10,0x26,0xd6,0x0,0x80,0x0,0x62,0x0,0x79,0x1,0x86,0x81,0x0,0xce,\n  0x5,0xb1,0x1b,0x1a,0x1a,0xc0,0x34,0x36,0xc,0x53,0x8,0x10,0x40,0x8c,0xb0,0x30,\n  0x0,0xd9,0x8a,0x1e,0x1c,0x8c,0x8c,0xc,0xc,0xd8,0xc2,0x8,0xa8,0x16,0x24,0xce,\n  0x8,0x62,0x3,0x4,0x10,0xc5,0x61,0x0,0x10,0x40,0x4c,0x48,0x5e,0x1,0x19,0x8c,\n  0x6e,0x3b,0x23,0x21,0x3,0x0,0x2,0x8,0xc5,0x5,0x40,0x3f,0x83,0x35,0xc2,0x34,\n  0x43,0x3,0x13,0xaf,0x21,0x0,0x1,0x84,0xe2,0x71,0x48,0x38,0xfc,0x47,0xf3,0x2e,\n  0x86,0x18,0x4a,0x18,0x0,0x4,0x10,0x13,0xe1,0x48,0xc2,0x1f,0xa3,0x0,0x1,0x44,\n  0x71,0x20,0x2,0x4,0x10,0xc5,0x6,0x0,0x4,0x10,0xb,0xb6,0x38,0x26,0x5,0x0,\n  0x4,0x10,0x23,0xa5,0x99,0x9,0x20,0x80,0x28,0xf6,0x2,0x40,0x0,0x51,0x6c,0x0,\n  0x40,0x80,0x1,0x0,0x28,0x50,0x50,0xfb,0x47,0x76,0x6a,0xcb,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-6.png\n  0x0,0x0,0x1,0x49,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xbf,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0x31,\n  0xe1,0x52,0xc0,0xc8,0xc8,0x88,0x17,0xc3,0x0,0x40,0x0,0x31,0xe1,0xd2,0xc,0xa,\n  0x1a,0x6c,0x18,0x4,0x90,0xc3,0xd,0x20,0x80,0x98,0x70,0x69,0xc6,0x6e,0x30,0x3,\n  0x43,0x43,0x43,0x3,0x8a,0xb,0x0,0x2,0x88,0x89,0x14,0xcd,0x7,0xe,0x1c,0x0,\n  0x1b,0x80,0xec,0x2,0x80,0x0,0x62,0x42,0xd6,0xc,0x53,0x88,0xd,0x83,0x34,0x3b,\n  0x38,0x38,0x60,0xb8,0x0,0x20,0x80,0xe0,0xb1,0x0,0x32,0x15,0x14,0xb2,0x20,0x45,\n  0xd8,0x0,0x48,0x1c,0x66,0x8,0x4c,0x2d,0x8,0x0,0x4,0x10,0xb,0xba,0xb,0x70,\n  0x1,0x64,0xcd,0xc8,0x0,0x20,0x80,0x48,0x72,0x1,0xb6,0x54,0xb,0x10,0x40,0x44,\n  0xbb,0x0,0x57,0x92,0x7,0x8,0x20,0x16,0x42,0xa,0x8,0x1,0x80,0x0,0x62,0x62,\n  0xa0,0x10,0x0,0x4,0x10,0xb,0x7a,0xda,0x26,0x15,0x0,0x4,0x10,0x23,0xa5,0xd9,\n  0x19,0x20,0xc0,0x0,0x82,0x44,0x51,0xa,0x1,0xc0,0x7b,0xef,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-10.png\n  0x0,0x0,0x1,0x34,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xaa,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0xb0,0x9,0x36,0x32,0x32,0x62,0x35,0xb5,0xfe,0xff,\n  0x7f,0x46,0x74,0x31,0x80,0x0,0x62,0x0,0xb9,0x0,0x19,0x37,0x30,0x30,0x80,0xdc,\n  0x84,0x15,0x83,0xe5,0xd0,0xd4,0x3,0x4,0x10,0x23,0xcc,0xb,0x30,0x5b,0xeb,0xb1,\n  0xd8,0x7c,0xf0,0xc0,0x1,0x30,0x6d,0xef,0xe0,0xc0,0xd0,0x88,0xe6,0x1a,0x80,0x0,\n  0x22,0xca,0x66,0x18,0x3e,0x70,0xe0,0x0,0x86,0x4b,0x0,0x2,0x88,0x68,0xcd,0xb8,\n  0xc,0x1,0x8,0x20,0x92,0x34,0x63,0x33,0x4,0x20,0x80,0x98,0x18,0x28,0x4,0x0,\n  0x1,0x44,0x96,0x1,0xa0,0xc0,0x84,0x1,0x80,0x0,0xa2,0xd8,0x5,0x0,0x1,0x44,\n  0xb1,0x1,0x0,0x1,0x44,0x72,0x2c,0xa0,0x27,0x2a,0x80,0x0,0x22,0x29,0x1d,0x60,\n  0x4b,0x91,0x0,0x1,0x84,0xe2,0x85,0x46,0x22,0x5c,0x8c,0xae,0x6,0x20,0x80,0x28,\n  0xce,0xb,0x0,0x1,0xc4,0x88,0x2d,0x3b,0x93,0x92,0x1b,0x1,0x2,0xc,0x0,0x99,\n  0xa,0x12,0xae,0x7,0xe7,0xff,0x79,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-16.png\n  0x0,0x0,0x1,0x53,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc9,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x82,0x4d,0x90,0x91,\n  0x91,0x11,0xc3,0x59,0x40,0x97,0x32,0x62,0x53,0xb,0x10,0x40,0x2c,0xe8,0x1a,0x1b,\n  0x1a,0x1a,0xb0,0x2a,0x6,0xc9,0x61,0x13,0x7,0x8,0x20,0xb8,0x1,0x8d,0x8d,0x8d,\n  0xff,0x71,0xd9,0x2,0x73,0x1,0x36,0x43,0x0,0x2,0x8,0x24,0xc1,0x0,0xd,0xc8,\n  0xff,0x30,0x36,0x3a,0x6,0xc9,0x1,0x5d,0xf6,0x1f,0x99,0x86,0xc9,0x1,0x4,0x10,\n  0x23,0x2c,0x16,0x70,0x39,0x11,0x5b,0xb8,0x20,0xab,0x3,0x8,0x20,0x46,0x52,0xa2,\n  0x11,0x9b,0x25,0x0,0x1,0xc4,0x48,0x69,0x3a,0x0,0x8,0x20,0x26,0x90,0xa9,0xa0,\n  0x0,0x44,0xa6,0xb1,0xda,0xde,0xc8,0x8,0xb4,0x1a,0x88,0x91,0x68,0x90,0x38,0x40,\n  0x0,0x31,0x81,0xa2,0xd,0x4,0x60,0x34,0x4e,0x50,0x8f,0x46,0x43,0x1,0x40,0x0,\n  0x31,0x11,0xd4,0x8,0x8f,0x67,0xec,0xc2,0x0,0x1,0x44,0xbc,0x1,0xf5,0xd8,0x85,\n  0x1,0x2,0x8,0x14,0xa2,0x44,0x25,0x5b,0x98,0x9f,0x51,0xd4,0xd5,0xff,0x67,0x4,\n  0x8,0x20,0x8a,0x63,0x1,0x20,0x80,0x28,0xce,0x8d,0x0,0x1,0x6,0x0,0xab,0xc0,\n  0x7a,0x77,0xa7,0x68,0x79,0x83,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-7-2.png\n  0x0,0x0,0x2,0x82,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xf8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0xc8,\n  0x8c,0x81,0x81,0x81,0x1d,0x88,0xff,0x1,0xf1,0xf,0x20,0xfe,0xe,0xa5,0x7f,0x1,\n  0xf1,0x5f,0x28,0xfd,0x1b,0x8a,0x61,0x62,0x70,0x0,0x10,0x40,0x2c,0x40,0x2c,0xd3,\n  0xe7,0x65,0xbb,0x16,0xc4,0x29,0xda,0x76,0x38,0x0,0x48,0x7d,0x5,0xe2,0x2f,0x40,\n  0xfc,0x13,0x88,0xff,0x0,0xf1,0x37,0x28,0xfe,0xe,0xd5,0x8c,0x62,0x0,0x40,0x0,\n  0x31,0xf1,0x9f,0xde,0xb7,0x16,0x89,0x2f,0x9,0xc4,0x12,0x50,0x2c,0x5,0x34,0xf8,\n  0x12,0x90,0x16,0x1,0x62,0x3e,0x20,0xe6,0x0,0x62,0x66,0x6,0x34,0x0,0x10,0x40,\n  0x4c,0x20,0xa2,0xb1,0xb1,0x11,0x64,0x7b,0x1b,0x90,0x29,0xc,0xc4,0xa2,0x40,0x2c,\n  0xe,0x34,0x78,0xb,0x54,0x8d,0x10,0x10,0xf3,0x42,0xd,0x60,0x42,0x37,0x0,0x20,\n  0x80,0x98,0x3e,0x9a,0x3a,0x75,0xd4,0xd7,0xd7,0x33,0x0,0x6d,0xab,0x2,0xf2,0x5,\n  0x80,0x58,0x10,0xaa,0x9,0x6,0xf8,0x81,0x98,0x1b,0x88,0xd9,0xb0,0x19,0x0,0x10,\n  0x40,0x20,0x2f,0x54,0x20,0xf1,0xb9,0x80,0x98,0x7,0x6a,0x23,0xc,0xf0,0x42,0xc5,\n  0xd9,0xb0,0x79,0x1,0x20,0x80,0x58,0x60,0x5e,0x0,0xba,0x64,0x2e,0xd4,0x6,0x36,\n  0x98,0x38,0x14,0x80,0x5c,0xf5,0x1,0xea,0x5,0x16,0xa8,0x21,0xf0,0x80,0x4,0x8,\n  0x20,0x16,0xa0,0xc6,0x3e,0xa0,0xf3,0x8b,0x80,0xec,0x64,0x60,0x38,0x2c,0x4,0xd2,\n  0x8c,0x68,0x4e,0x15,0x83,0xc6,0x2,0x28,0x66,0x3e,0x3,0xf1,0x7f,0x68,0x94,0x82,\n  0xc,0xf9,0x7,0x10,0x40,0x2c,0x40,0x2f,0x14,0x31,0x78,0xd9,0x22,0xfb,0x97,0x15,\n  0x8a,0x61,0x40,0x11,0x6a,0xe8,0x7f,0x24,0x2f,0x7d,0x83,0xa6,0x95,0x9f,0x0,0x1,\n  0xc4,0xec,0xe0,0xe0,0xd0,0x70,0xf0,0xe0,0x41,0x86,0x4d,0xdf,0x98,0xb7,0x3,0x5,\n  0x38,0x61,0xd1,0xd5,0x9e,0x1a,0xa7,0x0,0x52,0xed,0xae,0x2a,0xaf,0xb5,0xf3,0xf6,\n  0xa3,0xd7,0x50,0x3,0x18,0xa1,0x86,0xb3,0x41,0x13,0x1f,0x33,0x40,0x0,0x81,0x62,\n  0x61,0x2a,0x34,0x16,0x3c,0x61,0x7e,0x7,0xb2,0x1d,0x40,0xe1,0x2,0xb,0x1f,0x20,\n  0xdf,0x1f,0xc8,0x54,0x80,0x62,0x79,0x50,0xe2,0x3,0x45,0x35,0x28,0xda,0x1,0x2,\n  0x88,0xa1,0xa1,0xa1,0xe1,0x3f,0xc,0x0,0x93,0xf5,0xfe,0xff,0x24,0x2,0x80,0x0,\n  0x62,0x4,0x19,0x0,0xb2,0x9,0xe8,0x92,0x3,0xc0,0xf0,0x70,0x0,0xb1,0x41,0x2e,\n  0x2,0xd9,0x8c,0x4e,0x63,0x3,0x0,0x1,0xc4,0x8,0xb4,0xb5,0x15,0x9a,0x88,0x40,\n  0xa9,0x71,0x27,0xc8,0x6f,0x20,0x83,0x40,0x9a,0x60,0x0,0x28,0xbe,0x19,0x48,0x3d,\n  0x5,0xe2,0x57,0x40,0xfc,0x6,0x64,0x1f,0x34,0x46,0xde,0x3,0x4,0x10,0x28,0x21,\n  0x55,0x21,0x19,0x78,0xf,0x84,0x81,0xae,0x59,0x4,0xb3,0x11,0xa8,0x79,0x26,0x90,\n  0x2,0xe5,0x89,0xeb,0x40,0x7c,0x1b,0x88,0x1f,0x40,0xd,0x7b,0x9,0xc4,0x6f,0x1,\n  0x2,0x8,0xd9,0xb,0xd9,0x68,0x69,0x80,0x11,0x68,0xf8,0x44,0xa0,0x78,0x2a,0xd4,\n  0x46,0x10,0xfe,0x4,0xcd,0xad,0xb0,0xac,0xfd,0x13,0x20,0xc0,0x0,0xb5,0x6e,0xdc,\n  0x2,0x4c,0x1f,0x33,0xba,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-5-1.png\n  0x0,0x0,0x2,0x48,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xbe,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x88,\n  0x8d,0x81,0x81,0x81,0x7,0x88,0x5,0x80,0x58,0x8,0x8a,0x41,0x62,0xbf,0x80,0xf8,\n  0x13,0x10,0xbf,0x7,0xe2,0x77,0x40,0xfc,0x5,0x2a,0xf6,0x97,0x1,0x9,0x0,0x4,\n  0x10,0xb,0x10,0x33,0x3,0x31,0x27,0x54,0xa3,0x74,0xbf,0xb7,0xdd,0x6,0x90,0x4,\n  0xd0,0xe0,0x12,0xa8,0xc6,0x67,0x50,0x35,0xc,0xd8,0xc,0x1,0x8,0x20,0x90,0x1,\n  0x4c,0x40,0xcc,0xe,0xc4,0xfc,0x40,0x2c,0x5,0x12,0xfc,0xff,0xff,0x3f,0x3,0x23,\n  0x23,0x63,0xf,0xd0,0x90,0xc9,0x50,0x97,0x31,0x23,0x59,0x8a,0x62,0x8,0x40,0x0,\n  0xc1,0xc,0x0,0x39,0x99,0x1b,0x88,0x45,0x61,0xaa,0xa0,0x86,0xe4,0x2,0xd,0x59,\n  0x2,0x55,0xc3,0x80,0xcd,0x10,0x80,0x0,0x2,0x19,0xc0,0x8,0xb5,0x81,0x3,0x88,\n  0xf9,0x90,0x55,0x41,0xd,0x89,0x1,0x1a,0xc2,0xc8,0x80,0x9,0xc0,0x86,0x0,0x4,\n  0x10,0xcc,0x0,0x90,0xd,0xac,0xd0,0xb0,0x60,0xc0,0x62,0x48,0x34,0xd0,0x90,0x1f,\n  0x40,0xee,0x77,0x20,0xfe,0x6,0xc4,0x3f,0xa0,0x2e,0xf8,0x3,0x10,0x40,0xe8,0x4e,\n  0x63,0xc2,0x62,0x13,0xd8,0x10,0x60,0xe0,0x26,0x3,0x99,0x72,0x40,0x2c,0x6,0xc4,\n  0xbc,0xd0,0x70,0x63,0x2,0x8,0x20,0x74,0xd,0xff,0x19,0x70,0x0,0xa8,0x21,0xe5,\n  0xd0,0xd8,0xe2,0x86,0x86,0x1b,0x33,0x40,0x0,0x21,0x1b,0x0,0xa,0xd5,0xdf,0xd8,\n  0x34,0x3,0xbd,0x0,0xc6,0x20,0x0,0x34,0x64,0x3a,0xd4,0xab,0xe0,0x8,0x0,0x8,\n  0x20,0x16,0xa8,0xad,0x7f,0xa1,0x7e,0xfa,0x82,0xae,0x11,0x64,0x33,0x34,0x5d,0x1c,\n  0x0,0x52,0x6f,0x81,0xf8,0x4,0x54,0xf,0x8,0xff,0x3,0x8,0x20,0x26,0x28,0xe3,\n  0xf,0x34,0x70,0xde,0x21,0x6b,0x46,0x73,0xbe,0x3,0x34,0xb6,0x58,0x91,0xa2,0x9f,\n  0x11,0x20,0x80,0x40,0x8c,0x7f,0x48,0xc9,0xf6,0x5,0x4c,0x33,0xd4,0x46,0x10,0xdb,\n  0x1,0xe6,0xa,0x28,0x60,0x46,0x4a,0xc1,0x4c,0x0,0x1,0xc4,0x4,0x35,0x0,0x14,\n  0x2d,0x1f,0xa1,0xc9,0x16,0xa4,0xb9,0x16,0x48,0xdd,0x84,0x46,0x1b,0xb2,0x2b,0x2,\n  0x90,0xc,0x1,0xa7,0x4e,0x80,0x0,0x62,0x81,0xfa,0x1f,0x64,0xc0,0x7,0x10,0x1b,\n  0xa8,0xd9,0x16,0x48,0xb,0x3,0xf1,0x6b,0x90,0x9f,0x81,0xfc,0xb7,0xa0,0xc4,0x84,\n  0xe4,0x8a,0x5f,0x48,0xb1,0xc5,0x8,0x10,0x40,0x30,0x3,0x7e,0x42,0x5,0x7f,0x23,\n  0x19,0xf6,0x11,0x1a,0x2e,0xdf,0xd0,0x12,0x55,0x27,0xd0,0x50,0x2f,0x58,0x2,0x4,\n  0x8,0x20,0x58,0x18,0xfc,0x46,0x8a,0x9,0x90,0xb3,0x3f,0x43,0x35,0x82,0xf8,0xdf,\n  0x80,0x1a,0xb2,0x80,0x1a,0xa7,0x41,0xbd,0x17,0x9,0xd,0x2f,0x90,0xa5,0x7f,0x1,\n  0x2,0xc,0x0,0xcd,0x4d,0xa1,0x48,0xe6,0xd0,0x2,0x83,0x0,0x0,0x0,0x0,0x49,\n  0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-11.png\n  0x0,0x0,0x1,0x29,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x9f,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x2,0x63,0x30,0x32,\n  0x32,0x82,0x9d,0x2,0x74,0x11,0x23,0xba,0x22,0x98,0x1c,0x3a,0x0,0xa9,0x5,0x8,\n  0x20,0x16,0x64,0x81,0x86,0x86,0x6,0xb0,0x62,0x64,0x43,0x40,0x7c,0x90,0x38,0x3a,\n  0x80,0x89,0x1,0x4,0x10,0x13,0x36,0x9,0x98,0x8d,0xb8,0x34,0x23,0x3,0x80,0x0,\n  0xc2,0x1a,0x6,0x30,0x43,0x8,0x69,0x6,0x1,0x80,0x0,0xc2,0x19,0x88,0xc4,0x68,\n  0x6,0x1,0x80,0x0,0xa2,0x38,0x16,0x0,0x2,0x88,0x62,0x3,0x0,0x2,0x88,0x62,\n  0x3,0x0,0x2,0x88,0x85,0x90,0xbf,0x9,0x85,0x5,0x40,0x0,0xb1,0x20,0x27,0xa,\n  0x62,0x13,0x10,0x32,0x0,0x8,0x20,0x8a,0xbd,0x0,0x10,0x40,0x14,0x1b,0x0,0x10,\n  0x40,0x8c,0xf8,0x72,0x23,0x21,0x2f,0x80,0xbc,0xd,0x10,0x40,0x8c,0x94,0x66,0x67,\n  0x80,0x0,0x3,0x0,0xc5,0x1b,0x30,0x25,0xf6,0x14,0xfa,0x83,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-7.png\n  0x0,0x0,0x1,0x57,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xcd,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x2,0x22,0x1a,0x19,\n  0x19,0x51,0x9c,0x51,0xf,0x74,0x15,0x63,0x23,0x23,0x4e,0x4d,0xff,0xeb,0xff,0x83,\n  0xf4,0x80,0xd4,0x31,0x2,0x4,0x10,0xb,0x4c,0x3,0xc,0x80,0x24,0x48,0x1,0x0,\n  0x1,0x4,0x71,0x1,0x92,0x6d,0x30,0xc3,0x40,0xb6,0x80,0x0,0xba,0x4b,0x60,0xb6,\n  0xc3,0x0,0x40,0x0,0xb1,0x60,0x33,0x95,0x91,0xb1,0x11,0xa1,0x81,0x40,0x20,0x3,\n  0x4,0x10,0xb,0x21,0x27,0x22,0x1b,0x6,0x31,0xb0,0x1e,0xc5,0xcb,0x0,0x1,0x84,\n  0x12,0xb,0xf5,0x40,0xe7,0xa1,0x6b,0xc0,0x6a,0x28,0xd0,0x5b,0x30,0xaf,0x1,0x4,\n  0x10,0x49,0xd1,0x8,0xb2,0x1d,0x3d,0x4c,0x0,0x2,0x88,0xe2,0x74,0x0,0x10,0x40,\n  0x4c,0xa4,0x3a,0x1f,0x1d,0x0,0x4,0x10,0x13,0x4c,0x33,0xcc,0x89,0x20,0x4c,0xa,\n  0x0,0x8,0x20,0x16,0x58,0xa0,0x20,0xc7,0x2f,0xae,0xa8,0xc3,0x96,0x3a,0x1,0x2,\n  0x88,0x11,0xaa,0xf8,0x3f,0xa1,0x14,0x58,0x8f,0xdd,0x50,0x46,0x80,0x0,0x62,0x21,\n  0xc5,0xb9,0x8d,0x68,0x2e,0x0,0x79,0x1d,0x20,0x80,0x18,0x29,0xcd,0xce,0x0,0x1,\n  0x6,0x0,0xda,0xa7,0x46,0xa0,0xe5,0xcc,0x7c,0x78,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-12.png\n  0x0,0x0,0x1,0x4f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0x94,0x1,0x8d,0x8d,0x8d,0xf,0x41,0x18,0x9b,0x1c,0x40,0x0,0x11,0xed,0x2,\n  0x7,0x7,0x7,0x6,0x6c,0x86,0x0,0x4,0x10,0x23,0x2c,0x10,0x71,0xd9,0x80,0x64,\n  0x80,0x1c,0x90,0x7a,0x74,0xe0,0xc0,0x1,0x86,0xfa,0xfa,0x7a,0x79,0x98,0x38,0x40,\n  0x0,0x81,0xd,0x60,0x64,0x64,0x7c,0xd8,0xd0,0xd0,0x0,0x53,0x44,0x8,0xa0,0x18,\n  0x2,0x10,0x40,0x30,0x2f,0xc8,0x41,0x31,0x31,0x40,0xe,0x68,0xd1,0x33,0xa0,0x8b,\n  0x8f,0x83,0x38,0x0,0x1,0xc4,0x42,0x46,0xc0,0x83,0x5c,0x20,0x5,0x73,0x1,0x40,\n  0x0,0xa1,0x18,0x0,0x72,0x1a,0xbe,0x40,0xc4,0x16,0x6,0x0,0x1,0x4,0xf,0x3,\n  0x7c,0x56,0x2,0xc3,0x7,0xe4,0x6c,0xc,0xcd,0x20,0x0,0x10,0x40,0x60,0x17,0x0,\n  0xd,0x91,0xc7,0xa5,0x19,0x6a,0x38,0x56,0xcd,0x20,0x0,0x10,0x40,0x8c,0x84,0xf2,\n  0x2,0xcc,0x75,0xb8,0x2c,0x1,0x8,0x20,0x46,0x4a,0x33,0x13,0x40,0x0,0x51,0x9c,\n  0x17,0x0,0x2,0x88,0x62,0x3,0x0,0x2,0xc,0x0,0x29,0x1f,0x4f,0x99,0xac,0x7f,\n  0x99,0x8b,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-6.png\n  0x0,0x0,0x1,0x4b,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc1,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x42,0xac,0x42,0x46,\n  0x46,0x46,0xb8,0x53,0x81,0xae,0x66,0x84,0xb1,0x1,0x2,0x88,0x85,0x58,0xcd,0xd,\n  0xd,0xd,0x28,0x7c,0x98,0x21,0x0,0x1,0x44,0xb1,0x17,0x0,0x2,0x8,0xe4,0x1c,\n  0xa2,0x30,0xc8,0xe5,0x40,0x57,0xfc,0x87,0xf8,0x0,0x21,0xe,0x10,0x40,0x4c,0xa4,\n  0x7a,0x1,0x44,0x23,0x87,0x7,0x40,0x0,0x31,0x91,0x12,0x78,0xd8,0xc4,0x1,0x2,\n  0x88,0x89,0x90,0x66,0xe4,0x10,0x47,0xf3,0x3a,0x23,0x48,0x1e,0x20,0x80,0x50,0xd,\n  0x60,0x64,0xf8,0xf,0xc6,0x58,0xa2,0xb,0x97,0x21,0x0,0x1,0xc4,0x8,0x4f,0x89,\n  0x20,0x8d,0x20,0xed,0xe8,0x6c,0x1c,0xde,0x80,0x19,0xe,0x10,0x40,0x4c,0xd8,0x34,\n  0x80,0xd9,0x58,0x5c,0x82,0x4e,0x83,0x0,0x40,0x0,0xe1,0xe,0x3,0x98,0x21,0x48,\n  0x6,0x61,0x3,0x0,0x1,0x84,0x3f,0x16,0x20,0xda,0x19,0xd1,0xbd,0x80,0xcc,0x7,\n  0x8,0x20,0x26,0x6c,0x4e,0x26,0x25,0x1a,0x1,0x2,0x88,0x11,0x25,0x3b,0xa3,0x87,\n  0x5,0x11,0x0,0x20,0xc0,0x0,0xb6,0x9,0x77,0xf5,0x1c,0x6d,0x6d,0xca,0x0,0x0,\n  0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-2-5.png\n  0x0,0x0,0x1,0x46,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xbc,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x90,0x39,0x8d,0x8d,0x8d,0x24,0x9b,0x6,0x10,0x40,\n  0xc,0x20,0x17,0x80,0x70,0x43,0x43,0x3,0xc8,0x2d,0x70,0xc,0xe2,0x33,0x20,0x41,\n  0x30,0x1f,0x21,0xd,0xe6,0x83,0xf4,0x1,0x4,0x10,0x45,0x9a,0x41,0x18,0x20,0x80,\n  0x18,0x29,0xd,0x3,0x80,0x0,0x62,0xc1,0x26,0xc8,0xc8,0xc8,0xf8,0x1f,0x87,0x77,\n  0x19,0xd1,0xc5,0x0,0x2,0x88,0x5,0x5f,0xd8,0xa0,0x19,0x8a,0x55,0x1d,0x40,0x0,\n  0xb1,0x10,0x63,0x33,0xba,0x3c,0xb2,0x4b,0x0,0x2,0x88,0x9,0x9b,0x13,0xb1,0x85,\n  0xb,0x4c,0xc,0xdd,0x1b,0x0,0x1,0xc4,0x84,0xcd,0x9f,0xd8,0x9c,0xb,0x12,0xc3,\n  0x16,0x6,0x0,0x1,0xc4,0x84,0x2b,0xb0,0x90,0xd,0xc1,0xa5,0x19,0x4,0x0,0x2,\n  0x8,0x6f,0x34,0x62,0xf3,0x33,0x3a,0x0,0x8,0x20,0x14,0x3,0xc8,0x49,0xca,0x0,\n  0x1,0x84,0x92,0x94,0x19,0x48,0x84,0x20,0x3d,0x0,0x1,0x44,0x91,0x66,0x90,0x5e,\n  0x80,0x0,0x62,0x84,0xa4,0x73,0xd2,0x41,0x7d,0x7d,0x3d,0x38,0x5c,0x0,0x2,0xc,\n  0x0,0xca,0x6,0xcc,0x8f,0xd8,0x78,0x33,0x9c,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,\n  0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-20.png\n  0x0,0x0,0x1,0x74,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xea,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0x94,0x1,0x8d,0x8d,0x8d,0xf,0x41,0x18,0x9b,0x1c,0x40,0x0,0x11,0xed,0x2,\n  0x7,0x7,0x7,0x6,0x6c,0x86,0x0,0x4,0x10,0x23,0x2c,0x10,0x71,0xd9,0x80,0x64,\n  0x80,0x1c,0x90,0x7a,0x74,0xe0,0xc0,0x1,0x86,0xfa,0xfa,0x7a,0x79,0x98,0x38,0x40,\n  0x0,0x81,0xd,0x60,0x64,0x64,0x7c,0xd8,0xd0,0xd0,0x0,0x53,0x44,0x8,0xa0,0x18,\n  0x2,0x10,0x40,0x30,0x2f,0xc8,0x41,0x31,0x31,0x40,0xe,0x68,0xd1,0x33,0xa0,0x8b,\n  0x8f,0x83,0x38,0x0,0x1,0x84,0x12,0x6,0x20,0x93,0x89,0x74,0x81,0x14,0xd0,0x5,\n  0x96,0x20,0xe,0x40,0x0,0xb1,0xa0,0x7,0x14,0x2e,0x43,0x40,0x72,0xd8,0xc2,0x0,\n  0x20,0x80,0x18,0xa0,0x81,0xf8,0x1f,0x28,0xf1,0x1f,0x99,0x46,0xc6,0xc0,0xf0,0x1,\n  0x89,0x83,0xc2,0xe9,0x21,0x48,0x3d,0x32,0x6,0x8,0x20,0x98,0xb,0x1e,0x81,0x8,\n  0xa0,0x2,0x39,0x74,0xaf,0xe0,0xb4,0x19,0xa,0x0,0x2,0x8,0x6e,0x12,0x10,0x3c,\n  0x4,0xd9,0x2,0xa2,0xa1,0xec,0xff,0xc8,0x7c,0x74,0x9b,0x61,0x18,0x20,0x80,0x18,\n  0x91,0x33,0x13,0x28,0x3a,0x81,0x7c,0x79,0x10,0x8d,0x64,0x81,0x3c,0xbe,0x10,0x5,\n  0x8,0x20,0x46,0x4a,0x73,0x23,0x40,0x0,0x51,0x9c,0x99,0x0,0x2,0xc,0x0,0x5,\n  0x68,0x96,0x69,0xa6,0xd0,0x96,0xe5,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-12.png\n  0x0,0x0,0x1,0x63,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd9,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0xd0,0x5,0x1a,0x1b,0x1b,0x71,0x9a,0x58,0x5f,0x5f,\n  0xcf,0x88,0x2e,0x6,0x10,0x40,0x2c,0xd8,0x15,0x36,0x30,0x60,0x1a,0xdc,0x80,0xd5,\n  0x50,0x80,0x0,0x62,0x0,0x79,0x1,0x1d,0x37,0x34,0x34,0xa0,0x8,0x41,0xf8,0xff,\n  0xb1,0xaa,0x5,0x8,0x20,0x26,0x90,0x93,0xf1,0x39,0x1b,0x1b,0x40,0xd6,0x3,0x10,\n  0x40,0x70,0xdb,0x40,0x34,0xb2,0x4d,0xc8,0xe2,0xc8,0x62,0xe8,0xe2,0x0,0x1,0xc4,\n  0x82,0xee,0xef,0xc6,0x46,0x86,0xff,0xb8,0x2,0x16,0x5b,0xd8,0x0,0x4,0x10,0xb,\n  0xae,0x0,0x44,0xe,0x34,0x6c,0x1a,0x61,0x0,0x20,0x80,0x98,0x70,0x47,0x59,0x3,\n  0x41,0xcd,0x20,0x0,0x10,0x40,0x2c,0xf8,0xa2,0xb,0xa4,0x99,0x90,0x4b,0x0,0x2,\n  0x88,0x9,0x59,0x23,0x8,0xc3,0x12,0xb,0xba,0xb,0x40,0xe2,0x30,0x35,0xc8,0x0,\n  0x20,0x80,0x18,0x70,0x85,0x3e,0x22,0xa4,0x19,0xf0,0xc4,0xc6,0x7f,0x6,0x80,0x0,\n  0x22,0x22,0x1,0xe1,0x4f,0x50,0x0,0x1,0x44,0x30,0xf5,0x11,0x32,0x4,0x20,0x80,\n  0x98,0x60,0xf1,0x4c,0x28,0xb4,0x51,0x3,0x16,0x91,0x72,0x1,0x2,0x88,0x5,0x57,\n  0x66,0x41,0x4,0x26,0x28,0xf0,0x18,0x70,0x26,0x75,0x80,0x0,0x3,0x0,0x21,0xe7,\n  0x26,0xee,0xd8,0xba,0x71,0x79,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-5.png\n  0x0,0x0,0x1,0x6b,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xe1,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0xc4,0x2,0x63,0x30,0x32,0x32,0xe2,0xf5,0xb,0xd0,0xab,0x8c,0xd8,0xc4,0x1,0x2,\n  0x88,0x5,0x55,0x11,0x76,0xcd,0x8c,0x8c,0xb8,0xd,0x6,0x8,0x20,0x16,0xc2,0x8e,\n  0xfc,0xcf,0x88,0x2f,0x9c,0x1,0x2,0x88,0x85,0x90,0x66,0x64,0xaf,0x61,0xf3,0x6,\n  0x40,0x0,0x31,0x11,0xd2,0xc,0x8a,0x66,0x90,0xb,0x40,0x34,0xb6,0x70,0x2,0x8,\n  0x20,0x26,0x42,0x9a,0x81,0x21,0xc0,0xd0,0xd8,0xd8,0x0,0xe,0xa,0x6c,0x86,0x0,\n  0x4,0x10,0x3,0xc4,0x86,0xff,0xc8,0xcc,0xff,0xa8,0x7c,0x88,0x23,0x1a,0x1a,0x1a,\n  0xfe,0x43,0x25,0xfe,0x23,0x29,0x64,0x0,0x8,0x20,0x46,0x58,0x4a,0x44,0xf7,0x2b,\n  0xb2,0xb,0x80,0x22,0x70,0x1a,0x28,0x8e,0x12,0x16,0x0,0x1,0xc4,0x88,0x2f,0x29,\n  0x23,0xc,0x81,0x80,0xc6,0xc6,0x46,0x30,0x5d,0x5f,0x5f,0xf,0x37,0x0,0x20,0x80,\n  0x98,0x8,0x25,0x1e,0x90,0x8d,0x30,0xc,0x2,0x40,0xaf,0x80,0xc,0x82,0x9b,0xa,\n  0x10,0x40,0x4,0xd3,0x1,0x96,0xa8,0x3,0x85,0x7,0x98,0x6,0xb9,0x4,0x20,0x80,\n  0x58,0x48,0x4d,0xfb,0x50,0xe7,0xc3,0xd,0x1,0x8,0x20,0xe4,0xa0,0x27,0x9,0x43,\n  0x63,0x85,0x1,0x20,0xc0,0x0,0xfc,0x35,0xaf,0x40,0x1e,0xc7,0x29,0xf8,0x0,0x0,\n  0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-20.png\n  0x0,0x0,0x1,0x62,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x48,0xd5,0xc0,0xc8,0xc0,0x80,0x62,0x23,0x40,0x0,\n  0x31,0x91,0x63,0x2b,0xb2,0x21,0x0,0x1,0x4,0x64,0x33,0xe0,0xf4,0x3,0xd0,0x7b,\n  0x8c,0x8c,0xf8,0xe4,0x81,0x66,0x1,0x4,0x10,0xb,0x54,0x21,0x56,0x8b,0x18,0x1b,\n  0x1b,0x31,0x25,0xea,0xeb,0x21,0x74,0x63,0x23,0x98,0xd,0x10,0x40,0x50,0xfd,0x60,\n  0x13,0x30,0x30,0x48,0x18,0x86,0xc1,0x44,0x43,0xc3,0x7f,0x18,0xd,0x13,0x7,0x8,\n  0x20,0x16,0x24,0xe7,0x12,0x17,0x70,0x40,0x9b,0xff,0xd7,0xd7,0x33,0xc2,0xb8,0x0,\n  0x1,0x84,0xd3,0x5,0x60,0x21,0x98,0x8d,0x38,0x30,0x88,0x2,0x8,0x20,0x46,0xb8,\n  0x62,0xac,0x16,0x3,0x9,0x50,0x38,0x20,0xfb,0x1b,0x66,0x2b,0xd4,0x15,0x0,0x1,\n  0x84,0x37,0xc,0x30,0x5c,0x82,0xe4,0x77,0x18,0x6,0x8,0x20,0xb8,0x1,0x4,0x0,\n  0x3,0x36,0xcd,0x20,0xc,0x10,0x40,0x70,0x2f,0x30,0x32,0x32,0x32,0xe0,0x49,0xf,\n  0x70,0x2f,0xa1,0x3,0x80,0x0,0x22,0x2a,0x16,0x20,0x89,0x82,0x11,0x64,0x11,0x86,\n  0x21,0x0,0x1,0xc4,0x82,0xa4,0x80,0x90,0xb,0xb0,0x2,0x80,0x0,0x22,0xda,0x5,\n  0xb8,0x0,0x40,0x0,0xb1,0x10,0xb2,0x9d,0x10,0x0,0x8,0x30,0x0,0x96,0x23,0xd6,\n  0x74,0x60,0x41,0x14,0x4d,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-1-3.png\n  0x0,0x0,0x1,0x2f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x0,0xb9,0xa0,0xa1,0xa1,0xe1,0x3f,0x21,0x0,0x52,\n  0x3,0x56,0xc,0x65,0x43,0x99,0xc,0x0,0x1,0xc4,0xc4,0x40,0x21,0x0,0x8,0x20,\n  0x16,0x52,0x14,0x37,0x34,0x36,0x62,0x88,0x1,0x4,0x10,0x49,0x2e,0x68,0xa8,0x6f,\n  0x0,0x63,0x64,0x0,0x10,0x40,0x14,0x7b,0x1,0x20,0x80,0x48,0xf4,0x42,0x3,0x86,\n  0x18,0x40,0x0,0x91,0xe8,0x85,0x7a,0x30,0x46,0x6,0x0,0x1,0x44,0xb1,0x17,0x0,\n  0x2,0x8,0xee,0x85,0x46,0x2c,0x21,0x4c,0x4c,0x2c,0x0,0x4,0x10,0x3c,0x21,0x21,\n  0x27,0x12,0x6,0x28,0xc4,0x10,0x67,0xf8,0xf,0xc6,0xc8,0x9,0x9,0x20,0x80,0x28,\n  0xf6,0x2,0x40,0x0,0x31,0x82,0x4c,0xa1,0x24,0x2f,0x0,0x4,0x10,0x23,0xa5,0xb9,\n  0x11,0x20,0x80,0x28,0xf6,0x2,0x40,0x80,0x1,0x0,0x6f,0x6b,0x7c,0xc7,0x78,0xc6,\n  0x61,0xbb,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-4.png\n  0x0,0x0,0x1,0x30,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa6,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0xb1,0x1,0x0,0x1,0xc4,0x8,0xc,0x1,0xcc,0x40,0xf8,0xff,0x9f,0x11,0xbf,\n  0x2e,0xa0,0x36,0xa8,0x1a,0x80,0x0,0x62,0x81,0x2b,0x46,0x12,0x24,0x5,0x0,0x4,\n  0x10,0x13,0x4e,0x1b,0x40,0x18,0x1b,0x1f,0x8d,0x6,0x8,0x20,0x26,0x9c,0xce,0x3,\n  0x61,0x98,0x46,0x28,0xbf,0xb1,0xb1,0x11,0xe1,0x4a,0x28,0xd,0x10,0x40,0x8c,0xf0,\n  0x74,0x0,0x53,0x88,0x6c,0x33,0xb2,0xf7,0xd0,0xf9,0x50,0x36,0x40,0x0,0xb1,0x60,\n  0xf5,0x2,0x54,0x12,0x6c,0x23,0x10,0xd4,0xe3,0x9,0x27,0x80,0x0,0x62,0x0,0xb9,\n  0x0,0x8c,0x41,0xda,0x90,0xd9,0x78,0xf8,0xd,0xd,0xd,0x70,0x3e,0x40,0x0,0x31,\n  0x52,0x9a,0x94,0x1,0x2,0x88,0xe2,0x84,0x4,0x10,0x40,0x14,0x1b,0x0,0x10,0x40,\n  0x14,0x1b,0x0,0x10,0x40,0x14,0x1b,0x0,0x10,0x60,0x0,0xf6,0xa2,0x6b,0xee,0x31,\n  0x8b,0xeb,0x9a,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-17.png\n  0x0,0x0,0x1,0x64,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xda,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x9c,0xd7,0xd0,0xc0,0x50,0x4f,0xa4,0x6b,0x1a,0x19,0x19,\n  0xc1,0xea,0x41,0x0,0x20,0x80,0x98,0xe0,0xa6,0x1,0x35,0x83,0x25,0xd0,0xc0,0xc1,\n  0x83,0x7,0xc1,0x18,0x59,0x33,0xb2,0x45,0x0,0x1,0xc4,0x84,0xe2,0x24,0x34,0x43,\n  0x90,0x35,0x82,0xd8,0xe8,0x9a,0x41,0x0,0x20,0x80,0x98,0x30,0xfc,0x85,0x66,0x88,\n  0xbd,0xbd,0x3d,0x98,0x3e,0xe0,0xe0,0x80,0xd5,0x8b,0x0,0x1,0xc4,0x82,0x35,0x70,\n  0xa0,0x86,0xc0,0x34,0xe0,0xd2,0xc,0x2,0x0,0x1,0xc4,0x82,0x2b,0xa0,0x1c,0xe,\n  0x1c,0x80,0xbb,0x4,0x5f,0xe0,0x2,0x4,0x10,0x13,0x36,0x41,0x90,0x7f,0x61,0x4e,\n  0x27,0x4,0x0,0x2,0x88,0x9,0x5f,0x54,0x81,0x5c,0x81,0x2b,0x76,0x60,0x0,0x20,\n  0x80,0xb0,0x1a,0x0,0xf2,0x33,0x48,0x33,0xa1,0x28,0x6,0x1,0x80,0x0,0x62,0xc2,\n  0x65,0x33,0x72,0xc,0xe0,0x33,0x4,0x20,0x80,0x98,0xd0,0x35,0xc3,0x2,0xc,0x5b,\n  0x18,0x60,0x33,0x4,0x20,0x80,0x98,0x88,0xd5,0x8c,0xcb,0x10,0x80,0x0,0x62,0x4,\n  0xe5,0x46,0x4a,0x32,0x13,0x40,0x0,0x31,0x52,0x9a,0x9d,0x1,0x2,0xc,0x0,0xfa,\n  0xe0,0x62,0x5a,0x6d,0xf7,0xca,0x68,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-3.png\n  0x0,0x0,0x1,0x61,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd7,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x90,0x39,0x8c,0x8c,0x8c,0x70,0xd3,0x80,0x6,0x33,\n  0x12,0x63,0x0,0x40,0x0,0x31,0x21,0x6b,0xfe,0xcf,0x80,0x80,0xc8,0x86,0xe1,0x3,\n  0x0,0x1,0xc4,0xc4,0x40,0x21,0x0,0x8,0x20,0x26,0x64,0x27,0x33,0x32,0x30,0x32,\n  0x34,0x2,0x21,0x88,0xc6,0xe2,0x5,0xac,0x2e,0x2,0x8,0x20,0x14,0x2f,0x34,0x30,\n  0x34,0x80,0xd9,0x20,0x1a,0xd9,0xb,0x8d,0x8d,0x8d,0xff,0x71,0x19,0x2,0x10,0x40,\n  0x4c,0xe8,0x81,0x87,0x2b,0x50,0xa1,0x6,0x61,0x18,0x2,0x10,0x40,0x4c,0xe0,0xc0,\n  0xc3,0x11,0xe2,0xe8,0xe2,0xf5,0xf5,0xf5,0x8c,0xe8,0x86,0x0,0x4,0x10,0x48,0x11,\n  0x3,0x34,0x2d,0xfc,0x47,0xc7,0x30,0xb9,0x86,0x86,0x86,0xff,0x50,0x80,0xc1,0x7,\n  0x8,0x20,0x26,0x74,0xdb,0xd0,0x69,0x6c,0x0,0xd9,0x25,0x0,0x1,0x44,0x76,0x34,\n  0x2,0xd,0x1,0x87,0x9,0x40,0x0,0x31,0xe1,0xa,0x30,0x2,0x9,0xe9,0x3f,0x48,\n  0x33,0xc8,0x25,0x0,0x1,0x44,0x52,0x2c,0xa0,0x6b,0x6,0x71,0x0,0x2,0x88,0x5,\n  0x9b,0x7f,0xf1,0xf8,0x1f,0x45,0x33,0x8,0x0,0x4,0x10,0x49,0x61,0x80,0xae,0x19,\n  0x4,0x0,0x2,0x88,0x89,0x12,0xcd,0x20,0x0,0x10,0x60,0x0,0xe3,0x27,0x81,0x3,\n  0x20,0x43,0x31,0xe7,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n  \n    // /work/depthmap/depthmap/images/win/b-5-9.png\n  0x0,0x0,0x2,0x62,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xd8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x88,\n  0x1,0x8,0x98,0x81,0x98,0xd,0x88,0xb9,0x80,0x98,0x1b,0x8a,0x39,0x18,0x20,0xe0,\n  0x7,0x10,0x7f,0x85,0xe2,0x6f,0x40,0xfc,0xb,0x88,0xff,0x42,0xe5,0x18,0x0,0x2,\n  0x88,0x5,0x88,0x19,0xa1,0x34,0x48,0xb3,0x20,0x10,0x8b,0x1,0xb1,0x30,0x10,0xf3,\n  0x40,0xd5,0x7c,0x1,0xe2,0xb7,0x40,0xfc,0xa,0xca,0xff,0x7,0xc5,0xff,0x41,0x1c,\n  0x80,0x0,0x2,0x69,0x64,0x2,0x62,0x56,0xa8,0xad,0x20,0xcd,0x8a,0x40,0x2c,0xdf,\n  0xef,0x6d,0xd7,0xa,0x52,0x0,0x74,0x61,0x3d,0x90,0x7a,0xc,0x55,0x3,0xd2,0xf8,\n  0x7,0xea,0x2,0x10,0xcd,0x0,0x10,0x40,0x4c,0x48,0x2e,0xe0,0x86,0xda,0xc,0xd6,\n  0xfc,0xff,0xff,0x7f,0x6,0x10,0x6,0xb2,0x1b,0x81,0x62,0xda,0x40,0xac,0x0,0xc4,\n  0xa2,0x50,0x75,0x6c,0x50,0x7d,0xc,0x0,0x1,0x84,0x6c,0x0,0xc8,0xcf,0x7c,0xfc,\n  0xa7,0xf7,0xb5,0x36,0x34,0x34,0xc0,0xbc,0x8,0x33,0xa4,0x18,0xc8,0x54,0x5,0x62,\n  0x29,0xa8,0x37,0x39,0xa0,0xe1,0xc6,0x0,0x10,0x40,0x4c,0xc,0xa8,0x80,0x19,0x8d,\n  0xcf,0xc0,0xc8,0xc8,0x8,0x63,0x2a,0x3,0xb1,0xc,0x10,0xb,0x21,0xbb,0x2,0x20,\n  0x80,0x98,0xa0,0x81,0xf1,0x7,0x1a,0xba,0xdf,0x3e,0x9a,0x3a,0xf5,0xc2,0x5c,0x0,\n  0xd2,0x8c,0xe4,0x95,0x8,0xa0,0x90,0x1c,0x34,0x9c,0x78,0xa1,0x6,0x30,0x1,0x4,\n  0x10,0xb2,0x1,0xa0,0x68,0xfa,0x0,0xa,0x6d,0x60,0xc0,0x6d,0x86,0x69,0x46,0x3,\n  0xd2,0x40,0x2c,0x2,0x35,0x80,0x1d,0xe4,0x62,0x80,0x0,0x62,0x82,0x86,0xec,0x6f,\n  0x68,0x1c,0x83,0xa2,0xeb,0x19,0x10,0x3f,0x40,0xd7,0x9,0x75,0x45,0x24,0xd4,0xb,\n  0x7c,0xb0,0x70,0x0,0x8,0x20,0x74,0x17,0xbc,0x3,0xe2,0x27,0x40,0x7c,0xf,0xe8,\n  0x8a,0x55,0x48,0xfe,0x47,0x6,0xa0,0xf4,0xc1,0x9,0xf3,0x2,0x40,0x0,0xb1,0x40,\n  0x5,0x41,0xf1,0xfa,0x13,0x88,0x3f,0x3,0xf1,0x6b,0x20,0x7e,0x8,0x8d,0x32,0x6c,\n  0x80,0x19,0x1a,0x6b,0xe0,0x34,0x4,0x10,0x40,0xc8,0xb1,0xf0,0x17,0x9a,0x6c,0xdf,\n  0x43,0xbd,0x71,0x7,0xe8,0x8a,0x69,0x30,0x57,0x20,0xb9,0xe6,0x7,0xd4,0xdb,0x60,\n  0x0,0x10,0x40,0xc8,0x6,0xfc,0x87,0xc6,0xc4,0x57,0xa8,0x2b,0x40,0xe1,0x70,0x3,\n  0x68,0xc8,0x24,0x34,0xaf,0x7c,0x80,0x1a,0x2,0xce,0xf,0x0,0x1,0x84,0x9e,0xe,\n  0x60,0xae,0xf8,0x8,0x75,0xc5,0x2d,0x20,0xbe,0xc,0x34,0xa4,0xa,0x49,0xcd,0x4b,\n  0x20,0xfe,0x4,0xb5,0xec,0x1f,0x40,0x0,0xa1,0x1b,0x0,0xb,0xd0,0x6f,0xd0,0x0,\n  0x7d,0xc,0x35,0xe4,0x1a,0xd0,0x90,0x48,0xa8,0x9a,0xe7,0x50,0xb,0xc0,0x5e,0x1,\n  0x8,0x20,0x16,0x2c,0x81,0xf4,0x17,0x6a,0xfa,0x17,0x28,0xff,0x3b,0xd4,0x30,0xe,\n  0xa0,0x21,0xa6,0xd0,0x80,0xfe,0x2,0xf3,0x6,0x40,0x80,0x1,0x0,0xcb,0x7b,0x92,\n  0x92,0x74,0x98,0x65,0xe6,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-2-2.png\n  0x0,0x0,0x1,0x35,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xab,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0xb1,0x1,0x0,0x1,0xc4,0x42,0x48,0x1,0x23,0x23,0x23,0xd6,0x40,0x2,0x86,\n  0x1d,0x23,0x88,0x6,0x8,0x20,0x46,0x7c,0x81,0x8,0xd2,0x8c,0x4d,0x1e,0x28,0xe,\n  0x37,0x4,0x20,0x80,0x98,0xc8,0xd1,0xdc,0xd0,0xd0,0x0,0xe7,0x3,0x4,0x10,0x13,\n  0x25,0x9a,0x41,0x0,0x20,0x80,0x98,0xc8,0xd1,0xc,0xa2,0x61,0x61,0x0,0x10,0x40,\n  0x4c,0x94,0x68,0x6,0x1,0x80,0x0,0x62,0x41,0xf,0x6d,0x58,0x0,0x21,0x3,0x5c,\n  0x9a,0x41,0x0,0x20,0x80,0x58,0xd0,0xa2,0x6,0x6c,0x6,0x88,0x9,0xa3,0x61,0x6,\n  0x62,0xd3,0xc,0x2,0x0,0x1,0x4,0x8f,0x46,0xa8,0xf3,0x51,0x34,0x43,0x84,0x21,\n  0x2e,0xc3,0xa6,0x19,0x4,0x0,0x2,0x88,0x5,0x47,0xa2,0x41,0xa1,0x71,0x69,0x6,\n  0x1,0x80,0x0,0x62,0xa4,0x34,0x37,0x2,0x4,0x10,0xc5,0x79,0x1,0x20,0xc0,0x0,\n  0x7e,0xfc,0x56,0x9c,0x4c,0xe5,0xd4,0xef,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,\n  0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-7.png\n  0x0,0x0,0x1,0x54,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xca,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0x31,\n  0xe1,0x52,0xc0,0xc8,0xc8,0x88,0x17,0xc3,0x0,0x40,0x0,0xb1,0xe0,0xd2,0x7c,0xe0,\n  0xc0,0x1,0xac,0x6,0x3b,0x38,0x38,0x30,0x80,0xc2,0xd,0xe6,0x2,0x80,0x0,0x62,\n  0x22,0x55,0x73,0x43,0x43,0x3,0x8a,0xb,0x0,0x2,0x88,0x89,0x34,0x9b,0x19,0xc0,\n  0x6,0x20,0xc7,0x1c,0x40,0x0,0xb1,0x20,0x6b,0x86,0x29,0xc4,0x6,0x40,0x7a,0x40,\n  0x4a,0x60,0x2e,0x0,0xd1,0x20,0x0,0x10,0x40,0x4c,0x8,0x5,0xff,0xa1,0xa6,0x33,\n  0x60,0xc5,0x20,0xcd,0x20,0xd7,0xa1,0xbb,0x0,0x20,0x80,0x30,0x5c,0x0,0x35,0x18,\n  0x3,0x80,0x34,0xc3,0x2,0x10,0x19,0x0,0x4,0x10,0xb,0xb2,0xb,0x40,0x21,0x8b,\n  0xcb,0xb,0xd8,0x34,0x83,0x0,0x40,0x0,0x61,0xb8,0x0,0x17,0xc0,0x95,0xe4,0x1,\n  0x2,0x88,0x85,0x90,0x2,0x42,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,\n  0x82,0x9e,0xb6,0x49,0x5,0x0,0x1,0xc4,0x48,0x69,0x76,0x6,0x8,0x30,0x0,0x3e,\n  0x20,0x57,0x3d,0x6b,0xb0,0x24,0x78,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-11.png\n  0x0,0x0,0x1,0x2c,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa2,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb6,0x1,0x8c,0x8c,\n  0x8c,0x60,0xa7,0x3,0x4,0x10,0x13,0xb2,0x0,0x4c,0x10,0x46,0xe3,0xd3,0xc,0x4,\n  0x8c,0x20,0x36,0x40,0x0,0xc1,0xd,0x80,0x9,0x90,0xa,0x0,0x2,0x88,0x5,0xd9,\n  0x46,0x90,0x21,0xc8,0xa6,0x23,0xbb,0x4,0x59,0xc,0xd9,0x32,0x80,0x0,0x62,0x42,\n  0xd6,0x8c,0xcd,0x8f,0x84,0x0,0x40,0x0,0x81,0x34,0x91,0x1c,0x8f,0xc8,0x96,0x1,\n  0x4,0x10,0x13,0x4c,0x0,0x26,0x88,0xcc,0xc6,0xc5,0x47,0x76,0x25,0x40,0x0,0x61,\n  0xb8,0x0,0x5f,0x60,0xc2,0xfc,0x8f,0xec,0x3d,0x80,0x0,0x2,0x89,0x60,0x4,0xc,\n  0xa1,0xb8,0x47,0xe,0x50,0x80,0x0,0x62,0xa4,0x24,0x29,0x83,0xc,0x0,0x8,0x20,\n  0x46,0x4a,0xf3,0x2,0x40,0x0,0x51,0x9c,0x17,0x0,0x2,0x88,0x62,0x3,0x0,0x2,\n  0x88,0x62,0x3,0x0,0x2,0xc,0x0,0x5c,0x96,0x59,0xd,0x4d,0x49,0x91,0x82,0x0,\n  0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-17.png\n  0x0,0x0,0x1,0x51,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc7,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0xc4,0x82,0x4d,0x90,0x91,\n  0x91,0x11,0xc3,0x59,0x40,0x97,0x32,0x62,0x53,0xb,0x10,0x40,0x2c,0xe8,0x1a,0x1b,\n  0x1a,0x1a,0xb0,0x2a,0x6,0xc9,0x61,0x13,0x7,0x8,0x20,0xb8,0x1,0x8d,0x8d,0x8d,\n  0xff,0x71,0xd9,0x2,0x73,0x1,0x36,0x43,0x0,0x2,0x8,0x24,0xc1,0x0,0xd,0xc8,\n  0xff,0x30,0x36,0x3a,0x6,0xc9,0x1,0x5d,0xf6,0x1f,0x99,0x86,0xc9,0x1,0x4,0x10,\n  0x23,0x2c,0x16,0x70,0x39,0x11,0x5b,0xb8,0x20,0xab,0x3,0x8,0x20,0x46,0x52,0xa2,\n  0x11,0x9b,0x25,0x0,0x1,0xc4,0x48,0x69,0x3a,0x0,0x8,0x20,0x26,0x90,0xa9,0xa0,\n  0x0,0x44,0xa6,0xb1,0x29,0x6c,0x4,0x89,0x83,0xd4,0x20,0xd3,0x40,0x0,0x10,0x40,\n  0x4c,0xa0,0x68,0x3,0x1,0x18,0x8d,0xb,0xd4,0xa3,0xd1,0x30,0x0,0x10,0x40,0x4c,\n  0x84,0x34,0xc2,0x5d,0x80,0x43,0x1c,0x20,0x80,0x88,0x36,0xa0,0x1e,0x87,0x38,0x40,\n  0x0,0x81,0x42,0x94,0xa8,0x64,0xdb,0x88,0x25,0x6c,0xea,0x81,0xea,0x0,0x2,0x88,\n  0xe2,0x58,0x0,0x8,0x20,0x8a,0x73,0x23,0x40,0x80,0x1,0x0,0xaf,0x3c,0x7a,0x77,\n  0xa1,0xed,0xed,0x66,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n  \n    // /work/depthmap/depthmap/images/win/b-7-3.png\n  0x0,0x0,0x1,0xc4,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x3a,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x88,\n  0x1,0xf,0x60,0x6,0x62,0x56,0x20,0xe6,0x82,0x62,0xe,0x28,0xff,0x3f,0x10,0x7f,\n  0x3,0x61,0x80,0x0,0x62,0x22,0x52,0x33,0x3f,0x10,0xb,0x3,0xb1,0x18,0x10,0x8b,\n  0xf4,0x79,0xd9,0x5e,0x7,0xd2,0x3c,0x20,0x3,0x1,0x2,0x88,0x89,0x4,0xcd,0xa2,\n  0x50,0xcd,0x87,0x1a,0x1b,0x1b,0x41,0x6a,0xd8,0x41,0xea,0x0,0x2,0x88,0x89,0x4,\n  0xcd,0xc2,0x40,0xcd,0x1b,0x41,0x9a,0x3f,0x9a,0x3a,0x79,0x40,0xd5,0xfe,0x3,0x8,\n  0x20,0x26,0x22,0x35,0xb,0x2,0x35,0xaf,0x80,0x6a,0xe,0x1,0xf2,0x7f,0x2,0xf1,\n  0xf,0x10,0xd,0x10,0x40,0x4c,0x44,0x6a,0x5e,0xa,0xd5,0x1c,0x9,0xe4,0x7f,0x1,\n  0xe2,0x4f,0x40,0xfc,0x15,0x88,0x7f,0x1,0x4,0x10,0x13,0x9,0x9a,0xa3,0x81,0xfc,\n  0x8f,0x40,0xfc,0x16,0x88,0xdf,0x43,0xd,0xfa,0x1,0x10,0x40,0x4c,0x24,0x68,0x6,\n  0x69,0x7a,0xd,0x35,0xe0,0x23,0x34,0x1a,0x7f,0x3,0x4,0x10,0x13,0x25,0x9a,0x81,\n  0xf8,0x2f,0x40,0x0,0x31,0x41,0x13,0x7,0x28,0x4e,0x5,0xa1,0x6,0xf0,0x13,0xab,\n  0x19,0xe4,0x77,0x80,0x0,0x2,0x19,0xc0,0x6,0xc4,0xdc,0x40,0xcc,0x7,0x32,0x8,\n  0xa8,0x79,0x39,0xb1,0x9a,0x41,0x0,0x20,0x80,0x58,0xa0,0x9,0x2,0xe4,0xa,0x76,\n  0xa0,0xe6,0x35,0x50,0xcd,0x11,0xd0,0x90,0xc6,0xab,0x19,0x4,0x0,0x2,0x88,0x5,\n  0xea,0xa,0x6,0xa0,0xe6,0x1d,0x50,0xcd,0xfe,0x50,0xc5,0x1f,0x8,0x69,0x6,0x1,\n  0x80,0x0,0x62,0x81,0xa,0xfe,0x84,0x6a,0xb6,0x83,0xf2,0xbf,0x42,0x5d,0x80,0x57,\n  0x33,0x8,0x0,0x4,0x10,0xb,0x34,0x45,0x31,0x1,0x35,0x6b,0x2,0x69,0x46,0xa8,\n  0xe2,0x1f,0xb0,0xdc,0x86,0x4f,0x33,0x8,0x0,0x4,0x10,0xb,0x34,0x59,0x82,0xb2,\n  0xe7,0x2f,0x28,0xfd,0x7,0xca,0xfe,0x4d,0x48,0x33,0x8,0x0,0x4,0x18,0x0,0x8e,\n  0x4,0x90,0x75,0xbc,0x65,0x14,0x5c,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-2.png\n  0x0,0x0,0x1,0xe9,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x5f,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x48,\n  0x80,0x81,0x81,0x81,0x1b,0x88,0xf9,0x81,0x58,0x0,0x8a,0x79,0x81,0x98,0x7,0x88,\n  0x39,0x18,0x20,0xe0,0x7,0x10,0x7f,0x5,0xe2,0x77,0x40,0xfc,0x1a,0x4a,0x7f,0x1,\n  0xe2,0xef,0x0,0x1,0xc4,0x2,0xd5,0x2c,0xc,0xc4,0x92,0x40,0x2c,0x3,0xa5,0x41,\n  0x7c,0xc1,0x7e,0x6f,0xbb,0x78,0x90,0x6e,0xa0,0x25,0xb,0x81,0xd4,0x47,0x20,0x7e,\n  0x1,0xc4,0x8f,0x80,0xf8,0x9,0x10,0xbf,0x1,0x19,0x4,0x10,0x40,0x2c,0x50,0xdb,\n  0xc4,0x80,0x58,0x19,0xa8,0x61,0x2a,0x54,0xc3,0x1,0x20,0xdb,0xe1,0xff,0xff,0xff,\n  0x60,0xeb,0x19,0x19,0x19,0xe3,0xa1,0x2e,0x1,0xc9,0x4d,0x6,0x19,0xe,0x35,0x88,\n  0x1d,0x20,0x80,0x40,0x6,0xf0,0x1,0xb1,0x4,0x48,0x33,0x92,0x6,0x7,0x6,0x34,\n  0x80,0x24,0x97,0xb,0x34,0x64,0x1,0xd4,0x62,0x56,0x80,0x0,0x62,0x82,0xfa,0x59,\n  0x9c,0x81,0x34,0xa0,0x0,0xb4,0xb0,0xd,0x48,0xab,0x1,0x4,0x10,0x23,0xd0,0xb4,\n  0x8,0x20,0xc3,0x8,0x88,0x4d,0xd1,0x9c,0xcd,0x80,0x8b,0xd,0x73,0x11,0x88,0xd,\n  0x10,0x40,0x4c,0x48,0x1,0x48,0x34,0x80,0x19,0x6,0x2,0x0,0x1,0x4,0xa,0x94,\n  0x7a,0x90,0x18,0x8,0x3,0xd9,0xfb,0x21,0xf2,0xb8,0x1,0xb2,0x3c,0x88,0xd,0x10,\n  0x40,0x8c,0x50,0x1,0xc,0xe7,0x11,0x3,0x40,0xea,0x1,0x2,0x88,0x9,0xa7,0xd3,\n  0x88,0xd0,0xc,0x74,0xf1,0x6,0x80,0x0,0x62,0x2,0x12,0x9d,0x30,0x9b,0x49,0x35,\n  0x4,0x94,0x2a,0x1,0x2,0x8,0xe4,0x82,0x57,0x40,0x43,0xd6,0x22,0x1b,0x42,0x2,\n  0x78,0x9,0x10,0x40,0x20,0x3,0x9e,0x1,0xf1,0x3d,0x52,0x74,0x41,0x9d,0xbf,0x1c,\n  0xc8,0x7c,0xe,0x10,0x40,0x4c,0xd0,0x24,0x79,0xb,0x28,0x30,0x83,0x44,0x57,0x3c,\n  0x4,0xe5,0xd,0x80,0x0,0x62,0x82,0x66,0x90,0xbb,0x40,0x7c,0x5,0x68,0xc8,0x2c,\n  0x42,0x86,0x40,0x6d,0x9f,0x5,0x64,0x3e,0x0,0x79,0x1f,0x20,0x80,0x98,0xa0,0xb9,\n  0xc,0xe4,0x8d,0x5b,0x40,0x7c,0x1e,0x28,0xd9,0x4f,0x84,0x4b,0xae,0x43,0x5d,0xf0,\n  0x6,0x20,0xc0,0x0,0x52,0xe3,0xa2,0xc4,0x8a,0x6d,0xfc,0x1,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-8.png\n  0x0,0x0,0x1,0x2d,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa3,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x84,0xd7,0x80,0x46,0x46,\n  0x46,0x82,0xce,0x3,0x8,0x20,0x26,0x64,0xc5,0xc8,0x1a,0x60,0x6c,0x74,0x31,0x74,\n  0x43,0x1,0x2,0x8,0xa7,0xb,0xea,0xff,0xff,0x67,0x44,0xa6,0x71,0x1,0x80,0x0,\n  0x62,0x0,0x5,0x22,0x32,0x6e,0x60,0x0,0x51,0xf8,0xd9,0xc8,0x18,0x20,0x80,0x18,\n  0xb0,0x9,0xc2,0x14,0xa3,0xd3,0xd8,0x30,0x40,0x0,0x31,0xe0,0xb3,0x81,0x18,0x31,\n  0x80,0x0,0x62,0x4,0x11,0xb8,0x42,0x1b,0xe4,0x7f,0x7c,0x72,0x20,0x1a,0x20,0x80,\n  0x28,0x76,0x1,0x40,0x0,0x51,0x1c,0x6,0x0,0x1,0x44,0x71,0x2c,0x0,0x4,0x10,\n  0xb,0x7a,0xc2,0xc1,0x15,0xef,0xc8,0xe1,0x81,0xac,0x6,0x20,0x80,0x98,0x8,0x25,\n  0x63,0x42,0xc9,0x19,0x20,0x80,0x18,0x70,0xf9,0x8d,0x90,0xdf,0x61,0x18,0x20,0x80,\n  0x18,0x29,0xcd,0xce,0x0,0x1,0x6,0x0,0x13,0xc1,0x60,0x7a,0x5b,0x22,0x14,0x67,\n  0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-13.png\n  0x0,0x0,0x1,0x52,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0x31,\n  0x31,0x50,0x8,0x0,0x2,0x88,0x5,0x97,0x4,0x23,0x23,0x23,0xa,0x1f,0x57,0x58,\n  0x1,0x4,0x10,0xb,0x2e,0x8d,0xd,0xd,0xd,0x58,0xc5,0xd1,0xd,0x2,0x8,0x20,\n  0x26,0x74,0x45,0x20,0x5,0x30,0xcd,0x20,0x1a,0x99,0xd,0x92,0x43,0x77,0x19,0x40,\n  0x0,0x31,0xa1,0x6b,0x3e,0x78,0xf0,0x20,0x86,0xb,0x60,0x6c,0x90,0x1c,0xba,0x21,\n  0x0,0x1,0x84,0x33,0x10,0xf,0x1c,0x38,0xc0,0x40,0x4c,0x1a,0x1,0x8,0x20,0x26,\n  0xe4,0x40,0x2,0x99,0x6c,0x6f,0x6f,0xf,0x37,0x0,0xdd,0x35,0x20,0x39,0x98,0x4b,\n  0x61,0x0,0x20,0x80,0x98,0xd0,0x43,0x1a,0xa4,0x0,0xa6,0x1,0x64,0x8,0x72,0x18,\n  0xa0,0x6b,0x6,0x1,0x80,0x0,0xc2,0x88,0x5,0x98,0x2,0x62,0xa3,0x11,0x20,0x80,\n  0x70,0xa6,0x3,0x62,0xf3,0x8,0x40,0x0,0x51,0x9c,0x12,0x1,0x2,0x88,0x5,0x3d,\n  0x6d,0x93,0xa,0x0,0x2,0x88,0x91,0xd2,0xec,0xc,0x10,0x60,0x0,0x9c,0x22,0x58,\n  0x27,0x89,0xcf,0x42,0x16,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-4-7.png\n  0x0,0x0,0x1,0x65,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xdb,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x8,0xc8,0xff,0x87,0x62,0x9c,0x0,0x20,0x80,0xf0,\n  0x19,0xf0,0xff,0xe0,0xc1,0x83,0xc,0x20,0xdc,0xd8,0xd8,0x88,0xd3,0x10,0x80,0x0,\n  0x62,0xc2,0xa7,0x19,0x6,0x1c,0x1c,0x1c,0x70,0x1a,0x2,0x10,0x40,0x2c,0xb8,0x4c,\n  0x3e,0x70,0xe0,0x0,0x51,0x61,0x0,0x10,0x40,0x8c,0xc8,0x81,0x8,0xb3,0xa5,0xbe,\n  0xbe,0x9e,0x1,0xd9,0x5,0xc8,0x6,0x2,0xe5,0x18,0x91,0xc5,0x1,0x2,0x8,0x6c,\n  0x0,0x4c,0x23,0xc8,0xa9,0xf6,0xf6,0xf6,0x18,0x9a,0xb1,0xb9,0xa,0x66,0x10,0x40,\n  0x0,0x81,0xbc,0xf0,0x1f,0xa4,0x91,0x58,0x80,0xa4,0x16,0x64,0x29,0x23,0x40,0x0,\n  0x31,0x31,0x50,0x8,0x0,0x2,0x8,0x64,0x0,0x23,0xc8,0xd9,0xa4,0x0,0xa8,0x7a,\n  0xb0,0x17,0x0,0x2,0x8,0x39,0x10,0x51,0xa2,0x9,0x3d,0x1c,0xd0,0x2c,0x81,0x7,\n  0x24,0x40,0x0,0x31,0x80,0xc,0xc0,0x82,0x31,0x40,0x43,0x43,0xc3,0x7f,0x6c,0x6a,\n  0x1,0x2,0x8,0x67,0x3a,0xc0,0x15,0x13,0xe8,0x0,0x20,0x80,0x70,0x5,0x22,0x4a,\n  0xb8,0x80,0xa2,0xf,0x3d,0xfe,0x61,0x0,0x20,0x80,0x18,0x9,0xe4,0xc6,0xff,0x18,\n  0x7e,0x46,0x3,0x0,0x1,0xc4,0x42,0x28,0xa5,0x12,0xf2,0x2,0x40,0x80,0x1,0x0,\n  0x52,0xe3,0x7a,0xe4,0xee,0x8e,0x19,0xe1,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,\n  0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-2-6.png\n  0x0,0x0,0x1,0x53,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc9,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0xb0,0x9,0x32,0x32,0x32,0xc2,0x4d,0x5,0x5a,0xc0,\n  0x88,0xcf,0x0,0x80,0x0,0x62,0xc1,0xa6,0x19,0x59,0x13,0x3a,0x1f,0x1d,0x0,0x4,\n  0x10,0x13,0x3e,0xd3,0x91,0x5d,0x82,0xb,0x0,0x4,0x10,0x13,0x3e,0xcd,0xd,0xd,\n  0xd,0x4,0xd,0x2,0x8,0x20,0x90,0x1f,0x51,0x30,0xc8,0xdb,0x20,0xc,0xd4,0xc,\n  0x72,0xfa,0x7f,0x48,0x30,0x40,0x68,0x28,0x1b,0x45,0x3d,0x40,0x0,0x61,0x35,0x0,\n  0xa6,0x19,0x44,0xa3,0x1b,0x86,0x6e,0x10,0x40,0x0,0xe1,0xd5,0x8c,0xec,0x2,0x5c,\n  0x86,0x0,0x4,0x10,0x31,0x9a,0x19,0x70,0x19,0x2,0x62,0x2,0x4,0x10,0x4e,0xcd,\n  0xb8,0x5c,0x0,0xf3,0x16,0xcc,0x0,0x80,0x0,0x62,0xc0,0x66,0x3,0x3e,0x1a,0xdd,\n  0xb,0x0,0x1,0x84,0xe2,0x5,0x62,0x34,0x23,0xc7,0x14,0x88,0xd,0x10,0x40,0x18,\n  0x81,0x48,0x48,0x33,0xba,0x1,0x0,0x1,0x84,0x35,0x1a,0xf1,0x69,0x46,0x37,0x0,\n  0x20,0x80,0x30,0xc,0x40,0x37,0x4,0x6b,0xe2,0x41,0x32,0x0,0x20,0x80,0x58,0x70,\n  0xa4,0x4e,0x46,0x58,0xf2,0xc5,0x95,0x91,0x60,0xe2,0x0,0x1,0x6,0x0,0x7c,0x5b,\n  0xb5,0x34,0x9c,0xc8,0x30,0x39,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-12.png\n  0x0,0x0,0x1,0xb,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x81,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0xb1,0x1,0x0,0x1,0xc4,0x82,0xc2,0x63,0x64,0x44,0xd,0x90,0xff,0xff,0x19,\n  0xf1,0x8a,0x3,0x1,0x40,0x0,0xb1,0x60,0x18,0x89,0x24,0x9,0xd6,0x8,0xe3,0x23,\n  0x8b,0x23,0x1,0x80,0x0,0xa2,0xd8,0xb,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0xc4,\n  0x42,0xb4,0x4a,0xe4,0x70,0x40,0xf2,0xe,0x40,0x0,0x11,0x6f,0x0,0x8e,0x30,0x0,\n  0x8,0x20,0x8a,0xbd,0x0,0x10,0x40,0x14,0x1b,0x0,0x10,0x40,0x2c,0xc4,0xfa,0x15,\n  0x97,0x38,0x40,0x0,0x31,0x52,0x9a,0x99,0x0,0x2,0x88,0x62,0x2f,0x0,0x4,0x10,\n  0xc5,0x6,0x0,0x4,0x18,0x0,0xaf,0x42,0x1e,0x20,0xd5,0x8a,0xd2,0xa2,0x0,0x0,\n  0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-21.png\n  0x0,0x0,0x1,0x3a,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xb0,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x41,0x12,0x20,0x5a,0x33,0xd0,0x42,0x38,0x1b,0x20,\n  0x80,0x98,0xd0,0x25,0xf,0x1e,0x3c,0x48,0x90,0x8d,0xc,0x0,0x2,0x88,0x9,0xdd,\n  0x64,0x7,0x7b,0x7,0xb0,0x62,0x8,0xdb,0x1e,0x89,0xed,0x80,0xd5,0x10,0x80,0x0,\n  0x62,0x0,0x5,0x62,0x43,0x43,0xc3,0x7f,0x18,0x20,0x81,0xd,0xd6,0xb,0x10,0x40,\n  0x18,0x5e,0x70,0x70,0x70,0x20,0xc8,0x46,0x6,0x0,0x1,0x84,0xe1,0x5,0x7b,0x24,\n  0x2f,0xd8,0x3b,0x20,0xb1,0x71,0x78,0x1,0x20,0x80,0x28,0xf6,0x2,0x40,0x0,0x51,\n  0xec,0x5,0x80,0x0,0x22,0x3e,0x16,0x1c,0xec,0xb1,0x7a,0x1,0x20,0x80,0x28,0xf6,\n  0x2,0x40,0x0,0x61,0x18,0x40,0xc,0x40,0x36,0x0,0x20,0x80,0x60,0x49,0xf9,0x11,\n  0x72,0xf2,0x24,0x5,0x0,0x4,0x10,0x23,0xa5,0xb9,0x11,0x20,0x80,0x98,0x18,0x28,\n  0x4,0x0,0x1,0x6,0x0,0xe1,0xa2,0x1d,0x3c,0x1d,0x74,0xd5,0x4b,0x0,0x0,0x0,\n  0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-13.png\n  0x0,0x0,0x1,0x66,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xdc,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x60,0x8c,0xc6,0xc6,0x46,0xc,0x93,0xea,0xeb,0xeb,\n  0x19,0x9,0x19,0x0,0x10,0x40,0x2c,0xa8,0x1a,0x1a,0x18,0x10,0x6,0x36,0x10,0xe5,\n  0x2,0x80,0x0,0x62,0xc2,0x26,0x8,0xd2,0x4c,0x8c,0xed,0x20,0x0,0x10,0x40,0x4c,\n  0xc4,0x28,0x2,0x79,0xf,0x9b,0x17,0x41,0x0,0x20,0x80,0x98,0xf0,0xd9,0xe,0xd3,\n  0x88,0xec,0x35,0x74,0x0,0x10,0x40,0x2c,0xb8,0x6c,0x44,0xf,0x13,0x64,0x39,0x64,\n  0xef,0x1,0x4,0x10,0x56,0x3,0xf0,0xd9,0xd8,0xd0,0x0,0x96,0x83,0x1b,0x2,0x10,\n  0x40,0xc,0xa0,0x74,0x0,0xc2,0x40,0x9,0x90,0xad,0x44,0x63,0x90,0x7a,0x90,0x3e,\n  0x80,0x0,0x42,0x71,0x1,0x28,0x4d,0x21,0x47,0x1f,0x7a,0xb4,0x82,0x6c,0x5,0x2,\n  0x90,0x66,0x78,0x38,0x1,0x4,0x10,0x13,0x2e,0xe7,0x83,0x14,0x80,0x34,0xa1,0xa7,\n  0x7,0x64,0xcd,0x20,0x0,0x10,0x40,0x28,0x5e,0x80,0x32,0xc1,0x18,0xe6,0x44,0x98,\n  0x1c,0x32,0x1f,0x19,0x3,0x4,0x10,0x3,0xa6,0x22,0xec,0x86,0xe0,0xc2,0x0,0x1,\n  0x84,0x21,0x40,0xaa,0x21,0x0,0x1,0x44,0x30,0x25,0x82,0xc2,0x4,0x57,0x2a,0x4,\n  0x1,0x80,0x0,0x62,0xc1,0x96,0x3,0x1b,0x1b,0x19,0x88,0xce,0xe3,0x0,0x1,0x6,\n  0x0,0x15,0xcc,0xe9,0x89,0xb0,0x32,0x8,0xa9,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,\n  0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-1.png\n  0x0,0x0,0x1,0x50,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc6,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x88,0x51,0xc4,0xc8,0xd8,0x88,0xd5,0x96,0xff,0xff,\n  0xeb,0x19,0x1,0x2,0x88,0x89,0x81,0x42,0x0,0x10,0x40,0x14,0x1b,0x0,0x10,0x40,\n  0x2c,0x98,0xce,0x65,0x24,0x10,0x28,0xd,0x28,0x3c,0x80,0x0,0x62,0xc1,0xf4,0xd7,\n  0x7f,0x46,0x90,0x21,0xd8,0x2,0x17,0x28,0x8e,0x21,0x6,0x10,0x40,0x58,0xbd,0xd0,\n  0xd0,0xd0,0x80,0x55,0x31,0x36,0x0,0x10,0x40,0x4c,0x30,0x67,0x37,0x36,0x42,0x42,\n  0x1a,0x44,0x83,0xc,0x20,0x36,0x7a,0x1,0x2,0x8,0xac,0x10,0xa8,0xe1,0x3f,0xc4,\n  0xf5,0xff,0xa1,0x42,0xd8,0x1,0x4c,0xd,0x32,0x6,0x8,0x20,0x4,0x3,0x28,0x9,\n  0x32,0x8,0x9b,0x21,0x30,0x3e,0x36,0x3,0x0,0x2,0x8,0xce,0x40,0x76,0x5,0xb2,\n  0x21,0x30,0x83,0x41,0x34,0x36,0x3,0x0,0x2,0x8,0x95,0x83,0xe4,0xa,0x5c,0x7c,\n  0x74,0x3,0x0,0x2,0x8,0x85,0x83,0xee,0xa,0x62,0x30,0x40,0x0,0x61,0xa,0xa0,\n  0xd9,0x4a,0x8,0x3,0x4,0x10,0x23,0x7a,0x74,0xc1,0x52,0x22,0x28,0x41,0x11,0x13,\n  0x8b,0x0,0x1,0xc4,0x48,0x69,0x76,0x6,0x8,0x30,0x0,0xd9,0x7f,0x29,0xad,0xbe,\n  0x7b,0x1c,0x8d,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-6.png\n  0x0,0x0,0x1,0xff,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x75,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0xc8,\n  0x96,0x81,0x81,0x41,0x16,0x88,0x85,0x81,0x98,0x3,0x88,0x7f,0x3,0xf1,0x47,0x20,\n  0x7e,0xb,0xc4,0x9f,0x19,0x20,0x80,0x17,0x2a,0xcf,0xf,0xc4,0xac,0x40,0xfc,0x3,\n  0x2a,0xff,0x18,0x20,0x80,0x18,0x80,0x6,0x44,0x1,0x19,0xff,0xb1,0x61,0xa0,0x5c,\n  0x22,0x8,0xe3,0x91,0x8f,0x2,0x8,0x20,0x26,0xa8,0xc9,0xc,0xff,0xff,0xff,0x87,\n  0x63,0x10,0x0,0x4a,0xb6,0x3,0x29,0x1,0x10,0x86,0xb2,0x31,0xd4,0x80,0xf4,0x2,\n  0x4,0x10,0x13,0xd4,0xd9,0x70,0xc0,0xc8,0xc8,0x8,0xd2,0xbc,0x19,0xea,0x54,0x38,\n  0x6,0x89,0x81,0xe4,0xd0,0x0,0x7,0x40,0x0,0x31,0x41,0xfd,0xc,0xd7,0xc,0x32,\n  0xbd,0xdf,0xdb,0xce,0x17,0xea,0x4c,0x18,0xf8,0xf,0x12,0x3,0xc9,0xa1,0x19,0xf2,\n  0x1b,0x20,0x80,0x98,0xa0,0x1,0x6,0xb7,0x19,0xc9,0x90,0x52,0x68,0x60,0xfd,0x0,\n  0xb1,0x61,0x9a,0xd1,0x5c,0xf2,0x11,0x20,0x80,0x98,0xa0,0xa1,0x9,0xf3,0xf3,0x4d,\n  0x20,0xdd,0xd,0x55,0x98,0x1,0xe4,0x7f,0x0,0x61,0x10,0x1b,0x2a,0xd6,0xd,0x55,\n  0xd3,0xe,0x35,0xe0,0x2d,0x40,0x0,0x31,0x2,0x39,0x8e,0x40,0x86,0x2,0x34,0xc0,\n  0x58,0xa1,0x12,0x3f,0xa0,0x9a,0xbf,0x43,0xf9,0x9c,0x50,0x79,0x58,0x78,0xfd,0x86,\n  0xca,0x3f,0x0,0x8,0x20,0x26,0x6,0xa,0x1,0x40,0x0,0x81,0xc,0xe0,0x5,0xfa,\n  0x71,0x1e,0x90,0x16,0x85,0x62,0x11,0x20,0x7f,0x22,0xd4,0x56,0x38,0x86,0x8a,0x89,\n  0xc0,0xd4,0x41,0xf5,0xf0,0x2,0x4,0x10,0x3,0x72,0x42,0x1,0xb2,0x37,0x41,0xa2,\n  0xfb,0x3f,0x8c,0x9f,0x7,0xc2,0x68,0x62,0x9b,0x90,0x13,0x1a,0x40,0x0,0xb1,0x40,\n  0x93,0x27,0x3,0x34,0x94,0x7d,0x91,0x42,0xbb,0x1b,0xe6,0x67,0x68,0xc0,0x96,0xa2,\n  0xab,0x1,0xe9,0x5,0x8,0x20,0x26,0xa4,0x80,0x63,0x40,0x8e,0x2a,0x50,0xcc,0x22,\n  0xa7,0x2f,0xe4,0x28,0x46,0x2,0xac,0x0,0x1,0xc4,0x4,0xd,0x71,0x6,0x64,0x43,\n  0xa0,0x9,0xe9,0x37,0x32,0x86,0x25,0x24,0x34,0xf0,0x3,0x20,0x80,0xe0,0xe9,0x0,\n  0x64,0x3a,0xc,0x83,0x0,0x50,0x43,0x25,0x2c,0x1d,0x40,0xd9,0x18,0x6a,0x40,0x7a,\n  0x1,0x2,0x88,0x91,0xd2,0xec,0xc,0x10,0x60,0x0,0x7c,0xc2,0xd7,0x8f,0x1b,0xcb,\n  0x90,0x1c,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-21.png\n  0x0,0x0,0x1,0x4c,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc2,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xd8,0x0,0x46,0xc6,\n  0xff,0x60,0x8c,0x43,0xc,0x20,0x80,0x18,0xa0,0x5e,0xf8,0x8f,0xd,0x83,0xe4,0x1a,\n  0x40,0x34,0xc,0x3,0x49,0x18,0xbb,0x1,0xca,0x7,0x8,0x20,0xb8,0x1,0x38,0x0,\n  0x3,0x86,0x21,0x48,0x9a,0x41,0x18,0x20,0x80,0x18,0xc1,0x4,0x23,0xe3,0x7f,0x28,\n  0x8d,0xe1,0x3,0xa0,0x38,0x23,0xdc,0xd9,0x8,0x41,0xb8,0x42,0x80,0x0,0x62,0x42,\n  0x53,0x8c,0x8e,0x51,0x34,0x37,0x22,0x87,0x1,0x14,0x0,0x4,0x10,0x8a,0x17,0xb0,\n  0x85,0x1,0xba,0xb3,0xd1,0xc3,0x4,0x20,0x80,0x50,0xbc,0x80,0x2d,0xe,0x1a,0xa1,\n  0xb6,0xd5,0x23,0x39,0x1b,0x59,0xc,0x20,0x80,0x88,0xf,0x3,0x1c,0x0,0x20,0x80,\n  0x58,0xd0,0xc3,0x0,0xb,0x80,0x9,0x62,0x35,0x8,0x20,0x80,0x58,0x50,0xd3,0x7,\n  0x6e,0xcb,0x40,0x4e,0x4,0xc9,0xa3,0xbb,0x8,0x20,0x80,0x88,0x71,0x1,0x5e,0x0,\n  0x10,0x40,0xa4,0xb8,0x0,0xab,0x38,0x40,0x0,0x51,0xec,0x2,0x80,0x0,0x62,0x21,\n  0xc6,0x76,0x7c,0x0,0x20,0xc0,0x0,0x49,0x70,0xbc,0x23,0x76,0xb0,0x1c,0xf2,0x0,\n  0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-22.png\n  0x0,0x0,0x1,0x53,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc9,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x41,0x12,0x60,0x38,0x78,0xf0,0x20,0x8a,0x22,0x7b,\n  0x7b,0x7b,0xac,0x62,0x40,0xb,0xe1,0x7c,0x80,0x0,0x62,0x42,0x96,0x3c,0x70,0xe0,\n  0x0,0x83,0x83,0xbd,0x3,0x18,0x23,0x8b,0xd9,0x3b,0x38,0x80,0x31,0x36,0x0,0x10,\n  0x40,0x4c,0xc,0x14,0x2,0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0x62,0x41,0x17,0x68,\n  0x68,0x6c,0x80,0x38,0x1d,0x8,0x41,0xfe,0x5,0x7,0x72,0x3,0x44,0xc,0x9b,0x27,\n  0x0,0x2,0x88,0x5,0x2d,0x64,0xb1,0x85,0x36,0x5e,0x17,0x0,0x4,0x10,0x8a,0x1,\n  0xc4,0xc6,0x2,0x32,0x0,0x8,0x20,0x8c,0x58,0xb0,0x7,0xc6,0x80,0x3d,0x5a,0x2c,\n  0x38,0x0,0x35,0x39,0xa0,0x69,0x84,0x1,0x80,0x0,0xa2,0x38,0x10,0x1,0x2,0x88,\n  0x62,0x3,0x0,0x2,0x8,0x23,0x16,0x1a,0xa1,0xb1,0xc0,0x80,0x14,0xb,0xd,0xd0,\n  0x94,0x77,0x0,0x4b,0x18,0x0,0x4,0x10,0x23,0x28,0x33,0x51,0x92,0x17,0x0,0x2,\n  0x88,0x91,0xd2,0xdc,0x8,0x10,0x40,0x14,0x87,0x1,0x40,0x80,0x1,0x0,0xdc,0x8e,\n  0x3d,0x8c,0xd1,0xdd,0x44,0x10,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-10.png\n  0x0,0x0,0x1,0x23,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x99,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0xf0,0xc8,0x11,0x65,0x32,0x40,0x0,0x61,0x35,0xa0,\n  0xb1,0xb1,0xf1,0x3f,0xb1,0x86,0x0,0x4,0x10,0x3e,0x17,0x80,0xc,0x22,0x68,0x8,\n  0x40,0x0,0xe1,0x35,0xa0,0xbe,0xbe,0x9e,0x91,0x90,0x21,0x0,0x1,0xc4,0x44,0xc8,\n  0x89,0x84,0xc,0x1,0x8,0x20,0x26,0x62,0x2,0xa,0x9f,0x21,0x0,0x1,0xc4,0x44,\n  0x6c,0x74,0xe1,0x32,0x4,0x20,0x80,0x98,0x48,0x89,0x73,0xa0,0x21,0xb0,0x80,0x85,\n  0x3,0x80,0x0,0x22,0xc5,0x80,0xff,0x20,0xcd,0x20,0x97,0x20,0xb,0x2,0x4,0x10,\n  0x13,0x25,0x9a,0x41,0x0,0x20,0x80,0x98,0x28,0xd1,0xc,0x2,0x0,0x1,0xc4,0x44,\n  0x89,0x66,0x10,0x0,0x8,0x20,0x82,0x29,0x11,0x9f,0x66,0x10,0x0,0x8,0x20,0x26,\n  0x4a,0x34,0x83,0x0,0x40,0x0,0x31,0x52,0x9a,0x9d,0x1,0x2,0xc,0x0,0x79,0xd1,\n  0x36,0x1d,0x65,0xc3,0x44,0xcf,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-4.png\n  0x0,0x0,0x0,0xfe,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x74,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x41,0x12,0x20,0x5a,0x33,0xd0,0x42,0x38,0x1b,0x20,\n  0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,0x1,0x0,\n  0x1,0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0x44,\n  0xb1,0x1,0x0,0x1,0xc4,0x82,0x2d,0x79,0x92,0x2,0x0,0x2,0x88,0x91,0xd2,0xdc,\n  0x8,0x10,0x40,0x14,0x7b,0x1,0x20,0xc0,0x0,0x29,0xb,0xe,0xa2,0xb,0xb2,0x5d,\n  0x4f,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-5.png\n  0x0,0x0,0x1,0x2f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0xb1,0x1,0x0,0x1,0xc4,0xc8,0xd0,0xc0,0x80,0x11,0x8,0xff,0xeb,0xff,0x33,\n  0xe2,0xd5,0xd4,0xc8,0xf8,0x1f,0xa6,0x6,0x20,0x80,0x18,0x40,0x81,0x8,0xe,0xc8,\n  0x6,0x10,0xf5,0x9f,0x81,0x18,0x8c,0xac,0x16,0x20,0x80,0x98,0x70,0xd9,0x0,0xc2,\n  0xd8,0xf8,0xe8,0x34,0x40,0x0,0x61,0x98,0x8a,0x6c,0x3a,0xd8,0x7b,0x48,0xfc,0x86,\n  0x86,0x6,0xc,0x35,0x0,0x1,0xc4,0x82,0xcb,0x5,0xc8,0x61,0x81,0xce,0x47,0x6,\n  0x0,0x1,0x84,0xd5,0x0,0x98,0xc2,0xc6,0xc6,0x46,0xc,0x83,0xd0,0xd,0x1,0x8,\n  0x20,0x16,0x6c,0x9a,0x9,0xb9,0xa0,0x1,0x8,0x61,0x86,0x1,0x4,0x10,0x23,0xa5,\n  0x49,0x19,0x20,0x80,0x28,0x4e,0x48,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,\n  0x1,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0x6,0x0,0x9e,0x55,0x8e,0xcf,0x93,0x4a,\n  0xe6,0x76,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-18.png\n  0x0,0x0,0x1,0x65,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xdb,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0x94,0x1,0x8d,0x8d,0x8d,0xf,0x41,0x18,0x9b,0x1c,0x40,0x0,0x11,0xed,0x82,\n  0x86,0xfa,0x7a,0x39,0x6c,0x86,0x0,0x4,0x10,0xb,0xb2,0x2d,0xc4,0x18,0x2,0x54,\n  0xf8,0xb0,0xbe,0xbe,0x5e,0x1e,0x26,0x6,0x10,0x40,0xc,0xd0,0x58,0x78,0xd8,0xd0,\n  0xd0,0xf0,0x10,0xcc,0x21,0x2,0x83,0xd4,0xc2,0xb8,0x0,0x1,0x4,0x33,0x0,0x24,\n  0xf8,0x9f,0x58,0x3,0xa0,0x86,0x1c,0x7,0x31,0x1,0x2,0x8,0xc5,0x0,0x62,0xd,\n  0x41,0x76,0x1,0x40,0x0,0xb1,0x20,0xfb,0xb1,0xbe,0xbe,0x1,0x18,0x18,0x38,0xfd,\n  0xf,0xa1,0x1b,0x1b,0x1f,0x21,0x8b,0x3,0x4,0x10,0xdc,0x5,0x20,0x3,0x91,0x69,\n  0x64,0xc,0x73,0x19,0xb2,0xcd,0x30,0xc,0x10,0x40,0xb0,0x68,0x4,0x9b,0xa,0x54,\n  0x0,0x35,0x14,0x81,0x61,0xf2,0x20,0x9b,0x51,0x42,0x1f,0xa,0x0,0x2,0x8,0x6e,\n  0x12,0x28,0x26,0xa0,0xb6,0x3f,0x84,0xb1,0x51,0xf9,0xd8,0x83,0x4,0x20,0x80,0x18,\n  0x91,0x33,0x13,0x23,0x23,0x23,0x48,0xa1,0x3c,0x88,0x46,0xb2,0x40,0x1e,0x5f,0xda,\n  0x0,0x8,0x20,0x46,0x4a,0x73,0x23,0x40,0x0,0x51,0x9c,0x99,0x0,0x2,0xc,0x0,\n  0xb7,0xe6,0x1,0xde,0x26,0xa6,0x19,0x96,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,\n  0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-22.png\n  0x0,0x0,0x1,0xa5,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x1b,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0xc0,0x24,0x23,0xe3,0x7f,0x30,0x26,0x3,0x0,0x4,\n  0x10,0x53,0x23,0x99,0x1a,0x61,0x0,0x20,0x80,0xc0,0x2e,0x68,0x4,0x11,0xff,0xff,\n  0x33,0xc2,0x4,0x19,0x81,0x86,0x12,0x8b,0x1,0x2,0x88,0x11,0x12,0x6,0x30,0x57,\n  0x40,0xc,0x1,0x49,0x10,0x13,0x36,0x40,0x75,0xc,0x0,0x1,0xc4,0xd4,0xd8,0x88,\n  0xd7,0xb,0x8c,0x30,0xc,0x52,0x8c,0x8c,0x61,0x0,0x20,0x80,0x20,0x5e,0x68,0x44,\n  0xd8,0x8e,0xa6,0x19,0x44,0xfc,0x87,0xf8,0xf0,0x3f,0xd8,0xb5,0x30,0xc,0x3,0x0,\n  0x1,0x4,0x16,0x64,0x84,0x7a,0xe1,0x3f,0xa6,0x21,0x8,0x3,0x60,0x6,0x42,0x3,\n  0x1d,0xac,0xf,0xe8,0x12,0x80,0x0,0x62,0x62,0xc4,0xe2,0x5,0x46,0x88,0x73,0xfe,\n  0xc3,0x34,0xa3,0xb9,0x4,0xc5,0x5,0x0,0x1,0xc4,0xc2,0x0,0x8d,0x86,0xff,0xf5,\n  0xd0,0x0,0x6c,0x6c,0x44,0x35,0xb0,0xbe,0x1e,0x42,0x83,0xfc,0x9,0x64,0xc3,0xfc,\n  0xf,0x33,0x4,0x20,0x80,0x20,0xc,0xa8,0xb1,0xc8,0x7e,0x4,0x8b,0x37,0x34,0x40,\n  0x18,0x40,0x1a,0xa1,0x4,0x1,0x40,0xe6,0x0,0x4,0x10,0x13,0x86,0x8d,0xe8,0x0,\n  0x68,0xf3,0xff,0xfa,0x7a,0x46,0x68,0xbc,0x63,0xc4,0x2,0x40,0x0,0x31,0x82,0x6d,\n  0x1,0x19,0x5,0x54,0x84,0x9c,0x90,0xfe,0xff,0x47,0x9,0xd0,0xff,0xb8,0xd2,0x1,\n  0x40,0x0,0x41,0x62,0x81,0x11,0x16,0x40,0xc,0x28,0x9,0x9,0xd9,0x26,0x74,0x0,\n  0x93,0x7,0x8,0x20,0x26,0x46,0x46,0xdc,0x5e,0x40,0xf,0x13,0x6c,0xe9,0x0,0x20,\n  0x80,0x98,0xa0,0x1e,0x85,0xdb,0x8e,0xe2,0x3c,0x2,0x18,0x4,0x0,0x2,0xc,0x0,\n  0x8f,0xd,0xb5,0x9a,0xb7,0xe,0x8,0xc,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,\n  0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-4.png\n  0x0,0x0,0x1,0x42,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xb8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x90,0x39,0x8c,0x8c,0x8c,0x70,0xd3,0x80,0x6,0x33,\n  0x12,0x63,0x0,0x40,0x0,0x31,0x21,0x6b,0xfe,0xcf,0x80,0x80,0xc8,0x86,0xe1,0x3,\n  0x0,0x1,0xc4,0xc4,0x40,0x21,0x0,0x8,0x20,0x26,0x64,0x27,0x33,0x32,0x30,0x32,\n  0x34,0x2,0x21,0x88,0x46,0xf3,0xc2,0x7f,0x24,0x8c,0xc2,0x7,0x8,0x20,0x14,0x2f,\n  0x34,0x30,0x34,0x80,0xd9,0x20,0x1a,0xe6,0x85,0xc6,0xc6,0x46,0x18,0xcd,0x80,0x8d,\n  0xf,0x10,0x40,0x4c,0xe8,0x81,0x47,0x2a,0x0,0x8,0x20,0x26,0x70,0xe0,0x11,0x19,\n  0xe2,0xd8,0x0,0x40,0x0,0xb1,0x20,0x6b,0x86,0x79,0x81,0x14,0x0,0x10,0x40,0x4c,\n  0xe8,0xf1,0x8e,0x4e,0x13,0x2,0x0,0x1,0x44,0x71,0x34,0x2,0x4,0x10,0x13,0xb6,\n  0x54,0x48,0x4a,0xc0,0x2,0x4,0x10,0xc5,0xb1,0x0,0x10,0x40,0x2c,0xd8,0xfc,0x4b,\n  0x4a,0xac,0x0,0x4,0x10,0xd1,0x61,0x50,0x5f,0x5f,0x8f,0x95,0xf,0x10,0x40,0x44,\n  0x19,0x0,0x4a,0x75,0xd0,0x94,0xc7,0x88,0xce,0x7,0x8,0x30,0x0,0xdd,0xb0,0x4c,\n  0x2f,0xee,0x5b,0x2d,0x60,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-2-3.png\n  0x0,0x0,0x1,0x5f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xd5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0xd0,0x5,0x18,0x19,0x19,0xff,0x83,0x30,0xb1,0x6,\n  0x0,0x4,0x10,0x13,0xba,0x66,0x20,0x0,0x11,0x8c,0xc4,0x1a,0x2,0x10,0x40,0x4c,\n  0xd8,0x4,0x49,0x71,0x1,0x40,0x0,0x61,0xf5,0x2,0x2c,0x5c,0x40,0xec,0xc6,0xc6,\n  0x46,0xbc,0x86,0x1,0x4,0x10,0x3,0x48,0x31,0xc,0x3,0xc1,0x7f,0x18,0x0,0xb1,\n  0x1b,0x1a,0x1a,0xc0,0x34,0x54,0x9c,0x1,0x1b,0x6,0x8,0x20,0xac,0x9a,0x61,0x6,\n  0x20,0x98,0x10,0xc3,0xb0,0x19,0x0,0x10,0x40,0x8c,0x60,0x2,0xc9,0xd9,0xd8,0x83,\n  0x84,0x11,0x66,0x3,0x23,0xba,0x24,0x40,0x0,0x31,0xc1,0x24,0x80,0x0,0xa7,0x66,\n  0xa0,0xed,0x38,0x83,0x0,0x20,0x80,0x98,0x90,0xc2,0x2,0xdd,0x10,0x46,0x58,0xb4,\n  0xe2,0xb,0x43,0x80,0x0,0xc2,0xc,0x14,0x68,0x80,0xa1,0x7,0x1c,0xd0,0x11,0x60,\n  0x26,0x2a,0xfd,0x9f,0x1,0x20,0x80,0xb0,0x87,0x2c,0xd6,0x50,0x47,0xe5,0xc2,0xc,\n  0x0,0x8,0x20,0x26,0x1c,0xae,0xc2,0x70,0x76,0x63,0x23,0x76,0x1f,0x0,0x4,0x10,\n  0x13,0xb1,0x29,0xae,0xbe,0x1e,0xbb,0x38,0x40,0x0,0xb1,0x10,0x6b,0x0,0x2e,0x17,\n  0x0,0x4,0x10,0x23,0xa5,0xd9,0x19,0x20,0xc0,0x0,0x38,0xf8,0xe2,0x78,0xd9,0x52,\n  0xdc,0xd8,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-8.png\n  0x0,0x0,0x1,0x39,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xaf,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0xb1,\n  0xe0,0x52,0x70,0xf0,0xe0,0x41,0xa2,0xc,0x2,0x8,0x20,0x16,0x5c,0x9a,0xed,0xed,\n  0xed,0x19,0xf0,0xc9,0x1d,0x38,0x70,0x0,0xcc,0x7,0x8,0x20,0x26,0x72,0x34,0x23,\n  0xbb,0xe,0x20,0x80,0x98,0xc8,0xd1,0x8c,0xac,0x6,0x20,0x80,0x58,0xd0,0xfd,0x8c,\n  0xcb,0xef,0xc8,0x9a,0x91,0xd5,0x0,0x4,0x10,0x3,0x28,0x1d,0x34,0x34,0x34,0xfc,\n  0x7,0x1,0xa0,0xbf,0xfe,0xe3,0x2,0x30,0x39,0x18,0xd,0xd5,0xc3,0x0,0x10,0x40,\n  0x64,0xb9,0x0,0x19,0x0,0x4,0x10,0xb,0x21,0x5,0x84,0xc2,0x7,0x20,0x80,0x48,\n  0x72,0x1,0x36,0x0,0x10,0x40,0x2c,0x84,0x14,0x10,0x2,0x0,0x1,0xc4,0xc4,0x40,\n  0x21,0x0,0x8,0x20,0x16,0xf4,0xb4,0x4d,0x2a,0x0,0x8,0x20,0x46,0x4a,0xb3,0x33,\n  0x40,0x80,0x1,0x0,0x44,0xf2,0x82,0x8b,0xc3,0x16,0xc0,0x0,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-18.png\n  0x0,0x0,0x1,0xaf,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x25,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0xc0,0x24,0x23,0x23,0xc4,0x94,0xff,0xff,0x19,0x89,\n  0xd5,0xc8,0xc8,0xc8,0x0,0xd6,0x3,0x10,0x40,0x4c,0x8d,0x30,0xcd,0x78,0x15,0xa3,\n  0xaa,0x61,0x64,0x6c,0x84,0xf3,0x1,0x2,0x88,0x9,0x44,0x34,0x22,0xd9,0xde,0xd8,\n  0xd8,0xf8,0x1f,0xa4,0x1,0x19,0x37,0x34,0x34,0x60,0x18,0x2,0xd2,0x5,0xf4,0x3d,\n  0x23,0x40,0x0,0x31,0x42,0xc2,0x0,0x26,0x9,0x52,0xf,0x12,0xfa,0x8f,0xcb,0x25,\n  0x40,0x4d,0x10,0x8b,0x80,0x4,0x58,0x11,0x40,0x0,0x31,0x35,0x36,0xa2,0x9a,0xc,\n  0xb5,0xd,0x5,0x3,0x5d,0x85,0xaa,0xb9,0x11,0xe1,0x5,0x80,0x0,0x62,0x4,0xaa,\n  0x7,0x73,0xea,0xeb,0x71,0x7,0x20,0xd4,0x55,0x70,0x79,0x98,0x1,0xff,0xeb,0xeb,\n  0x19,0x1,0x2,0x8,0xec,0x5,0x46,0xa8,0x17,0xfe,0x33,0x90,0x10,0xb,0x50,0x3d,\n  0x0,0x1,0xc4,0xc4,0xd8,0xc8,0x48,0x72,0x42,0x40,0xd6,0x3,0x10,0x40,0x4c,0xd0,\n  0x0,0x25,0xc9,0x76,0x64,0x3d,0x0,0x1,0x4,0xf5,0x2,0x3,0xd4,0xb,0xc,0x8c,\n  0xb8,0xfc,0x8d,0xc5,0x1d,0x60,0x3d,0x0,0x1,0xc4,0x84,0x1c,0xa2,0xc8,0x9a,0x61,\n  0x71,0x8f,0x8c,0x1b,0xa1,0x6a,0x91,0x63,0xe,0x20,0x80,0x18,0x81,0xf1,0x6,0xf,\n  0x51,0x24,0x9b,0xf1,0xa6,0x3,0x98,0x1,0xa0,0x98,0x3,0x8,0x20,0x6,0x88,0x62,\n  0x10,0xf1,0x1f,0xac,0x11,0xaa,0x19,0xe4,0x82,0xff,0x10,0x5f,0x21,0x30,0x48,0xc,\n  0xa6,0xe6,0x3f,0x54,0x13,0x40,0x0,0x81,0x92,0xce,0x7f,0x74,0x3,0x60,0x86,0x20,\n  0xf3,0x91,0x71,0x3,0x4c,0x3,0x10,0x3,0x4,0x10,0x13,0x72,0xba,0x46,0x76,0xee,\n  0x7f,0x2,0x39,0x13,0x96,0x7f,0x0,0x2,0xc,0x0,0x72,0xef,0xc0,0xfd,0xb2,0x78,\n  0xb0,0x83,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-7-4.png\n  0x0,0x0,0x2,0x1a,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x90,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x8a,0xb6,0x1d,0x66,0x1,0xd2,0x4c,0x40,0xcc,0x8,\n  0xc4,0x30,0xd3,0xfe,0x41,0x31,0xb2,0xe9,0x8c,0x48,0x18,0x6,0xfe,0x3,0x4,0x10,\n  0x48,0x33,0x7,0xc8,0x20,0x20,0x66,0x46,0x52,0x8,0x33,0xe0,0x2f,0x92,0x81,0x4c,\n  0x50,0x36,0x4c,0x1d,0xc8,0xf0,0x3f,0x0,0x1,0x4,0xd2,0xc8,0x5,0xc4,0x9c,0x40,\n  0xcc,0x6,0xd5,0xc,0x52,0xf8,0x1b,0x24,0x9,0xa5,0xff,0x43,0xd,0x82,0xb9,0x92,\n  0x5,0xc9,0x80,0x9f,0x0,0x1,0x4,0xe2,0xf0,0x0,0x31,0x3f,0x94,0x66,0x86,0x62,\n  0x98,0x1,0x3f,0xa0,0x9a,0xff,0x20,0x39,0x1f,0x66,0x0,0x48,0xec,0x2b,0x40,0x0,\n  0x81,0x4c,0xe5,0xef,0xf7,0xb6,0x3b,0x7,0xc4,0x87,0x80,0x6c,0x69,0x20,0xbd,0x7,\n  0x48,0xcb,0x2,0xb1,0x14,0x10,0x4b,0x40,0xb1,0x18,0x10,0x8b,0x83,0xd8,0x20,0xb5,\n  0x50,0xfa,0x12,0x90,0x16,0x4,0x8,0x20,0x90,0x69,0xec,0x85,0x5b,0xf,0x5,0x2,\n  0x5,0xd6,0x83,0x4,0xa0,0xa6,0xb,0x3,0xf9,0x13,0x91,0x43,0x1b,0xa8,0x26,0xc,\n  0x4a,0x47,0x2,0xe5,0xb6,0x41,0x85,0x39,0x1,0x2,0x8,0x16,0x3,0xcc,0x68,0x1,\n  0xc4,0x8,0x54,0x98,0xd,0xa4,0xbf,0x23,0x85,0x5,0x8a,0x1a,0xa0,0x7c,0x10,0x48,\n  0x1d,0x40,0x0,0x81,0x18,0x16,0x40,0xec,0xf,0xd,0x94,0xff,0x20,0x8d,0x40,0x9c,\n  0x1,0xe3,0x23,0x89,0x47,0x80,0x30,0x94,0x1d,0x2,0xa5,0xad,0x0,0x2,0x88,0x5,\n  0x1a,0x50,0x9f,0xa1,0xa6,0x86,0xc0,0x2,0x8,0xc8,0xf6,0x85,0xda,0xc,0x8f,0x46,\n  0xa0,0xd3,0x77,0x0,0xc5,0x3d,0x91,0xa2,0xf7,0x2b,0x40,0x0,0x81,0x9c,0xaa,0xc,\n  0x94,0xb8,0x3,0xa4,0xad,0xa1,0xb6,0xc1,0xe2,0x1f,0x86,0x61,0x9,0xc,0x39,0xb1,\n  0xc1,0xe4,0xbe,0x2,0x4,0x10,0xc8,0x5,0x5f,0x80,0x9a,0x15,0xa0,0xd1,0xf3,0x1f,\n  0x4d,0x33,0x72,0x2,0x62,0x82,0xe2,0xff,0x48,0xa9,0xf4,0x27,0x40,0x0,0x81,0x34,\n  0x7d,0x83,0x3a,0x15,0x39,0x5,0xc2,0x30,0x3,0x92,0x1,0x8c,0x68,0x6,0x80,0xc0,\n  0x5f,0x80,0x0,0x2,0x19,0xf0,0x13,0x29,0xc5,0xc1,0x24,0xff,0xf5,0x79,0xd9,0x82,\n  0x15,0x1,0xf3,0xa,0x23,0x92,0x41,0x8c,0x68,0x79,0xe9,0x3f,0x40,0x0,0x81,0xc2,\n  0x0,0xd9,0x6f,0xe0,0xcc,0x3,0xd4,0x4c,0x74,0x16,0x5,0x8,0x20,0x46,0x4a,0xb3,\n  0x33,0x40,0x80,0x1,0x0,0x9,0x5d,0x9e,0x2c,0xdc,0x71,0xd7,0x8c,0x0,0x0,0x0,\n  0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-3.png\n  0x0,0x0,0x2,0x55,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xcb,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x48,\n  0x8a,0x81,0x81,0x41,0x4,0x88,0x25,0x81,0x58,0x2,0xca,0xe6,0x61,0x80,0x80,0x2f,\n  0x40,0xfc,0x6,0x88,0x5f,0x0,0xf1,0x73,0x28,0xfb,0x33,0x10,0x7f,0x7,0xe2,0x3f,\n  0x20,0x5,0x0,0x1,0xc4,0x2,0xd5,0xa0,0x8,0xc4,0x6a,0x40,0xac,0xd4,0xef,0x6d,\n  0x97,0xc1,0x80,0x4,0x80,0x16,0xcc,0x0,0x52,0xf7,0x80,0x98,0x3,0x2a,0xf4,0x17,\n  0x9,0xff,0x7,0x8,0x20,0x26,0xa8,0xcd,0x6a,0xfc,0xa7,0xf7,0x75,0x81,0x34,0xff,\n  0xff,0xff,0x9f,0x1,0x19,0x83,0xc4,0x40,0x72,0x50,0xb,0x40,0x6a,0xf9,0x81,0x98,\n  0xd,0x88,0x41,0x7a,0x19,0x0,0x2,0x88,0x5,0xea,0x6c,0xa5,0x86,0x86,0x6,0xb0,\n  0x6,0x10,0x60,0x64,0x64,0x4,0xd3,0x30,0x43,0x40,0xfc,0xc2,0xad,0x4e,0x4a,0x40,\n  0xa1,0x57,0x40,0xfc,0x16,0x88,0x3f,0x2,0xf1,0x37,0x90,0x2b,0x0,0x2,0x8,0x64,\n  0x8a,0x8,0xcc,0x66,0x5c,0x0,0xe6,0x12,0xa8,0x77,0x79,0x81,0x98,0x1d,0xe6,0x2,\n  0x80,0x0,0x62,0x41,0xa,0x30,0xb8,0xcd,0xe8,0x7c,0x24,0xc3,0x41,0xce,0xe7,0x4,\n  0x62,0x56,0x98,0x1,0x0,0x1,0xc4,0xc4,0x40,0x1a,0xe0,0x84,0x6,0x26,0xc8,0x0,\n  0x66,0x90,0x0,0x40,0x0,0xb1,0x40,0xa3,0xa,0xc5,0x26,0x2c,0x36,0xc3,0x0,0x1b,\n  0xd4,0xf9,0x6c,0x50,0xbd,0xcc,0x0,0x1,0x4,0x72,0xc1,0x1b,0x50,0x54,0xa1,0x3b,\n  0x1f,0xdd,0x2b,0x40,0x35,0x7,0xa0,0x36,0x73,0x41,0xbd,0xd,0x72,0xd,0x1b,0x40,\n  0x0,0x31,0x41,0x13,0xc9,0x3d,0x50,0x2c,0xa0,0x87,0x3e,0xb2,0x6b,0x80,0x81,0xe8,\n  0x0,0xb5,0x1d,0x14,0xe,0x42,0x40,0x2c,0x8,0xc4,0xdc,0x0,0x1,0xc4,0x4,0x4d,\n  0x61,0xb7,0x3e,0x9a,0x3a,0x95,0xc1,0x5c,0x82,0x8c,0xa1,0x36,0xc3,0xc,0x49,0x82,\n  0x6a,0x94,0x80,0x62,0x61,0x80,0x0,0x62,0xc4,0x91,0x94,0x61,0xa1,0xcd,0x6,0x75,\n  0x36,0x3b,0x54,0x33,0x2c,0x75,0x56,0x2,0xa9,0xc7,0x40,0xfc,0x0,0x20,0x80,0x98,\n  0xa0,0x69,0xfb,0x25,0x10,0xdf,0x7,0xe2,0xab,0x40,0x7c,0xe,0x88,0x4f,0x0,0xf1,\n  0x71,0x28,0x7d,0x16,0x24,0xe,0xd4,0xd4,0x82,0xe4,0x92,0x76,0x20,0x25,0x0,0x72,\n  0xd,0x40,0x0,0x31,0x41,0x33,0xc6,0x67,0x68,0x2a,0x3,0x99,0x7a,0x17,0x88,0x6f,\n  0x2,0xf1,0x35,0xa8,0x81,0xd7,0x41,0x5e,0x4,0xe2,0x87,0x50,0x9b,0x61,0x86,0x4c,\n  0x1,0xb9,0x12,0x20,0x80,0x40,0x5e,0x0,0x87,0x15,0x34,0x4d,0x30,0x43,0x69,0x18,\n  0x9b,0x5,0xea,0x15,0x64,0x7f,0xb,0x40,0x35,0x83,0x1,0x40,0x0,0xc1,0x12,0xd2,\n  0x7f,0x68,0xee,0xfa,0x5,0xc4,0x3f,0xa0,0xe9,0x1c,0xe4,0xaa,0x4f,0x40,0xfc,0x1e,\n  0xea,0xc5,0x27,0x20,0x3f,0x43,0x5d,0x12,0x6,0xd,0xb,0x17,0x80,0x0,0x3,0x0,\n  0x38,0x39,0x9d,0x96,0xa2,0x5f,0xb5,0x1d,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,\n  0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-9.png\n  0x0,0x0,0x1,0x2f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x4,0x37,0xa0,0x91,0x91,0xf1,0x3f,0x8,0x23,0x4b,0x62,0xe3,0xa3,0x8b,0x1,0x4,\n  0x10,0x4e,0x17,0xc0,0x14,0xa2,0x6b,0x40,0x7,0x0,0x1,0xc4,0x0,0xa,0x44,0x64,\n  0xdc,0xc0,0x0,0xa2,0xf0,0xb3,0x91,0x31,0x40,0x0,0x31,0x60,0x13,0x84,0x29,0x46,\n  0xa7,0xb1,0x61,0x80,0x0,0xc2,0x69,0x3b,0xaa,0x3a,0xdc,0xae,0x0,0x8,0x20,0x46,\n  0x58,0x3a,0x40,0xf7,0x6b,0xfd,0x7f,0xe4,0xf0,0x40,0xf5,0x76,0xfd,0xff,0xff,0x70,\n  0x11,0x80,0x0,0xa2,0xd8,0x5,0x0,0x1,0x44,0x71,0x18,0x0,0x4,0x10,0xc5,0xb1,\n  0x0,0x10,0x40,0x18,0x61,0x0,0xf3,0x1f,0x72,0x98,0xa0,0x8b,0x21,0x87,0x1,0x40,\n  0x0,0xe1,0x4c,0x48,0x30,0x45,0x28,0x1,0x86,0x5,0x0,0x4,0x10,0x23,0xa5,0xb9,\n  0x11,0x20,0x80,0x28,0xce,0x4c,0x0,0x1,0x6,0x0,0xfd,0x4d,0x34,0x9e,0x7e,0xb5,\n  0xba,0x6,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-14.png\n  0x0,0x0,0x1,0x2f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0x59,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x2,0x4,0x10,0xb,0x12,0x87,0x24,0xcd,0x40,0x4b,0xc1,0x34,0x40,0x0,0x31,\n  0x31,0x50,0x8,0x0,0x2,0x88,0x5,0x97,0xc4,0xc1,0x83,0x7,0x51,0xf8,0xf6,0xf6,\n  0xf6,0x58,0xd5,0x1,0x4,0x10,0xb,0x21,0x8d,0xe8,0xe2,0xe8,0x6,0x1,0x4,0x10,\n  0x13,0xba,0x22,0x5c,0x36,0xc1,0x34,0xa3,0x5b,0x0,0x10,0x40,0x4c,0xe8,0x9a,0x71,\n  0xb9,0x0,0x97,0x1a,0x80,0x0,0xc2,0x1b,0x88,0xf8,0x5c,0x3,0x3,0x0,0x1,0xc4,\n  0x84,0xee,0x3c,0x64,0x4d,0xd8,0x2,0x12,0x5d,0xd,0x40,0x0,0x31,0x11,0xf2,0x23,\n  0xa1,0x30,0x2,0x8,0x20,0x16,0x5c,0xce,0x26,0x36,0x1a,0x1,0x2,0x88,0x85,0x12,\n  0xff,0x83,0x0,0x40,0x0,0x51,0x9c,0x12,0x1,0x2,0x88,0x5,0x3d,0x6d,0x93,0xa,\n  0x0,0x2,0x88,0x91,0xd2,0xec,0xc,0x10,0x60,0x0,0x3,0x21,0x3c,0x67,0x2c,0x6c,\n  0x23,0x90,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-8.png\n  0x0,0x0,0x1,0x4f,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc5,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x1e,0x0,0x92,0x64,0xc4,0xa7,0x0,0x20,0x80,0x98,0x8,0x68,0x46,0xa6,0xb1,\n  0x2,0x80,0x0,0xc2,0x65,0xc0,0xff,0xc6,0xc6,0x46,0x30,0x3,0x4a,0xe3,0x34,0x4,\n  0x20,0x80,0x70,0x19,0xc0,0x58,0x5f,0x5f,0x8f,0xec,0x74,0x46,0xa0,0x41,0x58,0xd,\n  0x1,0x8,0x20,0x7c,0x5e,0x60,0x40,0xf6,0x3f,0x9a,0x81,0x70,0x0,0x10,0x40,0x8c,\n  0x48,0x81,0x48,0x30,0xc0,0xb0,0xa9,0x3,0x8,0x20,0x26,0x74,0x3f,0x13,0x2,0xe8,\n  0x61,0x2,0x10,0x40,0x20,0x17,0xfc,0xc7,0xe5,0x6c,0x3c,0x31,0x3,0x57,0xb,0x10,\n  0x40,0x2c,0x50,0xd,0xc8,0x2e,0xf8,0x8f,0xcd,0xbf,0xc8,0x81,0x8,0x94,0x7,0xbb,\n  0x4,0x44,0x3,0x4,0x10,0x3,0xc8,0x1,0x50,0xfc,0x1f,0x89,0x8d,0xf,0xff,0x6f,\n  0x68,0x68,0x80,0xab,0x5,0x8,0x20,0x14,0x49,0x64,0x9,0x5c,0x86,0xa2,0xab,0x1,\n  0x8,0x20,0x92,0x6c,0xc3,0x86,0x1,0x2,0x8,0x5f,0x4a,0xfc,0x8f,0x87,0xf,0x7,\n  0x0,0x1,0x84,0xd7,0x76,0x18,0xc0,0xe7,0xa,0x80,0x0,0xa2,0xd8,0xb,0x0,0x1,\n  0xc4,0x48,0x20,0x3b,0x13,0x4,0x0,0x1,0x6,0x0,0x9d,0xc8,0x29,0xb4,0xdb,0x88,\n  0x51,0xf9,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-1.png\n  0x0,0x0,0x1,0x20,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0x96,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x60,0x8c,0xc6,0xc6,0x46,0x92,0x4d,0xaa,0xaf,0xaf,\n  0x67,0x4,0x8,0x20,0x6,0x90,0xb,0x40,0xb8,0xa1,0xa1,0x1,0xc8,0x80,0x40,0x10,\n  0x1b,0x2a,0xfc,0x1f,0x5d,0x1c,0xa6,0x1,0xa2,0xe6,0x3f,0x3,0x40,0x0,0x31,0x31,\n  0x50,0x8,0x0,0x2,0x88,0x11,0x16,0x6,0xe4,0x7a,0x1,0x20,0x80,0x50,0xbc,0x80,\n  0xec,0x6c,0xa0,0x69,0x60,0x8c,0xcf,0x3b,0x20,0x41,0x80,0x0,0xa2,0xd8,0xb,0x0,\n  0x1,0x44,0xb1,0x17,0x0,0x2,0x88,0xe2,0x58,0x0,0x8,0x20,0x8a,0xbd,0x0,0x10,\n  0x40,0x14,0x7b,0x1,0x20,0x80,0xd0,0xbc,0x80,0x70,0x1e,0x2e,0x67,0x43,0x23,0x7,\n  0xee,0x5,0x80,0x0,0xa2,0xd8,0xb,0x0,0x1,0x44,0xb1,0x17,0x0,0x2,0x88,0x91,\n  0xd2,0xdc,0x8,0x10,0x40,0x14,0x7b,0x1,0x20,0xc0,0x0,0x2f,0xa0,0xcb,0x7b,0x35,\n  0x8d,0x2d,0x8f,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-2-7.png\n  0x0,0x0,0x1,0xa5,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x1b,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0xc0,0x24,0x23,0xe3,0x7f,0x30,0x26,0x3,0x0,0x4,\n  0x10,0x53,0x23,0x99,0x1a,0x61,0x0,0x20,0x80,0xc0,0x2e,0x68,0x4,0x11,0xff,0xff,\n  0x33,0xc2,0x4,0x19,0x81,0x86,0x12,0x8b,0x1,0x2,0x88,0x11,0x12,0x6,0x30,0x57,\n  0x40,0xc,0x1,0x49,0x10,0x13,0x36,0x40,0x75,0xc,0x0,0x1,0xc4,0xd4,0xd8,0x88,\n  0xd7,0xb,0x8c,0x30,0xc,0x52,0x8c,0x8c,0x61,0x0,0x20,0x80,0x20,0x5e,0x68,0x44,\n  0xd8,0x8e,0xa6,0x19,0x44,0xfc,0x87,0xf8,0xf0,0x3f,0xd8,0xb5,0x30,0xc,0x3,0x0,\n  0x1,0x4,0x16,0x64,0x84,0x7a,0xe1,0x3f,0xa6,0x21,0x8,0x3,0x60,0x6,0x42,0x3,\n  0x1d,0xac,0xf,0xe8,0x12,0x80,0x0,0x62,0x62,0xc4,0xe2,0x5,0x46,0x88,0x73,0xfe,\n  0xc3,0x34,0xa3,0xb9,0x4,0xc5,0x5,0x0,0x1,0xc4,0xc2,0x0,0x8d,0x86,0xff,0xf5,\n  0xd0,0x0,0x6c,0x6c,0x44,0x35,0xb0,0xbe,0x1e,0x42,0x83,0xfc,0x9,0x64,0xc3,0xfc,\n  0xf,0x33,0x4,0x20,0x80,0x20,0xc,0xa8,0xb1,0xc8,0x7e,0x4,0x8b,0x37,0x34,0x40,\n  0x18,0x40,0x1a,0xa1,0x4,0x1,0x40,0xe6,0x0,0x4,0x10,0x13,0x86,0x8d,0xe8,0x0,\n  0x68,0xf3,0xff,0xfa,0x7a,0x46,0x68,0xbc,0x63,0xc4,0x2,0x40,0x0,0x31,0x82,0x6d,\n  0x1,0x19,0x5,0x54,0x84,0x9c,0x90,0xfe,0xff,0x47,0x9,0xd0,0xff,0xb8,0xd2,0x1,\n  0x40,0x0,0x41,0x62,0x81,0x11,0x16,0x40,0xc,0x28,0x9,0x9,0xd9,0x26,0x74,0x0,\n  0x93,0x7,0x8,0x20,0x26,0x46,0x46,0xdc,0x5e,0x40,0xf,0x13,0x6c,0xe9,0x0,0x20,\n  0x80,0x98,0xa0,0x1e,0x85,0xdb,0x8e,0xe2,0x3c,0x2,0x18,0x4,0x0,0x2,0xc,0x0,\n  0x8f,0xd,0xb5,0x9a,0xb7,0xe,0x8,0xc,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,\n  0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-14.png\n  0x0,0x0,0x1,0x4b,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xc1,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0xb0,0x9,0x32,0x32,0x30,0xe2,0x37,0x95,0x11,0x21,\n  0xf,0x10,0x40,0x2c,0x10,0x3e,0x3,0x5c,0x0,0xe8,0x20,0x46,0x52,0x5c,0x0,0x10,\n  0x40,0x8c,0xe8,0x5e,0x0,0xdb,0x8e,0xe4,0x0,0xc,0x3,0x41,0xb6,0xff,0xff,0xf,\n  0x17,0x3,0x8,0x20,0x16,0x6c,0xa6,0x22,0x6b,0x42,0x76,0x1d,0x58,0xe,0x4d,0x2d,\n  0x40,0x0,0xb1,0x10,0x72,0x22,0xa6,0xb,0x18,0xfe,0xc3,0xc,0x5,0xc9,0x1,0x4,\n  0x10,0xb,0xba,0xf3,0x81,0xee,0x63,0x24,0xc5,0x50,0x80,0x0,0x62,0x22,0x29,0xce,\n  0xd0,0xfc,0xf,0x2,0x0,0x1,0xc4,0xc4,0x40,0x21,0x0,0x8,0x20,0x26,0x52,0x9d,\n  0x8f,0xe,0x0,0x2,0x88,0x9,0x1e,0x9b,0x50,0x9a,0x81,0x50,0x22,0x42,0x3,0x0,\n  0x1,0x4,0xd,0x44,0x50,0xc0,0x22,0xbb,0x0,0x8b,0x21,0x8c,0xe0,0xd0,0xc3,0x70,\n  0x21,0x40,0x0,0xb1,0x60,0x77,0x3e,0x36,0xaf,0x60,0x73,0xdd,0x7f,0x46,0x80,0x0,\n  0x62,0x21,0xcd,0xc7,0x98,0x6,0x3,0x4,0x10,0x23,0xa5,0xb9,0x11,0x20,0x80,0x28,\n  0x8e,0x46,0x80,0x0,0x3,0x0,0x83,0xc6,0x3d,0x21,0x3d,0x2d,0xd5,0x39,0x0,0x0,\n  0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-2.png\n  0x0,0x0,0x1,0x7a,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xf0,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x4,0x35,0x80,0xf1,0x3f,\n  0x23,0x1c,0x33,0xc0,0x71,0x23,0x63,0xe3,0x7f,0x6,0x46,0x6,0x24,0xcc,0x8,0xc1,\n  0xc,0x8c,0x70,0x67,0x3,0x4,0x10,0xc4,0x0,0x90,0x6a,0xb8,0x99,0x8c,0x38,0xec,\n  0x82,0x8a,0xff,0x47,0x55,0x1,0x10,0x40,0x4c,0xc8,0xf2,0xb8,0xd,0xc1,0xae,0x19,\n  0x4,0x0,0x2,0x88,0x9,0x2e,0x83,0x61,0x8,0x1a,0x40,0xd1,0x8c,0x50,0x5,0x10,\n  0x40,0x4c,0xc,0xe8,0x82,0xd8,0xc,0xc1,0xa1,0x19,0x4,0x0,0x2,0x88,0x9,0x43,\n  0x25,0x3,0x24,0x8c,0xfe,0xc3,0x9d,0xcd,0x8,0xe,0x3f,0xb8,0x1c,0x1a,0x0,0x8,\n  0x20,0x46,0x50,0x3a,0x0,0x87,0x36,0x16,0x50,0xff,0xbf,0x1,0x28,0xd7,0xc0,0x80,\n  0x5d,0xae,0x1e,0x6c,0x3,0x40,0x0,0x31,0x80,0x13,0x12,0x88,0x40,0xc3,0x20,0xb2,\n  0x81,0xa1,0x1,0xc2,0xc3,0xa5,0x0,0x88,0x1,0x2,0x88,0x9,0x33,0xb4,0x21,0x91,\n  0xe,0x8b,0x6a,0xb0,0xf3,0xff,0x33,0xc2,0xe5,0xd0,0x1,0x40,0x0,0x31,0xa1,0x47,\n  0xd5,0x7f,0x2c,0xb1,0xc8,0x88,0x12,0x76,0xa8,0x92,0x0,0x1,0xc4,0x44,0x48,0x33,\n  0x21,0x43,0x0,0x2,0x88,0x9,0x25,0x72,0x18,0xb1,0x47,0x15,0x8c,0xcf,0x88,0x45,\n  0xa,0x20,0x80,0x98,0x8,0x6b,0xc6,0xe7,0x12,0x6,0x6,0x80,0x0,0x62,0xa4,0x34,\n  0x3b,0x3,0x4,0x18,0x0,0x5b,0xc6,0x6f,0xec,0xbe,0xaf,0xfc,0xef,0x0,0x0,0x0,\n  0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-1.png\n  0x0,0x0,0x1,0x67,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xdd,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x90,0x39,0x8c,0x8c,0x8c,0x70,0xd3,0x80,0x6,0x33,\n  0x12,0x63,0x0,0x40,0x0,0xb1,0x20,0x6b,0xfe,0xcf,0xf0,0x1f,0xc5,0x30,0x98,0x21,\n  0xf8,0xc,0x6,0x8,0x20,0x16,0x62,0x6c,0x41,0xd6,0x84,0x6c,0x30,0x8,0x0,0x4,\n  0x10,0x13,0xb2,0x22,0x46,0x6,0x46,0x86,0x46,0x20,0x4,0xd1,0xc4,0x7a,0x1,0x20,\n  0x80,0x18,0x61,0x81,0x8,0x32,0xb9,0x81,0xa1,0x1,0x2e,0x1,0x62,0xa3,0xdb,0x8c,\n  0xcd,0x65,0x0,0x1,0xc4,0x84,0x4b,0x92,0x90,0xdf,0x61,0x7c,0x80,0x0,0x62,0x42,\n  0xf7,0x13,0xb2,0x2,0x5c,0x9a,0x90,0xc5,0x1,0x2,0x8,0xc5,0xb,0x28,0xe1,0x41,\n  0x64,0x94,0x2,0x4,0x10,0x23,0x72,0x42,0x82,0xb9,0x6,0xe1,0x2a,0x90,0x21,0xa8,\n  0x86,0xa1,0x1b,0xa,0x10,0x40,0x4c,0xf8,0xc2,0x17,0xa4,0x19,0x44,0x43,0xbc,0x3,\n  0xf3,0x16,0xaa,0x2a,0x80,0x0,0x62,0xc1,0x1d,0xca,0xd8,0x5c,0x80,0x50,0x3,0x13,\n  0x3,0x8,0x20,0x16,0xdc,0xb1,0x80,0xd0,0xdc,0xd0,0x80,0xdd,0x8d,0x20,0x71,0x80,\n  0x0,0x62,0xc1,0x1d,0x48,0x84,0x35,0x83,0xf4,0x1,0x4,0x10,0xce,0x30,0x20,0x46,\n  0x33,0x88,0xd,0x10,0x40,0x8c,0xd8,0xb2,0x33,0xae,0x84,0x85,0x2d,0x5a,0x1,0x2,\n  0xc,0x0,0x22,0xd4,0x92,0x11,0xce,0xaa,0xe6,0xfb,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-7.png\n  0x0,0x0,0x1,0xfe,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x74,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x48,\n  0x8c,0x81,0x81,0x81,0xb,0x88,0xf9,0x81,0x98,0xf,0x88,0x99,0x80,0x98,0xd,0x88,\n  0x59,0x81,0xf8,0x37,0x3,0x4,0xc0,0xd8,0xbf,0x80,0xf8,0x1f,0x10,0x7f,0x2,0xe2,\n  0x8f,0x40,0xfc,0xd,0x20,0x80,0x98,0xa0,0x9a,0x5,0x81,0x58,0xa2,0xdf,0xdb,0xee,\n  0x10,0x90,0x96,0x7,0x62,0x25,0x20,0x7b,0x2b,0x88,0x46,0x63,0xcb,0x43,0xd5,0x48,\n  0x40,0xf5,0x70,0x1,0x4,0x10,0xb,0xd4,0x66,0x90,0x2b,0x64,0xa1,0xb6,0xa9,0x3,\n  0x31,0x37,0x94,0xad,0xc9,0x80,0x0,0x20,0xf6,0x57,0x28,0x1b,0xa6,0xf6,0x1f,0x40,\n  0x0,0x31,0x0,0xbd,0x60,0xb,0x64,0xfc,0x27,0x7,0x83,0xf4,0x2,0x4,0x10,0xc8,\n  0x5,0x4c,0x40,0x46,0x3c,0xc8,0x66,0xa0,0xf3,0xaa,0x80,0xec,0xd,0xa0,0xb0,0x0,\n  0xb2,0x9d,0x80,0xec,0x7d,0x20,0x6b,0x90,0xd8,0x9f,0x80,0xec,0x0,0x20,0xbb,0xd,\n  0xc8,0xbe,0x9,0xd2,0xb,0x10,0x40,0x2c,0xd0,0x0,0xe3,0x44,0x72,0x36,0x2c,0x20,\n  0x19,0x90,0x68,0x18,0x9b,0xf,0xca,0xe6,0x86,0xea,0x61,0x3,0x8,0x20,0x90,0x17,\n  0xbc,0x28,0xf0,0x82,0x17,0x40,0x0,0x81,0x5c,0xf0,0x1b,0xc8,0xc8,0x0,0x5,0x12,\n  0xd0,0x79,0xf9,0x50,0xa7,0x32,0x1,0xd9,0xe,0x40,0xf6,0x1,0xa8,0x17,0x60,0xec,\n  0xff,0x40,0xb6,0x23,0x90,0x3d,0x19,0xea,0x85,0xbf,0x0,0x1,0x84,0xec,0x44,0xb2,\n  0x0,0x40,0x0,0x51,0xea,0x5,0x1f,0x80,0x0,0xa2,0xd4,0xb,0xbf,0x1,0x2,0x88,\n  0x9,0x9a,0x3c,0xbf,0x23,0x25,0x92,0x4f,0xd0,0xe4,0xca,0x0,0xa5,0x61,0xec,0xff,\n  0xd0,0xe4,0xb,0x2,0x5f,0x81,0x6,0x4d,0x1,0xe9,0x5,0x8,0x20,0xb2,0x13,0x12,\n  0x50,0x5f,0x4,0x10,0x5b,0x1,0x4,0x10,0xc8,0x5,0x9f,0x80,0xc,0xf,0x20,0x4e,\n  0x85,0x86,0x49,0x1b,0x10,0x4f,0x84,0xb2,0x27,0x22,0xb1,0x27,0x0,0x71,0xb,0x94,\n  0x9d,0x4,0xa4,0xde,0x0,0xf1,0x67,0x80,0x0,0x62,0x81,0x3a,0xb,0x39,0x36,0x6e,\n  0x42,0x13,0x9,0x8,0x5c,0x47,0x12,0xbf,0x1,0xf5,0x2a,0x8,0x3c,0x6,0xe2,0x57,\n  0x20,0xbd,0x0,0x1,0xc4,0x48,0x42,0x76,0x6,0x85,0xd5,0x4f,0x50,0xdc,0x83,0x6c,\n  0x6,0xe2,0xf,0xa0,0xec,0xc,0x10,0x60,0x0,0xc2,0x49,0xd4,0xf2,0x18,0x63,0xa8,\n  0xe6,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-10.png\n  0x0,0x0,0x1,0x42,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xb8,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0x94,0x1,0x8d,0x8d,0x8d,0xf,0x41,0x18,0x9b,0x1c,0x40,0x0,0x11,0xed,0x82,\n  0x86,0xfa,0x7a,0x39,0x6c,0x86,0x0,0x4,0x10,0xb,0xb2,0x2d,0xc4,0x18,0x2,0x54,\n  0xf8,0xb0,0xbe,0xbe,0x5e,0x1e,0x26,0x6,0x10,0x40,0xc,0xd0,0x58,0x78,0xd8,0xd0,\n  0xd0,0xf0,0x10,0xcc,0x21,0x2,0x83,0xd4,0xc2,0xb8,0x0,0x1,0x4,0x33,0x0,0x24,\n  0xf8,0x9f,0x58,0x3,0xa0,0x86,0x1c,0x7,0x31,0x1,0x2,0x88,0x2c,0x3,0x90,0x5d,\n  0x0,0x10,0x40,0x2c,0x28,0x7e,0x6c,0x6c,0xc4,0xe7,0x7f,0x98,0x9a,0x47,0xc8,0x61,\n  0x0,0x10,0x40,0xf0,0x30,0xc0,0x87,0x61,0xae,0x43,0xb6,0x19,0x86,0x1,0x2,0x88,\n  0x91,0x50,0x52,0x66,0x64,0x64,0x4,0x19,0x0,0x66,0xa3,0xd8,0xc,0x5,0x0,0x1,\n  0x44,0x94,0x1,0x50,0x97,0xca,0x63,0x93,0x7,0x8,0x20,0x46,0x4a,0x33,0x13,0x40,\n  0x0,0x51,0x9c,0x17,0x0,0x2,0x88,0x62,0x3,0x0,0x2,0xc,0x0,0xe1,0x64,0xce,\n  0xfc,0x23,0x2f,0xaa,0x9,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,\n  0x82,\n    // /work/depthmap/depthmap/images/win/b-1-23.png\n  0x0,0x0,0x1,0x94,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0xa,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x0,0xb9,0xa0,0xa1,0xa1,0xe1,0x3f,0x3a,0x38,0x70,\n  0xe0,0xc0,0x7f,0x6,0x20,0xc4,0x26,0x7,0x15,0x3,0xeb,0x5,0x8,0x20,0x16,0x7c,\n  0xb6,0x1c,0x38,0x78,0x80,0x81,0xc1,0x1,0xbf,0x4b,0x0,0x2,0x88,0x9,0x9b,0xe0,\n  0xc1,0x83,0x7,0x19,0xec,0x1d,0x1c,0x18,0x80,0xae,0x60,0xb0,0xb7,0x77,0x0,0xf3,\n  0x71,0x1,0x80,0x0,0x62,0xc2,0xa5,0xb9,0xb1,0xa1,0x1,0xe4,0x4f,0x60,0xf8,0x34,\n  0xe0,0x35,0x4,0x20,0x80,0x58,0x90,0x35,0x82,0x0,0xb2,0x66,0x68,0x60,0x1,0xd,\n  0x1,0xd1,0x20,0x43,0xe,0x60,0x18,0x0,0x10,0x40,0x70,0x17,0x38,0x38,0xd8,0x43,\n  0xc,0x2,0x3a,0x1b,0xa6,0x19,0x29,0xc4,0xc1,0x2e,0x81,0x59,0x80,0xc,0x0,0x2,\n  0x8,0x6e,0x40,0x43,0x43,0x23,0xd8,0xcf,0xe,0x58,0x9c,0xb,0xe2,0x37,0x34,0xd4,\n  0x83,0xe5,0x41,0xae,0x43,0x6,0x0,0x1,0x84,0x11,0x8d,0x20,0x36,0x28,0xfa,0x40,\n  0xd1,0x8,0x8f,0x4e,0x86,0xff,0xff,0xd1,0xd5,0xc0,0xa2,0x11,0x20,0x80,0xb0,0xa6,\n  0x3,0x64,0x43,0xd0,0x35,0xa3,0x1b,0x0,0x10,0x40,0x2c,0x38,0x52,0x19,0x30,0x79,\n  0x2,0xd3,0x1,0x8,0x2,0xc3,0xcd,0xde,0xbe,0x1e,0x67,0x34,0x2,0x4,0x10,0x13,\n  0xfe,0xe4,0xda,0x40,0x30,0x49,0x3,0x4,0x10,0x23,0xc8,0x19,0x94,0xe4,0x5,0x80,\n  0x0,0x62,0xa4,0x34,0x37,0x2,0x4,0x10,0x13,0x3,0x85,0x0,0x20,0xc0,0x0,0x9a,\n  0x1b,0xe9,0x57,0xdc,0x62,0x76,0xe4,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,\n  0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-4-11.png\n  0x0,0x0,0x1,0x47,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xbd,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0xc0,0x24,0x23,0xe3,0x7f,0x30,0x86,0x1,0x12,0xf8,\n  0x0,0x1,0xc4,0xd4,0x88,0x2c,0x1,0x4,0xa4,0xf2,0x1,0x2,0x8,0xec,0x82,0x46,\n  0x10,0xf1,0xff,0x3f,0x23,0x5c,0x11,0x9,0x7c,0x80,0x0,0x62,0x84,0x84,0x1,0xcc,\n  0x54,0x98,0x22,0xe2,0xf9,0x0,0x1,0xc4,0xd4,0xd8,0x88,0xe6,0x44,0x12,0xf9,0x0,\n  0x1,0x4,0xf1,0x42,0x23,0xb2,0xe9,0xa4,0xf1,0x1,0x2,0x8,0xec,0x5,0x46,0xa8,\n  0x93,0xfe,0xc3,0x4,0x49,0xe0,0x3,0x4,0x10,0x13,0x23,0x9a,0x93,0x48,0xe5,0x3,\n  0x4,0x10,0x13,0x2c,0x58,0xff,0x23,0x39,0x91,0x14,0x3e,0x40,0x0,0x41,0xbd,0xc0,\n  0x0,0x75,0x12,0x3,0xd4,0x89,0xc4,0xf3,0x1,0x2,0x8,0xe8,0x85,0x46,0x34,0x27,\n  0x92,0xc6,0x7,0x8,0x20,0x26,0x58,0xb0,0xc2,0x4c,0x27,0x95,0xf,0x10,0x40,0x10,\n  0x2f,0x30,0x42,0x9d,0xf4,0x1f,0x2a,0x48,0x2,0x1f,0x20,0x80,0x98,0x18,0x19,0xd1,\n  0x9c,0x48,0x22,0x1f,0x20,0x80,0x98,0x60,0xc1,0xa,0x33,0x9d,0x54,0x3e,0x40,0x80,\n  0x1,0x0,0xea,0x35,0x8f,0x4d,0x9e,0x6,0xe8,0xf5,0x0,0x0,0x0,0x0,0x49,0x45,\n  0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-5.png\n  0x0,0x0,0x1,0x30,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa6,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x58,0x40,0x44,0x63,0x63,0x23,0xc9,0xa6,0xd4,0xd7,0xd7,\n  0x33,0x82,0x68,0x80,0x0,0x62,0x41,0x12,0x20,0x5a,0x33,0xd0,0x42,0x38,0x1b,0x20,\n  0x80,0x58,0x90,0x25,0x18,0x19,0x19,0x71,0x6a,0xc2,0xe5,0x55,0x80,0x0,0x62,0x21,\n  0x46,0x21,0x3e,0x83,0x1,0x2,0x88,0x89,0x58,0x67,0x83,0xc,0xc1,0x66,0x10,0x40,\n  0x0,0x11,0x65,0x0,0xc8,0x55,0xb8,0xbc,0x0,0x10,0x40,0x4c,0xc,0x14,0x2,0x80,\n  0x0,0x62,0xc2,0xe7,0x64,0x62,0x0,0x40,0x0,0x31,0xe1,0x8a,0x26,0x90,0x93,0x89,\n  0x31,0x4,0x20,0x80,0x98,0x8,0xf9,0x9d,0x90,0x21,0x0,0x1,0xc4,0x82,0xcb,0xe9,\n  0xe,0xe,0xe,0x60,0xfa,0xc0,0x81,0x3,0x78,0xd,0x1,0x8,0x20,0x16,0x62,0x12,\n  0xb,0xbe,0xfc,0x2,0x10,0x40,0x2c,0xd8,0x92,0x27,0x29,0x0,0x20,0x80,0x18,0x29,\n  0xcd,0x8d,0x0,0x1,0x44,0x71,0x3a,0x0,0x8,0x30,0x0,0xa1,0xaf,0x2b,0x30,0x35,\n  0xa0,0x78,0x49,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-7-1.png\n  0x0,0x0,0x1,0x89,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xff,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x50,0x78,0x8c,0x8c,0xff,0xc1,0x98,0x4,0x0,0x10,\n  0x40,0x70,0x3,0x1a,0x89,0xd0,0xc8,0x88,0x45,0xd,0x40,0x0,0xa1,0xb8,0xa0,0x11,\n  0x44,0xfc,0xff,0xcf,0x8,0x66,0x37,0x36,0xfe,0x7,0x69,0x40,0xc6,0xd,0xd,0xd,\n  0x18,0x86,0x0,0x4,0x10,0x23,0x6a,0x18,0xc0,0x24,0x41,0xea,0x41,0x52,0xff,0x71,\n  0xb9,0x4,0x68,0xf,0xc4,0x22,0x80,0x0,0x42,0x78,0xa1,0x11,0xd5,0x64,0xa8,0x6d,\n  0x28,0x18,0xe8,0x2a,0x14,0xcd,0x20,0x0,0x10,0x40,0x70,0x17,0xc0,0xc,0xa8,0xaf,\n  0x47,0x48,0x62,0xb,0x3,0x64,0xcd,0x20,0x0,0x10,0x40,0x28,0x5e,0x60,0x84,0x7a,\n  0xe1,0x3f,0x3,0x6e,0x43,0xd0,0x1,0x40,0x0,0xc1,0xbd,0xc0,0xd8,0xc8,0x48,0x56,\n  0x82,0x0,0x8,0x20,0xd4,0x74,0xd0,0x48,0x9a,0xed,0x20,0x0,0x10,0x40,0x68,0x5e,\n  0x60,0x80,0x7a,0x81,0x81,0x11,0x9f,0xbf,0x91,0x1,0x40,0x0,0x21,0x79,0xa1,0xf1,\n  0x3f,0xb6,0x40,0x83,0xc5,0x3d,0x32,0x6e,0x44,0x52,0xb,0x10,0x40,0x70,0x17,0xc0,\n  0xc,0xf8,0x5f,0x5f,0xcf,0x88,0x64,0x33,0xc1,0x74,0x0,0x10,0x40,0x20,0x6,0x1c,\n  0x83,0x92,0x21,0x8,0x23,0xf8,0xc,0x20,0x17,0xfc,0x87,0xf8,0xa,0x81,0x41,0x62,\n  0x30,0x35,0x0,0x1,0x84,0xa4,0xb9,0xe1,0x3f,0xba,0x1,0x30,0x43,0x90,0xf9,0xe8,\n  0x18,0x20,0x80,0x50,0x63,0x1,0x18,0xd,0x40,0x31,0x94,0x0,0xc3,0x17,0x80,0x20,\n  0x0,0x10,0x60,0x0,0xa7,0xf4,0xb0,0xed,0x68,0x61,0x68,0xf4,0x0,0x0,0x0,0x0,\n  0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-5-10.png\n  0x0,0x0,0x1,0xd0,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x1,0x46,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0x2c,0xdc,0x7a,0x88,\n  0x97,0x81,0x81,0x81,0xd,0x88,0x39,0x80,0x98,0x15,0x88,0xff,0x2,0xf1,0x2f,0x20,\n  0xfe,0x9,0xc5,0xbf,0xa0,0x62,0x58,0x1,0x40,0x0,0xb1,0x40,0x35,0x83,0xc,0xe1,\n  0x3,0x62,0x4e,0xa8,0xf8,0x77,0x20,0xfe,0x2,0xc4,0x9f,0xa0,0x7c,0x9c,0x86,0x0,\n  0x4,0x10,0x13,0xd4,0x66,0x90,0x66,0xd1,0x7e,0x6f,0xbb,0x13,0x40,0x5a,0xe,0x8a,\n  0x25,0x81,0x58,0x18,0x88,0xb9,0xa1,0x96,0x30,0x63,0x33,0x0,0x20,0x80,0x98,0xa0,\n  0xce,0xe6,0x4,0x6a,0xde,0xd3,0xd0,0xd0,0xc0,0x0,0xa4,0x57,0x1,0xf9,0xf2,0x50,\n  0x4c,0xd0,0x10,0x80,0x0,0x62,0x82,0x39,0xd,0x18,0x16,0x61,0x20,0x3,0xa0,0x86,\n  0x4c,0x1,0xa,0xc9,0x10,0xe3,0x12,0x80,0x0,0x62,0x82,0xfa,0xf,0xe4,0xe7,0xef,\n  0x40,0x43,0x72,0x90,0xc,0xe9,0x4,0x8a,0x49,0x13,0x32,0x4,0x20,0x80,0x98,0xa0,\n  0x21,0xd,0xa,0xb0,0xf7,0x20,0xc,0x34,0xa4,0x1c,0xc9,0x90,0x36,0x42,0x86,0x0,\n  0x4,0x10,0xcc,0x0,0x50,0x68,0xbf,0x1,0xe2,0x67,0x40,0xfc,0x2,0x68,0x48,0x15,\n  0xb1,0x86,0x0,0x4,0x10,0xcc,0xb,0x5f,0x81,0xf8,0x2d,0x10,0x3f,0x7,0xe2,0x47,\n  0x40,0xfc,0x94,0x58,0x43,0x0,0x2,0x88,0x9,0x29,0xe1,0x90,0x65,0x8,0x40,0x0,\n  0x31,0x41,0xc3,0x82,0x14,0x43,0x24,0x80,0x58,0xa,0x88,0x45,0x40,0xe9,0x7,0x20,\n  0x80,0x98,0x90,0x62,0x84,0x58,0x43,0x40,0xb1,0x23,0x8,0xc5,0x3c,0x0,0x1,0xc4,\n  0x84,0x96,0x2e,0xf0,0x19,0x52,0x8e,0x96,0x4e,0x40,0xc9,0x9e,0x13,0x20,0x80,0x98,\n  0xb0,0xa4,0x4e,0x5c,0x86,0x3c,0x41,0x4b,0x27,0xa0,0x14,0xcb,0x0,0x10,0x40,0x2c,\n  0x38,0x32,0x19,0xcc,0x10,0x64,0xf0,0x1b,0x14,0xdd,0xe0,0x14,0xb,0xd4,0xc,0xa4,\n  0x5d,0x40,0x89,0xf,0x20,0x80,0x70,0x19,0x80,0xcd,0x10,0x90,0x1,0x9f,0x41,0xce,\n  0x6,0x6a,0xb6,0x80,0xa6,0xde,0x4f,0x0,0x1,0x6,0x0,0x39,0x85,0xa4,0x4,0xab,\n  0x33,0xb2,0x92,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-6-6.png\n  0x0,0x0,0x1,0x33,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,\n  0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,\n  0x8e,0x7c,0xfb,0x51,0x93,0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,\n  0x25,0x0,0x0,0x80,0x83,0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,\n  0x30,0x0,0x0,0xea,0x60,0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,\n  0x46,0x0,0x0,0x0,0xa9,0x49,0x44,0x41,0x54,0x78,0xda,0x62,0xfc,0xff,0xff,0x3f,\n  0x3,0x25,0x0,0x20,0x80,0x98,0x18,0x28,0x4,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,\n  0x44,0xb1,0x1,0x0,0x1,0x44,0xb1,0x1,0x0,0x1,0xc4,0xc2,0xc0,0xc8,0x80,0x19,\n  0x8a,0xff,0x81,0xa2,0xf8,0x0,0x48,0xf,0x54,0xd,0x40,0x0,0xb1,0xc0,0x15,0x23,\n  0x9,0x92,0x2,0x0,0x2,0x88,0x9,0xa7,0xd,0xc8,0x2e,0x43,0xe6,0xa3,0xd1,0x0,\n  0x1,0xc4,0x84,0xd3,0x79,0x20,0xc,0xd3,0x8,0xe5,0x37,0x36,0x36,0x22,0x5c,0x9,\n  0xa5,0x1,0x2,0x88,0x11,0x9e,0x90,0x60,0xa,0x91,0x6d,0x46,0xf6,0x1e,0x3a,0x1f,\n  0xca,0x6,0x8,0x20,0x16,0xac,0x5e,0x80,0x4a,0x82,0x6d,0x4,0x82,0xfa,0xff,0xf5,\n  0x38,0xc3,0x9,0x20,0x80,0x18,0x40,0x2e,0x0,0x63,0x10,0x89,0xcc,0xc6,0xc3,0x6f,\n  0x68,0x68,0x80,0xf3,0x1,0x2,0x88,0x91,0xd2,0xbc,0x0,0x10,0x40,0x14,0x27,0x24,\n  0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0xa2,0xd8,0x0,0x80,0x0,0x3,0x0,0xed,0x40,\n  0x60,0x6d,0xc2,0xf8,0xd5,0xe0,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,\n  0x60,0x82,\n    // /work/depthmap/depthmap/images/win/b-1-19.png\n  0x0,0x0,0x0,0xf8,\n  0x89,\n  0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,\n  0x0,0x0,0x10,0x0,0x0,0x0,0x10,0x8,0x6,0x0,0x0,0x0,0x1f,0xf3,0xff,0x61,\n  0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8e,0x7c,0xfb,0x51,0x93,\n  0x0,0x0,0x0,0x20,0x63,0x48,0x52,0x4d,0x0,0x0,0x7a,0x25,0x0,0x0,0x80,0x83,\n  0x0,0x0,0xf9,0xff,0x0,0x0,0x80,0xe9,0x0,0x0,0x75,0x30,0x0,0x0,0xea,0x60,\n  0x0,0x0,0x3a,0x98,0x0,0x0,0x17,0x6f,0x92,0x5f,0xc5,0x46,0x0,0x0,0x0,0x83,\n  0x49,0x44,0x41,0x54,0x38,0x4f,0xa5,0x92,0x51,0xe,0xc0,0x20,0x8,0x43,0xdd,0xcd,\n  0x3d,0x1a,0x37,0x73,0xd6,0xa4,0x8b,0x1a,0xaa,0x64,0x90,0x10,0xfd,0xb0,0x8f,0xa,\n  0x3c,0xad,0x47,0xc9,0x4,0x0,0x99,0x28,0x19,0xf1,0x70,0x1f,0x1,0xd4,0x5a,0x1b,\n  0xd2,0x8b,0x30,0x0,0x62,0xf,0xf2,0x1,0x58,0x45,0x9d,0xac,0xbe,0x43,0x6,0xa0,\n  0xf,0x41,0x5a,0xf4,0x6c,0xcf,0x90,0x5f,0x80,0xf9,0x3b,0xb,0x40,0x35,0x6a,0x77,\n  0x21,0x1d,0x98,0xd9,0xf8,0x8a,0x97,0xd7,0x1e,0x40,0x8c,0x5e,0xf0,0xc4,0x9d,0xc9,\n  0x8a,0x72,0xa,0x14,0xe2,0x1,0x0,0x73,0xb2,0xc1,0xd7,0x3d,0xd8,0xab,0x13,0x42,\n  0x17,0x6a,0xe1,0x96,0x45,0xc2,0x63,0x8e,0xf5,0x26,0x24,0x30,0xb4,0x89,0xa7,0x75,\n  0x4f,0x3,0x5e,0x52,0x14,0x48,0x6e,0xfc,0x80,0x3e,0x1f,0x0,0x0,0x0,0x0,0x49,\n  0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\n  \n};\n\nstatic const unsigned char qt_resource_name[] = {\n  // images\n  0x0,0x6,\n  0x7,0x3,0x7d,0xc3,\n  0x0,0x69,\n  0x0,0x6d,0x0,0x61,0x0,0x67,0x0,0x65,0x0,0x73,\n    // new.png\n  0x0,0x7,\n  0x4,0xca,0x57,0xa7,\n  0x0,0x6e,\n  0x0,0x65,0x0,0x77,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // down.png\n  0x0,0x8,\n  0x6,0xe1,0x5a,0x27,\n  0x0,0x64,\n  0x0,0x6f,0x0,0x77,0x0,0x6e,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // win\n  0x0,0x3,\n  0x0,0x0,0x7d,0xfe,\n  0x0,0x77,\n  0x0,0x69,0x0,0x6e,\n    // save.png\n  0x0,0x8,\n  0x8,0xc8,0x58,0x67,\n  0x0,0x73,\n  0x0,0x61,0x0,0x76,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // paste.png\n  0x0,0x9,\n  0xa,0xa8,0xba,0x47,\n  0x0,0x70,\n  0x0,0x61,0x0,0x73,0x0,0x74,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur\n  0x0,0x3,\n  0x0,0x0,0x6a,0xc2,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,\n    // open.png\n  0x0,0x8,\n  0x6,0xc1,0x59,0x87,\n  0x0,0x6f,\n  0x0,0x70,0x0,0x65,0x0,0x6e,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00006.png\n  0x0,0xc,\n  0xe,0x61,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00007.png\n  0x0,0xc,\n  0xe,0x62,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // icon-1-2.png\n  0x0,0xc,\n  0x1,0xf1,0x95,0x67,\n  0x0,0x69,\n  0x0,0x63,0x0,0x6f,0x0,0x6e,0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00008.png\n  0x0,0xc,\n  0xe,0x63,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // icon-1-3.png\n  0x0,0xc,\n  0x1,0xf2,0x95,0x67,\n  0x0,0x69,\n  0x0,0x63,0x0,0x6f,0x0,0x6e,0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00009.png\n  0x0,0xc,\n  0xe,0x64,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // icon-1-4.png\n  0x0,0xc,\n  0x1,0xf3,0x95,0x67,\n  0x0,0x69,\n  0x0,0x63,0x0,0x6f,0x0,0x6e,0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // icon-1-5.png\n  0x0,0xc,\n  0x1,0xf4,0x95,0x67,\n  0x0,0x69,\n  0x0,0x63,0x0,0x6f,0x0,0x6e,0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // icon-1-1.png\n  0x0,0xc,\n  0x1,0xf8,0x95,0x67,\n  0x0,0x69,\n  0x0,0x63,0x0,0x6f,0x0,0x6e,0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00001.png\n  0x0,0xc,\n  0xe,0x6c,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00002.png\n  0x0,0xc,\n  0xe,0x6d,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00003.png\n  0x0,0xc,\n  0xe,0x6e,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00004.png\n  0x0,0xc,\n  0xe,0x6f,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // cur00005.png\n  0x0,0xc,\n  0xe,0x70,0xf1,0x27,\n  0x0,0x63,\n  0x0,0x75,0x0,0x72,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-5.png\n  0x0,0x9,\n  0x7,0x8,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-4.png\n  0x0,0x9,\n  0x5,0x7,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-9.png\n  0x0,0x9,\n  0x4,0xc,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-19.png\n  0x0,0xa,\n  0x0,0x48,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-7-5.png\n  0x0,0x9,\n  0xa,0x8,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x37,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-4.png\n  0x0,0x9,\n  0x8,0x7,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-15.png\n  0x0,0xa,\n  0x0,0x4c,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-9.png\n  0x0,0x9,\n  0x7,0xc,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-2.png\n  0x0,0x9,\n  0x4,0x5,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-8.png\n  0x0,0x9,\n  0x5,0xb,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-15.png\n  0x0,0xa,\n  0x0,0x4c,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-3.png\n  0x0,0x9,\n  0x9,0x6,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-16.png\n  0x0,0xa,\n  0x0,0x45,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-2.png\n  0x0,0x9,\n  0x7,0x5,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-8.png\n  0x0,0x9,\n  0x8,0xb,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-11.png\n  0x0,0xa,\n  0x0,0x50,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-1.png\n  0x0,0x9,\n  0x5,0x4,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-6.png\n  0x0,0x9,\n  0x4,0x9,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-10.png\n  0x0,0xa,\n  0x0,0x4f,0xf6,0x67,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x31,0x0,0x30,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-16.png\n  0x0,0xa,\n  0x0,0x45,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-7-2.png\n  0x0,0x9,\n  0xa,0x5,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x37,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-1.png\n  0x0,0x9,\n  0x8,0x4,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-11.png\n  0x0,0xa,\n  0x0,0x50,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-7.png\n  0x0,0x9,\n  0x9,0xa,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-12.png\n  0x0,0xa,\n  0x0,0x49,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-6.png\n  0x0,0x9,\n  0x7,0x9,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-5.png\n  0x0,0x9,\n  0x5,0x8,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-20.png\n  0x0,0xa,\n  0x0,0x5f,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x32,0x0,0x30,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-12.png\n  0x0,0xa,\n  0x0,0x49,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-5.png\n  0x0,0x9,\n  0x8,0x8,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-20.png\n  0x0,0xa,\n  0x0,0x5f,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x32,0x0,0x30,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-3.png\n  0x0,0x9,\n  0x4,0x6,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-4.png\n  0x0,0x9,\n  0x9,0x7,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-17.png\n  0x0,0xa,\n  0x0,0x46,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-3.png\n  0x0,0x9,\n  0x7,0x6,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-9.png\n  0x0,0x9,\n  0x8,0xc,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-2.png\n  0x0,0x9,\n  0x5,0x5,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-7.png\n  0x0,0x9,\n  0x4,0xa,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-11.png\n  0x0,0xa,\n  0x0,0x50,0xf6,0x67,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x31,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-17.png\n  0x0,0xa,\n  0x0,0x46,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-7-3.png\n  0x0,0x9,\n  0xa,0x6,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x37,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-2.png\n  0x0,0x9,\n  0x8,0x5,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-8.png\n  0x0,0x9,\n  0x9,0xb,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-13.png\n  0x0,0xa,\n  0x0,0x4a,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-7.png\n  0x0,0x9,\n  0x7,0xa,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-6.png\n  0x0,0x9,\n  0x5,0x9,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-12.png\n  0x0,0xa,\n  0x0,0x49,0xf6,0x67,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x31,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-21.png\n  0x0,0xa,\n  0x0,0x60,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x32,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-13.png\n  0x0,0xa,\n  0x0,0x4a,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-1.png\n  0x0,0x9,\n  0x9,0x4,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-6.png\n  0x0,0x9,\n  0x8,0x9,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-21.png\n  0x0,0xa,\n  0x0,0x60,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x32,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-22.png\n  0x0,0xa,\n  0x0,0x59,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x32,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-10.png\n  0x0,0xa,\n  0x0,0x4f,0xf7,0xa7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x31,0x0,0x30,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-4.png\n  0x0,0x9,\n  0x4,0x7,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-5.png\n  0x0,0x9,\n  0x9,0x8,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-18.png\n  0x0,0xa,\n  0x0,0x47,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-22.png\n  0x0,0xa,\n  0x0,0x59,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x32,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-4.png\n  0x0,0x9,\n  0x7,0x7,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-3.png\n  0x0,0x9,\n  0x5,0x6,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-8.png\n  0x0,0x9,\n  0x4,0xb,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-18.png\n  0x0,0xa,\n  0x0,0x47,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-7-4.png\n  0x0,0x9,\n  0xa,0x7,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x37,0x0,0x2d,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-3.png\n  0x0,0x9,\n  0x8,0x6,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-9.png\n  0x0,0x9,\n  0x9,0xc,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-14.png\n  0x0,0xa,\n  0x0,0x4b,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-8.png\n  0x0,0x9,\n  0x7,0xb,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x38,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-1.png\n  0x0,0x9,\n  0x4,0x4,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-2-7.png\n  0x0,0x9,\n  0x5,0xa,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x32,0x0,0x2d,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-14.png\n  0x0,0xa,\n  0x0,0x4b,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x34,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-2.png\n  0x0,0x9,\n  0x9,0x5,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x32,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-1.png\n  0x0,0x9,\n  0x7,0x4,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-7.png\n  0x0,0x9,\n  0x8,0xa,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x37,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-10.png\n  0x0,0xa,\n  0x0,0x4f,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x30,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-23.png\n  0x0,0xa,\n  0x0,0x5a,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x32,0x0,0x33,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-4-11.png\n  0x0,0xa,\n  0x0,0x50,0xf7,0xa7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x34,0x0,0x2d,0x0,0x31,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-5.png\n  0x0,0x9,\n  0x4,0x8,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x35,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-7-1.png\n  0x0,0x9,\n  0xa,0x4,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x37,0x0,0x2d,0x0,0x31,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-5-10.png\n  0x0,0xa,\n  0x0,0x4f,0xf6,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x35,0x0,0x2d,0x0,0x31,0x0,0x30,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-6-6.png\n  0x0,0x9,\n  0x9,0x9,0x9d,0x47,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x36,0x0,0x2d,0x0,0x36,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n    // b-1-19.png\n  0x0,0xa,\n  0x0,0x48,0xf7,0xc7,\n  0x0,0x62,\n  0x0,0x2d,0x0,0x31,0x0,0x2d,0x0,0x31,0x0,0x39,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,\n  \n};\n\nstatic const unsigned char qt_resource_struct[] = {\n  // :\n  0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,\n  // :/images\n  0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x2,\n  // :/images/cur\n  0x0,0x0,0x0,0x76,0x0,0x2,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x5a,\n  // :/images/win\n  0x0,0x0,0x0,0x3c,0x0,0x2,0x0,0x0,0x0,0x51,0x0,0x0,0x0,0x9,\n  // :/images/new.png\n  0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,\n  // :/images/open.png\n  0x0,0x0,0x0,0x82,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x10,0xc6,\n  // :/images/down.png\n  0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3,0x58,\n  // :/images/save.png\n  0x0,0x0,0x0,0x48,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5,0xae,\n  // :/images/paste.png\n  0x0,0x0,0x0,0x5e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xa,0x55,\n  // :/images/win/b-5-16.png\n  0x0,0x0,0x4,0x10,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x47,0x7a,\n  // :/images/win/b-1-16.png\n  0x0,0x0,0x3,0x62,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3d,0xd3,\n  // :/images/win/b-5-17.png\n  0x0,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x65,0x26,\n  // :/images/win/b-1-17.png\n  0x0,0x0,0x5,0x6c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5c,0x32,\n  // :/images/win/b-5-18.png\n  0x0,0x0,0x8,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x83,0x80,\n  // :/images/win/b-1-18.png\n  0x0,0x0,0x7,0xa8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x7c,0x88,\n  // :/images/win/b-5-19.png\n  0x0,0x0,0x2,0x84,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x30,0x61,\n  // :/images/win/b-1-19.png\n  0x0,0x0,0x9,0xfa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xa0,0x5f,\n  // :/images/win/b-5-12.png\n  0x0,0x0,0x4,0xf0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x55,0x8f,\n  // :/images/win/b-6-12.png\n  0x0,0x0,0x6,0xac,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6f,0x77,\n  // :/images/win/b-1-12.png\n  0x0,0x0,0x4,0x8c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x50,0x2b,\n  // :/images/win/b-5-13.png\n  0x0,0x0,0x6,0xe0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x71,0xc4,\n  // :/images/win/b-1-13.png\n  0x0,0x0,0x6,0x62,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6b,0x61,\n  // :/images/win/b-5-14.png\n  0x0,0x0,0x8,0xe8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x90,0x30,\n  // :/images/win/b-1-14.png\n  0x0,0x0,0x8,0x86,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x8a,0xdd,\n  // :/images/win/b-5-15.png\n  0x0,0x0,0x3,0x30,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3b,0x5f,\n  // :/images/win/b-1-15.png\n  0x0,0x0,0x2,0xce,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x36,0x68,\n  // :/images/win/b-5-10.png\n  0x0,0x0,0x9,0xc8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x9d,0x54,\n  // :/images/win/b-6-10.png\n  0x0,0x0,0x3,0xf6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x46,0x42,\n  // :/images/win/b-4-10.png\n  0x0,0x0,0x7,0x5e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x79,0x2c,\n  // :/images/win/b-1-10.png\n  0x0,0x0,0x9,0x4a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x96,0x6a,\n  // :/images/win/b-5-11.png\n  0x0,0x0,0x4,0x5a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x4d,0xa3,\n  // :/images/win/b-6-11.png\n  0x0,0x0,0x5,0xe6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x63,0xf6,\n  // :/images/win/b-4-11.png\n  0x0,0x0,0x9,0x7e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x99,0x48,\n  // :/images/win/b-1-11.png\n  0x0,0x0,0x3,0xac,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x42,0xd5,\n  // :/images/win/b-5-22.png\n  0x0,0x0,0x7,0xc2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x7d,0xf1,\n  // :/images/win/b-1-22.png\n  0x0,0x0,0x7,0x44,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x77,0xd5,\n  // :/images/win/b-1-23.png\n  0x0,0x0,0x9,0x64,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x97,0xb0,\n  // :/images/win/b-5-20.png\n  0x0,0x0,0x5,0x22,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x58,0x65,\n  // :/images/win/b-1-20.png\n  0x0,0x0,0x4,0xd6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x54,0x17,\n  // :/images/win/b-5-21.png\n  0x0,0x0,0x7,0x2a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x76,0x85,\n  // :/images/win/b-1-21.png\n  0x0,0x0,0x6,0xc6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x70,0x86,\n  // :/images/win/b-1-1.png\n  0x0,0x0,0x8,0xb8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x8d,0x63,\n  // :/images/win/b-1-2.png\n  0x0,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x38,0xd1,\n  // :/images/win/b-1-3.png\n  0x0,0x0,0x5,0x3c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x59,0xcb,\n  // :/images/win/b-1-4.png\n  0x0,0x0,0x7,0x78,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x7a,0x53,\n  // :/images/win/b-1-5.png\n  0x0,0x0,0x9,0x98,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x9a,0x93,\n  // :/images/win/b-1-6.png\n  0x0,0x0,0x3,0xde,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x44,0xf5,\n  // :/images/win/b-1-7.png\n  0x0,0x0,0x5,0xce,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x62,0x9e,\n  // :/images/win/b-1-8.png\n  0x0,0x0,0x8,0xc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x82,0x43,\n  // :/images/win/b-1-9.png\n  0x0,0x0,0x2,0x6c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x2f,0x6,\n  // :/images/win/b-2-1.png\n  0x0,0x0,0x3,0xc6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x43,0xb8,\n  // :/images/win/b-2-2.png\n  0x0,0x0,0x5,0xb6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x61,0x65,\n  // :/images/win/b-2-3.png\n  0x0,0x0,0x7,0xf4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x80,0xe0,\n  // :/images/win/b-2-4.png\n  0x0,0x0,0x2,0x54,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x2d,0xb1,\n  // :/images/win/b-2-5.png\n  0x0,0x0,0x4,0xbe,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x52,0xcd,\n  // :/images/win/b-2-6.png\n  0x0,0x0,0x6,0x94,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6e,0x20,\n  // :/images/win/b-2-7.png\n  0x0,0x0,0x8,0xd0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x8e,0x87,\n  // :/images/win/b-2-8.png\n  0x0,0x0,0x3,0x18,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3a,0x31,\n  // :/images/win/b-4-1.png\n  0x0,0x0,0x9,0x1a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x92,0xfd,\n  // :/images/win/b-4-2.png\n  0x0,0x0,0x3,0x7c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3e,0xfb,\n  // :/images/win/b-4-3.png\n  0x0,0x0,0x5,0x86,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5d,0x9a,\n  // :/images/win/b-4-4.png\n  0x0,0x0,0x7,0xdc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x7f,0x9a,\n  // :/images/win/b-4-5.png\n  0x0,0x0,0x2,0x3c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x2c,0x60,\n  // :/images/win/b-4-6.png\n  0x0,0x0,0x4,0xa6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x51,0x7e,\n  // :/images/win/b-4-7.png\n  0x0,0x0,0x6,0x7c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6c,0xb7,\n  // :/images/win/b-4-8.png\n  0x0,0x0,0x8,0xa0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x8c,0x10,\n  // :/images/win/b-4-9.png\n  0x0,0x0,0x2,0xe8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x37,0x90,\n  // :/images/win/b-5-1.png\n  0x0,0x0,0x4,0x42,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x4b,0x57,\n  // :/images/win/b-5-2.png\n  0x0,0x0,0x6,0x32,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x68,0x43,\n  // :/images/win/b-5-3.png\n  0x0,0x0,0x8,0x56,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x87,0x51,\n  // :/images/win/b-5-4.png\n  0x0,0x0,0x2,0xb6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x34,0x16,\n  // :/images/win/b-5-5.png\n  0x0,0x0,0x5,0xa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x56,0xf6,\n  // :/images/win/b-5-6.png\n  0x0,0x0,0x7,0x12,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x74,0x82,\n  // :/images/win/b-5-7.png\n  0x0,0x0,0x9,0x32,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x94,0x68,\n  // :/images/win/b-5-8.png\n  0x0,0x0,0x3,0x94,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x40,0x71,\n  // :/images/win/b-5-9.png\n  0x0,0x0,0x5,0x9e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5e,0xff,\n  // :/images/win/b-6-1.png\n  0x0,0x0,0x6,0xfa,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x73,0x2e,\n  // :/images/win/b-6-2.png\n  0x0,0x0,0x9,0x2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x91,0x7f,\n  // :/images/win/b-6-3.png\n  0x0,0x0,0x3,0x4a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x3c,0x73,\n  // :/images/win/b-6-4.png\n  0x0,0x0,0x5,0x54,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x5a,0xfe,\n  // :/images/win/b-6-5.png\n  0x0,0x0,0x7,0x90,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x7b,0x55,\n  // :/images/win/b-6-6.png\n  0x0,0x0,0x9,0xe2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x9f,0x28,\n  // :/images/win/b-6-7.png\n  0x0,0x0,0x4,0x74,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x4e,0xd0,\n  // :/images/win/b-6-8.png\n  0x0,0x0,0x6,0x4a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6a,0x30,\n  // :/images/win/b-6-9.png\n  0x0,0x0,0x8,0x6e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x89,0xaa,\n  // :/images/win/b-7-1.png\n  0x0,0x0,0x9,0xb0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x9b,0xc7,\n  // :/images/win/b-7-2.png\n  0x0,0x0,0x4,0x2a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x48,0xd1,\n  // :/images/win/b-7-3.png\n  0x0,0x0,0x6,0x1a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x66,0x7b,\n  // :/images/win/b-7-4.png\n  0x0,0x0,0x8,0x3e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x85,0x33,\n  // :/images/win/b-7-5.png\n  0x0,0x0,0x2,0x9e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x31,0xb5,\n  // :/images/cur/icon-1-2.png\n  0x0,0x0,0x0,0xd4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1c,0x39,\n  // :/images/cur/icon-1-3.png\n  0x0,0x0,0x1,0x10,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1e,0x21,\n  // :/images/cur/icon-1-4.png\n  0x0,0x0,0x1,0x4c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x20,0x66,\n  // :/images/cur/icon-1-5.png\n  0x0,0x0,0x1,0x6a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x21,0xc5,\n  // :/images/cur/icon-1-1.png\n  0x0,0x0,0x1,0x88,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x22,0xed,\n  // :/images/cur/cur00006.png\n  0x0,0x0,0x0,0x98,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x18,0xe3,\n  // :/images/cur/cur00007.png\n  0x0,0x0,0x0,0xb6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1a,0x7a,\n  // :/images/cur/cur00008.png\n  0x0,0x0,0x0,0xf2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1d,0x56,\n  // :/images/cur/cur00009.png\n  0x0,0x0,0x1,0x2e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1f,0xac,\n  // :/images/cur/cur00001.png\n  0x0,0x0,0x1,0xa6,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x23,0xf2,\n  // :/images/cur/cur00002.png\n  0x0,0x0,0x1,0xc4,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x25,0xbd,\n  // :/images/cur/cur00003.png\n  0x0,0x0,0x1,0xe2,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x27,0x55,\n  // :/images/cur/cur00004.png\n  0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x28,0xdf,\n  // :/images/cur/cur00005.png\n  0x0,0x0,0x2,0x1e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x2a,0x99,\n\n};\n\nQT_BEGIN_NAMESPACE\n\nextern Q_CORE_EXPORT bool qRegisterResourceData\n    (int, const unsigned char *, const unsigned char *, const unsigned char *);\n\nextern Q_CORE_EXPORT bool qUnregisterResourceData\n    (int, const unsigned char *, const unsigned char *, const unsigned char *);\n\nQT_END_NAMESPACE\n\n\nint QT_MANGLE_NAMESPACE(qInitResources_mdi)()\n{\n    QT_PREPEND_NAMESPACE(qRegisterResourceData)\n        (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);\n    return 1;\n}\n\nQ_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_mdi))\n\nint QT_MANGLE_NAMESPACE(qCleanupResources_mdi)()\n{\n    QT_PREPEND_NAMESPACE(qUnregisterResourceData)\n       (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);\n    return 1;\n}\n\nQ_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_mdi))\n\n"
  },
  {
    "path": "depthmapX/renderthread.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include <QtGui>\r\n#include <QEvent>\r\n#include \"mainwindow.h\"\r\n\r\n\r\nCMSCommunicator::CMSCommunicator()\r\n{ \r\n\tm_function = -1;\r\n\r\n    simple_version = true; // we want simple dX // TV\r\n//   GetApp()->m_process_count += 1;\r\n}\r\n\r\nCMSCommunicator::~CMSCommunicator()\r\n{\r\n}\r\n\r\ninline void CMSCommunicator::CommPostMessage(int m, int x) const\r\n{\r\n   QGraphDoc *pDoc = (QGraphDoc *)parent_doc;\r\n   pDoc->ProcPostMessage(m, x);\r\n}\r\n\r\nvoid CMSCommunicator::runAnalysis(QGraphDoc &graphDoc) {\r\n    bool success = m_analysis->run(this);\r\n    if (success) {\r\n        graphDoc.SetUpdateFlag(m_successUpdateFlagType, m_successUpdateFlagModified);\r\n        graphDoc.SetRedrawFlag(m_successRedrawFlagViewType, m_successRedrawFlag, m_successRedrawReason);\r\n    }\r\n}\r\n\r\n//! [0]\r\nRenderThread::RenderThread(QObject *parent)\r\n    : QThread(parent)\r\n{\r\n    abort = false;\r\n}\r\n//! [0]\r\n\r\n//! [1]\r\nRenderThread::~RenderThread()\r\n{\r\n    mutex.lock();\r\n    abort = true;\r\n    condition.wakeOne();\r\n    mutex.unlock();\r\n\r\n    wait();\r\n}\r\n//! [1]\r\n\r\n//! [2]\r\nvoid RenderThread::render(void* Praram)\r\n{\r\n\tm_parent = Praram;\r\n\r\n    if (!isRunning()) {\r\n        start(NormalPriority);\r\n    } else {\r\n        restart = true;\r\n        condition.wakeOne();\r\n    }\r\n}\r\n//! [2]\r\n\r\n//! [3]\r\nvoid RenderThread::run()\r\n{\r\n   QGraphDoc *pDoc = (QGraphDoc *) m_parent;\r\n   CMSCommunicator *comm = pDoc->m_communicator;\r\n   comm->parent_doc = m_parent;\r\n   MainWindow* pMain = (MainWindow*)pDoc->m_mainFrame;\r\n\r\n   if (comm) {\r\n       // move simple setting to comm\r\n       comm->simple_version = pMain->m_simpleVersion;\r\n\r\n      int ok;\r\n      switch (comm->GetFunction()) \r\n\t  {\r\n      case CMSCommunicator::IMPORT:\r\n         ok = pDoc->m_meta_graph->loadLineData( comm, comm->GetOption() );\r\n         if (ok == 1) {\r\n\t\t\t pDoc->modifiedFlag = true;\r\n         }\r\n         else if (ok == -1) {\r\n             emit showWarningMessage(tr(\"Warning\"), tr(\"An error was found in the import file\"));\r\n         }\r\n         // This might change the line layers available, alert the layer chooser:\r\n         QApplication::postEvent(pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)pDoc, QGraphDoc::CONTROLS_LOADDRAWING));\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_TOTAL, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::IMPORTMIF:\r\n         ok = pDoc->m_meta_graph->loadMifMap( comm, comm->getInFileStream(), comm->GetInfile2() );\r\n         switch (ok) {\r\n         case MINFO_MULTIPLE:\r\n             //BUG\r\n            //QMessageBox::warning(0, tr(\"Warning\"), tr(\"The imported MIF file contains multiple shapes per object.\\n Please note that depthmapX has broken these up, so each shape has one row of attribute data.\\n Please consult your MapInfo provider for details.\"), QMessageBox::Ok, QMessageBox::Ok);\r\n        case MINFO_OK:\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n            break;\r\n         case MINFO_HEADER:\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"depthmapX had a problem reading the header information in your MIF file.\"));\r\n            break;\r\n         case MINFO_TABLE:\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"depthmapX had a problem reading the table data in your MID file.\"));\r\n            break;\r\n         case MINFO_MIFPARSE:\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"depthmapX had a problem reading the shape data in your MIF file.\\n\\\r\n                                        Please ensure that your shape data contains only points, lines, polylines or regions.\"));\r\n            break;\r\n         case MINFO_OBJROWS:\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"depthmapX had a problem reading the shape data in your MIF file.\\n\\\r\n\t\t\t\t\t\t\t\t\tIt seems as though there are a different number of shapes to rows in the associated table.\\n\\\r\n                                    This may be due to the existance of unsupported shape types in the file.\"));\r\n            break;\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_TOTAL, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEPOINTS:\r\n         ok = pDoc->m_meta_graph->makePoints( comm->GetSeedPoint(), comm->GetOption(), comm );\r\n         if (ok) {\r\n\t\t\t pDoc->modifiedFlag = true;\r\n         }\r\n         QApplication::postEvent(pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)pDoc, QGraphDoc::CONTROLS_LOADGRAPH));\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEGRAPH:\r\n         ok = pDoc->m_meta_graph->makeGraph( comm, pDoc->m_make_algorithm, pDoc->m_make_maxdist );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::ANALYSEGRAPH:\r\n         ok = pDoc->m_meta_graph->analyseGraph( comm, pMain->m_options, comm->simple_version);\r\n         pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEISOVIST:\r\n         if (comm->GetSeedAngle() == -1.0) {\r\n            ok = pDoc->m_meta_graph->makeIsovist( comm, comm->GetSeedPoint(), 0, 0, comm->simple_version );\r\n         }\r\n         else {\r\n            double ang1 = comm->GetSeedAngle() - comm->GetSeedFoV() * 0.5;\r\n            double ang2 = comm->GetSeedAngle() + comm->GetSeedFoV() * 0.5;\r\n            if (ang1 < 0.0) \r\n               ang1 += 2.0 * M_PI;\r\n            if (ang2 > 2.0 * M_PI)\r\n               ang2 -= 2.0 * M_PI;\r\n            ok = pDoc->m_meta_graph->makeIsovist( comm, comm->GetSeedPoint(), ang1, ang2, comm->simple_version );\r\n         }\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         // Tell the sidebar about the new map:\r\n         QApplication::postEvent(pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)pDoc, QGraphDoc::CONTROLS_LOADGRAPH));\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEISOVISTSFROMFILE: {\r\n\r\n          try {\r\n              auto isovists = EntityParsing::parseIsovists(comm->GetInfile2(), ',');\r\n              comm->CommPostMessage(Communicator::NUM_STEPS, isovists.size());\r\n              int isovistIdx = 1;\r\n              for (IsovistDefinition &isovist : isovists) {\r\n                  comm->CommPostMessage(Communicator::CURRENT_STEP, isovistIdx);\r\n                  pDoc->m_meta_graph->makeIsovist(comm, isovist.getLocation(), isovist.getLeftAngle(),\r\n                                                  isovist.getRightAngle(), comm->simple_version);\r\n                  isovistIdx++;\r\n              }\r\n\r\n              pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n              // Tell the sidebar about the new map:\r\n              QApplication::postEvent(\r\n                  pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void *)pDoc, QGraphDoc::CONTROLS_LOADGRAPH));\r\n              pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n\r\n          } catch (EntityParsing::EntityParseException &e) {\r\n              emit showWarningMessage(tr(\"Warning\"),\r\n                                      tr(\"depthmapX was unable to parse the isovists test file. Error: %1\")\r\n                                          .arg(QString::fromStdString(e.what())));\r\n          }\r\n          break;\r\n      }\r\n\r\n      case CMSCommunicator::MAKEISOVISTPATH:\r\n         // the graph is going to build this path from a selection in a data map:\r\n         // a data map must be topmost with lines or polylines selected\r\n         // linedata must be displayed as per usual\r\n         ok = pDoc->m_meta_graph->makeIsovistPath( comm, comm->GetSeedAngle(), comm->simple_version );\r\n\r\n         // Tell the sidebar about the new map:\r\n         QApplication::postEvent(pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)pDoc, QGraphDoc::CONTROLS_LOADGRAPH));\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEALLLINEMAP:\r\n         ok = pDoc->m_meta_graph->makeAllLineMap( comm, comm->GetSeedPoint() );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         // Tell the sidebar about the new map:\r\n         QApplication::postEvent(pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)pDoc, QGraphDoc::CONTROLS_LOADGRAPH));\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEFEWESTLINEMAP:\r\n         ok = pDoc->m_meta_graph->makeFewestLineMap( comm, comm->GetOption() );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEDRAWING: {\r\n         // option 1 is: 0 a data map, 1 an axial map\r\n         ok = pDoc->m_meta_graph->convertToDrawing( comm, comm->GetString().toStdString(), (comm->GetOption(1) == 0));\r\n         if (ok) {\r\n\t\t\t pDoc->modifiedFlag = true;\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No objects currently visible in drawing layers\"));\r\n         }\r\n         // Tell the sidebar about the new map:\r\n         QApplication::postEvent(pMain, new QmyEvent((enum QEvent::Type)FOCUSGRAPH, (void*)pDoc, QGraphDoc::CONTROLS_LOADDRAWING));\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_TOTAL, QGraphDoc::NEW_DATA );\r\n         break;\r\n      }\r\n      case CMSCommunicator::MAKEUSERMAP:\r\n         ok = pDoc->m_meta_graph->convertDrawingToAxial( comm, comm->GetString().toStdString());\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No objects currently visible in drawing layers\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEUSERMAPSHAPE:\r\n         ok = pDoc->m_meta_graph->convertDataToAxial( comm, comm->GetString().toStdString(), (comm->GetOption(0) == 1), (comm->GetOption(1) == 1) );\r\n         if (ok) {\r\n            if (comm->GetOption(0) == 0) {\r\n               // note: there is both a new table and a deleted table, but deleted table leads to a greater redraw:\r\n               pDoc->SetUpdateFlag(QGraphDoc::DELETED_TABLE);\r\n            }\r\n            else {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n            }\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No lines available in current layer to convert to axial lines\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEUSERSEGMAP:\r\n         ok = pDoc->m_meta_graph->convertDrawingToSegment( comm, comm->GetString().toStdString() );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No objects currently visible in drawing layers\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::MAKEUSERSEGMAPSHAPE:\r\n         ok = pDoc->m_meta_graph->convertDataToSegment( comm, comm->GetString().toStdString(), (comm->GetOption(0) == 1), (comm->GetOption(1) == 1) );\r\n         if (ok) {\r\n            if (comm->GetOption(0) == 0) {\r\n               // note: there is both a new table and a deleted table, but deleted table leads to a greater redraw:\r\n               pDoc->SetUpdateFlag(QGraphDoc::DELETED_TABLE);\r\n            }\r\n            else {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n            }\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No lines available in current layer to convert to segments\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n      \r\n      case CMSCommunicator::MAKEGATESMAP: {\r\n         // note: relies on the fact that make data map from drawing sets option 1 to -1, whereas make data layer from graph it to either 0 or 1\r\n         int shapeMapType = ShapeMap::DRAWINGMAP;\r\n         bool copydata = false;\r\n         if(comm->GetOption(1) != -1) {\r\n             shapeMapType = ShapeMap::DATAMAP;\r\n             copydata = (comm->GetOption(1) != 0);\r\n         }\r\n         ok = pDoc->m_meta_graph->convertToData( comm, comm->GetString().toStdString(), (comm->GetOption(0) == 1), shapeMapType, copydata );\r\n         if (ok) {\r\n            if (comm->GetOption(0) == 0) {\r\n               // note: there is both a new table and a deleted table, but deleted table leads to a greater redraw:\r\n               pDoc->SetUpdateFlag(QGraphDoc::DELETED_TABLE);\r\n            }\r\n            else {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n            }\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No objects currently visible in drawing layers\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n      }\r\n      case CMSCommunicator::MAKECONVEXMAP: {\r\n         // note: relies on the fact that make convex map from drawing sets option 1 to -1, whereas make convex map from data sets it to either 0 or 1\r\n         int shapeMapType = ShapeMap::DRAWINGMAP;\r\n         bool copydata = false;\r\n         if(comm->GetOption(1) != -1) {\r\n             shapeMapType = ShapeMap::DATAMAP;\r\n             copydata = (comm->GetOption(1) != 0);\r\n         }\r\n         ok = pDoc->m_meta_graph->convertToConvex( comm, comm->GetString().toStdString(), (comm->GetOption(0) == 1),  shapeMapType, copydata);\r\n         if (ok) {\r\n            if (comm->GetOption(0) == 0) {\r\n               // note: there is both a new table and a deleted table, but deleted table leads to a greater redraw:\r\n               pDoc->SetUpdateFlag(QGraphDoc::DELETED_TABLE);\r\n            }\r\n            else {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n            }\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No polygons currently visible in drawing layers\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n      }\r\n      case CMSCommunicator::MAKEBOUNDARYMAP:\r\n         break;\r\n\r\n      case CMSCommunicator::MAKESEGMENTMAP:\r\n         // convert percentage to fraction, and pass to metagraph\r\n         ok = pDoc->m_meta_graph->convertAxialToSegment( comm, comm->GetString().toStdString(), (comm->GetOption(0) == 1), (comm->GetOption(1) == 1), double(comm->GetOption(2)) / 100.0);\r\n         if (ok) {\r\n            if (comm->GetOption(0) == 0) {\r\n               // note: there is both a new table and a deleted table, but deleted table leads to a greater redraw:\r\n               pDoc->SetUpdateFlag(QGraphDoc::DELETED_TABLE);\r\n            }\r\n            else {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n            }\r\n         }\r\n         else {\r\n            emit showWarningMessage(tr(\"Warning\"), tr(\"No lines exist in map to convert to segments\"));\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::AXIALANALYSIS:\r\n         ok = pDoc->m_meta_graph->analyseAxial( comm, pMain->m_options, comm->simple_version );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::SEGMENTANALYSISTULIP:\r\n         ok = pDoc->m_meta_graph->analyseSegmentsTulip( comm, pMain->m_options );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::SEGMENTANALYSISANGULAR:\r\n         ok = pDoc->m_meta_graph->analyseSegmentsAngular( comm, pMain->m_options );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::TOPOMETANALYSIS:\r\n         ok = pDoc->m_meta_graph->analyseTopoMet( comm, pMain->m_options );\r\n         if (ok) {\r\n            pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n         }\r\n         pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n         break;\r\n\r\n      case CMSCommunicator::POINTDEPTH:\r\n         {\r\n            // Set up for options step depth selection\r\n            Options options;\r\n            options.global = 0;\r\n            options.point_depth_selection = 1;\r\n            \r\n            ok = pDoc->m_meta_graph->analyseGraph( comm, options, comm->simple_version);\r\n            if (ok) {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n            }\r\n            pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DATA );\r\n         }\r\n         break;     \r\n\r\n      case CMSCommunicator::METRICPOINTDEPTH:\r\n         {\r\n            // Set up for options metric point depth selection\r\n            Options options;\r\n            options.global = 0;\r\n            options.point_depth_selection = 2;\r\n\r\n            ok = pDoc->m_meta_graph->analyseGraph( comm, options, comm->simple_version );\r\n            if (ok) {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n            }\r\n            pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DATA );\r\n         }\r\n         break;\r\n\r\n      case CMSCommunicator::ANGULARPOINTDEPTH:\r\n         {\r\n            // Set up for options angular point depth selection\r\n            Options options;\r\n            options.global = 0;\r\n            options.point_depth_selection = 3;\r\n\r\n            ok = pDoc->m_meta_graph->analyseGraph( comm, options, comm->simple_version );\r\n            if (ok) {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n            }\r\n            pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DATA );\r\n         }\r\n         break;\r\n\r\n      case CMSCommunicator::TOPOLOGICALPOINTDEPTH:\r\n         {\r\n            // Set up for options topological point depth selection (segment maps only)\r\n            Options options;\r\n            options.global = 0;\r\n            options.point_depth_selection = 4;\r\n\r\n            ok = pDoc->m_meta_graph->analyseGraph( comm, options, comm->simple_version);\r\n            if (ok) {\r\n               pDoc->SetUpdateFlag(QGraphDoc::NEW_DATA);\r\n            }\r\n            pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DATA );\r\n         }\r\n         break;\r\n\r\n      case CMSCommunicator::AGENTANALYSIS:\r\n         {\r\n            try {\r\n              pDoc->m_meta_graph->runAgentEngine( comm );\r\n              pDoc->SetUpdateFlag(QGraphDoc::NEW_TABLE);\r\n              pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DATA );\r\n            } catch (depthmapX::PointMapException const & e) {\r\n              emit runtimeExceptionThrown(e.getErrorType(), e.what());\r\n          }\r\n         }\r\n         break;\r\n      case CMSCommunicator::FROMCONNECTOR:\r\n        {\r\n          comm->runAnalysis(*pDoc);\r\n          break;\r\n        }\r\n      }\r\n\r\n      emit closeWaitDialog();\r\n\t  msleep(100);\r\n      delete pDoc->m_communicator;     // Ensure we delete *the* communicator\r\n      pDoc->m_communicator = NULL;\r\n      // REDRAW_TOTAL to REDRAW_GRAPH // recenterView after fill // TV\r\n      pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA );\r\n   }\r\n   return;\r\n}\r\n"
  },
  {
    "path": "depthmapX/resource.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>images/new.png</file>\n        <file>images/open.png</file>\n        <file>images/save.png</file>\n        <file>images/paste.png</file>\n        <file>images/down.png</file>\n        <file>images/win/b-1-1.png</file>\n        <file>images/win/b-1-2.png</file>\n        <file>images/win/b-1-3.png</file>\n        <file>images/win/b-1-4.png</file>\n        <file>images/win/b-1-5.png</file>\n        <file>images/win/b-1-6.png</file>\n        <file>images/win/b-1-7.png</file>\n        <file>images/win/b-1-8.png</file>\n        <file>images/win/b-1-9.png</file>\n        <file>images/win/b-1-10.png</file>\n        <file>images/win/b-1-11.png</file>\n        <file>images/win/b-1-12.png</file>\n        <file>images/win/b-1-13.png</file>\n        <file>images/win/b-1-14.png</file>\n        <file>images/win/b-1-15.png</file>\n        <file>images/win/b-1-16.png</file>\n        <file>images/win/b-1-17.png</file>\n        <file>images/win/b-1-18.png</file>\n        <file>images/win/b-1-19.png</file>\n        <file>images/win/b-1-20.png</file>\n        <file>images/win/b-1-21.png</file>\n        <file>images/win/b-1-22.png</file>\n        <file>images/win/b-1-23.png</file>\n        <file>images/win/b-2-1.png</file>\n        <file>images/win/b-2-2.png</file>\n        <file>images/win/b-2-3.png</file>\n        <file>images/win/b-2-4.png</file>\n        <file>images/win/b-2-5.png</file>\n        <file>images/win/b-2-6.png</file>\n        <file>images/win/b-2-7.png</file>\n        <file>images/win/b-2-8.png</file>\n        <file>images/win/b-4-1.png</file>\n        <file>images/win/b-4-2.png</file>\n        <file>images/win/b-4-3.png</file>\n        <file>images/win/b-4-4.png</file>\n        <file>images/win/b-4-5.png</file>\n        <file>images/win/b-4-6.png</file>\n        <file>images/win/b-4-7.png</file>\n        <file>images/win/b-4-8.png</file>\n        <file>images/win/b-4-9.png</file>\n        <file>images/win/b-4-10.png</file>\n        <file>images/win/b-4-11.png</file>\n        <file>images/win/b-5-1.png</file>\n        <file>images/win/b-5-2.png</file>\n        <file>images/win/b-5-3.png</file>\n        <file>images/win/b-5-4.png</file>\n        <file>images/win/b-5-5.png</file>\n        <file>images/win/b-5-6.png</file>\n        <file>images/win/b-5-7.png</file>\n        <file>images/win/b-5-8.png</file>\n        <file>images/win/b-5-9.png</file>\n        <file>images/win/b-5-10.png</file>\n        <file>images/win/b-5-11.png</file>\n        <file>images/win/b-5-12.png</file>\n        <file>images/win/b-5-13.png</file>\n        <file>images/win/b-5-14.png</file>\n        <file>images/win/b-5-15.png</file>\n        <file>images/win/b-5-16.png</file>\n        <file>images/win/b-5-17.png</file>\n        <file>images/win/b-5-18.png</file>\n        <file>images/win/b-5-19.png</file>\n        <file>images/win/b-5-20.png</file>\n        <file>images/win/b-5-21.png</file>\n        <file>images/win/b-5-22.png</file>\n        <file>images/win/b-6-1.png</file>\n        <file>images/win/b-6-2.png</file>\n        <file>images/win/b-6-3.png</file>\n        <file>images/win/b-6-4.png</file>\n        <file>images/win/b-6-5.png</file>\n        <file>images/win/b-6-6.png</file>\n        <file>images/win/b-6-7.png</file>\n        <file>images/win/b-6-8.png</file>\n        <file>images/win/b-6-9.png</file>\n        <file>images/win/b-6-10.png</file>\n        <file>images/win/b-6-11.png</file>\n        <file>images/win/b-6-12.png</file>\n        <file>images/win/b-7-1.png</file>\n        <file>images/win/b-7-2.png</file>\n        <file>images/win/b-7-3.png</file>\n        <file>images/win/b-7-4.png</file>\n        <file>images/win/b-7-5.png</file>\n        <file>images/cur/cur00001.png</file>\n        <file>images/cur/cur00002.png</file>\n        <file>images/cur/cur00003.png</file>\n        <file>images/cur/cur00004.png</file>\n        <file>images/cur/cur00005.png</file>\n        <file>images/cur/cur00006.png</file>\n        <file>images/cur/cur00007.png</file>\n        <file>images/cur/cur00008.png</file>\n        <file>images/cur/cur00009.png</file>\n        <file>images/cur/icon-1-1.png</file>\n        <file>images/cur/icon-1-2.png</file>\n        <file>images/cur/icon-1-3.png</file>\n        <file>images/cur/icon-1-4.png</file>\n        <file>images/cur/icon-1-5.png</file>\n        <file>images/depthmapX.png</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "depthmapX/resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>depthmapX</string>\n\t<key>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeExtensions</key>\n\t\t\t<array>\n\t\t\t\t<string>graph</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeIconFile</key>\n\t\t\t<string>graph.icns</string>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>Graph File</string>\n\t\t\t<key>CFBundleTypeOSTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>graph</string>\n\t\t\t</array>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>NSDocumentClass</key>\n\t\t\t<string>GraphDocument</string>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>depthmapX</string>\n\t<key>CFBundleIconFile</key>\n\t<string>depthmapX.icns</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.spacegroupucl.depthmapX</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>depthmapX</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>MacOSX</string>\n\t</array>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.business</string>\n\t<key>LSHasLocalizedDisplayName</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>depthmapXApplication</string>\n\t<key>UTExportedTypeDeclarations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>UTTypeConformsTo</key>\n\t\t\t<string>public.data</string>\n\t\t\t<key>UTTypeDescription</key>\n\t\t\t<string>Graph File</string>\n\t\t\t<key>UTTypeIdentifier</key>\n\t\t\t<string>com.spacegroupucl.graph</string>\n\t\t\t<key>UTTypeTagSpecification</key>\n\t\t\t<dict>\n\t\t\t\t<key>com.apple.ostype</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>GRAPH</string>\n\t\t\t\t</array>\n\t\t\t\t<key>public.filename-extension</key>\n\t\t\t\t<string>graph</string>\n\t\t\t\t<key>public.mime-type</key>\n\t\t\t\t<string>application/graph</string>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "depthmapX/settings.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <QString>\n#include <QSettings>\n#include <memory>\n\n\n/**\n * Tags for settings to be used when reading writing settings. Don't just use\n * string literals\n */\nnamespace SettingTag\n{\n    const QString position = \"pos\";\n    const QString size = \"size\";\n    const QString foregroundColour = \"forColor\";\n    const QString backgroundColour = \"backColor\";\n    const QString antialiasingSamples = \"antialisingSamples\";\n    const QString simpleVersion = \"simple\";\n    const QString recentFileList = \"recentFileList\";\n    const QString mwMaximised = \"mainWindowMaximised\";\n    const QString licenseAccepted = \"licenseAccepted\";\n    const QString depthmapViewSize = \"depthmapViewSize\";\n    const QString legacyMapWindow = \"legacyMapWindow\";\n    const QString highlightOnHover = \"highlightOnHover\";\n}\n\n/**\n * @brief Class encapsulating one settings transaction\n * This is supposed to use one underlying QSettings object for several reads/writes\n */\nclass SettingsTransaction\n{\npublic:\n    virtual const QVariant readSetting( const QString& tag, const QVariant& defaultValue = QVariant()) const = 0;\n    virtual void writeSetting( const QString& tag, const QVariant& value) = 0;\n    virtual ~SettingsTransaction(){}\n};\n\n/**\n * @brief The Settings class\n * Encapsulates reading/writing settings so we don't have to faff around with constructing QSettings in\n * 7 different location. The read/write methods on this class create a temporary QSettings object, so\n * if you want to read/write more than one setting in one go, use a transaction.\n */\nclass Settings : public SettingsTransaction\n{\npublic:\n    virtual std::unique_ptr<SettingsTransaction> getTransaction() = 0;\n};\n"
  },
  {
    "path": "depthmapX/settingsimpl.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"settingsimpl.h\"\n\nSettingsImpl::SettingsImpl(QSettingsFactory* factory) : mSettingsFactory(factory)\n{\n\n}\n\n\nconst QVariant SettingsImpl::readSetting(const QString &tag, const QVariant &defaultValue) const\n{\n    auto settings = mSettingsFactory->getSettings();\n    return settings->value(tag, defaultValue);\n}\n\nvoid SettingsImpl::writeSetting(const QString &tag, const QVariant &value)\n{\n    auto settings = mSettingsFactory->getSettings();\n    settings->setValue(tag, value);\n}\n\nclass SettingsTransactionImpl : public SettingsTransaction\n{\npublic:\n    SettingsTransactionImpl(std::unique_ptr<QSettings> &&settings) : mSettings(std::move(settings))\n    {}\n    virtual const QVariant readSetting(const QString &tag, const QVariant &defaultValue) const\n    {\n        return mSettings->value(tag, defaultValue);\n    }\n    virtual void writeSetting(const QString &tag, const QVariant &value)\n    {\n        mSettings->setValue(tag, value);\n    }\n\nprivate:\n    std::unique_ptr<QSettings> mSettings;\n};\n\nstd::unique_ptr<SettingsTransaction> SettingsImpl::getTransaction()\n{\n    return std::unique_ptr<SettingsTransaction>(new SettingsTransactionImpl(mSettingsFactory->getSettings()));\n}\n"
  },
  {
    "path": "depthmapX/settingsimpl.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#pragma once\n#include \"settings.h\"\n#include <qsettings.h>\n#include <qstandardpaths.h>\n#include <memory>\n\nclass QSettingsFactory\n{\npublic:\n    virtual std::unique_ptr<QSettings> getSettings() const = 0;\n    virtual ~QSettingsFactory() {}\n};\n\nclass DefaultSettingsFactory : public QSettingsFactory\n{\npublic:\n    DefaultSettingsFactory()\n    {\n        m_settingsFile = QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation).first() +  \"/depthmapXsettings.ini\";\n    }\n\n    // QSettingsFactory interface\npublic:\n    virtual std::unique_ptr<QSettings> getSettings() const\n    {\n        return std::unique_ptr<QSettings>(new QSettings(m_settingsFile, QSettings::IniFormat));\n    }\n\nprivate:\n    QString m_settingsFile;\n};\n\nclass SettingsImpl : public Settings\n{\npublic:\n    SettingsImpl(QSettingsFactory *settingsFactory);\n\n    // SettingsTransaction interface\npublic:\n    virtual const QVariant readSetting(const QString &tag, const QVariant &defaultValue) const;\n    virtual void writeSetting(const QString &tag, const QVariant &value);\n\n    // Settings interface\n    virtual std::unique_ptr<SettingsTransaction> getTransaction();\n\nprivate:\n    std::unique_ptr<QSettingsFactory> mSettingsFactory;\n\n};\n"
  },
  {
    "path": "depthmapX/treeWindow.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include <QtCore/QEvent>\r\n#include <QtCore/QDebug>\r\n\r\n#include <QtWidgets/QMenu>\r\n#include <QtWidgets/QLayout>\r\n#include <QtGui/QKeyEvent>\r\n#include <QtWidgets/QMessageBox>\r\n#include <QtWidgets/QHeaderView>\r\n#include <QtWidgets/QTreeWidgetItem>\r\n#include <QtGui/QFocusEvent>\r\n\r\n#include \"treeWindow.h\"\r\n\r\nQT_BEGIN_NAMESPACE\r\n\r\nIndexWidget::IndexWidget(QWidget *parent)\r\n    : QTreeWidget(parent)\r\n{\r\n    setColumnCount(2);\r\n    setHeaderLabels(columnNames);\r\n    header()->setSectionResizeMode(Column::MAP, QHeaderView::Stretch);\r\n    header()->setSectionResizeMode(Column::EDITABLE, QHeaderView::ResizeToContents);\r\n    header()->resizeSection(Column::EDITABLE, 10);\r\n    header()->setStretchLastSection(false);\r\n\r\n    installEventFilter(this);\r\n    setContextMenuPolicy(Qt::CustomContextMenu);\r\n\r\n    connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), parent,\r\n        SLOT(OnSelchangingTree(QTreeWidgetItem*, int)));\r\n}\r\n\r\nvoid IndexWidget::removeAllItem(QTreeWidgetItem *start)\r\n{\r\n    int index;\r\n    QTreeWidgetItem *currentItem = start;\r\n    if(currentItem)\r\n\t{\r\n        QTreeWidgetItem *parent = currentItem->parent();\r\n        if (parent) {\r\n            index = parent->indexOfChild(currentItem);\r\n            delete parent->takeChild(index);\r\n        } else {\r\n            index = indexOfTopLevelItem(currentItem);\r\n            delete takeTopLevelItem(index);\r\n        }\r\n    }\r\n}\r\n\r\nQTreeWidgetItem * IndexWidget::addNewItem(const QString &title, QTreeWidgetItem* parent)\r\n{\r\n    QTreeWidgetItem *newItem = 0;\r\n\r\n    QStringList columnStrings(title);\r\n    if (parent != NULL) {\r\n        newItem = new QTreeWidgetItem(parent, columnStrings);\r\n    } else {\r\n        newItem = new QTreeWidgetItem(this, columnStrings);\r\n    }\r\n\r\n    setCurrentItem(newItem);\r\n    newItem->setFlags(newItem->flags() &~ (Qt::ItemIsEditable | Qt::ItemIsSelectable));\r\n\treturn newItem;\r\n}\r\n\r\n\r\nQT_END_NAMESPACE\r\n"
  },
  {
    "path": "depthmapX/treeWindow.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef indexWidget_H\r\n#define indexWidget_H\r\n\r\n#include <QTreeWidget>\r\n\r\nQT_BEGIN_NAMESPACE\r\n\r\nclass QEvent;\r\nclass QTreeWidgetItem;\r\n\r\nclass IndexWidget : public QTreeWidget\r\n{\r\n    Q_OBJECT\r\nprivate:\r\n    enum Column {MAP = 0, EDITABLE = 1};\r\n\r\npublic:\r\n    IndexWidget(QWidget *parent = 0);\r\n\r\n    QString m_mapColumn = \"Map\";\r\n    QString m_editableColumn = \"Editable\";\r\n\r\n    void setItemVisibility(QTreeWidgetItem* item, Qt::CheckState checkState) {\r\n        item->setCheckState(Column::MAP, checkState);\r\n    }\r\n    void setItemEditability(QTreeWidgetItem* item, Qt::CheckState checkState) {\r\n        item->setCheckState(Column::EDITABLE, checkState);\r\n    }\r\n    void setItemReadOnly(QTreeWidgetItem* item) {\r\n        item->setData(Column::EDITABLE, Qt::CheckStateRole, QVariant());\r\n    }\r\n    bool isItemSetVisible(QTreeWidgetItem* item) {\r\n        return item->checkState(Column::MAP);\r\n    }\r\n    bool isItemSetEditable(QTreeWidgetItem* item) {\r\n        return item->checkState(Column::EDITABLE);\r\n    }\r\n    bool isMapColumn(int col) {\r\n        return col == Column::MAP;\r\n    }\r\n    bool isEditableColumn(int col) {\r\n        return col == Column::EDITABLE;\r\n    }\r\n\r\nsignals:\r\n    void requestShowLink(const QUrl& url);\r\n\r\npublic slots:\r\n    void removeAllItem(QTreeWidgetItem *start);\r\n    QTreeWidgetItem * addNewItem(const QString& title, QTreeWidgetItem *parent = NULL);\r\n\r\nprivate:\r\n    QStringList columnNames = (QStringList()\r\n                               << m_mapColumn\r\n                               << m_editableColumn);\r\n};\r\n\r\nQT_END_NAMESPACE\r\n\r\n#endif  // BOOKMARK_WIDGET_H\r\n"
  },
  {
    "path": "depthmapX/views/3dview/3dview.cpp",
    "content": "// depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"3dview.h\"\r\n\r\n#include \"depthmapX/mainwindow.h\"\r\n\r\n#include \"genlib/xmlparse.h\"\r\n\r\n#include <QTimer>\r\n#include <QtGui>\r\n#include <QtOpenGL>\r\n#include <QtWidgets/QFileDialog>\r\n\r\n#ifdef __APPLE__\r\n#include <OpenGL/gl.h>\r\n#include <OpenGL/glu.h>\r\n#else\r\n#include <GL/gl.h>\r\n#include <GL/glu.h>\r\n#endif\r\n\r\n#include \"glureimpl.h\"\r\n\r\n#ifndef _WIN32 // Not working?\r\n#define LOBYTE(w) ((unsigned char)((w)&0xff))\r\n#define GetRValue(rgb) (LOBYTE(rgb))\r\n#define GetGValue(rgb) (LOBYTE((rgb) >> 8))\r\n#define GetBValue(rgb) (LOBYTE((rgb) >> 16))\r\n#else\r\n#define finite _finite\r\n#endif\r\n\r\n#define ID_ADD_AGENT 32947\r\n#define ID_3D_PAN 32948\r\n#define ID_3D_ZOOM 32949\r\n#define ID_3D_ROT 32950\r\n#define ID_3D_PAUSE 32951\r\n#define ID_3D_PLAY_LOOP 32981\r\n#define ID_3D_FILLED 32983\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Q3DView\r\n\r\nQ3DView::Q3DView(QWidget *parent, QGraphDoc *doc) : QOpenGLWidget(parent) {\r\n    m_points = NULL;\r\n    m_pointcount = 0;\r\n    m_mouse_mode = ID_3D_ROT; // resouce\r\n    m_mouse_mode_on = 0;\r\n    m_key_mode_on = 0;\r\n    m_quick_draw = false;\r\n    m_animating = false;\r\n    m_drawtrails = false;\r\n    m_fill = true;\r\n    m_track = 0.0;\r\n    m_right_mouse = false;\r\n\r\n    // Quick mod - TV\r\n    m_panx = m_pany = m_rotx = m_roty = 0.0f;\r\n    m_zoom = 1.0f;\r\n    m_roty = 60.0f;\r\n    QTimer *m_Timer = new QTimer(this);\r\n    connect(m_Timer, SIGNAL(timeout()), this, SLOT(timerSlot()));\r\n    setWindowIcon(QIcon(tr(\":/images/cur/icon-1-3.png\")));\r\n    pDoc = doc;\r\n    setWindowTitle(pDoc->m_base_title + \":3D View\");\r\n    m_Timer->start(20);\r\n    grabKeyboard();\r\n    pDoc->m_redraw_flag[QGraphDoc::VIEW_3D] = QGraphDoc::REDRAW_TOTAL;\r\n    OnRedraw(0, 0);\r\n    setMouseTracking(true);\r\n}\r\n\r\nQ3DView::~Q3DView() {\r\n    // Quick mod - TV\r\n    releaseKeyboard();\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Q3DView drawing\r\n// void Q3DView::paintEvent(QPaintEvent *event)\r\nvoid Q3DView::paintGL() {\r\n    OnRedraw(0, 0);\r\n    DrawScene();\r\n}\r\n\r\nint Q3DView::OnRedraw(int wParam, int lParam) {\r\n    int flag = pDoc->GetRedrawFlag(QGraphDoc::VIEW_3D);\r\n    if (flag != QGraphDoc::REDRAW_DONE) {\r\n        //\r\n        while (!pDoc->SetRedrawFlag(QGraphDoc::VIEW_3D, QGraphDoc::REDRAW_DONE)) {\r\n            // prefer waitformultipleobjects here\r\n            // sleep(1);\r\n        }\r\n        //\r\n        if (flag == QGraphDoc::REDRAW_TOTAL) {\r\n            qWarning(\"Reload\\n\");\r\n            ReloadLineData();\r\n            ReloadPointData();\r\n            m_quick_draw = false;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Q3DView message handlers\r\n\r\nvoid Q3DView::timerEvent(QTimerEvent *event) {\r\n    if (m_mouse_mode == ID_3D_PLAY_LOOP) {\r\n        PlayLoop();\r\n        SetModelMat();\r\n        m_quick_draw = true;\r\n        if (!m_animating) { // if animating will redraw below\r\n            DrawScene();\r\n        }\r\n        update();\r\n    } else if (m_key_mode_on) {\r\n        QSize diff(0, 0);\r\n        switch (m_keydown) {\r\n        /*case 37:*/ case Qt::Key_Left:\r\n            diff.setWidth(-2);\r\n            break;\r\n        /*case 38:*/ case Qt::Key_Up:\r\n            diff.setHeight(-2);\r\n            break; // up arrow: note, as per MS reversed y\r\n        /*case 39:*/ case Qt::Key_Right:\r\n            diff.setWidth(2);\r\n            break;\r\n        /*case 40:*/ case Qt::Key_Down:\r\n            diff.setHeight(2);\r\n        }\r\n        switch (m_key_mode_on) {\r\n        case ID_3D_ROT:\r\n            Rot(diff);\r\n            break;\r\n        case ID_3D_PAN:\r\n            Pan(diff);\r\n            break;\r\n        case ID_3D_ZOOM:\r\n            Zoom(diff);\r\n            break;\r\n        }\r\n        SetModelMat();\r\n        m_quick_draw = true;\r\n        if (!m_animating) { // if animating will redraw below\r\n            DrawScene();\r\n        }\r\n    }\r\n\r\n    if (m_animating && !pDoc->m_communicator && pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessedPoints()) {\r\n        PointMap &pointmap = pDoc->m_meta_graph->getDisplayedPointMap();\r\n        m_animating = false;\r\n        for (size_t i = 0; i < m_mannequins.size(); i++) {\r\n            m_mannequins[i].frame();\r\n            if (m_mannequins[i].m_frame == 0) {\r\n                if (m_mannequins[i].m_playback) {\r\n                    int j = m_mannequins[i].m_trace_id;\r\n                    Trace &trace = m_traces[j];\r\n                    if (m_mannequins[i].m_time >= trace.starttime && m_mannequins[i].m_time <= trace.endtime) {\r\n                        // active zone:\r\n                        m_mannequins[i].m_active = true;\r\n                        size_t k = 0;\r\n                        while (k < m_traces[j].events.size() && m_traces[j].events[k].t < m_mannequins[i].m_time) {\r\n                            k++;\r\n                        }\r\n                        if (k < m_traces[j].events.size()) {\r\n                            Point2f p = (Point2f)m_traces[j].events[k];\r\n                            PixelRef pix = pointmap.pixelate(p); // note, take the pix before you scale!\r\n                            p.normalScale(m_region);\r\n                            m_mannequins[i].advance(p);\r\n                            auto iter = m_pixels.find(pix);\r\n                            if (iter != m_pixels.end()) {\r\n                                if (iter->second.m_value < 10) {\r\n                                    iter->second.m_value += 1;\r\n                                }\r\n                            }\r\n                        }\r\n                    } else {\r\n                        m_mannequins[i].m_active = false;\r\n                    }\r\n                } else {\r\n                    int j = m_mannequins[i].m_agent_id;\r\n                    m_agents[j].onMove();\r\n                    Point2f p = m_agents[j].getLocation();\r\n                    p.normalScale(m_region);\r\n                    m_mannequins[i].advance(p);\r\n                    //\r\n                    // pretty coloured pixels\r\n                    PixelRef pix = m_agents[j].getNode();\r\n                    auto iter = m_pixels.find(pix);\r\n                    if (iter != m_pixels.end()) {\r\n                        if (iter->second.m_value < 10) {\r\n                            iter->second.m_value += 1;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        m_animating = true;\r\n        update();\r\n    }\r\n}\r\n\r\n// void Q3DView::Init()\r\nvoid Q3DView::initializeGL() {\r\n    initializeOpenGLFunctions();\r\n\r\n    m_oldRect = QRect(0, 0, width(), height());\r\n\r\n    glClearDepth(1.0f);\r\n    glEnable(GL_DEPTH_TEST);\r\n    glShadeModel(GL_FLAT);\r\n    glEnableClientState(GL_VERTEX_ARRAY);\r\n}\r\n\r\nvoid Q3DView::DrawScene() {\r\n    std::unique_lock<std::mutex> lock(m_draw_mutex, std::try_to_lock);\r\n    if (!lock.owns_lock()) {\r\n        return;\r\n    }\r\n\r\n    makeCurrent();\r\n\r\n    SetModelMat();\r\n\r\n    QRgb bg = qRgb(0, 0, 0);\r\n    QRgb fg = qRgb(128, 128, 128);\r\n\r\n    glClearColor((GLfloat)GetRValue(bg) / 255.0f, (GLfloat)GetGValue(bg) / 255.0f, (GLfloat)GetBValue(bg) / 255.0f,\r\n                 1.0f);\r\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r\n\r\n    glColor3f(1.0f, 0.0f, 0.0f);\r\n    if (m_male_template.m_init) {\r\n        for (size_t i = 0; i < m_mannequins.size(); i++) {\r\n            if (m_mannequins[i].m_active) {\r\n                if (i % 2 == 0) {\r\n                    m_mannequins[i].draw(m_male_template, m_drawtrails, m_fill);\r\n                } else {\r\n                    m_mannequins[i].draw(m_female_template, m_drawtrails, m_fill);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (m_fill) {\r\n        if (!m_animating) {\r\n            if (pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessedPoints()) {\r\n                // okay, you can go for it and draw all the squares in cutesy 3d:\r\n                PointMap &pointmap = pDoc->m_meta_graph->getDisplayedPointMap();\r\n                AttributeTable &table = pointmap.getAttributeTable();\r\n\r\n                for (auto iter = table.begin(); iter != table.end(); iter++) {\r\n                    PixelRef pix = iter->getKey().value;\r\n                    PafColor color;\r\n                    int col = pointmap.getDisplayedAttribute();\r\n                    float value = iter->getRow().getNormalisedValue(col);\r\n                    if (value != -1.0f) {\r\n                        color.makeAxmanesque(value);\r\n                        glColor3f(color.redf(), color.greenf(), color.bluef());\r\n                        Point2f p = pointmap.depixelate(pix);\r\n                        p.normalScale(m_region);\r\n                        glPushMatrix();\r\n                        glTranslatef(p.x, p.y, 0.0f);\r\n                        glVertexPointer(3, GL_FLOAT, 0, m_rect);\r\n                        glDrawArrays(GL_QUADS, 0, 4);\r\n                        glPopMatrix();\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            for (auto pixel : m_pixels) {\r\n                int &value = pixel.second.m_value;\r\n                if (value != -1) {\r\n                    if (pafrand() % 10000 == 0) {\r\n                        value--;\r\n                    }\r\n                    PafColor color;\r\n                    color.makeAxmanesque(float(value) / 10.0f);\r\n                    glColor3f(color.redf(), color.greenf(), color.bluef());\r\n                    Point2f &p = pixel.second.m_point;\r\n                    glPushMatrix();\r\n                    glTranslatef(p.x, p.y, 0.0f);\r\n                    glVertexPointer(3, GL_FLOAT, 0, m_rect);\r\n                    glDrawArrays(GL_QUADS, 0, 4);\r\n                    glPopMatrix();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    glColor3f((GLfloat)GetRValue(fg) / 255.0f, (GLfloat)GetGValue(fg) / 255.0f, (GLfloat)GetBValue(fg) / 255.0f);\r\n    if (m_pointcount) {\r\n        glVertexPointer(3, GL_FLOAT, 0, m_points);\r\n        glDrawArrays(GL_LINES, 0, m_pointcount);\r\n    }\r\n\r\n    glFlush();\r\n\r\n#if defined(_MSC_VER)\r\n    SwapBuffers(wglGetCurrentDC());\r\n#else\r\n    ;\r\n#endif\r\n}\r\n\r\nvoid Q3DView::Reshape(int x, int y) {\r\n    glMatrixMode(GL_PROJECTION);\r\n    glLoadIdentity();\r\n\r\n    gluReimpl::gluPerspective(45.0f, (GLfloat)x / (GLfloat)y, 0.1f, 3.0f);\r\n\r\n    // leave matrix mode in model view:\r\n    glMatrixMode(GL_MODELVIEW);\r\n}\r\n\r\nvoid Q3DView::OnRecentreView() { SetModelMat(); }\r\n\r\nvoid Q3DView::SetModelMat() {\r\n    glMatrixMode(GL_MODELVIEW);\r\n    glLoadIdentity();\r\n    glTranslatef(-m_panx, m_pany, -m_zoom);\r\n    glRotatef(-m_roty, 1.0f, 0.0f, 0.0f);\r\n    glRotatef(-m_rotx, 0.0f, 0.0f, 1.0f);\r\n    glTranslatef(-0.5f, -0.5f, 0.0f);\r\n}\r\n\r\nvoid Q3DView::ReloadLineData() {\r\n    if (m_points) {\r\n        delete[] m_points;\r\n        m_points = NULL;\r\n    }\r\n    m_region = QtRegion();\r\n\r\n    if (pDoc->m_meta_graph && pDoc->m_meta_graph->getState() & MetaGraph::LINEDATA) {\r\n        // should really check communicator is not open...\r\n        auto mgraphLock = pDoc->m_meta_graph->getLock();\r\n        std::unique_lock<std::mutex> drawLock(m_draw_mutex);\r\n\r\n        std::vector<Line> lines;\r\n        for (const auto &pixelGroup : pDoc->m_meta_graph->m_drawingFiles) {\r\n            for (const auto &pixel : pixelGroup.m_spacePixels) {\r\n                if (pixel.isShown()) {\r\n                    if (m_region.atZero()) {\r\n                        m_region = pixel.getRegion();\r\n                    } else {\r\n                        m_region = runion(m_region, pixel.getRegion());\r\n                    }\r\n\r\n                    auto refShapes = pixel.getAllShapes();\r\n                    for (const auto &refShape : refShapes) {\r\n                        const SalaShape &shape = refShape.second;\r\n                        if (shape.isLine()) {\r\n                            lines.push_back(shape.getLine());\r\n                        } else if (shape.isPolyLine() || shape.isPolygon()) {\r\n                            for (int n = 0; n < shape.m_points.size() - 1; n++) {\r\n                                lines.push_back(Line(shape.m_points[n], shape.m_points[n + 1]));\r\n                            }\r\n                            if (shape.isPolygon()) {\r\n                                lines.push_back(Line(shape.m_points.back(), shape.m_points.front()));\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        m_pointcount = lines.size() * 2;\r\n        if (m_pointcount) {\r\n            // now scale up to a nice square region around midpoint:\r\n            if (m_region.width() > m_region.height()) {\r\n                double oldheight = m_region.height();\r\n                m_region.bottom_left.y -= (m_region.width() - oldheight) / 2;\r\n                m_region.top_right.y += (m_region.width() - oldheight) / 2;\r\n            } else {\r\n                double oldwidth = m_region.width();\r\n                m_region.bottom_left.x -= (m_region.height() - oldwidth) / 2;\r\n                m_region.top_right.x += (m_region.height() - oldwidth) / 2;\r\n            }\r\n\r\n            m_points = new GLfloat[m_pointcount * 3];\r\n            for (int i = 0; i < m_pointcount; i++) {\r\n                Point2f p;\r\n                if (i % 2 == 0) {\r\n                    p = lines[i / 2].start();\r\n                } else {\r\n                    p = lines[i / 2].end();\r\n                }\r\n                p.normalScale(m_region);\r\n                m_points[i * 3 + 0] = p.x;\r\n                m_points[i * 3 + 1] = p.y;\r\n                m_points[i * 3 + 2] = 0.0;\r\n            }\r\n        }\r\n    }\r\n\r\n    // note: as affects region, will also affect point data:\r\n    ReloadPointData();\r\n}\r\n\r\nconst GLfloat g_rect[][3] = {\r\n    {-0.5f, -0.5f, -0.05f}, {0.5f, -0.5f, -0.05f}, {0.5f, 0.5f, -0.05f}, {-0.5f, 0.5f, -0.05f}};\r\n\r\nvoid Q3DView::ReloadPointData() {\r\n    m_mannequins.clear();\r\n    m_agents.clear();\r\n    m_animating = false;\r\n\r\n    if (pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessedPoints()) {\r\n        //\r\n        if (!m_region.atZero()) {\r\n            GLfloat unit = pDoc->m_meta_graph->getDisplayedPointMap().getSpacing() / m_region.width();\r\n            m_male_template.Init(unit, true);\r\n            m_female_template.Init(unit, false);\r\n            for (int i = 0; i < 4; i++) {\r\n                for (int j = 0; j < 3; j++) {\r\n                    m_rect[i][j] = unit * g_rect[i][j];\r\n                }\r\n            }\r\n        } else {\r\n            m_male_template.Destroy();\r\n            m_female_template.Destroy();\r\n        }\r\n        //\r\n        m_pixels.clear();\r\n        PointMap &map = pDoc->m_meta_graph->getDisplayedPointMap();\r\n        AttributeTable &table = map.getAttributeTable();\r\n        for (const auto &iter : table) {\r\n            PixelRef pix = iter.getKey().value;\r\n            Point2f p = map.depixelate(pix);\r\n            p.normalScale(m_region);\r\n            m_pixels[pix] = C3DPixelData(p);\r\n        }\r\n    } else {\r\n        m_male_template.Destroy();\r\n        m_female_template.Destroy();\r\n    }\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\nvoid Q3DView::On3dPan() { m_mouse_mode = ID_3D_PAN; }\r\n\r\nvoid Q3DView::On3dRot() { m_mouse_mode = ID_3D_ROT; }\r\n\r\nvoid Q3DView::On3dZoom() { m_mouse_mode = ID_3D_ZOOM; }\r\n\r\nvoid Q3DView::OnPlayLoop() { m_mouse_mode = ID_3D_PLAY_LOOP; }\r\n\r\nvoid Q3DView::OnAddAgent() { m_mouse_mode = ID_ADD_AGENT; }\r\n\r\nvoid Q3DView::OnToolsAgentLoadProgram() {\r\n    QString template_string;\r\n    template_string += \"Text files (*.txt)\\nAll files (*.*)\";\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QStringList infiles =\r\n        QFileDialog::getOpenFileNames(0, tr(\"Import\"), \"\", template_string, &selectedFilter, options);\r\n\r\n    if (!infiles.size()) {\r\n        return;\r\n    }\r\n\r\n    std::string filename = infiles[0].toStdString();\r\n\r\n    if (!filename.empty()) {\r\n        m_animating = false;\r\n        std::unique_lock<std::mutex> lock(m_draw_mutex);\r\n\r\n        m_agents.clear();\r\n        m_mannequins.clear();\r\n        if (!m_agent_program.open(filename)) {\r\n            QMessageBox::warning(this, tr(\"depthmapX\"), tr(\"Unable to understand agent program\"), QMessageBox::Ok,\r\n                                 QMessageBox::Ok);\r\n        }\r\n    } else {\r\n        QMessageBox::warning(this, tr(\"depthmapX\"), tr(\"No file selected\"), QMessageBox::Ok, QMessageBox::Ok);\r\n    }\r\n}\r\n\r\nvoid Q3DView::On3dFilled() {\r\n    if (m_fill) {\r\n        m_fill = false;\r\n    } else {\r\n        m_fill = true;\r\n    }\r\n    update();\r\n}\r\n\r\nvoid Q3DView::OnAgentTrails() {\r\n    if (m_drawtrails) {\r\n        m_drawtrails = false;\r\n    } else {\r\n        m_drawtrails = true;\r\n    }\r\n}\r\n/////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid Q3DView::OnLButtonDown(unsigned int nFlags, QPoint point) {\r\n    m_right_mouse = false;\r\n\r\n    switch (m_mouse_mode) {\r\n    case ID_3D_PAN:\r\n    case ID_3D_ROT:\r\n    case ID_3D_ZOOM:\r\n        m_mouse_mode_on = m_mouse_mode;\r\n        m_mouse_origin = point;\r\n        break;\r\n\r\n    case ID_ADD_AGENT: {\r\n        if (m_male_template.m_init) {\r\n            CreateAgent(point);\r\n        }\r\n    } break;\r\n    }\r\n}\r\n\r\nvoid Q3DView::OnLButtonUp(unsigned int nFlags, QPoint point) {\r\n    m_mouse_mode_on = 0;\r\n    m_quick_draw = false;\r\n\r\n    update();\r\n}\r\n\r\nQSize Q3DView::sizeHint() const { return QSize(2000, 2000); }\r\n\r\nvoid Q3DView::OnRButtonDown(unsigned int nFlags, QPoint point) {\r\n    m_right_mouse = true;\r\n\r\n    std::unique_lock<std::mutex> lock(m_draw_mutex);\r\n\r\n    m_mouse_origin = point;\r\n}\r\n\r\nvoid Q3DView::OnRButtonUp(unsigned int nFlags, QPoint point) {\r\n    m_right_mouse = false;\r\n    m_quick_draw = false;\r\n\r\n    update();\r\n}\r\n\r\nvoid Q3DView::OnMouseMove(unsigned int nFlags, QPoint point) {\r\n    if (m_mouse_mode_on && point != m_mouse_origin) {\r\n        QSize diff(m_mouse_origin.x() - point.x(), m_mouse_origin.y() - point.y());\r\n        switch (m_mouse_mode) {\r\n        case ID_3D_PAN:\r\n            Pan(diff);\r\n            m_mouse_origin = point;\r\n            break;\r\n        case ID_3D_ROT:\r\n            Rot(diff);\r\n            m_mouse_origin = point;\r\n            break;\r\n        case ID_3D_ZOOM:\r\n            Zoom(diff);\r\n            m_mouse_origin = point;\r\n            break;\r\n        }\r\n        SetModelMat();\r\n        m_quick_draw = true;\r\n\r\n        update();\r\n    } else if (m_right_mouse && point != m_mouse_origin) {\r\n        // always pan with right mouse\r\n        QSize diff(m_mouse_origin.x() - point.x(), m_mouse_origin.y() - point.y());\r\n        Pan(diff);\r\n        m_mouse_origin = point;\r\n        SetModelMat();\r\n        m_quick_draw = true;\r\n\r\n        update();\r\n    }\r\n}\r\n\r\nvoid Q3DView::Pan(QSize diff) {\r\n    m_panx += 0.005f * (diff.width());\r\n    if (m_panx < -1.0f) {\r\n        m_panx = -1.0f;\r\n    } else if (m_panx > 1.0f) {\r\n        m_panx = 1.0f;\r\n    }\r\n    m_pany += 0.005f * (diff.height());\r\n    if (m_pany < -1.0f) {\r\n        m_pany = -1.0f;\r\n    } else if (m_pany > 1.0f) {\r\n        m_pany = 1.0f;\r\n    }\r\n}\r\n\r\nvoid Q3DView::Rot(QSize diff) {\r\n    m_rotx += 0.5f * (diff.width());\r\n    if (m_rotx < -180.0f) {\r\n        m_rotx = 180.0f;\r\n    } else if (m_rotx > 180.0f) {\r\n        m_rotx = -180.0f;\r\n    }\r\n    m_roty += 0.5f * (diff.height());\r\n    if (m_roty < 0.0f) {\r\n        m_roty = 0.0f;\r\n    } else if (m_roty > 90.0f) {\r\n        m_roty = 90.0f;\r\n    }\r\n}\r\n\r\nvoid Q3DView::Zoom(QSize diff) {\r\n    m_zoom += 0.005f * (diff.height());\r\n    if (m_zoom < 0.02f) {\r\n        m_zoom = 0.02f;\r\n    } else if (m_zoom > 2.5f) {\r\n        m_zoom = 2.5f;\r\n    }\r\n}\r\n\r\nvoid Q3DView::PlayLoop() {\r\n    m_rotx += 0.05f;\r\n    if (m_rotx < -180.0f) {\r\n        m_rotx = 180.0f;\r\n    } else if (m_rotx > 180.0f) {\r\n        m_rotx = -180.0f;\r\n    }\r\n    m_track += 0.001 * M_PI;\r\n    if (m_track > 2.0 * M_PI) {\r\n        m_track -= 2.0 * M_PI;\r\n    }\r\n    m_roty += 0.05f * cosf(m_track);\r\n    if (m_roty < 0.0f) {\r\n        m_roty = 0.0f;\r\n    } else if (m_roty > 75.0f) {\r\n        m_roty = 75.0f;\r\n    }\r\n    m_zoom -= 0.001f * sinf(m_track);\r\n    if (m_zoom < 0.02f) {\r\n        m_zoom = 0.02f;\r\n    } else if (m_zoom > 2.5f) {\r\n        m_zoom = 2.5f;\r\n    }\r\n}\r\n\r\nvoid Q3DView::CreateAgent(QPoint point) {\r\n    if (!m_male_template.m_init) {\r\n        return;\r\n    }\r\n\r\n    std::unique_lock<std::mutex> lock(m_draw_mutex);\r\n    bool animating = m_animating;\r\n    m_animating = false;\r\n\r\n    // click test\r\n    GLint viewport[4];\r\n    GLdouble mvmatrix[16], projmatrix[16];\r\n\r\n    glViewport(0, 0, width(), height());\r\n    glGetIntegerv(GL_VIEWPORT, viewport);\r\n    Reshape(viewport[2], viewport[3]);\r\n    SetModelMat();\r\n\r\n    glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);\r\n    glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);\r\n\r\n    GLint realy = viewport[3] - point.y();\r\n\r\n    GLdouble wx1, wy1, wz1, wx2, wy2, wz2;\r\n\r\n    gluReimpl::gluUnProject((GLdouble)point.x(), (GLdouble)realy, 0.0, mvmatrix, projmatrix, viewport, &wx1, &wy1,\r\n                            &wz1);\r\n    gluReimpl::gluUnProject((GLdouble)point.x(), (GLdouble)realy, 1.0, mvmatrix, projmatrix, viewport, &wx2, &wy2,\r\n                            &wz2);\r\n\r\n    // 0 plane has to lie between wz1 and wz2:\r\n    if (std::isfinite(wz1) && std::isfinite(wz2) && wz1 > 0 && wz2 < 0) {\r\n        double scaling = wz1 / (wz2 - wz1);\r\n        Point2f p(wx1 - scaling * (wx2 - wx1), wy1 - scaling * (wy2 - wy1));\r\n\r\n        if (pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessedPoints()) {\r\n            // okay, you can go for it and add an agent:\r\n            PointMap &pointmap = pDoc->m_meta_graph->getDisplayedPointMap();\r\n            p.denormalScale(m_region);\r\n            PixelRef pix = pointmap.pixelate(p);\r\n            if (pointmap.getPoint(pix).filled()) {\r\n                m_agents.push_back(Agent(&m_agent_program, &pointmap));\r\n                m_agents.back().onInit(pix);\r\n                Point2f p2 = m_agents.back().getLocation();\r\n                p2.normalScale(m_region);\r\n                m_mannequins.push_back(QMannequin(p2, m_agents.size() - 1));\r\n                m_agents.back().onMove();\r\n                p2 = m_agents.back().getLocation();\r\n                p2.normalScale(m_region);\r\n                m_mannequins.back().advance(p2);\r\n\r\n                m_animating = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    m_animating |= animating;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////\r\n\r\nconst GLfloat g_male_mannequin_points[][3] = {\r\n    {0.0f, 0.0f, 0.3f},    //  0 top head\r\n    {0.0f, 0.0f, 0.0f},    //  1 top spine\r\n    {0.0f, 0.0f, -0.7f},   //  2 base spine\r\n    {-0.25f, 0.0f, 0.0f},  //  3 left shoulder\r\n    {-0.15f, 0.0f, -0.7f}, //  4 left hip\r\n    {0.25f, 0.0f, 0.0f},   //  5 right shoulder\r\n    {0.15f, 0.0f, -0.7f},  //  6 right hip\r\n    {-0.25f, 0.0f, -0.8f}, //  7 bottom left arm (hung from top spine)\r\n    {-0.15f, 0.0f, 0.0f},  //  8 top left leg (hung from base spine)\r\n    {-0.15f, 0.0f, -1.0f}  //  9 bottom left leg (hung from base spine)\r\n};\r\n\r\nconst GLfloat g_female_mannequin_points[][3] = {\r\n    {0.0f, 0.0f, 0.3f},    //  0 top head\r\n    {0.0f, 0.0f, 0.0f},    //  1 top spine\r\n    {0.0f, 0.0f, -0.7f},   //  2 base spine\r\n    {-0.2f, 0.0f, 0.0f},   //  3 left shoulder\r\n    {-0.2f, 0.0f, -0.7f},  //  4 left hip\r\n    {0.2f, 0.0f, 0.0f},    //  5 right shoulder\r\n    {0.2f, 0.0f, -0.7f},   //  6 right hip\r\n    {-0.25f, 0.0f, -0.8f}, //  7 bottom left arm (hung from top spine)\r\n    {-0.2f, 0.0f, 0.0f},   //  8 top left leg (hung from base spine)\r\n    {-0.1f, 0.0f, -1.0f}   //  9 bottom left leg (hung from base spine)\r\n};\r\n\r\nCMannequinTemplate::CMannequinTemplate() {\r\n    m_init = false;\r\n    m_unit = 0.0f;\r\n}\r\n\r\nCMannequinTemplate::~CMannequinTemplate() {}\r\n\r\nvoid CMannequinTemplate::Init(GLfloat unit, bool male) {\r\n    m_unit = unit;\r\n    m_male = male;\r\n\r\n    for (int i = 0; i < 10; i++) {\r\n        for (int j = 0; j < 3; j++) {\r\n            m_points[i][j] = m_unit * (male ? g_male_mannequin_points[i][j] : g_female_mannequin_points[i][j]);\r\n        }\r\n    }\r\n\r\n    m_init = true;\r\n}\r\n\r\nvoid CMannequinTemplate::Destroy() {\r\n    m_init = false;\r\n    m_unit = 0.0f;\r\n}\r\n\r\nQMannequin::QMannequin(const Point2f &startloc, int id, bool playback) {\r\n    m_left = true;\r\n    m_paused = false;\r\n    m_frame = 0;\r\n    m_zrot = 0.0f;\r\n    m_startloc = startloc;\r\n    m_nextloc = startloc;\r\n    m_pointcount = 0;\r\n    m_pointstart = 0;\r\n    m_time = 0.0;\r\n    m_active = true;\r\n    m_playback = playback;\r\n    if (m_playback) {\r\n        m_trace_id = id;\r\n    } else {\r\n        m_agent_id = id;\r\n    }\r\n}\r\n\r\nQMannequin::QMannequin(const QMannequin &man) {\r\n    m_left = man.m_left;\r\n    m_paused = man.m_paused;\r\n    m_frame = man.m_frame;\r\n    m_zrot = man.m_zrot;\r\n    m_startloc = man.m_startloc;\r\n    m_lastloc = man.m_lastloc;\r\n    m_nextloc = man.m_nextloc;\r\n    m_pointcount = man.m_pointcount;\r\n    m_pointstart = man.m_pointstart;\r\n    memcpy(m_points + m_pointstart, man.m_points + man.m_pointstart * 3, m_pointcount * sizeof(GLfloat) * 3);\r\n    m_time = man.m_time;\r\n    m_active = man.m_active;\r\n    m_playback = man.m_playback;\r\n    m_trace_id = man.m_trace_id;\r\n    m_agent_id = man.m_agent_id;\r\n}\r\n\r\nQMannequin &QMannequin::operator=(const QMannequin &man) {\r\n    if (&man != this) {\r\n        m_left = man.m_left;\r\n        m_paused = man.m_paused;\r\n        m_frame = man.m_frame;\r\n        m_zrot = man.m_zrot;\r\n        m_startloc = man.m_startloc;\r\n        m_lastloc = man.m_lastloc;\r\n        m_nextloc = man.m_nextloc;\r\n        m_pointcount = man.m_pointcount;\r\n        m_pointstart = man.m_pointstart;\r\n        memcpy(m_points + m_pointstart, man.m_points + man.m_pointstart * 3, m_pointcount * sizeof(GLfloat) * 3);\r\n        m_time = man.m_time;\r\n        m_active = man.m_active;\r\n        m_playback = man.m_playback;\r\n        m_trace_id = man.m_trace_id;\r\n        m_agent_id = man.m_agent_id;\r\n    }\r\n    return *this;\r\n}\r\n\r\nvoid QMannequin::frame() {\r\n    m_frame++;\r\n    if (m_frame >= 24) {\r\n        m_frame = 0;\r\n        m_time += 1.0;\r\n        m_left = m_left ? false : true;\r\n    }\r\n}\r\n\r\nvoid QMannequin::advance(const Point2f &nextloc) {\r\n    m_lastloc = m_nextloc;\r\n    m_nextloc = nextloc;\r\n    if (m_nextloc == m_lastloc) {\r\n        m_paused = true;\r\n    } else {\r\n        Point2f vec = m_nextloc - m_lastloc;\r\n        vec.normalise();\r\n        m_zrot = 90.0 + 180.0 * vec.angle() / M_PI;\r\n        m_paused = false;\r\n        //\r\n        m_pointcount++;\r\n        if (m_pointcount > 25) {\r\n            m_pointstart++;\r\n            m_pointcount = 25;\r\n            if (m_pointstart > 25) {\r\n                memcpy(m_points, m_points + (m_pointstart - 1) * 3, (m_pointcount - 1) * sizeof(GLfloat) * 3);\r\n                m_pointstart = 0;\r\n                m_pointcount = 25;\r\n            }\r\n        }\r\n        int base = (m_pointstart + m_pointcount - 1) * 3;\r\n        m_points[base] = m_lastloc.x;\r\n        m_points[base + 1] = m_lastloc.y;\r\n        m_points[base + 2] = 0.0f;\r\n    }\r\n}\r\n\r\nvoid QMannequin::draw(CMannequinTemplate &templ, bool drawtrails, bool highlight) {\r\n    if (!highlight) {\r\n        if (templ.m_male) {\r\n            glColor3f(0.4f, 0.4f, 0.8f);\r\n        } else {\r\n            glColor3f(0.7f, 0.4f, 0.6f);\r\n        }\r\n    } else {\r\n        if (templ.m_male) {\r\n            glColor3f(0.8f, 0.8f, 1.0f);\r\n        } else {\r\n            glColor3f(1.0f, 0.8f, 0.9f);\r\n        }\r\n    }\r\n\r\n    glPushMatrix();\r\n\r\n    // based on 24 frames per second:\r\n    GLfloat framef = GLfloat(m_frame % 24) / 24.0f;\r\n    if (m_paused) {\r\n        framef = 0.0f;\r\n    }\r\n    glTranslatef(framef * m_nextloc.x + (1.0f - framef) * m_lastloc.x,\r\n                 framef * m_nextloc.y + (1.0f - framef) * m_lastloc.y, 0.0f);\r\n    glRotatef(m_zrot, 0.0f, 0.0f, 1.0f);\r\n\r\n    // now use framef as a swing:\r\n    framef *= 2.0f;\r\n    if (framef > 1.0f) {\r\n        framef = 2.0f - framef;\r\n    }\r\n    GLfloat swing = framef * 30.0f * (m_left ? -1.0f : 1.0f);\r\n\r\n    GLfloat h = cos(M_PI * 0.16667f * framef) + 0.7f; // 2 * M_PI * 30.0f * framef / 360.0f = M_PI * 0.16667 * framef\r\n\r\n    glTranslatef(0.0f, 0.0f, h * templ.m_unit);\r\n\r\n    glBegin(GL_LINES);\r\n    // head\r\n    glVertex3fv(templ.m_points[0]);\r\n    glVertex3fv(templ.m_points[1]);\r\n    // spine\r\n    glVertex3fv(templ.m_points[1]);\r\n    glVertex3fv(templ.m_points[2]);\r\n    // shoulders\r\n    glVertex3fv(templ.m_points[3]);\r\n    glVertex3fv(templ.m_points[5]);\r\n    // hips\r\n    glVertex3fv(templ.m_points[4]);\r\n    glVertex3fv(templ.m_points[6]);\r\n    glEnd();\r\n\r\n    glPushMatrix();\r\n    glRotatef(swing, 1.0f, 0.0f, 0.0f);\r\n\r\n    glBegin(GL_LINES);\r\n    // left arm\r\n    glVertex3fv(templ.m_points[3]);\r\n    glVertex3fv(templ.m_points[7]);\r\n    glEnd();\r\n\r\n    glRotatef(180.0f, 0.0f, 0.0f, 1.0f);\r\n    glRotatef(2.0 * swing, 1.0f, 0.0f, 0.0f);\r\n\r\n    glBegin(GL_LINES);\r\n    // right arm (n.b., reuse same point pair)\r\n    glVertex3fv(templ.m_points[3]);\r\n    glVertex3fv(templ.m_points[7]);\r\n    glEnd();\r\n\r\n    glPopMatrix();\r\n\r\n    glTranslatef(0.0f, 0.0f, -0.7f * templ.m_unit);\r\n    glRotatef(-swing, 1.0f, 0.0f, 0.0f);\r\n\r\n    glBegin(GL_LINES);\r\n    // left leg\r\n    glVertex3fv(templ.m_points[8]);\r\n    glVertex3fv(templ.m_points[9]);\r\n    glEnd();\r\n\r\n    glRotatef(180.0f, 0.0f, 0.0f, 1.0f);\r\n    glRotatef(2.0 * -swing, 1.0f, 0.0f, 0.0f);\r\n\r\n    glBegin(GL_LINES);\r\n    // right leg (n.b., reuse same point pair)\r\n    glVertex3fv(templ.m_points[8]);\r\n    glVertex3fv(templ.m_points[9]);\r\n    glEnd();\r\n\r\n    glPopMatrix();\r\n\r\n    // trails...\r\n    if (drawtrails && m_pointcount > 1) {\r\n        glVertexPointer(3, GL_FLOAT, 0, m_points);\r\n        glDrawArrays(GL_LINE_STRIP, m_pointstart, m_pointcount);\r\n    }\r\n}\r\n\r\nvoid Q3DView::OnKeyDown(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) {\r\n    // Quick mod - TV\r\n\r\n    switch (nChar) {\r\n    // case 37: case 38: case 39: case 40:\r\n    case Qt::Key_Left:\r\n    case Qt::Key_Up:\r\n    case Qt::Key_Right:\r\n    case Qt::Key_Down:\r\n        m_key_mode_on = m_mouse_mode;\r\n        m_keydown = nChar;\r\n        break;\r\n\r\n    // case 33: // Page Up\r\n    case Qt::Key_PageUp:\r\n        switch (m_mouse_mode) {\r\n        case ID_ADD_AGENT:\r\n            m_mouse_mode = ID_3D_ZOOM;\r\n            break;\r\n        case ID_3D_ROT:\r\n            m_mouse_mode = ID_ADD_AGENT;\r\n            break;\r\n        case ID_3D_PAN:\r\n            m_mouse_mode = ID_3D_ROT;\r\n            break;\r\n        case ID_3D_ZOOM:\r\n            m_mouse_mode = ID_3D_PAN;\r\n            break;\r\n        }\r\n        break;\r\n\r\n    // case 34: // Page Down\r\n    case Qt::Key_PageDown:\r\n        switch (m_mouse_mode) {\r\n        case ID_ADD_AGENT:\r\n            m_mouse_mode = ID_3D_ROT;\r\n            break;\r\n        case ID_3D_ROT:\r\n            m_mouse_mode = ID_3D_PAN;\r\n            break;\r\n        case ID_3D_PAN:\r\n            m_mouse_mode = ID_3D_ZOOM;\r\n            break;\r\n        case ID_3D_ZOOM:\r\n            m_mouse_mode = ID_ADD_AGENT;\r\n            break;\r\n        }\r\n        break;\r\n\r\n    // case 'T':\r\n    case Qt::Key_T:\r\n        OnAgentTrails();\r\n        break;\r\n\r\n    // case 'A':\r\n    case Qt::Key_A: {\r\n        QPoint point;\r\n        //         ::GetCursorPos(&point);\r\n        CreateAgent(point);\r\n    } break;\r\n    }\r\n}\r\n\r\nvoid Q3DView::OnKeyUp(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) { m_key_mode_on = 0; }\r\n\r\nbool Q3DView::OnMouseWheel(unsigned int nFlags, short zDelta, QPoint pt) {\r\n    QSize diff(0, -zDelta / 5);\r\n    Zoom(diff);\r\n    SetModelMat();\r\n    m_quick_draw = true;\r\n    update();\r\n\r\n    return 0;\r\n}\r\n\r\nvoid Q3DView::OnToolsImportTraces() {\r\n    QString template_string;\r\n    template_string += \"XML files (*.xml)\\nText files (*.txt)\\nAll files (*.*)\";\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QStringList infiles =\r\n        QFileDialog::getOpenFileNames(0, tr(\"Import Traces\"), \"\", template_string, &selectedFilter, options);\r\n\r\n    if (!infiles.size()) {\r\n        return;\r\n    }\r\n\r\n    std::string filename = infiles[0].toStdString();\r\n\r\n    if (!filename.empty()) {\r\n        m_animating = false;\r\n        std::unique_lock<std::mutex> lock(m_draw_mutex);\r\n        m_agents.clear();\r\n        m_traces.clear();\r\n        m_mannequins.clear();\r\n        //\r\n        std::ifstream file(filename.c_str());\r\n        // Eva's XMLs do not have the header yet:\r\n        xmlelement traceset;\r\n        QString elementname;\r\n        while (file && elementname != \"traceset\") {\r\n            traceset.parse(file, false);\r\n            elementname = QString(traceset.name.c_str()).toLower();\r\n        }\r\n        while (file) {\r\n            xmlelement trace;\r\n            trace.parse(file, true);\r\n            elementname = QString(trace.name.c_str()).toLower();\r\n            if (elementname == \"trace\") {\r\n                m_traces.push_back(Trace());\r\n                bool firstevent = true;\r\n                for (int j = 0; j < trace.subelements.size(); j++) {\r\n                    // these should be events:\r\n                    xmlelement &traceevent = trace.subelements[j];\r\n                    if (traceevent.name == \"event\") {\r\n                        double x = QString(traceevent.attributes[\"x\"].c_str()).toDouble();\r\n                        double y = QString(traceevent.attributes[\"y\"].c_str()).toDouble();\r\n                        double t = QString(traceevent.attributes[\"t\"].c_str()).toDouble();\r\n                        m_traces.back().events.push_back(Event2f(x, y, t));\r\n                        if (firstevent) {\r\n                            m_traces.back().starttime = t;\r\n                            firstevent = false;\r\n                        }\r\n                    }\r\n                }\r\n                if (m_traces.back().events.size() >= 1) {\r\n                    m_traces.back().endtime = m_traces.back().events.back().t;\r\n                    Point2f p = m_traces.back().events[0];\r\n                    p.normalScale(m_region);\r\n                    m_mannequins.push_back(QMannequin(p, m_traces.size() - 1, true));\r\n                    m_mannequins.back().m_active = false;\r\n                }\r\n            }\r\n        }\r\n    } else {\r\n        QMessageBox::warning(this, tr(\"depthmapX\"), tr(\"No file selected\"), QMessageBox::Ok, QMessageBox::Ok);\r\n    }\r\n}\r\n\r\nvoid Q3DView::OnToolsAgentsPause() { m_animating = false; }\r\n\r\nvoid Q3DView::OnToolsAgentsStop() {\r\n    m_animating = false;\r\n    for (int i = 0; i < m_mannequins.size(); i++) {\r\n        if (m_mannequins[i].m_playback) {\r\n            m_mannequins[i].m_active = false;\r\n            m_mannequins[i].m_time = 0.0;\r\n            m_mannequins[i].m_nextloc = m_mannequins[i].m_startloc;\r\n        }\r\n    }\r\n    for (auto pixel : m_pixels) {\r\n        pixel.second.m_value = -1;\r\n    }\r\n}\r\n\r\nvoid Q3DView::OnToolsAgentsPlay() { m_animating = true; }\r\n\r\nvoid Q3DView::closeEvent(QCloseEvent *event) {\r\n    pDoc->m_view[QGraphDoc::VIEW_3D] = NULL;\r\n    if (!pDoc->OnCloseDocument(QGraphDoc::VIEW_3D)) {\r\n        pDoc->m_view[QGraphDoc::VIEW_3D] = this;\r\n        event->ignore();\r\n    }\r\n}\r\n\r\n// void Q3DView::resizeEvent(QResizeEvent *event)\r\nvoid Q3DView::resizeGL(int w, int h) {\r\n    Reshape(m_oldRect.right(), m_oldRect.bottom());\r\n    OnRecentreView();\r\n\r\n    pDoc->m_view[QGraphDoc::VIEW_3D] = this;\r\n\r\n    if (w > 0) {\r\n        glViewport(0, 0, w, h);\r\n\r\n        m_oldRect.setRight(w);\r\n        m_oldRect.setBottom(h);\r\n\r\n        Reshape(w, h);\r\n    }\r\n}\r\n\r\nvoid Q3DView::mouseMoveEvent(QMouseEvent *event) { OnMouseMove(0, event->pos()); }\r\n\r\nvoid Q3DView::mousePressEvent(QMouseEvent *event) {\r\n    switch (event->button()) {\r\n    case Qt::LeftButton:\r\n        OnLButtonDown(0, event->pos());\r\n        ((MainWindow *)pDoc->m_mainFrame)->update3DToolbar();\r\n        break;\r\n\r\n    case Qt::RightButton:\r\n        OnRButtonDown(0, event->pos());\r\n        break;\r\n    default:\r\n        break;\r\n    }\r\n}\r\n\r\nvoid Q3DView::mouseReleaseEvent(QMouseEvent *event) {\r\n    switch (event->button()) {\r\n    case Qt::LeftButton:\r\n        OnLButtonUp(0, event->pos());\r\n        break;\r\n\r\n    case Qt::RightButton:\r\n        OnRButtonUp(0, event->pos());\r\n        break;\r\n    default:\r\n        break;\r\n    }\r\n}\r\n\r\nvoid Q3DView::keyPressEvent(QKeyEvent *event) { OnKeyDown(event->key(), event->count(), 0); }\r\n\r\nvoid Q3DView::keyReleaseEvent(QKeyEvent *event) { OnKeyUp(event->key(), event->count(), 0); }\r\n\r\nvoid Q3DView::wheelEvent(QWheelEvent *event) { OnMouseWheel(0, event->delta(), event->pos()); }\r\n\r\nvoid Q3DView::timerSlot() { timerEvent(NULL); }\r\n"
  },
  {
    "path": "depthmapX/views/3dview/3dview.h",
    "content": "// depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"depthmapX/GraphDoc.h\"\r\n#include \"salalib/agents/agentprogram.h\"\r\n\r\n#include <QOpenGLWidget>\r\n#include <QPoint>\r\n#include <QRect>\r\n#include <QSize>\r\n\r\n#include <QOpenGLFunctions>\r\n\r\n#define ID_ADD_AGENT 32947\r\n#define ID_3D_PAN 32948\r\n#define ID_3D_ZOOM 32949\r\n#define ID_3D_ROT 32950\r\n#define ID_3D_PAUSE 32951\r\n#define ID_3D_PLAY_LOOP 32981\r\n#define ID_3D_FILLED 32983\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n// CScreenAgent\r\n\r\nstruct CMannequinTemplate {\r\n    bool m_init;\r\n    float m_unit;\r\n    bool m_male;\r\n    float m_points[10][3];\r\n    CMannequinTemplate();\r\n    virtual ~CMannequinTemplate();\r\n    void Init(float unit, bool male);\r\n    void Destroy();\r\n};\r\n\r\nstruct QMannequin {\r\n    float m_zrot; // facing direction\r\n    Point2f m_startloc;\r\n    Point2f m_lastloc;\r\n    Point2f m_nextloc;\r\n    int m_frame;\r\n    bool m_left;\r\n    bool m_paused;\r\n    // these are used when replaying a trace\r\n    bool m_active;\r\n    bool m_playback;\r\n    double m_time;\r\n    //\r\n    int m_agent_id;\r\n    int m_trace_id;\r\n    //\r\n    QMannequin(const Point2f &lastloc = Point2f(), int id = -1, bool playback = false);\r\n    QMannequin(const QMannequin &man);\r\n    QMannequin &operator=(const QMannequin &man);\r\n    void draw(CMannequinTemplate &templ, bool drawtrails, bool highlight);\r\n    void frame();\r\n    void advance(const Point2f &nextloc);\r\n    // big long array to record trails!\r\n    float m_points[150];\r\n    int m_pointstart;\r\n    int m_pointcount;\r\n};\r\n\r\nstruct Trace {\r\n    double starttime;\r\n    double endtime;\r\n    std::vector<Event2f> events;\r\n};\r\n\r\nstruct C3DPixelData {\r\n    Point2f m_point;\r\n    int m_value;\r\n    C3DPixelData(const Point2f &p = Point2f()) {\r\n        m_point = p;\r\n        m_value = -1;\r\n    }\r\n};\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\nclass Q3DView : public QOpenGLWidget, protected QOpenGLFunctions {\r\n    Q_OBJECT\r\n\r\n    // Attributes\r\n  public:\r\n    Q3DView(QWidget *parent = NULL, QGraphDoc *doc = NULL); // protected constructor used by dynamic creation\r\n    ~Q3DView();\r\n    QSize sizeHint() const;\r\n\r\n    QGraphDoc *pDoc;\r\n\r\n    unsigned int *m_nTimerID;\r\n    QRect m_oldRect;\r\n    float m_fRadius;\r\n    QPainter *m_pDC;\r\n    //\r\n    bool m_quick_draw;\r\n    std::mutex m_draw_mutex;\r\n    bool m_animating;\r\n    bool m_drawtrails;\r\n    bool m_fill;\r\n    double m_track; // camera track -- used in playloop\r\n    //\r\n    //\r\n    QtRegion m_region;\r\n    float *m_points;\r\n    float m_rect[4][3];\r\n    std::map<int, C3DPixelData> m_pixels;\r\n    //\r\n    int m_pointcount;\r\n    //\r\n    int m_mouse_mode;\r\n    int m_mouse_mode_on;\r\n    bool m_right_mouse;\r\n    int m_key_mode_on;\r\n    int m_keydown;\r\n    QPoint m_mouse_origin;\r\n    //\r\n    float m_panx;\r\n    float m_pany;\r\n    float m_rotx;\r\n    float m_roty;\r\n    float m_zoom;\r\n    //\r\n    // use to initialise mannequintemplate:\r\n    CMannequinTemplate m_male_template;\r\n    CMannequinTemplate m_female_template;\r\n    std::vector<QMannequin> m_mannequins;\r\n    std::vector<Agent> m_agents;\r\n    std::vector<Trace> m_traces;\r\n    AgentProgram m_agent_program;\r\n    //\r\n    // used to keep track of internal time for all agents\r\n    double m_global_time;\r\n    //\r\n    // Operations\r\n  public:\r\n    // void Init();\r\n    void CreateRGBPalette();\r\n    void Reshape(int x, int y);\r\n    void DrawScene();\r\n    void ReloadLineData();\r\n    void ReloadPointData();\r\n    void SetModelMat();\r\n    void CreateAgent(QPoint point);\r\n\r\n    void Rot(QSize diff);\r\n    void Pan(QSize diff);\r\n    void Zoom(QSize diff);\r\n    void PlayLoop();\r\n\r\n    // My message map functions\r\n    int OnRedraw(int wParam, int lParam);\r\n    void OnLButtonDown(unsigned int nFlags, QPoint point);\r\n    void OnRecentreView();\r\n    void On3dPan();\r\n    void On3dRot();\r\n    void On3dZoom();\r\n    void OnAddAgent();\r\n    void OnMouseMove(unsigned int nFlags, QPoint point);\r\n    void OnLButtonUp(unsigned int nFlags, QPoint point);\r\n    void OnAgentTrails();\r\n    void OnToolsAgentLoadProgram();\r\n    void OnKeyDown(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags);\r\n    void OnKeyUp(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags);\r\n    void OnPlayLoop();\r\n    void On3dFilled();\r\n    bool OnMouseWheel(unsigned int nFlags, short zDelta, QPoint pt);\r\n    void OnRButtonDown(unsigned int nFlags, QPoint point);\r\n    void OnRButtonUp(unsigned int nFlags, QPoint point);\r\n    void OnToolsImportTraces();\r\n    void OnToolsAgentsPause();\r\n    void OnToolsAgentsStop();\r\n    void OnToolsAgentsPlay();\r\n\r\n  public slots:\r\n    void timerSlot();\r\n\r\n  protected:\r\n    void initializeGL();\r\n    void resizeGL(int w, int h);\r\n    void paintGL();\r\n    virtual void timerEvent(QTimerEvent *event);\r\n    // virtual void paintEvent(QPaintEvent *event);\r\n    virtual void keyPressEvent(QKeyEvent *event);\r\n    virtual void keyReleaseEvent(QKeyEvent *event);\r\n    // virtual void resizeEvent(QResizeEvent *event);\r\n    virtual void mouseMoveEvent(QMouseEvent *event);\r\n    virtual void mousePressEvent(QMouseEvent *event);\r\n    virtual void mouseReleaseEvent(QMouseEvent *event);\r\n    virtual void wheelEvent(QWheelEvent *event);\r\n    //  virtual void contextMenuEvent(QContextMenuEvent *event);\r\n    virtual void closeEvent(QCloseEvent *event);\r\n};\r\n"
  },
  {
    "path": "depthmapX/views/3dview/glureimpl.h",
    "content": "// Taken from https://github.com/Alexpux/superglu/blob/master/libutil/project.c\n// Only provided here temporarily until the 3DView is converted to modern OpenGL\n\n/*\n** License Applicability. Except to the extent portions of this file are\n** made subject to an alternative license as permitted in the SGI Free\n** Software License B, Version 1.1 (the \"License\"), the contents of this\n** file are subject only to the provisions of the License. You may not use\n** this file except in compliance with the License. You may obtain a copy\n** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600\n** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:\n**\n** http://oss.sgi.com/projects/FreeB\n**\n** Note that, as provided in the License, the Software is distributed on an\n** \"AS IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\n** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\n** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\n** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n**\n** Original Code. The Original Code is: OpenGL Sample Implementation,\n** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n** Copyright in any portions created by third parties is as indicated\n** elsewhere herein. All Rights Reserved.\n**\n** Additional Notice Provisions: The application programming interfaces\n** established by SGI in conjunction with the Original Code are The\n** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released\n** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version\n** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X\n** Window System(R) (Version 1.3), released October 19, 1998. This software\n** was created using the OpenGL(R) version 1.2.1 Sample Implementation\n** published by SGI, but has not been independently verified as being\n** compliant with the OpenGL(R) version 1.2.1 Specification.\n**\n** $Date$ $Revision$\n** $Header$\n*/\n#pragma once\n\n#include <math.h>\n\n#ifdef __APPLE__\n#include <OpenGL/gl.h>\n#include <OpenGL/glu.h>\n#else\n#include <GL/gl.h>\n#include <GL/glu.h>\n#endif\n\nnamespace gluReimpl {\n    /*\n    ** Make m an identity matrix\n    */\n    static void __gluMakeIdentityd(GLdouble m[16]) {\n        m[0 + 4 * 0] = 1;\n        m[0 + 4 * 1] = 0;\n        m[0 + 4 * 2] = 0;\n        m[0 + 4 * 3] = 0;\n        m[1 + 4 * 0] = 0;\n        m[1 + 4 * 1] = 1;\n        m[1 + 4 * 2] = 0;\n        m[1 + 4 * 3] = 0;\n        m[2 + 4 * 0] = 0;\n        m[2 + 4 * 1] = 0;\n        m[2 + 4 * 2] = 1;\n        m[2 + 4 * 3] = 0;\n        m[3 + 4 * 0] = 0;\n        m[3 + 4 * 1] = 0;\n        m[3 + 4 * 2] = 0;\n        m[3 + 4 * 3] = 1;\n    }\n\n#define __glPi 3.14159265358979323846\n\n    void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) {\n        GLdouble m[4][4];\n        double sine, cotangent, deltaZ;\n        double radians = fovy / 2 * __glPi / 180;\n\n        deltaZ = zFar - zNear;\n        sine = sin(radians);\n        if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {\n            return;\n        }\n        cotangent = cos(radians) / sine;\n\n        __gluMakeIdentityd(&m[0][0]);\n        m[0][0] = cotangent / aspect;\n        m[1][1] = cotangent;\n        m[2][2] = -(zFar + zNear) / deltaZ;\n        m[2][3] = -1;\n        m[3][2] = -2 * zNear * zFar / deltaZ;\n        m[3][3] = 0;\n        glMultMatrixd(&m[0][0]);\n    }\n\n    static void __gluMultMatrixVecd(const GLdouble matrix[16], const GLdouble in[4], GLdouble out[4]) {\n        int i;\n\n        for (i = 0; i < 4; i++) {\n            out[i] = in[0] * matrix[0 * 4 + i] + in[1] * matrix[1 * 4 + i] + in[2] * matrix[2 * 4 + i] +\n                     in[3] * matrix[3 * 4 + i];\n        }\n    }\n\n    /*\n    ** inverse = invert(src)\n    */\n    static int __gluInvertMatrixd(const GLdouble src[16], GLdouble inverse[16]) {\n        int i, j, k, swap;\n        double t;\n        GLdouble temp[4][4];\n\n        for (i = 0; i < 4; i++) {\n            for (j = 0; j < 4; j++) {\n                temp[i][j] = src[i * 4 + j];\n            }\n        }\n        __gluMakeIdentityd(inverse);\n\n        for (i = 0; i < 4; i++) {\n            /*\n            ** Look for largest element in column\n            */\n            swap = i;\n            for (j = i + 1; j < 4; j++) {\n                if (fabs(temp[j][i]) > fabs(temp[i][i])) {\n                    swap = j;\n                }\n            }\n\n            if (swap != i) {\n                /*\n                ** Swap rows.\n                */\n                for (k = 0; k < 4; k++) {\n                    t = temp[i][k];\n                    temp[i][k] = temp[swap][k];\n                    temp[swap][k] = t;\n\n                    t = inverse[i * 4 + k];\n                    inverse[i * 4 + k] = inverse[swap * 4 + k];\n                    inverse[swap * 4 + k] = t;\n                }\n            }\n\n            if (temp[i][i] == 0) {\n                /*\n                ** No non-zero pivot.  The matrix is singular, which shouldn't\n                ** happen.  This means the user gave us a bad matrix.\n                */\n                return GL_FALSE;\n            }\n\n            t = temp[i][i];\n            for (k = 0; k < 4; k++) {\n                temp[i][k] /= t;\n                inverse[i * 4 + k] /= t;\n            }\n            for (j = 0; j < 4; j++) {\n                if (j != i) {\n                    t = temp[j][i];\n                    for (k = 0; k < 4; k++) {\n                        temp[j][k] -= temp[i][k] * t;\n                        inverse[j * 4 + k] -= inverse[i * 4 + k] * t;\n                    }\n                }\n            }\n        }\n        return GL_TRUE;\n    }\n\n    static void __gluMultMatricesd(const GLdouble a[16], const GLdouble b[16], GLdouble r[16]) {\n        int i, j;\n\n        for (i = 0; i < 4; i++) {\n            for (j = 0; j < 4; j++) {\n                r[i * 4 + j] = a[i * 4 + 0] * b[0 * 4 + j] + a[i * 4 + 1] * b[1 * 4 + j] +\n                               a[i * 4 + 2] * b[2 * 4 + j] + a[i * 4 + 3] * b[3 * 4 + j];\n            }\n        }\n    }\n\n    GLint gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz, const GLdouble modelMatrix[16],\n                       const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *objx, GLdouble *objy,\n                       GLdouble *objz) {\n        double finalMatrix[16];\n        double in[4];\n        double out[4];\n\n        __gluMultMatricesd(modelMatrix, projMatrix, finalMatrix);\n        if (!__gluInvertMatrixd(finalMatrix, finalMatrix))\n            return (GL_FALSE);\n\n        in[0] = winx;\n        in[1] = winy;\n        in[2] = winz;\n        in[3] = 1.0;\n\n        /* Map x and y from window coordinates */\n        in[0] = (in[0] - viewport[0]) / viewport[2];\n        in[1] = (in[1] - viewport[1]) / viewport[3];\n\n        /* Map to range -1 to 1 */\n        in[0] = in[0] * 2 - 1;\n        in[1] = in[1] * 2 - 1;\n        in[2] = in[2] * 2 - 1;\n\n        __gluMultMatrixVecd(finalMatrix, in, out);\n        if (out[3] == 0.0)\n            return (GL_FALSE);\n        out[0] /= out[3];\n        out[1] /= out[3];\n        out[2] /= out[3];\n        *objx = out[0];\n        *objy = out[1];\n        *objz = out[2];\n        return (GL_TRUE);\n    }\n} // namespace glureimpl\n"
  },
  {
    "path": "depthmapX/views/CMakeLists.txt",
    "content": "target_sources(depthmapX\n    PRIVATE\n        mapview.cpp\n        viewhelpers.cpp\n        glview/gllinesuniform.cpp\n        glview/glview.cpp\n        glview/gllines.cpp\n        glview/glrastertexture.cpp\n        glview/glpolygons.cpp\n        glview/glutriangulator.cpp\n        glview/gltrianglesuniform.cpp\n        glview/glpointmap.cpp\n        glview/glshapegraph.cpp\n        glview/glshapemap.cpp\n        glview/gldynamicrect.cpp\n        glview/gldynamicline.cpp\n        plotview/plotview.cpp\n        tableview/tableview.cpp\n        depthmapview/depthmapview.cpp\n        3dview/3dview.cpp\n        glview/glregularpolygons.cpp\n        glview/gltriangles.cpp\n    PUBLIC\n        mapview.h\n        viewhelpers.h\n        glview/gllinesuniform.h\n        glview/glview.h\n        glview/gllines.h\n        glview/glrastertexture.h\n        glview/glpolygons.h\n        glview/glutriangulator.h\n        glview/gltrianglesuniform.h\n        glview/glpointmap.h\n        glview/glshapegraph.h\n        glview/glshapemap.h\n        glview/gldynamicrect.h\n        glview/gldynamicline.h\n        plotview/plotview.h\n        tableview/tableview.h\n        depthmapview/depthmapview.h\n        glview/glregularpolygons.h\n        glview/gltriangles.h\n        3dview/3dview.h)\n\n"
  },
  {
    "path": "depthmapX/views/depthmapview/depthmapview.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2017 Christian Sailer\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include <QEvent>\r\n#include <QToolBar>\r\n#include <QtGui>\r\n#include <QtWidgets/QMessageBox>\r\n\r\n#include <qactiongroup.h>\r\n#include <qapplication.h>\r\n#include <qclipboard.h>\r\n#include <qdebug.h>\r\n#include <qdesktopwidget.h>\r\n#include <qevent.h>\r\n#include <qfiledialog.h>\r\n#include <qmenu.h>\r\n#include <qpainter.h>\r\n#include <qsettings.h>\r\n\r\n#include \"depthmapX/views/viewhelpers.h\"\r\n#include \"depthmapview.h\"\r\n#include \"mainwindow.h\"\r\n\r\nclass QToolBar;\r\n\r\n#include \"compatibilitydefines.h\"\r\n\r\n#define DMP_TIMER_SPLASH 1\r\n#define DMP_TIMER_REDRAW 2\r\n#define DMP_TIMER_HOVER 3\r\n#define DMP_TIMER_3DVIEW 4\r\n\r\n// version 5.0 dll exports have split out the attribute table\r\n// functionality, so a single class operates with the VGA interface\r\n// and the Axial interface, this means previous DLLs will not work\r\n// with version 5.0 and above\r\n// version 5.09 dll has reconfigured the data layers into shape layers:\r\n// this means previous DLLs will not work with version 5.09 and above\r\n// version 7.08 dll has a very slight change so that the analysis type\r\n// is sent to the attribute table -- if it is vga it will work off pixelrefs,\r\n// otherwise it will work off rowids\r\n// version 7.09 dll has a new version number function so that \"idepthmap.h\"\r\n// can be included multiple times in user projects\r\n// version 8.00 dll has significant upgrades to the naming conventions,\r\n// the ability to perform whole graph analyses and adding shapes\r\n// version 10.04 dll has further upgrades to naming conventions,\r\n// also, extra functions for the sala.dll build: includes graph opening, closing and so on\r\n\r\n// QT_BEGIN_NAMESPACE\r\n// Palette entries...\r\n// A set of colours we would really like to have\r\n\r\nstatic int pressed_nFlags;\r\n\r\ninline Point2f QDepthmapView::LogicalUnits(const QPoint &p) {\r\n    return m_centre + Point2f(m_unit * double(p.x() - m_physical_centre.width()),\r\n                              m_unit *double(m_physical_centre.height() - p.y()));\r\n}\r\n\r\ninline QPoint QDepthmapView::PhysicalUnits(const Point2f &p) {\r\n    return QPoint(m_physical_centre.width() + int((p.x - m_centre.x) / m_unit + 0.4999),\r\n                  m_physical_centre.height() - int((p.y - m_centre.y) / m_unit + 0.4999));\r\n}\r\n\r\ninline int PixelDist(QPoint a, QPoint b) {\r\n    return (int)sqrt(double((b.x() - a.x()) * (b.x() - a.x()) + (b.y() - a.y()) * (b.y() - a.y())));\r\n}\r\n\r\nstatic QRgb colorMerge(QRgb color, QRgb mergecolor) { return (color & 0x006f6f6f) | (mergecolor & 0x00a0a0a0); }\r\n\r\nQDepthmapView::QDepthmapView(QGraphDoc &pDoc, Settings &settings, QWidget *parent) : MapView(pDoc, settings, parent) {\r\n    m_drag_rect_a.setRect(0, 0, 0, 0);\r\n    m_drag_rect_b.setRect(0, 0, 0, 0);\r\n\r\n    // Several screen drawing booleans:\r\n    m_continue_drawing = false;\r\n    m_drawing = false;\r\n    m_queued_redraw = false;\r\n\r\n    m_viewport_set = false;\r\n    m_clear = false;\r\n    m_redraw = false;\r\n\r\n    m_redraw_all = false;\r\n    m_redraw_no_clear = false;\r\n\r\n    m_resize_viewport = false;\r\n    m_invalidate = false; // our own invalidation\r\n\r\n    m_right_mouse_drag = false;\r\n    m_alt_mode = false;\r\n\r\n    m_current_mode = NONE;\r\n\r\n    m_snap = false;\r\n    m_repaint_tag = 0;\r\n    m_showlinks = false;\r\n    m_mouse_mode = SELECT;\r\n    m_fillmode = FULLFILL;\r\n\r\n    m_active_point_handle = -1;\r\n    m_poly_points = 0;\r\n    PafColor selcol(SALA_SELECTED_COLOR);\r\n\r\n    m_selected_color = qRgb(selcol.redb(), selcol.greenb(), selcol.blueb());\r\n\r\n    m_initialSize = m_settings.readSetting(SettingTag::depthmapViewSize, QSize(2000, 2000)).toSize();\r\n\r\n    installEventFilter(this);\r\n\r\n    setAttribute(Qt::WA_NoBackground, 1);\r\n    setMouseTracking(1);\r\n    setWindowIcon(QIcon(tr(\":/images/cur/icon-1-4.png\")));\r\n}\r\n\r\nQDepthmapView::~QDepthmapView() { m_settings.writeSetting(SettingTag::depthmapViewSize, size()); }\r\n\r\nint QDepthmapView::OnRedraw(int wParam, int lParam) {\r\n    if (m_pDoc.GetRemenuFlag(QGraphDoc::VIEW_MAP)) {\r\n        m_pDoc.SetRemenuFlag(QGraphDoc::VIEW_MAP, false);\r\n        // redo the menus for this *view* directly:\r\n        //((CChildFrame*) GetParentFrame())->m_view_selector.RedoMenu( *m_pDoc.m_meta_graph );\r\n    }\r\n    if (m_pDoc.GetRedrawFlag(QGraphDoc::VIEW_MAP) != QGraphDoc::REDRAW_DONE) {\r\n        if (!m_pDoc.m_communicator) {\r\n            m_queued_redraw = false;\r\n            switch (m_pDoc.GetRedrawFlag(QGraphDoc::VIEW_MAP)) {\r\n            case QGraphDoc::REDRAW_POINTS:\r\n                if (m_pDoc.m_meta_graph->viewingProcessedLines()) {\r\n                    // Axial lines are thicker on selection, so background needs clearing\r\n                    m_redraw_all = true;\r\n                } else {\r\n                    m_redraw_no_clear = true;\r\n                }\r\n                break;\r\n            case QGraphDoc::REDRAW_GRAPH:\r\n                m_redraw_all = true;\r\n                break;\r\n            case QGraphDoc::REDRAW_TOTAL:\r\n                m_viewport_set = false;\r\n                m_redraw_all = true;\r\n                break;\r\n            }\r\n            m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_DONE);\r\n            repaint();\r\n        } else {\r\n            killTimer(Tid_redraw);\r\n            startTimer(100);\r\n            m_queued_redraw = true;\r\n        }\r\n    }\r\n    return 0;\r\n}\r\n\r\nstatic QPoint hit_point;\r\nbool QDepthmapView::eventFilter(QObject *object, QEvent *e) {\r\n    // Get the keyboard modifiers and set them in pressed_nFlags.\r\n    switch (e->type()) {\r\n    case QEvent::MouseButtonPress:\r\n    case QEvent::MouseButtonRelease:\r\n    case QEvent::MouseButtonDblClick:\r\n    case QEvent::MouseMove: {\r\n        Qt::KeyboardModifiers keyMods = QApplication::keyboardModifiers();\r\n        pressed_nFlags = (keyMods & Qt::ShiftModifier) ? pressed_nFlags |= MK_SHIFT : pressed_nFlags &= ~MK_SHIFT;\r\n        pressed_nFlags =\r\n            (keyMods & Qt::ControlModifier) ? pressed_nFlags |= MK_CONTROL : pressed_nFlags &= ~MK_CONTROL;\r\n        break;\r\n    }\r\n    default:\r\n        break;\r\n    }\r\n\r\n    if (e->type() == QEvent::ToolTip) {\r\n        if (!m_pDoc.m_communicator) {\r\n            if (m_pDoc.m_meta_graph) {\r\n                if (m_pDoc.m_meta_graph->viewingProcessed() && m_pDoc.m_meta_graph->getSelCount() > 1) {\r\n                    float val = m_pDoc.m_meta_graph->getSelAvg();\r\n                    int count = m_pDoc.m_meta_graph->getSelCount();\r\n                    if (val == -1.0f)\r\n                        setToolTip(\"Null selection\");\r\n                    else if (val != -2.0f)\r\n                        setToolTip(QString(\"Selection\\nAverage: %1\\nCount: %2\").arg(val).arg(count));\r\n                    else\r\n                        setToolTip(\"\");\r\n                } else if (m_pDoc.m_meta_graph->viewingProcessed()) {\r\n                    // and that it has an appropriate state to display a hover wnd\r\n                    float val = m_pDoc.m_meta_graph->getLocationValue(LogicalUnits(hit_point));\r\n                    if (val == -1.0f)\r\n                        setToolTip(\"No value\");\r\n                    else if (val != -2.0f)\r\n                        setToolTip(QString(\"%1\").arg(val));\r\n                    else\r\n                        setToolTip(\"\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return QObject::eventFilter(object, e);\r\n}\r\n\r\nvoid QDepthmapView::timerEvent(QTimerEvent *event) {\r\n    if (event->timerId() == Tid_redraw) {\r\n        if (m_queued_redraw) {\r\n            // Internal own redraw\r\n            OnRedraw(0, 0);\r\n        } else if (m_continue_drawing) {\r\n            if (!m_drawing) {\r\n                m_internal_redraw = true;\r\n                repaint();\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::InitViewport(const QRect &phys_bounds, QGraphDoc *pDoc) {\r\n    QtRegion bounds = pDoc->m_meta_graph->getBoundingBox();\r\n    m_unit = __max(bounds.width() / double(phys_bounds.width()), bounds.height() / double(phys_bounds.height()));\r\n    m_centre = bounds.getCentre();\r\n    m_physical_centre = QSize(phys_bounds.width() / 2, phys_bounds.height() / 2);\r\n\r\n    m_viewport_set = true;\r\n}\r\n\r\nQtRegion QDepthmapView::LogicalViewport(const QRect &phys_bounds, QGraphDoc *pDoc) {\r\n    if (m_resize_viewport) {\r\n        m_physical_centre = QSize(phys_bounds.width() / 2, phys_bounds.height() / 2);\r\n        m_resize_viewport = false;\r\n    }\r\n\r\n    return QtRegion(LogicalUnits(QPoint(phys_bounds.left(), phys_bounds.bottom())),\r\n                    LogicalUnits(QPoint(phys_bounds.right(), phys_bounds.top())));\r\n}\r\n\r\nvoid QDepthmapView::SetRedrawflag() {\r\n    if (m_pDoc.GetRemenuFlag(QGraphDoc::VIEW_MAP))\r\n        m_pDoc.SetRemenuFlag(QGraphDoc::VIEW_MAP, false);\r\n\r\n    if (m_pDoc.GetRedrawFlag(QGraphDoc::VIEW_MAP) != QGraphDoc::REDRAW_DONE) {\r\n        if (m_pDoc.m_communicator) {\r\n            m_queued_redraw = false;\r\n            switch (m_pDoc.GetRedrawFlag(QGraphDoc::VIEW_MAP)) {\r\n            case QGraphDoc::REDRAW_POINTS:\r\n                if (m_pDoc.m_meta_graph->viewingProcessedLines()) {\r\n                    // Axial lines are thicker on selection, so background needs clearing\r\n                    m_redraw_all = true;\r\n                } else {\r\n                    m_redraw_no_clear = true;\r\n                }\r\n                break;\r\n\r\n            case QGraphDoc::REDRAW_GRAPH:\r\n                m_redraw_all = true;\r\n                break;\r\n\r\n            case QGraphDoc::REDRAW_TOTAL:\r\n                m_viewport_set = false;\r\n                m_redraw_all = true;\r\n                break;\r\n            }\r\n            m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_DONE);\r\n        } else {\r\n            killTimer(Tid_redraw);\r\n            Tid_redraw = startTimer(100);\r\n            m_queued_redraw = true;\r\n        }\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::paintEvent(QPaintEvent *) {\r\n    QPainter pDC(m_pixmap);\r\n\r\n    SetRedrawflag();\r\n\r\n    foreach (QWidget *widget, QApplication::topLevelWidgets()) {\r\n        MainWindow *mainWin = qobject_cast<MainWindow *>(widget);\r\n        if (mainWin) {\r\n            m_foreground = mainWin->m_foreground;\r\n            m_background = mainWin->m_background;\r\n            mainWin->updateToolbar();\r\n            break;\r\n        }\r\n    }\r\n\r\n    /* if (pDC->IsPrinting())\r\n       {\r\n          if (!m_pDoc.m_meta_graph->setLock(this))\r\n              {\r\n             return;\r\n          }\r\n\r\n          PrintBaby(pDC, m_pDoc);\r\n\r\n          m_pDoc.m_meta_graph->releaseLock(this);\r\n\r\n          return;\r\n       }*/\r\n\r\n    auto lock = m_pDoc.m_meta_graph->getLockDeferred();\r\n    if (!lock.try_lock()) {\r\n        return;\r\n    }\r\n\r\n    m_drawing = true;\r\n\r\n    QRect rect;\r\n    int state = m_pDoc.m_meta_graph->getState();\r\n\r\n    if (m_invalidate) {\r\n        //   selected colour is used for picking up highlights in OnMouseMove\r\n        pDC.setPen(QPen(QBrush(QColor(m_selected_color)), 1, Qt::DotLine, Qt::RoundCap));\r\n\r\n        if (m_invalidate & DRAWLINE) {\r\n            if ((m_repaint_tag & DRAWLINE) && (m_invalidate == DRAWLINE || m_invalidate == LINEOFF)) {\r\n                QRect tmpRect(PhysicalUnits(m_old_line.start()), PhysicalUnits(m_old_line.end()));\r\n                DrawLine(&pDC, tmpRect, 0);\r\n                m_repaint_tag &= ~DRAWLINE;\r\n            } else if (m_invalidate == DRAWLINE || m_invalidate == LINEON) {\r\n                QRect tmpRect(PhysicalUnits(m_line.start()), PhysicalUnits(m_line.end()));\r\n                DrawLine(&pDC, tmpRect, 1);\r\n                m_old_line = m_line;\r\n                m_repaint_tag |= DRAWLINE;\r\n            }\r\n            m_invalidate = 0;\r\n        } else if (m_invalidate & SNAP) {\r\n            if ((m_repaint_tag & SNAP) && (m_invalidate == SNAP || m_invalidate == SNAPOFF)) {\r\n                QPoint tmppoint(PhysicalUnits(m_old_snap_point));\r\n                DrawCross(&pDC, tmppoint, 0);\r\n                m_repaint_tag &= ~SNAP;\r\n            }\r\n            if (m_invalidate == SNAP || m_invalidate == SNAPON) {\r\n                QPoint tmppoint(PhysicalUnits(m_snap_point));\r\n                DrawCross(&pDC, tmppoint, 1);\r\n                m_repaint_tag |= SNAP;\r\n            }\r\n            m_old_snap_point = m_snap_point;\r\n            m_invalidate = 0;\r\n        } else {\r\n            pDC.setCompositionMode(QPainter::RasterOp_SourceXorDestination);\r\n            if (!m_drag_rect_b.isEmpty())\r\n                pDC.drawRect(m_drag_rect_b);\r\n            if (!m_drag_rect_a.isEmpty())\r\n                pDC.drawRect(m_drag_rect_a);\r\n            pDC.setCompositionMode(QPainter::CompositionMode_SourceOver);\r\n\r\n            m_drag_rect_b = m_drag_rect_a;\r\n            m_invalidate = 0;\r\n        }\r\n    } else if (m_redraw_all || m_redraw_no_clear) {\r\n        m_repaint_tag = 0; // <- for things that remember pixels in last paint colour (e.g., DrawCross and DrawLine\r\n        rect = QRect(0, 0, width(), height());\r\n        m_redraw = true;\r\n\r\n        if (!m_viewport_set && state & (MetaGraph::LINEDATA | MetaGraph::SHAPEGRAPHS | MetaGraph::DATAMAPS)) {\r\n            InitViewport(rect, &m_pDoc);\r\n        }\r\n        if (m_redraw_all) {\r\n            m_clear = true;\r\n        }\r\n\r\n        m_redraw_all = false;\r\n        m_redraw_no_clear = false;\r\n    } else if (!m_internal_redraw) {\r\n        // Give up on this: it just doesn't work on NT\r\n        // && DCB_RESET != pDC->GetBoundsRect(rect, DCB_RESET)) {\r\n        rect = QRect(0, 0, width(), height());\r\n\r\n        m_clear = true;\r\n        m_redraw = true;\r\n    }\r\n    m_internal_redraw = false;\r\n\r\n    // if redraw signalled:\r\n    if (m_redraw && (state & (MetaGraph::LINEDATA | MetaGraph::SHAPEGRAPHS | MetaGraph::DATAMAPS)) && m_viewport_set) {\r\n\r\n        // note that the redraw rect is dependent on the cleared portion above\r\n        // note you *must* check *state* before drawing, you cannot rely on view_class as it can be set up before the\r\n        // layer is ready to draw:\r\n        if (state & MetaGraph::POINTMAPS &&\r\n            (!m_pDoc.m_meta_graph->getDisplayedPointMap().isProcessed() ||\r\n             m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWVGA | MetaGraph::VIEWBACKVGA)) &&\r\n            !m_pDoc.m_communicator) // <- m_communicator because I'm having thread locking problems\r\n        {\r\n            m_pDoc.m_meta_graph->getDisplayedPointMap().setScreenPixel(m_unit); // only used by points (at the moment!)\r\n            m_pDoc.m_meta_graph->getDisplayedPointMap().makeViewportPoints(LogicalViewport(rect, &m_pDoc));\r\n        }\r\n        if (state & MetaGraph::SHAPEGRAPHS &&\r\n            (m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWAXIAL | MetaGraph::VIEWBACKAXIAL))) {\r\n            m_pDoc.m_meta_graph->getDisplayedShapeGraph().makeViewportShapes(LogicalViewport(rect, &m_pDoc));\r\n        }\r\n        if (state & MetaGraph::DATAMAPS &&\r\n            (m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWBACKDATA | MetaGraph::VIEWDATA))) {\r\n            m_pDoc.m_meta_graph->getDisplayedDataMap().makeViewportShapes(LogicalViewport(rect, &m_pDoc));\r\n        }\r\n        if (state & MetaGraph::LINEDATA) {\r\n            m_pDoc.m_meta_graph->makeViewportShapes(LogicalViewport(rect, &m_pDoc));\r\n        }\r\n\r\n        m_continue_drawing = true;\r\n        m_redraw = false;\r\n    }\r\n\r\n    if (m_clear) {\r\n        pDC.fillRect(rect, QBrush(QColor(m_background)));\r\n        m_clear = false;\r\n    }\r\n\r\n    // If the meta graph (at least) contains a DXF, draw it:\r\n    if (m_continue_drawing && (state & (MetaGraph::LINEDATA | MetaGraph::SHAPEGRAPHS | MetaGraph::DATAMAPS)) &&\r\n        m_viewport_set) {\r\n        if (Output(&pDC, &m_pDoc, true)) {\r\n            Tid_redraw = startTimer(100);\r\n            m_continue_drawing = true;\r\n        } else {\r\n            m_continue_drawing = false;\r\n            // Finished: kill the timer:\r\n            if (!m_queued_redraw) {\r\n                killTimer(Tid_redraw);\r\n            }\r\n        }\r\n    } else {\r\n        m_continue_drawing = false; // can't draw for some reason\r\n    }\r\n\r\n    m_drawing = false;\r\n    QPainter screenPainter(this);\r\n    screenPainter.drawPixmap(0, 0, width(), height(), *m_pixmap);\r\n}\r\n\r\nvoid QDepthmapView::resizeGL(int w, int h) {\r\n    //   m_viewport_set = false;\r\n    m_redraw_all = true;\r\n    m_resize_viewport = true;\r\n    m_pDoc.m_view[QGraphDoc::VIEW_MAP] = this;\r\n    m_pixmap = new QPixmap(w, h);\r\n    update();\r\n}\r\n\r\nvoid QDepthmapView::BeginDrag(QPoint point) {\r\n    m_current_mode = NONE;\r\n    int handle = -1;\r\n    for (size_t i = 0; i < m_point_handles.size(); i++) {\r\n        QPoint pt = PhysicalUnits(m_point_handles[i]);\r\n        if (abs(pt.x() - point.x()) < 7 && abs(pt.y() - point.y()) < 7) {\r\n            handle = (int)i;\r\n            m_mouse_mode |= OVERHANDLE;\r\n            SetCursor(m_mouse_mode);\r\n            break;\r\n        }\r\n    }\r\n    m_active_point_handle = handle;\r\n    // for now, only two handles exist:\r\n    if (m_active_point_handle != -1) {\r\n        if (m_active_point_handle == 0) {\r\n            m_line = Line(m_point_handles[1], m_point_handles[0]);\r\n        } else {\r\n            m_line = Line(m_point_handles[0], m_point_handles[1]);\r\n        }\r\n        m_mouse_mode |= DRAWLINE;\r\n        m_mouse_mode &= ~OVERHANDLE;\r\n        SetCursor(m_mouse_mode);\r\n        m_invalidate = LINEON;\r\n        update();\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::mouseMoveEvent(QMouseEvent *e) {\r\n    QPoint point = e->pos();\r\n\r\n    if (pressed_nFlags & MK_CONTROL) {\r\n        if (pressed_nFlags & MK_SHIFT) {\r\n            // CTRL and SHIFT key down together, snap to displayed drawing layers\r\n            // (note, don't use SHIFT on it's own, because that's already used for multiple select)\r\n            MetaGraph *graph = m_pDoc.m_meta_graph;\r\n            Point2f p = LogicalUnits(point);\r\n            double d = -1.0;\r\n            for (int i = 0; i < graph->getLineFileCount(); i++) {\r\n                for (int j = 0; j < graph->getLineLayerCount(i); j++) {\r\n                    ShapeMap &map = graph->getLineLayer(i, j);\r\n                    if (map.isShown()) {\r\n                        Point2f px = map.getClosestVertex(p);\r\n                        if (!px.atZero() && (d == -1 || dist(p, px) < d)) {\r\n                            d = dist(p, px);\r\n                            m_snap_point = px;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            if (d != -1) {\r\n                point = PhysicalUnits(m_snap_point);\r\n                if (!m_snap) {\r\n                    m_invalidate = SNAPON;\r\n                    m_snap = true;\r\n                    update();\r\n                } else if (m_old_snap_point != m_snap_point) {\r\n                    m_invalidate = SNAP;\r\n                    m_snap = true;\r\n                    update();\r\n                }\r\n            }\r\n        } else {\r\n            // If only CTRL key down, snap to grid\r\n            if (m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWVGA | MetaGraph::VIEWBACKVGA)) {\r\n                PointMap &map = m_pDoc.m_meta_graph->getDisplayedPointMap();\r\n                if (m_pDoc.m_meta_graph->getDisplayedPointMap().getSpacing() / m_unit > 20) {\r\n                    // hi-res snap when zoomed in\r\n                    m_snap_point = map.depixelate(map.pixelate(LogicalUnits(point), false, 2), 0.5);\r\n                } else {\r\n                    m_snap_point = map.depixelate(map.pixelate(LogicalUnits(point)));\r\n                }\r\n                point = PhysicalUnits(m_snap_point);\r\n                if (!m_snap) {\r\n                    m_invalidate = SNAPON;\r\n                    m_snap = true;\r\n                    update();\r\n                } else if (m_old_snap_point != m_snap_point) {\r\n                    m_invalidate = SNAP;\r\n                    m_snap = true;\r\n                    update();\r\n                }\r\n            }\r\n        }\r\n    } else if (m_snap) {\r\n        m_invalidate = SNAPOFF;\r\n        update();\r\n        m_snap = false;\r\n    }\r\n\r\n    // Left button down...\r\n    if (pressed_nFlags & MK_LBUTTON) {\r\n        if (m_current_mode == DRAG) {\r\n\r\n            point -= m_mouse_point;\r\n            m_drag_rect_a.translate(point);\r\n            m_centre.x -= double(point.x()) * m_unit;\r\n            m_centre.y += double(point.y()) * m_unit;\r\n            m_mouse_point += point;\r\n\r\n            m_invalidate = DRAG;\r\n            update();\r\n        } else if (m_current_mode == SELECT || m_current_mode == ZOOM_IN || m_current_mode == JOIN ||\r\n                   m_current_mode == UNJOIN) {\r\n            int x1, y1, x2, y2;\r\n            if (m_mouse_point.x() > point.x()) {\r\n                x1 = point.x();\r\n                x2 = m_mouse_point.x() - 1;\r\n            } else {\r\n                x1 = m_mouse_point.x();\r\n                x2 = point.x() - 1;\r\n            }\r\n\r\n            if (m_mouse_point.y() > point.y()) {\r\n                y1 = point.y();\r\n                y2 = m_mouse_point.y() - 1;\r\n            } else {\r\n                y1 = m_mouse_point.y();\r\n                y2 = point.y() - 1;\r\n            }\r\n            m_drag_rect_a = QRect(x1, y1, x2 - x1, y2 - y1);\r\n            m_invalidate = SELECT;\r\n            update();\r\n\r\n        }\r\n        // NB. deliberatle mouse mode not current mode\r\n        else if (m_mouse_mode == (SELECT | OVERHANDLE)) {\r\n            // ideally, I would enforce click once, move to location, and click again, but this\r\n            // at least allows novices to use it easily:\r\n            if (abs(point.x() - m_mouse_point.x()) + abs(point.y() - m_mouse_point.y()) > 3) {\r\n                BeginDrag(m_mouse_point);\r\n                m_current_mode = SELECT | DRAWLINE;\r\n            }\r\n        }\r\n        // NB. deliberatle mouse mode not current mode\r\n        else if (m_mouse_mode == LINETOOL) {\r\n            // ideally, I would enforce click once, move to location, and click again, but this\r\n            // at least allows novices to use it easily:\r\n            if (PixelDist(point, m_mouse_point) > 6) {\r\n                m_mouse_mode |= DRAWLINE;\r\n                m_current_mode = m_mouse_mode;\r\n                m_line = Line(m_mouse_location, LogicalUnits(point));\r\n                m_invalidate = LINEON;\r\n                update();\r\n            }\r\n        } else if (m_current_mode == PENCIL) {\r\n            if (m_mouse_point != point &&\r\n                m_pDoc.m_meta_graph->getDisplayedPointMap().pixelate(LogicalUnits(point)) !=\r\n                    m_pDoc.m_meta_graph->getDisplayedPointMap().pixelate(LogicalUnits(m_mouse_point))) {\r\n                m_pDoc.m_meta_graph->getDisplayedPointMap().fillPoint(LogicalUnits(point), true);\r\n                m_redraw_no_clear = true;\r\n                m_mouse_point = point;\r\n                // Redraw scene\r\n                update();\r\n            }\r\n        } else if (m_current_mode == ERASE) {\r\n            if (m_mouse_point != point &&\r\n                m_pDoc.m_meta_graph->getDisplayedPointMap().pixelate(LogicalUnits(point)) !=\r\n                    m_pDoc.m_meta_graph->getDisplayedPointMap().pixelate(LogicalUnits(m_mouse_point))) {\r\n                m_pDoc.m_meta_graph->getDisplayedPointMap().fillPoint(LogicalUnits(point), false);\r\n                m_redraw_no_clear = true;\r\n                m_mouse_point = point;\r\n                // Redraw scene\r\n                update();\r\n            }\r\n        }\r\n    } else if (pressed_nFlags & MK_RBUTTON) {\r\n        if (!m_right_mouse_drag && abs(point.x() - m_mouse_point.x()) + abs(point.y() - m_mouse_point.y()) > 3) {\r\n            // begin right mouse drag:\r\n            SetCursor(DRAG);\r\n            m_mouse_point = point;\r\n\r\n            m_drag_rect_a = QRect(0, 0, width(), height());\r\n            m_drag_rect_b = QRect(0, 0, 0, 0);\r\n            m_invalidate = DRAG;\r\n            update();\r\n\r\n            // SetCapture();\r\n\r\n            m_right_mouse_drag = true;\r\n        } else if (m_right_mouse_drag) {\r\n            // continue right mouse drag\r\n            point -= m_mouse_point;\r\n            m_drag_rect_a.translate(point);\r\n            m_centre.x -= double(point.x()) * m_unit;\r\n            m_centre.y += double(point.y()) * m_unit;\r\n            m_mouse_point += point;\r\n            m_invalidate = DRAG;\r\n            update();\r\n        }\r\n    } else if ((m_mouse_mode & SELECT) && !(m_mouse_mode & DRAWLINE) && !m_right_mouse_drag) {\r\n        // in select mode, might be over a point handle -- if so, change the cursor:\r\n        if (m_point_handles.size()) {\r\n            bool found = false;\r\n            for (size_t i = 0; i < m_point_handles.size(); i++) {\r\n                QPoint pt = PhysicalUnits(m_point_handles[i]);\r\n                if (abs(pt.x() - point.x()) < 7 && abs(pt.y() - point.y()) < 7) {\r\n                    found = true;\r\n                    m_mouse_mode |= OVERHANDLE;\r\n                    SetCursor(m_mouse_mode);\r\n                    break;\r\n                }\r\n            }\r\n            if (!found && (m_mouse_mode & OVERHANDLE)) {\r\n                m_mouse_mode &= ~OVERHANDLE;\r\n                SetCursor(m_mouse_mode);\r\n            }\r\n        } else if (m_mouse_mode & OVERHANDLE) {\r\n            m_mouse_mode &= ~OVERHANDLE;\r\n            SetCursor(m_mouse_mode);\r\n        }\r\n    }\r\n\r\n    if (!m_right_mouse_drag) {\r\n        if (m_mouse_mode & DRAWLINE) {\r\n            m_line = Line(m_line.t_start(), m_snap ? m_snap_point : LogicalUnits(point));\r\n            if (m_line.t_end() != m_old_line.t_end()) {\r\n                m_invalidate = DRAWLINE;\r\n                update();\r\n            }\r\n        } else if (m_mouse_mode & JOINB) {\r\n            point -= m_mouse_point;\r\n            m_drag_rect_a.translate(point);\r\n            m_mouse_point += point;\r\n            // Redraw scene\r\n            m_invalidate = JOINB;\r\n            update();\r\n        }\r\n    }\r\n\r\n    m_pDoc.m_position = m_snap ? m_snap_point : LogicalUnits(point);\r\n    m_pDoc.UpdateMainframestatus();\r\n    hit_point = point;\r\n}\r\n\r\nvoid QDepthmapView::mouseDoubleClickEvent(QMouseEvent *e) {}\r\n\r\nvoid QDepthmapView::mousePressEvent(QMouseEvent *e) {\r\n    switch (e->button()) {\r\n    case Qt::LeftButton:\r\n        pressed_nFlags = MK_LBUTTON;\r\n        break;\r\n    case Qt::RightButton:\r\n        pressed_nFlags = MK_RBUTTON;\r\n        break;\r\n    default:\r\n        break;\r\n    }\r\n    QPoint point = e->pos();\r\n    if (pressed_nFlags & MK_RBUTTON) {\r\n        if (m_snap) {\r\n            point = PhysicalUnits(m_snap_point);\r\n        }\r\n        m_mouse_point = point;\r\n    } else {\r\n        if (m_snap) {\r\n            point = PhysicalUnits(m_snap_point);\r\n        }\r\n\r\n        m_mouse_point = point;\r\n        m_mouse_location = m_snap ? m_snap_point : LogicalUnits(point);\r\n        // Just reset?\r\n\r\n        m_current_mode = NONE;\r\n        if (m_current_mode == NONE) {\r\n            m_current_mode = m_mouse_mode;\r\n            switch (m_mouse_mode) {\r\n            case DRAG: {\r\n                m_mouse_point = point;\r\n                m_drag_rect_a = QRect(0, 0, width(), height());\r\n                m_drag_rect_b = QRect(0, 0, 0, 0);\r\n                m_invalidate = DRAG;\r\n                update();\r\n                // SetCapture();\r\n            } break;\r\n            case SELECT:\r\n            case ZOOM_IN:\r\n            case JOIN:\r\n            case UNJOIN: {\r\n                m_mouse_point = point;\r\n                m_drag_rect_a = QRect(0, 0, 0, 0);\r\n                m_drag_rect_b = QRect(0, 0, 0, 0);\r\n\r\n                m_invalidate = SELECT;\r\n                update();\r\n                // SetCapture();\r\n            } break;\r\n            case PENCIL: {\r\n                m_current_mode = PENCIL;\r\n                // Fill the point\r\n                m_pDoc.m_meta_graph->getDisplayedPointMap().fillPoint(LogicalUnits(point), true);\r\n                m_mouse_point = point;\r\n                // Redraw scene\r\n                m_redraw_no_clear = true;\r\n                update();\r\n            } break;\r\n            case ERASE:\r\n                // no longer used\r\n                break;\r\n            default:\r\n                break;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::BeginJoin() {\r\n    if (m_pDoc.m_meta_graph->getSelCount() > 1 && m_pDoc.m_meta_graph->viewingProcessedPoints()) {\r\n        QtRegion r = m_pDoc.m_meta_graph->getDisplayedPointMap().getSelBounds();\r\n        QRect rect(PhysicalUnits(Point2f(r.bottom_left.x, r.top_right.y)),\r\n                   PhysicalUnits(Point2f(r.top_right.x, r.bottom_left.y)));\r\n        int spacer = int(ceil(5.0 * m_pDoc.m_meta_graph->getDisplayedPointMap().getSpacing() / (m_unit * 10.0)));\r\n        m_mouse_point = this->rect().center();\r\n        m_drag_rect_a = QRect(-rect.width() - spacer / 2, -rect.height() - spacer / 2, spacer / 2, spacer / 2);\r\n        m_drag_rect_a.translate(m_mouse_point);\r\n    } else {\r\n        m_drag_rect_a = QRect(0, 0, 0, 0);\r\n    }\r\n    m_drag_rect_b = QRect(0, 0, 0, 0);\r\n\r\n    m_mouse_mode |= JOINB;\r\n    SetCursor(m_mouse_mode);\r\n}\r\n\r\nvoid QDepthmapView::mouseReleaseEvent(QMouseEvent *e) {\r\n    QPoint point = e->pos();\r\n    if (pressed_nFlags & MK_LBUTTON) {\r\n        if (m_snap) {\r\n            point = PhysicalUnits(m_snap_point);\r\n        }\r\n        Point2f location = m_snap ? m_snap_point : LogicalUnits(point);\r\n\r\n        switch (m_current_mode) {\r\n        case ZOOM_IN:\r\n            if (m_drag_rect_a.width() > 2 && m_drag_rect_a.height() > 2) {\r\n                QRect rect = QRect(0, 0, width(), height());\r\n                double ratio = __min(double(rect.height() / double(m_drag_rect_a.height())),\r\n                                     double(rect.width()) / double(m_drag_rect_a.width()));\r\n                ZoomTowards(1.0 / ratio, LogicalUnits(m_drag_rect_a.center()));\r\n            } else {\r\n                ZoomTowards(0.75, m_centre);\r\n            }\r\n            break;\r\n        case ZOOM_OUT: {\r\n            ZoomTowards(1.5, m_centre);\r\n        } break;\r\n        case DRAG: {\r\n            // Stop drag rect...\r\n            m_drag_rect_a = QRect(0, 0, 0, 0);\r\n            m_invalidate = DRAG;\r\n            update();\r\n\r\n            // Redraw scene\r\n            m_invalidate = 0;\r\n            m_redraw_all = true;\r\n            update();\r\n        } break;\r\n        case UNJOIN:\r\n        case SELECT:\r\n        case JOIN: {\r\n            QtRegion r;\r\n            if (m_drag_rect_a.isEmpty()) {\r\n                r = QtRegion(LogicalUnits(m_mouse_point), LogicalUnits(m_mouse_point));\r\n            } else {\r\n                r = QtRegion(LogicalUnits(QPoint(m_drag_rect_a.left(), m_drag_rect_a.bottom())),\r\n                             LogicalUnits(QPoint(m_drag_rect_a.right(), m_drag_rect_a.top())));\r\n            }\r\n\r\n            // Stop drag rect...\r\n            m_drag_rect_a = QRect(0, 0, 0, 0);\r\n            m_invalidate = SELECT;\r\n            update();\r\n\r\n            if (!m_pDoc.m_communicator) {\r\n                // After checking that processing isn't occurring...\r\n                // Do the selection (might take a while if someone selects the lot...)\r\n                if (pressed_nFlags & MK_SHIFT) {\r\n                    m_pDoc.m_meta_graph->setCurSel(r, true); // <- add to current sel\r\n                } else {\r\n                    m_pDoc.m_meta_graph->setCurSel(r, false); // <- reset current sel\r\n                }\r\n                // Redraw scene\r\n                m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_SELECTION);\r\n            }\r\n        } break;\r\n        case JOIN | JOINB: {\r\n            m_current_mode = NONE;\r\n            // now get on with join:\r\n            bool ok = false;\r\n            bool clearcursor = false;\r\n            if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                ok = m_pDoc.m_meta_graph->getDisplayedPointMap().mergePoints(LogicalUnits(point));\r\n            } else if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                if (m_pDoc.m_meta_graph->getSelCount() == 1) {\r\n                    ok = m_pDoc.m_meta_graph->getDisplayedShapeGraph().linkShapes(LogicalUnits(point));\r\n                } else {\r\n                    // oops: you are only allowed to join lines one to one:\r\n                    m_pDoc.m_meta_graph->clearSel();\r\n                    clearcursor = true;\r\n                }\r\n            }\r\n            if (clearcursor || ok) {\r\n                m_mouse_mode = JOIN;\r\n                SetCursor(JOIN);\r\n                m_drag_rect_a = QRect(0, 0, 0, 0);\r\n                if (ok) {\r\n                    m_pDoc.modifiedFlag = true;\r\n                    m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n                } else {\r\n                    m_redraw_all = true;\r\n                    update();\r\n                }\r\n            }\r\n        } break;\r\n        case UNJOIN | JOINB: {\r\n            m_current_mode = NONE;\r\n            // now get on with unjoin:\r\n            bool ok = false;\r\n            bool clearcursor = false;\r\n            if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                if (m_pDoc.m_meta_graph->getSelCount() == 1) {\r\n                    ok = m_pDoc.m_meta_graph->getDisplayedShapeGraph().unlinkShapes(LogicalUnits(point));\r\n                } else {\r\n                    // oops: you are only allowed to join lines one to one:\r\n                    m_pDoc.m_meta_graph->clearSel();\r\n                    clearcursor = true;\r\n                }\r\n            }\r\n            if (clearcursor || ok) {\r\n                m_mouse_mode = UNJOIN;\r\n                SetCursor(UNJOIN);\r\n                m_drag_rect_a = QRect(0, 0, 0, 0);\r\n                if (ok) {\r\n                    m_pDoc.modifiedFlag = true;\r\n                    m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n                } else {\r\n                    m_redraw_all = true;\r\n                    update();\r\n                }\r\n            }\r\n        } break;\r\n        case SELECT | DRAWLINE: {\r\n            m_current_mode = NONE;\r\n            m_mouse_mode &= ~DRAWLINE;\r\n            m_invalidate = LINEOFF;\r\n            SetCursor(m_mouse_mode);\r\n            update();\r\n            if (m_pDoc.m_meta_graph->moveSelShape(Line(m_line.t_start(), location))) {\r\n                m_pDoc.modifiedFlag = true;\r\n                m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n            }\r\n        } break;\r\n        case SELECT | OVERHANDLE:\r\n\r\n            BeginDrag(point);\r\n            break;\r\n\r\n        case LINETOOL:\r\n        case POLYGONTOOL: {\r\n            m_current_mode = NONE;\r\n            m_mouse_mode |= DRAWLINE;\r\n            m_line = Line(location, location);\r\n            m_invalidate = LINEON;\r\n            update();\r\n        } break;\r\n        case LINETOOL | DRAWLINE: {\r\n            m_current_mode = NONE;\r\n            m_mouse_mode &= ~DRAWLINE;\r\n            m_invalidate = LINEOFF;\r\n            update();\r\n            if (m_pDoc.m_meta_graph->makeShape(Line(m_line.t_start(), location))) {\r\n                m_pDoc.modifiedFlag = true;\r\n                m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n            }\r\n        } break;\r\n        case POLYGONTOOL | DRAWLINE: {\r\n            m_current_mode = NONE;\r\n            m_mouse_mode &= ~DRAWLINE;\r\n            m_invalidate = LINEOFF;\r\n            update();\r\n            // if it's the first part, just make it a line:\r\n            if (m_poly_points == 0) {\r\n                m_currentlyEditingShapeRef = m_pDoc.m_meta_graph->polyBegin(Line(m_line.t_start(), location));\r\n                m_poly_start = m_line.t_start();\r\n                m_poly_points += 2;\r\n                m_mouse_mode |= DRAWLINE;\r\n                m_line = Line(location, location);\r\n                m_invalidate = LINEON;\r\n                update();\r\n            } else if (m_poly_points > 2 && PixelDist(point, PhysicalUnits(m_poly_start)) < 6) {\r\n                // check to see if it's back to the original start point, if so, close off\r\n                m_pDoc.m_meta_graph->polyClose(m_currentlyEditingShapeRef);\r\n                m_poly_points = 0;\r\n                m_currentlyEditingShapeRef = -1;\r\n            } else {\r\n                m_pDoc.m_meta_graph->polyAppend(m_currentlyEditingShapeRef, location);\r\n                m_poly_points += 1;\r\n                m_mouse_mode |= DRAWLINE;\r\n                m_line = Line(location, location);\r\n                m_invalidate = LINEON;\r\n                update();\r\n            }\r\n            m_pDoc.modifiedFlag = true;\r\n            m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n        } break;\r\n        case FILL:\r\n            m_pDoc.OnFillPoints(location, m_fillmode);\r\n            break;\r\n        case SEEDISOVIST:\r\n            m_current_mode = NONE;\r\n            m_pDoc.OnMakeIsovist(location);\r\n            break;\r\n        case SEEDHALFOVIST:\r\n            m_current_mode = NONE;\r\n            m_mouse_mode |= DRAWLINE;\r\n            m_line = Line(location, location);\r\n            m_invalidate = LINEON;\r\n            update();\r\n            break;\r\n        case SEEDHALFOVIST | DRAWLINE: {\r\n            m_current_mode = NONE;\r\n            m_mouse_mode &= ~DRAWLINE;\r\n            m_invalidate = LINEOFF;\r\n            update();\r\n            Point2f vec = m_line.vector();\r\n            vec.normalise();\r\n            m_pDoc.OnMakeIsovist(m_line.t_start(), vec.angle());\r\n        } break;\r\n        case SEEDAXIAL:\r\n            m_pDoc.OnToolsAxialMap(location);\r\n            // switch to select mode (stops you accidently pressing twice)\r\n            OnEditSelect();\r\n            break;\r\n        }\r\n\r\n        if (m_mouse_mode == JOIN) {\r\n            if (m_pDoc.m_meta_graph->isSelected()) {\r\n                BeginJoin();\r\n            }\r\n        } else if (m_mouse_mode == UNJOIN) {\r\n            if (m_pDoc.m_meta_graph->isSelected()) {\r\n                if (m_pDoc.m_meta_graph->viewingProcessedPoints()) {\r\n                    if (m_pDoc.m_meta_graph->getDisplayedPointMap().unmergePoints()) {\r\n                        m_pDoc.modifiedFlag = true;\r\n                        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n                    }\r\n                } else {\r\n                    m_mouse_mode |= JOINB;\r\n                    SetCursor(m_mouse_mode);\r\n                }\r\n            }\r\n        }\r\n    } else {\r\n        if (m_snap) {\r\n            point = PhysicalUnits(m_snap_point);\r\n        }\r\n\r\n        // Right click now only acts as a cancel,\r\n        // (and because I personally am used to right-click to zoom out, zoom out!\r\n\r\n        if (!m_right_mouse_drag) {\r\n            // cancel any tool which uses drawline:\r\n            if (m_mouse_mode & DRAWLINE) {\r\n                m_mouse_mode &= ~DRAWLINE;\r\n                if (m_mouse_mode & POLYGONTOOL && m_poly_points > 0) {\r\n                    m_poly_points = 0;\r\n                    m_currentlyEditingShapeRef = -1;\r\n                    m_pDoc.m_meta_graph->polyCancel(m_currentlyEditingShapeRef);\r\n                    m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n                } else {\r\n                    m_invalidate = LINEOFF;\r\n                    update();\r\n                }\r\n            }\r\n            // cancel other tools:\r\n            switch (m_mouse_mode) {\r\n            case ZOOM_IN:\r\n                ZoomTowards(0.75, m_centre);\r\n                break;\r\n            case JOIN | JOINB:\r\n            case UNJOIN | JOINB:\r\n                m_mouse_mode &= ~JOINB;\r\n                SetCursor(m_mouse_mode);\r\n                // drop through intentional\r\n            case SELECT:\r\n                if (m_pDoc.m_meta_graph->isSelected()) {\r\n                    m_pDoc.m_meta_graph->clearSel();\r\n                    // Redraw scene\r\n                    m_redraw_no_clear = true;\r\n                    update();\r\n                }\r\n                break;\r\n            case PENCIL: {\r\n                m_pDoc.m_meta_graph->getDisplayedPointMap().fillPoint(LogicalUnits(point), false);\r\n                m_redraw_all = true;\r\n                update();\r\n            } break;\r\n            }\r\n        } else {\r\n            m_right_mouse_drag = false;\r\n            SetCursor(m_mouse_mode);\r\n\r\n            // Stop drag rect...\r\n            m_drag_rect_a = QRect(0, 0, 0, 0);\r\n            m_invalidate = DRAG;\r\n            update();\r\n\r\n            // Redraw scene\r\n            m_invalidate = 0;\r\n            m_redraw_all = true;\r\n            update();\r\n        }\r\n    }\r\n    pressed_nFlags &= ~MK_LBUTTON;\r\n    pressed_nFlags &= ~MK_RBUTTON;\r\n}\r\n\r\nvoid QDepthmapView::wheelEvent(QWheelEvent *e) {\r\n    short zDelta = e->delta();\r\n    QPoint position = e->pos();\r\n    QPoint centre(m_physical_centre.width(), m_physical_centre.height());\r\n    auto zoomFactor = 1.0 + std::abs(double(zDelta)) / 120.0;\r\n    if (zDelta > 0) {\r\n        zoomFactor = 1.0 / zoomFactor;\r\n    }\r\n    Point2f newCentre = ViewHelpers::calculateCenter(position, centre, zoomFactor);\r\n\r\n    // Same as LogicalUnits() with non-discreet input\r\n    newCentre.x = m_centre.x + m_unit * double(newCentre.x - m_physical_centre.width());\r\n    newCentre.y = m_centre.y + m_unit * double(m_physical_centre.height() - newCentre.y);\r\n\r\n    if (!IsAtZoomLimits(zoomFactor, 10)) {\r\n        ZoomTowards(zoomFactor, newCentre);\r\n    }\r\n}\r\n\r\n// provides a way to limit how much can we zoom out in relation to the window\r\n// and graph bounding box size to avoid problems when zooming out too far\r\nbool QDepthmapView::IsAtZoomLimits(double ratio, double maxZoomOutRatio) {\r\n    if (ratio < 1) {\r\n        return false;\r\n    }\r\n    // for zoom out\r\n    QtRegion bounds = m_pDoc.m_meta_graph->getBoundingBox();\r\n    double maxUnit = __max(bounds.width() / width(), bounds.height() / height());\r\n    return m_unit * ratio > maxZoomOutRatio * maxUnit;\r\n}\r\n\r\nvoid QDepthmapView::ZoomTowards(double ratio, const Point2f &point) {\r\n    m_centre = point;\r\n    m_unit *= ratio;\r\n\r\n    m_invalidate = 0;\r\n\r\n    // Redraw\r\n    m_redraw_all = true;\r\n    update();\r\n}\r\n\r\nQSize QDepthmapView::sizeHint() const { return m_initialSize; }\r\n\r\nvoid QDepthmapView::saveToFile() {}\r\n\r\nvoid QDepthmapView::postLoadFile() {\r\n    m_redraw_all = 1;\r\n    setWindowTitle(m_pDoc.m_base_title + \":Map View\");\r\n}\r\n\r\nbool QDepthmapView::Output(QPainter *pDC, QGraphDoc *pDoc, bool screendraw) {\r\n    unsigned long ticks = 0; // GetTickCount();\r\n\r\n    int state = pDoc->m_meta_graph->getState();\r\n\r\n    bool b_continue = false;\r\n\r\n    int spacer = GetSpacer(pDoc);\r\n\r\n    if (!pDoc->m_communicator) {\r\n        int viewclass = pDoc->m_meta_graph->getViewClass();\r\n        if (viewclass & MetaGraph::VIEWVGA) {\r\n            if (!b_continue && viewclass & MetaGraph::VIEWBACKAXIAL) {\r\n                b_continue =\r\n                    DrawShapes(pDC, pDoc->m_meta_graph->getDisplayedShapeGraph(), true, spacer, ticks, screendraw);\r\n            }\r\n            if (!b_continue && viewclass & MetaGraph::VIEWBACKDATA) {\r\n                b_continue =\r\n                    DrawShapes(pDC, pDoc->m_meta_graph->getDisplayedDataMap(), true, spacer, ticks, screendraw);\r\n            }\r\n            if (!b_continue) {\r\n                b_continue = DrawPoints(pDC, pDoc, spacer, ticks, screendraw);\r\n            }\r\n        } else if (!b_continue && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n            if (viewclass & MetaGraph::VIEWBACKVGA) {\r\n                b_continue = DrawPoints(pDC, pDoc, spacer, ticks, screendraw);\r\n            }\r\n            if (!b_continue && viewclass & MetaGraph::VIEWBACKDATA) {\r\n                b_continue =\r\n                    DrawShapes(pDC, pDoc->m_meta_graph->getDisplayedDataMap(), true, spacer, ticks, screendraw);\r\n            }\r\n            if (!b_continue) {\r\n                b_continue =\r\n                    DrawShapes(pDC, pDoc->m_meta_graph->getDisplayedShapeGraph(), false, spacer, ticks, screendraw);\r\n            }\r\n        } else if (!b_continue && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n            if (viewclass & MetaGraph::VIEWBACKAXIAL) {\r\n                b_continue =\r\n                    DrawShapes(pDC, pDoc->m_meta_graph->getDisplayedShapeGraph(), true, spacer, ticks, screendraw);\r\n            }\r\n            if (!b_continue && viewclass & MetaGraph::VIEWBACKVGA) {\r\n                b_continue = DrawPoints(pDC, pDoc, spacer, ticks, screendraw);\r\n            }\r\n            if (!b_continue) {\r\n                b_continue =\r\n                    DrawShapes(pDC, pDoc->m_meta_graph->getDisplayedDataMap(), false, spacer, ticks, screendraw);\r\n            }\r\n        }\r\n    }\r\n\r\n    if (!b_continue && state & MetaGraph::LINEDATA) {\r\n        bool nextlayer = false, first = true;\r\n        pDC->setPen(QPen(QBrush(QColor(m_foreground)), spacer / 20 + 1, Qt::SolidLine, Qt::RoundCap));\r\n        while ((b_continue = pDoc->m_meta_graph->findNextShape(nextlayer))) {\r\n            /*       Line l = pDoc->m_meta_graph->SuperSpacePixel::getNextLine();\r\n                     if (nextlayer || first) {\r\n                        PafColor color;\r\n                        color = pDoc->m_meta_graph->SuperSpacePixel::getLineColor();\r\n                        pDC->SelectObject(oldpen);\r\n                        pen.DeleteObject();\r\n                        if (color.alphab() != 0) {\r\n                           pen.CreatePen( PS_SOLID, spacer/20+1, color );\r\n                        }\r\n                        else {\r\n                           pen.CreatePen( PS_SOLID, spacer/20+1, GetApp()->m_foreground );\r\n                        }\r\n                        pDC->SelectObject(&pen);\r\n                        first = false;\r\n                        nextlayer = false;\r\n                     }*/\r\n\r\n            const SalaShape &shape = pDoc->m_meta_graph->getNextShape();\r\n            spacer = GetSpacer(pDoc);\r\n\r\n            if (shape.isPoint()) {\r\n            } else if (shape.isLine()) {\r\n                Line line = shape.getLine();\r\n                QPoint p1 = PhysicalUnits(line.start());\r\n                QPoint p2 = PhysicalUnits(line.end());\r\n                if (p1 != p2) {\r\n                    pDC->drawLine(p1, p2);\r\n                }\r\n            } else {\r\n                size_t i;\r\n                for (i = 1; i < shape.m_points.size(); i++) {\r\n                    pDC->drawLine(PhysicalUnits(shape.m_points[i - 1]), PhysicalUnits(shape.m_points[i]));\r\n                }\r\n                if (shape.isClosed()) {\r\n                    pDC->drawLine(PhysicalUnits(shape.m_points[i - 1]), PhysicalUnits(shape.m_points[0]));\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (!b_continue && spacer > 1 && pDoc->m_meta_graph->viewingProcessedShapes() && pDoc->m_meta_graph->m_showtext) {\r\n        /*      setFont(QFont(\"Arial\", 10, 10));\r\n              pDC->setPen(QPen(QBrush(QColor(m_foreground)), 1, Qt::SolidLine, Qt::FlatCap));\r\n\r\n              // display the layer attribute data:\r\n              // THIS NEEDS SORTING OUT\r\n              ShapeMap& map = pDoc->m_meta_graph->getDisplayedDataMap();\r\n              for (int i = 0; i < map.getObjectCount(); i++) {\r\n                 if (map.getDisplayedAttributeValue(i) > 0) {\r\n                    std::string text = map.getDisplayedAttributeText(i);\r\n                    QPoint p = PhysicalUnits(map.getCentroid(i));\r\n                    QSize sz = pDC->GetTextExtent(text.c_str());\r\n                    pDC->drawText(p.x(), p.y()-(sz.height()/2), text.c_str());\r\n                 }\r\n              }*/\r\n    }\r\n\r\n    if (!b_continue && m_showlinks) {\r\n        pDC->setBrush(QBrush(QColor(m_foreground), Qt::SolidPattern));\r\n        if (pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWVGA &&\r\n            pDoc->m_meta_graph->getDisplayedPointMap().isProcessed()) {\r\n            PointMap &map = pDoc->m_meta_graph->getDisplayedPointMap();\r\n            // merge lines\r\n            pDC->setPen(QPen(QBrush(QColor(00, 255, 0)), spacer / 10 + 1, Qt::SolidLine));\r\n            while ((b_continue = map.findNextMergeLine())) {\r\n                Line line = map.getNextMergeLine();\r\n                DrawLink(pDC, spacer, line);\r\n            }\r\n        } else if ((state & MetaGraph::SHAPEGRAPHS) && (pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL)) {\r\n            // link lines\r\n            pDC->setPen(QPen(QBrush(QColor(00, 255, 0)), spacer / 10 + 1, Qt::SolidLine));\r\n            while ((b_continue = pDoc->m_meta_graph->getDisplayedShapeGraph().findNextLinkLine())) {\r\n                Line line = pDoc->m_meta_graph->getDisplayedShapeGraph().getNextLinkLine();\r\n                DrawLink(pDC, spacer, line);\r\n            }\r\n            pDC->setPen(QPen(QBrush(QColor(255, 00, 00)), spacer / 10 + 1, Qt::SolidLine));\r\n            pDC->setBrush(QBrush(QColor(m_background), Qt::SolidPattern));\r\n\r\n            while ((b_continue = pDoc->m_meta_graph->getDisplayedShapeGraph().findNextUnlinkPoint())) {\r\n                QPoint p = PhysicalUnits(pDoc->m_meta_graph->getDisplayedShapeGraph().getNextUnlinkPoint());\r\n                p -= QPoint(2 + spacer / 2, 2 + spacer / 2);\r\n                QRect rect(p, QSize(spacer + 4, spacer + 4));\r\n                pDC->drawEllipse(rect);\r\n            }\r\n        }\r\n    }\r\n\r\n    return b_continue;\r\n}\r\n\r\nbool QDepthmapView::DrawPoints(QPainter *pDC, QGraphDoc *pDoc, int spacer, unsigned long ticks, bool screendraw) {\r\n    unsigned long c_tick = 0;\r\n    bool b_continue = false;\r\n\r\n    PointMap &map = pDoc->m_meta_graph->getDisplayedPointMap();\r\n\r\n    bool muted = (map.isProcessed() && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWBACKVGA);\r\n    if (m_showlinks) {\r\n        if (!muted) {\r\n            muted = true;\r\n        } else {\r\n            return b_continue; // too confusing!\r\n        }\r\n    }\r\n\r\n    if (pDoc->m_meta_graph->getViewClass() & (MetaGraph::VIEWBACKAXIAL | MetaGraph::VIEWBACKDATA)) {\r\n        spacer /= 2; // allow see through to axial lines\r\n    }\r\n\r\n    bool monochrome = (map.isProcessed() && map.getDisplayParams().colorscale == DisplayParams::MONOCHROME);\r\n\r\n    // if (monochrome) {\r\n    //      standardbrush = new QBrush( GetApp()->m_foreground );\r\n    //}\r\n    pDC->setBrush(QBrush(QColor(m_foreground), Qt::SolidPattern));\r\n\r\n    while ((b_continue = map.findNextPoint())) {\r\n        Point2f logical = map.getNextPointLocation();\r\n\r\n        PafColor color;\r\n        color = map.getCurrentPointColor();\r\n\r\n        if (color.alphab() != 0) { // alpha == 0 is transparent\r\n            if (monochrome && !map.getPointSelected()) {\r\n                QPoint p = PhysicalUnits(logical);\r\n                int subspacer = (3 * color.blueb() * spacer) / 255;\r\n                if (subspacer >= 1) {\r\n                    pDC->drawEllipse(p.x() - subspacer, p.y() + subspacer, subspacer * 2, subspacer * 2);\r\n                } else {\r\n                    pDC->drawPoint(p);\r\n                }\r\n            } else {\r\n                QRgb rgb = qRgb(color.redb(), color.greenb(), color.blueb());\r\n                if (muted && !map.getPointSelected()) { // keeps selected points bright yellow\r\n                    rgb = colorMerge(rgb, m_background);\r\n                }\r\n                QPoint p = PhysicalUnits(logical);\r\n                if (spacer > 1) {\r\n                    // Standard code\r\n                    pDC->setBrush(QBrush(QColor(rgb), Qt::SolidPattern));\r\n                    pDC->fillRect(QRect(p.x() - spacer, p.y() - spacer, spacer * 2, spacer * 2), QBrush(QColor(rgb)));\r\n                } else {\r\n                    pDC->drawPoint(p);\r\n                }\r\n            }\r\n        }\r\n        if (screendraw && c_tick++ > 10000)\r\n            break;\r\n    }\r\n\r\n    if (!b_continue && pDoc->m_meta_graph->m_showgrid) {\r\n        pDC->setPen(QPen(QBrush(QColor(colorMerge(m_foreground, m_background))), 1, Qt::SolidLine));\r\n        if (pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n            // show grid as though points are filling the spaces\r\n            while ((b_continue = map.findNextRow())) {\r\n                Line logical = map.getNextRow();\r\n                pDC->drawLine(PhysicalUnits(logical.start()), PhysicalUnits(logical.end()));\r\n            }\r\n            while ((b_continue = map.findNextCol())) {\r\n                Line logical = map.getNextCol();\r\n                pDC->drawLine(PhysicalUnits(logical.start()), PhysicalUnits(logical.end()));\r\n            }\r\n        } else {\r\n            // show actual grid\r\n            while ((b_continue = map.findNextPointRow())) {\r\n                Line logical = map.getNextPointRow();\r\n                pDC->drawLine(PhysicalUnits(logical.start()), PhysicalUnits(logical.end()));\r\n            }\r\n            while ((b_continue = map.findNextPointCol())) {\r\n                Line logical = map.getNextPointCol();\r\n                pDC->drawLine(PhysicalUnits(logical.start()), PhysicalUnits(logical.end()));\r\n            }\r\n        }\r\n    }\r\n\r\n    return b_continue;\r\n}\r\n\r\nbool QDepthmapView::DrawShapes(QPainter *pDC, ShapeMap &map, bool muted, int spacer, unsigned long ticks,\r\n                               bool screendraw) {\r\n    unsigned long c_tick = 0;\r\n    bool b_continue = false;\r\n\r\n    if (m_showlinks) {\r\n        if (!muted) {\r\n            muted = true;\r\n        } else {\r\n            return b_continue; // too confusing!\r\n        }\r\n    }\r\n\r\n    bool monochrome = (map.getDisplayParams().colorscale == DisplayParams::MONOCHROME);\r\n\r\n    if (screendraw && !muted) {\r\n        // i.e., at the front... implies can select... allow this draw to overwrite any existing point handle\r\n        // locations:\r\n        m_point_handles.clear();\r\n    }\r\n\r\n    QPen pen(QBrush(QColor(m_foreground)), spacer / 20 + 1, Qt::SolidLine);\r\n    bool dummy;\r\n    int count = 0;\r\n    while ((b_continue = map.findNextShape(dummy))) {\r\n        count++;\r\n        PafColor color;\r\n        // n.b., MONOCHROME settings only for line thickness...\r\n        color = map.getShapeColor();\r\n        bool selected = map.getShapeSelected();\r\n\r\n        // n.b., getNextShape clears polygon ready for next, so get polygon color and selected attribute before this:\r\n        const SalaShape &poly = map.getNextShape();\r\n        QPoint *points = NULL;\r\n        int drawable = 0;\r\n        if (!poly.isPoint() && !poly.isLine() && !poly.m_points.empty()) {\r\n            points = new QPoint[poly.m_points.size()];\r\n            if (poly.m_points.size() > 0)\r\n                drawable++;\r\n            for (auto &point : poly.m_points) {\r\n                points[drawable] = PhysicalUnits(point);\r\n                if (points[drawable] != points[drawable - 1]) {\r\n                    drawable++;\r\n                }\r\n            }\r\n        }\r\n        //\r\n        QBrush brush;\r\n        QPen pen2;\r\n        QRgb rgb;\r\n        int tempspacer = selected ? spacer * 3 : spacer;\r\n        if (!monochrome || selected) {\r\n            rgb = qRgb(color.redb(), color.greenb(), color.blueb());\r\n            if (muted && !selected) {\r\n                rgb = colorMerge(rgb, m_background);\r\n            }\r\n            if (poly.isClosed() || poly.isPoint()) {\r\n                brush = QBrush(QColor(rgb), Qt::SolidPattern);\r\n            } else {\r\n                pen2 = QPen(QBrush(QColor(rgb)), tempspacer / 10 + 1, Qt::SolidLine);\r\n            }\r\n        } else {\r\n            int thickness = (spacer * color.blueb()) / 255;\r\n            if (thickness < 1) {\r\n                // note, monochrome excludes lines below 'thin' threshold\r\n                continue;\r\n            }\r\n            if (poly.isClosed()) {\r\n                brush = QBrush(QColor(m_background), Qt::SolidPattern);\r\n            }\r\n            pen2 = QPen(QBrush(QColor(m_foreground)), thickness, Qt::SolidLine);\r\n        }\r\n        if (poly.isClosed()) {\r\n            if (drawable > 1) {\r\n                if (!map.m_show_lines) {\r\n                    pDC->setPen(Qt::NoPen);\r\n                } else if (monochrome && !selected) {\r\n                    pDC->setPen(pen2);\r\n                } else {\r\n                    pDC->setPen(pen2);\r\n                }\r\n                if (!map.m_show_fill) {\r\n                    pDC->setBrush(Qt::NoBrush);\r\n                } else {\r\n                    pDC->setBrush(brush);\r\n                }\r\n                pDC->drawPolygon(points, drawable);\r\n                //\r\n                if (map.m_show_centroids) {\r\n                    Point2f p = poly.getCentroid();\r\n                    pDC->setPen(QColor(255, 255, 0));\r\n                    pDC->drawPoint(PhysicalUnits(p));\r\n                }\r\n            } else {\r\n                pDC->setPen(QColor(rgb));\r\n                pDC->drawPoint(points[0]);\r\n            }\r\n        } else {\r\n            if (poly.isPoint()) {\r\n                QPoint point = PhysicalUnits(poly.getPoint());\r\n                if (tempspacer < 2) {\r\n                    pDC->setPen(QColor(rgb));\r\n                    pDC->drawPoint(point);\r\n                } else {\r\n                    QRect rect(point.x() - tempspacer / 2, point.y() - tempspacer / 2, tempspacer, tempspacer);\r\n                    if (tempspacer < 4) {\r\n                        pDC->setBrush(QBrush(QColor(rgb), Qt::SolidPattern));\r\n                        pDC->drawRect(rect);\r\n                    } else {\r\n                        pDC->setPen(pen);\r\n                        pDC->setBrush(brush);\r\n                        pDC->drawEllipse(rect);\r\n                    }\r\n                }\r\n            } else if (poly.isLine()) {\r\n                pDC->setPen(pen2);\r\n                Line l = poly.getLine();\r\n                QPoint start = PhysicalUnits(l.start());\r\n                QPoint end = PhysicalUnits(l.end());\r\n                if (start != end) {\r\n                    pDC->drawLine(start, end);\r\n                }\r\n                if (selected && screendraw && !muted && map.getSelCount() == 1 && map.isEditable()) {\r\n                    m_point_handles.push_back(l.start());\r\n                    m_point_handles.push_back(l.end());\r\n                }\r\n            } else {\r\n                if (drawable > 1) {\r\n                    pDC->setPen(pen2);\r\n                    pDC->drawPolyline(points, drawable);\r\n                } else {\r\n                    pDC->setPen(QColor(rgb));\r\n                    pDC->drawPoint(points[0]);\r\n                }\r\n            }\r\n        }\r\n        if (points) {\r\n            delete[] points;\r\n        }\r\n        if (screendraw && c_tick++ > 10000)\r\n            break;\r\n    }\r\n\r\n    if (screendraw && !muted) {\r\n        // i.e., at the front... implies can select... allow this draw to overwrite to draw point handle locations:\r\n        for (size_t i = 0; i < m_point_handles.size(); i++) {\r\n            DrawPointHandle(pDC, PhysicalUnits(m_point_handles[i]));\r\n        }\r\n    }\r\n\r\n    return b_continue;\r\n}\r\n\r\nvoid QDepthmapView::DrawLink(QPainter *pDC, int spacer, const Line &logical) {\r\n    spacer += 4;\r\n    QPoint p1 = PhysicalUnits(logical.start());\r\n    QPoint p2 = PhysicalUnits(logical.end());\r\n    pDC->drawLine(p1, p2);\r\n    p1 -= QPoint(spacer / 2, spacer / 2);\r\n    p2 -= QPoint(spacer / 2, spacer / 2);\r\n    QRect rect1(p1, QSize(spacer, spacer));\r\n    QRect rect2(p2, QSize(spacer, spacer));\r\n    pDC->drawEllipse(rect1);\r\n    pDC->drawEllipse(rect2);\r\n}\r\n\r\nvoid QDepthmapView::DrawPointHandle(QPainter *pDC, QPoint pt) {\r\n    QRect rect(pt.x() - 7, pt.y() - 7, 14, 14);\r\n    pDC->setBrush(QBrush(QColor(m_foreground), Qt::SolidPattern));\r\n    pDC->drawRect(rect);\r\n    rect.adjust(1, 1, 1, 1); // DeflateRect(1,1,1,1);\r\n    pDC->setBrush(QBrush(QColor(m_background), Qt::SolidPattern));\r\n    pDC->drawRect(rect);\r\n    rect.adjust(1, 1, 1, 1); // DeflateRect(1,1,1,1);\r\n    pDC->setBrush(QBrush(QColor(m_selected_color), Qt::SolidPattern));\r\n    pDC->drawRect(rect);\r\n}\r\n\r\nvoid QDepthmapView::OutputEPS(std::ofstream &stream, QGraphDoc *pDoc, bool includeScale) {\r\n    // This output EPS is a copy of the standard output... obviously, if you change\r\n    // standard output, remember to change this one too!\r\n\r\n    // now the two are a little out of synch\r\n\r\n    if (!m_viewport_set) {\r\n        QMessageBox::warning(this, tr(\"Warning\"), tr(\"Can't save screen as the Depthmap window is not initialised\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n\r\n    QRect clrect, rect;\r\n    clrect = QRect(0, 0, width(), height()); // GetClientRect( clrect );\r\n\r\n    stream << \"%!PS-Adobe-3.0 EPSF-3.0\\n\"\r\n           << \"%%BoundingBox: 0 0 \" << clrect.width() << \" \" << clrect.height() << \"\\n\"\r\n           << \"%%Creator: \" << TITLE_BASE << std::endl;\r\n\r\n    // temporarily inflate resolution for EPS draw\r\n    rect = QRect(clrect.left() * 10, clrect.top() * 10, clrect.width() * 10, clrect.height() * 10);\r\n    QPoint oldcentre = QPoint(m_physical_centre.width(), m_physical_centre.height());\r\n    double oldunit = m_unit;\r\n    m_physical_centre = QSize(rect.width() / 2, rect.height() / 2);\r\n    m_unit /= 10;\r\n\r\n    int bg = (int)m_background;\r\n    float bgr = float(GetRValue(bg)) / 255.0f;\r\n    float bgg = float(GetGValue(bg)) / 255.0f;\r\n    float bgb = float(GetBValue(bg)) / 255.0f;\r\n\r\n    int fg = (int)m_foreground;\r\n    float fgr = float(GetRValue(fg)) / 255.0f;\r\n    float fgg = float(GetGValue(fg)) / 255.0f;\r\n    float fgb = float(GetBValue(fg)) / 255.0f;\r\n\r\n    stream << \"/M {moveto} def\" << std::endl;\r\n    stream << \"/L {lineto} def\" << std::endl;\r\n    stream << \"/R {rlineto} def\" << std::endl;\r\n    stream << \"/C {setrgbcolor} def\" << std::endl;\r\n    stream << \"/W {setlinewidth} def\" << std::endl;\r\n\r\n    stream << \"newpath\\n\"\r\n           << 0 << \" \" << 0 << \" M\\n\"\r\n           << clrect.width() << \" \" << 0 << \" R\\n\"\r\n           << 0 << \" \" << clrect.height() << \" R\\n\"\r\n           << -clrect.width() << \" \" << 0 << \" R\\n\"\r\n           << \"closepath\\n\"\r\n           << bgr << \" \" << bgg << \" \" << bgb << \" C\\n\"\r\n           << \"fill\" << std::endl;\r\n\r\n    int state = pDoc->m_meta_graph->getState();\r\n\r\n    QtRegion logicalviewport = LogicalViewport(rect, pDoc);\r\n\r\n    if (state & MetaGraph::POINTMAPS) {\r\n        pDoc->m_meta_graph->getDisplayedPointMap().setScreenPixel(m_unit); // only used by points (at the moment!)\r\n        pDoc->m_meta_graph->getDisplayedPointMap().makeViewportPoints(logicalviewport);\r\n    }\r\n    if (state & MetaGraph::SHAPEGRAPHS) {\r\n        pDoc->m_meta_graph->getDisplayedShapeGraph().makeViewportShapes(logicalviewport);\r\n    }\r\n    if (state & MetaGraph::DATAMAPS) {\r\n        pDoc->m_meta_graph->getDisplayedDataMap().makeViewportShapes(logicalviewport);\r\n    }\r\n    if (state & MetaGraph::LINEDATA) {\r\n        pDoc->m_meta_graph->makeViewportShapes(logicalviewport);\r\n    }\r\n\r\n    double spacer = GetSpacer(pDoc) / 10.0;\r\n    if (spacer < 0.1) {\r\n        spacer = 0.1;\r\n    }\r\n\r\n    if (state & MetaGraph::POINTMAPS && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n\r\n        // Define EPS box using spacer dimensions:\r\n        stream << \"/bx\\n\"\r\n               << \" { newpath M\\n\"\r\n               << \"   \" << 2 * spacer << \" \" << 0 << \" R\\n\"\r\n               << \"   \" << 0 << \" \" << 2 * spacer << \" R\\n\"\r\n               << \"   \" << 2 * -spacer << \" \" << 0 << \" R\\n\"\r\n               << \"   closepath } def\" << std::endl;\r\n        stream << \"/fbx\\n\"\r\n               << \" { C fill } def\" << std::endl;\r\n\r\n        PointMap &map = pDoc->m_meta_graph->getDisplayedPointMap();\r\n\r\n        while (map.findNextPoint()) {\r\n\r\n            Point2f logical = map.getNextPointLocation();\r\n\r\n            PafColor color = map.getCurrentPointColor();\r\n\r\n            if (color.alphab() != 0) { // alpha == 0 is transparent\r\n\r\n                QPoint p = PhysicalUnits(logical);\r\n\r\n                // Now do EPS box... remember the coordinate system is the right way up!\r\n                stream << p.x() / 10.0 - spacer << \" \" << (rect.height() - p.y()) / 10.0 - spacer << \" bx\"\r\n                       << std::endl;\r\n                stream << color.redf() << \" \" << color.greenf() << \" \" << color.bluef() << \" fbx\" << std::endl;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (state & MetaGraph::SHAPEGRAPHS && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n\r\n        ShapeMap &map = pDoc->m_meta_graph->getDisplayedShapeGraph();\r\n\r\n        OutputEPSMap(stream, map, logicalviewport, rect, spacer);\r\n    }\r\n\r\n    if (state & MetaGraph::DATAMAPS && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n\r\n        ShapeMap &map = pDoc->m_meta_graph->getDisplayedDataMap();\r\n\r\n        OutputEPSMap(stream, map, logicalviewport, rect, spacer);\r\n    }\r\n\r\n    if (state & MetaGraph::LINEDATA) {\r\n\r\n        stream << \"newpath\" << std::endl;\r\n        bool nextlayer = false;\r\n        bool first = true;\r\n        int style = 0;\r\n\r\n        while (pDoc->m_meta_graph->findNextShape(nextlayer)) {\r\n\r\n            const SalaShape &shape = pDoc->m_meta_graph->getNextShape();\r\n\r\n            Line l;\r\n            if (shape.isPoint()) {\r\n            } else if (shape.isLine()) {\r\n                Line line = shape.getLine();\r\n                OutputEPSLine(stream, line, spacer, logicalviewport, rect);\r\n            } else {\r\n                OutputEPSPoly(stream, shape, spacer, logicalviewport, rect);\r\n            }\r\n        }\r\n\r\n        int fg = (int)m_foreground;\r\n        float fgr = float(GetRValue(fg)) / 255.0f;\r\n        float fgg = float(GetGValue(fg)) / 255.0f;\r\n        float fgb = float(GetBValue(fg)) / 255.0f;\r\n        if (style == 1) {\r\n            stream << \"[\" << spacer / 10 + 1 << \"]\";\r\n        } else {\r\n            stream << \"[]\";\r\n        }\r\n        stream << \" 0 setdash\" << std::endl;\r\n        stream << fgr << \" \" << fgg << \" \" << fgb << \" C\" << std::endl;\r\n        stream << spacer / 10 + 1 << \" W\" << std::endl;\r\n        stream << \"stroke\" << std::endl;\r\n    }\r\n\r\n    // loaded paths\r\n    if (pDoc->m_evolved_paths.size()) {\r\n\r\n        stream << \"newpath\" << std::endl;\r\n\r\n        for (size_t i = 0; i < pDoc->m_evolved_paths.size(); i++) {\r\n\r\n            const std::vector<Point2f> &path = pDoc->m_evolved_paths[i];\r\n\r\n            if (path.size() > 1) {\r\n\r\n                QPoint last = PhysicalUnits(path[0]);\r\n                stream << (last.x() - spacer / 40) / 10.0 << \" \" << (rect.height() - last.y() + spacer / 40) / 10.0\r\n                       << \" M\\n\"\r\n                       << std::endl;\r\n\r\n                for (size_t j = 1; j < path.size(); j++) {\r\n                    QPoint next = PhysicalUnits(path[j]);\r\n                    stream << (next.x() - last.x() - spacer / 40) / 10.0 << \" \"\r\n                           << (last.y() - next.y() - spacer / 40) / 10.0 << \" L\" << std::endl;\r\n                    last = next;\r\n                }\r\n\r\n                stream << fgr << \" \" << fgg << \" \" << fgb << \" C\" << std::endl;\r\n                stream << spacer / 20 + 1 << \" W\" << std::endl;\r\n                stream << \"stroke\" << std::endl;\r\n            }\r\n        }\r\n    }\r\n    /*\r\n       if (pDoc->m_agent_manager && pDoc->m_agent_manager->isPaused())\r\n       {\r\n          if (pDoc->m_agent_manager->isEcomorphic()) {\r\n             // draw the ecomorphic artworks\r\n             Ecomorph& eco = pDoc->m_agent_manager->getEcomorph();\r\n             for (int i = 0; i < eco.arts().size(); i++)\r\n             {\r\n                PixelRef pos = eco.arts()[i].getPos();\r\n                Point2f logical = pDoc->m_meta_graph->getDisplayedPointMap().depixelate(pos);\r\n                // this is in units of logical is unit based so this actually works okay:\r\n                QPoint p = PhysicalUnits(Point2f(logical.x, logical.y));\r\n                QPoint bottomleft = PhysicalUnits(Point2f(logical.x - 0.5, logical.y - 0.5));\r\n                // Now do EPS box... remember the coordinate system is the right way up!\r\n                stream << (p.x - spacer) / 10.0 << \" \" << (rect.Height() - p.y - spacer) / 10.0 << \" bx\" << std::endl;\r\n                stream << bgr << \" \" << bgg << \" \" << bgb << \" fbx\" << std::endl;\r\n                // And cover with line:\r\n                stream << (bottomleft.x - spacer/20) / 10.0 << \" \" << (rect.Height() - bottomleft.y + spacer/20) / 10.0\r\n       << \" M\\n\"\r\n                       << (spacer * 2 - spacer/20) / 10.0 << \" \" << 0 << \" L\\n\"\r\n                       << 0 << \" \" << (spacer * 2 - spacer/20) / 10.0 << \" L\\n\"\r\n                       << (-spacer * 2 + spacer/20) / 10.0 << \" \" << 0 << \" L\\n\"\r\n                       << 0 << \" \" << (-spacer * 2 + spacer/20) / 10.0 << \" L\" << std::endl;\r\n                stream << fgr << \" \" << fgg << \" \" << fgb << \" setrgbcolor\" << std::endl;\r\n                stream << spacer/10+1 << \" setlinewidth\" << std::endl;\r\n                stream << \"stroke\" << std::endl;\r\n             }\r\n          }\r\n       }\r\n    */\r\n\r\n    if (includeScale) {\r\n        // add the scale to the bottom lefthand corner\r\n        double logicalwidth = m_unit * rect.width();\r\n        if (logicalwidth > 10) {\r\n            int workingwidth = floor(log10(logicalwidth / 2) * 2.0);\r\n            int barwidth = (int)pow(10.0, (double)(workingwidth / 2)) * ((workingwidth % 2 == 0) ? 1 : 5);\r\n            double physicalbar = double(barwidth) / m_unit;\r\n            stream << \"newpath\" << std::endl;\r\n            stream << \"0 0 M 0 18 R\" << std::endl;\r\n            stream << physicalbar / 10.0 << \" 0 R 0 -18 R closepath\" << std::endl;\r\n            stream << bgr << \" \" << bgg << \" \" << bgb << \" C\" << std::endl;\r\n            stream << \"fill newpath\" << std::endl;\r\n            stream << fgr << \" \" << fgg << \" \" << fgb << \" C\" << std::endl;\r\n            stream << \"0 12 M\" << std::endl;\r\n            stream << physicalbar / 10.0 << \" 0 R\" << std::endl;\r\n            stream << \"3 W stroke\" << std::endl;\r\n            stream << \"0 6 M 0 7.5 R\" << std::endl;\r\n            stream << physicalbar / 10.0 << \" 6 M 0 7.5 R\" << std::endl;\r\n            stream << \"1.5 W stroke\" << std::endl;\r\n            stream << \"/Arial findfont 12 scalefont setfont\" << std::endl;\r\n            // assume metres!\r\n            if (barwidth > 1000) {\r\n                stream << \"(\" << (barwidth / 1000) << \"km) stringwidth pop 2 div\" << std::endl;\r\n            } else {\r\n                stream << \"(\" << barwidth << \"m) stringwidth pop 2 div\" << std::endl;\r\n            }\r\n            stream << physicalbar / 20.0 << \" exch sub\" << std::endl;\r\n            stream << \"0 M\" << std::endl;\r\n            stream << \"(\" << barwidth << \"m) show\" << std::endl;\r\n        }\r\n    }\r\n\r\n    stream << \"showpage\" << std::endl;\r\n\r\n    // undo temporary unit setting\r\n    m_unit = oldunit;\r\n    m_physical_centre = QSize(oldcentre.x(), oldcentre.y());\r\n}\r\n\r\nvoid QDepthmapView::OutputEPSMap(std::ofstream &stream, ShapeMap &map, QtRegion &logicalviewport, QRect &rect,\r\n                                 float spacer) {\r\n    bool monochrome = (map.getDisplayParams().colorscale == DisplayParams::MONOCHROME);\r\n    double thickness = 1.0, oldthickness = 1.0;\r\n    bool closed, oldclosed = false;\r\n    PafColor color, oldcolor;\r\n\r\n    int fg = (int)m_foreground;\r\n    float fgr = float(GetRValue(fg)) / 255.0f;\r\n    float fgg = float(GetGValue(fg)) / 255.0f;\r\n    float fgb = float(GetBValue(fg)) / 255.0f;\r\n\r\n    stream << \"newpath\" << std::endl;\r\n    stream << fgr << \" \" << fgg << \" \" << fgb << \" C\" << std::endl;\r\n    bool dummy;\r\n    while (map.findNextShape(dummy)) {\r\n\r\n        // note: getNextLine clears current line, so getLineColor before line\r\n        color = map.getShapeColor();\r\n        const SalaShape &shape = map.getNextShape();\r\n        closed = shape.isClosed();\r\n\r\n        if (monochrome) {\r\n            thickness = 3.0 * (color.blueb() * spacer) / 255.0;\r\n            // note: anything below 'thin' threshold in monochrome note drawn\r\n            if (thickness < 0.25) {\r\n                continue;\r\n            }\r\n            if (thickness != oldthickness || closed != oldclosed) {\r\n                stream << oldthickness << \" W\" << std::endl;\r\n                stream << (oldclosed ? \"fill\" : \"stroke\") << std::endl;\r\n                oldthickness = thickness;\r\n                oldclosed = closed;\r\n            }\r\n        } else if (color != oldcolor || closed != oldclosed) {\r\n            stream << oldcolor.redf() << \" \" << oldcolor.greenf() << \" \" << oldcolor.bluef() << \" C\" << std::endl;\r\n            stream << (oldclosed ? \"fill\" : \"stroke\") << std::endl;\r\n            oldcolor = color;\r\n            oldclosed = closed;\r\n        }\r\n\r\n        Line l;\r\n        if (shape.isPoint()) {\r\n        } else if (shape.isLine()) {\r\n            Line line = shape.getLine();\r\n            OutputEPSLine(stream, line, spacer, logicalviewport, rect);\r\n        } else {\r\n            OutputEPSPoly(stream, shape, spacer, logicalviewport, rect);\r\n        }\r\n    }\r\n    stream << thickness << \" W\" << std::endl;\r\n    if (!monochrome) {\r\n        stream << color.redf() << \" \" << color.greenf() << \" \" << color.bluef() << \" C\" << std::endl;\r\n    }\r\n    stream << (closed ? \"fill\" : \"stroke\") << std::endl;\r\n}\r\n\r\nvoid QDepthmapView::OutputEPSLine(std::ofstream &stream, Line &line, int spacer, QtRegion &logicalviewport,\r\n                                  QRect &rect) {\r\n    bool drewit = false;\r\n    if (line.crop(logicalviewport)) {\r\n        QPoint start = PhysicalUnits(line.start());\r\n        QPoint end = PhysicalUnits(line.end());\r\n        // 10 units corresponds to 1 pixel on the screen\r\n        if (sqrt(sqr(start.x() - end.x()) + sqr(start.y() - end.y())) > 5.0) {\r\n            stream << (start.x() / 10.0) << \" \" << (rect.height() - start.y()) / 10.0 << \" M \";\r\n            stream << (end.x() / 10.0) << \" \" << (rect.height() - end.y()) / 10.0 << \" L\" << std::endl;\r\n        }\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OutputEPSPoly(std::ofstream &stream, const SalaShape &shape, int spacer, QtRegion &logicalviewport,\r\n                                  QRect &rect) {\r\n    bool starter = true;\r\n    Point2f lastpoint = shape.m_points[0];\r\n    int count = shape.isClosed() ? shape.m_points.size() + 1 : shape.m_points.size();\r\n    int size = shape.m_points.size();\r\n    for (int i = 1; i < count; i++) {\r\n        Line line(lastpoint, shape.m_points[i % size]);\r\n        if (line.crop(logicalviewport)) {\r\n            // note: use t_start and t_end so that this line moves in the correct direction\r\n            QPoint start = PhysicalUnits(line.t_start());\r\n            QPoint end = PhysicalUnits(line.t_end());\r\n            // 5.0 is about 1/2 pixel width\r\n            if (sqrt(sqr(start.x() - end.x()) + sqr(start.y() - end.y())) > 5.0) {\r\n                if (starter) {\r\n                    stream << start.x() / 10.0 << \" \" << (rect.height() - start.y()) / 10.0 << \" M \";\r\n                }\r\n                stream << end.x() / 10.0 << \" \" << (rect.height() - end.y()) / 10.0 << \" L\" << std::endl;\r\n                // note: you must use t_end (true end) so that it takes the end point from the shape[i] end:\r\n                lastpoint = line.t_end();\r\n                starter = false;\r\n            }\r\n        } else {\r\n            lastpoint = shape.m_points[i];\r\n            starter = true;\r\n        }\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::DrawCross(QPainter *pDC, QPoint &centre, bool drawit) {\r\n    if (drawit) {\r\n        for (int i = 0; i < 9; i++) {\r\n            QPoint pos(centre.x() - 4 + i, centre.y());\r\n            pDC->setPen(QColor(m_foreground));\r\n            pDC->drawPoint(pos);\r\n        }\r\n        for (int j = 0; j < 9; j++) {\r\n            if (j != 4) {\r\n                QPoint pos(centre.x(), centre.y() - 4 + j);\r\n                pDC->setPen(QColor(m_foreground));\r\n                pDC->drawPoint(pos);\r\n            }\r\n        }\r\n    } else { // erase it\r\n        for (int i = 0; i < 9; i++) {\r\n            QPoint pos(centre.x() - 4 + i, centre.y());\r\n            pDC->drawPoint(pos);\r\n        }\r\n        for (int j = 0; j < 9; j++) {\r\n            if (j != 4) {\r\n                QPoint pos(centre.x(), centre.y() - 4 + j);\r\n                pDC->drawPoint(pos);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nint QDepthmapView::GetSpacer(QGraphDoc *pDoc) {\r\n    int spacer = 1;\r\n    int viewclass = pDoc->m_meta_graph->getViewClass();\r\n    if (viewclass & (MetaGraph::VIEWVGA | MetaGraph::VIEWBACKVGA)) {\r\n        spacer = int(ceil(5.0 * pDoc->m_meta_graph->getDisplayedPointMap().getSpacing() / (m_unit * 10.0)));\r\n    } else if (viewclass & MetaGraph::VIEWAXIAL) {\r\n        spacer = int(ceil(pDoc->m_meta_graph->getDisplayedShapeGraph().getSpacing() / (m_unit * 10.0)));\r\n    } else if (viewclass & MetaGraph::VIEWDATA) {\r\n        spacer = int(ceil(pDoc->m_meta_graph->getDisplayedDataMap().getSpacing() / (m_unit * 10.0)));\r\n    }\r\n    return spacer;\r\n}\r\n\r\nvoid QDepthmapView::DrawLine(QPainter *pDC, QRect &line, bool drawit) {\r\n    if (line.width() == 0 && line.height() == 0) {\r\n        return;\r\n    }\r\n    if (drawit) {\r\n        m_line_pixels.clear();\r\n    } else if (!m_line_pixels.size()) {\r\n        return; // shouldn't happen, but does appear to\r\n    }\r\n    bool wide = (abs(line.width()) > abs(line.height()));\r\n    pDC->setCompositionMode(QPainter::RasterOp_SourceXorDestination);\r\n    pDC->setPen(QColor(m_foreground));\r\n\r\n    if (wide) {\r\n        int step = (line.width() > 0) ? 1 : -1;\r\n        for (int i = 0; (i * step) < abs(line.width()); i += step) {\r\n            QPoint thispixel(i, int((float(line.height()) / float(line.width())) * float(i)));\r\n            if (drawit) {\r\n                m_line_pixels.push_back(m_foreground);\r\n                pDC->drawPoint(line.topLeft() + thispixel);\r\n            } else {\r\n                pDC->drawPoint(line.topLeft() + thispixel);\r\n            }\r\n        }\r\n    } else {\r\n        int step = (line.height() > 0) ? 1 : -1;\r\n        for (int i = 0; (i * step) < abs(line.height()); i += step) {\r\n            QPoint thispixel(int((float(line.width()) / float(line.height())) * float(i)), i);\r\n            if (drawit) {\r\n                m_line_pixels.push_back(m_foreground);\r\n                pDC->drawPoint(line.topLeft() + thispixel);\r\n            } else {\r\n                pDC->drawPoint(line.topLeft() + thispixel);\r\n            }\r\n        }\r\n    }\r\n    if (!drawit) {\r\n        m_line_pixels.clear();\r\n    }\r\n    pDC->setCompositionMode(QPainter::CompositionMode_SourceOver);\r\n}\r\n\r\nvoid QDepthmapView::SetCursor(int mode) {\r\n    switch (mode) {\r\n    case SELECT:\r\n        m_cursor = QCursor(Qt::ArrowCursor);\r\n        break;\r\n    case SELECT | OVERHANDLE:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00005.png\"));\r\n        break;\r\n    case DRAG:\r\n        m_cursor = QCursor(Qt::OpenHandCursor);\r\n        break;\r\n    case ZOOM_IN:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00008.png\"));\r\n        break;\r\n    case ZOOM_OUT:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00009.png\"));\r\n        break;\r\n    case SEEDISOVIST:\r\n    case SEEDHALFOVIST:\r\n    case SEEDAXIAL:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00003.png\"));\r\n        break;\r\n    case FILL:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00001.png\"));\r\n        break;\r\n    case PENCIL:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00002.png\"));\r\n        break;\r\n    case LINETOOL:\r\n    case LINETOOL | DRAWLINE:\r\n    case POLYGONTOOL:\r\n    case POLYGONTOOL | DRAWLINE:\r\n    case SELECT | DRAWLINE:\r\n        m_cursor = QCursor(Qt::CrossCursor);\r\n        break;\r\n    case ERASE:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00006.png\"));\r\n        break;\r\n    case JOIN:\r\n    case UNJOIN:\r\n        m_cursor = QCursor(Qt::PointingHandCursor);\r\n        break;\r\n    case JOIN | JOINB:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00004.png\"));\r\n        break;\r\n    case UNJOIN | JOINB:\r\n        m_cursor = QCursor(QPixmap(\":/images/cur/cur00007.png\"));\r\n        break;\r\n    default:\r\n        m_cursor = QCursor(Qt::ArrowCursor);\r\n        break;\r\n    }\r\n    setCursor(m_cursor);\r\n}\r\n\r\n// Zoom to Selection\r\nvoid QDepthmapView::OnViewZoomsel() {\r\n    if (m_pDoc.m_meta_graph && m_pDoc.m_meta_graph->isSelected()) {\r\n        QtRegion sel_bounds = m_pDoc.m_meta_graph->getSelBounds();\r\n        // select a suitable zoom factor based on bounding box dimensions:\r\n        m_centre = sel_bounds.getCentre();\r\n        QRect phys_bounds = this->rect();\r\n        if (sel_bounds.area() > 1e-9) {\r\n            // base area on selection area\r\n            m_unit = 1.1 * __max(sel_bounds.width() / double(phys_bounds.width()),\r\n                                 sel_bounds.height() / double(phys_bounds.height()));\r\n        } else {\r\n            // base area on some arbitrary zoom into the map\r\n            QtRegion map_bounds = m_pDoc.m_meta_graph->getBoundingBox();\r\n            m_unit = 0.01 * __max(map_bounds.width() / double(phys_bounds.width()),\r\n                                  map_bounds.height() / double(phys_bounds.height()));\r\n        }\r\n        // Redraw scene\r\n        m_redraw_all = true;\r\n        update();\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnViewPan() {\r\n    m_mouse_mode = DRAG;\r\n    SetCursor(DRAG);\r\n}\r\n\r\nvoid QDepthmapView::OnViewZoomIn() {\r\n    m_mouse_mode = ZOOM_IN;\r\n    SetCursor(ZOOM_IN);\r\n}\r\n\r\nvoid QDepthmapView::OnViewZoomOut() {\r\n    m_mouse_mode = ZOOM_OUT;\r\n    SetCursor(ZOOM_OUT);\r\n}\r\n\r\nvoid QDepthmapView::OnEditSelect() {\r\n    m_mouse_mode = SELECT;\r\n    SetCursor(SELECT);\r\n    if (m_showlinks) {\r\n        m_showlinks = false;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnModeIsovist() {\r\n    m_mouse_mode = SEEDISOVIST;\r\n    SetCursor(SEEDISOVIST);\r\n    if (m_showlinks) {\r\n        m_showlinks = false;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnModeTargetedIsovist() {\r\n    m_mouse_mode = SEEDHALFOVIST;\r\n    SetCursor(SEEDHALFOVIST);\r\n    if (m_showlinks) {\r\n        m_showlinks = false;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnModeSeedAxial() {\r\n    m_mouse_mode = SEEDAXIAL;\r\n    SetCursor(SEEDAXIAL);\r\n    if (m_showlinks) {\r\n        m_showlinks = false;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnEditFill() {\r\n    m_mouse_mode = FILL;\r\n    m_fillmode = FULLFILL;\r\n    SetCursor(FILL);\r\n}\r\n\r\nvoid QDepthmapView::OnEditSemiFill() {\r\n    m_mouse_mode = FILL;\r\n    m_fillmode = SEMIFILL;\r\n    SetCursor(FILL);\r\n}\r\n\r\n// AV TV\r\nvoid QDepthmapView::OnEditAugmentFill() {\r\n    m_mouse_mode = FILL;\r\n    m_fillmode = AUGMENT;\r\n    SetCursor(FILL);\r\n}\r\n\r\nvoid QDepthmapView::OnEditPencil() {\r\n    m_mouse_mode = PENCIL;\r\n    SetCursor(PENCIL);\r\n}\r\n\r\nvoid QDepthmapView::OnEditEraser() {\r\n    m_mouse_mode = ERASE;\r\n    SetCursor(ERASE);\r\n}\r\n\r\nvoid QDepthmapView::OnEditLineTool() {\r\n    m_mouse_mode = LINETOOL;\r\n    SetCursor(LINETOOL);\r\n    if (m_showlinks) {\r\n        m_showlinks = false;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnEditPolygonTool() {\r\n    m_mouse_mode = POLYGONTOOL;\r\n    SetCursor(POLYGONTOOL);\r\n    if (m_showlinks) {\r\n        m_showlinks = false;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnModeJoin() {\r\n    if (m_pDoc.m_meta_graph->getState() & (MetaGraph::POINTMAPS | MetaGraph::SHAPEGRAPHS)) {\r\n        m_mouse_mode = JOIN;\r\n        if (!m_pDoc.m_meta_graph->isSelected()) {\r\n            SetCursor(m_mouse_mode);\r\n        } else {\r\n            BeginJoin();\r\n        }\r\n        // Redraw scene\r\n        m_showlinks = true;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnModeUnjoin() {\r\n    if (m_pDoc.m_meta_graph->getState() & (MetaGraph::POINTMAPS | MetaGraph::SHAPEGRAPHS)) {\r\n        m_mouse_mode = UNJOIN;\r\n        if (!m_pDoc.m_meta_graph->isSelected()) {\r\n            SetCursor(m_mouse_mode);\r\n        } else {\r\n            if (m_pDoc.m_meta_graph->viewingProcessedPoints()) {\r\n                m_pDoc.m_meta_graph->clearSel();\r\n            } else {\r\n                m_mouse_mode |= JOINB;\r\n                SetCursor(m_mouse_mode);\r\n            }\r\n        }\r\n        // Redraw scene\r\n        m_showlinks = true;\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_MAP, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_DEPTHMAPVIEW_SETUP, this);\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnEditCopy() {\r\n    QRect rectin = QRect(0, 0, width(), height());\r\n    int state = m_pDoc.m_meta_graph->getState();\r\n\r\n    if (state & MetaGraph::POINTMAPS &&\r\n        (!m_pDoc.m_meta_graph->getDisplayedPointMap().isProcessed() ||\r\n         m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWVGA | MetaGraph::VIEWBACKVGA))) {\r\n        m_pDoc.m_meta_graph->getDisplayedPointMap().setScreenPixel(m_unit); // only used by points (at the moment!)\r\n        m_pDoc.m_meta_graph->getDisplayedPointMap().makeViewportPoints(LogicalViewport(rectin, &m_pDoc));\r\n    }\r\n    if (state & MetaGraph::SHAPEGRAPHS &&\r\n        (m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWBACKAXIAL | MetaGraph::VIEWAXIAL))) {\r\n        m_pDoc.m_meta_graph->getDisplayedShapeGraph().makeViewportShapes(LogicalViewport(rectin, &m_pDoc));\r\n    }\r\n    if (state & MetaGraph::DATAMAPS &&\r\n        (m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWBACKDATA | MetaGraph::VIEWDATA))) {\r\n        m_pDoc.m_meta_graph->getDisplayedDataMap().makeViewportShapes(LogicalViewport(rectin, &m_pDoc));\r\n    }\r\n    if (state & MetaGraph::LINEDATA) {\r\n        m_pDoc.m_meta_graph->makeViewportShapes(LogicalViewport(rectin, &m_pDoc));\r\n    }\r\n\r\n    // Copy to Clipboard\r\n    QPixmap image(width(), height());\r\n    QPainter painter;\r\n    painter.begin(&image); // paint in picture\r\n\r\n    Output(&painter, &m_pDoc, false);\r\n    painter.end(); // painting done\r\n\r\n    QClipboard *clipboard = QApplication::clipboard();\r\n    clipboard->setPixmap(image);\r\n}\r\n\r\nvoid QDepthmapView::OnEditSave() {\r\n    // Very similar to copy to clipboard, only writes an EPS instead of a WMF\r\n    if (m_pDoc.m_communicator) {\r\n        QMessageBox::warning(this, tr(\"Warning\"),\r\n                             tr(\"Another Depthmap process is running, please wait until it completes\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n\r\n    QString saveas;\r\n    QFilePath path(windowFilePath());\r\n    //   saveas = path.m_path + (path.m_name.isEmpty() ? windowTitle() : path.m_name);\r\n    saveas = path.m_path + tr(\"*.eps\");\r\n\r\n    QString template_string = tr(\"Encapsulated Postscript (*.eps)\\nScalable Vector Graphics (*.svg)\\nAll files (*.*)\");\r\n\r\n    QFileDialog::Options options = 0;\r\n    QString selectedFilter;\r\n    QString outfile =\r\n        QFileDialog::getSaveFileName(0, tr(\"Save Screen As\"), saveas, template_string, &selectedFilter, options);\r\n\r\n    if (outfile.isEmpty())\r\n        return;\r\n\r\n    FILE *fp = fopen(outfile.toLatin1(), \"wb\");\r\n    fclose(fp);\r\n\r\n    std::ofstream stream(outfile.toLatin1());\r\n    if (stream.fail()) {\r\n        QMessageBox::warning(this, tr(\"Warning\"), tr(\"Sorry, unable to open \") + outfile + tr(\" for writing\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n\r\n    QFilePath newpath(outfile);\r\n\r\n    QString ext = newpath.m_ext.toLower();\r\n    if (ext == \"svg\") {\r\n        OutputSVG(stream, &m_pDoc);\r\n    } else {\r\n        QMessageBox::StandardButton reply;\r\n        reply =\r\n            QMessageBox::question(this, \"\", \"Would you like to include a scale?\", QMessageBox::Yes | QMessageBox::No);\r\n        bool includeScale = (reply == QMessageBox::Yes);\r\n        // Set up complete... run the .eps outputter (copied from standard output!)\r\n        OutputEPS(stream, &m_pDoc, includeScale);\r\n    }\r\n    stream.close();\r\n}\r\n\r\nvoid QDepthmapView::closeEvent(QCloseEvent *event) {\r\n    m_pDoc.m_view[QGraphDoc::VIEW_MAP] = NULL;\r\n    if (!m_pDoc.OnCloseDocument(QGraphDoc::VIEW_MAP)) {\r\n        m_pDoc.m_view[QGraphDoc::VIEW_MAP] = this;\r\n        event->ignore();\r\n    }\r\n}\r\n\r\nstatic std::string SVGColor(PafColor color) {\r\n    std::stringstream text;\r\n    int r = color.redb();\r\n    int g = color.greenb();\r\n    int b = color.blueb();\r\n    text << std::setfill('0') << \"#\" << std::setw(2) << std::hex << r << std::setw(2) << std::hex << g << std::setw(2)\r\n         << std::hex << b;\r\n    return text.str();\r\n}\r\n\r\nstatic QPoint SVGPhysicalUnits(const Point2f &p, const QtRegion &r, int h) {\r\n    // converts to a 4800 unit wide QtRegion\r\n    return QPoint(int(4800.0 * ((p.x - r.bottom_left.x) / r.width())),\r\n                  h - int(4800.0 * ((p.y - r.bottom_left.y) / r.width())));\r\n}\r\n\r\nvoid QDepthmapView::OutputSVG(std::ofstream &stream, QGraphDoc *pDoc) {\r\n    // This output SVG is a copy of the standard output... obviously, if you change\r\n    // standard output, remember to change this one too!\r\n\r\n    // also out of synch with EPS!\r\n\r\n    // now the two are a little out of synch\r\n\r\n    if (!m_viewport_set) {\r\n        QMessageBox::warning(this, tr(\"Depthmap\"), tr(\"Can't save screen as the Depthmap window is not initialised\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n\r\n    QRect rect = QRect(0, 0, width(), height());\r\n\r\n    // we'll make this 24cm wide whatever, and base the height on it:\r\n    int h = (4800 * rect.height()) / rect.width();\r\n\r\n    stream << \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?>\" << std::endl;\r\n    stream << \"<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\"\" << std::endl;\r\n    stream << \"\\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\" << std::endl;\r\n    stream << \"<svg width=\\\"24cm\\\" height=\\\"\" << (h / 200) << \"cm\\\" viewBox=\\\"0 0 4800 \" << h << \"\\\"\" << std::endl;\r\n    stream << \"xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" version=\\\"1.1\\\">\"\r\n           << std::endl;\r\n    stream << \"<desc>\" << TITLE_BASE << \"</desc>\" << std::endl;\r\n\r\n    // note, SVG draw completely overrides standard draw physical units to achieve hi-res output\r\n    // (EPS should probably follow this model too)\r\n    QtRegion logicalviewport = LogicalViewport(rect, pDoc);\r\n\r\n    stream << \"<rect x=\\\"0\\\" y=\\\"0\\\" width=\\\"4800\\\" height=\\\"\" << h << \"\\\" \"\r\n           << \"fill=\\\"\" << SVGColor(m_background) << \"\\\" stroke=\\\"none\\\" stroke-width=\\\"0\\\" />\" << std::endl;\r\n\r\n    int state = pDoc->m_meta_graph->getState();\r\n\r\n    if (state & MetaGraph::POINTMAPS) {\r\n        pDoc->m_meta_graph->getDisplayedPointMap().setScreenPixel(m_unit); // only used by points (at the moment!)\r\n        pDoc->m_meta_graph->getDisplayedPointMap().makeViewportPoints(logicalviewport);\r\n    }\r\n    if (state & MetaGraph::SHAPEGRAPHS) {\r\n        pDoc->m_meta_graph->getDisplayedShapeGraph().makeViewportShapes(logicalviewport);\r\n    }\r\n    if (state & MetaGraph::DATAMAPS) {\r\n        pDoc->m_meta_graph->getDisplayedDataMap().makeViewportShapes(logicalviewport);\r\n    }\r\n    if (state & MetaGraph::LINEDATA) {\r\n        pDoc->m_meta_graph->makeViewportShapes(logicalviewport);\r\n    }\r\n\r\n    if (state & MetaGraph::POINTMAPS && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n\r\n        PointMap &map = pDoc->m_meta_graph->getDisplayedPointMap();\r\n\r\n        double spacing = map.getSpacing();\r\n        double spacer = 4800.0 * (spacing / logicalviewport.width()) / 2.0;\r\n\r\n        stream << \"<g stroke=\\\"none\\\">\" << std::endl;\r\n\r\n        stream << \"<defs><rect id=\\\"a\\\" width=\\\"\" << 2 * spacer << \"\\\" height=\\\"\" << 2 * spacer << \"\\\" /></defs>\"\r\n               << std::endl;\r\n\r\n        while (map.findNextPoint()) {\r\n\r\n            Point2f logical = map.getNextPointLocation();\r\n            PafColor color = map.getCurrentPointColor();\r\n\r\n            if (color.alphab() != 0) { // alpha == 0 is transparent\r\n\r\n                QPoint p = SVGPhysicalUnits(logical, logicalviewport, h);\r\n\r\n                stream << \"<use fill=\\\"\" << SVGColor(color) << \"\\\" x=\\\"\" << p.x() - spacer << \"\\\" y=\\\"\"\r\n                       << p.y() - spacer << \"\\\" xlink:href=\\\"#a\\\" />\" << std::endl;\r\n            }\r\n        }\r\n        stream << \"</g>\" << std::endl;\r\n    }\r\n\r\n    if (state & MetaGraph::SHAPEGRAPHS && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n\r\n        ShapeMap &map = pDoc->m_meta_graph->getDisplayedShapeGraph();\r\n\r\n        OutputSVGMap(stream, map, logicalviewport, h);\r\n    }\r\n\r\n    if (state & MetaGraph::DATAMAPS && pDoc->m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n\r\n        ShapeMap &map = pDoc->m_meta_graph->getDisplayedDataMap();\r\n\r\n        OutputSVGMap(stream, map, logicalviewport, h);\r\n    }\r\n\r\n    if (state & MetaGraph::LINEDATA) {\r\n        // arbitrary stroke width for now\r\n        stream << \"<g stroke-width=\\\"4\\\" fill=\\\"none\\\" stroke=\\\"\" << SVGColor(m_foreground) << \"\\\">\" << std::endl;\r\n        bool nextlayer = false;\r\n        while (pDoc->m_meta_graph->findNextShape(nextlayer)) {\r\n            const SalaShape &shape = pDoc->m_meta_graph->getNextShape();\r\n            Line l;\r\n            if (shape.isPoint()) {\r\n            } else if (shape.isLine()) {\r\n                Line line = shape.getLine();\r\n                OutputSVGLine(stream, line, logicalviewport, h);\r\n            } else {\r\n                OutputSVGPoly(stream, shape, logicalviewport, h);\r\n            }\r\n        }\r\n        stream << \"</g>\" << std::endl;\r\n    }\r\n\r\n    stream << \"</svg>\" << std::endl;\r\n}\r\n\r\nvoid QDepthmapView::OutputSVGMap(std::ofstream &stream, ShapeMap &map, QtRegion &logicalviewport, int h) {\r\n    bool monochrome = (map.getDisplayParams().colorscale == DisplayParams::MONOCHROME);\r\n    // monochrome not implemented yet!\r\n    if (monochrome) {\r\n        QMessageBox::warning(this, tr(\"Depthmap\"),\r\n                             tr(\"This map is displaying in monochrome, which is not yet supported.  Please note your \"\r\n                                \"SVG file will be empty.  Sorry for the inconvenience.\"),\r\n                             QMessageBox::Ok, QMessageBox::Ok);\r\n        return;\r\n    }\r\n\r\n    // I haven't implemented all of these, but I hope I will get there:\r\n    bool showlines, showfill, showcentroids;\r\n    map.getPolygonDisplay(showlines, showfill, showcentroids);\r\n\r\n    // arbitrary stroke width for now\r\n    stream << \"<g stroke-width=\\\"4\\\">\" << std::endl;\r\n\r\n    PafColor color, oldcolor;\r\n    bool closed, oldclosed;\r\n\r\n    bool first = true;\r\n    bool dummy;\r\n    while (map.findNextShape(dummy)) {\r\n\r\n        // note: getNextLine clears current line, so getLineColor before line\r\n        color = map.getShapeColor();\r\n        const SalaShape &shape = map.getNextShape();\r\n        closed = shape.isClosed();\r\n\r\n        if (first || color != oldcolor || closed != oldclosed) {\r\n            if (!first) {\r\n                stream << \"</g>\" << std::endl;\r\n            } else {\r\n                first = false;\r\n            }\r\n            if (closed) {\r\n                if (showlines) {\r\n                    stream << \"<g fill=\\\"\" << SVGColor(color) << \"\\\" stroke=\\\"\" << SVGColor(m_foreground) << \"\\\">\"\r\n                           << std::endl;\r\n                } else {\r\n                    stream << \"<g fill=\\\"\" << SVGColor(color) << \"\\\" stroke=\\\"none\\\">\" << std::endl;\r\n                }\r\n            } else {\r\n                stream << \"<g fill=\\\"none\\\" stroke=\\\"\" << SVGColor(color) << \"\\\">\" << std::endl;\r\n            }\r\n            oldcolor = color;\r\n            oldclosed = closed;\r\n        }\r\n\r\n        Line l;\r\n        if (shape.isPoint()) {\r\n        } else if (shape.isLine()) {\r\n            Line line = shape.getLine();\r\n            OutputSVGLine(stream, line, logicalviewport, h);\r\n        } else {\r\n            OutputSVGPoly(stream, shape, logicalviewport, h);\r\n        }\r\n    }\r\n    if (!first) {\r\n        stream << \"</g>\" << std::endl;\r\n    }\r\n\r\n    stream << \"</g>\" << std::endl;\r\n}\r\n\r\nvoid QDepthmapView::OutputSVGLine(std::ofstream &stream, Line &line, QtRegion &logicalviewport, int h) {\r\n    bool drewit = false;\r\n    if (line.crop(logicalviewport)) {\r\n        QPoint start = SVGPhysicalUnits(line.start(), logicalviewport, h);\r\n        QPoint end = SVGPhysicalUnits(line.end(), logicalviewport, h);\r\n        // 2.0 is about 0.1mm in a standard SVG output size\r\n        if (dist(Point2f(start.x(), start.y()), Point2f(end.x(), end.y())) >= 2.4f) {\r\n            stream << \"<line x1=\\\"\" << start.x() << \"\\\" y1=\\\"\" << start.y() << \"\\\"\"\r\n                   << \" x2=\\\"\" << end.x() << \"\\\" y2=\\\"\" << end.y() << \"\\\" />\" << std::endl;\r\n        }\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OutputSVGPoly(std::ofstream &stream, const SalaShape &shape, QtRegion &logicalviewport, int h) {\r\n    QPoint bl = SVGPhysicalUnits(shape.getBoundingBox().bottom_left, logicalviewport, h);\r\n    QPoint tr = SVGPhysicalUnits(shape.getBoundingBox().top_right, logicalviewport, h);\r\n    if (dist(Point2f(bl.x(), bl.y()), Point2f(tr.x(), tr.y())) < 2.0f) {\r\n        // 2.0 is about 0.1mm in standard SVG output size -- if this is too small, we won't bother trying to draw it at\r\n        // all\r\n        return;\r\n    }\r\n    if (shape.isOpen()) {\r\n        // open lines are fairly easy: simply chop lines as they enter and exit\r\n        stream << \"<polyline points=\\\"\";\r\n        bool starter = true, drawn = false;\r\n        Point2f lastpoint = shape.m_points.front();\r\n        auto iter = shape.m_points.begin();\r\n        iter++;\r\n        for (; iter != shape.m_points.end(); iter++) {\r\n            Line line(lastpoint, *iter);\r\n            if (line.crop(logicalviewport)) {\r\n                // note: use t_start and t_end so that this line moves in the correct direction\r\n                QPoint start = SVGPhysicalUnits(line.t_start(), logicalviewport, h);\r\n                QPoint end = SVGPhysicalUnits(line.t_end(), logicalviewport, h);\r\n                // always draw either from the first point or whenever you enter the viewport:\r\n                if (starter) {\r\n                    stream << start.x() << \",\" << start.y() << \" \";\r\n                    starter = false;\r\n                }\r\n                // 2.0 is about 0.1mm in a standard SVG output size\r\n                if (dist(Point2f(start.x(), start.y()), Point2f(end.x(), end.y())) >= 2.0f ||\r\n                    iter == shape.m_points.end() - 1) {\r\n                    // also, always draw the very last point regardless of distance\r\n                    stream << end.x() << \",\" << end.y() << \" \";\r\n                    drawn = true;\r\n                }\r\n            } else {\r\n                starter = true;\r\n                drawn = true;\r\n            }\r\n            if (drawn) {\r\n                lastpoint = *iter;\r\n                drawn = false;\r\n            }\r\n        }\r\n        stream << \"\\\" />\" << std::endl;\r\n    } else {\r\n        // polygons are hard... have to work out entry and exit points to the clipping frame\r\n        // and wind according to their direction\r\n        stream << \"<polygon points=\\\"\";\r\n        std::vector<SalaEdgeU> eus = shape.getClippingSet(logicalviewport);\r\n        if (eus.size() == 0) {\r\n            // this should be a shape that is entirely within the viewport:\r\n            QPoint last = SVGPhysicalUnits(shape.m_points[0], logicalviewport, h);\r\n            stream << last.x() << \",\" << last.y() << \" \";\r\n            auto iter = shape.m_points.begin();\r\n            iter++;\r\n            for (; iter != shape.m_points.end(); iter++) {\r\n                QPoint next = SVGPhysicalUnits(*iter, logicalviewport, h);\r\n                if (dist(Point2f(last.x(), last.y()), Point2f(next.x(), next.y())) >= 2.0f) {\r\n                    stream << next.x() << \",\" << next.y() << \" \";\r\n                    last = next;\r\n                }\r\n            }\r\n        } else if (eus.size() == 1) {\r\n            // dummy: getClippingSet deliberately adds a single empty EdgeU if the polygon is completely outside the\r\n            // frame (this can happen when a polygon wraps around the frame)\r\n        } else if (eus.size() >= 2) {\r\n            int entry = eus[0].entry ? 0 : 1;\r\n            // this can get very messy (sometimes have to split into separate polys)... here's hoping for the best\r\n            while (entry < (int)eus.size()) {\r\n                int exit = int((entry + 1) % eus.size());\r\n                Point2f pt = logicalviewport.getEdgeUPoint(eus[entry]);\r\n                QPoint last = SVGPhysicalUnits(pt, logicalviewport, h);\r\n                QPoint next;\r\n                stream << last.x() << \",\" << last.y() << \" \";\r\n                for (size_t i = eus[entry].index + 1; i != eus[exit].index; i++) {\r\n                    if (i >= shape.m_points.size()) {\r\n                        i = 0;\r\n                    }\r\n                    next = SVGPhysicalUnits(shape.m_points[i], logicalviewport, h);\r\n                    if (dist(Point2f(last.x(), last.y()), Point2f(next.x(), next.y())) >= 2.0f) {\r\n                        stream << next.x() << \",\" << next.y() << \" \";\r\n                        last = next;\r\n                    }\r\n                }\r\n                pt = logicalviewport.getEdgeUPoint(eus[exit]);\r\n                last = SVGPhysicalUnits(pt, logicalviewport, h);\r\n                stream << last.x() << \",\" << last.y() << \" \";\r\n                bool breakup = false;\r\n                if (entry + 2 < (int)eus.size() &&\r\n                    ccwEdgeU(eus[entry], eus[entry + 1], eus[entry + 2]) != shape.isCCW()) {\r\n                    breakup = true;\r\n                }\r\n                EdgeU &nextentry = breakup ? eus[entry] : eus[(exit + 1) % eus.size()];\r\n                if (shape.isCCW()) {\r\n                    if (nextentry.edge != eus[exit].edge || nextentry.u < eus[exit].u) {\r\n                        int edge = eus[exit].edge;\r\n                        do {\r\n                            edge++;\r\n                            if (edge > 3) {\r\n                                edge = 0;\r\n                            }\r\n                            next = SVGPhysicalUnits(logicalviewport.getEdgeUPoint(EdgeU(edge, 0)), logicalviewport, h);\r\n                            stream << next.x() << \",\" << next.y() << \" \";\r\n                        } while (edge != nextentry.edge);\r\n                    }\r\n                } else {\r\n                    if (nextentry.edge != eus[exit].edge || nextentry.u > eus[exit].u) {\r\n                        int edge = eus[exit].edge;\r\n                        do {\r\n                            edge--;\r\n                            if (edge < 0) {\r\n                                edge = 3;\r\n                            }\r\n                            next = SVGPhysicalUnits(logicalviewport.getEdgeUPoint(EdgeU(edge, 1)), logicalviewport, h);\r\n                            stream << next.x() << \",\" << next.y() << \" \";\r\n                        } while (edge != nextentry.edge);\r\n                    }\r\n                }\r\n                if (breakup) {\r\n                    // if (entry + 2 < eus.size() && ccwEdgeU(eus[entry],eus[entry+1],eus[entry+2]) != shape.isCCW()) {\r\n                    stream << \"\\\" />\" << std::endl;\r\n                    stream << \"<polygon points=\\\"\";\r\n                }\r\n                entry += 2;\r\n            }\r\n        }\r\n        stream << \"\\\" />\" << std::endl;\r\n    }\r\n}\r\n\r\nvoid QDepthmapView::OnViewZoomToRegion(QtRegion regionToZoomAt) {\r\n\r\n    m_centre = regionToZoomAt.getCentre();\r\n    QRect phys_bounds = this->rect();\r\n    m_unit = 1.0 * __max(regionToZoomAt.width() / double(phys_bounds.width()),\r\n                         regionToZoomAt.height() / double(phys_bounds.height()));\r\n}\r\n"
  },
  {
    "path": "depthmapX/views/depthmapview/depthmapview.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"depthmapX/views/mapview.h\"\r\n#include <QPoint>\r\n#include <QRect>\r\n#include <QSize>\r\n\r\n#include <qpixmap.h>\r\n\r\n#define MK_LBUTTON 0x0001\r\n#define MK_RBUTTON 0x0002\r\n#define MK_SHIFT 0x0004\r\n#define MK_CONTROL 0x0008\r\n#define MK_MBUTTON 0x0010\r\n\r\nclass QDepthmapView : public MapView {\r\n    Q_OBJECT\r\n\r\n  public:\r\n    QDepthmapView(QGraphDoc &pDoc, Settings &settings, QWidget *parent = Q_NULLPTR);\r\n    ~QDepthmapView();\r\n    QSize sizeHint() const override;\r\n    void SetRedrawflag();\r\n    void saveToFile();\r\n\r\n    bool m_showgrid;\r\n    bool m_showtext;\r\n    bool m_showlinks;\r\n    int m_current_mode;\r\n\r\n    // Selectable mouse modes\r\n    enum {\r\n        NONE = 0x0000,\r\n        SELECT = 0x10000,\r\n        FILL = 0x0002,\r\n        SEEDAXIAL = 0x0004,\r\n        LINETOOL = 0x0008,\r\n        POLYGONTOOL = 0x0010,\r\n        ZOOMORDRAG = 0x0300,\r\n        DRAG = 0x0101,\r\n        ZOOM = 0x0200,\r\n        ZOOM_IN = 0x0202,\r\n        ZOOM_OUT = 0x0204,\r\n        GENERICPENCIL = 0x0800,\r\n        PENCIL = 0x0801,\r\n        ERASE = 0x0802,\r\n        SNAP = 0x1000,\r\n        SNAPON = 0x1001,\r\n        SNAPOFF = 0x1002, // snap modes are not used outside invalidate -- '1000' used to test snap\r\n        DRAWLINE = 0x2000,\r\n        LINEON = 0x2001,\r\n        LINEOFF = 0x2002,\r\n        GENERICISOVIST = 0x4000,\r\n        SEEDISOVIST = 0x4001,\r\n        SEEDHALFOVIST = 0x4002,\r\n        OVERHANDLE = 0x8000,\r\n        GENERICJOIN = 0x20000,\r\n        JOINB = 0x00400,\r\n        JOIN = 0x20001,\r\n        UNJOIN = 0x20002\r\n    };\r\n    enum { FULLFILL = 0, SEMIFILL = 1, AUGMENT = 2 }; // AV TV\r\n    virtual void OnModeJoin() override;\r\n    virtual void OnModeUnjoin() override;\r\n    virtual void OnModeSeedAxial() override;\r\n    virtual void OnModeIsovist() override;\r\n    virtual void OnModeTargetedIsovist() override;\r\n    virtual void OnEditLineTool() override;\r\n    virtual void OnEditPolygonTool() override;\r\n    virtual void OnEditFill() override;\r\n    virtual void OnEditSemiFill() override;\r\n    virtual void OnEditAugmentFill() override; // AV TV\r\n    virtual void OnViewZoomIn() override;\r\n    virtual void OnViewZoomOut() override;\r\n    virtual void OnViewPan() override;\r\n    virtual void OnViewZoomsel() override;\r\n    virtual void OnEditSelect() override;\r\n    virtual void OnEditPencil() override;\r\n    virtual void postLoadFile() override;\r\n    virtual void OnEditCopy() override;\r\n    virtual void OnEditSave() override;\r\n    virtual void OnViewZoomToRegion(QtRegion regionToZoomAt) override;\r\n\r\n  protected:\r\n    virtual void timerEvent(QTimerEvent *event) override;\r\n    virtual void paintEvent(QPaintEvent *event) override;\r\n    virtual void resizeGL(int w, int h) override;\r\n    virtual void mouseMoveEvent(QMouseEvent *event) override;\r\n    virtual void mousePressEvent(QMouseEvent *event) override;\r\n    virtual void mouseReleaseEvent(QMouseEvent *event) override;\r\n    virtual void closeEvent(QCloseEvent *event) override;\r\n    virtual void mouseDoubleClickEvent(QMouseEvent *e) override;\r\n    virtual void wheelEvent(QWheelEvent *e) override;\r\n    virtual bool eventFilter(QObject *object, QEvent *e) override;\r\n\r\n  public slots:\r\n    int OnRedraw(int wParam, int lParam);\r\n    void OnEditEraser();\r\n\r\n  private:\r\n    int m_mouse_mode;\r\n    int Tid_redraw;\r\n    QSize m_initialSize;\r\n\r\n    ////////////////////////////////////////////////////////////////////\r\n    QCursor m_cursor;\r\n\r\n    QPoint m_mouse_point;\r\n    Point2f m_mouse_location;\r\n    int m_fillmode;\r\n    QRect m_drag_rect_a;\r\n    QRect m_drag_rect_b;\r\n\r\n    QRgb m_selected_color;\r\n\r\n    bool ModeOk();\r\n\r\n    // lots of screen drawing booleans... to be tidied up...\r\n    bool m_drawing;\r\n    bool m_continue_drawing;\r\n    //\r\n    int m_invalidate; // <- includes the mode\r\n    bool m_queued_redraw;\r\n    bool m_internal_redraw;\r\n    bool m_clear;\r\n    bool m_redraw;\r\n\r\n    bool m_resize_viewport;\r\n    bool m_viewport_set;\r\n    bool m_redraw_all;\r\n    bool m_redraw_no_clear;\r\n\r\n    bool m_right_mouse_drag;\r\n    bool m_alt_mode;\r\n\r\n    // logical units:\r\n    Point2f m_centre;\r\n    double m_unit;\r\n    // keep tabs on the screen size:\r\n    QSize m_physical_centre;\r\n\r\n    // record any previous find location loc:\r\n    Point2f m_lastfindloc;\r\n\r\n    // Snap to control (must be in map units for accuracy)\r\n    Point2f m_snap_point;\r\n    Point2f m_old_snap_point;\r\n    QRgb m_cross_pixels[18];\r\n    bool m_snap;\r\n    int m_repaint_tag;\r\n\r\n    // Line start and end (must be in map units in case you zoom out / pan while you're drawing!\r\n    Line m_line;\r\n    Line m_old_line;\r\n    std::vector<QRgb> m_line_pixels;\r\n    std::vector<Point2f> m_point_handles;\r\n    int m_active_point_handle;\r\n\r\n    int m_currentlyEditingShapeRef = -1;\r\n\r\n    // polygon drawing utilities\r\n    Point2f m_poly_start;\r\n    int m_poly_points;\r\n\r\n    QRgb m_background;\r\n    QRgb m_foreground;\r\n\r\n    ///////////////////////////////////////////////////////////////////////\r\n\r\n    Point2f LogicalUnits(const QPoint &p);\r\n    QPoint PhysicalUnits(const Point2f &p);\r\n\r\n    // hover information\r\n    void ResetHoverWnd(const QPoint &p = QPoint(-1, -1));\r\n    void CreateHoverWnd();\r\n\r\n    bool IsAtZoomLimits(double ratio, double maxZoomOutRatio);\r\n    void ZoomTowards(double ratio, const Point2f &point);\r\n\r\n    void InitViewport(const QRect &phys_bounds, QGraphDoc *pDoc);\r\n    QtRegion LogicalViewport(const QRect &phys_bounds, QGraphDoc *pDoc);\r\n\r\n    int GetSpacer(QGraphDoc *pDoc);\r\n    void PrintBaby(QPainter *pDC, QGraphDoc *pDoc);\r\n    bool Output(QPainter *pDC, QGraphDoc *pDoc, bool screendraw);\r\n    bool DrawPoints(QPainter *pDC, QGraphDoc *pDoc, int spacer, unsigned long ticks, bool screendraw);\r\n    bool DrawAxial(QPainter *pDC, QGraphDoc *pDoc, int spacer, unsigned long ticks, bool screendraw);\r\n    bool DrawShapes(QPainter *pDC, ShapeMap &map, bool muted, int spacer, unsigned long ticks, bool screendraw);\r\n\r\n    void DrawLink(QPainter *pDC, int spacer, const Line &logical);\r\n    void DrawPointHandle(QPainter *pDC, QPoint pt);\r\n\r\n    //\r\n    void OutputEPS(std::ofstream &stream, QGraphDoc *pDoc, bool includeScale = true);\r\n    void OutputEPSMap(std::ofstream &stream, ShapeMap &map, QtRegion &logicalviewport, QRect &rect, float spacer);\r\n    void OutputEPSLine(std::ofstream &stream, Line &line, int spacer, QtRegion &logicalviewport, QRect &rect);\r\n    void OutputEPSPoly(std::ofstream &stream, const SalaShape &shape, int spacer, QtRegion &logicalviewport,\r\n                       QRect &rect);\r\n\r\n    void OutputSVG(std::ofstream &stream, QGraphDoc *pDoc);\r\n    void OutputSVGMap(std::ofstream &stream, ShapeMap &map, QtRegion &logicalviewport, int h);\r\n    void OutputSVGLine(std::ofstream &stream, Line &line, QtRegion &logicalviewport, int h);\r\n    void OutputSVGPoly(std::ofstream &stream, const SalaShape &shape, QtRegion &logicalviewport, int h);\r\n\r\n    void FillLocation(QPainter *pDC, QPoint &p, int spacer, unsigned int blocked, QRgb color);\r\n    void DrawLine(QPainter *pDC, QRect &line, bool drawit);\r\n    void DrawCross(QPainter *pDC, QPoint &centre, bool drawit);\r\n\r\n    void SetCursor(int mode);\r\n    void AltMode();\r\n    void BeginJoin();\r\n    void BeginDrag(QPoint point);\r\n\r\n    QPixmap *m_pixmap;\r\n};\r\n"
  },
  {
    "path": "depthmapX/views/glview/gldynamicline.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"gldynamicline.h\"\n/**\n * @brief GLDynamicLine::GLDynamicLine\n * This class is an OpenGL representation of a dynamic line. See GLDynamicRect\n * to understand the details of the implementation. This class only uses the\n * diagonal points of the GLDynamicRect to make a line\n */\n\nGLDynamicLine::GLDynamicLine() {\n    m_count = 0;\n    m_program = 0;\n    m_data.resize(2);\n\n    add(0);\n    add(3);\n}\n\nvoid GLDynamicLine::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel,\n                            const QMatrix2x2 &m_selectionBounds) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n    m_program->setUniformValue(m_diagVertices2DLoc, m_selectionBounds);\n\n    m_program->setUniformValue(m_colourVectorLoc, m_colour_stroke);\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glDrawArrays(GL_LINE_LOOP, 0, vertexCount());\n\n    m_program->release();\n}\n"
  },
  {
    "path": "depthmapX/views/glview/gldynamicline.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/views/glview/gldynamicrect.h\"\n\nclass GLDynamicLine : public GLDynamicRect {\n  public:\n    GLDynamicLine();\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel,\n                 const QMatrix2x2 &m_selectionBounds);\n};\n"
  },
  {
    "path": "depthmapX/views/glview/gldynamicrect.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"gldynamicrect.h\"\n\nstatic const char *vertexShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"in float vertexIndex;\\n\"\n    \"int idxx;\\n\"\n    \"int idxy;\\n\"\n    \"uniform mat2 diagVertices2D;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   idxx = int(mod(vertexIndex,2.0));\\n\"\n    \"   idxy = int(vertexIndex/2.0);\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vec4(diagVertices2D[0][idxx],diagVertices2D[1][idxy],0,1);\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"uniform vec4 colourVector;\\n\"\n    \"out highp vec4 fragColor;\\n\"\n    \"void main() {\\n\"\n    \"   fragColor = colourVector;\\n\"\n    \"}\\n\";\n\nstatic const char *vertexShaderSource = // auto-format hack\n    \"attribute float vertexIndex;\\n\"\n    \"int idxx;\\n\"\n    \"int idxy;\\n\"\n    \"uniform mat2 diagVertices2D;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   idxx = int(mod(vertexIndex,2.0));\\n\"\n    \"   idxy = int(vertexIndex/2.0);\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vec4(diagVertices2D[0][idxx],diagVertices2D[1][idxy],0,1);\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSource = // auto-format hack\n    \"uniform highp vec4 colourVector;\\n\"\n    \"void main() {\\n\"\n    \"   gl_FragColor = colourVector;\\n\"\n    \"}\\n\";\n\n/**\n * @brief GLDynamicRect::GLDynamicRect\n * This class is an OpenGL representation of a dynamic rectangle. The only attribute\n * sent to the shader is the index of 4 vertices, and the actual position of the\n * vertices is sent as a uniform 2x2 matrix (bottom-left-x, bottom-left-y, top-right-x,\n * top-right-y)\n */\n\nGLDynamicRect::GLDynamicRect() : m_count(0), m_program(0) {\n    m_count = 0;\n    m_data.resize(4);\n\n    add(0);\n    add(1);\n    add(3);\n    add(2);\n}\n\nvoid GLDynamicRect::setupVertexAttribs() {\n    m_vbo.bind();\n    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();\n    f->glEnableVertexAttribArray(0);\n    f->glVertexAttribPointer(0, DATA_DIMENSIONS, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat), 0);\n    m_vbo.release();\n}\n\nvoid GLDynamicRect::initializeGL(bool m_core) {\n    if (m_data.size() == 0)\n        return;\n    m_program = new QOpenGLShaderProgram;\n    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, m_core ? vertexShaderSourceCore : vertexShaderSource);\n    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,\n                                       m_core ? fragmentShaderSourceCore : fragmentShaderSource);\n    m_program->bindAttributeLocation(\"vertexIndex\", 0);\n    m_program->link();\n\n    m_program->bind();\n    m_diagVertices2DLoc = m_program->uniformLocation(\"diagVertices2D\");\n    m_projMatrixLoc = m_program->uniformLocation(\"projMatrix\");\n    m_mvMatrixLoc = m_program->uniformLocation(\"mvMatrix\");\n    m_colourVectorLoc = m_program->uniformLocation(\"colourVector\");\n\n    m_vao.create();\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n\n    m_vbo.create();\n    m_vbo.bind();\n    m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n\n    setupVertexAttribs();\n    m_program->setUniformValue(m_colourVectorLoc, m_colour_fill);\n    m_program->release();\n    m_built = true;\n}\n\nvoid GLDynamicRect::updateGL(bool m_core) {\n    if (m_program == 0) {\n        // has not been initialised yet, do that instead\n        initializeGL(m_core);\n    } else {\n        m_vbo.bind();\n        m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n        m_vbo.release();\n    }\n}\n\nvoid GLDynamicRect::setFillColour(const QRgb &fillColour) {\n    m_colour_fill.setX(qRed(fillColour) / 255.0);\n    m_colour_fill.setY(qGreen(fillColour) / 255.0);\n    m_colour_fill.setZ(qBlue(fillColour) / 255.0);\n}\n\nvoid GLDynamicRect::setStrokeColour(const QRgb &strokeColour) {\n    m_colour_stroke.setX(qRed(strokeColour) / 255.0);\n    m_colour_stroke.setY(qGreen(strokeColour) / 255.0);\n    m_colour_stroke.setZ(qBlue(strokeColour) / 255.0);\n}\n\nvoid GLDynamicRect::cleanup() {\n    m_vbo.destroy();\n    delete m_program;\n    m_program = 0;\n}\n\nvoid GLDynamicRect::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel,\n                            const QMatrix2x2 &m_selectionBounds) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n    m_program->setUniformValue(m_diagVertices2DLoc, m_selectionBounds);\n\n    m_program->setUniformValue(m_colourVectorLoc, m_colour_fill);\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount());\n\n    m_program->setUniformValue(m_colourVectorLoc, m_colour_stroke);\n    glFuncs->glDrawArrays(GL_LINE_LOOP, 0, vertexCount());\n\n    m_program->release();\n}\n\nvoid GLDynamicRect::add(const GLfloat v) {\n    GLfloat *p = m_data.data() + m_count;\n    *p++ = v;\n    m_count += DATA_DIMENSIONS;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/gldynamicrect.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QRgb>\n#include <QVector3D>\n#include <QVector>\n#include <qopengl.h>\n\nclass GLDynamicRect {\n  public:\n    GLDynamicRect();\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel,\n                 const QMatrix2x2 &m_selectionBounds);\n    void initializeGL(bool m_core);\n    void updateGL(bool m_core);\n    void cleanup();\n    void setFillColour(const QRgb &fillColour);\n    void setStrokeColour(const QRgb &strokeColour);\n    int vertexCount() const { return m_count / DATA_DIMENSIONS; }\n\n    GLDynamicRect(const GLDynamicRect &) = delete;\n    GLDynamicRect &operator=(const GLDynamicRect &) = delete;\n\n  protected:\n    void add(const GLfloat v);\n\n    int m_count;\n    bool m_built = false;\n    QVector<GLfloat> m_data;\n\n    QOpenGLBuffer m_vbo;\n    QOpenGLVertexArrayObject m_vao;\n    QOpenGLShaderProgram *m_program;\n\n    int m_diagVertices2DLoc;\n    int m_projMatrixLoc;\n    int m_mvMatrixLoc;\n    int m_colourVectorLoc;\n\n    QVector4D m_colour_fill = QVector4D(0.0f, 1.0f, 0.0f, 0.3f);\n    QVector4D m_colour_stroke = QVector4D(1.0f, 1.0f, 1.0f, 1.0f);\n\n  private:\n    const int DATA_DIMENSIONS = 1;\n    void setupVertexAttribs();\n    int count() const { return m_count; }\n    const GLfloat *constData() const { return m_data.constData(); }\n};\n"
  },
  {
    "path": "depthmapX/views/glview/gllines.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"gllines.h\"\n#include <genlib/exceptions.h>\n#include <qmath.h>\n\nstatic const char *vertexShaderSourceCore = //\n    \"#version 150\\n\"\n    \"in vec4 vertex;\\n\"\n    \"in vec3 colour;\\n\"\n    \"out vec3 col;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   col = colour.xyz;\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSourceCore = //\n    \"#version 150\\n\"\n    \"in vec3 col;\\n\"\n    \"out highp vec3 fragColor;\\n\"\n    \"void main() {\\n\"\n    \"   fragColor = col;\\n\"\n    \"}\\n\";\n\nstatic const char *vertexShaderSource = //\n    \"attribute vec4 vertex;\\n\"\n    \"attribute vec3 colour;\\n\"\n    \"varying vec3 col;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   col = colour.xyz;\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSource = //\n    \"varying highp vec3 col;\\n\"\n    \"void main() {\\n\"\n    \"   gl_FragColor = vec4(col, 1.0);\\n\"\n    \"}\\n\";\n\n/**\n * @brief GLLines::GLLines\n * This class is an OpenGL representation of  multiple lines of uniform colour\n */\n\nGLLines::GLLines() : m_count(0), m_program(0) {}\n\nvoid GLLines::loadLineData(const std::vector<std::pair<SimpleLine, PafColor>> &colouredLines) {\n    m_built = false;\n\n    m_count = 0;\n    m_data.resize(colouredLines.size() * 2 * DATA_DIMENSIONS);\n\n    for (auto &colouredLine : colouredLines) {\n        const SimpleLine &line = colouredLine.first;\n        const PafColor &colour = colouredLine.second;\n\n        QVector3D colourVector(colour.redf(), colour.greenf(), colour.bluef());\n        add(QVector3D(line.start().x, line.start().y, 0.0f), colourVector);\n        add(QVector3D(line.end().x, line.end().y, 0.0f), colourVector);\n    }\n}\n\nvoid GLLines::setupVertexAttribs() {\n    m_vbo.bind();\n    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();\n    f->glEnableVertexAttribArray(0);\n    f->glEnableVertexAttribArray(1);\n    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat), 0);\n    f->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat),\n                             reinterpret_cast<void *>(3 * sizeof(GLfloat)));\n    m_vbo.release();\n}\n\nvoid GLLines::initializeGL(bool coreProfile) {\n    if (m_data.size() == 0)\n        return;\n    m_program = new QOpenGLShaderProgram;\n    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,\n                                       coreProfile ? vertexShaderSourceCore : vertexShaderSource);\n    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,\n                                       coreProfile ? fragmentShaderSourceCore : fragmentShaderSource);\n    m_program->bindAttributeLocation(\"vertex\", 0);\n    m_program->bindAttributeLocation(\"colour\", 1);\n    m_program->link();\n\n    m_program->bind();\n    m_projMatrixLoc = m_program->uniformLocation(\"projMatrix\");\n    m_mvMatrixLoc = m_program->uniformLocation(\"mvMatrix\");\n\n    // Create a vertex array object. In OpenGL ES 2.0 and OpenGL 2.x\n    // implementations this is optional and support may not be present\n    // at all. Nonetheless the below code works in all cases and makes\n    // sure there is a VAO when one is needed.\n    m_vao.create();\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n\n    // Setup our vertex buffer object.\n    m_vbo.create();\n    m_vbo.bind();\n    m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n\n    // Store the vertex attribute bindings for the program.\n    setupVertexAttribs();\n    m_program->release();\n    m_built = true;\n}\n\nvoid GLLines::updateGL(bool coreProfile) {\n    if (m_program == 0) {\n        // has not been initialised yet, do that instead\n        initializeGL(coreProfile);\n    } else {\n        m_vbo.bind();\n        m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n        m_vbo.release();\n        m_built = true;\n    }\n}\n\nvoid GLLines::cleanup() {\n    if (!m_built)\n        return;\n    m_vbo.destroy();\n    delete m_program;\n    m_program = 0;\n}\n\nvoid GLLines::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glDrawArrays(GL_LINES, 0, vertexCount());\n\n    m_program->release();\n}\n\nvoid GLLines::add(const QVector3D &v, const QVector3D &c) {\n    GLfloat *p = m_data.data() + m_count;\n    *p++ = v.x();\n    *p++ = v.y();\n    *p++ = v.z();\n    *p++ = c.x();\n    *p++ = c.y();\n    *p++ = c.z();\n    m_count += DATA_DIMENSIONS;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/gllines.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include \"salalib/pafcolor.h\"\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QRgb>\n#include <QVector3D>\n#include <QVector>\n#include <qopengl.h>\n\nclass GLLines {\n    friend class testgllines;\n\n  public:\n    GLLines();\n    void loadLineData(const std::vector<std::pair<SimpleLine, PafColor>> &colouredLines);\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel);\n    void initializeGL(bool coreProfile);\n    void updateGL(bool coreProfile);\n    void cleanup();\n    int vertexCount() const { return m_count / DATA_DIMENSIONS; }\n    GLLines(const GLLines &) = delete;\n    GLLines &operator=(const GLLines &) = delete;\n\n  private:\n    const int DATA_DIMENSIONS = 6;\n    void setupVertexAttribs();\n    const GLfloat *constData() const { return m_data.constData(); }\n    void add(const QVector3D &v, const QVector3D &c);\n\n    QVector<GLfloat> m_data;\n    int m_count;\n    bool m_built = false;\n\n    QOpenGLVertexArrayObject m_vao;\n    QOpenGLBuffer m_vbo;\n    QOpenGLShaderProgram *m_program;\n    int m_projMatrixLoc;\n    int m_mvMatrixLoc;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/gllinesuniform.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"gllinesuniform.h\"\n#include <qmath.h>\n\nstatic const char *vertexShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"in vec4 vertex;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"uniform vec4 colourVector;\\n\"\n    \"out highp vec4 fragColor;\\n\"\n    \"void main() {\\n\"\n    \"   fragColor = colourVector;\\n\"\n    \"}\\n\";\n\nstatic const char *vertexShaderSource = // auto-format hack\n    \"attribute vec4 vertex;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSource = // auto-format hack\n    \"uniform highp vec4 colourVector;\\n\"\n    \"void main() {\\n\"\n    \"   gl_FragColor = colourVector;\\n\"\n    \"}\\n\";\n\n/**\n * @brief GLLinesUniform::GLLinesUniform\n * This class is an OpenGL representation of  multiple lines of uniform colour\n */\n\nGLLinesUniform::GLLinesUniform() : m_count(0), m_program(0) {}\n\nvoid GLLinesUniform::loadLineData(const std::vector<SimpleLine> &lines, const QRgb &lineColour) {\n    m_built = false;\n\n    m_count = 0;\n    m_data.resize(lines.size() * 2 * DATA_DIMENSIONS);\n\n    for (auto &line : lines) {\n        add(QVector3D(line.start().x, line.start().y, 0.0f));\n        add(QVector3D(line.end().x, line.end().y, 0.0f));\n    }\n    m_colour.setX(qRed(lineColour) / 255.0f);\n    m_colour.setY(qGreen(lineColour) / 255.0f);\n    m_colour.setZ(qBlue(lineColour) / 255.0f);\n    m_colour.setW(qAlpha(lineColour) / 255.0f);\n}\n\nvoid GLLinesUniform::setupVertexAttribs() {\n    m_vbo.bind();\n    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();\n    f->glEnableVertexAttribArray(0);\n    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat), 0);\n    m_vbo.release();\n}\n\nvoid GLLinesUniform::initializeGL(bool coreProfile) {\n    if (m_data.size() == 0)\n        return;\n    m_program = new QOpenGLShaderProgram;\n    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,\n                                       coreProfile ? vertexShaderSourceCore : vertexShaderSource);\n    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,\n                                       coreProfile ? fragmentShaderSourceCore : fragmentShaderSource);\n    m_program->bindAttributeLocation(\"vertex\", 0);\n    m_program->link();\n\n    m_program->bind();\n    m_projMatrixLoc = m_program->uniformLocation(\"projMatrix\");\n    m_mvMatrixLoc = m_program->uniformLocation(\"mvMatrix\");\n    m_colourVectorLoc = m_program->uniformLocation(\"colourVector\");\n\n    // Create a vertex array object. In OpenGL ES 2.0 and OpenGL 2.x\n    // implementations this is optional and support may not be present\n    // at all. Nonetheless the below code works in all cases and makes\n    // sure there is a VAO when one is needed.\n    m_vao.create();\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n\n    // Setup our vertex buffer object.\n    m_vbo.create();\n    m_vbo.bind();\n    m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n\n    // Store the vertex attribute bindings for the program.\n    setupVertexAttribs();\n    m_program->setUniformValue(m_colourVectorLoc, m_colour);\n    m_program->release();\n    m_built = true;\n}\n\nvoid GLLinesUniform::updateGL(bool coreProfile) {\n    if (m_program == 0) {\n        // has not been initialised yet, do that instead\n        initializeGL(coreProfile);\n    } else {\n        m_vbo.bind();\n        m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n        m_vbo.release();\n        m_built = true;\n    }\n}\n\nvoid GLLinesUniform::updateColour(const QRgb &lineColour) {\n    m_colour.setX(qRed(lineColour) / 255.0f);\n    m_colour.setY(qGreen(lineColour) / 255.0f);\n    m_colour.setZ(qBlue(lineColour) / 255.0f);\n    m_program->bind();\n    m_program->setUniformValue(m_colourVectorLoc, m_colour);\n    m_program->release();\n}\n\nvoid GLLinesUniform::cleanup() {\n    if (!m_built)\n        return;\n    m_vbo.destroy();\n    delete m_program;\n    m_program = 0;\n}\n\nvoid GLLinesUniform::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glDrawArrays(GL_LINES, 0, vertexCount());\n\n    m_program->release();\n}\n\nvoid GLLinesUniform::add(const QVector3D &v) {\n    GLfloat *p = m_data.data() + m_count;\n    *p++ = v.x();\n    *p++ = v.y();\n    *p++ = v.z();\n    m_count += DATA_DIMENSIONS;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/gllinesuniform.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QRgb>\n#include <QVector3D>\n#include <QVector>\n#include <qopengl.h>\n\nclass GLLinesUniform {\n  public:\n    GLLinesUniform();\n    void loadLineData(const std::vector<SimpleLine> &lines, const QRgb &lineColour);\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel);\n    void initializeGL(bool coreProfile);\n    void updateGL(bool coreProfile);\n    void cleanup();\n    void updateColour(const QRgb &lineColour);\n    int vertexCount() const { return m_count / DATA_DIMENSIONS; }\n    GLLinesUniform(const GLLinesUniform &) = delete;\n    GLLinesUniform &operator=(const GLLinesUniform &) = delete;\n\n  private:\n    const int DATA_DIMENSIONS = 3;\n    void setupVertexAttribs();\n    const GLfloat *constData() const { return m_data.constData(); }\n    void add(const QVector3D &v);\n\n    QVector<GLfloat> m_data;\n    int m_count;\n    bool m_built = false;\n    QVector4D m_colour = QVector4D(1.0f, 1.0f, 1.0f, 1.0f);\n\n    QOpenGLVertexArrayObject m_vao;\n    QOpenGLBuffer m_vbo;\n    QOpenGLShaderProgram *m_program;\n    int m_projMatrixLoc;\n    int m_mvMatrixLoc;\n    int m_colourVectorLoc;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glpointmap.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"glpointmap.h\"\n#include \"salalib/geometrygenerators.h\"\n#include \"salalib/linkutils.h\"\n\nvoid GLPointMap::loadGLObjects(PointMap &pointMap) {\n    QtRegion region = pointMap.getRegion();\n    m_pointMap.loadRegionData(region.bottom_left.x, region.bottom_left.y, region.top_right.x, region.top_right.y);\n\n    if (m_showGrid) {\n        std::vector<SimpleLine> gridData;\n        double spacing = pointMap.getSpacing();\n        double offsetX = region.bottom_left.x;\n        double offsetY = region.bottom_left.y;\n        for (int x = 1; x < pointMap.getCols(); x++) {\n            gridData.push_back(\n                SimpleLine(offsetX + x * spacing, region.bottom_left.y, offsetX + x * spacing, region.top_right.y));\n        }\n        for (int y = 1; y < pointMap.getRows(); y++) {\n            gridData.push_back(\n                SimpleLine(region.bottom_left.x, offsetY + y * spacing, region.top_right.x, offsetY + y * spacing));\n        }\n        m_grid.loadLineData(gridData, m_gridColour);\n    }\n    if (m_showLinks) {\n        const std::vector<SimpleLine> &mergedPixelLines = depthmapX::getMergedPixelsAsLines(pointMap);\n        std::vector<Point2f> mergedPixelLocations;\n        for (auto &mergeLine : mergedPixelLines) {\n            mergedPixelLocations.push_back(mergeLine.start());\n            mergedPixelLocations.push_back(mergeLine.end());\n        }\n\n        const std::vector<Point2f> &linkFillTriangles =\n            GeometryGenerators::generateMultipleDiskTriangles(32, pointMap.getSpacing() * 0.25, mergedPixelLocations);\n        m_linkFills.loadTriangleData(linkFillTriangles, qRgb(0, 0, 0));\n\n        std::vector<SimpleLine> linkFillPerimeters =\n            GeometryGenerators::generateMultipleCircleLines(32, pointMap.getSpacing() * 0.25, mergedPixelLocations);\n        linkFillPerimeters.insert(linkFillPerimeters.end(), mergedPixelLines.begin(), mergedPixelLines.end());\n        m_linkLines.loadLineData(linkFillPerimeters, qRgb(0, 255, 0));\n    }\n}\nvoid GLPointMap::loadGLObjectsRequiringGLContext(const PointMap &currentPointMap) {\n    QImage data(currentPointMap.getCols(), currentPointMap.getRows(), QImage::Format_RGBA8888);\n    data.fill(Qt::transparent);\n\n    for (int y = 0; y < currentPointMap.getRows(); y++) {\n        for (int x = 0; x < currentPointMap.getCols(); x++) {\n            PixelRef pix(x, y);\n            PafColor colour = currentPointMap.getPointColor(pix);\n            if (colour.alphab() != 0) { // alpha == 0 is transparent\n                data.setPixelColor(x, y, qRgb(colour.redb(), colour.greenb(), colour.blueb()));\n            }\n        }\n    }\n    m_pointMap.loadPixelData(data);\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glpointmap.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/views/glview/gllinesuniform.h\"\n#include \"depthmapX/views/glview/glrastertexture.h\"\n#include \"depthmapX/views/glview/gltrianglesuniform.h\"\n#include \"salalib/mgraph.h\"\n\nclass GLPointMap {\n  public:\n    void initializeGL(bool m_core) {\n        m_grid.initializeGL(m_core);\n        m_pointMap.initializeGL(m_core);\n        m_linkLines.initializeGL(m_core);\n        m_linkFills.initializeGL(m_core);\n    }\n    void updateGL(bool m_core) {\n        m_pointMap.updateGL(m_core);\n        m_grid.updateGL(m_core);\n        m_linkLines.updateGL(m_core);\n        m_linkFills.updateGL(m_core);\n    }\n    void cleanup() {\n        m_grid.cleanup();\n        m_pointMap.cleanup();\n        m_linkLines.cleanup();\n        m_linkFills.cleanup();\n    }\n    void paintGLOverlay(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n        if (m_showLinks) {\n            QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n            glFuncs->glLineWidth(3);\n            m_linkLines.paintGL(m_mProj, m_mView, m_mModel);\n            m_linkFills.paintGL(m_mProj, m_mView, m_mModel);\n            glFuncs->glLineWidth(1);\n        }\n    }\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n        m_pointMap.paintGL(m_mProj, m_mView, m_mModel);\n        if (m_showGrid)\n            m_grid.paintGL(m_mProj, m_mView, m_mModel);\n    }\n    void setGridColour(QRgb gridColour) { m_gridColour = gridColour; }\n    void showLinks(bool showLinks) { m_showLinks = showLinks; }\n    void showGrid(bool showGrid) { m_showGrid = showGrid; }\n    void loadGLObjects(PointMap &pointMap);\n    void loadGLObjectsRequiringGLContext(const PointMap &currentPointMap);\n\n  private:\n    GLLinesUniform m_grid;\n    GLRasterTexture m_pointMap;\n    GLLinesUniform m_linkLines;\n    GLTrianglesUniform m_linkFills;\n\n    QRgb m_gridColour = (qRgb(255, 255, 255) & 0x006f6f6f) | (qRgb(0, 0, 0) & 0x00a0a0a0);\n\n    bool m_showGrid = true;\n    bool m_showLinks = false;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glpolygons.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"glpolygons.h\"\n#include \"glutriangulator.h\"\n\n/**\n * @brief GLPolygons::GLPolygons\n * This class is an OpenGL representation of multiple polygons of different colour\n */\n\nvoid GLPolygons::loadPolygonData(const std::vector<std::pair<std::vector<Point2f>, PafColor>> &colouredPolygons) {\n    m_polygons.clear();\n    for (auto &colouredPolygon : colouredPolygons) {\n        const std::vector<Point2f> &points = colouredPolygon.first;\n        QRgb colour =\n            qRgb(colouredPolygon.second.redb(), colouredPolygon.second.greenb(), colouredPolygon.second.blueb());\n\n        m_polygons.push_back(std::unique_ptr<GLTrianglesUniform>(new GLTrianglesUniform));\n\n        std::vector<Point2f> triangulated = GLUTriangulator::triangulate(points);\n        m_polygons.back()->loadTriangleData(triangulated, colour);\n    }\n}\n\nvoid GLPolygons::initializeGL(bool m_core) {\n    for (auto &polygon : m_polygons) {\n        polygon->initializeGL(m_core);\n    }\n}\n\nvoid GLPolygons::updateGL(bool m_core) {\n    for (auto &polygon : m_polygons) {\n        polygon->updateGL(m_core);\n    }\n}\n\nvoid GLPolygons::cleanup() {\n    for (auto &polygon : m_polygons) {\n        polygon->cleanup();\n    }\n}\n\nvoid GLPolygons::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n    for (auto &polygon : m_polygons) {\n        polygon->paintGL(m_mProj, m_mView, m_mModel);\n    }\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glpolygons.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/pafcolor.h\"\n\n#include \"depthmapX/views/glview/gltrianglesuniform.h\"\n\n#include \"genlib/p2dpoly.h\"\n\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QVector3D>\n#include <QVector>\n#include <memory>\n#include <qopengl.h>\n\n/**\n * @brief The GLPolygons class is a plain wrapper class for multiple GLPolygon\n * that acts as if it's a single globject\n */\nclass GLPolygons {\n  public:\n    void loadPolygonData(const std::vector<std::pair<std::vector<Point2f>, PafColor>> &colouredPolygons);\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel);\n    void initializeGL(bool m_core);\n    void updateGL(bool m_core);\n    void cleanup();\n\n  private:\n    std::vector<std::unique_ptr<GLTrianglesUniform>> m_polygons;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glrastertexture.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"glrastertexture.h\"\n#include <QOpenGLFunctions>\n#include <qmath.h>\n\nstatic const char *vertexShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"in vec4 vertex;\\n\"\n    \"in vec4 texCoord;\\n\"\n    \"out vec4 texc;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"    texc = texCoord;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"uniform sampler2D texture;\\n\"\n    \"in mediump vec4 texc;\\n\"\n    \"void main(void)\\n\"\n    \"{\\n\"\n    \"    gl_FragColor = texture2D(texture, texc.st);\\n\"\n    \"}\\n\";\n\nstatic const char *vertexShaderSource = // auto-format hack\n    \"attribute highp vec4 vertex;\\n\"\n    \"attribute mediump vec4 texCoord;\\n\"\n    \"varying mediump vec4 texc;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main(void)\\n\"\n    \"{\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"   texc = texCoord;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSource = // auto-format hack\n    \"uniform sampler2D texture;\\n\"\n    \"varying mediump vec4 texc;\\n\"\n    \"void main(void)\\n\"\n    \"{\\n\"\n    \"    gl_FragColor = texture2D(texture, texc.st);\\n\"\n    \"}\\n\";\n\nGLRasterTexture::GLRasterTexture() : m_count(0), m_program(0), m_texture(QOpenGLTexture::Target2D) {}\nvoid GLRasterTexture::loadRegionData(float minX, float minY, float maxX, float maxY) {\n    m_built = false;\n\n    m_count = 0;\n    m_data.resize(4 * DATA_DIMENSIONS);\n\n    add(QVector3D(minX, minY, 0), QVector2D(0, 0));\n    add(QVector3D(maxX, minY, 0), QVector2D(1, 0));\n    add(QVector3D(maxX, maxY, 0), QVector2D(1, 1));\n    add(QVector3D(minX, maxY, 0), QVector2D(0, 1));\n}\n\nvoid GLRasterTexture::setupVertexAttribs() {\n    m_vbo.bind();\n    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();\n    f->glEnableVertexAttribArray(0);\n    f->glEnableVertexAttribArray(1);\n    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat), 0);\n    f->glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat),\n                             reinterpret_cast<void *>(3 * sizeof(GLfloat)));\n    m_vbo.release();\n}\n\nvoid GLRasterTexture::initializeGL(bool coreProfile) {\n    if (m_data.size() == 0)\n        return;\n    m_program = new QOpenGLShaderProgram;\n    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,\n                                       coreProfile ? vertexShaderSourceCore : vertexShaderSource);\n    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,\n                                       coreProfile ? fragmentShaderSourceCore : fragmentShaderSource);\n    m_program->bindAttributeLocation(\"vertex\", 0);\n    m_program->bindAttributeLocation(\"texCoord\", 1);\n    m_program->link();\n\n    m_program->bind();\n    m_projMatrixLoc = m_program->uniformLocation(\"projMatrix\");\n    m_mvMatrixLoc = m_program->uniformLocation(\"mvMatrix\");\n    m_textureSamplerLoc = m_program->uniformLocation(\"texture\");\n\n    m_vao.create();\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n\n    // Setup our vertex buffer object.\n    m_vbo.create();\n    m_vbo.bind();\n    m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n\n    // Store the vertex attribute bindings for the program.\n    setupVertexAttribs();\n\n    m_program->setUniformValue(m_textureSamplerLoc, 0);\n\n    m_program->release();\n    m_built = true;\n}\n\nvoid GLRasterTexture::updateGL(bool coreProfile) {\n    if (m_program == 0) {\n        // has not been initialised yet, do that instead\n        initializeGL(coreProfile);\n    } else {\n        m_vbo.bind();\n        m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n        m_vbo.release();\n        m_built = true;\n    }\n}\n\nvoid GLRasterTexture::loadPixelData(QImage &data) {\n    if (!m_built)\n        return;\n    m_program->bind();\n    if (m_texture.isCreated()) {\n        m_texture.destroy();\n    }\n    m_texture.setData(data);\n    m_program->release();\n}\n\nvoid GLRasterTexture::cleanup() {\n    if (!m_built)\n        return;\n    m_vbo.destroy();\n    m_texture.destroy();\n    delete m_program;\n    m_program = 0;\n}\n\nvoid GLRasterTexture::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n\n    m_texture.bind();\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n    glFuncs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\n    glFuncs->glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount());\n\n    m_program->release();\n}\n\nvoid GLRasterTexture::add(const QVector3D &v, const QVector2D &tc) {\n    GLfloat *p = m_data.data() + m_count;\n    *p++ = v.x();\n    *p++ = v.y();\n    *p++ = v.z();\n    *p++ = tc.x();\n    *p++ = tc.y();\n    m_count += DATA_DIMENSIONS;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glrastertexture.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <QOpenGLBuffer>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLTexture>\n#include <QOpenGLVertexArrayObject>\n#include <QVector3D>\n#include <QVector>\n#include <qopengl.h>\n\nclass GLRasterTexture {\n  public:\n    GLRasterTexture();\n    void loadRegionData(float minX, float minY, float maxX, float maxY);\n    void loadPixelData(QImage &data);\n    void paintGL(const QMatrix4x4 &m_proj, const QMatrix4x4 &m_camera, const QMatrix4x4 &m_mModel);\n    void initializeGL(bool coreProfile);\n    void updateGL(bool coreProfile);\n    void cleanup();\n    int vertexCount() const { return m_count / DATA_DIMENSIONS; }\n    GLRasterTexture(const GLRasterTexture &) = delete;\n    GLRasterTexture &operator=(const GLRasterTexture &) = delete;\n\n  private:\n    int DATA_DIMENSIONS = 5;\n\n    void setupVertexAttribs();\n    const GLfloat *constData() const { return m_data.constData(); }\n    void add(const QVector3D &v, const QVector2D &tc);\n\n    QVector<GLfloat> m_data;\n    int m_count;\n    bool m_built = false;\n\n    QOpenGLVertexArrayObject m_vao;\n    QOpenGLBuffer m_vbo;\n    QOpenGLShaderProgram *m_program;\n    int m_projMatrixLoc;\n    int m_mvMatrixLoc;\n    int m_textureSamplerLoc;\n\n    QOpenGLTexture m_texture;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glregularpolygons.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"glregularpolygons.h\"\n#include <math.h>\n\nvoid GLRegularPolygons::loadPolygonData(const std::vector<std::pair<Point2f, PafColor>> &colouredPoints,\n                                        const int sides, const float radius) {\n    init(colouredPoints.size() * sides * 3);\n    std::vector<Point2f> points(sides * 3);\n    float angle = 2 * M_PI / sides;\n    for (int i = 0; i < sides; i++) {\n        points[i * 3] = Point2f(cos((i)*angle) * radius, sin((i)*angle) * radius);\n        points[i * 3 + 1] = Point2f(cos((i + 1) * angle) * radius, sin((i + 1) * angle) * radius);\n        points[i * 3 + 2] = Point2f(0, 0);\n    }\n\n    Point2f prevCentre(0, 0);\n    for (const auto &colouredPoint : colouredPoints) {\n        const Point2f &centre = colouredPoint.first;\n        float r = colouredPoint.second.redf();\n        float g = colouredPoint.second.greenf();\n        float b = colouredPoint.second.bluef();\n\n        for (Point2f &point : points) {\n            point.x -= prevCentre.x;\n            point.y -= prevCentre.y;\n            point.x += centre.x;\n            point.y += centre.y;\n            add(QVector3D(point.x, point.y, 0.0f), QVector3D(r, g, b));\n        }\n        prevCentre = centre;\n    }\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glregularpolygons.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/pafcolor.h\"\n\n#include \"depthmapX/views/glview/gltriangles.h\"\n\n#include \"genlib/p2dpoly.h\"\n\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QVector3D>\n#include <QVector>\n#include <memory>\n#include <qopengl.h>\n\n/**\n * @brief Meant to represent regular polygons i.e. those that are equiangular (all angles are equal in measure) and\n * equilateral (all sides have the same length). Ideal for representing sets of disks/stars/squares etc.\n */\nclass GLRegularPolygons : public GLTriangles {\n  public:\n    void loadPolygonData(const std::vector<std::pair<Point2f, PafColor>> &colouredPoints, const int sides,\n                         const float radius);\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glshapegraph.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"glshapegraph.h\"\n#include \"salalib/geometrygenerators.h\"\n\nvoid GLShapeGraph::loadGLObjects(ShapeGraph &shapeGraph) {\n    m_shapeMap.loadGLObjects(shapeGraph);\n    const std::vector<SimpleLine> &linkLines = shapeGraph.getAllLinkLines();\n    std::vector<Point2f> linkPointLocations;\n    for (auto &linkLine : linkLines) {\n        linkPointLocations.push_back(linkLine.start());\n        linkPointLocations.push_back(linkLine.end());\n    }\n\n    const std::vector<Point2f> &linkFillTriangles =\n        GeometryGenerators::generateMultipleDiskTriangles(32, shapeGraph.getSpacing() * 0.1, linkPointLocations);\n    m_linkFills.loadTriangleData(linkFillTriangles, qRgb(0, 0, 0));\n\n    std::vector<SimpleLine> linkFillPerimeters =\n        GeometryGenerators::generateMultipleCircleLines(32, shapeGraph.getSpacing() * 0.1, linkPointLocations);\n    linkFillPerimeters.insert(linkFillPerimeters.end(), linkLines.begin(), linkLines.end());\n    m_linkLines.loadLineData(linkFillPerimeters, qRgb(0, 255, 0));\n\n    const std::vector<Point2f> &unlinkPoints = shapeGraph.getAllUnlinkPoints();\n\n    const std::vector<Point2f> &unlinkFillTriangles =\n        GeometryGenerators::generateMultipleDiskTriangles(32, shapeGraph.getSpacing() * 0.1, unlinkPoints);\n    m_unlinkFills.loadTriangleData(unlinkFillTriangles, qRgb(255, 255, 255));\n\n    const std::vector<SimpleLine> &unlinkFillPerimeters =\n        GeometryGenerators::generateMultipleCircleLines(32, shapeGraph.getSpacing() * 0.1, unlinkPoints);\n    m_unlinkLines.loadLineData(unlinkFillPerimeters, qRgb(255, 0, 0));\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glshapegraph.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/views/glview/gllinesuniform.h\"\n#include \"depthmapX/views/glview/glshapemap.h\"\n#include \"salalib/mgraph.h\"\n\nclass GLShapeGraph {\n  public:\n    void initializeGL(bool m_core) {\n        m_shapeMap.initializeGL(m_core);\n        m_linkLines.initializeGL(m_core);\n        m_linkFills.initializeGL(m_core);\n        m_unlinkFills.initializeGL(m_core);\n        m_unlinkLines.initializeGL(m_core);\n    }\n    void updateGL(bool m_core) {\n        m_shapeMap.updateGL(m_core);\n        m_linkLines.updateGL(m_core);\n        m_linkFills.updateGL(m_core);\n        m_unlinkFills.updateGL(m_core);\n        m_unlinkLines.updateGL(m_core);\n    }\n    void cleanup() {\n        m_shapeMap.cleanup();\n        m_linkLines.cleanup();\n        m_linkFills.cleanup();\n        m_unlinkFills.cleanup();\n        m_unlinkLines.cleanup();\n    }\n    void paintGLOverlay(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n        if (m_showLinks) {\n            QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n            glFuncs->glLineWidth(3);\n            m_linkLines.paintGL(m_mProj, m_mView, m_mModel);\n            m_linkFills.paintGL(m_mProj, m_mView, m_mModel);\n            m_unlinkLines.paintGL(m_mProj, m_mView, m_mModel);\n            m_unlinkFills.paintGL(m_mProj, m_mView, m_mModel);\n            glFuncs->glLineWidth(1);\n        }\n    }\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n        m_shapeMap.paintGL(m_mProj, m_mView, m_mModel);\n    }\n    void showLinks(bool showLinks) { m_showLinks = showLinks; }\n    void loadGLObjects(ShapeGraph &shapeGraph);\n\n  private:\n    GLShapeMap m_shapeMap;\n    GLLinesUniform m_linkLines;\n    GLTrianglesUniform m_linkFills;\n    GLLinesUniform m_unlinkLines;\n    GLTrianglesUniform m_unlinkFills;\n\n    bool m_showLinks = false;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glshapemap.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"glshapemap.h\"\n\nvoid GLShapeMap::loadGLObjects(const std::vector<std::pair<SimpleLine, PafColor>> &colouredLines,\n                               const std::vector<std::pair<std::vector<Point2f>, PafColor>> &colouredPolygons,\n                               const std::vector<std::pair<Point2f, PafColor>> &colouredPoints, const int pointSides,\n                               const float pointRadius) {\n    m_lines.loadLineData(colouredLines);\n    m_polygons.loadPolygonData(colouredPolygons);\n    m_points.loadPolygonData(colouredPoints, pointSides, pointRadius);\n}\n\nvoid GLShapeMap::loadGLObjects(ShapeMap &shapeMap) {\n    loadGLObjects(shapeMap.getAllLinesWithColour(), shapeMap.getAllPolygonsWithColour(),\n                  shapeMap.getAllPointsWithColour(), 8, shapeMap.getSpacing() * 0.1);\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glshapemap.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/views/glview/gllines.h\"\n#include \"depthmapX/views/glview/glpolygons.h\"\n#include \"depthmapX/views/glview/glregularpolygons.h\"\n#include \"salalib/mgraph.h\"\n\nclass GLShapeMap {\n  public:\n    void initializeGL(bool m_core) {\n        m_lines.initializeGL(m_core);\n        m_polygons.initializeGL(m_core);\n        m_points.initializeGL(m_core);\n    }\n    void updateGL(bool m_core) {\n        m_lines.updateGL(m_core);\n        m_polygons.updateGL(m_core);\n        m_points.updateGL(m_core);\n    }\n    void cleanup() {\n        m_lines.cleanup();\n        m_polygons.cleanup();\n        m_points.cleanup();\n    }\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n        m_lines.paintGL(m_mProj, m_mView, m_mModel);\n        m_polygons.paintGL(m_mProj, m_mView, m_mModel);\n        m_points.paintGL(m_mProj, m_mView, m_mModel);\n    }\n    void loadGLObjects(const std::vector<std::pair<SimpleLine, PafColor>> &colouredLines,\n                       const std::vector<std::pair<std::vector<Point2f>, PafColor>> &colouredPolygons,\n                       const std::vector<std::pair<Point2f, PafColor>> &colouredPoints, const int pointSides,\n                       const float pointRadius);\n    void loadGLObjects(ShapeMap &shapeMap);\n\n  private:\n    GLLines m_lines;\n    GLPolygons m_polygons;\n    GLRegularPolygons m_points;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/gltriangles.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"gltriangles.h\"\n#include <qmath.h>\n\n// clang-format off\nstatic const char *vertexShaderSourceCore = // auto-format hack\n        \"#version 150\\n\"\n        \"in vec4 vertex;\\n\"\n        \"uniform mat4 projMatrix;\\n\"\n        \"uniform mat4 mvMatrix;\\n\"\n        \"void main() {\\n\"\n        \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n        \"}\\n\";\n\nstatic const char *fragmentShaderSourceCore = // auto-format hack\n        \"#version 150\\n\"\n        \"in vec4 colour;\\n\"\n        \"out highp vec4 fragColor;\\n\"\n        \"void main() {\\n\"\n        \"   fragColor = colour;\\n\"\n        \"}\\n\";\n\nstatic const char *vertexShaderSource = // auto-format hack\n        \"attribute vec4 vertex;\\n\"\n        \"attribute vec4 colour;\\n\"\n        \"varying vec4 fragColour;\\n\"\n        \"uniform mat4 projMatrix;\\n\"\n        \"uniform mat4 mvMatrix;\\n\"\n        \"void main() {\\n\"\n        \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n        \"   fragColour = colour;\\n\"\n        \"}\\n\";\n\nstatic const char *fragmentShaderSource = // auto-format hack\n        \"varying highp vec4 fragColour;\\n\"\n        \"void main() {\\n\"\n        \"   gl_FragColor = fragColour;\\n\"\n        \"}\\n\";\n// clang-format on\n\nvoid GLTriangles::loadTriangleData(const std::vector<std::pair<std::vector<Point2f>, QRgb>> &triangleData) {\n\n    init(triangleData.size());\n\n    for (auto &triangle : triangleData) {\n        float r = qRed(triangle.second) / 255.0;\n        float g = qGreen(triangle.second) / 255.0;\n        float b = qBlue(triangle.second) / 255.0;\n        for (auto &point : triangle.first) {\n            add(QVector3D(point.x, point.y, 0.0f), QVector3D(r, g, b));\n        }\n    }\n}\n\nvoid GLTriangles::setupVertexAttribs() {\n    m_vbo.bind();\n    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();\n    f->glEnableVertexAttribArray(0);\n    f->glEnableVertexAttribArray(1);\n    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat), 0);\n    f->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat),\n                             (void *)(3 * sizeof(GLfloat)));\n    m_vbo.release();\n}\n\nvoid GLTriangles::initializeGL(bool m_core) {\n    if (m_data.size() == 0)\n        return;\n    m_program = new QOpenGLShaderProgram;\n    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, m_core ? vertexShaderSourceCore : vertexShaderSource);\n    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,\n                                       m_core ? fragmentShaderSourceCore : fragmentShaderSource);\n    m_program->bindAttributeLocation(\"vertex\", 0);\n    m_program->bindAttributeLocation(\"colour\", 1);\n    m_program->link();\n\n    m_program->bind();\n    m_projMatrixLoc = m_program->uniformLocation(\"projMatrix\");\n    m_mvMatrixLoc = m_program->uniformLocation(\"mvMatrix\");\n\n    m_vao.create();\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n\n    m_vbo.create();\n    m_vbo.bind();\n    m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n\n    setupVertexAttribs();\n    m_program->release();\n    m_built = true;\n}\n\nvoid GLTriangles::updateGL(bool m_core) {\n    if (m_program == 0) {\n        // has not been initialised yet, do that instead\n        initializeGL(m_core);\n    } else {\n        m_vbo.bind();\n        m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n        m_vbo.release();\n        m_built = true;\n    }\n}\n\nvoid GLTriangles::cleanup() {\n    if (!m_built)\n        return;\n    m_vbo.destroy();\n    delete m_program;\n    m_program = 0;\n}\n\nvoid GLTriangles::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glDrawArrays(GL_TRIANGLES, 0, vertexCount());\n\n    m_program->release();\n}\n\nvoid GLTriangles::add(const QVector3D &v, const QVector3D &c) {\n    GLfloat *p = m_data.data() + m_count;\n    *p++ = v.x();\n    *p++ = v.y();\n    *p++ = v.z();\n    *p++ = c.x();\n    *p++ = c.y();\n    *p++ = c.z();\n    m_count += DATA_DIMENSIONS;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/gltriangles.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QRgb>\n#include <QVector3D>\n#include <QVector>\n#include <qopengl.h>\n\n/**\n * @brief General triangles representation. Each triangle may have its own colour\n */\n\nclass GLTriangles {\n  public:\n    GLTriangles() : m_count(0), m_program(0) {}\n    void loadTriangleData(const std::vector<std::pair<std::vector<Point2f>, QRgb>> &triangleData);\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel);\n    void initializeGL(bool m_core);\n    void updateGL(bool m_core);\n    void cleanup();\n    void updateColour(const QRgb &polyColour);\n    int vertexCount() const { return m_count / DATA_DIMENSIONS; }\n    GLTriangles(const GLTriangles &) = delete;\n    GLTriangles &operator=(const GLTriangles &) = delete;\n\n  protected:\n    void init(int numTriangles) {\n        m_built = false;\n        m_count = 0;\n        m_data.resize(numTriangles * 3 * DATA_DIMENSIONS);\n    }\n    void add(const QVector3D &v, const QVector3D &c);\n\n  private:\n    const int DATA_DIMENSIONS = 6;\n    void setupVertexAttribs();\n    const GLfloat *constData() const { return m_data.constData(); }\n\n    QVector<GLfloat> m_data;\n    int m_count;\n    bool m_built = false;\n    QVector4D m_colour = QVector4D(1.0f, 1.0f, 1.0f, 1.0f);\n\n    QOpenGLVertexArrayObject m_vao;\n    QOpenGLBuffer m_vbo;\n    QOpenGLShaderProgram *m_program;\n    int m_projMatrixLoc;\n    int m_mvMatrixLoc;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/gltrianglesuniform.cpp",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"gltrianglesuniform.h\"\n#include <qmath.h>\n\nstatic const char *vertexShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"in vec4 vertex;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSourceCore = // auto-format hack\n    \"#version 150\\n\"\n    \"uniform vec4 colourVector;\\n\"\n    \"out highp vec4 fragColor;\\n\"\n    \"void main() {\\n\"\n    \"   fragColor = colourVector;\\n\"\n    \"}\\n\";\n\nstatic const char *vertexShaderSource = // auto-format hack\n    \"attribute vec4 vertex;\\n\"\n    \"uniform mat4 projMatrix;\\n\"\n    \"uniform mat4 mvMatrix;\\n\"\n    \"void main() {\\n\"\n    \"   gl_Position = projMatrix * mvMatrix * vertex;\\n\"\n    \"}\\n\";\n\nstatic const char *fragmentShaderSource = // auto-format hack\n    \"uniform highp vec4 colourVector;\\n\"\n    \"void main() {\\n\"\n    \"   gl_FragColor = colourVector;\\n\"\n    \"}\\n\";\n\n/**\n * @brief GLTrianglesUniform::GLTrianglesUniform\n * This class is an OpenGL representation of a set of triangles of uniform colour\n */\n\nGLTrianglesUniform::GLTrianglesUniform() : m_count(0), m_program(0) {}\n\nvoid GLTrianglesUniform::loadTriangleData(const std::vector<Point2f> &points, const QRgb &polyColour) {\n    m_built = false;\n\n    m_count = 0;\n    m_data.resize(points.size() * DATA_DIMENSIONS);\n\n    for (auto &point : points) {\n        add(QVector3D(point.x, point.y, 0.0f));\n    }\n    m_colour.setX(qRed(polyColour) / 255.0);\n    m_colour.setY(qGreen(polyColour) / 255.0);\n    m_colour.setZ(qBlue(polyColour) / 255.0);\n}\n\nvoid GLTrianglesUniform::setupVertexAttribs() {\n    m_vbo.bind();\n    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();\n    f->glEnableVertexAttribArray(0);\n    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, DATA_DIMENSIONS * sizeof(GLfloat), 0);\n    m_vbo.release();\n}\n\nvoid GLTrianglesUniform::initializeGL(bool m_core) {\n    if (m_data.size() == 0)\n        return;\n    m_program = new QOpenGLShaderProgram;\n    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, m_core ? vertexShaderSourceCore : vertexShaderSource);\n    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,\n                                       m_core ? fragmentShaderSourceCore : fragmentShaderSource);\n    m_program->bindAttributeLocation(\"vertex\", 0);\n    m_program->link();\n\n    m_program->bind();\n    m_projMatrixLoc = m_program->uniformLocation(\"projMatrix\");\n    m_mvMatrixLoc = m_program->uniformLocation(\"mvMatrix\");\n    m_colourVectorLoc = m_program->uniformLocation(\"colourVector\");\n\n    m_vao.create();\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n\n    m_vbo.create();\n    m_vbo.bind();\n    m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n\n    setupVertexAttribs();\n    m_program->setUniformValue(m_colourVectorLoc, m_colour);\n    m_program->release();\n    m_built = true;\n}\n\nvoid GLTrianglesUniform::updateGL(bool m_core) {\n    if (m_program == 0) {\n        // has not been initialised yet, do that instead\n        initializeGL(m_core);\n    } else {\n        m_vbo.bind();\n        m_vbo.allocate(constData(), m_count * sizeof(GLfloat));\n        m_vbo.release();\n        m_built = true;\n    }\n}\n\nvoid GLTrianglesUniform::updateColour(const QRgb &polyColour) {\n    m_colour.setX(qRed(polyColour) / 255.0);\n    m_colour.setY(qGreen(polyColour) / 255.0);\n    m_colour.setZ(qBlue(polyColour) / 255.0);\n    m_program->bind();\n    m_program->setUniformValue(m_colourVectorLoc, m_colour);\n    m_program->release();\n}\n\nvoid GLTrianglesUniform::cleanup() {\n    if (!m_built)\n        return;\n    m_vbo.destroy();\n    delete m_program;\n    m_program = 0;\n}\n\nvoid GLTrianglesUniform::paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel) {\n    if (!m_built)\n        return;\n    QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);\n    m_program->bind();\n    m_program->setUniformValue(m_projMatrixLoc, m_mProj);\n    m_program->setUniformValue(m_mvMatrixLoc, m_mView * m_mModel);\n\n    QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();\n    glFuncs->glDrawArrays(GL_TRIANGLES, 0, vertexCount());\n\n    m_program->release();\n}\n\nvoid GLTrianglesUniform::add(const QVector3D &v) {\n    GLfloat *p = m_data.data() + m_count;\n    *p++ = v.x();\n    *p++ = v.y();\n    *p++ = v.z();\n    m_count += DATA_DIMENSIONS;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/gltrianglesuniform.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <QOpenGLBuffer>\n#include <QOpenGLFunctions>\n#include <QOpenGLShaderProgram>\n#include <QOpenGLVertexArrayObject>\n#include <QRgb>\n#include <QVector3D>\n#include <QVector>\n#include <qopengl.h>\n\n/**\n * @brief General triangles representation. All same colour\n */\n\nclass GLTrianglesUniform {\n  public:\n    GLTrianglesUniform();\n    void loadTriangleData(const std::vector<Point2f> &points, const QRgb &polyColour);\n    void paintGL(const QMatrix4x4 &m_mProj, const QMatrix4x4 &m_mView, const QMatrix4x4 &m_mModel);\n    void initializeGL(bool m_core);\n    void updateGL(bool m_core);\n    void cleanup();\n    void updateColour(const QRgb &polyColour);\n    int vertexCount() const { return m_count / DATA_DIMENSIONS; }\n    GLTrianglesUniform(const GLTrianglesUniform &) = delete;\n    GLTrianglesUniform &operator=(const GLTrianglesUniform &) = delete;\n\n  private:\n    const int DATA_DIMENSIONS = 3;\n    void setupVertexAttribs();\n    const GLfloat *constData() const { return m_data.constData(); }\n    void add(const QVector3D &v);\n\n    QVector<GLfloat> m_data;\n    int m_count;\n    bool m_built = false;\n    QVector4D m_colour = QVector4D(1.0f, 1.0f, 1.0f, 1.0f);\n\n    QOpenGLVertexArrayObject m_vao;\n    QOpenGLBuffer m_vbo;\n    QOpenGLShaderProgram *m_program;\n    int m_projMatrixLoc;\n    int m_mvMatrixLoc;\n    int m_colourVectorLoc;\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glutriangulator.cpp",
    "content": "// adapted from: https://stackoverflow.com/questions/12600325/force-glutesselator-to-generate-only-gl-triangles\n\n#include \"glutriangulator.h\"\n\nstruct TessContext {\n    ~TessContext() {\n        for (size_t i = 0; i < combined.size(); ++i) {\n            delete[] combined[i];\n        }\n    }\n\n    typedef std::pair<double, double> Point;\n    std::vector<Point> pts;\n    std::vector<GLdouble *> combined;\n};\n\n#ifdef _WIN32\nvoid __stdcall tess_begin(GLenum) {}\nvoid __stdcall tess_edgeFlag(GLboolean) {}\nvoid __stdcall tess_end() {}\n#else\nvoid tess_begin(GLenum) {}\nvoid tess_edgeFlag(GLboolean) {}\nvoid tess_end() {}\n#endif\n\n#ifdef _WIN32\nvoid __stdcall tess_vertex\n#else\nvoid tess_vertex\n#endif\n    (void *data, TessContext *ctx) {\n    GLdouble *coord = (GLdouble *)data;\n    ctx->pts.push_back(TessContext::Point(coord[0], coord[1]));\n}\n\n#ifdef _WIN32\nvoid __stdcall tess_combine\n#else\nvoid tess_combine\n#endif\n    (GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData, TessContext *ctx) {\n    GLdouble *newVert = new GLdouble[3];\n    ctx->combined.push_back(newVert);\n\n    newVert[0] = coords[0];\n    newVert[1] = coords[1];\n    newVert[2] = coords[2];\n    *outData = newVert;\n}\n\nstd::vector<Point2f> GLUTriangulator::triangulate(const std::vector<Point2f> &polygon) {\n    std::vector<GLdouble> coords;\n    for (size_t i = 0; i < polygon.size(); ++i) {\n        coords.push_back(polygon[i].x);\n        coords.push_back(polygon[i].y);\n        coords.push_back(0);\n    }\n\n    GLUtesselator *tess = gluNewTess();\n#ifdef _WIN32\n    gluTessCallback(tess, GLU_TESS_BEGIN, (void(__stdcall *)())tess_begin);\n    gluTessCallback(tess, GLU_TESS_EDGE_FLAG, (void(__stdcall *)())tess_edgeFlag);\n    gluTessCallback(tess, GLU_TESS_VERTEX_DATA, (void(__stdcall *)())tess_vertex);\n    gluTessCallback(tess, GLU_TESS_END, (void(__stdcall *)())tess_end);\n    gluTessCallback(tess, GLU_TESS_COMBINE_DATA, (void(__stdcall *)())tess_combine);\n#else\n    gluTessCallback(tess, GLU_TESS_BEGIN, (void (*)())tess_begin);\n    gluTessCallback(tess, GLU_TESS_EDGE_FLAG, (void (*)())tess_edgeFlag);\n    gluTessCallback(tess, GLU_TESS_VERTEX_DATA, (void (*)())tess_vertex);\n    gluTessCallback(tess, GLU_TESS_END, (void (*)())tess_end);\n    gluTessCallback(tess, GLU_TESS_COMBINE_DATA, (void (*)())tess_combine);\n#endif\n    gluTessNormal(tess, 0.0, 0.0, 1.0);\n\n    TessContext ctx;\n\n    gluTessBeginPolygon(tess, &ctx);\n    gluTessBeginContour(tess);\n\n    for (size_t i = 0; i < polygon.size(); ++i) {\n        gluTessVertex(tess, &coords[i * 3], &coords[i * 3]);\n    }\n\n    gluTessEndContour(tess);\n    gluTessEndPolygon(tess);\n\n    gluDeleteTess(tess);\n\n    std::vector<Point2f> ret(ctx.pts.size());\n    for (size_t i = 0; i < ret.size(); ++i) {\n        ret[i].x = ctx.pts[i].first;\n        ret[i].y = ctx.pts[i].second;\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "depthmapX/views/glview/glutriangulator.h",
    "content": "#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n\n// This is required to silence the warnings for OpenGL deprecation in macOS\n#ifndef GL_SILENCE_DEPRECATION\n#define GL_SILENCE_DEPRECATION true\n#endif\n\n#ifdef __linux__\n#include \"GL/glu.h\"\n#elif _WIN32\n#include \"windows.h\"\n#include \"GL/glu.h\"\n#else\n#include \"glu.h\"\n#endif\n\nclass GLUTriangulator {\n  public:\n    static std::vector<Point2f> triangulate(const std::vector<Point2f> &polygon);\n};\n"
  },
  {
    "path": "depthmapX/views/glview/glview.cpp",
    "content": "// depthmapX - spatial network analysis platform\r\n// Copyright (C) 2017, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"glview.h\"\r\n#include \"depthmapX/views/depthmapview/depthmapview.h\"\r\n#include \"mainwindow.h\"\r\n#include \"salalib/geometrygenerators.h\"\r\n#include \"salalib/linkutils.h\"\r\n#include <QCoreApplication>\r\n#include <QMouseEvent>\r\n\r\nstatic QRgb colorMerge(QRgb color, QRgb mergecolor) { return (color & 0x006f6f6f) | (mergecolor & 0x00a0a0a0); }\r\n\r\nGLView::GLView(QGraphDoc &pDoc, Settings &settings, QWidget *parent)\r\n    : MapView(pDoc, settings, parent), m_eyePosX(0), m_eyePosY(0) {\r\n    m_core = QCoreApplication::arguments().contains(QStringLiteral(\"--coreprofile\"));\r\n\r\n    m_foreground = settings.readSetting(SettingTag::foregroundColour, qRgb(128, 255, 128)).toInt();\r\n    m_background = settings.readSetting(SettingTag::backgroundColour, qRgb(0, 0, 0)).toInt();\r\n    m_initialSize = m_settings.readSetting(SettingTag::depthmapViewSize, QSize(2000, 2000)).toSize();\r\n    m_antialiasingSamples = settings.readSetting(SettingTag::antialiasingSamples, 0).toInt();\r\n    m_highlightOnHover = settings.readSetting(SettingTag::highlightOnHover, true).toBool();\r\n\r\n    if (m_antialiasingSamples) {\r\n        QSurfaceFormat format;\r\n        format.setSamples(m_antialiasingSamples); // Set the number of samples used for multisampling\r\n        setFormat(format);\r\n    }\r\n\r\n    loadDrawingGLObjects();\r\n\r\n    loadAxes();\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n        m_visibleShapeGraph.loadGLObjects(m_pDoc.m_meta_graph->getDisplayedShapeGraph());\r\n    }\r\n    m_visiblePointMap.setGridColour(colorMerge(m_foreground, m_background));\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n        m_visiblePointMap.loadGLObjects(m_pDoc.m_meta_graph->getDisplayedPointMap());\r\n    }\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n        m_visibleDataMap.loadGLObjects(m_pDoc.m_meta_graph->getDisplayedDataMap());\r\n    }\r\n\r\n    m_dragLine.setStrokeColour(m_foreground);\r\n    m_selectionRect.setStrokeColour(m_background);\r\n\r\n    matchViewToCurrentMetaGraph();\r\n\r\n    installEventFilter(this);\r\n    setMouseTracking(true);\r\n    m_pDoc.m_view[QGraphDoc::VIEW_MAP_GL] = this;\r\n}\r\n\r\nGLView::~GLView() {\r\n    makeCurrent();\r\n    m_selectionRect.cleanup();\r\n    m_dragLine.cleanup();\r\n    m_axes.cleanup();\r\n    m_visibleDrawingLines.cleanup();\r\n    m_visiblePointMap.cleanup();\r\n    m_visibleShapeGraph.cleanup();\r\n    m_visibleDataMap.cleanup();\r\n    m_hoveredShapes.cleanup();\r\n    doneCurrent();\r\n    m_settings.writeSetting(SettingTag::depthmapViewSize, size());\r\n}\r\n\r\nQSize GLView::minimumSizeHint() const { return QSize(50, 50); }\r\n\r\nQSize GLView::sizeHint() const { return m_initialSize; }\r\n\r\nvoid GLView::initializeGL() {\r\n    initializeOpenGLFunctions();\r\n    glClearColor(qRed(m_background) / 255.0f, qGreen(m_background) / 255.0f, qBlue(m_background) / 255.0f, 1);\r\n\r\n    m_selectionRect.initializeGL(m_core);\r\n    m_dragLine.initializeGL(m_core);\r\n    m_axes.initializeGL(m_core);\r\n    m_visibleDrawingLines.initializeGL(m_core);\r\n    m_visiblePointMap.initializeGL(m_core);\r\n    m_visibleShapeGraph.initializeGL(m_core);\r\n    m_visibleDataMap.initializeGL(m_core);\r\n    m_hoveredShapes.initializeGL(m_core);\r\n    m_hoveredPixels.initializeGL(m_core);\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n        m_visiblePointMap.loadGLObjectsRequiringGLContext(m_pDoc.m_meta_graph->getDisplayedPointMap());\r\n    }\r\n\r\n    m_mModel.setToIdentity();\r\n\r\n    m_mView.setToIdentity();\r\n    m_mView.translate(0, 0, -1);\r\n}\r\n\r\nvoid GLView::paintGL() {\r\n    glEnable(GL_MULTISAMPLE);\r\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r\n    glEnable(GL_CULL_FACE);\r\n    glEnable(GL_BLEND);\r\n    glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);\r\n\r\n    if (m_datasetChanged) {\r\n\r\n        loadDrawingGLObjects();\r\n        m_visibleDrawingLines.updateGL(m_core);\r\n\r\n        if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL &&\r\n            m_pDoc.m_meta_graph->getDisplayedMapRef() != -1) {\r\n            m_visibleShapeGraph.loadGLObjects(m_pDoc.m_meta_graph->getDisplayedShapeGraph());\r\n            m_visibleShapeGraph.updateGL(m_core);\r\n        }\r\n\r\n        if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n            m_visibleDataMap.loadGLObjects(m_pDoc.m_meta_graph->getDisplayedDataMap());\r\n            m_visibleDataMap.updateGL(m_core);\r\n        }\r\n\r\n        if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n            m_visiblePointMap.loadGLObjects(m_pDoc.m_meta_graph->getDisplayedPointMap());\r\n            m_visiblePointMap.updateGL(m_core);\r\n            m_visiblePointMap.loadGLObjectsRequiringGLContext(m_pDoc.m_meta_graph->getDisplayedPointMap());\r\n        }\r\n\r\n        m_datasetChanged = false;\r\n    }\r\n    if (m_hoverStoreInvalid) {\r\n        m_hoveredShapes.updateGL(m_core);\r\n        m_hoveredPixels.updateGL(m_core);\r\n        m_hoverStoreInvalid = false;\r\n    }\r\n\r\n    m_axes.paintGL(m_mProj, m_mView, m_mModel);\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n        m_visiblePointMap.showGrid(m_pDoc.m_meta_graph->m_showgrid);\r\n        m_visiblePointMap.paintGL(m_mProj, m_mView, m_mModel);\r\n    }\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n        m_visibleShapeGraph.paintGL(m_mProj, m_mView, m_mModel);\r\n    }\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWDATA) {\r\n        m_visibleDataMap.paintGL(m_mProj, m_mView, m_mModel);\r\n        glLineWidth(10);\r\n        m_hoveredShapes.paintGL(m_mProj, m_mView, m_mModel);\r\n        glLineWidth(1);\r\n    }\r\n\r\n    m_visibleDrawingLines.paintGL(m_mProj, m_mView, m_mModel);\r\n\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n        m_visiblePointMap.paintGLOverlay(m_mProj, m_mView, m_mModel);\r\n        glLineWidth(3);\r\n        m_hoveredPixels.paintGL(m_mProj, m_mView, m_mModel);\r\n        glLineWidth(1);\r\n    }\r\n    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n        m_visibleShapeGraph.paintGLOverlay(m_mProj, m_mView, m_mModel);\r\n        glLineWidth(10);\r\n        m_hoveredShapes.paintGL(m_mProj, m_mView, m_mModel);\r\n        glLineWidth(1);\r\n    }\r\n\r\n    float pos[] = {float(std::min(m_mouseDragRect.bottomRight().x(), m_mouseDragRect.topLeft().x())),\r\n                   float(std::min(m_mouseDragRect.bottomRight().y(), m_mouseDragRect.topLeft().y())),\r\n                   float(std::max(m_mouseDragRect.bottomRight().x(), m_mouseDragRect.topLeft().x())),\r\n                   float(std::max(m_mouseDragRect.bottomRight().y(), m_mouseDragRect.topLeft().y()))};\r\n    m_selectionRect.paintGL(m_mProj, m_mView, m_mModel, QMatrix2x2(pos));\r\n\r\n    if ((m_mouseMode & MOUSE_MODE_SECOND_POINT) == MOUSE_MODE_SECOND_POINT) {\r\n        float pos[] = {float(m_tempFirstPoint.x), float(m_tempFirstPoint.y), float(m_tempSecondPoint.x),\r\n                       float(m_tempSecondPoint.y)};\r\n        m_dragLine.paintGL(m_mProj, m_mView, m_mModel, QMatrix2x2(pos));\r\n    }\r\n}\r\n\r\nvoid GLView::loadAxes() {\r\n    std::vector<std::pair<SimpleLine, PafColor>> axesData;\r\n    axesData.push_back(std::pair<SimpleLine, PafColor>(SimpleLine(0, 0, 1, 0), PafColor(1, 0, 0)));\r\n    axesData.push_back(std::pair<SimpleLine, PafColor>(SimpleLine(0, 0, 0, 1), PafColor(0, 1, 0)));\r\n    m_axes.loadLineData(axesData);\r\n}\r\n\r\nvoid GLView::loadDrawingGLObjects() {\r\n    auto lock = m_pDoc.m_meta_graph->getLock();\r\n    m_visibleDrawingLines.loadLineData(m_pDoc.m_meta_graph->getVisibleDrawingLines(), m_foreground);\r\n}\r\n\r\nvoid GLView::resizeGL(int w, int h) {\r\n    m_screenWidth = w;\r\n    m_screenHeight = h;\r\n    m_screenRatio = GLfloat(w) / h;\r\n    recalcView();\r\n}\r\n\r\nvoid GLView::mouseReleaseEvent(QMouseEvent *event) {\r\n    if (m_wasPanning) {\r\n        m_wasPanning = false;\r\n        return;\r\n    }\r\n    QPoint mousePoint = event->pos();\r\n    Point2f worldPoint = getWorldPoint(mousePoint);\r\n    if (!m_pDoc.m_communicator) {\r\n        QtRegion r;\r\n        if (m_mouseDragRect.isNull()) {\r\n            r.bottom_left = worldPoint;\r\n            r.top_right = worldPoint;\r\n        } else {\r\n            r.bottom_left.x = std::min(m_mouseDragRect.bottomRight().x(), m_mouseDragRect.topLeft().x());\r\n            r.bottom_left.y = std::min(m_mouseDragRect.bottomRight().y(), m_mouseDragRect.topLeft().y());\r\n            r.top_right.x = std::max(m_mouseDragRect.bottomRight().x(), m_mouseDragRect.topLeft().x());\r\n            r.top_right.y = std::max(m_mouseDragRect.bottomRight().y(), m_mouseDragRect.topLeft().y());\r\n        }\r\n        bool selected = false;\r\n        switch (m_mouseMode) {\r\n        case MOUSE_MODE_NONE: {\r\n            // nothing, deselect\r\n            m_pDoc.m_meta_graph->clearSel();\r\n            break;\r\n        }\r\n        case MOUSE_MODE_SELECT: {\r\n            // typical selection\r\n            Qt::KeyboardModifiers keyMods = QApplication::keyboardModifiers();\r\n            m_pDoc.m_meta_graph->setCurSel(r, keyMods & Qt::ShiftModifier);\r\n            ((MainWindow *)m_pDoc.m_mainFrame)->updateToolbar();\r\n            highlightHoveredItems(r);\r\n            break;\r\n        }\r\n        case MOUSE_MODE_ZOOM_IN: {\r\n            if (r.width() > 0) {\r\n                OnViewZoomToRegion(r);\r\n                recalcView();\r\n            } else {\r\n                zoomBy(0.8, mousePoint.x(), mousePoint.y());\r\n            }\r\n            break;\r\n        }\r\n        case MOUSE_MODE_ZOOM_OUT: {\r\n            zoomBy(1.2, mousePoint.x(), mousePoint.y());\r\n            break;\r\n        }\r\n        case MOUSE_MODE_FILL_FULL: {\r\n            m_pDoc.OnFillPoints(worldPoint, 0);\r\n            break;\r\n        }\r\n        case MOUSE_MODE_PENCIL: {\r\n            m_pDoc.m_meta_graph->getDisplayedPointMap().fillPoint(worldPoint, event->button() == Qt::LeftButton);\r\n            break;\r\n        }\r\n        case MOUSE_MODE_SEED_ISOVIST: {\r\n            m_pDoc.OnMakeIsovist(worldPoint);\r\n            break;\r\n        }\r\n        case MOUSE_MODE_SEED_TARGETED_ISOVIST: {\r\n            m_tempFirstPoint = worldPoint;\r\n            m_tempSecondPoint = worldPoint;\r\n            m_mouseMode = MOUSE_MODE_SEED_TARGETED_ISOVIST | MOUSE_MODE_SECOND_POINT;\r\n            break;\r\n        }\r\n        case MOUSE_MODE_SEED_TARGETED_ISOVIST | MOUSE_MODE_SECOND_POINT: {\r\n            Line directionLine(m_tempFirstPoint, worldPoint);\r\n            Point2f vec = directionLine.vector();\r\n            vec.normalise();\r\n            m_pDoc.OnMakeIsovist(m_tempFirstPoint, vec.angle());\r\n            m_mouseMode = MOUSE_MODE_SEED_TARGETED_ISOVIST;\r\n            break;\r\n        }\r\n        case MOUSE_MODE_SEED_AXIAL: {\r\n            m_pDoc.OnToolsAxialMap(worldPoint);\r\n            break;\r\n        }\r\n        case MOUSE_MODE_LINE_TOOL: {\r\n            m_tempFirstPoint = worldPoint;\r\n            m_tempSecondPoint = worldPoint;\r\n            m_mouseMode = MOUSE_MODE_LINE_TOOL | MOUSE_MODE_SECOND_POINT;\r\n            break;\r\n        }\r\n        case MOUSE_MODE_LINE_TOOL | MOUSE_MODE_SECOND_POINT: {\r\n            if (m_pDoc.m_meta_graph->makeShape(Line(m_tempFirstPoint, worldPoint))) {\r\n                m_pDoc.modifiedFlag = true;\r\n                m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n            }\r\n            m_tempFirstPoint = worldPoint;\r\n            m_tempSecondPoint = worldPoint;\r\n            m_mouseMode = MOUSE_MODE_LINE_TOOL;\r\n\r\n            break;\r\n        }\r\n        case MOUSE_MODE_POLYGON_TOOL: {\r\n            m_tempFirstPoint = worldPoint;\r\n            m_tempSecondPoint = worldPoint;\r\n            m_polyPoints = 0;\r\n            m_mouseMode = MOUSE_MODE_POLYGON_TOOL | MOUSE_MODE_SECOND_POINT;\r\n            break;\r\n        }\r\n        case MOUSE_MODE_POLYGON_TOOL | MOUSE_MODE_SECOND_POINT: {\r\n            if (m_polyPoints == 0) {\r\n                m_currentlyEditingShapeRef = m_pDoc.m_meta_graph->polyBegin(Line(m_tempFirstPoint, worldPoint));\r\n                m_polyStart = m_tempFirstPoint;\r\n                m_tempFirstPoint = m_tempSecondPoint;\r\n                m_polyPoints += 2;\r\n            } else if (m_polyPoints > 2 && PixelDist(mousePoint, getScreenPoint(m_polyStart)) < 6) {\r\n                // check to see if it's back to the original start point, if so, close off\r\n                m_pDoc.m_meta_graph->polyClose(m_currentlyEditingShapeRef);\r\n                m_polyPoints = 0;\r\n                m_currentlyEditingShapeRef = -1;\r\n                m_mouseMode = MOUSE_MODE_POLYGON_TOOL;\r\n            } else {\r\n                m_pDoc.m_meta_graph->polyAppend(m_currentlyEditingShapeRef, worldPoint);\r\n                m_tempFirstPoint = m_tempSecondPoint;\r\n                m_polyPoints += 1;\r\n            }\r\n            break;\r\n        }\r\n        case MOUSE_MODE_POINT_STEP_DEPTH: {\r\n            m_pDoc.m_meta_graph->setCurSel(r, false);\r\n            m_pDoc.OnToolsPD();\r\n            break;\r\n        }\r\n        case MOUSE_MODE_JOIN: {\r\n            selected = m_pDoc.m_meta_graph->setCurSel(r, false);\r\n            int selectedCount = m_pDoc.m_meta_graph->getSelCount();\r\n            if (selectedCount > 0) {\r\n                Point2f selectionCentre;\r\n                if (selectedCount > 1) {\r\n                    QtRegion selBounds = m_pDoc.m_meta_graph->getSelBounds();\r\n                    selectionCentre.x = (selBounds.bottom_left.x + selBounds.top_right.x) * 0.5;\r\n                    selectionCentre.y = (selBounds.bottom_left.y + selBounds.top_right.y) * 0.5;\r\n                } else {\r\n                    const std::set<int> &selectedSet = m_pDoc.m_meta_graph->getSelSet();\r\n                    if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                        selectionCentre = m_pDoc.m_meta_graph->getDisplayedPointMap().depixelate(*selectedSet.begin());\r\n                    } else if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                        selectionCentre = m_pDoc.m_meta_graph->getDisplayedShapeGraph()\r\n                                              .getAllShapes()[*selectedSet.begin()]\r\n                                              .getCentroid();\r\n                    }\r\n                }\r\n                m_tempFirstPoint = selectionCentre;\r\n                m_tempSecondPoint = selectionCentre;\r\n                m_mouseMode = MOUSE_MODE_JOIN | MOUSE_MODE_SECOND_POINT;\r\n            }\r\n            break;\r\n        }\r\n        case MOUSE_MODE_JOIN | MOUSE_MODE_SECOND_POINT: {\r\n            int selectedCount = m_pDoc.m_meta_graph->getSelCount();\r\n            if (selectedCount > 0) {\r\n                if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                    m_pDoc.m_meta_graph->getDisplayedPointMap().mergePoints(worldPoint);\r\n                } else if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL && selectedCount == 1) {\r\n                    m_pDoc.m_meta_graph->setCurSel(r, true); // add the new one to the selection set\r\n                    const auto &selectedSet = m_pDoc.m_meta_graph->getSelSet();\r\n                    if (selectedSet.size() == 2) {\r\n                        std::set<int>::iterator it = selectedSet.begin();\r\n                        int axRef1 = *it;\r\n                        it++;\r\n                        int axRef2 = *it;\r\n                        // axial is only joined one-by-one\r\n                        m_pDoc.modifiedFlag = true;\r\n                        m_pDoc.m_meta_graph->getDisplayedShapeGraph().linkShapesFromRefs(axRef1, axRef2, true);\r\n                        m_pDoc.m_meta_graph->clearSel();\r\n                    }\r\n                }\r\n                m_pDoc.m_meta_graph->clearSel();\r\n                m_mouseMode = MOUSE_MODE_JOIN;\r\n            }\r\n            break;\r\n        }\r\n        case MOUSE_MODE_UNJOIN: {\r\n            m_pDoc.m_meta_graph->setCurSel(r, false);\r\n            int selectedCount = m_pDoc.m_meta_graph->getSelCount();\r\n            if (selectedCount > 0) {\r\n                if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n                    if (m_pDoc.m_meta_graph->getDisplayedPointMap().unmergePoints()) {\r\n                        m_pDoc.modifiedFlag = true;\r\n                        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA);\r\n                    }\r\n                } else if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL) {\r\n                    const auto &selectedSet = m_pDoc.m_meta_graph->getSelSet();\r\n                    Point2f selectionCentre = m_pDoc.m_meta_graph->getDisplayedShapeGraph()\r\n                                                  .getAllShapes()[*selectedSet.begin()]\r\n                                                  .getCentroid();\r\n                    m_tempFirstPoint = selectionCentre;\r\n                    m_tempSecondPoint = selectionCentre;\r\n                    m_mouseMode = MOUSE_MODE_UNJOIN | MOUSE_MODE_SECOND_POINT;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case MOUSE_MODE_UNJOIN | MOUSE_MODE_SECOND_POINT: {\r\n            int selectedCount = m_pDoc.m_meta_graph->getSelCount();\r\n            if (selectedCount > 0) {\r\n                if (m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWAXIAL && selectedCount == 1) {\r\n                    m_pDoc.m_meta_graph->setCurSel(r, true); // add the new one to the selection set\r\n                    const auto &selectedSet = m_pDoc.m_meta_graph->getSelSet();\r\n                    if (selectedSet.size() == 2) {\r\n                        std::set<int>::iterator it = selectedSet.begin();\r\n                        int axRef1 = *it;\r\n                        it++;\r\n                        int axRef2 = *it;\r\n                        // axial is only joined one-by-one\r\n                        m_pDoc.modifiedFlag = true;\r\n                        m_pDoc.m_meta_graph->getDisplayedShapeGraph().unlinkShapesFromRefs(axRef1, axRef2, true);\r\n                        m_pDoc.m_meta_graph->clearSel();\r\n                    }\r\n                }\r\n                m_pDoc.m_meta_graph->clearSel();\r\n                m_mouseMode = MOUSE_MODE_UNJOIN;\r\n            }\r\n            break;\r\n        }\r\n        }\r\n\r\n        m_pDoc.SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_SELECTION);\r\n    }\r\n    m_mouseDragRect.setWidth(0);\r\n    m_mouseDragRect.setHeight(0);\r\n}\r\n\r\nvoid GLView::mousePressEvent(QMouseEvent *event) { m_mouseLastPos = event->pos(); }\r\n\r\nvoid GLView::mouseMoveEvent(QMouseEvent *event) {\r\n    int dx = event->x() - m_mouseLastPos.x();\r\n    int dy = event->y() - m_mouseLastPos.y();\r\n\r\n    Point2f worldPoint = getWorldPoint(event->pos());\r\n\r\n    if (m_mouseDragRect.isNull() && !((m_mouseMode & MOUSE_MODE_SECOND_POINT) == MOUSE_MODE_SECOND_POINT &&\r\n                                      m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA)) {\r\n        highlightHoveredItems(QtRegion(worldPoint, worldPoint));\r\n    }\r\n\r\n    if (event->buttons() & Qt::RightButton || (event->buttons() & Qt::LeftButton && m_mouseMode == MOUSE_MODE_PAN)) {\r\n        panBy(dx, dy);\r\n        m_wasPanning = true;\r\n    } else if (event->buttons() & Qt::LeftButton) {\r\n        Point2f lastWorldPoint = getWorldPoint(m_mouseLastPos);\r\n\r\n        if (m_mouseDragRect.isNull()) {\r\n            m_mouseDragRect.setX(lastWorldPoint.x);\r\n            m_mouseDragRect.setY(lastWorldPoint.y);\r\n        }\r\n\r\n        m_mouseDragRect.setWidth(worldPoint.x - m_mouseDragRect.x());\r\n        m_mouseDragRect.setHeight(worldPoint.y - m_mouseDragRect.y());\r\n\r\n        QtRegion hoverRegion;\r\n        hoverRegion.bottom_left.x = std::min(m_mouseDragRect.bottomRight().x(), m_mouseDragRect.topLeft().x());\r\n        hoverRegion.bottom_left.y = std::min(m_mouseDragRect.bottomRight().y(), m_mouseDragRect.topLeft().y());\r\n        hoverRegion.top_right.x = std::max(m_mouseDragRect.bottomRight().x(), m_mouseDragRect.topLeft().x());\r\n        hoverRegion.top_right.y = std::max(m_mouseDragRect.bottomRight().y(), m_mouseDragRect.topLeft().y());\r\n        highlightHoveredItems(hoverRegion);\r\n        update();\r\n    }\r\n    if ((m_mouseMode & MOUSE_MODE_SECOND_POINT) == MOUSE_MODE_SECOND_POINT) {\r\n        m_tempSecondPoint = worldPoint;\r\n        if (m_highlightOnHover && m_pDoc.m_meta_graph->getViewClass() & MetaGraph::VIEWVGA) {\r\n            PointMap &map = m_pDoc.m_meta_graph->getDisplayedPointMap();\r\n            QtRegion selectionBounds = map.getSelBounds();\r\n            PixelRef worldPixel = map.pixelate(worldPoint, true);\r\n            PixelRef boundsPixel =\r\n                map.pixelate(Point2f(selectionBounds.top_right.x, selectionBounds.bottom_left.y), true);\r\n            std::set<int> &selection = map.getSelSet();\r\n            std::set<PixelRef> offsetSelection;\r\n            for (int ref : selection) {\r\n                PixelRef pixelRef = PixelRef(ref) + worldPixel - boundsPixel;\r\n                offsetSelection.insert(pixelRef);\r\n            }\r\n            highlightHoveredPixels(map, offsetSelection);\r\n        }\r\n        update();\r\n    }\r\n    m_mouseLastPos = event->pos();\r\n    m_pDoc.m_position = worldPoint;\r\n    m_pDoc.UpdateMainframestatus();\r\n}\r\n\r\nvoid GLView::wheelEvent(QWheelEvent *event) {\r\n    QPoint numDegrees = event->angleDelta() / 8;\r\n\r\n    int x = event->x();\r\n    int y = event->y();\r\n\r\n    zoomBy(1 - 0.25f * numDegrees.y() / 15.0f, x, y);\r\n\r\n    event->accept();\r\n}\r\n\r\nbool GLView::eventFilter(QObject *object, QEvent *e) {\r\n    if (e->type() == QEvent::ToolTip) {\r\n        if (!m_pDoc.m_communicator) {\r\n            if (m_pDoc.m_meta_graph) {\r\n                if (m_pDoc.m_meta_graph->viewingProcessed() && m_pDoc.m_meta_graph->getSelCount() > 1) {\r\n                    float val = m_pDoc.m_meta_graph->getSelAvg();\r\n                    int count = m_pDoc.m_meta_graph->getSelCount();\r\n                    if (val == -1.0f)\r\n                        setToolTip(\"Null selection\");\r\n                    else if (val != -2.0f)\r\n                        setToolTip(QString(\"Selection\\nAverage: %1\\nCount: %2\").arg(val).arg(count));\r\n                    else\r\n                        setToolTip(\"\");\r\n                } else if (m_pDoc.m_meta_graph->viewingProcessed()) {\r\n                    // and that it has an appropriate state to display a hover wnd\r\n                    QHelpEvent *helpEvent =\r\n                        static_cast<QHelpEvent *>(e); // Tool tip events come as the type QHelpEvent\r\n                    float val = m_pDoc.m_meta_graph->getLocationValue(getWorldPoint(helpEvent->pos()));\r\n                    if (val == -1.0f)\r\n                        setToolTip(\"No value\");\r\n                    else if (val != -2.0f) {\r\n                        QString s;\r\n                        QTextStream txt(&s);\r\n                        txt.setRealNumberNotation(QTextStream::FixedNotation);\r\n                        txt << val;\r\n                        setToolTip(s);\r\n                    } else\r\n                        setToolTip(\"\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return QObject::eventFilter(object, e);\r\n}\r\n\r\nvoid GLView::highlightHoveredItems(const QtRegion &region) {\r\n    if (!m_highlightOnHover)\r\n        return;\r\n    if (m_pDoc.m_meta_graph->viewingProcessedPoints()) {\r\n        highlightHoveredPixels(m_pDoc.m_meta_graph->getDisplayedPointMap(), region);\r\n    } else if (m_pDoc.m_meta_graph->viewingProcessedLines()) {\r\n        highlightHoveredShapes(m_pDoc.m_meta_graph->getDisplayedShapeGraph(), region);\r\n    } else if (m_pDoc.m_meta_graph->viewingProcessedShapes()) {\r\n        highlightHoveredShapes(m_pDoc.m_meta_graph->getDisplayedDataMap(), region);\r\n    }\r\n}\r\n\r\nvoid GLView::highlightHoveredPixels(const PointMap &map, const QtRegion &region) {\r\n    // n.b., assumes constrain set to true (for if you start the selection off the grid)\r\n    PixelRef s_bl = map.pixelate(region.bottom_left, true);\r\n    PixelRef s_tr = map.pixelate(region.top_right, true);\r\n    std::vector<Point> points;\r\n    PixelRef hoverPixel = -1;\r\n    for (short i = s_bl.x; i <= s_tr.x; i++) {\r\n        for (short j = s_bl.y; j <= s_tr.y; j++) {\r\n            PixelRef ref = PixelRef(i, j);\r\n            if (map.includes(ref)) {\r\n                const Point &p = map.getPoint(ref);\r\n                if (p.filled()) {\r\n                    points.push_back(p);\r\n                    hoverPixel = ref;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (!points.empty()) {\r\n        // do not redo the whole thing if we are still hovering the same pixel\r\n        if (points.size() == 1 && hoverPixel == m_lastHoverPixel)\r\n            return;\r\n        std::vector<SimpleLine> lines;\r\n        int i = 0;\r\n        for (Point point : points) {\r\n            const Point2f &loc = point.getLocation();\r\n            lines.push_back(SimpleLine(loc.x - map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5,\r\n                                       loc.x - map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5));\r\n            lines.push_back(SimpleLine(loc.x - map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5,\r\n                                       loc.x + map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5));\r\n            lines.push_back(SimpleLine(loc.x + map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5,\r\n                                       loc.x + map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5));\r\n            lines.push_back(SimpleLine(loc.x + map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5,\r\n                                       loc.x - map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5));\r\n            i++;\r\n        }\r\n        m_hoveredPixels.loadLineData(lines, qRgb(255, 255, 0));\r\n        m_hoverStoreInvalid = true;\r\n        m_hoverHasShapes = true;\r\n    } else if (m_hoverHasShapes) {\r\n        m_hoveredPixels.loadLineData(std::vector<SimpleLine>(), qRgb(255, 255, 0));\r\n        m_hoverStoreInvalid = true;\r\n        m_hoverHasShapes = false;\r\n    }\r\n\r\n    if (m_hoverStoreInvalid) {\r\n        update();\r\n    }\r\n}\r\n\r\nvoid GLView::highlightHoveredPixels(const PointMap &map, const std::set<PixelRef> &refs) {\r\n    // n.b., assumes constrain set to true (for if you start the selection off the grid)\r\n    std::vector<Point> points;\r\n    PixelRef hoverPixel = -1;\r\n    for (PixelRef ref : refs) {\r\n        if (map.includes(ref)) {\r\n            const Point &p = map.getPoint(ref);\r\n            if (p.filled()) {\r\n                points.push_back(p);\r\n                hoverPixel = ref;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (!points.empty()) {\r\n        // do not redo the whole thing if we are still hovering the same pixel\r\n        if (points.size() == 1 && hoverPixel == m_lastHoverPixel)\r\n            return;\r\n        std::vector<SimpleLine> lines;\r\n        int i = 0;\r\n        for (Point point : points) {\r\n            const Point2f &loc = point.getLocation();\r\n            lines.push_back(SimpleLine(loc.x - map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5,\r\n                                       loc.x - map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5));\r\n            lines.push_back(SimpleLine(loc.x - map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5,\r\n                                       loc.x + map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5));\r\n            lines.push_back(SimpleLine(loc.x + map.getSpacing() * 0.5, loc.y + map.getSpacing() * 0.5,\r\n                                       loc.x + map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5));\r\n            lines.push_back(SimpleLine(loc.x + map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5,\r\n                                       loc.x - map.getSpacing() * 0.5, loc.y - map.getSpacing() * 0.5));\r\n            i++;\r\n        }\r\n        m_hoveredPixels.loadLineData(lines, qRgb(255, 255, 0));\r\n        m_hoverStoreInvalid = true;\r\n        m_hoverHasShapes = true;\r\n    } else if (m_hoverHasShapes) {\r\n        m_hoveredPixels.loadLineData(std::vector<SimpleLine>(), qRgb(255, 255, 0));\r\n        m_hoverStoreInvalid = true;\r\n        m_hoverHasShapes = false;\r\n    }\r\n\r\n    if (m_hoverStoreInvalid) {\r\n        update();\r\n    }\r\n}\r\n\r\nvoid GLView::highlightHoveredShapes(const ShapeMap &map, const QtRegion &region) {\r\n\r\n    auto shapesInRegion = map.getShapesInRegion(region);\r\n    if (!shapesInRegion.empty()) {\r\n        std::vector<std::pair<SimpleLine, PafColor>> colouredLines;\r\n        std::vector<std::pair<std::vector<Point2f>, PafColor>> colouredPolygons;\r\n        std::vector<std::pair<Point2f, PafColor>> colouredPoints;\r\n        for (auto keyShape : shapesInRegion) {\r\n            AttributeKey key = AttributeKey(keyShape.first);\r\n            const SalaShape &shape = keyShape.second;\r\n\r\n            const AttributeRow &row = map.getAttributeTable().getRow(key);\r\n            PafColor colour = dXreimpl::getDisplayColor(key, row, map.getAttributeTableHandle(), true);\r\n\r\n            if (shape.isLine()) {\r\n                colouredLines.push_back(std::make_pair(SimpleLine(shape.getLine()), colour));\r\n            } else if (shape.isPolyLine()) {\r\n                for (size_t n = 0; n < shape.m_points.size() - 1; n++) {\r\n                    colouredLines.push_back(\r\n                        std::make_pair(SimpleLine(shape.m_points[n], shape.m_points[n + 1]), colour));\r\n                }\r\n            } else if (shape.isPolygon()) {\r\n                for (size_t n = 0; n < shape.m_points.size() - 1; n++) {\r\n                    colouredLines.push_back(\r\n                        std::make_pair(SimpleLine(shape.m_points[n], shape.m_points[n + 1]), PafColor(1, 1, 0)));\r\n                }\r\n                colouredLines.push_back(\r\n                    std::make_pair(SimpleLine(shape.m_points.back(), shape.m_points.front()), PafColor(1, 1, 0)));\r\n            } else {\r\n                if (shape.isPoint()) {\r\n                    colouredPoints.push_back(std::make_pair(shape.getCentroid(), PafColor(1, 0, 0)));\r\n                }\r\n            }\r\n        }\r\n        m_hoveredShapes.loadGLObjects(colouredLines, colouredPolygons, colouredPoints, 8, map.getSpacing() * 0.1);\r\n        m_hoverStoreInvalid = true;\r\n        m_hoverHasShapes = true;\r\n    } else if (m_hoverHasShapes) {\r\n        m_hoveredShapes.loadGLObjects(std::vector<std::pair<SimpleLine, PafColor>>(),\r\n                                      std::vector<std::pair<std::vector<Point2f>, PafColor>>(),\r\n                                      std::vector<std::pair<Point2f, PafColor>>(), 8, map.getSpacing() * 0.1);\r\n        m_hoverStoreInvalid = true;\r\n        m_hoverHasShapes = false;\r\n    }\r\n\r\n    if (m_hoverStoreInvalid) {\r\n        update();\r\n    }\r\n}\r\n\r\nvoid GLView::zoomBy(float dzf, int mouseX, int mouseY) {\r\n    float pzf = m_zoomFactor;\r\n    m_zoomFactor = m_zoomFactor * dzf;\r\n    if (m_zoomFactor < m_minZoomFactor)\r\n        m_zoomFactor = m_minZoomFactor;\r\n    else if (m_zoomFactor > m_maxZoomFactor)\r\n        m_zoomFactor = m_maxZoomFactor;\r\n    m_eyePosX +=\r\n        (m_zoomFactor - pzf) * m_screenRatio * GLfloat(mouseX - m_screenWidth * 0.5f) / GLfloat(m_screenWidth);\r\n    m_eyePosY -= (m_zoomFactor - pzf) * GLfloat(mouseY - m_screenHeight * 0.5f) / GLfloat(m_screenHeight);\r\n    recalcView();\r\n}\r\nvoid GLView::panBy(int dx, int dy) {\r\n    m_eyePosX += m_zoomFactor * GLfloat(dx) / m_screenHeight;\r\n    m_eyePosY -= m_zoomFactor * GLfloat(dy) / m_screenHeight;\r\n\r\n    recalcView();\r\n}\r\nvoid GLView::recalcView() {\r\n    m_mProj.setToIdentity();\r\n\r\n    if (m_perspectiveView) {\r\n        m_mProj.perspective(45.0f, m_screenRatio, 0.01f, 100.0f);\r\n        m_mProj.scale(1.0f, 1.0f, m_zoomFactor);\r\n    } else {\r\n        m_mProj.ortho(-m_zoomFactor * 0.5f * m_screenRatio, m_zoomFactor * 0.5f * m_screenRatio, -m_zoomFactor * 0.5f,\r\n                      m_zoomFactor * 0.5f, 0, 10);\r\n    }\r\n    m_mProj.translate(m_eyePosX, m_eyePosY, 0.0f);\r\n    update();\r\n}\r\n\r\nPoint2f GLView::getWorldPoint(const QPoint &screenPoint) {\r\n    return Point2f(+m_zoomFactor * float(screenPoint.x() - m_screenWidth * 0.5) / m_screenHeight - m_eyePosX,\r\n                   -m_zoomFactor * float(screenPoint.y() - m_screenHeight * 0.5) / m_screenHeight - m_eyePosY);\r\n}\r\n\r\nQPoint GLView::getScreenPoint(const Point2f &worldPoint) {\r\n    return QPoint((worldPoint.x + m_eyePosX) * m_screenHeight / m_zoomFactor + m_screenWidth * 0.5,\r\n                  -(worldPoint.y + m_eyePosY) * m_screenHeight / m_zoomFactor + m_screenHeight * 0.5);\r\n}\r\n\r\nvoid GLView::matchViewToCurrentMetaGraph() {\r\n    const QtRegion &region = m_pDoc.m_meta_graph->getBoundingBox();\r\n    OnViewZoomToRegion(region);\r\n    recalcView();\r\n}\r\n\r\nvoid GLView::OnViewZoomToRegion(QtRegion region) {\r\n    if ((region.top_right.x == 0 && region.bottom_left.x == 0) ||\r\n        (region.top_right.y == 0 && region.bottom_left.y == 0))\r\n        // region is unset, don't try to change the view to it\r\n        return;\r\n    m_eyePosX = -(region.top_right.x + region.bottom_left.x) * 0.5f;\r\n    m_eyePosY = -(region.top_right.y + region.bottom_left.y) * 0.5f;\r\n    if (region.width() > region.height()) {\r\n        m_zoomFactor = region.top_right.x - region.bottom_left.x;\r\n    } else {\r\n        m_zoomFactor = region.top_right.y - region.bottom_left.y;\r\n    }\r\n    m_minZoomFactor = m_zoomFactor * 0.001;\r\n    m_maxZoomFactor = m_zoomFactor * 10;\r\n}\r\n\r\nvoid GLView::resetView() {\r\n    m_visiblePointMap.showLinks(false);\r\n    m_visibleShapeGraph.showLinks(false);\r\n    m_pDoc.m_meta_graph->clearSel();\r\n    update();\r\n}\r\n\r\nvoid GLView::OnModeJoin() {\r\n    if (m_pDoc.m_meta_graph->getViewClass() & (MetaGraph::VIEWVGA | MetaGraph::VIEWAXIAL)) {\r\n        resetView();\r\n        m_mouseMode = MOUSE_MODE_JOIN;\r\n        m_visiblePointMap.showLinks(true);\r\n        m_visibleShapeGraph.showLinks(true);\r\n        m_pDoc.m_meta_graph->clearSel();\r\n        notifyDatasetChanged();\r\n    }\r\n}\r\n\r\nvoid GLView::OnModeUnjoin() {\r\n    if (m_pDoc.m_meta_graph->getState() & (MetaGraph::VIEWVGA | MetaGraph::VIEWAXIAL)) {\r\n        resetView();\r\n        m_mouseMode = MOUSE_MODE_UNJOIN;\r\n        m_visiblePointMap.showLinks(true);\r\n        m_visibleShapeGraph.showLinks(true);\r\n        m_pDoc.m_meta_graph->clearSel();\r\n        notifyDatasetChanged();\r\n    }\r\n}\r\nvoid GLView::OnViewPan() { m_mouseMode = MOUSE_MODE_PAN; }\r\n\r\nvoid GLView::OnViewZoomIn() { m_mouseMode = MOUSE_MODE_ZOOM_IN; }\r\n\r\nvoid GLView::OnViewZoomOut() { m_mouseMode = MOUSE_MODE_ZOOM_OUT; }\r\n\r\nvoid GLView::OnEditFill() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_FILL_FULL;\r\n}\r\n\r\nvoid GLView::OnEditSemiFill() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_FILL_SEMI;\r\n}\r\n\r\nvoid GLView::OnEditAugmentFill() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_FILL_AUGMENT;\r\n}\r\n\r\nvoid GLView::OnEditPencil() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_PENCIL;\r\n}\r\n\r\nvoid GLView::OnModeIsovist() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_SEED_ISOVIST;\r\n}\r\n\r\nvoid GLView::OnModeTargetedIsovist() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_SEED_TARGETED_ISOVIST;\r\n}\r\n\r\nvoid GLView::OnModeSeedAxial() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_SEED_AXIAL;\r\n}\r\n\r\nvoid GLView::OnModeStepDepth() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_POINT_STEP_DEPTH;\r\n}\r\n\r\nvoid GLView::OnEditLineTool() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_LINE_TOOL;\r\n}\r\n\r\nvoid GLView::OnEditPolygonTool() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_POLYGON_TOOL;\r\n}\r\n\r\nvoid GLView::OnEditSelect() {\r\n    resetView();\r\n    m_mouseMode = MOUSE_MODE_SELECT;\r\n}\r\n\r\nvoid GLView::postLoadFile() {\r\n    matchViewToCurrentMetaGraph();\r\n    setWindowTitle(m_pDoc.m_base_title + \":Map View (GL)\");\r\n}\r\n\r\nvoid GLView::OnViewZoomsel() {\r\n    if (m_pDoc.m_meta_graph && m_pDoc.m_meta_graph->isSelected()) {\r\n        OnViewZoomToRegion(m_pDoc.m_meta_graph->getSelBounds());\r\n    }\r\n}\r\n\r\nvoid GLView::closeEvent(QCloseEvent *event) {\r\n    m_pDoc.m_view[QGraphDoc::VIEW_MAP_GL] = NULL;\r\n    if (!m_pDoc.OnCloseDocument(QGraphDoc::VIEW_MAP_GL)) {\r\n        m_pDoc.m_view[QGraphDoc::VIEW_MAP_GL] = this;\r\n        event->ignore();\r\n    }\r\n}\r\n\r\nvoid GLView::OnEditCopy() {\r\n    std::unique_ptr<QDepthmapView> tmp(new QDepthmapView(m_pDoc, m_settings));\r\n    Point2f topLeftWorld = getWorldPoint(QPoint(0, 0));\r\n    Point2f bottomRightWorld = getWorldPoint(QPoint(width(), height()));\r\n\r\n    tmp->setAttribute(Qt::WA_DontShowOnScreen);\r\n    tmp->show();\r\n    tmp->postLoadFile();\r\n    tmp->OnViewZoomToRegion(QtRegion(topLeftWorld, bottomRightWorld));\r\n    tmp->repaint();\r\n    tmp->OnEditCopy();\r\n    tmp->close();\r\n}\r\n\r\nvoid GLView::OnEditSave() {\r\n    std::unique_ptr<QDepthmapView> tmp(new QDepthmapView(m_pDoc, m_settings));\r\n    Point2f topLeftWorld = getWorldPoint(QPoint(0, 0));\r\n    Point2f bottomRightWorld = getWorldPoint(QPoint(width(), height()));\r\n\r\n    tmp->setAttribute(Qt::WA_DontShowOnScreen);\r\n    tmp->show();\r\n    tmp->postLoadFile();\r\n    tmp->OnViewZoomToRegion(QtRegion(topLeftWorld, bottomRightWorld));\r\n    tmp->OnEditSave();\r\n}\r\n"
  },
  {
    "path": "depthmapX/views/glview/glview.h",
    "content": "// depthmapX - spatial network analysis platform\r\n// Copyright (C) 2017, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#pragma once\r\n\r\n#include \"depthmapX/GraphDoc.h\"\r\n\r\n#include \"depthmapX/views/glview/gldynamicline.h\"\r\n#include \"depthmapX/views/glview/gldynamicrect.h\"\r\n#include \"depthmapX/views/glview/gllines.h\"\r\n#include \"depthmapX/views/glview/gllinesuniform.h\"\r\n#include \"depthmapX/views/glview/glpointmap.h\"\r\n#include \"depthmapX/views/glview/glpolygons.h\"\r\n#include \"depthmapX/views/glview/glrastertexture.h\"\r\n#include \"depthmapX/views/glview/glshapegraph.h\"\r\n#include \"depthmapX/views/mapview.h\"\r\n\r\n#include <QMatrix4x4>\r\n#include <QOpenGLFunctions>\r\n#include <QOpenGLWidget>\r\n\r\nQT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram)\r\n\r\nclass GLView : public MapView, protected QOpenGLFunctions {\r\n    Q_OBJECT\r\n\r\n  public:\r\n    GLView(QGraphDoc &pDoc, Settings &settings, QWidget *parent = Q_NULLPTR);\r\n    ~GLView();\r\n\r\n    QSize minimumSizeHint() const override;\r\n    QSize sizeHint() const override;\r\n    void notifyDatasetChanged() {\r\n        m_datasetChanged = true;\r\n        update();\r\n    }\r\n    void matchViewToCurrentMetaGraph();\r\n\r\n    virtual void OnModeJoin() override;\r\n    virtual void OnModeUnjoin() override;\r\n    virtual void OnViewPan() override;\r\n    virtual void OnViewZoomIn() override;\r\n    virtual void OnViewZoomOut() override;\r\n    virtual void OnEditFill() override;\r\n    virtual void OnEditSemiFill() override;\r\n    virtual void OnEditAugmentFill() override;\r\n    virtual void OnEditPencil() override;\r\n    virtual void OnModeIsovist() override;\r\n    virtual void OnModeTargetedIsovist() override;\r\n    virtual void OnEditLineTool() override;\r\n    virtual void OnEditPolygonTool() override;\r\n    virtual void OnModeSeedAxial() override;\r\n    virtual void OnEditSelect() override;\r\n    virtual void OnViewZoomsel() override;\r\n    void OnModeStepDepth();\r\n    virtual void postLoadFile() override;\r\n    virtual void OnEditCopy() override;\r\n    virtual void OnEditSave() override;\r\n    virtual void OnViewZoomToRegion(QtRegion region) override;\r\n\r\n  protected:\r\n    void initializeGL() override;\r\n    void paintGL() override;\r\n    void resizeGL(int width, int height) override;\r\n    void mouseReleaseEvent(QMouseEvent *event) override;\r\n    void mousePressEvent(QMouseEvent *event) override;\r\n    void mouseMoveEvent(QMouseEvent *event) override;\r\n    void wheelEvent(QWheelEvent *event) override;\r\n    bool eventFilter(QObject *object, QEvent *e) override;\r\n    void closeEvent(QCloseEvent *event) override;\r\n\r\n  private:\r\n    bool m_perspectiveView = false;\r\n    bool m_core;\r\n    QMatrix4x4 m_mProj;\r\n    QMatrix4x4 m_mView;\r\n    QMatrix4x4 m_mModel;\r\n\r\n    QRgb m_foreground;\r\n    QRgb m_background;\r\n    QSize m_initialSize;\r\n\r\n    GLDynamicRect m_selectionRect;\r\n    GLDynamicLine m_dragLine;\r\n    GLLines m_axes;\r\n    GLShapeGraph m_visibleShapeGraph;\r\n    GLLinesUniform m_visibleDrawingLines;\r\n    GLPointMap m_visiblePointMap;\r\n    GLShapeMap m_visibleDataMap;\r\n\r\n    bool m_highlightOnHover = true;\r\n    bool m_hoverHasShapes = false;\r\n    bool m_hoverStoreInvalid = false;\r\n    GLShapeMap m_hoveredShapes;\r\n    GLLinesUniform m_hoveredPixels;\r\n    PixelRef m_lastHoverPixel = -1;\r\n\r\n    QPoint m_mouseLastPos;\r\n    float m_eyePosX;\r\n    float m_eyePosY;\r\n    float m_minZoomFactor = 1;\r\n    float m_zoomFactor = 20;\r\n    float m_maxZoomFactor = 200;\r\n    GLfloat m_screenRatio;\r\n    int m_screenWidth;\r\n    int m_screenHeight;\r\n    bool m_wasPanning = false;\r\n\r\n    int m_antialiasingSamples = 0; // set this to 0 if rendering is too slow\r\n\r\n    Point2f getWorldPoint(const QPoint &screenPoint);\r\n    QPoint getScreenPoint(const Point2f &worldPoint);\r\n\r\n    bool m_datasetChanged = false;\r\n\r\n    void panBy(int dx, int dy);\r\n    void recalcView();\r\n    void zoomBy(float dzf, int mouseX, int mouseY);\r\n    void resetView();\r\n\r\n    void highlightHoveredItems(const QtRegion &region);\r\n    void highlightHoveredPixels(const PointMap &map, const QtRegion &region);\r\n    void highlightHoveredPixels(const PointMap &map, const std::set<PixelRef> &refs);\r\n    void highlightHoveredShapes(const ShapeMap &map, const QtRegion &region);\r\n\r\n    void loadAxes();\r\n    void loadDrawingGLObjects();\r\n\r\n    enum {\r\n        MOUSE_MODE_NONE = 0x0000,\r\n        MOUSE_MODE_SELECT = 0x10000,\r\n        MOUSE_MODE_PAN = 0x0101,\r\n        MOUSE_MODE_ZOOM_IN = 0x0202,\r\n        MOUSE_MODE_ZOOM_OUT = 0x0204,\r\n        MOUSE_MODE_FILL_FULL = 0x0001,\r\n        MOUSE_MODE_FILL_SEMI = 0x0002,\r\n        MOUSE_MODE_FILL_AUGMENT = 0x0003,\r\n        MOUSE_MODE_PENCIL = 0x0801,\r\n        MOUSE_MODE_SEED_ISOVIST = 0x4001,\r\n        MOUSE_MODE_SEED_TARGETED_ISOVIST = 0x4002,\r\n        MOUSE_MODE_SEED_AXIAL = 0x0004,\r\n        MOUSE_MODE_LINE_TOOL = 0x0008,\r\n        MOUSE_MODE_POLYGON_TOOL = 0x0010,\r\n        MOUSE_MODE_POINT_STEP_DEPTH = 0x5000,\r\n        MOUSE_MODE_JOIN = 0x20001,\r\n        MOUSE_MODE_UNJOIN = 0x20002,\r\n        MOUSE_MODE_SECOND_POINT = 0x00400,\r\n    };\r\n\r\n    int m_mouseMode = MOUSE_MODE_SELECT;\r\n\r\n    QRectF m_mouseDragRect = QRectF(0, 0, 0, 0);\r\n\r\n    Point2f m_tempFirstPoint;\r\n    Point2f m_tempSecondPoint;\r\n\r\n    int m_currentlyEditingShapeRef = -1;\r\n\r\n    Point2f m_polyStart;\r\n    int m_polyPoints = 0;\r\n\r\n    inline int PixelDist(QPoint a, QPoint b) {\r\n        return (int)sqrt(double((b.x() - a.x()) * (b.x() - a.x()) + (b.y() - a.y()) * (b.y() - a.y())));\r\n    }\r\n};\r\n"
  },
  {
    "path": "depthmapX/views/mapview.cpp",
    "content": "#include \"mapview.h\"\n\nMapView::MapView(QGraphDoc &pDoc, Settings &settings, QWidget *parent)\n    : QOpenGLWidget(parent), m_pDoc(pDoc), m_settings(settings)\n{\n\n}\n"
  },
  {
    "path": "depthmapX/views/mapview.h",
    "content": "#pragma once\n\n#include <QOpenGLWidget>\n#include \"depthmapX/GraphDoc.h\"\n#include \"depthmapX/settings.h\"\n\nclass MapView : public QOpenGLWidget\n{\n    Q_OBJECT\n\nprotected:\n    QGraphDoc &m_pDoc;\n    Settings &m_settings;\n    QString m_currentFile;\n\npublic:\n    MapView(QGraphDoc &pDoc,\n            Settings &settings,\n            QWidget* parent = Q_NULLPTR);\n\n    virtual void OnModeJoin() = 0;\n    virtual void OnModeUnjoin() = 0;\n    virtual void OnViewPan() = 0;\n    virtual void OnViewZoomIn() = 0;\n    virtual void OnViewZoomOut() = 0;\n    virtual void OnEditFill() = 0;\n    virtual void OnEditSemiFill() = 0;\n    virtual void OnEditAugmentFill() = 0;\n    virtual void OnEditPencil() = 0;\n    virtual void OnModeIsovist() = 0;\n    virtual void OnModeTargetedIsovist() = 0;\n    virtual void OnEditLineTool() = 0;\n    virtual void OnEditPolygonTool() = 0;\n    virtual void OnModeSeedAxial() = 0;\n    virtual void OnEditSelect() = 0;\n    virtual void postLoadFile() = 0;\n    virtual void OnViewZoomsel() = 0;\n    virtual void OnEditCopy() = 0;\n    virtual void OnEditSave() = 0;\n    virtual void OnViewZoomToRegion(QtRegion region) = 0;\n\n    QGraphDoc *getGraphDoc() { return &m_pDoc; }\n    void setCurrentFile(const QString &fileName) { m_currentFile = fileName; }\n    QString getCurrentFile() { return m_currentFile; }\n};\n"
  },
  {
    "path": "depthmapX/views/plotview/plotview.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// depthmapX - spatial network analysis platform\r\n\r\n// PlotView.cpp : implementation file\r\n//\r\n\r\n#include \"plotview.h\"\r\n#include \"mainwindow.h\"\r\n\r\n#include \"salalib/attributetablehelpers.h\"\r\n\r\n#include <qevent.h>\r\n#include <qpainter.h>\r\n\r\n#ifdef _WIN32\r\n#define finite _finite\r\n#endif\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// PlotView\r\nstatic int pressed_nFlags;\r\nQPlotView::QPlotView() {\r\n    m_x_axis = -1;\r\n    m_y_axis = -1;\r\n    curr_x = -1;\r\n    curr_y = -1;\r\n\r\n    m_queued_redraw = false;\r\n    m_view_trend_line = false;\r\n    m_view_rsquared = false;\r\n    m_view_monochrome = false;\r\n    m_view_origin = false;\r\n    m_view_equation = false;\r\n\r\n    // for drawing drag rect\r\n    m_drawdragrect = false;\r\n    m_selecting = false;\r\n\r\n    setAttribute(Qt::WA_NoBackground, 1);\r\n    setMouseTracking(true);\r\n    setWindowIcon(QIcon(tr(\":/images/cur/icon-1-2.png\")));\r\n\r\n    installEventFilter(this);\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// QPlotView drawing\r\n\r\nint QPlotView::screenX(double x) {\r\n    return m_screen_bounds.left() +\r\n           m_screen_bounds.width() *\r\n               (m_data_bounds.width() ? (x - m_data_bounds.bottom_left.x) / m_data_bounds.width() : 0.5);\r\n}\r\n\r\nint QPlotView::screenY(double y) {\r\n    return m_screen_bounds.top() -\r\n           (abs(m_screen_bounds.height()) *\r\n            (m_data_bounds.height() ? (y - m_data_bounds.bottom_left.y) / m_data_bounds.height() : 0.5));\r\n}\r\n\r\ndouble QPlotView::dataX(int x) {\r\n    return m_data_bounds.bottom_left.x +\r\n           m_data_bounds.width() * double(x - m_screen_bounds.left()) / double(m_screen_bounds.width());\r\n}\r\n\r\ndouble QPlotView::dataY(int y) {\r\n    return m_data_bounds.bottom_left.y +\r\n           m_data_bounds.height() * double(m_screen_bounds.top() - y) / double(abs(m_screen_bounds.height()));\r\n}\r\n\r\nQSize QPlotView::sizeHint() const { return QSize(2000, 2000); }\r\n\r\nstatic QPoint hit_point;\r\nbool QPlotView::eventFilter(QObject *object, QEvent *e) {\r\n    if (e->type() == QEvent::ToolTip) {\r\n        if (!pDoc->m_communicator) {\r\n            // first, check you have a meta graph\r\n            if (pDoc->m_meta_graph) {\r\n                if (pDoc->m_meta_graph->viewingProcessed()) {\r\n                    AttributeTable &table = pDoc->m_meta_graph->getAttributeTable();\r\n\r\n                    auto xRange =\r\n                        getIndexItemsInValueRange(idx_x, table, dataX(hit_point.x() - 2), dataX(hit_point.x() + 2));\r\n                    auto yRange =\r\n                        getIndexItemsInValueRange(idx_y, table, dataY(hit_point.y() + 2), dataY(hit_point.y() - 2));\r\n\r\n                    // work out anything near this point...\r\n                    std::set<AttributeKey> xkeys;\r\n                    for (auto iter = xRange.first; iter != xRange.second; iter++) {\r\n                        xkeys.insert(iter->key);\r\n                    }\r\n                    const AttributeRow *displayRow = nullptr;\r\n                    for (auto iter = yRange.first; iter != yRange.second; iter++) {\r\n                        if (xkeys.find(iter->key) != xkeys.end()) {\r\n                            displayRow = iter->row;\r\n                            break;\r\n                        }\r\n                    }\r\n                    if (displayRow) {\r\n                        // and that it has an appropriate state to display a hover wnd\r\n                        float val = displayRow->getValue(pDoc->m_meta_graph->getDisplayedAttribute());\r\n                        if (val == -1.0f)\r\n                            setToolTip(\"No value\");\r\n                        else if (val != -2.0f)\r\n                            setToolTip(QString(\"%1\").arg(val));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return QObject::eventFilter(object, e);\r\n}\r\n\r\nvoid QPlotView::paintEvent(QPaintEvent *event) {\r\n    QPainter pDC(m_pixmap);\r\n\r\n    QRect rect = QRect(0, 0, width(), height());\r\n    PafColor selcol(SALA_SELECTED_COLOR);\r\n    pDC.setPen(QPen(QBrush(QColor(selcol.redb(), selcol.greenb(), selcol.blueb())), 1, Qt::DotLine, Qt::RoundCap));\r\n\r\n    /*  if (pDC->IsPrinting())\r\n            {\r\n                    PrintOutput(pDC, pDoc);\r\n            }\r\n            else */\r\n    { // if (m_clear)\r\n        if (m_drawdragrect) {\r\n            pDC.setCompositionMode(QPainter::RasterOp_SourceAndNotDestination);\r\n            if (!m_drag_rect_b.isEmpty())\r\n                pDC.drawRect(m_drag_rect_b);\r\n            if (!m_drag_rect_a.isEmpty())\r\n                pDC.drawRect(m_drag_rect_a);\r\n            pDC.setCompositionMode(QPainter::CompositionMode_SourceOver);\r\n            m_drag_rect_b = m_drag_rect_a;\r\n            m_drawdragrect = false;\r\n        } else {\r\n            m_background = ((MainWindow *)m_parent)->m_background;\r\n            m_foreground = ((MainWindow *)m_parent)->m_foreground;\r\n            pDC.fillRect(rect, QBrush(QColor(m_background)));\r\n            // m_clear = false;\r\n            Output(&pDC, pDoc, true);\r\n            OnRedraw(0, 0);\r\n        }\r\n    }\r\n\r\n    QPainter screenPainter(this);\r\n    screenPainter.drawPixmap(0, 0, width(), height(), *m_pixmap);\r\n}\r\n\r\nvoid QPlotView::resizeEvent(QResizeEvent *event) {\r\n    pDoc->m_view[QGraphDoc::VIEW_SCATTER] = this;\r\n    setWindowTitle(pDoc->m_base_title + \":Scatter Plot\");\r\n    m_pixmap = new QPixmap(width(), height());\r\n}\r\n\r\nvoid QPlotView::closeEvent(QCloseEvent *event) {\r\n    pDoc->m_view[QGraphDoc::VIEW_SCATTER] = NULL;\r\n    if (!pDoc->OnCloseDocument(QGraphDoc::VIEW_SCATTER)) {\r\n        pDoc->m_view[QGraphDoc::VIEW_SCATTER] = this;\r\n        event->ignore();\r\n    }\r\n}\r\n\r\nbool QPlotView::Output(QPainter *pDC, QGraphDoc *pDoc, bool screendraw) {\r\n    // this is going to need a timer at somepoint, but for now, it's all very easy to start off:\r\n    auto lock = pDoc->m_meta_graph->getLockDeferred();\r\n    if (!lock.try_lock()) {\r\n        return false;\r\n    }\r\n\r\n    if (pDoc->m_communicator || !pDoc->m_meta_graph->viewingProcessed()) {\r\n        return false;\r\n    }\r\n\r\n    AttributeTable &table = pDoc->m_meta_graph->getAttributeTable();\r\n    AttributeTableHandle &tableHandle = pDoc->m_meta_graph->getAttributeTableHandle();\r\n    LayerManagerImpl &layers = pDoc->m_meta_graph->getLayers();\r\n\r\n    QRect rect = QRect(0, 0, width(), height());\r\n    int mindim = __min(rect.width(), rect.height());\r\n\r\n    // TODO: the calculations are done here for the moment\r\n    // but should be placed in their own helper method\r\n\r\n    int numVisible = 0;\r\n    float minVisibleX = std::numeric_limits<float>::max();\r\n    float maxVisibleX = std::numeric_limits<float>::min();\r\n    float minVisibleY = std::numeric_limits<float>::max();\r\n    float maxVisibleY = std::numeric_limits<float>::min();\r\n\r\n    for (auto iter = table.begin(); iter != table.end(); iter++) {\r\n        if (isObjectVisible(layers, iter->getRow())) {\r\n            numVisible++;\r\n            float xVal = iter->getRow().getValue(m_x_axis);\r\n            float yVal = iter->getRow().getValue(m_y_axis);\r\n            minVisibleX = std::min(minVisibleX, xVal);\r\n            maxVisibleX = std::max(maxVisibleX, xVal);\r\n            minVisibleY = std::min(minVisibleY, yVal);\r\n            maxVisibleY = std::max(maxVisibleY, yVal);\r\n        }\r\n    }\r\n\r\n    if (numVisible == 0)\r\n        m_x_axis = m_y_axis = 0;\r\n\r\n    int spacer = floor(2.0 * sqrt(double(mindim) / double(numVisible != 0 ? numVisible : 1)));\r\n    if (!screendraw && spacer < 4) {\r\n        spacer = 4;\r\n    }\r\n\r\n    // text formatting\r\n    int pointsize;\r\n    if (mindim > 200) {\r\n        pointsize = 100;\r\n    } else {\r\n        pointsize = 50 + mindim / 4;\r\n    }\r\n\r\n    QFont font = QFont(\"Arial\", 10, 10);\r\n    setFont(font);\r\n\r\n    QPen pen = QPen(QBrush(QColor(m_foreground)), 1, Qt::SolidLine, Qt::RoundCap);\r\n    QPen oldpen = pDC->pen();\r\n    pDC->setPen(pen);\r\n\r\n    float minx, miny, maxx, maxy;\r\n    QString str_minx, str_miny, str_maxx, str_maxy;\r\n\r\n    minx = m_data_bounds.bottom_left.x = m_view_origin ? 0.0 : minVisibleX;\r\n    miny = m_data_bounds.bottom_left.y = m_view_origin ? 0.0 : minVisibleY;\r\n    maxx = m_data_bounds.top_right.x = maxVisibleX;\r\n    maxy = m_data_bounds.top_right.y = maxVisibleY;\r\n\r\n    str_minx = QString(tr(\"%1\")).arg(minx);\r\n    str_miny = QString(tr(\"%1\")).arg(miny);\r\n    str_maxx = QString(tr(\"%1\")).arg(maxx);\r\n    str_maxy = QString(tr(\"%1\")).arg(maxy);\r\n\r\n    // now work out the drawing window for\r\n    QSize sizex = QSize(str_maxx.length() * 7, 16);\r\n    QSize sizey = QSize(str_miny.length() * 7, 16);\r\n    QSize sizey2 = QSize(str_maxy.length() * 7, 16);\r\n    if (sizey2.width() > sizey.width()) {\r\n        sizey.rwidth() = sizey2.width();\r\n    }\r\n    // doesn't matter which, just want a height:\r\n    int texth = sizex.height();\r\n\r\n    int xaxis_pos = 99 * rect.height() / 100 - 2 * texth;\r\n    int yaxis_pos = rect.width() / 100 + sizey.width() + texth;\r\n    int miny_pos = xaxis_pos - texth;\r\n    m_screen_bounds.setTop(miny_pos);\r\n    int maxy_pos = rect.height() / 100 + texth / 2;\r\n    m_screen_bounds.setBottom(maxy_pos);\r\n    int minx_pos = yaxis_pos + texth;\r\n    m_screen_bounds.setLeft(minx_pos);\r\n    int maxx_pos = 99 * rect.width() / 100 - sizex.width() / 2;\r\n    m_screen_bounds.setRight(maxx_pos);\r\n\r\n    int width = maxx_pos - minx_pos;\r\n    if (minx == maxx) {\r\n        minx_pos = maxx_pos = minx_pos + width / 2;\r\n        m_screen_bounds.setRight(minx_pos);\r\n        m_screen_bounds.setLeft(minx_pos);\r\n        width = 0;\r\n    }\r\n    int height = maxy_pos - miny_pos;\r\n    if (miny == maxy) {\r\n        miny_pos = maxy_pos = miny_pos + height / 2;\r\n        m_screen_bounds.setBottom(miny_pos);\r\n        m_screen_bounds.setTop(miny_pos);\r\n        height = 0;\r\n    }\r\n\r\n    pDC->setPen(pen);\r\n    pDC->drawText(minx_pos - 50, 99 * rect.height() / 100 - texth, 100, 16, Qt::AlignCenter, str_minx);\r\n    if (minx != maxx) {\r\n        pDC->drawText(maxx_pos - 50, 99 * rect.height() / 100 - texth, 100, 16, Qt::AlignCenter, str_maxx);\r\n    }\r\n\r\n    pDC->drawText(yaxis_pos - texth - 100, miny_pos - texth / 2, 100, 16, Qt::AlignRight, str_miny);\r\n    if (miny != maxy) {\r\n        pDC->drawText(yaxis_pos - texth - 100, maxy_pos - texth / 2, 100, 16, Qt::AlignRight, str_maxy);\r\n    }\r\n\r\n    pDC->drawLine(QPoint(yaxis_pos - texth / 2, miny_pos), QPoint(yaxis_pos, miny_pos));\r\n    if (miny != maxy) {\r\n        pDC->drawLine(QPoint(yaxis_pos, miny_pos), QPoint(yaxis_pos, maxy_pos));\r\n        pDC->drawLine(QPoint(yaxis_pos, maxy_pos), QPoint(yaxis_pos - texth / 2, maxy_pos));\r\n    }\r\n\r\n    pDC->drawLine(QPoint(minx_pos, xaxis_pos + texth / 2), QPoint(minx_pos, xaxis_pos));\r\n    if (minx != maxx) {\r\n        pDC->drawLine(QPoint(minx_pos, xaxis_pos), QPoint(maxx_pos, xaxis_pos));\r\n        pDC->drawLine(QPoint(maxx_pos, xaxis_pos), QPoint(maxx_pos, xaxis_pos + texth / 2));\r\n    }\r\n\r\n    int sel_parity = 0;\r\n    QPen pen2;\r\n    for (const auto &iter : table) {\r\n        if (!isObjectVisible(layers, iter.getRow())) {\r\n            continue;\r\n        }\r\n        float x = iter.getRow().getValue(m_x_axis);\r\n        float y = iter.getRow().getValue(m_y_axis);\r\n        if (!std::isfinite(x) || !std::isfinite(y) || x == -1.0f || y == -1.0f) {\r\n            continue;\r\n        }\r\n        QRgb rgb;\r\n        if (m_view_monochrome) {\r\n            rgb = m_foreground;\r\n        } else {\r\n            PafColor color = dXreimpl::getDisplayColor(iter.getKey(), iter.getRow(), tableHandle);\r\n            rgb = qRgb(color.redb(), color.greenb(), color.blueb());\r\n        }\r\n        int tempspacer = spacer;\r\n        if (iter.getRow().isSelected()) {\r\n            tempspacer = (spacer + 1) * 2 - 1;\r\n            if (m_view_monochrome) {\r\n                rgb = qRgb(0xff, 0, 0);\r\n            }\r\n        }\r\n        if (tempspacer == 0) {\r\n            tempspacer = 1;\r\n        }\r\n        if (!m_view_monochrome) {\r\n            pen2 = QPen(QBrush(QColor(rgb)), spacer, Qt::SolidLine, Qt::FlatCap);\r\n            // pDC->setPen(QPen(QBrush(QColor(rgb)), spacer, Qt::SolidLine, Qt::FlatCap));\r\n        } else if (sel_parity != (iter.getRow().isSelected() ? 1 : -1)) {\r\n            pen2 = QPen(QBrush(QColor(rgb)), spacer, Qt::SolidLine, Qt::FlatCap);\r\n            // pDC->setPen(QPen(QBrush(QColor(rgb)), spacer, Qt::SolidLine, Qt::FlatCap));\r\n            sel_parity = (iter.getRow().isSelected() ? 1 : -1);\r\n        }\r\n        pDC->setPen(pen2);\r\n        //\r\n        QPoint point(screenX(x), screenY(y));\r\n        pDC->drawLine(QPoint(point.x() - tempspacer, point.y() - tempspacer),\r\n                      QPoint(point.x() + tempspacer + 1, point.y() + tempspacer + 1));\r\n        pDC->drawLine(QPoint(point.x() - tempspacer, point.y() + tempspacer),\r\n                      QPoint(point.x() + tempspacer + 1, point.y() - tempspacer - 1));\r\n        pDC->setPen(pen);\r\n    }\r\n\r\n    // trend line if reqd\r\n    if (m_view_trend_line) {\r\n        QPoint bl, tr;\r\n        QString string;\r\n        if (m_regression.model(m_data_bounds.bottom_left.x) < m_data_bounds.bottom_left.y) {\r\n            // check line is on page\r\n            if (m_regression.model(m_data_bounds.top_right.x) > m_data_bounds.bottom_left.y) {\r\n                bl = QPoint(screenX(m_regression.invmodel(m_data_bounds.bottom_left.y)), m_screen_bounds.top());\r\n                if (m_regression.model(m_data_bounds.top_right.x) < m_data_bounds.top_right.y) {\r\n                    tr = QPoint(m_screen_bounds.right(), screenY(m_regression.model(m_data_bounds.top_right.x)));\r\n                } else {\r\n                    tr = QPoint(screenX(m_regression.invmodel(m_data_bounds.top_right.y)), m_screen_bounds.bottom());\r\n                }\r\n                pDC->drawLine(bl, tr);\r\n            }\r\n        } else if (m_regression.model(m_data_bounds.bottom_left.x) > m_data_bounds.top_right.y) {\r\n            // check line is on page\r\n            if (m_regression.model(m_data_bounds.top_right.x) < m_data_bounds.top_right.y) {\r\n                bl = QPoint(screenX(m_regression.invmodel(m_data_bounds.bottom_left.x)), m_screen_bounds.bottom());\r\n                if (m_regression.model(m_data_bounds.top_right.x) > m_data_bounds.bottom_left.x) {\r\n                    tr = QPoint(m_screen_bounds.right(), screenY(m_regression.model(m_data_bounds.top_right.x)));\r\n                } else {\r\n                    tr = QPoint(screenX(m_regression.invmodel(m_data_bounds.top_right.y)), m_screen_bounds.top());\r\n                }\r\n                pDC->drawLine(bl, tr);\r\n            }\r\n        } else {\r\n            bl = QPoint(m_screen_bounds.left(), screenY(m_regression.model(m_data_bounds.bottom_left.x)));\r\n            double trv = m_regression.model(m_data_bounds.top_right.x);\r\n            if (trv >= m_data_bounds.bottom_left.y && trv <= m_data_bounds.top_right.y) {\r\n                string += \" v1\";\r\n                tr = QPoint(m_screen_bounds.right(), screenY(trv));\r\n            } else if (m_regression.b() > 0) { // upward inclined\r\n                string += \" v2\";\r\n                tr = QPoint(screenX(m_regression.invmodel(m_data_bounds.top_right.y)), m_screen_bounds.bottom());\r\n            } else { // downward inclined\r\n                string += \" v3\";\r\n                tr = QPoint(screenX(m_regression.invmodel(m_data_bounds.bottom_left.y)), m_screen_bounds.top());\r\n            }\r\n            pDC->drawLine(bl, tr);\r\n        }\r\n    }\r\n\r\n    QString string;\r\n    int textpos = texth;\r\n    if (m_view_rsquared) {\r\n        // set text formating\r\n        // hope ascii superscript 2 in place!\r\n        string = QString(tr(\"R\\xb2 = %1\").arg(sqr(m_regression.r())));\r\n        pDC->drawText(QPointF(rect.width() - string.length() * 7, textpos), string);\r\n        textpos += texth;\r\n    }\r\n    if (m_view_equation) {\r\n        if (m_regression.a() >= 0) {\r\n            string = QString(tr(\"y = %1 x + %1\").arg(m_regression.b()).arg(m_regression.a()));\r\n        } else {\r\n            string = QString(tr(\"y = %1 x - %1\").arg(m_regression.b()).arg(fabs(m_regression.a())));\r\n        }\r\n        pDC->drawText(QPointF(rect.width() - string.length() * 7, textpos), string);\r\n    }\r\n\r\n    QString xlabel(table.getColumnName(m_x_axis).c_str());\r\n    pDC->drawText(QPointF(width / 2 + minx_pos, 99 * rect.height() / 100 - texth), xlabel);\r\n\r\n    QString ylabel(table.getColumnName(m_y_axis).c_str());\r\n    // this is last to avoid switch between hfont and vfont\r\n    QMatrix matrix;\r\n    matrix.translate(sizey.width(), rect.height() / 2 + ylabel.length() * 7 / 2);\r\n    matrix.rotate(270);\r\n    pDC->setMatrix(matrix);\r\n\r\n    pDC->drawText(QPointF(sizey.width() / 2, height + miny_pos), ylabel);\r\n\r\n    pDC->setPen(oldpen);\r\n\r\n    return true;\r\n}\r\n\r\n// QPlotView message handlers\r\n\r\nint QPlotView::OnRedraw(int wParam, int lParam) {\r\n    if (pDoc->GetRemenuFlag(QGraphDoc::VIEW_SCATTER)) {\r\n        pDoc->SetRemenuFlag(QGraphDoc::VIEW_SCATTER, false);\r\n        MainWindow *m_Frm = (MainWindow *)pDoc->m_mainFrame;\r\n        m_Frm->RedoPlotViewMenu(pDoc);\r\n    }\r\n    if (pDoc->GetRedrawFlag(QGraphDoc::VIEW_SCATTER) != QGraphDoc::REDRAW_DONE) {\r\n\r\n        if (!pDoc->m_communicator) {\r\n\r\n            m_queued_redraw = false;\r\n\r\n            while (!pDoc->SetRedrawFlag(QGraphDoc::VIEW_SCATTER, QGraphDoc::REDRAW_DONE)) {\r\n                // prefer waitformultipleobjects here\r\n                //            Sleep(1);\r\n            }\r\n        } else {\r\n            //         killTimer(Tid_redraw);\r\n            //         Tid_redraw = startTimer(100);\r\n            m_queued_redraw = true;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nvoid QPlotView::keyPressEvent(QKeyEvent *e) { char key = e->key(); }\r\n\r\nvoid QPlotView::RedoIndices() {\r\n    if (pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessed()) {\r\n        AttributeTable &table = pDoc->m_meta_graph->getAttributeTable();\r\n        idx_x = makeAttributeIndex(table, m_x_axis);\r\n        idx_y = makeAttributeIndex(table, m_y_axis);\r\n    }\r\n}\r\n\r\nvoid QPlotView::timerEvent(QTimerEvent *event) {\r\n    if (event->timerId() == Tid_redraw) {\r\n\r\n        if (m_queued_redraw) {\r\n\r\n            // Internal own redraw\r\n            OnRedraw(0, 0);\r\n        }\r\n    }\r\n}\r\n\r\nvoid QPlotView::OnViewTrendLine() {\r\n    if (m_view_trend_line) {\r\n        m_view_trend_line = false;\r\n    } else {\r\n        m_view_trend_line = true;\r\n    }\r\n    update();\r\n}\r\n\r\nvoid QPlotView::OnViewRsquared() {\r\n    if (m_view_rsquared) {\r\n        m_view_rsquared = false;\r\n    } else {\r\n        m_view_rsquared = true;\r\n    }\r\n    update();\r\n}\r\n\r\nvoid QPlotView::OnViewColor() {\r\n    if (m_view_monochrome) {\r\n        m_view_monochrome = false;\r\n    } else {\r\n        m_view_monochrome = true;\r\n    }\r\n    update();\r\n}\r\n\r\nvoid QPlotView::SetAxis(int axis, int col, bool reset) {\r\n    if (axis == 0) {\r\n        if (m_x_axis != col) {\r\n            m_x_axis = col;\r\n        }\r\n    } else {\r\n        if (m_y_axis != col) {\r\n            m_y_axis = col;\r\n        }\r\n    }\r\n    if (reset) {\r\n        RedoIndices();\r\n        ResetRegression();\r\n    }\r\n}\r\n\r\nvoid QPlotView::ResetRegression() {\r\n    m_regression.clear();\r\n    if (m_x_axis != -1 && m_y_axis != -1 && pDoc->m_meta_graph && pDoc->m_meta_graph->viewingProcessed()) {\r\n        AttributeTable &table = pDoc->m_meta_graph->getAttributeTable();\r\n        for (auto iter = table.begin(); iter != table.end(); iter++) {\r\n            if (isObjectVisible(pDoc->m_meta_graph->getLayers(), iter->getRow())) {\r\n                float x = iter->getRow().getValue(m_x_axis);\r\n                float y = iter->getRow().getValue(m_y_axis);\r\n                if (std::isfinite(x) && std::isfinite(y) && x != -1.0f && y != -1.0f) {\r\n                    m_regression.add(x, y);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid QPlotView::mousePressEvent(QMouseEvent *e) {\r\n    switch (e->button()) {\r\n    case Qt::LeftButton:\r\n        pressed_nFlags = MK_LBUTTON;\r\n        break;\r\n    case Qt::RightButton:\r\n        pressed_nFlags = MK_RBUTTON;\r\n        break;\r\n    default:\r\n        break;\r\n    }\r\n    m_mouse_point = e->pos();\r\n    m_drag_rect_a = QRect(0, 0, 0, 0);\r\n    m_drag_rect_b = QRect(0, 0, 0, 0);\r\n    m_selecting = true;\r\n    m_drawdragrect = true;\r\n    update();\r\n}\r\n\r\nvoid QPlotView::mouseMoveEvent(QMouseEvent *e) {\r\n    if (pressed_nFlags == MK_RBUTTON)\r\n        return;\r\n    QPoint point = e->pos();\r\n    if (m_selecting) {\r\n        int x1, y1, x2, y2;\r\n        if (m_mouse_point.x() > point.x()) {\r\n            x1 = point.x();\r\n            x2 = m_mouse_point.x();\r\n        } else {\r\n            x1 = m_mouse_point.x();\r\n            x2 = point.x();\r\n        }\r\n\r\n        if (m_mouse_point.y() > point.y()) {\r\n            y1 = point.y();\r\n            y2 = m_mouse_point.y();\r\n        } else {\r\n            y1 = m_mouse_point.y();\r\n            y2 = point.y();\r\n        }\r\n        m_drag_rect_a = QRect(x1, y1, x2 - x1, y2 - y1);\r\n        m_drawdragrect = true;\r\n        update();\r\n    }\r\n    hit_point = point;\r\n}\r\n\r\nvoid QPlotView::mouseReleaseEvent(QMouseEvent *e) {\r\n    if (pressed_nFlags == MK_RBUTTON) {\r\n        pDoc->m_meta_graph->clearSel();\r\n        pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_SELECTION);\r\n        return;\r\n    }\r\n    m_selecting = false;\r\n\r\n    AttributeTable &table = pDoc->m_meta_graph->getAttributeTable();\r\n\r\n    auto xRange =\r\n        getIndexItemsInValueRange(idx_x, table, dataX(m_drag_rect_a.left() - 2), dataX(m_drag_rect_a.right() + 2));\r\n    auto yRange =\r\n        getIndexItemsInValueRange(idx_y, table, dataY(m_drag_rect_a.bottom() + 2), dataY(m_drag_rect_a.top() - 2));\r\n\r\n    // Stop drag rect...\r\n    m_drag_rect_a = QRect(0, 0, 0, 0);\r\n    m_drawdragrect = false;\r\n    update();\r\n\r\n    // work out selection\r\n    std::set<AttributeKey> xkeys;\r\n    for (auto iter = xRange.first; iter != xRange.second; iter++) {\r\n        xkeys.insert(iter->key);\r\n    }\r\n    std::vector<int> finalkeys;\r\n    for (auto iter = yRange.first; iter != yRange.second; iter++) {\r\n        if (xkeys.find(iter->key) != xkeys.end()) {\r\n            finalkeys.push_back(iter->key.value);\r\n        }\r\n    }\r\n\r\n    // redraw selection set\r\n    bool add = false;\r\n    if (pressed_nFlags & MK_SHIFT) {\r\n        add = true;\r\n    }\r\n    pDoc->m_meta_graph->setSelSet(finalkeys, add);\r\n    pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_SELECTION);\r\n}\r\n\r\nvoid QPlotView::OnViewOrigin() {\r\n    m_view_origin = !m_view_origin;\r\n    update();\r\n}\r\n\r\nvoid QPlotView::OnViewEquation() {\r\n    m_view_equation = !m_view_equation;\r\n    update();\r\n}\r\n"
  },
  {
    "path": "depthmapX/views/plotview/plotview.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// depthmapX - spatial network analysis platform\r\n\r\n#include <QWidget>\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// PlotView view\r\n\r\n// class CHoverWnd;\r\n\r\n#include \"qpixmap.h\"\r\n#include <QPoint>\r\n#include <QRect>\r\n#include <QSize>\r\n\r\n#include \"GraphDoc.h\"\r\n#include \"genlib/linreg.h\"\r\n\r\n#define MK_LBUTTON 0x0001\r\n#define MK_RBUTTON 0x0002\r\n#define MK_SHIFT 0x0004\r\n#define MK_CONTROL 0x0008\r\n#define MK_MBUTTON 0x0010\r\n\r\nclass QPlotView : public QWidget {\r\n    Q_OBJECT\r\n\r\n    // Attributes\r\n  public:\r\n    QGraphDoc *pDoc;\r\n    QPlotView();\r\n    QSize sizeHint() const;\r\n\r\n    int m_x_axis;\r\n    int m_y_axis;\r\n    int curr_x;\r\n    int curr_y;\r\n\r\n    std::vector<AttributeIndexItem> idx_x;\r\n    std::vector<AttributeIndexItem> idx_y;\r\n    void RedoIndices();\r\n\r\n    bool m_queued_redraw;\r\n    bool m_view_origin;\r\n    bool m_view_trend_line;\r\n    bool m_view_equation;\r\n    bool m_view_rsquared;\r\n    bool m_view_monochrome;\r\n\r\n    LinReg<float> m_regression;\r\n\r\n    //\r\n    double dataX(int x);\r\n    int screenX(double x);\r\n    double dataY(int x);\r\n    int screenY(double x);\r\n    //\r\n    QtRegion m_data_bounds;\r\n    QRect m_screen_bounds;\r\n    //\r\n    QPoint m_mouse_point;\r\n    QRect m_drag_rect_a;\r\n    QRect m_drag_rect_b;\r\n    bool m_selecting;\r\n    bool m_drawdragrect;\r\n    QRgb m_background;\r\n    QRgb m_foreground;\r\n\r\n    void *m_parent; // MainWindow*\r\n\r\n    // Operations\r\n  public:\r\n    void SetAxis(int axis, int col, bool reset);\r\n    void ResetRegression();\r\n\r\n    bool Output(QPainter *pDC, QGraphDoc *pDoc, bool screendraw);\r\n\r\n    // this is a tells us how many 100ms ticks have passed since the mouse moved\r\n    int Tid_redraw;\r\n\r\n    void OnViewTrendLine();\r\n    void OnViewRsquared();\r\n    void OnViewColor();\r\n    void OnViewOrigin();\r\n    void OnViewEquation();\r\n    int OnRedraw(int wParam, int lParam);\r\n    void OnLButtonDown(bool nFlags, QPoint point);\r\n    void OnMouseMove(bool nFlags, QPoint point);\r\n    void OnLButtonUp(bool nFlags, QPoint point);\r\n\r\n    // Implementation\r\n  protected:\r\n    virtual bool eventFilter(QObject *object, QEvent *e);\r\n    virtual void keyPressEvent(QKeyEvent *event);\r\n    virtual void paintEvent(QPaintEvent *event);\r\n    virtual void resizeEvent(QResizeEvent *event);\r\n    virtual void mouseMoveEvent(QMouseEvent *event);\r\n    virtual void mousePressEvent(QMouseEvent *event);\r\n    virtual void mouseReleaseEvent(QMouseEvent *event);\r\n    virtual void closeEvent(QCloseEvent *event);\r\n    virtual void timerEvent(QTimerEvent *event);\r\n\r\n  private:\r\n    QPixmap *m_pixmap;\r\n};\r\n"
  },
  {
    "path": "depthmapX/views/tableview/tableview.cpp",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2019, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"tableview.h\"\r\n\r\n#include \"mainwindow.h\"\r\n\r\n#include <QKeyEvent>\r\n#include <QtCore/QDebug>\r\n#include <QtCore/QEvent>\r\n#include <QtGui/QFocusEvent>\r\n#include <QtWidgets/QHeaderView>\r\n#include <QtWidgets/QLayout>\r\n#include <QtWidgets/QMenu>\r\n#include <QtWidgets/QMessageBox>\r\n#include <QtWidgets/QTableWidgetItem>\r\n\r\n#define ROW_HEIGHT 20\r\n#define PG_COUNT 40\r\n\r\nTableView::TableView(Settings &settings, QWidget *parent, QGraphDoc *p) : QTableWidget(parent) {\r\n    m_mainWindow = parent;\r\n    pDoc = p;\r\n    m_from = m_curr_row = 0;\r\n\r\n    connect(this, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(itemChanged(QTableWidgetItem *)));\r\n\r\n    connect(this, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(itemEditChanged(QTableWidgetItem *)));\r\n\r\n    RedoTable();\r\n    setWindowIcon(QIcon(tr(\":/images/cur/icon-1-5.png\")));\r\n    setWindowTitle(pDoc->m_base_title + \":Table View\");\r\n\r\n    setVerticalScrollMode(QAbstractItemView::ScrollPerItem);\r\n\r\n    m_protect_edit = false;\r\n\r\n    m_initialSize = settings.readSetting(SettingTag::depthmapViewSize, QSize(2000, 2000)).toSize();\r\n}\r\n\r\nvoid TableView::focusInEvent(QFocusEvent *e) {\r\n    RedoTable();\r\n    pDoc->SetRedrawFlag(QGraphDoc::VIEW_TABLE, QGraphDoc::REDRAW_DONE);\r\n    QTableWidget::focusInEvent(e);\r\n}\r\n\r\nvoid TableView::RedoTable() {\r\n    clear();\r\n\r\n    if (pDoc->m_meta_graph->viewingProcessed()) {\r\n        const AttributeTable &table = pDoc->m_meta_graph->getAttributeTable();\r\n\r\n        m_column_count = table.getNumColumns();\r\n        setColumnCount(m_column_count + 1);\r\n        connect(horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(colum_Sort(int)));\r\n        verticalHeader()->hide();\r\n\r\n        QTableWidgetItem *Item = new QTableWidgetItem(\"Ref Number\");\r\n        Item->setTextAlignment(Qt::AlignLeft);\r\n        setHorizontalHeaderItem(0, Item);\r\n\r\n        for (int i = 0; i < m_column_count; i++) {\r\n            QTableWidgetItem *Item = new QTableWidgetItem(QString(\"%1\").arg(table.getColumnName(i).c_str()));\r\n            Item->setTextAlignment(Qt::AlignLeft);\r\n            setHorizontalHeaderItem(i + 1, Item);\r\n        }\r\n\r\n        m_row_count = table.getNumRows();\r\n        setRowCount(m_row_count);\r\n        PrepareCache(m_curr_row);\r\n    }\r\n}\r\n\r\nvoid TableView::scrollContentsBy(int dx, int dy) {\r\n    if (dy != 0) {\r\n        PrepareCache(m_curr_row - dy);\r\n        m_curr_row -= dy;\r\n    }\r\n    QTableWidget::scrollContentsBy(dx, dy);\r\n}\r\n\r\nQSize TableView::sizeHint() const { return m_initialSize; }\r\n\r\nvoid TableView::PrepareCache(int to) {\r\n    m_updating = true;\r\n    QTableWidgetItem *Item;\r\n    const AttributeTableHandle &tableHandle = pDoc->m_meta_graph->getAttributeTableHandle();\r\n    auto &index = tableHandle.getTableIndex();\r\n\r\n    int diff = PG_COUNT;\r\n    if (to + PG_COUNT >= m_row_count) {\r\n        diff = m_row_count - to;\r\n    }\r\n    for (int i = 0; i < diff; i++) {\r\n        auto &indexItem = index[to + i];\r\n        for (int j = 0; j < m_column_count + 1; j++) {\r\n            if (!j) {\r\n                Item = item(to + i, j);\r\n                if (Item) {\r\n                    if (indexItem.row->isSelected())\r\n                        Item->setCheckState(Qt::Checked);\r\n                    else\r\n                        Item->setCheckState(Qt::Unchecked);\r\n                } else {\r\n                    Item = new QTableWidgetItem(QString(\"%1\").arg(indexItem.key.value));\r\n                    if (indexItem.row->isSelected())\r\n                        Item->setCheckState(Qt::Checked);\r\n                    else\r\n                        Item->setCheckState(Qt::Unchecked);\r\n                    setItem(to + i, 0, Item);\r\n                    continue;\r\n                }\r\n            }\r\n            if (!item(to + i, j)) {\r\n                Item = new QTableWidgetItem(QString(\"%1\").arg(indexItem.row->getValue(j - 1)));\r\n                setRowHeight(to + i, ROW_HEIGHT);\r\n                setItem(to + i, j, Item);\r\n            }\r\n        }\r\n    }\r\n    m_updating = false;\r\n}\r\n\r\nvoid TableView::itemChanged(QTableWidgetItem *item) {\r\n    if (m_updating)\r\n        return;\r\n    int row = item->row();\r\n    int col = item->column();\r\n    MetaGraph *graph = pDoc->m_meta_graph;\r\n    AttributeTable &table = graph->getAttributeTable();\r\n    AttributeTableHandle &tableHandle = graph->getAttributeTableHandle();\r\n    auto &index = tableHandle.getTableIndex();\r\n    if (col == 0) {\r\n        std::vector<int> x;\r\n        x.push_back(index[row].key.value);\r\n        pDoc->m_meta_graph->setSelSet(x);\r\n        pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS, QGraphDoc::NEW_SELECTION, this);\r\n        PrepareCache(m_curr_row);\r\n    } else {\r\n        double value = -1;\r\n        try {\r\n            value = std::stod(item->text().toStdString());\r\n        } catch (std::invalid_argument) {\r\n            QMessageBox::warning(this, tr(\"Warning\"), tr(\"Cannot convert text to number\"), QMessageBox::Ok,\r\n                                 QMessageBox::Ok);\r\n            return;\r\n        }\r\n\r\n        if (graph && graph->viewingProcessed()) {\r\n            // go for the change:\r\n            double value2 = index[row].row->getValue(col - 1);\r\n            if (value2 == 0 || fabs((value / value2) - 1.0) > 1e-5) {\r\n                index[row].mutable_row->setValue(col - 1, value);\r\n                pDoc->modifiedFlag = true;\r\n            }\r\n\r\n            RedoTable();\r\n            // note: this as caller will prevent us from redrawing ourself:\r\n            // could be either new data or new selection, just go for a big redraw:\r\n            pDoc->SetRedrawFlag(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_GRAPH, QGraphDoc::NEW_DATA, this);\r\n        }\r\n    }\r\n}\r\n\r\nvoid TableView::colum_Sort(int col_id) {\r\n    if (col_id - 1 != pDoc->m_meta_graph->getDisplayedAttribute()) {\r\n        pDoc->m_meta_graph->setDisplayedAttribute(col_id - 1);\r\n        ((MainWindow *)m_mainWindow)->chooseAttributeOnIndex(col_id);\r\n        clearContents();\r\n        PrepareCache(m_curr_row);\r\n        return;\r\n\r\n        RedoTable();\r\n    }\r\n}\r\n\r\nvoid TableView::itemEditChanged(QTableWidgetItem *item) {\r\n    int row = item->row();\r\n    int col = item->column();\r\n\r\n    if (col > 0 && col < pDoc->m_meta_graph->getAttributeTable().getNumColumns() + 1) {\r\n        // don't let them edit a locked attribute\r\n        if (pDoc->m_meta_graph->getAttributeTable().getColumn(col - 1).isLocked()) {\r\n            QMessageBox::warning(this, tr(\"Warning\"), tr(\"This column is locked and cannot be edited\"),\r\n                                 QMessageBox::Ok, QMessageBox::Ok);\r\n        }\r\n    }\r\n}\r\n\r\nvoid TableView::closeEvent(QCloseEvent *event) {\r\n    pDoc->m_view[QGraphDoc::VIEW_TABLE] = NULL;\r\n    if (!pDoc->OnCloseDocument(QGraphDoc::VIEW_TABLE)) {\r\n        pDoc->m_view[QGraphDoc::VIEW_TABLE] = this;\r\n        event->ignore();\r\n    }\r\n}\r\n\r\nvoid TableView::resizeEvent(QResizeEvent *event) {\r\n    QTableView::resizeEvent(event);\r\n    pDoc->m_view[QGraphDoc::VIEW_TABLE] = this;\r\n}\r\n"
  },
  {
    "path": "depthmapX/views/tableview/tableview.h",
    "content": "// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2019, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"GraphDoc.h\"\r\n#include \"settings.h\"\r\n#include <QTableWidget>\r\n\r\nclass QEvent;\r\nclass QTableWidgetItem;\r\n\r\nclass TableView : public QTableWidget {\r\n    Q_OBJECT\r\n\r\n  public:\r\n    TableView(Settings &settings, QWidget *parent = 0, QGraphDoc *p = 0);\r\n    QSize sizeHint() const;\r\n\r\n    int m_column_count;\r\n    int m_row_count;\r\n    int m_from;\r\n    int m_curr_row;\r\n    QWidget *m_mainWindow;\r\n    QGraphDoc *pDoc;\r\n    bool m_protect_edit;\r\n    void RedoTable();\r\n\r\n  private slots:\r\n    void itemChanged(QTableWidgetItem *item);\r\n    void itemEditChanged(QTableWidgetItem *);\r\n    void colum_Sort(int sort);\r\n\r\n  protected:\r\n    virtual void closeEvent(QCloseEvent *event);\r\n    virtual void resizeEvent(QResizeEvent *event);\r\n    virtual void scrollContentsBy(int dx, int dy);\r\n    void focusInEvent(QFocusEvent *e);\r\n\r\n  private:\r\n    void PrepareCache(int to);\r\n\r\n    bool m_custom;\r\n    QSize m_initialSize;\r\n    bool m_updating = false;\r\n};\r\n"
  },
  {
    "path": "depthmapX/views/viewhelpers.cpp",
    "content": "#include \"viewhelpers.h\"\n#include <time.h>\n\nnamespace ViewHelpers {\n    Point2f calculateCenter(const QPoint& point, const QPoint &oldCentre, double factor)\n    {\n        int diffX = oldCentre.x() - point.x();\n        int diffY = oldCentre.y() - point.y();\n        return Point2f(point.x() + double(diffX) * factor,\n                       point.y() + double(diffY) * factor);\n    }\n\n    std::string getCurrentDate()\n    {\n        time_t now = time(NULL);\n        char timeString[11];\n        strftime(timeString, 11, \"%Y/%m/%d\", localtime(&now));\n        return timeString;\n    }\n\n}\n"
  },
  {
    "path": "depthmapX/views/viewhelpers.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#ifndef DEPTHMAPX_VIEWHELPERS_H\n#define DEPTHMAPX_VIEWHELPERS_H\n\n#include <QPoint>\n#include \"genlib/p2dpoly.h\"\n#include <string>\n\nnamespace ViewHelpers\n{\n    Point2f calculateCenter(const QPoint& point, const QPoint &oldCentre, double factor);\n    std::string getCurrentDate();\n}\n\n\n#endif // VIEWHELPERS_H\n"
  },
  {
    "path": "depthmapXTest/CMakeLists.txt",
    "content": "set(depthmapXTest depthmapXTest)\n\n# Find includes in corresponding build directories\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n# Instruct CMake to run moc automatically when needed\nset(CMAKE_AUTOMOC ON)\n# Create code from a list of Qt designer ui files\n# set(CMAKE_AUTOUIC ON)\n# set(CMAKE_AUTORCC ON)\n\n# Find the QtWidgets library\nfind_package(Qt5 COMPONENTS Core Widgets Gui OpenGL REQUIRED)\n\ninclude_directories(${QT})\n\nadd_compile_definitions(_DEPTHMAP)\n\nset(depthmapXTest_SRCS\n    main.cpp\n    testgllines.cpp\n    testgllinesuniform.cpp\n    testglrastertexture.cpp\n    ../depthmapX/views/glview/gllines.h\n    ../depthmapX/views/glview/gllines.cpp\n\t../depthmapX/views/glview/gllinesuniform.h\n\t../depthmapX/views/glview/gllinesuniform.cpp\n\t../depthmapX/views/glview/glrastertexture.h\n\t../depthmapX/views/glview/glrastertexture.cpp)\n\n\ninclude_directories(\"../ThirdParty/Catch\")\n\nset(LINK_LIBS salalib genlib mgraph440)\n\nif(APPLE)\n        add_definitions(-DGL_SILENCE_DEPRECATION)\nendif(APPLE)\n\nadd_executable(${depthmapXTest} ${depthmapXTest_SRCS})\n\nfind_package(OpenGL REQUIRED)\n\ntarget_link_libraries(${depthmapXTest} Qt5::OpenGL salalib genlib OpenGL::GL OpenGL::GLU)\n\n"
  },
  {
    "path": "depthmapXTest/main.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n"
  },
  {
    "path": "depthmapXTest/testgllines.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapX/views/glview/gllines.h\"\n\nTEST_CASE(\"Test GLLines::loadLineData()\", \"\")\n{\n    Point2f line1Start(0,0);\n    Point2f line1End(2,4);\n    PafColor line1colour(255,0,0);\n    Point2f line2Start(1,1);\n    Point2f line2End(3,5);\n    PafColor line2colour(0,255,0);\n\n    std::vector<std::pair<SimpleLine, PafColor>> colouredLines;\n\n    std::pair<SimpleLine, PafColor> colouredLine1 = std::pair<SimpleLine, PafColor> (SimpleLine(line1Start, line1End), line1colour);\n    colouredLines.push_back(colouredLine1);\n\n    std::pair<SimpleLine, PafColor> colouredLine2 = std::pair<SimpleLine, PafColor> (SimpleLine(line2Start, line2End), line2colour);\n    colouredLines.push_back(colouredLine2);\n\n    GLLines gllines;\n    gllines.loadLineData(colouredLines);\n\n    REQUIRE(gllines.vertexCount() == 4);\n}\n"
  },
  {
    "path": "depthmapXTest/testgllinesuniform.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapX/views/glview/gllinesuniform.h\"\n\nTEST_CASE(\"Test GLLinesUniform::loadLineData()\", \"\")\n{\n    Point2f line1Start(0,0);\n    Point2f line1End(2,4);\n\n    Point2f line2Start(1,1);\n    Point2f line2End(3,5);\n\n    std::vector<SimpleLine> lines;\n\n    SimpleLine line1 = SimpleLine(line1Start, line1End);\n    lines.push_back(line1);\n\n    SimpleLine line2 = SimpleLine(line2Start, line2End);\n    lines.push_back(line2);\n\n    QRgb lineColour = qRgb(255,0,0);\n\n    GLLinesUniform gllinesuniform;\n    gllinesuniform.loadLineData(lines, lineColour);\n\n    REQUIRE(gllinesuniform.vertexCount() == 4);\n}\n"
  },
  {
    "path": "depthmapXTest/testglrastertexture.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../depthmapX/views/glview/glrastertexture.h\"\n\nTEST_CASE(\"Test GLRasterTexture::loadRegionData()\", \"\")\n{\n    float bottomLeftX = 0;\n    float bottomLeftY = 0;\n    float topRightX = 2;\n    float topRightY  = 4;\n\n    QRgb lineColour = qRgb(255,0,0);\n\n    GLRasterTexture glrastertexture;\n    glrastertexture.loadRegionData(bottomLeftX, bottomLeftY, topRightX, topRightY);\n\n    REQUIRE(glrastertexture.vertexCount() == 4);\n}\n"
  },
  {
    "path": "depthmapXcli/CMakeLists.txt",
    "content": "set(depthmapXcli depthmapXcli)\n\nset(depthmapXcli_SRCS\n    main.cpp\n    printcommunicator.cpp\n    commandlineparser.cpp\n    runmethods.cpp\n    radiusconverter.cpp\n    vgaparser.cpp\n    linkparser.cpp\n    performancewriter.cpp\n    modeparserregistry.cpp\n    visprepparser.cpp\n    axialparser.cpp\n    parsingutils.cpp\n    agentparser.cpp\n    isovistparser.cpp\n    exportparser.cpp\n    importparser.cpp\n    stepdepthparser.cpp\n    segmentparser.cpp\n    mapconvertparser.cpp)\n\nset(LINK_LIBS salalib genlib mgraph440)\n\nset(modules_cli \"\" CACHE INTERNAL \"modules_cli\" FORCE)\nset(MODULES_GUI FALSE)\nset(MODULES_CLI TRUE)\nset(MODULES_CLI_TEST FALSE)\nset(MODULES_CORE FALSE)\nset(MODULES_CORE_TEST FALSE)\nadd_subdirectory(../modules modules)\n\nadd_executable(${depthmapXcli} ${depthmapXcli_SRCS})\ntarget_link_libraries(${depthmapXcli} ${LINK_LIBS} ${modules_cli} ${modules_core})\n\n"
  },
  {
    "path": "depthmapXcli/agentparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"agentparser.h\"\n#include \"exceptions.h\"\n#include <cstring>\n#include \"radiusconverter.h\"\n#include \"runmethods.h\"\n#include \"parsingutils.h\"\n#include \"salalib/entityparsing.h\"\n#include <sstream>\n\nusing namespace depthmapX;\n\nAgentParser::AgentParser() : m_agentMode(AgentMode::NONE)\n{}\n\nvoid AgentParser::parse(int argc, char *argv[])\n{\n    std::vector<std::string> points;\n    std::string pointFile;\n\n    for ( int i = 1; i < argc;  )\n    {\n\n        if ( std::strcmp (\"-am\", argv[i]) == 0)\n        {\n            if (m_agentMode != AgentMode::NONE)\n            {\n                throw CommandLineException(\"-am can only be used once, modes are mutually exclusive\");\n            }\n            ENFORCE_ARGUMENT(\"-am\", i)\n            if ( std::strcmp(argv[i], \"standard\") == 0 )\n            {\n                m_agentMode = AgentMode::STANDARD;\n            }\n            else if ( std::strcmp(argv[i], \"los-length\") == 0 )\n            {\n                m_agentMode = AgentMode::LOS_LENGTH;\n            }\n            else if ( std::strcmp(argv[i], \"occ-length\") == 0 )\n            {\n                m_agentMode = AgentMode::OCC_LENGTH;\n            }\n            else if ( std::strcmp(argv[i], \"occ-any\") == 0 )\n            {\n                m_agentMode = AgentMode::OCC_ANY;\n            }\n            else if ( std::strcmp(argv[i], \"occ-group-45\") == 0)\n            {\n                m_agentMode = AgentMode::OCC_GROUP_45;\n            }\n            else if ( std::strcmp(argv[i], \"occ-group-60\") == 0)\n            {\n                m_agentMode = AgentMode::OCC_GROUP_60;\n            }\n            else if ( std::strcmp(argv[i], \"occ-furthest\") == 0)\n            {\n                m_agentMode = AgentMode::OCC_FURTHEST;\n            }\n            else if ( std::strcmp(argv[i], \"bin-far-dist\") == 0)\n            {\n                m_agentMode = AgentMode::BIN_FAR_DIST;\n            }\n            else if ( std::strcmp(argv[i], \"bin-angle\") == 0)\n            {\n                m_agentMode = AgentMode::BIN_ANGLE;\n            }\n            else if ( std::strcmp(argv[i], \"bin-far-dist-angle\") == 0)\n            {\n                m_agentMode = AgentMode::BIN_FAR_DIST_ANGLE;\n            }\n            else if ( std::strcmp(argv[i], \"bin-memory\") == 0)\n            {\n                m_agentMode = AgentMode::BIN_MEMORY;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid AGENTS mode: \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp(argv[i], \"-ats\") == 0 )\n        {\n            if (m_totalSystemTimestemps > 0)\n            {\n                throw CommandLineException(\"-ats can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-ats\", i)\n            if (!has_only_digits(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-ats must be a number >0, got \") + argv[i]);\n            }\n            m_totalSystemTimestemps = std::atoi(argv[i]);\n            if (m_totalSystemTimestemps <= 0)\n            {\n                throw CommandLineException(std::string(\"-ats must be a number >0, got \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp(argv[i], \"-arr\") == 0 )\n        {\n            if (m_releaseRate > 0)\n            {\n                throw CommandLineException(\"-arr can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-arr\", i)                   \n            if (!has_only_digits_dots_commas(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-arr must be a number >0, got \") + argv[i]);\n            }\n            m_releaseRate = std::atof(argv[i]);\n            if (m_releaseRate <= 0)\n            {\n                throw CommandLineException(std::string(\"-arr must be a number >0, got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-atrails\") == 0)\n        {\n            if (m_recordTrailsForAgents >= 0)\n            {\n                throw CommandLineException(\"-atrails can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-atrails\", i)\n            if (!has_only_digits(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-atrails must be a number >=1 or 0 for all (max possible = 50), got \") + argv[i]);\n            }\n            m_recordTrailsForAgents = std::atoi(argv[i]);\n            if (m_recordTrailsForAgents < 0)\n            {\n                throw CommandLineException(std::string(\"-atrails must be a number >=1 or 0 for all (max possible = 50), got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-afov\") == 0)\n        {\n            if (m_agentFOV > 0)\n            {\n                throw CommandLineException(\"-afov can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-afov\", i)\n            if (!has_only_digits(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-afov must be a number between 1 and 32, got \") + argv[i]);\n            }\n            m_agentFOV = std::atoi(argv[i]);\n            if (m_agentFOV <= 0 || m_agentFOV > 32)\n            {\n                throw CommandLineException(std::string(\"-afov must be a number between 1 and 32, got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-asteps\") == 0)\n        {\n            if (m_agentStepsBeforeTurnDecision > 0)\n            {\n                throw CommandLineException(\"-asteps can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-asteps\", i)\n            if (!has_only_digits(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-asteps must be a number >0, got \") + argv[i]);\n            }\n            m_agentStepsBeforeTurnDecision = std::atoi(argv[i]);\n            if (m_agentStepsBeforeTurnDecision <= 0)\n            {\n                throw CommandLineException(std::string(\"-asteps must be a number >0, got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-alife\") == 0)\n        {\n            if (m_agentLifeTimesteps > 0)\n            {\n                throw CommandLineException(\"-alife can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-alife\", i)\n            if (!has_only_digits(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-alife must be a number >0, got \") + argv[i]);\n            }\n            m_agentLifeTimesteps = std::atoi(argv[i]);\n            if (m_agentLifeTimesteps <= 0)\n            {\n                throw CommandLineException(std::string(\"-alife must be a number >0, got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-alocseed\") == 0)\n        {\n            if (!pointFile.empty())\n            {\n                throw CommandLineException(\"-alocseed cannot be used together with -alocfile\");\n            }\n            if (!points.empty())\n            {\n                throw CommandLineException(\"-alocseed cannot be used together with -aloc\");\n            }\n            ENFORCE_ARGUMENT(\"-alocseed\", i)\n            if (!has_only_digits(argv[i]))\n            {\n                std::stringstream message;\n                message << \"Invalid starting location seed provided (\"\n                        << argv[i]\n                        << \"). Should only contain digits\"\n                        << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            m_randomReleaseLocationSeed = std::atof(argv[i]);\n            if (m_randomReleaseLocationSeed < 0 || m_randomReleaseLocationSeed > 10)\n            {\n                throw CommandLineException(std::string(\"-alocseed must be a number between 0 and 10, got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-alocfile\") == 0)\n        {\n            if (!points.empty())\n            {\n                throw CommandLineException(\"-alocfile cannot be used together with -aloc\");\n            }\n            if (m_randomReleaseLocationSeed > -1)\n            {\n                throw CommandLineException(\"-alocfile cannot be used together with -alocseed\");\n            }\n            ENFORCE_ARGUMENT(\"-alocfile\", i)\n            pointFile = argv[i];\n        }\n        else if (std::strcmp(argv[i], \"-aloc\") == 0)\n        {\n            if (!pointFile.empty())\n            {\n                throw CommandLineException(\"-aloc cannot be used together with -alocfile\");\n            }\n            if (m_randomReleaseLocationSeed > -1)\n            {\n                throw CommandLineException(\"-aloc cannot be used together with -alocseed\");\n            }\n            ENFORCE_ARGUMENT(\"-aloc\", i)\n            if (!has_only_digits_dots_commas(argv[i]))\n            {\n                std::stringstream message;\n                message << \"Invalid starting point provided (\"\n                        << argv[i]\n                        << \"). Should only contain digits dots and commas\"\n                        << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            points.push_back(argv[i]);\n        }\n        else if (std::strcmp(argv[i], \"-ot\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-ot\", i)\n            if ( std::strcmp(argv[i], \"graph\") == 0 )\n            {\n                if(std::find(m_outputTypes.begin(), m_outputTypes.end(), OutputType::GRAPH) != m_outputTypes.end()) {\n                     throw CommandLineException(\"Same output type argument (graph) provided twice\");\n                }\n                m_outputTypes.push_back(OutputType::GRAPH);\n            }\n            else if ( std::strcmp(argv[i], \"gatecounts\") == 0 )\n            {\n                if(std::find(m_outputTypes.begin(), m_outputTypes.end(), OutputType::GATECOUNTS) != m_outputTypes.end()) {\n                     throw CommandLineException(\"Same output type argument (gatecounts) provided twice\");\n                }\n                m_outputTypes.push_back(OutputType::GATECOUNTS);\n            }\n            else if ( std::strcmp(argv[i], \"trails\") == 0 )\n            {\n                if(std::find(m_outputTypes.begin(), m_outputTypes.end(), OutputType::TRAILS) != m_outputTypes.end()) {\n                     throw CommandLineException(\"Same output type argument (trails) provided twice\");\n                }\n                m_outputTypes.push_back(OutputType::TRAILS);\n            }\n        }\n        ++i;\n    }\n\n    if(m_agentMode == AgentMode::NONE)\n    {\n        m_agentMode = AgentMode::STANDARD;\n    }\n\n    if (m_totalSystemTimestemps == 0)\n    {\n        throw CommandLineException(\"Total number of timesteps (-ats <timesteps>) is required\");\n    }\n\n    if (m_releaseRate == 0)\n    {\n        throw CommandLineException(\"Release rate (-arr <rate>) is required\");\n    }\n\n    if (m_agentFOV == 0)\n    {\n        throw CommandLineException(\"Agent field-of-view (-afov <bins>) is required\");\n    }\n\n    if (m_agentStepsBeforeTurnDecision == 0)\n    {\n        throw CommandLineException(\"Agent number of steps before turn decision (-asteps <steps>) is required\");\n    }\n\n    if (m_agentLifeTimesteps == 0)\n    {\n        throw CommandLineException(\"Agent life in timesteps (-alife <timesteps>) is required\");\n    }\n\n    if (pointFile.empty() && points.empty() && m_randomReleaseLocationSeed == -1)\n    {\n        throw CommandLineException(\"Either -aloc, -alocfile or -alocseed must be given\");\n    }\n\n    if(!pointFile.empty())\n    {\n        std::ifstream pointsStream(pointFile);\n        if (!pointsStream)\n        {\n            std::stringstream message;\n            message << \"Failed to load file \" << pointFile << \", error \" << std::strerror(errno) << std::flush;\n            throw depthmapX::RuntimeException(message.str().c_str());\n        }\n        std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, '\\t');\n        m_releasePoints.insert(std::end(m_releasePoints), std::begin(parsed), std::end(parsed));\n    }\n    else if(!points.empty())\n    {\n        std::stringstream pointsStream;\n        pointsStream << \"x,y\";\n        std::vector<std::string>::iterator iter = points.begin(), end =\n        points.end();\n        for ( ; iter != end; ++iter )\n        {\n            pointsStream << \"\\n\" << *iter;\n        }\n        std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, ',');\n        m_releasePoints.insert(std::end(m_releasePoints), std::begin(parsed), std::end(parsed));\n\n    }\n}\n\nvoid AgentParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runAgentAnalysis(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/agentparser.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n#include \"imodeparser.h\"\n#include \"genlib/p2dpoly.h\"\n#include \"commandlineparser.h\"\n\nclass AgentParser : public IModeParser\n{\npublic:\n    virtual std::string getModeName() const\n    {\n        return \"AGENTS\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return    \"Mode options for AGENTS:\\n\"\\\n                  \"-am <agent mode> one of:\\n\"\n                  \"    standard\\n\"\\\n                  \"    los-length (Line of Sight length)\\n\"\\\n                  \"    occ-length (Occluded length)\\n\"\\\n                  \"    occ-any (Any occlusions)\\n\"\\\n                  \"    occ-group-45 (Occlusion group bins - 45 degrees)\\n\"\\\n                  \"    occ-group-60 (Occlusion group bins - 60 degrees)\\n\"\\\n                  \"    occ-furthest (Furthest occlusion per bin)\\n\"\\\n                  \"    bin-far-dist (Per bin far distance weighted)\\n\"\\\n                  \"    bin-angle (Per bin angle weighted)\\n\"\\\n                  \"    bin-far-dist-angle (Per bin far-distance and angle weighted)\\n\"\\\n                  \"    bin-memory (Per bin memory)\\n\"\\\n                  \"-ats <timesteps> set total system timesteps\\n\"\\\n                  \"-arr <rate> set agent release rate (likelyhood of release per timestep)\\n\"\\\n                  \"-atrails <no of trails> record trails for this amount of agents (set to 0 to record all\"\\\n                           \", with max possible currently = 50)\\n\"\\\n                  \"-afov <fov> set agent field-of-view (bins)\\n\"\\\n                  \"-asteps <steps> set agent steps before turn decision\\n\"\\\n                  \"-alife <timesteps> set agent total lifetime (in timesteps)\\n\"\\\n                  \"-alocseed <seed> set agents to start at random locations with specific seed (0 to 10)\\n\"\\\n                  \"-alocfile <agent starting points file>\\n\"\\\n                  \"-aloc <single agent starting point coordinates> provided in csv (x1,y1) \"\\\n                  \"for example \\\"0.1,0.2\\\". Provide multiple times for multiple links\\n\"\\\n                  \"-ot <output type> available output types (may use more than one):\"\\\n                  \"    graph (graph file, default)\"\\\n                  \"    gatecounts (csv with cells of grid with gate counts)\"\\\n                  \"    trails (csv with lines showing path traversed by each agent)\";\n    }\n\npublic:\n    AgentParser();\n    virtual void parse(int argc, char *argv[]);\n    virtual void run(const CommandLineParser &clp, IPerformanceSink& perfWriter) const;\n\n    enum AgentMode{\n        NONE,\n        STANDARD,\n        LOS_LENGTH,\n        OCC_LENGTH,\n        OCC_ANY,\n        OCC_GROUP_45,\n        OCC_GROUP_60,\n        OCC_FURTHEST,\n        BIN_FAR_DIST,\n        BIN_ANGLE,\n        BIN_FAR_DIST_ANGLE,\n        BIN_MEMORY\n    };\n\n    enum OutputType{\n        GRAPH,\n        GATECOUNTS,\n        TRAILS\n    };\n\n    // agent options\n    AgentMode getAgentMode() const { return m_agentMode; }\n\n    int totalSystemTimestemps() const { return m_totalSystemTimestemps; }\n    double releaseRate() const { return m_releaseRate; }\n    int recordTrailsForAgents() const { return m_recordTrailsForAgents; }\n    int randomReleaseLocationSeed() const { return m_randomReleaseLocationSeed; }\n\n    int agentFOV() const { return m_agentFOV; }\n    int agentStepsBeforeTurnDecision() const { return m_agentStepsBeforeTurnDecision; }\n    int agentLifeTimesteps() const { return m_agentLifeTimesteps; }\n\n    std::vector<Point2f> getReleasePoints() const { return m_releasePoints; }\n\n    std::vector<OutputType> outputTypes() const { return m_outputTypes; }\n\nprivate:\n    // agent options\n    AgentMode m_agentMode;\n\n    int m_totalSystemTimestemps = 0;\n    double m_releaseRate = 0.0;\n    int m_recordTrailsForAgents = -1;\n\n    int m_agentFOV = 0; // Field of view (bins)\n    int m_agentStepsBeforeTurnDecision = 0; // Steps before turn decision\n    int m_agentLifeTimesteps = 0; // Timesteps in system\n\n    int m_randomReleaseLocationSeed = -1;\n    std::vector<Point2f> m_releasePoints;\n\n    std::vector<OutputType> m_outputTypes;\n};\n\n"
  },
  {
    "path": "depthmapXcli/axialparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"axialparser.h\"\n#include \"parsingutils.h\"\n#include \"exceptions.h\"\n#include \"salalib/entityparsing.h\"\n#include \"runmethods.h\"\n#include <cstring>\n\nusing namespace depthmapX;\n\nAxialParser::AxialParser() :  m_runFewestLines(false), m_runAnalysis(false), m_choice(false), m_local(false), m_rra(false)\n{\n\n}\n\n\nstd::string AxialParser::getModeName() const\n{\n    return \"AXIAL\";\n}\n\nstd::string AxialParser::getHelp() const\n{\n    return  \"Mode options for Axial Analysis:\\n\"\\\n            \"  -xl <x>,<y> Calculate all lines map from this seed point (can be used more than once)\\n\"\n            \"  -xf Calculate fewest lines map from all lines map\\n\"\\\n            \"  -xa <radius/list of radii> run axial anlysis with specified radii\\n\"\\\n            \" All modes expect to find the required input in the in graph\\n\"\\\n            \" Any combination of flags above can be specified, they will always be run in the order -aa -af -au -ax\\n\"\\\n            \" Further flags for axial analysis are:\\n\"\\\n            \"   -xac Include choice (betweenness)\\n\"\\\n            \"   -xal Include local measures\\n\"\\\n            \"   -xar Include RA, RRA and total depth\\n\"\\\n            \"   -xaw <map attribute name> perform weighted analysis using this attribute\\n\"\\\n            \"\\n\";\n}\n\nvoid AxialParser::parse(int argc, char **argv)\n{\n    for (int i = 1; i < argc; ++i)\n    {\n        if (std::strcmp(argv[i], \"-xl\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-xl\", i)\n            m_allAxesRoots.push_back(EntityParsing::parsePoint(argv[i]));\n        }\n        else if(std::strcmp(argv[i], \"-xf\") == 0)\n        {\n            m_runFewestLines = true;\n        }\n        else if (std::strcmp(argv[i], \"-xa\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-xa\", i)\n            if (m_runAnalysis)\n            {\n                throw CommandLineException(\"-xa can only be used once\");\n            }\n            m_radii = depthmapX::parseRadiusList(argv[i]);\n            m_runAnalysis = true;\n        }\n        else if (std::strcmp(argv[i], \"-xal\") == 0)\n        {\n            m_local = true;\n        }\n        else if (std::strcmp(argv[i], \"-xac\") == 0)\n        {\n            m_choice = true;\n        }\n        else if(std::strcmp(argv[i], \"-xar\") == 0)\n        {\n            m_rra = true;\n        }\n        else if (std::strcmp(argv[i], \"-xaw\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-xaw\", i)\n            m_attribute = argv[i];\n        }\n    }\n\n    if (!runAllLines() && !runFewestLines() && !runUnlink() && !runAnalysis())\n    {\n        throw CommandLineException(\"No axial analysis mode present\");\n    }\n}\n\nvoid AxialParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runAxialAnalysis(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/axialparser.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"genlib/p2dpoly.h\"\n\nclass AxialParser : public IModeParser\n{\npublic:\n    AxialParser();\n\n    // IModeParser interface\npublic:\n    std::string getModeName() const;\n    std::string getHelp() const;\n    void parse(int argc, char **argv);\n    void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    // accessors\n    bool runAllLines() const\n    {\n        return !m_allAxesRoots.empty();\n    }\n\n    const std::vector<Point2f> & getAllAxesRoots() const{\n        return m_allAxesRoots;\n    }\n\n    bool runFewestLines() const\n    {\n        return m_runFewestLines;\n    }\n\n    bool runUnlink() const\n    {\n        // not supported for now\n        return false;\n    }\n\n    bool runAnalysis() const\n    {\n        return m_runAnalysis;\n    }\n\n    bool useChoice() const { return m_choice; }\n    bool useLocal() const { return m_local; }\n    bool calculateRRA() const { return m_rra; }\n\n    const std::vector<double>& getRadii() const { return m_radii;}\n    const std::string getAttribute() const { return m_attribute;}\n\nprivate:\n    std::vector<Point2f> m_allAxesRoots;\n    bool m_runFewestLines;\n    bool m_runAnalysis;\n    std::vector<double> m_radii;\n    bool m_choice;\n    bool m_local;\n    bool m_rra;\n    std::string m_attribute;\n};\n"
  },
  {
    "path": "depthmapXcli/commandlineparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"commandlineparser.h\"\n#include \"exceptions.h\"\n#include \"imodeparserfactory.h\"\n#include \"parsingutils.h\"\n#include \"version.h\"\n#include <iostream>\n#include <cstring>\n#include <algorithm>\n\nusing namespace depthmapX;\n\nvoid CommandLineParser::printHelp(){\n    std::cout << \"Usage: depthmapXcli -m <mode> -f <filename> -o <output file> [-s] [-t <times.csv>] [-p] [mode options]\\n\"\n              << \"       depthmapXcli -v prints the current version\\n\"\n              << \"       depthmapXcli -h prints this help text\\n\"\n              << \"-s enables simple mode\\n\"\n              << \"-t <times.csv> enables output of runtimes as csv file\\n\"\n              << \"-p enables text progress printing\\n\"\n\n              << \"Possible modes are:\\n\";\n              std::for_each(_parserFactory.getModeParsers().begin(), _parserFactory.getModeParsers().end(), [](const ModeParserVec::value_type &p)->void{ std::cout << \"  \" << p->getModeName() << \"\\n\"; });\n              std::cout << \"\\n\";\n              std::for_each(_parserFactory.getModeParsers().begin(), _parserFactory.getModeParsers().end(), [](const ModeParserVec::value_type &p)->void{ std::cout << p->getHelp() << \"\\n\"; });\n              std::cout << std::flush;\n}\n\nvoid CommandLineParser::printVersion(){\n    std::cout << TITLE_BASE << \"\\n\" << std::flush;\n}\n\n\nCommandLineParser::CommandLineParser(const IModeParserFactory &parserFactory)\n    :  m_simpleMode(false), _parserFactory(parserFactory), _modeParser(0)\n{}\n\nvoid CommandLineParser::parse(size_t argc, char *argv[])\n{\n    m_valid = false;\n    m_printVersionMode = false;\n    if (argc <= 1)\n    {\n        throw CommandLineException(\"No commandline parameters provided - don't know what to do\");\n    }\n    for ( size_t i = 1; i < argc;  )\n    {\n        if ( std::strcmp(\"-h\", argv[i])== 0)\n        {\n            return;\n        }\n        else if ( std::strcmp(\"-v\", argv[i])== 0)\n        {\n            m_printVersionMode = true;\n            return;\n        }\n        else if ( std::strcmp (\"-m\", argv[i]) == 0)\n        {\n            if ( _modeParser)\n            {\n                throw CommandLineException(\"-m can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-m\", i)\n\n            for (auto iter = _parserFactory.getModeParsers().begin(), end = _parserFactory.getModeParsers().end();\n                 iter != end; ++iter )\n            {\n                if ((*iter)->getModeName() == argv[i])\n                {\n                    _modeParser = iter->get();\n                    break;\n                }\n            }\n\n            if (!_modeParser)\n            {\n                throw CommandLineException(std::string(\"Invalid mode: \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp (\"-f\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-f\", i)\n            m_fileName = argv[i];\n        }\n        else if ( std::strcmp (\"-o\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-o\", i)\n            m_outputFile = argv[i];\n        }\n        else if ( std::strcmp (\"-t\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-t\", i)\n            m_timingFile = argv[i];\n        }\n        else if ( std::strcmp(\"-s\", argv[i]) == 0)\n        {\n            m_simpleMode = true;\n        }\n        else if ( std::strcmp(\"-p\", argv[i]) == 0)\n        {\n            m_printProgress = true;\n        }\n        ++i;\n    }\n\n    if (!_modeParser)\n    {\n        throw CommandLineException(\"-m for mode is required\");\n    }\n    if (m_fileName.empty())\n    {\n        throw CommandLineException(\"-f for input file is required\");\n    }\n    if (m_outputFile.empty())\n    {\n        throw CommandLineException(\"-o for output file is required\");\n    }\n    _modeParser->parse(argc, argv);\n    m_valid = true;\n}\n\nvoid CommandLineParser::run(IPerformanceSink &perfWriter) const\n{\n    if (!m_valid || !_modeParser)\n    {\n        throw CommandLineException(\"Trying to run with invalid command line parameters\");\n    }\n    _modeParser->run(*this, perfWriter);\n}\n\n"
  },
  {
    "path": "depthmapXcli/commandlineparser.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n#include <vector>\n#include <memory>\nclass IModeParserFactory;\nclass IModeParser;\nclass IPerformanceSink;\n\n\n\nclass CommandLineParser\n{\npublic:\n    CommandLineParser(const IModeParserFactory &parserFactory);\n    void parse(size_t argc, char *argv[]);\n\n    const std::string &getFileName() const { return m_fileName; }\n    const std::string &getOuputFile() const {return m_outputFile;}\n    const std::string &getTimingFile() const {return m_timingFile;}\n    bool isValid() const { return m_valid; }\n    bool printVersionMode() const { return m_printVersionMode; }\n    bool simpleMode() const { return m_simpleMode; }\n    bool printProgress() const { return m_printProgress; }\n    const IModeParser& modeOptions() const{ return *_modeParser;};\n\n\n    void printHelp();\n    void printVersion();\n    void run(IPerformanceSink &perfWriter) const;\n\n\nprivate:\n    std::string m_fileName;\n    std::string m_outputFile;\n    std::string m_timingFile;\n    bool m_valid;\n    bool m_printVersionMode;\n    bool m_simpleMode;\n    bool m_printProgress;\n\n    const IModeParserFactory &_parserFactory;\n    IModeParser * _modeParser;\n\n};\n"
  },
  {
    "path": "depthmapXcli/exceptions.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/exceptions.h\"\n#include <string>\n\nnamespace depthmapX\n{\n    class CommandLineException : public depthmapX::BaseException\n    {\n    public:\n        CommandLineException(std::string message) : depthmapX::BaseException(message)\n        {}\n    };\n\n    class SetupCheckException : public depthmapX::BaseException\n    {\n    public:\n        SetupCheckException(std::string message) : depthmapX::BaseException(message)\n        {}\n    };\n}\n"
  },
  {
    "path": "depthmapXcli/exportparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"exportparser.h\"\n#include \"exceptions.h\"\n#include <cstring>\n#include \"runmethods.h\"\n#include \"parsingutils.h\"\n#include <sstream>\n\nusing namespace depthmapX;\n\nExportParser::ExportParser() : m_exportMode(ExportMode::NONE)\n{}\n\nvoid ExportParser::parse(int argc, char *argv[])\n{\n    for ( int i = 1; i < argc;  )\n    {\n\n        if ( std::strcmp (\"-em\", argv[i]) == 0)\n        {\n            if (m_exportMode != ExportParser::NONE)\n            {\n                throw CommandLineException(\"-em can only be used once, modes are mutually exclusive\");\n            }\n            ENFORCE_ARGUMENT(\"-em\", i)\n            if ( std::strcmp(argv[i], \"pointmap-data-csv\") == 0 )\n            {\n                m_exportMode = ExportMode::POINTMAP_DATA_CSV;\n            } \n            else if ( std::strcmp(argv[i], \"pointmap-connections-csv\") == 0 )\n            {\n                m_exportMode = ExportMode::POINTMAP_CONNECTIONS_CSV;\n            }\n            else if ( std::strcmp(argv[i], \"pointmap-links-csv\") == 0 )\n            {\n                m_exportMode = ExportMode::POINTMAP_LINKS_CSV;\n            }\n            else if ( std::strcmp(argv[i], \"shapegraph-map-csv\") == 0 )\n            {\n                m_exportMode = ExportMode::SHAPEGRAPH_MAP_CSV;\n            }\n            else if ( std::strcmp(argv[i], \"shapegraph-map-mif\") == 0 )\n            {\n                m_exportMode = ExportMode::SHAPEGRAPH_MAP_MIF;\n            }\n            else if ( std::strcmp(argv[i], \"shapegraph-connections-csv\") == 0 )\n            {\n                m_exportMode = ExportMode::SHAPEGRAPH_CONNECTIONS_CSV;\n            }\n            else if ( std::strcmp(argv[i], \"shapegraph-links-unlinks-csv\") == 0 )\n            {\n                m_exportMode = ExportMode::SHAPEGRAPH_LINKS_UNLINKS_CSV;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid EXPORT mode: \") + argv[i]);\n            }\n        }\n        ++i;\n    }\n}\n\nvoid ExportParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::exportData(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/exportparser.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"commandlineparser.h\"\n#include <string>\n\nclass ExportParser : public IModeParser\n{\npublic:\n    virtual std::string getModeName() const\n    {\n        return \"EXPORT\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return    \"Mode options for EXPORT:\\n\"\\\n                  \"-em <export mode> one of:\\n\"\\\n                  \"    pointmap-data-csv\\n\"\\\n                  \"    pointmap-connections-csv\\n\"\\\n                  \"    pointmap-links-csv\\n\"\\\n                  \"    shapegraph-map-csv\\n\"\\\n                  \"    shapegraph-map-mif\\n\"\\\n                  \"    shapegraph-connections-csv\\n\"\\\n                  \"    shapegraph-links-unlinks-csv\\n\";\n    }\n\npublic:\n    ExportParser();\n    virtual void parse(int argc, char *argv[]);\n    virtual void run(const CommandLineParser &clp, IPerformanceSink& perfWriter) const;\n\n    enum ExportMode{\n        NONE,\n        POINTMAP_DATA_CSV,\n        POINTMAP_CONNECTIONS_CSV,\n        POINTMAP_LINKS_CSV,\n        SHAPEGRAPH_MAP_CSV,\n        SHAPEGRAPH_MAP_MIF,\n        SHAPEGRAPH_CONNECTIONS_CSV,\n        SHAPEGRAPH_LINKS_UNLINKS_CSV\n    };\n    ExportMode getExportMode() const { return m_exportMode; }\n\nprivate:\n    ExportMode m_exportMode;\n};\n\n"
  },
  {
    "path": "depthmapXcli/imodeparser.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n// Interface to encapsulate handling command line and invoking the respective\n// depthmapX mode\n\n#include \"performancesink.h\"\n#include \"commandlineparser.h\"\n\nclass IModeParser\n{\npublic:\n    virtual std::string getModeName() const = 0;\n    virtual std::string getHelp() const = 0;\n    virtual void parse( int argc, char **argv) = 0;\n    virtual void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const = 0;\n    virtual ~IModeParser(){}\n};\n"
  },
  {
    "path": "depthmapXcli/imodeparserfactory.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include <vector>\n#include <memory>\n\ntypedef std::vector<std::unique_ptr<IModeParser> > ModeParserVec;\n\nclass IModeParserFactory\n{\npublic:\n    virtual const ModeParserVec &getModeParsers() const = 0;\n    virtual ~IModeParserFactory(){}\n};\n"
  },
  {
    "path": "depthmapXcli/importparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"importparser.h\"\n#include \"exceptions.h\"\n#include \"runmethods.h\"\n#include \"parsingutils.h\"\n#include <cstring>\n#include <memory>\n#include <sstream>\n\nusing namespace depthmapX;\n\nvoid ImportParser::parse(int argc, char *argv[])\n{\n    for ( int i = 1; i < argc; ++i)\n    {\n        if ( strcmp (\"-if\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-if\", i)\n            m_filesToImport.push_back(argv[i]);\n        } else if ( std::strcmp (\"-it\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-it\", i)\n            if ( std::strcmp(argv[i], \"drawing\") == 0 )\n            {\n                m_importMapType = depthmapX::ImportType::DRAWINGMAP;\n            }\n            else if ( std::strcmp(argv[i], \"data\") == 0 )\n            {\n                m_importMapType = depthmapX::ImportType::DATAMAP;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid map import (-it) type: \") + argv[i]);\n            }\n        } else if ( strcmp (\"-iaa\", argv[i]) == 0)\n        {\n            m_importAsAttributes = true;\n        }\n    }\n}\n\nvoid ImportParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::importFiles(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/importparser.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"commandlineparser.h\"\n#include \"salalib/importtypedefs.h\"\n#include <string>\n#include <vector>\n\nclass ImportParser : public IModeParser\n{\npublic:\n    virtual std::string getModeName() const\n    {\n        return \"IMPORT\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return  \"Mode options for IMPORT:\\n\"\\\n                \"   The file provided by -f here will be used as the base. If that file\"\\\n                \"is not a graph, a new graph will be created and the file will be imported\\n\"\\\n                \"   -if <file(s) to import> one or more files to import\\n\"\\\n                \"   -it Import map type (to convert to)\\n\"\\\n                \"       Possible map types:\\n\"\\\n                \"         - drawing (default, does not preserve attributes, typically for dxf files)\\n\"\\\n                \"         - data (preserves attributes, typically for csv and tsv files)\\n\"\\\n                \"   -iaa will import and attach attributes to an existing map\\n\";\n    }\n\npublic:\n    virtual void parse(int argc, char *argv[]);\n    virtual void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    const std::vector<std::string> & getFilesToImport() const { return m_filesToImport; }\n    const bool toImportAsAttrbiutes() const { return m_importAsAttributes; }\n    const depthmapX::ImportType getImportMapType() const { return m_importMapType; }\n\nprivate:\n    depthmapX::ImportType m_importMapType = depthmapX::ImportType::DRAWINGMAP;\n    std::vector<std::string> m_filesToImport;\n    bool m_importAsAttributes = false;\n};\n"
  },
  {
    "path": "depthmapXcli/isovistparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n#include \"isovistparser.h\"\n#include \"parsingutils.h\"\n#include \"exceptions.h\"\n#include \"salalib/entityparsing.h\"\n#include <sstream>\n#include \"runmethods.h\"\n#include <cstring>\n\nusing namespace depthmapX;\n\nIsovistParser::IsovistParser()\n{\n\n}\n\n\nstd::string IsovistParser::getModeName() const\n{\n    return \"ISOVIST\";\n}\n\nstd::string IsovistParser::getHelp() const\n{\n    return \"Arguments for isovist mode:\\n\" \\\n           \"  -ii <x,y[,angle,viewangle]> Define an isoivist at position x,y with\\n\"\\\n           \"    optional direction angle and view angle for partial isovists\\n\"\\\n           \"  -if <isovist file> load isovist definitions from a file (csv)\\n\"\\\n           \"    the relevant headers must be called x, y, angle and viewangle\\n\"\\\n           \"    the latter two are optional.\\n\"\\\n           \"  Those two arguments cannot be mixed\\n\"\\\n           \"  Angles for partial isovists are in degrees, counted anti-clockwise with 0°\\n\"\\\n           \"  pointing to the right.\\n\\n\";\n}\n\nvoid IsovistParser::parse(int argc, char **argv)\n{\n    std::string isovistFile;\n\n    for( int i = 1; i < argc; ++i)\n    {\n        if (std::strcmp(argv[i], \"-ii\") == 0 )\n        {\n            if ( !isovistFile.empty())\n            {\n                throw CommandLineException(\"-ii cannot be used together with -if\");\n            }\n            ENFORCE_ARGUMENT(\"-ii\", i);\n            m_isovists.push_back(EntityParsing::parseIsovist(argv[i]));\n        }\n        else if( std::strcmp(argv[i], \"-if\") == 0)\n        {\n            if ( !isovistFile.empty())\n            {\n                throw CommandLineException(\"-if can only be used once\");\n            }\n            if (!m_isovists.empty())\n            {\n                throw depthmapX::CommandLineException(\"-if cannot be used together with -ii\");\n            }\n            ENFORCE_ARGUMENT(\"-if\",i);\n            isovistFile = argv[i];\n        }\n    }\n\n    if (!isovistFile.empty())\n    {\n        std::ifstream file(isovistFile);\n        if ( !file.good())\n        {\n            std::stringstream message;\n            message << \"Failed to find file \" << isovistFile;\n            throw depthmapX::CommandLineException(message.str());\n        }\n        m_isovists = EntityParsing::parseIsovists(file, ',');\n    }\n    if (m_isovists.empty())\n    {\n        throw CommandLineException(\"No isovists defined. Use -ii or -if\");\n    }\n\n}\n\nvoid IsovistParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runIsovists(clp, m_isovists, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/isovistparser.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"salalib/isovistdef.h\"\n#include <vector>\n\nclass IsovistParser : public IModeParser\n{\npublic:\n    IsovistParser();\n\n    // IModeParser interface\npublic:\n    std::string getModeName() const;\n    std::string getHelp() const;\n    void parse(int argc, char **argv);\n    void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    const std::vector<IsovistDefinition> &getIsovists() const{ return m_isovists;}\nprivate:\n    std::vector<IsovistDefinition> m_isovists;\n};\n"
  },
  {
    "path": "depthmapXcli/linkparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"linkparser.h\"\n#include \"salalib/mgraph.h\"\n#include \"exceptions.h\"\n#include \"runmethods.h\"\n#include \"parsingutils.h\"\n#include <cstring>\n#include <memory>\n#include <sstream>\n\nusing namespace depthmapX;\n\nvoid LinkParser::parse(int argc, char *argv[])\n{\n    for ( int i = 1; i < argc;  )\n    {\n        if ( std::strcmp (\"-lmt\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-lmt\", i)\n            if ( std::strcmp(argv[i], \"pointmaps\") == 0 )\n            {\n                m_mapTypeGroup = MapTypeGroup::POINTMAPS;\n            }\n            else if ( std::strcmp(argv[i], \"shapegraphs\") == 0 )\n            {\n                m_mapTypeGroup = MapTypeGroup::SHAPEGRAPHS;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid LINK map type group: \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp (\"-lm\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-lm\", i)\n            if ( std::strcmp(argv[i], \"link\") == 0 )\n            {\n                m_linkMode = LinkMode::LINK;\n            }\n            else if ( std::strcmp(argv[i], \"unlink\") == 0 )\n            {\n                m_linkMode = LinkMode::UNLINK;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid LINK mode: \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp (\"-lt\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-lt\", i)\n            if ( std::strcmp(argv[i], \"coords\") == 0 )\n            {\n                m_linkType = LinkType::COORDS;\n            }\n            else if ( std::strcmp(argv[i], \"refs\") == 0 )\n            {\n                m_linkType = LinkType::REFS;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid LINK type: \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp (\"-lf\", argv[i]) == 0)\n        {\n            if (!m_linksFile.empty())\n            {\n                throw CommandLineException(\"-lf can only be used once at the moment\");\n            }\n            else if (m_manualLinks.size() != 0)\n            {\n                throw CommandLineException(\"-lf can not be used in conjunction with -lnk\");\n            }\n            ENFORCE_ARGUMENT(\"-lf\", i)\n            m_linksFile = argv[i];\n        }\n        else if ( std::strcmp (\"-lnk\", argv[i]) == 0)\n        {\n            if (!m_linksFile.empty())\n            {\n                throw CommandLineException(\"-lf can not be used in conjunction with -lnk\");\n            }\n            ENFORCE_ARGUMENT(\"-lnk\", i)\n            if (!has_only_digits_dots_commas(argv[i]))\n            {\n                std::stringstream message;\n                message << \"Invalid link provided (\"\n                        << argv[i]\n                        << \"). Should only contain digits dots and commas\"\n                        << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            m_manualLinks.push_back(argv[i]);\n        }\n        ++i;\n    }\n    if ( m_manualLinks.size() == 0 && m_linksFile.empty())\n    {\n        throw CommandLineException(\"one of -lf or -lnk must be provided\");\n    }\n}\n\nvoid LinkParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::linkGraph(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/linkparser.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/mgraph.h\"\n#include \"imodeparser.h\"\n#include \"commandlineparser.h\"\n#include <string>\n#include <vector>\n\nclass LinkParser : public IModeParser\n{\npublic:\n    enum MapTypeGroup { POINTMAPS, SHAPEGRAPHS };\n    enum LinkMode { LINK, UNLINK };\n    enum LinkType { COORDS, REFS };\n\n    LinkParser():\n        m_mapTypeGroup(POINTMAPS),\n        m_linkMode(LINK),\n        m_linkType(COORDS)\n    {}\n\n    virtual std::string getModeName() const\n    {\n        return \"LINK\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return  \"Mode options for LINK:\\n\"\\\n                \"  -lmt <type> Map type group to select displayed map from. One of:\\n\"\\\n                \"       pointmaps (default, vga: link)\\n\"\\\n                \"       shapegraphs (axial:link/unlink, segment:link, convex:link)\\n\"\\\n                \"  -lm  <mode> one of:\\n\"\\\n                \"       link (default)\\n\"\\\n                \"       unlink\\n\"\\\n                \"  -lt  <type> one of:\\n\"\\\n                \"       coords (default, provided as x,y or x1,y1,x2,y2 coordinates)\\n\"\\\n                \"       refs (provided as the ids (Ref) of the shapes)\\n\"\\\n                \"  -lnk <single link/unlink coordinates> provided in csv (x1,y1,x2,y2)\\n\"\\\n                \"       for example \\\"0.1,0.2,0.2,0.4\\\" to create a link from 0.1,0.2\\n\"\\\n                \"       to 0.2,0.4. In the case of axial-map unlinks a single (x,y) set may\\n\"\n                \"       be provided. In the case of refs provide the ids in csv (reffrom,refto)\"\n                \"       Provide multiple times for multiple links/unlinks\\n\"\\\n                \"  -lf  <links file> as in -lnk\\n\";\n    }\n\npublic:\n    virtual void parse(int argc, char *argv[]);\n    virtual void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    //link options\n    const std::string & getLinksFile() const { return m_linksFile; }\n    const std::vector<std::string> & getManualLinks() const { return m_manualLinks; }\n    const MapTypeGroup& getMapTypeGroup() const { return m_mapTypeGroup; }\n    const LinkMode& getLinkMode() const { return m_linkMode; }\n    const LinkType& getLinkType() const { return m_linkType; }\nprivate:\n    std::string m_linksFile;\n    std::vector<std::string> m_manualLinks;\n    MapTypeGroup m_mapTypeGroup;\n    LinkMode m_linkMode;\n    LinkType m_linkType;\n};\n"
  },
  {
    "path": "depthmapXcli/main.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <iostream>\n#include \"commandlineparser.h\"\n#include \"runmethods.h\"\n#include \"performancewriter.h\"\n#include \"modeparserregistry.h\"\n\nint main(int argc, char *argv[])\n{\n    ModeParserRegistry registry;\n    CommandLineParser args(registry);\n    try{\n        args.parse(argc, argv);\n        if (!args.isValid())\n        {\n            if (args.printVersionMode())\n            {\n                args.printVersion();\n            }\n            else\n            {\n                args.printHelp();\n            }\n            return 0;\n        }\n\n        PerformanceWriter perfWriter(args.getTimingFile());\n\n        args.run(perfWriter);\n        perfWriter.write();\n\n    }\n    catch( std::exception &e)\n    {\n        std::cout << e.what() << \"\\n\"\n                  << \"Type 'depthmapXcli -h' for help\" << std::endl;\n        return -1;\n    }\n    return 0;\n}\n"
  },
  {
    "path": "depthmapXcli/mapconvertparser.cpp",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"mapconvertparser.h\"\n#include \"parsingutils.h\"\n#include \"exceptions.h\"\n#include \"runmethods.h\"\n#include <cstring>\n\nusing namespace depthmapX;\n\nvoid MapConvertParser::parse(int argc, char **argv)\n{\n    for (int i = 1; i < argc; ++i)\n    {\n        if ( std::strcmp (\"-co\", argv[i]) == 0)\n        {\n            if (m_outMapType != ShapeMap::EMPTYMAP)\n            {\n                throw CommandLineException(\"-co can only be used once, modes are mutually exclusive\");\n            }\n            ENFORCE_ARGUMENT(\"-co\", i)\n            if ( std::strcmp(argv[i], \"drawing\") == 0 )\n            {\n                m_outMapType = ShapeMap::DRAWINGMAP;\n            }\n            else if ( std::strcmp(argv[i], \"axial\") == 0 )\n            {\n                m_outMapType = ShapeMap::AXIALMAP;\n            }\n            else if ( std::strcmp(argv[i], \"segment\") == 0 )\n            {\n                m_outMapType = ShapeMap::SEGMENTMAP;\n            }\n            else if ( std::strcmp(argv[i], \"data\") == 0 )\n            {\n                m_outMapType = ShapeMap::DATAMAP;\n            }\n            else if ( std::strcmp(argv[i], \"convex\") == 0)\n            {\n                m_outMapType = ShapeMap::CONVEXMAP;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid map output (-co) type: \") + argv[i]);\n            }\n        }\n        else if(std::strcmp(argv[i], \"-con\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-con\", i)\n            m_outMapName = argv[i];\n        }\n        else if(std::strcmp(argv[i], \"-cir\") == 0)\n        {\n            m_removeInputMap = true;\n        }\n        else if (std::strcmp(argv[i], \"-coc\") == 0)\n        {\n            m_copyAttributes = true;\n        }\n        else if (std::strcmp(argv[i], \"-crsl\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-crsl\", i)\n            if (!has_only_digits_dots(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-crsl must be a number >0, got \") + argv[i]);\n            }\n            m_removeStubLengthPRC = std::stod(argv[i]);\n            if (!(m_removeStubLengthPRC > 0))\n            {\n                throw CommandLineException(std::string(\"-crsl must be a number >0, got \") + argv[i]);\n            }\n        }\n    }\n\n    if (m_outMapType == ShapeMap::EMPTYMAP)\n    {\n        throw CommandLineException(\"A valid output map type (-co) is required\");\n    }\n\n    if (m_outMapName == \"\")\n    {\n        throw CommandLineException(\"A valid output map name (-con) is required\");\n    }\n}\n\nvoid MapConvertParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runMapConversion(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/mapconvertparser.h",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"salalib/shapemap.h\"\n\nclass MapConvertParser : public IModeParser\n{\npublic:\n    MapConvertParser():\n        m_outMapType(ShapeMap::EMPTYMAP),\n        m_outMapName(\"\"),\n        m_removeInputMap(false),\n        m_copyAttributes(false),\n        m_removeStubLengthPRC(0)\n    {}\n\n    // IModeParser interface\npublic:\n    std::string getModeName() const\n    {\n        return \"MAPCONVERT\";\n    }\n\n    std::string getHelp() const\n    {\n        return  \"Mode options for Map Conversion:\\n\"\\\n                \"  -co Output map type (to convert to)\\n\"\\\n                \"      Possible input/output map types:\\n\"\\\n                \"        - drawing\\n\"\\\n                \"        - axial\\n\"\\\n                \"        - segment\\n\"\\\n                \"        - data\\n\"\\\n                \"        - convex\\n\"\\\n                \"  -con Output map name\\n\"\\\n                \"  -cir Remove input map\\n\"\\\n                \"  -coc Copy attributes to output map (Only between DATA, AXIAL and SEGMENT)\\n\"\\\n                \"  -crsl <%> Percent of line length of axial stubs to remove (Only for AXIAL -> SEGMENT)\\n\\n\";\n    }\n    void parse(int argc, char **argv);\n    void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    int outputMapType() const { return m_outMapType; }\n    std::string outputMapName() const { return m_outMapName; }\n    bool removeInputMap() const { return m_removeInputMap; }\n    bool copyAttributes() const { return m_copyAttributes; }\n    double removeStubLength() const { return m_removeStubLengthPRC; }\n\nprivate:\n    int m_outMapType;\n    std::string m_outMapName;\n    bool m_removeInputMap;\n    bool m_copyAttributes;\n    double m_removeStubLengthPRC;\n};\n"
  },
  {
    "path": "depthmapXcli/modeparserregistry.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"modeparserregistry.h\"\n#include \"importparser.h\"\n#include \"linkparser.h\"\n#include \"vgaparser.h\"\n#include \"visprepparser.h\"\n#include \"axialparser.h\"\n#include \"segmentparser.h\"\n#include \"agentparser.h\"\n#include \"isovistparser.h\"\n#include \"exportparser.h\"\n#include \"stepdepthparser.h\"\n#include \"mapconvertparser.h\"\n#include \"modules/segmentshortestpaths/cli/segmentshortestpathparser.h\"\n\n\nvoid ModeParserRegistry::populateParsers()\n{\n    // Register any mode parsers here\n    REGISTER_PARSER(VgaParser);\n    REGISTER_PARSER(LinkParser);\n    REGISTER_PARSER(VisPrepParser);\n    REGISTER_PARSER(AxialParser);\n    REGISTER_PARSER(SegmentParser);\n    REGISTER_PARSER(AgentParser);\n    REGISTER_PARSER(IsovistParser);\n    REGISTER_PARSER(ExportParser);\n    REGISTER_PARSER(ImportParser);\n    REGISTER_PARSER(StepDepthParser);\n    REGISTER_PARSER(MapConvertParser);\n    REGISTER_PARSER(SegmentShortestPathParser);\n    // *********\n}\n"
  },
  {
    "path": "depthmapXcli/modeparserregistry.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"imodeparserfactory.h\"\n#include <vector>\n#include <memory>\n\nclass ModeParserRegistry : public IModeParserFactory\n{\npublic:\n    ModeParserRegistry()\n    {\n        populateParsers();\n    }\n\n    const ModeParserVec &getModeParsers() const {return m_availableParsers;}\nprivate:\n    void populateParsers();\n    ModeParserVec m_availableParsers;\n};\n\n#define REGISTER_PARSER(parser)\\\n    m_availableParsers.push_back(std::unique_ptr<IModeParser>(new parser));\n"
  },
  {
    "path": "depthmapXcli/parsingutils.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"parsingutils.h\"\n#include <sstream>\n#include <iostream>\n#include <algorithm>\n#include <cstring>\n#include \"exceptions.h\"\n\nstd::vector<double> depthmapX::parseRadiusList(const std::string &radiusList)\n{\n    std::vector<double> result;\n    std::stringstream stream(radiusList);\n    bool addN = false;\n\n    while(stream.good())\n    {\n        std::string value;\n        getline(stream, value, ',');\n        if ( value == \"n\" || value == \"N\")\n        {\n            addN = true;\n        }\n        else\n        {\n            char *end;\n            long int val = std::strtol(value.c_str(), &end, 10 );\n            if (val == 0 )\n            {\n                std::stringstream message;\n                message << \"Found either 0 or unparsable radius \" << value << std::flush;\n                throw CommandLineException(message.str());\n            }\n            if (val < 0)\n            {\n                throw CommandLineException(\"Radius must be either n or a positive integer\");\n            }\n            if (strlen(end) > 0)\n            {\n                std::stringstream message;\n                message << \"Found non integer radius \" << value << std::flush;\n                throw CommandLineException(message.str());\n            }\n            result.push_back((double)val);\n        }\n    }\n\n    std::sort(result.begin(), result.end());\n    if (result.empty() || addN)\n    {\n        result.push_back(-1.0);\n    }\n    return result;\n}\n"
  },
  {
    "path": "depthmapXcli/parsingutils.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#define PASTE(arg) arg\n#define ENFORCE_ARGUMENT(flag, counter)\\\n    if ( ++ PASTE(counter) >= argc \\\n    || (argv[ PASTE(counter)][0] == '-' && !isdigit(argv[ PASTE(counter)][1]) && argv[ PASTE(counter)][1] != '.')  )\\\n    {\\\n        throw CommandLineException(flag  \" requires an argument\");\\\n    }\\\n\n#include <vector>\n#include <string>\n\nnamespace depthmapX{\n\n    inline bool has_only_digits(const std::string &s){\n      return s.find_first_not_of( \"0123456789\" ) == std::string::npos;\n    }\n\n    inline bool has_only_digits_dots(const std::string &s){\n      return s.find_first_not_of( \"0123456789.\" ) == std::string::npos;\n    }\n\n    inline bool has_only_digits_dots_commas(const std::string &s){\n        return s.find_first_not_of( \"0123456789,.-\" ) == std::string::npos;\n    }\n\n    std::vector<double> parseRadiusList(const std::string &radiusList);\n\n}\n"
  },
  {
    "path": "depthmapXcli/performancesink.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n\n//Interface for performance writers\nclass IPerformanceSink\n{\npublic:\n    virtual void addData(const std::string &message, double timeInSeconds) = 0;\n    virtual ~IPerformanceSink(){}\n};\n"
  },
  {
    "path": "depthmapXcli/performancewriter.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"performancewriter.h\"\n#include <sstream>\n#include <fstream>\n#include <algorithm>\n\n\nPerformanceWriter::PerformanceWriter(const std::string &filename) : m_filename(filename)\n{\n}\n\n\nvoid PerformanceWriter::addData(const std::string &message, double timeInSeconds)\n{\n    std::stringstream ss;\n    ss << \"\\\"\" << message << \"\\\",\" << timeInSeconds << \"\\n\";\n    m_data.push_back(ss.str());\n}\n\nvoid PerformanceWriter::write() const\n{\n    if (!m_filename.empty())\n    {\n        std::ofstream outfile(m_filename);\n        outfile << \"\\\"action\\\",\\\"duration\\\"\\n\";\n        std::for_each(m_data.begin(), m_data.end(), [&outfile](const std::string& line)mutable ->void{(outfile) << line;});\n        outfile << std::flush;\n    }\n}\n"
  },
  {
    "path": "depthmapXcli/performancewriter.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"performancesink.h\"\n#include <vector>\n#include <string>\n\n\nclass PerformanceWriter : public IPerformanceSink\n{\nprivate:\n    std::vector<std::string> m_data;\n    std::string m_filename;\npublic:\n    PerformanceWriter(const std::string &filename);\n    void addData( const std::string &message, double timeInSeconds);\n    void write() const;\n};\n\n"
  },
  {
    "path": "depthmapXcli/printcommunicator.cpp",
    "content": "// Copyright (C) 2020, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <iostream>\n#include \"depthmapXcli/printcommunicator.h\"\n\nvoid PrintCommunicator::CommPostMessage(int m, int x) const {\n    switch (m) {\n    case Communicator::NUM_STEPS:\n        num_steps = x;\n        break;\n    case Communicator::CURRENT_STEP:\n        step = x;\n        break;\n    case Communicator::NUM_RECORDS:\n        num_records = x;\n        break;\n    case Communicator::CURRENT_RECORD:\n        record = x;\n        if (record > num_records) record = num_records;\n        std::cout << \"step: \" << step << \"/\" << num_steps << \" \"\n                  << \"record: \" << record << \"/\" << num_records << std::endl;\n        break;\n    default:\n        break;\n    }\n}\n"
  },
  {
    "path": "depthmapXcli/printcommunicator.h",
    "content": "// Copyright (C) 2020, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/comm.h\"\n\nclass PrintCommunicator : public ICommunicator {\n  public:\n    PrintCommunicator() {\n        num_steps = 0;\n        step = 0;\n        num_records = 0;\n        record = 0;\n    }\n    virtual ~PrintCommunicator() {}\n    virtual void CommPostMessage(int m, int x) const;\n};\n"
  },
  {
    "path": "depthmapXcli/radiusconverter.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"radiusconverter.h\"\n#include \"exceptions.h\"\n#include <sstream>\n#include <cstdlib>\n#include <cmath>\n\nusing namespace depthmapX;\n\ndouble RadiusConverter::ConvertForVisibility(const std::string &radius) const\n{\n    if (radius == \"n\")\n    {\n        return -1.0;\n    }\n    char *end;\n    long rad = std::strtol(radius.c_str(), &end, 10);\n    if (rad < 1 || rad > 99)\n    {\n        throw SetupCheckException(std::string(\"Radius for visibility analysis must be n for the whole range or an integer between 1 and 99 inclusive. Got \") + radius);\n    }\n    return static_cast<double>(rad);\n}\n\ndouble RadiusConverter::ConvertForMetric(const std::string &radius) const\n{\n    if (radius == \"n\")\n    {\n        return -1.0;\n    }\n    char *end;\n    double rad = strtod(radius.c_str(), &end);\n    if ( rad <= 0 )\n    {\n        throw SetupCheckException(std::string(\"Radius for metric vga must be n for the whole range or a positive number. Got \") + radius);\n    }\n    if (std::isnan(rad))\n    {\n        throw SetupCheckException(\"Radius NaN?! Really?\");\n    }\n    if (std::isinf(rad))\n    {\n        throw SetupCheckException(\"Radius inf?! Who are you kidding?\");\n    }\n\n    return rad;\n}\n"
  },
  {
    "path": "depthmapXcli/radiusconverter.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n\nclass IRadiusConverter\n{\npublic:\n    virtual double ConvertForVisibility(const std::string &radius) const = 0;\n    virtual double ConvertForMetric(const std::string &radius) const = 0;\n    virtual ~IRadiusConverter(){}\n};\n\n\nclass RadiusConverter : public IRadiusConverter\n{\npublic:\n    virtual double ConvertForVisibility(const std::string &radius) const;\n    virtual double ConvertForMetric(const std::string &radius) const;\n};\n\n"
  },
  {
    "path": "depthmapXcli/runmethods.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"runmethods.h\"\n#include \"salalib/mgraph.h\"\n#include \"salalib/linkutils.h\"\n#include \"radiusconverter.h\"\n#include \"exceptions.h\"\n#include \"simpletimer.h\"\n#include \"printcommunicator.h\"\n#include <memory>\n#include <sstream>\n#include <vector>\n#include \"salalib/entityparsing.h\"\n#include <salalib/gridproperties.h>\n#include <salalib/importutils.h>\n\nnamespace dm_runmethods\n{\n    std::unique_ptr<MetaGraph> loadGraph(const std::string& filename, IPerformanceSink &perfWriter) {\n        std::unique_ptr<MetaGraph> mgraph(new MetaGraph);\n        std::cout << \"Loading graph \" << filename << std::flush;\n        DO_TIMED( \"Load graph file\", auto result = mgraph->readFromFile(filename);)\n        if ( result != MetaGraph::OK)\n        {\n            std::stringstream message;\n            message << \"Failed to load graph from file \" << filename << \", error \" << result << std::flush;\n            throw depthmapX::RuntimeException(message.str().c_str());\n        }\n        std::cout << \" ok\\n\" << std::flush;\n        return mgraph;\n    }\n\n    std::unique_ptr<Communicator> getCommunicator(const CommandLineParser &clp) {\n        if (clp.printProgress()) {\n            return std::unique_ptr<Communicator>(new PrintCommunicator());\n        }\n        return nullptr;\n    }\n\n    void importFiles(const CommandLineParser &cmdP, const ImportParser &parser, IPerformanceSink &perfWriter)\n    {\n        std::ifstream mainFileStream(cmdP.getFileName().c_str());\n        if(!mainFileStream.good()) {\n            std::stringstream message;\n            message << \"File not found: \" << cmdP.getFileName() << std::flush;\n            throw depthmapX::RuntimeException(message.str().c_str());\n        }\n\n        std::unique_ptr<MetaGraph> mgraph(new MetaGraph);\n        DO_TIMED( \"Load graph file\", auto result = mgraph->readFromFile(cmdP.getFileName());)\n        if ( result != MetaGraph::OK && result != MetaGraph::NOT_A_GRAPH)\n        {\n            std::stringstream message;\n            message << \"Failed to load graph from file \" << cmdP.getFileName() << \", error \" << result << std::flush;\n            throw depthmapX::RuntimeException(message.str().c_str());\n        }\n\n        if ( result == MetaGraph::NOT_A_GRAPH)\n        {\n            // not a graph, try to import the file\n            std::string ext = cmdP.getFileName().substr(cmdP.getFileName().length() - 4, cmdP.getFileName().length() - 1);\n            std::ifstream file(cmdP.getFileName());\n\n            depthmapX::ImportFileType importFileType = depthmapX::ImportFileType::TSV;\n            if(dXstring::toLower(ext) == \".csv\") {\n                importFileType = depthmapX::ImportFileType::CSV;\n            } else if (dXstring::toLower(ext) == \".dxf\") {\n                importFileType = depthmapX::ImportFileType::DXF;\n            }\n\n            depthmapX::importFile(*mgraph,\n                                  file,\n                                  getCommunicator(cmdP).get(),\n                                  cmdP.getFileName(),\n                                  parser.getImportMapType(),\n                                  importFileType);\n        } else if ( result == MetaGraph::OK) {\n            if(parser.toImportAsAttrbiutes()) {\n\n                if(mgraph->getDisplayedMapType() == ShapeMap::EMPTYMAP) {\n                    throw depthmapX::RuntimeException(\"No map displayed to attach attributes to\");\n                }\n\n                std::vector<std::string> fileNames = parser.getFilesToImport();\n                for(std::string fileName: fileNames) {\n                    std::string ext = fileName.substr(fileName.length() - 4, fileName.length() - 1);\n                    std::ifstream file(fileName);\n                    char delimiter = '\\t';\n                    if(dXstring::toLower(ext) == \".csv\") {\n                        delimiter = ',';\n                    }\n\n                    DO_TIMED(\"Importing attributes\", depthmapX::importAttributes(mgraph->getDisplayedMapAttributes(),\n                                                                                 file,\n                                                                                 delimiter);)\n                }\n            }\n        }\n        DO_TIMED(\"Writing graph\", mgraph->write(cmdP.getOuputFile().c_str(),METAGRAPH_VERSION, false);)\n    }\n\n    void linkGraph(const CommandLineParser &cmdP, const LinkParser &parser, IPerformanceSink &perfWriter)\n    {\n\n        auto mgraph = loadGraph(cmdP.getFileName().c_str(), perfWriter);\n\n        if (parser.getLinkMode() == LinkParser::LinkMode::UNLINK\n                && parser.getMapTypeGroup() == LinkParser::MapTypeGroup::SHAPEGRAPHS\n                && mgraph->getDisplayedShapeGraph().getMapType() != ShapeMap::AXIALMAP) {\n            throw depthmapX::RuntimeException(\"Unlinking is only available for axial maps and pointmaps\");\n        }\n\n        char delimiter = '\\t';\n        std::stringstream linksStream;\n        if(!parser.getLinksFile().empty())\n        {\n            std::ifstream fileStream(parser.getLinksFile());\n            if (!linksStream)\n            {\n                std::stringstream message;\n                message << \"Failed to load file \" << parser.getLinksFile() << \", error \" << std::flush;\n                throw depthmapX::RuntimeException(message.str().c_str());\n            }\n            linksStream << fileStream.rdbuf();\n            fileStream.close();\n        }\n        else if(!parser.getManualLinks().empty())\n        {\n            delimiter = ',';\n            std::string header = \"x1,y1,x2,y2\";\n            if(parser.getLinkType() == LinkParser::LinkType::REFS) {\n                header = \"reffrom,refto\";\n            } else if(parser.getLinkMode() == LinkParser::LinkMode::UNLINK) {\n                header = \"x,y\";\n            }\n            linksStream << header;\n            auto iter = parser.getManualLinks().begin(),\n                    end = parser.getManualLinks().end();\n            for ( ; iter != end; ++iter )\n            {\n                linksStream << \"\\n\" << *iter;\n            }\n        }\n\n        SimpleTimer t;\n        if(parser.getLinkMode() == LinkParser::LinkMode::LINK) {\n            if(parser.getMapTypeGroup() == LinkParser::MapTypeGroup::SHAPEGRAPHS) {\n                auto& shapeGraph = mgraph->getDisplayedShapeGraph();\n                if(parser.getLinkType() == LinkParser::LinkType::COORDS) {\n                    std::vector<Line> mergeLines = EntityParsing::parseLines(linksStream, delimiter);\n                    for(auto line: mergeLines) {\n                        QtRegion region(line.start(), line.start());\n                        shapeGraph.setCurSel(region);\n                        shapeGraph.linkShapes(line.end());\n                    }\n                } else {\n                    auto mergePairs = EntityParsing::parseRefPairs(linksStream, delimiter);\n                    for(auto pair: mergePairs) {\n                        // apparently this also unlinks if already linked or crossing\n                        shapeGraph.linkShapesFromRefs(pair.first, pair.second);\n                    }\n                }\n            } else {\n                std::vector<PixelRefPair> newLinks;\n                PointMap& currentMap = mgraph->getDisplayedPointMap();\n                if(parser.getLinkType() == LinkParser::LinkType::COORDS) {\n                    std::vector<Line> mergeLines = EntityParsing::parseLines(linksStream, delimiter);\n                    std::vector<PixelRefPair> linkPairsFromCoords = depthmapX::pixelateMergeLines(mergeLines, currentMap);\n                    newLinks.insert(newLinks.end(), linkPairsFromCoords.begin(), linkPairsFromCoords.end());\n                } else {\n                    auto mergePairs = EntityParsing::parseRefPairs(linksStream, delimiter);\n                    for(auto pair: mergePairs) {\n                        newLinks.push_back(PixelRefPair(pair.first, pair.second));\n                    }\n                }\n                depthmapX::mergePixelPairs(newLinks, currentMap);\n            }\n        } else {\n            if(parser.getMapTypeGroup() == LinkParser::MapTypeGroup::SHAPEGRAPHS) {\n                auto& shapeGraph = mgraph->getDisplayedShapeGraph();\n                if(parser.getLinkType() == LinkParser::LinkType::COORDS) {\n                    auto mergePoints = EntityParsing::parsePoints(linksStream, delimiter);\n                    for(auto point: mergePoints) {\n                        shapeGraph.unlinkAtPoint(point);\n                    }\n                } else {\n                    auto mergePairs = EntityParsing::parseRefPairs(linksStream, delimiter);\n                    for(auto pair: mergePairs) {\n                        shapeGraph.unlinkShapesFromRefs(pair.first, pair.second);\n                    }\n                }\n            } else {\n                std::vector<PixelRefPair> newLinks;\n                PointMap& currentMap = mgraph->getDisplayedPointMap();\n                if(parser.getLinkType() == LinkParser::LinkType::COORDS) {\n                    std::vector<Line> mergeLines = EntityParsing::parseLines(linksStream, delimiter);\n                    std::vector<PixelRefPair> linkPairsFromCoords = depthmapX::pixelateMergeLines(mergeLines, currentMap);\n                    newLinks.insert(newLinks.end(), linkPairsFromCoords.begin(), linkPairsFromCoords.end());\n                } else {\n                    auto mergePairs = EntityParsing::parseRefPairs(linksStream, delimiter);\n                    for(auto pair: mergePairs) {\n                        newLinks.push_back(PixelRefPair(pair.first, pair.second));\n                    }\n                }\n                depthmapX::unmergePixelPairs(newLinks, currentMap);\n            }\n        }\n\n        perfWriter.addData(\"Linking graph\", t.getTimeInSeconds());\n        DO_TIMED(\"Writing graph\", mgraph->write(cmdP.getOuputFile().c_str(),METAGRAPH_VERSION, false);)\n    }\n\n    void runVga(const CommandLineParser &cmdP, const VgaParser &vgaP, const IRadiusConverter &converter, IPerformanceSink &perfWriter)\n    {\n        auto mgraph = loadGraph(cmdP.getFileName().c_str(), perfWriter);\n\n        std::unique_ptr<Options> options(new Options());\n\n        std::cout << \"Getting options...\" << std::flush;\n        switch(vgaP.getVgaMode())\n        {\n            case VgaParser::VgaMode::VISBILITY:\n                options->output_type = Options::OUTPUT_VISUAL;\n                options->local = vgaP.localMeasures();\n                options->global = vgaP.globalMeasures();\n                if (options->global )\n                {\n                    options->radius = converter.ConvertForVisibility(vgaP.getRadius());\n                }\n                break;\n            case VgaParser::VgaMode::METRIC:\n                options->output_type = Options::OUTPUT_METRIC;\n                options->radius = converter.ConvertForMetric(vgaP.getRadius());\n                break;\n            case VgaParser::VgaMode::ANGULAR:\n                options->output_type = Options::OUTPUT_ANGULAR;\n                break;\n            case VgaParser::VgaMode::ISOVIST:\n                options->output_type = Options::OUTPUT_ISOVIST;\n                break;\n            case VgaParser::VgaMode::THRU_VISION:\n                options->output_type = Options::OUTPUT_THRU_VISION;\n                break;\n            default:\n                throw depthmapX::SetupCheckException(\"Unsupported VGA mode\");\n        }\n        std::cout << \" ok\\nAnalysing graph...\" << std::flush;\n\n        DO_TIMED(\"Run VGA\", mgraph->analyseGraph(getCommunicator(cmdP).get(), *options, cmdP.simpleMode() ))\n        std::cout << \" ok\\nWriting out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mgraph->write(cmdP.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n        std::cout << \" ok\" << std::endl;\n    }\n\n    void fillGraph(MetaGraph& graph, const Point2f& point)\n    {\n        auto r = graph.getRegion();\n        if (!r.contains(point))\n        {\n            throw depthmapX::RuntimeException(\"Point outside of target region\");\n        }\n        graph.makePoints(point, 0, nullptr);\n    }\n\n    void runVisualPrep(\n            const CommandLineParser &clp,\n            double gridSize, const std::vector<Point2f> &fillPoints,\n            double maxVisibility,\n            bool boundaryGraph,\n            bool makeGraph,\n            bool unmakeGraph,\n            bool removeLinksWhenUnmaking,\n            IPerformanceSink &perfWriter)\n    {\n        auto mGraph = loadGraph(clp.getFileName().c_str(),perfWriter);\n\n        std::cout << \"Initial checks... \" << std::flush;\n        auto state = mGraph->getState();\n        if (~state & MetaGraph::LINEDATA)\n        {\n            throw depthmapX::RuntimeException(\"Graph must have line data before preparing VGA\");\n        }\n        if(gridSize > 0) {\n            // Create a new pointmap and set tha grid\n            QtRegion r = mGraph->getRegion();\n\n            GridProperties gp(__max(r.width(), r.height()));\n            if ( gridSize > gp.getMax() ||  gridSize < gp.getMin())\n            {\n                std::stringstream message;\n                message << \"Chosen grid spacing \" << gridSize << \" is outside of the expected interval of \"\n                        << gp.getMin() << \" <= spacing <= \" << gp.getMax() << std::flush;\n                throw depthmapX::RuntimeException(message.str());\n            }\n\n            std::cout << \"ok\\nSetting up grid... \" << std::flush;\n            mGraph->addNewPointMap();\n            DO_TIMED(\"Setting grid\", mGraph->setGrid(gridSize, Point2f(0.0, 0.0)))\n        } else if(mGraph->getPointMaps().empty()) {\n            std::stringstream message;\n            message << \"No map exists to use. Please create a new one by providing a grid size\" << std::flush;\n            throw depthmapX::RuntimeException(message.str());\n        }\n\n        if(unmakeGraph) {\n            if(!mGraph->getDisplayedPointMap().isProcessed()) {\n                std::stringstream message;\n                message << \"Current map has not had its graph made so there's nothing to unmake\" << std::flush;\n                throw depthmapX::RuntimeException(message.str());\n            }\n            DO_TIMED(\"Unmaking graph\", mGraph->getDisplayedPointMap().unmake(removeLinksWhenUnmaking))\n        } else {\n            if(fillPoints.size() > 0) {\n                std::cout << \"ok\\nFilling grid... \" << std::flush;\n                DO_TIMED(\"Filling grid\",\n                         for_each(fillPoints.begin(), fillPoints.end(), [&mGraph](const Point2f &point)->void{fillGraph(*mGraph, point);}))\n            }\n            if(makeGraph) {\n                std::cout << \"ok\\nMaking graph... \" << std::flush;\n                DO_TIMED(\"Making graph\", mGraph->makeGraph(getCommunicator(clp).get(), boundaryGraph ? 1 : 0, maxVisibility))\n            }\n        }\n\n        std::cout << \" ok\\nWriting out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n                std::cout << \" ok\" << std::endl;\n    }\n\n    void runAxialAnalysis(const CommandLineParser &clp, const AxialParser &ap, IPerformanceSink &perfWriter)\n    {\n        auto mGraph = loadGraph(clp.getFileName().c_str(), perfWriter);\n\n        auto state = mGraph->getState();\n        if ( ap.runAllLines())\n        {\n           if (~state & MetaGraph::LINEDATA)\n           {\n               throw depthmapX::RuntimeException(\"Line drawing must be loaded before axial map can be constructed\");\n           }\n           std::cout << \"Making all line map... \" << std::flush;\n           DO_TIMED(\"Making all axes map\", for_each (ap.getAllAxesRoots().begin(),ap.getAllAxesRoots().end(),\n                                                     [&mGraph, &clp](const Point2f &point)->void{mGraph->makeAllLineMap(getCommunicator(clp).get(), point);} ))\n           std::cout << \"ok\" << std::endl;\n        }\n\n        if (ap.runFewestLines())\n        {\n            if (~state & MetaGraph::LINEDATA)\n            {\n                throw depthmapX::RuntimeException(\"Line drawing must be loaded before fewest line map can be constructed\");\n            }\n            if (!mGraph->hasAllLineMap())\n            {\n                throw depthmapX::RuntimeException(\"All line map must be constructed before fewest lines can be constructed. Use -aa to do this\");\n            }\n            std::cout << \"Constructing fewest line map... \" << std::flush;\n            DO_TIMED(\"Fewest line map\", mGraph->makeFewestLineMap(getCommunicator(clp).get(), 1))\n            std::cout << \"ok\" << std::endl;\n        }\n\n        if (ap.runAnalysis())\n        {\n            std::cout << \"Running axial analysis... \" << std::flush;\n            Options options;\n            const std::vector<double>& radii = ap.getRadii();\n            options.radius_set.insert(radii.begin(), radii.end());\n            options.choice = ap.useChoice();\n            options.local = ap.useLocal();\n            options.fulloutput = ap.calculateRRA();\n            options.weighted_measure_col = -1;\n\n            if(!ap.getAttribute().empty()) {\n                const ShapeGraph& map = mGraph->getDisplayedShapeGraph();\n                const AttributeTable& table = map.getAttributeTable();\n                for (int i = 0; i < table.getNumColumns(); i++) {\n                    if(ap.getAttribute() == table.getColumnName(i).c_str()) {\n                        options.weighted_measure_col = i;\n                    }\n                }\n                if(options.weighted_measure_col == -1) {\n                    throw depthmapX::RuntimeException(\"Given attribute (\" + ap.getAttribute() +\n                                                      \") does not exist in currently selected map\");\n                }\n            }\n            DO_TIMED(\"Axial analysis\", mGraph->analyseAxial(getCommunicator(clp).get(), options, clp.simpleMode()))\n            std::cout << \"ok\\n\" << std::flush;\n\n        }\n        std::cout << \"Writing out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n        std::cout << \" ok\" << std::endl;\n\n    }\n\n    void runSegmentAnalysis(const CommandLineParser &clp, const SegmentParser &sp, IPerformanceSink &perfWriter)\n    {\n        auto mGraph = loadGraph(clp.getFileName().c_str(), perfWriter);\n\n        auto state = mGraph->getState();\n\n        std::cout << \"Running segment analysis... \" << std::flush;\n        Options options;\n        const std::vector<double>& radii = sp.getRadii();\n        options.radius_set.insert(radii.begin(), radii.end());\n        options.choice = sp.includeChoice();\n        options.tulip_bins = sp.getTulipBins();\n        options.weighted_measure_col = -1;\n\n        if(!sp.getAttribute().empty()) {\n            const ShapeGraph& map = mGraph->getDisplayedShapeGraph();\n            const AttributeTable& table = map.getAttributeTable();\n            for (int i = 0; i < table.getNumColumns(); i++) {\n                if(sp.getAttribute() == table.getColumnName(i).c_str()) {\n                    options.weighted_measure_col = i;\n                }\n            }\n            if(options.weighted_measure_col == -1) {\n                throw depthmapX::RuntimeException(\"Given attribute (\" + sp.getAttribute() +\n                                                  \") does not exist in currently selected map\");\n            }\n        }\n\n        switch(sp.getRadiusType()) {\n            case SegmentParser::RadiusType::SEGMENT_STEPS: {\n                options.radius_type = Options::RADIUS_STEPS;\n                break;\n            }\n            case SegmentParser::RadiusType::METRIC: {\n                options.radius_type = Options::RADIUS_METRIC;\n                break;\n            }\n            case SegmentParser::RadiusType::ANGULAR: {\n                options.radius_type = Options::RADIUS_ANGULAR;\n                break;\n            }\n            case SegmentParser::RadiusType::NONE:\n                break;\n        }\n        switch(sp.getAnalysisType()) {\n            case SegmentParser::AnalysisType::ANGULAR_TULIP: {\n                DO_TIMED(\"Segment tulip analysis\", mGraph->analyseSegmentsTulip(getCommunicator(clp).get(), options))\n                break;\n            }\n            case SegmentParser::AnalysisType::ANGULAR_FULL: {\n                DO_TIMED(\"Segment angular analysis\", mGraph->analyseSegmentsAngular(getCommunicator(clp).get(), options))\n                break;\n            }\n            case SegmentParser::AnalysisType::TOPOLOGICAL: {\n                options.output_type = 0;\n                DO_TIMED(\"Segment topological\", mGraph->analyseTopoMetMultipleRadii(getCommunicator(clp).get(), options))\n                break;\n            }\n            case SegmentParser::AnalysisType::METRIC: {\n                options.output_type = 1;\n                DO_TIMED(\"Segment metric\", mGraph->analyseTopoMetMultipleRadii(getCommunicator(clp).get(), options))\n                break;\n            }\n            case SegmentParser::AnalysisType::NONE:\n                throw depthmapX::RuntimeException(\"No segment analysis type given\");\n        }\n        std::cout << \"ok\\n\" << std::flush;\n\n        std::cout << \"Writing out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n        std::cout << \" ok\" << std::endl;\n\n    }\n\n    void runAgentAnalysis(const CommandLineParser &cmdP, const AgentParser &agentP, IPerformanceSink &perfWriter) {\n\n        auto mgraph = loadGraph(cmdP.getFileName().c_str(), perfWriter);\n\n        PointMap& currentMap = mgraph->getDisplayedPointMap();\n\n        AgentEngine& eng = mgraph->getAgentEngine();\n\n        // set up eng here...\n        if (!eng.agentSets.size()) {\n           eng.agentSets.push_back(AgentSet());\n        }\n\n        eng.m_timesteps = agentP.totalSystemTimestemps();\n        eng.agentSets.back().m_release_rate = agentP.releaseRate();\n        eng.agentSets.back().m_lifetime = agentP.agentLifeTimesteps();\n        if (agentP.agentFOV() == 32) {\n           eng.agentSets.back().m_vbin = -1;\n        }\n        else {\n           eng.agentSets.back().m_vbin = (agentP.agentFOV() - 1) / 2;\n        }\n        eng.agentSets.back().m_steps = agentP.agentStepsBeforeTurnDecision();\n        switch(agentP.getAgentMode()) {\n            case AgentParser::NONE:\n            case AgentParser::STANDARD:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_STANDARD;\n                break;\n            case AgentParser::LOS_LENGTH:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_LOS;\n                break;\n            case AgentParser::OCC_LENGTH:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_LOS_OCC;\n                break;\n            case AgentParser::OCC_ANY:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_ALL;\n                break;\n            case AgentParser::OCC_GROUP_45:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_BIN45;\n                break;\n            case AgentParser::OCC_GROUP_60:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_BIN60;\n                break;\n            case AgentParser::OCC_FURTHEST:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_STANDARD;\n                break;\n            case AgentParser::BIN_FAR_DIST:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_WEIGHT_DIST;\n                break;\n            case AgentParser::BIN_ANGLE:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_WEIGHT_ANG;\n                break;\n            case AgentParser::BIN_FAR_DIST_ANGLE:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_WEIGHT_DIST_ANG;\n                break;\n            case AgentParser::BIN_MEMORY:\n                eng.agentSets.back().m_sel_type = AgentProgram::SEL_OCC_MEMORY;\n                break;\n        }\n\n        // if the m_release_locations is not set the locations are\n        // set later by picking random pixels\n        if(agentP.randomReleaseLocationSeed() >= 0) {\n            eng.agentSets.back().m_release_locations_seed = agentP.randomReleaseLocationSeed();\n        }\n        else {\n            eng.agentSets.back().m_release_locations.clear();\n            for_each(agentP.getReleasePoints().begin(), agentP.getReleasePoints().end(),\n                     [&eng, &currentMap](const Point2f &point)\n                     ->void{eng.agentSets.back().m_release_locations.push_back(currentMap.pixelate(point, false));});\n        }\n\n        // the ui and code suggest that the results can be put on a separate\n        // 'data map', but the functionality does not seem to actually be\n        // there thus it is skipped for now\n        // eng.m_gatelayer = m_gatelayer;\n\n        // note, trails currently per run, but output per engine\n        if (agentP.recordTrailsForAgents() == 0) {\n            eng.m_record_trails = true;\n        }\n        else if (agentP.recordTrailsForAgents() > 0) {\n                eng.m_record_trails = true;\n                eng.m_trail_count = agentP.recordTrailsForAgents();\n        }\n\n        std::cout << \"ok\\nRunning agent analysis... \" << std::flush;\n        DO_TIMED(\"Running agent analysis\", eng.run(getCommunicator(cmdP).get(), &currentMap))\n        std::cout << \" ok\\nWriting out result...\" << std::flush;\n        std::vector<AgentParser::OutputType> resultTypes = agentP.outputTypes();\n        if(resultTypes.size() == 0)\n        {\n            // if no choice was made for an output type assume the user just\n            // wants a graph file\n\n            DO_TIMED(\"Writing graph\", mgraph->write(cmdP.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n        }\n        else if(resultTypes.size() == 1)\n        {\n            // if only one type of output is given, assume that the user has\n            // correctly entered a name with the correct extension and export\n            // exactly with that name and extension\n\n            switch(resultTypes[0]) {\n                case AgentParser::OutputType::GRAPH:\n                {\n                    DO_TIMED(\"Writing graph\", mgraph->write(cmdP.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n                    break;\n                }\n                case AgentParser::OutputType::GATECOUNTS:\n                {\n                    std::ofstream gatecountStream(cmdP.getOuputFile().c_str());\n                    DO_TIMED(\"Writing gatecounts\", currentMap.outputSummary(gatecountStream, ','))\n                    break;\n                }\n                case AgentParser::OutputType::TRAILS:\n                {\n                    std::ofstream trailStream(cmdP.getOuputFile().c_str());\n                    ShapeMap trailMap(\"Agent Trails\");\n                    eng.insertTrailsInMap(trailMap);\n                    DO_TIMED(\"Writing trails\", mgraph->writeMapShapesAsCat(trailMap, trailStream))\n                    break;\n                }\n            }\n        }\n        else\n        {\n            // if more than one output type is given assume the user has given\n            // a filename without an extension and thus the new file must have\n            // an extension. Also to avoid name clashes in cases where the user\n            // asked for outputs that would yield the same extension also add\n            // a related suffix\n\n            if(std::find(resultTypes.begin(), resultTypes.end(), AgentParser::OutputType::GRAPH) != resultTypes.end()) {\n                std::string outFile = cmdP.getOuputFile() + \".graph\";\n                DO_TIMED(\"Writing graph\", mgraph->write(outFile.c_str(),METAGRAPH_VERSION, false))\n            }\n            if(std::find(resultTypes.begin(), resultTypes.end(), AgentParser::OutputType::GATECOUNTS) != resultTypes.end()) {\n                std::string outFile = cmdP.getOuputFile() + \"_gatecounts.csv\";\n                std::ofstream gatecountStream(outFile.c_str());\n                DO_TIMED(\"Writing gatecounts\", currentMap.outputSummary(gatecountStream, ','))\n            }\n            if(std::find(resultTypes.begin(), resultTypes.end(), AgentParser::OutputType::TRAILS) != resultTypes.end()) {\n                std::string outFile = cmdP.getOuputFile() + \"_trails.cat\";\n                std::ofstream trailStream(outFile.c_str());\n                ShapeMap trailMap(\"Agent Trails\");\n                eng.insertTrailsInMap(trailMap);\n                DO_TIMED(\"Writing trails\", mgraph->writeMapShapesAsCat(trailMap, trailStream))\n            }\n        }\n    }\n\n    void runIsovists(const CommandLineParser &clp, const std::vector<IsovistDefinition> &isovists, IPerformanceSink &perfWriter)\n    {\n        auto mGraph = loadGraph(clp.getFileName().c_str(),perfWriter);\n\n        std::cout << \"Making \" << isovists.size() << \" isovists... \"  << std::flush;\n        DO_TIMED(\"Make isovists\", std::for_each(isovists.begin(), isovists.end(),\n            [&mGraph, &clp](const IsovistDefinition &isovist)->void{\n                mGraph->makeIsovist(getCommunicator(clp).get(), isovist.getLocation(), isovist.getLeftAngle(), isovist.getRightAngle(), clp.simpleMode());\n            }))\n        std::cout << \" ok\\nWriting out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n        std::cout << \" ok\" << std::endl;\n    }\n\n    void exportData(const CommandLineParser &cmdP, const ExportParser &exportP, IPerformanceSink &perfWriter ) {\n\n        auto mgraph = loadGraph(cmdP.getFileName().c_str(), perfWriter);\n\n        switch(exportP.getExportMode()) {\n            case ExportParser::POINTMAP_DATA_CSV:\n            {\n                PointMap& currentMap = mgraph->getDisplayedPointMap();\n                std::ofstream stream(cmdP.getOuputFile().c_str());\n                DO_TIMED(\"Writing pointmap data\", currentMap.outputSummary(stream, ','))\n                stream.close();\n                break;\n            }\n            case ExportParser::POINTMAP_CONNECTIONS_CSV:\n            {\n                PointMap& currentMap = mgraph->getDisplayedPointMap();\n                std::ofstream stream(cmdP.getOuputFile().c_str());\n                DO_TIMED(\"Writing pointmap connections\", currentMap.outputConnectionsAsCSV(stream, \",\"))\n                stream.close();\n                break;\n            }\n            case ExportParser::POINTMAP_LINKS_CSV:\n            {\n                PointMap& currentMap = mgraph->getDisplayedPointMap();\n                std::ofstream stream(cmdP.getOuputFile().c_str());\n                DO_TIMED(\"Writing pointmap connections\", currentMap.outputLinksAsCSV(stream, \",\"))\n                stream.close();\n                break;\n            }\n            case ExportParser::SHAPEGRAPH_MAP_CSV:\n            {\n                ShapeGraph& currentMap = mgraph->getDisplayedShapeGraph();\n                std::ofstream stream(cmdP.getOuputFile().c_str());\n                DO_TIMED(\"Writing pointmap connections\", currentMap.output(stream, ','))\n                stream.close();\n                break;\n            }\n            case ExportParser::SHAPEGRAPH_MAP_MIF:\n            {\n                ShapeGraph& currentMap = mgraph->getDisplayedShapeGraph();\n                std::string fileName = cmdP.getOuputFile().c_str();\n                std::string mifFile = fileName + \".mif\";\n                std::string midFile = fileName + \".mid\";\n                if (0 == fileName.compare(fileName.length() - 4, 4, \".mif\")) {\n                    // we are given the .mif\n                    mifFile = fileName;\n                    midFile = fileName.substr(0,  fileName.length() - 4) + \".mid\";\n\n                } else if (0 == fileName.compare(fileName.length() - 4, 4, \".mid\")) {\n                    // we are given the .mid\n                    mifFile = fileName.substr(0, fileName.length() - 4) + \".mif\";\n                    midFile = fileName;\n                }\n                std::ofstream mifStream(mifFile);\n                std::ofstream midStream(midFile);\n                DO_TIMED(\"Writing pointmap connections\", currentMap.outputMifMap(mifStream, midStream))\n                mifStream.close();\n                midStream.close();\n                break;\n            }\n            case ExportParser::SHAPEGRAPH_CONNECTIONS_CSV:\n            {\n                ShapeGraph& currentMap = mgraph->getDisplayedShapeGraph();\n                std::ofstream stream(cmdP.getOuputFile().c_str());\n                DO_TIMED(\"Writing shapegraph connections\",\n                         currentMap.isAxialMap() ? currentMap.writeAxialConnectionsAsPairsCSV(stream) :\n                                                   currentMap.writeSegmentConnectionsAsPairsCSV(stream))\n                stream.close();\n                break;\n            }\n            case ExportParser::SHAPEGRAPH_LINKS_UNLINKS_CSV:\n            {\n                ShapeGraph& currentMap = mgraph->getDisplayedShapeGraph();\n                std::ofstream stream(cmdP.getOuputFile().c_str());\n                DO_TIMED(\"Writing shapegraph links and unlinks\",\n                         currentMap.writeLinksUnlinksAsPairsCSV(stream))\n                stream.close();\n                break;\n            }\n            default:\n            {\n                throw depthmapX::SetupCheckException(\"Error, unsupported export mode\");\n            }\n        }\n    }\n\n    void runStepDepth(\n            const CommandLineParser &clp,\n            const StepDepthParser::StepType &stepType,\n            const std::vector<Point2f> &stepDepthPoints,\n            IPerformanceSink &perfWriter)\n    {\n        auto mGraph = loadGraph(clp.getFileName().c_str(),perfWriter);\n\n        std::cout << \"ok\\nSelecting cells... \" << std::flush;\n\n        for( auto & point : stepDepthPoints ) {\n            auto graphRegion = mGraph->getRegion();\n            if (!graphRegion.contains(point))\n            {\n                throw depthmapX::RuntimeException(\"Point outside of target region\");\n            }\n            QtRegion r(point, point);\n            mGraph->setCurSel(r, true);\n        }\n\n        std::cout << \"ok\\nCalculating step-depth... \" << std::flush;\n\n        Options options;\n        options.global = 0;\n\n        switch (stepType) {\n            case StepDepthParser::StepType::ANGULAR:\n                options.point_depth_selection = 3;\n                break;\n            case StepDepthParser::StepType::METRIC:\n                options.point_depth_selection = 2;\n                break;\n            case StepDepthParser::StepType::VISUAL:\n                options.point_depth_selection = 1;\n                break;\n            default: { throw depthmapX::SetupCheckException(\"Error, unsupported step type\"); }\n        }\n\n        DO_TIMED(\"Calculating step-depth\", mGraph->analyseGraph( getCommunicator(clp).get(), options, false))\n\n        std::cout << \" ok\\nWriting out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n                std::cout << \" ok\" << std::endl;\n    }\n\n    void runMapConversion(const CommandLineParser &clp, const MapConvertParser &mcp, IPerformanceSink &perfWriter)\n    {\n        auto mGraph = loadGraph(clp.getFileName().c_str(), perfWriter);\n\n        int currentMapType = mGraph->getDisplayedMapType();\n\n        if (currentMapType == ShapeMap::EMPTYMAP) {\n            if(mGraph->hasVisibleDrawingLayers()) {\n                currentMapType = ShapeMap::DRAWINGMAP;\n            } else {\n                throw depthmapX::RuntimeException(\"No currently available map to convert from\");\n            }\n        }\n\n        if (mcp.copyAttributes()) {\n            if(currentMapType != ShapeMap::DATAMAP &&\n                    currentMapType != ShapeMap::AXIALMAP &&\n                    currentMapType != ShapeMap::SEGMENTMAP) {\n                throw depthmapX::RuntimeException(\"Copying attributes is only available when \"\\\n                                                  \"converting between Data, Axial and Segment maps \"\\\n                                                  \"(current map type is not of those types)\");\n            }\n            if(mcp.outputMapType() != ShapeMap::DATAMAP &&\n                    mcp.outputMapType() != ShapeMap::AXIALMAP &&\n                    mcp.outputMapType() != ShapeMap::SEGMENTMAP) {\n                throw depthmapX::RuntimeException(\"Copying attributes is only available when \"\\\n                                                  \"converting between Data, Axial and Segment maps \"\\\n                                                  \"(selected output map type is not of those types)\");\n            }\n        }\n        if (mcp.removeStubLength() > 0) {\n            if(currentMapType != ShapeMap::AXIALMAP) {\n                throw depthmapX::RuntimeException(\"Removing stubs (-crsl) is only available when\"\\\n                                                  \"converting from Axial to Segment maps\"\\\n                                                  \"(current map type is not Axial)\");\n            }\n            if(mcp.outputMapType() != ShapeMap::SEGMENTMAP) {\n                throw depthmapX::RuntimeException(\"Removing stubs (-crsl) is only available when\"\\\n                                                  \"converting from Axial to Segment maps\"\\\n                                                  \"(selected output map type is not Segment)\");\n            }\n        }\n\n        switch(mcp.outputMapType()) {\n        case ShapeMap::DRAWINGMAP: {\n            DO_TIMED(\"Converting to drawing\",\n                     mGraph->convertToDrawing(getCommunicator(clp).get(), mcp.outputMapName(), currentMapType == ShapeMap::DATAMAP));\n            break;\n        }\n        case ShapeMap::AXIALMAP: {\n            switch(currentMapType) {\n            case ShapeMap::DRAWINGMAP: {\n                DO_TIMED(\"Converting from drawing to axial\",\n                         mGraph->convertDrawingToAxial(getCommunicator(clp).get(), mcp.outputMapName()));\n                break;\n            }\n            case ShapeMap::DATAMAP: {\n                DO_TIMED(\"Converting from data to axial\",\n                         mGraph->convertDataToAxial(getCommunicator(clp).get(), mcp.outputMapName(),\n                                                    !mcp.removeInputMap(), mcp.copyAttributes()));\n                break;\n            }\n            default: {\n                throw depthmapX::RuntimeException(\"Unsupported conversion to axial\");\n            }\n            }\n            break;\n        }\n        case ShapeMap::SEGMENTMAP: {\n            switch(currentMapType) {\n            case ShapeMap::DRAWINGMAP: {\n                DO_TIMED(\"Converting from drawing to segment\",\n                         mGraph->convertDrawingToSegment(getCommunicator(clp).get(), mcp.outputMapName()));\n                break;\n            }\n            case ShapeMap::AXIALMAP: {\n                DO_TIMED(\"Converting from axial to segment\",\n                         mGraph->convertAxialToSegment(getCommunicator(clp).get(), mcp.outputMapName(), !mcp.removeInputMap(),\n                                                       mcp.copyAttributes(), mcp.removeStubLength() / 100.0));\n                break;\n            }\n            case ShapeMap::DATAMAP: {\n                DO_TIMED(\"Converting from data to segment\",\n                         mGraph->convertDataToSegment(getCommunicator(clp).get(), mcp.outputMapName(),\n                                                      !mcp.removeInputMap(), mcp.copyAttributes()));\n                break;\n            }\n            default: {\n                throw depthmapX::RuntimeException(\"Unsupported conversion to segment\");\n            }\n            }\n            break;\n        }\n        case ShapeMap::DATAMAP: {\n            DO_TIMED(\"Converting to data\",\n                     mGraph->convertToData(getCommunicator(clp).get(), mcp.outputMapName(),\n                                           !mcp.removeInputMap(), currentMapType, mcp.copyAttributes()));\n            break;\n        }\n        case ShapeMap::CONVEXMAP: {\n            DO_TIMED(\"Converting to convex\",\n                     mGraph->convertToConvex(getCommunicator(clp).get(), mcp.outputMapName(),\n                                             !mcp.removeInputMap(), currentMapType, mcp.copyAttributes()));\n            break;\n        }\n        default: {\n            throw depthmapX::RuntimeException(\"Unsupported conversion\");\n        }\n        }\n\n        std::cout << \" ok\\nWriting out result...\" << std::flush;\n        DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(),METAGRAPH_VERSION, false))\n                std::cout << \" ok\" << std::endl;\n    }\n}\n"
  },
  {
    "path": "depthmapXcli/runmethods.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n#include \"commandlineparser.h\"\n#include \"radiusconverter.h\"\n#include \"performancesink.h\"\n#include \"vgaparser.h\"\n#include \"axialparser.h\"\n#include \"mapconvertparser.h\"\n#include \"segmentparser.h\"\n#include \"agentparser.h\"\n#include \"exportparser.h\"\n#include \"linkparser.h\"\n#include \"importparser.h\"\n#include \"stepdepthparser.h\"\n#include \"salalib/isovistdef.h\"\n#include <vector>\n\n#define CONCAT_(x,y) x##y\n#define CONCAT(x,y) CONCAT_(x,y)\n#define DO_TIMED(message, code)\\\n    SimpleTimer CONCAT(t_, __LINE__); \\\n    code; \\\n    perfWriter.addData(message, CONCAT(t_, __LINE__).getTimeInSeconds());\n\nclass Line;\nclass Point2f;\n\nnamespace dm_runmethods{\n    std::unique_ptr<MetaGraph> loadGraph(const std::string& filename, IPerformanceSink &perfWriter);\n    void importFiles(const CommandLineParser &cmdP, const ImportParser &parser, IPerformanceSink &perfWriter);\n    void linkGraph(const CommandLineParser &cmdP, const LinkParser &parser, IPerformanceSink &perfWriter );\n    void runVga(const CommandLineParser &cmdP, const VgaParser &vgaP, const IRadiusConverter &converter, IPerformanceSink &perfWriter );\n    void runVisualPrep(const CommandLineParser &clp, double gridSize, const std::vector<Point2f> &fillPoints, double maxVisibility, bool boundaryGraph, bool makeGraph, bool unmakeGraph, bool removeLinksWhenUnmaking, IPerformanceSink &perfWriter);\n    void runAxialAnalysis(const CommandLineParser& clp, const AxialParser &ap, IPerformanceSink &perfWriter);\n    void runSegmentAnalysis(const CommandLineParser& clp, const SegmentParser &sp, IPerformanceSink &perfWriter);\n    void runAgentAnalysis(const CommandLineParser &cmdP, const AgentParser &agentP, IPerformanceSink &perfWriter );\n    void runIsovists(const CommandLineParser &cmdP, const std::vector<IsovistDefinition> &isovists, IPerformanceSink &perfWriter );\n    void exportData(const CommandLineParser &cmdP, const ExportParser &exportP, IPerformanceSink &perfWriter );\n    void runStepDepth(const CommandLineParser &clp, const StepDepthParser::StepType &stepType, const std::vector<Point2f> &stepDepthPoints, IPerformanceSink &perfWriter);\n    void runMapConversion(const CommandLineParser& clp, const MapConvertParser &mcp, IPerformanceSink &perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/segmentparser.cpp",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"segmentparser.h\"\n#include \"parsingutils.h\"\n#include \"exceptions.h\"\n#include \"salalib/entityparsing.h\"\n#include \"runmethods.h\"\n#include <cstring>\n\nusing namespace depthmapX;\n\nSegmentParser::SegmentParser() :  m_analysisType(AnalysisType::NONE), m_radiusType(RadiusType::NONE), m_includeChoice(false),\n    m_tulipBins(0)\n{\n\n}\n\nstd::string SegmentParser::getModeName() const\n{\n    return \"SEGMENT\";\n}\n\nstd::string SegmentParser::getHelp() const\n{\n    return  \"Mode options for Segment Analysis:\\n\"\\\n            \"  -st  <type of analysis> one of:\\n\"\n            \"       tulip (Angular Tulip - Faster)\\n\"\\\n            \"       angular (Angular Full - Slower)\\n\"\\\n            \"       topological\\n\"\\\n            \"       metric\\n\"\\\n            \"  -sr  <radius/list of radii>\\n\"\\\n            \"  -srt <radius type> (only for Tulip) one of:\\n\"\\\n            \"       steps\\n\"\\\n            \"       metric\\n\"\\\n            \"       angular\\n\"\\\n            \"  -sic to include choice (only for Tulip)\\n\"\\\n            \"  -stb <tulip bins> (4 to 1024, 1024 approximates full angular)\\n\"\\\n            \"  -swa <map attribute name> perform weighted analysis using this attribute (only for Tulip)\\n\";\n}\n\nvoid SegmentParser::parse(int argc, char **argv)\n{\n    for (int i = 1; i < argc; ++i)\n    {\n        if ( std::strcmp (\"-st\", argv[i]) == 0)\n        {\n            if (m_analysisType != AnalysisType::NONE)\n            {\n                throw CommandLineException(\"-st can only be used once, modes are mutually exclusive\");\n            }\n            ENFORCE_ARGUMENT(\"-st\", i)\n            if ( std::strcmp(argv[i], \"tulip\") == 0 )\n            {\n                m_analysisType = AnalysisType::ANGULAR_TULIP;\n            }\n            else if ( std::strcmp(argv[i], \"angular\") == 0 )\n            {\n                m_analysisType = AnalysisType::ANGULAR_FULL;\n            }\n            else if ( std::strcmp(argv[i], \"topological\") == 0 )\n            {\n                m_analysisType = AnalysisType::TOPOLOGICAL;\n            }\n            else if ( std::strcmp(argv[i], \"metric\") == 0 )\n            {\n                m_analysisType = AnalysisType::METRIC;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid SEGMENT mode: \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-srt\") == 0)\n        {\n            if (m_radiusType != RadiusType::NONE)\n            {\n                throw CommandLineException(\"-srt can only be used once, modes are mutually exclusive\");\n            }\n            ENFORCE_ARGUMENT(\"-srt\", i)\n            if ( std::strcmp(argv[i], \"steps\") == 0 )\n            {\n                m_radiusType = RadiusType::SEGMENT_STEPS;\n            }\n            else if ( std::strcmp(argv[i], \"angular\") == 0 )\n            {\n                m_radiusType = RadiusType::ANGULAR;\n            }\n            else if ( std::strcmp(argv[i], \"metric\") == 0 )\n            {\n                m_radiusType = RadiusType::METRIC;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid SEGMENT radius type: \") + argv[i]);\n            }\n        }\n        else if(std::strcmp(argv[i], \"-sic\") == 0)\n        {\n            m_includeChoice = true;\n        }\n        else if (std::strcmp(argv[i], \"-sr\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-sr\", i)\n            m_radii = depthmapX::parseRadiusList(argv[i]);\n        }\n        else if (std::strcmp(argv[i], \"-stb\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-stb\", i)\n\n            if (!has_only_digits(argv[i]))\n            {\n                throw CommandLineException(std::string(\"-stb must be a number between 4 and 1024, got \") + argv[i]);\n            }\n            m_tulipBins = std::atoi(argv[i]);\n            if (m_tulipBins < 4 || m_tulipBins > 1024)\n            {\n                throw CommandLineException(std::string(\"-stb must be a number between 4 and 1024, got \") + argv[i]);\n            }\n        }\n        else if (std::strcmp(argv[i], \"-swa\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-swa\", i)\n            m_attribute = argv[i];\n        }\n    }\n\n    if (getAnalysisType() == AnalysisType::NONE)\n    {\n        throw CommandLineException(\"No analysis type given\");\n    }\n\n    if (getRadii().empty())\n    {\n        throw CommandLineException(\"At least one radius must be provided\");\n    }\n\n    if (getAnalysisType() == AnalysisType::ANGULAR_TULIP && getRadiusType() == RadiusType::NONE)\n    {\n        throw CommandLineException(\"Radius type is required for tulip analysis\");\n    }\n\n    if (getAnalysisType() == AnalysisType::ANGULAR_TULIP && getTulipBins() == 0)\n    {\n        throw CommandLineException(\"Tulip bins are required for tulip analysis\");\n    }\n\n    if (getAnalysisType() != AnalysisType::ANGULAR_TULIP\n            && (getTulipBins() != 0 || getRadiusType() != RadiusType::NONE || m_includeChoice))\n    {\n        throw CommandLineException(\"-stb, -srt and -sic can only be used with tulip analysis\");\n    }\n}\n\nvoid SegmentParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runSegmentAnalysis(clp, *this, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/segmentparser.h",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"genlib/p2dpoly.h\"\n\nclass SegmentParser : public IModeParser\n{\npublic:\n    SegmentParser();\n\n    // IModeParser interface\npublic:\n    std::string getModeName() const;\n    std::string getHelp() const;\n    void parse(int argc, char **argv);\n    void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    enum class AnalysisType {\n        NONE,\n        ANGULAR_TULIP,\n        ANGULAR_FULL,\n        TOPOLOGICAL,\n        METRIC\n    };\n\n    enum class RadiusType {\n        NONE,\n        SEGMENT_STEPS,\n        ANGULAR,\n        METRIC\n    };\n\n    AnalysisType getAnalysisType() const { return m_analysisType; }\n\n    RadiusType getRadiusType() const { return m_radiusType; }\n\n    bool includeChoice() const { return m_includeChoice; }\n\n    int getTulipBins() const { return m_tulipBins; }\n\n    const std::vector<double> getRadii() const { return m_radii;}\n\n    const std::string getAttribute() const { return m_attribute;}\n\nprivate:\n    AnalysisType m_analysisType;\n    RadiusType m_radiusType;\n    bool m_includeChoice;\n    int m_tulipBins;\n    std::vector<double> m_radii;\n    std::string m_attribute;\n};\n"
  },
  {
    "path": "depthmapXcli/simpletimer.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <chrono>\n\nclass SimpleTimer\n{\npublic:\n    SimpleTimer() : m_startTime(std::chrono::high_resolution_clock::now())\n    {\n    }\n\n    double getTimeInSeconds() const\n    {\n         auto t2 = std::chrono::high_resolution_clock::now();\n        return static_cast<double>(std::chrono::duration_cast<std::chrono::milliseconds>(t2-m_startTime).count()) / 1000.0;\n    }\n\n    void reset()\n    {\n        m_startTime = std::chrono::high_resolution_clock::now();\n    }\n\nprivate:\n    std::chrono::time_point<std::chrono::high_resolution_clock> m_startTime;\n};\n"
  },
  {
    "path": "depthmapXcli/stepdepthparser.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"stepdepthparser.h\"\n#include \"exceptions.h\"\n#include \"parsingutils.h\"\n#include \"salalib/entityparsing.h\"\n#include \"runmethods.h\"\n#include <sstream>\n#include <cstring>\n\nusing namespace depthmapX;\n\nvoid StepDepthParser::parse(int argc, char ** argv)\n{\n\n    std::vector<std::string> points;\n    std::string pointFile;\n    for ( int i = 1; i < argc; ++i )\n    {\n        if ( std::strcmp (\"-sdp\", argv[i]) == 0)\n        {\n            if (!pointFile.empty())\n            {\n                throw CommandLineException(\"-sdp cannot be used together with -sdf\");\n            }\n            ENFORCE_ARGUMENT(\"-sdp\", i)\n            if (!has_only_digits_dots_commas(argv[i]))\n            {\n                std::stringstream message;\n                message << \"Invalid step depth point provided (\"\n                        << argv[i]\n                        << \"). Should only contain digits dots and commas\"\n                        << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            points.push_back(argv[i]);\n        }\n        else if ( std::strcmp(\"-sdf\", argv[i]) == 0 )\n        {\n            if (!points.empty())\n            {\n                throw CommandLineException(\"-sdf cannot be used together with -sdp\");\n            }\n            ENFORCE_ARGUMENT(\"-sdf\", i)\n            pointFile = argv[i];\n        }\n        else if ( std::strcmp (\"-sdt\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-sdt\", i)\n            if ( std::strcmp(argv[i], \"angular\") == 0 )\n            {\n                m_stepType = StepType::ANGULAR;\n            }\n            else if ( std::strcmp(argv[i], \"metric\") == 0 )\n            {\n                m_stepType = StepType::METRIC;\n            }\n            else if ( std::strcmp(argv[i], \"visual\") == 0 )\n            {\n                m_stepType = StepType::VISUAL;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid step type: \") + argv[i]);\n            }\n        }\n    }\n\n    if (pointFile.empty() && points.empty())\n    {\n        throw CommandLineException(\"Either -sdp or -sdf must be given\");\n    }\n\n    if(!pointFile.empty())\n    {\n        std::ifstream pointsStream(pointFile);\n        if (!pointsStream)\n        {\n            std::stringstream message;\n            message << \"Failed to load file \" << pointFile << \", error \" << std::strerror(errno) << std::flush;\n            throw depthmapX::RuntimeException(message.str().c_str());\n        }\n        std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, '\\t');\n        m_stepDepthPoints.insert(std::end(m_stepDepthPoints), std::begin(parsed), std::end(parsed));\n    }\n    else if(!points.empty())\n    {\n        std::stringstream pointsStream;\n        pointsStream << \"x,y\";\n        std::vector<std::string>::iterator iter = points.begin(), end =\n        points.end();\n        for ( ; iter != end; ++iter )\n        {\n            pointsStream << \"\\n\" << *iter;\n        }\n        std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, ',');\n        m_stepDepthPoints.insert(std::end(m_stepDepthPoints), std::begin(parsed), std::end(parsed));\n    }\n\n    if (m_stepType == StepType::NONE)\n    {\n        throw CommandLineException(\"Step depth type (-sdt) must be provided\");\n    }\n}\n\nvoid StepDepthParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runStepDepth(clp, m_stepType, m_stepDepthPoints, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/stepdepthparser.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n\nclass StepDepthParser : public IModeParser\n{\npublic:\n    StepDepthParser() : m_stepType(StepType::NONE)\n    {}\n\n    virtual std::string getModeName() const\n    {\n        return \"STEPDEPTH\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return \"Mode options for pointmap STEPDEPTH are:\\n\" \\\n               \"  -sdp <step depth point> point where to calculate step depth from. Can be repeated\\n\" \\\n               \"  -sdf <step depth point file> a file with a point per line to calculate step depth from\\n\" \\\n               \"  -sdt <type> step type. One of metric, angular or visual\\n\";\n    }\n\n    enum class StepType {\n        NONE,\n        ANGULAR,\n        METRIC,\n        VISUAL\n    };\n\n    virtual void parse(int argc, char** argv);\n\n    virtual void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    std::vector<Point2f> getStepDepthPoints() const { return m_stepDepthPoints; }\n\n    StepType getStepType() const { return m_stepType; }\n\nprivate:\n    std::vector<Point2f> m_stepDepthPoints;\n\n    StepType m_stepType;\n};\n\n\n"
  },
  {
    "path": "depthmapXcli/vgaparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"vgaparser.h\"\n#include \"exceptions.h\"\n#include <cstring>\n#include \"radiusconverter.h\"\n#include \"runmethods.h\"\n#include \"parsingutils.h\"\n\nusing namespace depthmapX;\n\n\nVgaParser::VgaParser() : m_vgaMode(VgaMode::NONE), m_localMeasures(false), m_globalMeasures(false)\n{}\n\nvoid VgaParser::parse(int argc, char *argv[])\n{\n    for ( int i = 1; i < argc;  )\n    {\n\n        if ( std::strcmp (\"-vm\", argv[i]) == 0)\n        {\n            if (m_vgaMode != VgaMode::NONE)\n            {\n                throw CommandLineException(\"-vm can only be used once, modes are mutually exclusive\");\n            }\n            ENFORCE_ARGUMENT(\"-vm\", i)\n            if ( std::strcmp(argv[i], \"isovist\") == 0 )\n            {\n                m_vgaMode = VgaMode::ISOVIST;\n            }\n            else if ( std::strcmp(argv[i], \"visibility\") == 0 )\n            {\n                m_vgaMode = VgaMode::VISBILITY;\n            }\n            else if ( std::strcmp(argv[i], \"metric\") == 0 )\n            {\n                m_vgaMode = VgaMode::METRIC;\n            }\n            else if ( std::strcmp(argv[i], \"angular\") == 0 )\n            {\n                m_vgaMode = VgaMode::ANGULAR;\n            }\n            else if ( std::strcmp(argv[i], \"thruvision\") == 0)\n            {\n                m_vgaMode = VgaMode::THRU_VISION;\n            }\n            else\n            {\n                throw CommandLineException(std::string(\"Invalid VGA mode: \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp(argv[i], \"-vg\") == 0 )\n        {\n            m_globalMeasures = true;\n        }\n        else if ( std::strcmp(argv[i], \"-vl\") == 0 )\n        {\n            m_localMeasures = true;\n        }\n        else if (std::strcmp(argv[i], \"-vr\") == 0)\n        {\n            ENFORCE_ARGUMENT(\"-vr\", i)\n            m_radius = argv[i];\n        }\n        ++i;\n    }\n\n    if(m_vgaMode == VgaMode::NONE)\n    {\n        m_vgaMode = VgaMode::ISOVIST;\n    }\n\n    if (m_vgaMode == VgaMode::VISBILITY && m_globalMeasures)\n    {\n        if (m_radius.empty())\n        {\n            throw CommandLineException(\"Global measures in VGA/visibility analysis require a radius, use -vr <radius>\");\n        }\n        if (m_radius != \"n\" && !has_only_digits(m_radius))\n        {\n            throw CommandLineException(std::string(\"Radius must be a positive integer number or n, got \") + m_radius);\n        }\n\n    }\n    else if (m_vgaMode == VgaMode::METRIC)\n    {\n        if (m_radius.empty())\n        {\n            throw CommandLineException(\"Metric vga requires a radius, use -vr <radius>\");\n        }\n    }\n}\n\nvoid VgaParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    RadiusConverter radiusConverter;\n    dm_runmethods::runVga(clp, *this, radiusConverter, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/vgaparser.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <string>\n#include \"imodeparser.h\"\n#include \"commandlineparser.h\"\n\nclass VgaParser : public IModeParser\n{\npublic:\n    virtual std::string getModeName() const\n    {\n        return \"VGA\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return    \"Mode options for VGA:\\n\"\\\n                  \"-vm <vga mode> one of isovist, visiblity, metric, angular, thruvision\\n\"\\\n                  \"-vg turn on global measures for visibility, requires radius between 1 and 99 or n\\n\"\\\n                  \"-vl turn on local measures for visibility\\n\"\\\n                  \"-vr set visibility radius\\n\";\n    }\n\npublic:\n    VgaParser();\n    virtual void parse(int argc, char *argv[]);\n    virtual void run(const CommandLineParser &clp, IPerformanceSink& perfWriter) const;\n\n    enum VgaMode{\n        NONE,\n        ISOVIST,\n        VISBILITY,\n        METRIC,\n        ANGULAR,\n        THRU_VISION\n    };\n\n    // vga options\n    VgaMode getVgaMode() const { return m_vgaMode; }\n    bool localMeasures() const { return m_localMeasures; }\n    bool globalMeasures() const { return m_globalMeasures; }\n    const std::string & getRadius() const { return m_radius; }\nprivate:\n    // vga options\n    VgaMode m_vgaMode;\n    bool m_localMeasures;\n    bool m_globalMeasures;\n    std::string m_radius;\n};\n\n"
  },
  {
    "path": "depthmapXcli/visprepparser.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"visprepparser.h\"\n#include \"exceptions.h\"\n#include \"parsingutils.h\"\n#include \"salalib/entityparsing.h\"\n#include \"runmethods.h\"\n#include <sstream>\n#include <cstring>\n\nusing namespace depthmapX;\n\nvoid VisPrepParser::parse(int argc, char ** argv)\n{\n\n    // All options:\n    // Create grid (m_grid > 0)\n    // Fill grid (pointFile or points not empty)\n    // Make graph\n    // Unmake graph\n\n    // All possible combinations:\n    // Create Grid + Fill Grid\n    // Create Grid + Fill Grid + Make graph\n    // Fill Grid\n    // Fill Grid + Make graph\n    // Make Graph\n    // Unmake Graph\n\n    // Bad combinations:\n    // Create Grid + Make graph = Creates empty graph\n    // Unmake graph + Anything else = Pointless action\n\n    std::vector<std::string> points;\n    std::string pointFile;\n    for ( int i = 1; i < argc; ++i )\n    {\n        if ( std::strcmp (\"-pg\", argv[i]) == 0)\n        {\n            if (m_grid >= 0)\n            {\n                throw CommandLineException(\"-pg can only be used once\");\n            }\n            ENFORCE_ARGUMENT(\"-pg\", i)\n            m_grid = std::atof(argv[i]);\n            if (m_grid <= 0)\n            {\n                throw CommandLineException(std::string(\"-pg must be a number >0, got \") + argv[i]);\n            }\n        }\n        else if ( std::strcmp (\"-pp\", argv[i]) == 0)\n        {\n            if (!pointFile.empty())\n            {\n                throw CommandLineException(\"-pp cannot be used together with -pf\");\n            }\n            ENFORCE_ARGUMENT(\"-pp\", i)\n            if (!has_only_digits_dots_commas(argv[i]))\n            {\n                std::stringstream message;\n                message << \"Invalid fill point provided (\"\n                        << argv[i]\n                        << \"). Should only contain digits dots and commas\"\n                        << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            points.push_back(argv[i]);\n        }\n        else if ( std::strcmp(\"-pf\", argv[i]) == 0 )\n        {\n            if (!points.empty())\n            {\n                throw CommandLineException(\"-pf cannot be used together with -pp\");\n            }\n            ENFORCE_ARGUMENT(\"-pf\", i)\n            pointFile = argv[i];\n        }\n        else if ( std::strcmp(\"-pr\", argv[i]) == 0)\n        {\n            ENFORCE_ARGUMENT(\"-pr\", i);\n            m_maxVisibility = std::atof(argv[i]);\n            if ( m_maxVisibility == 0.0)\n            {\n                std::stringstream message;\n                message << \"Restricted visibility of '\" << argv[i] << \"' makes no sense, use a positive number or -1 for unrestricted\";\n                throw CommandLineException(message.str());\n            }\n        }\n        else if ( std::strcmp(\"-pb\", argv[i]) == 0 )\n        {\n            m_boundaryGraph = true;\n        }\n        else if ( std::strcmp(\"-pm\", argv[i]) == 0 )\n        {\n            if (getUnmakeGraph())\n            {\n                throw CommandLineException(\"-pm cannot be used together with -pu\");\n            }\n            m_makeGraph = true;\n        }\n        else if ( std::strcmp(\"-pu\", argv[i]) == 0 )\n        {\n            if (getMakeGraph())\n            {\n                throw CommandLineException(\"-pu cannot be used together with -pm\");\n            }\n            m_unmakeGraph = true;\n        }\n        else if ( std::strcmp(\"-pl\", argv[i]) == 0 )\n        {\n            m_removeLinksWhenUnmaking = true;\n        }\n    }\n\n    if(!getMakeGraph() && !getUnmakeGraph() && m_grid <= 0 && pointFile.empty() && points.empty())\n    {\n        throw CommandLineException(\"Nothing to do\");\n    }\n\n    if(m_grid > 0 && getMakeGraph() && pointFile.empty() && points.empty()) {\n        throw CommandLineException(\"Creating a graph for an unfilled grid is not possible. \" \\\n                                   \"Either -pp or -pf must be given\");\n    }\n\n    if(!pointFile.empty())\n    {\n        std::ifstream pointsStream(pointFile);\n        if (!pointsStream)\n        {\n            std::stringstream message;\n            message << \"Failed to load file \" << pointFile << \", error \" << std::strerror(errno) << std::flush;\n            throw depthmapX::RuntimeException(message.str().c_str());\n        }\n        std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, '\\t');\n        m_fillPoints.insert(std::end(m_fillPoints), std::begin(parsed), std::end(parsed));\n    }\n    else if(!points.empty())\n    {\n        std::stringstream pointsStream;\n        pointsStream << \"x,y\";\n        std::vector<std::string>::iterator iter = points.begin(), end =\n        points.end();\n        for ( ; iter != end; ++iter )\n        {\n            pointsStream << \"\\n\" << *iter;\n        }\n        std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, ',');\n        m_fillPoints.insert(std::end(m_fillPoints), std::begin(parsed), std::end(parsed));\n\n    }\n\n    if(getUnmakeGraph() && (m_grid > 0 || !m_fillPoints.empty())) {\n        throw CommandLineException(\"-pu can not be used with any other option apart from -pl\");\n    }\n\n    if(m_removeLinksWhenUnmaking && !m_unmakeGraph) {\n        throw CommandLineException(\"-pl can only be used together with -pu\");\n    }\n}\n\nvoid VisPrepParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const\n{\n    dm_runmethods::runVisualPrep(clp, m_grid, m_fillPoints, m_maxVisibility, m_boundaryGraph, m_makeGraph, m_unmakeGraph, m_removeLinksWhenUnmaking, perfWriter);\n}\n"
  },
  {
    "path": "depthmapXcli/visprepparser.h",
    "content": "﻿// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"imodeparser.h\"\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n\nclass VisPrepParser : public IModeParser\n{\npublic:\n    VisPrepParser() : m_grid(-1.0), m_maxVisibility(-1.0), m_boundaryGraph(false), m_makeGraph(false), m_unmakeGraph(false), m_removeLinksWhenUnmaking(false)\n    {}\n\n    virtual std::string getModeName() const\n    {\n        return \"VISPREP\";\n    }\n\n    virtual std::string getHelp() const\n    {\n        return \"Mode options for VISPREP (visual analysis preparation) are:\\n\"  \\\n               \"  -pg <gridsize> floating point number defining the grid spacing. If this\\n\" \\\n               \"      is provided it will create a new map\\n\" \\\n               \"  -pp <fillpoint> point where to fill. Can be repeated\\n\" \\\n               \"  -pf <fillpoint file> a file with a point per line to fill\\n\" \\\n               \"  -pr <max visibility> restrict visibility (-1 is unrestricted, default)\\n\" \\\n               \"  -pb Make boundary graph\\n\" \\\n               \"  -pm Make graph\\n\" \\\n               \"  -pu Unmake graph\\n\" \\\n               \"  -pl Remove links when unmaking\\n\";\n    }\n\n    virtual void parse(int argc, char** argv);\n\n    virtual void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    double getGrid() const { return m_grid; }\n    std::vector<Point2f> getFillPoints() const { return m_fillPoints; }\n    bool getBoundaryGraph() const { return m_boundaryGraph; }\n    double getMaxVisibility() const { return m_maxVisibility; }\n    bool getMakeGraph() const { return m_makeGraph; }\n    bool getUnmakeGraph() const { return m_unmakeGraph; }\n    bool getRemoveLinksWhenUnmaking() const { return m_removeLinksWhenUnmaking; }\n\nprivate:\n    double m_grid;\n    std::vector<Point2f> m_fillPoints;\n    double m_maxVisibility;\n    bool m_boundaryGraph;\n    bool m_makeGraph;\n    bool m_unmakeGraph;\n    bool m_removeLinksWhenUnmaking;\n};\n\n\n"
  },
  {
    "path": "docs/about.md",
    "content": "## About depthmapX\n\ndepthmapX is a multi-platform  software platform to perform a set of spatial network analyses designed to understand social processes within the built environment. It works at a variety of scales from building through small urban to whole cities or states. At each scale, the aim of the software is to produce a map of open space elements, connect them via some relationship (for example, intervisibility or overlap) and then perform graph analysis of the resulting network. The objective of the analysis is to derive variables which may have social or experiential significance.\n\nAt the building or small urban scale, depthmapX can be used to assess the visual accessibility in a number of ways. It can produce point isovists, that is, polygons representing the visually accessible area from a location, along with measures of those polygons (such as perimeter, area and so on), or it can further join a dense grid of isovists into a visibility graph of intervisible points (with graphs of up to about 1000000 point locations). The visibility graph may then be analysed directly using graph measures, or used as the core of an agent-based analysis. In the agent-based analysis a number of software agents representing pedestrians are released into the environment. Each software agent is able to access the visual accessibility information for its current location from the visibility graph, and this informs its choice of next destination. The numbers of agents passing through gates can be counted, and compared to actual numbers of pedestrians passing through gates.\n\nAt the small to medium urban scale, depthmapX can be used to derive an ‘axial map’ of a layout. That is, derive a reduced straight-line network of the open space in an environment. The axial map has been the staple of space syntax research for many years, but the mathematical derivation of it is novel. The automatic derivation allows an objective map for research into city form and function. Once the map has been generated, it may be analysed using graph measures, and the measures may be transferred to gate layers in order to compare with indicators of pedestrian or social behaviour. For larger systems where the derivation algorithm becomes cumbersome, pre-drawn axial maps may be imported.\n\nAxial maps may be broken into segment maps, or segment maps, such as road-centre line maps, may be imported directly. These may be analysed using a variety of techniques, such as according to angular separation, road distance, or segment steps. For example, number of shortest angular paths through a segment may be calculated, or the average road distance from each segment to all others may be calculated.\n\nThe analyses described so far are fairly fixed, however depthmapX also offers the capability of extension through two levels of interface. The first level, a scripting interface based on the Python language, allows researchers to calculate new derived measures as well as to add graph measures, such as circuit lengths, for each of the graph types. It also allows the ability to select groups of nodes according to value or according to simple algorithms. The second level, the Software Developers’ Kit (SDK) allows programmers the ability to write new forms of analysis. For example, researchers at the West Japan Railway Company have used the software developers’ kit to add new agent-based analysis where agents are directed through a station layout including ticket barriers and signposting.\n\ndepthmapX can display information as coloured maps, tables and scattergrams that comparing measures against other measures or observed data, as well as a three-dimensional view of agents walking. Data for plans can be imported from AutoCAD’s DXF format, or from Ordnance Survey NTF files or US Tiger Line maps, as well as from GIS through MapInfo’s MIF/MID format. Export may also be to MIF/MID, or to text files which may be analysed further using statistical analysis packages. Additionally, maps may be exported as vector graphics EPS files, or by copying and pasting into other software such as Microsoft Word.\n\n\n"
  },
  {
    "path": "docs/building.md",
    "content": "# Building depthmapX\n\n## Building natively\n\nTo build depthmapX on your machine, you need the following dependencies:\n- A C++ compiler that supports C++-11 or later. Tested compilers are \n  - MSVC 2015 or later (on Windows)\n  - Clang (on MacOS and Linux)\n  - g++ (on Linux)\n- Qt 5.7 or later\n- cmake 3.13 or later - this is a fairly recent version\n\nIf these dependencies are available, then building depthmapX should be\n```\nmkdir build\ncd build\ncmake ..\nmake\n```\n\n## Building in docker\n\ndepthmapX can be built in a docker container that provides an image including\nall the required dependencies. It will build depthmapX on Unbuntu 18.04, i.e. \nit will produce a linux executable. The docker image can also be used to run \nthe command line app interactively.\nIn order to use the docker build image, docker must be running on the computer\nin use - please refer to the docker documentation at www.docker.com.\n\n### Windows\n\nTo run the docker build on windows, use this command line:\n```\ndocker run -v <path to your code location>\\depthmapX:/mnt/code/ -it blackseamonster/depthmapx-buildenv:0.3 bash -c ci/build.sh\n```\n\nTo run the build environment interactively, use\n```\ndocker run -v <path to your code location>\\depthmapX:/mnt/code/ -it blackseamonster/depthmapx-buildenv:0.3 bash\n```\n\n### Mac/Linux\n\nTo run the docker build on a Unix based system, use this command line:\n```\ndocker run --security-opt seccomp:unconfined --user $UID -v $PWD:/mnt/code blackseamonster/depthmapx-buildenv:0.3 bash -c ci/build.sh\n```\n\nTo run the build environment interactively, use:\n```\ndocker run --security-opt seccomp:unconfined --user $UID -v $PWD:/mnt/code blackseamonster/depthmapx-buildenv:0.3 bash\n```\n\n## Using an IDE\n\nAs depthmapX uses cmake as build toolchain, any IDE that supports cmake should be usable.\n"
  },
  {
    "path": "docs/commandline.md",
    "content": "# depthmapX Command Line Interface\n\n## Overview\nThe depthmapX command line interface allows to run steps that are traditionally\nexecuted by loading a file into the GUI and clicking buttons/menu entries\nby running a command from a command line/shell.\n\nThe command line interface is especially useful in cases where a similar kind of\nanalysis needs to be repeated regularly, as\nthe steps can be written into a script and run automatically or \nsemi-automatically, do not require user input via mouse/GUI and can be \nparallelised into multiple processes or on multiple machines.\n\nThe general idea is that each call to the command line interface reads in a\ndepthmapX graph file, then applies some transformation/analysis to it and saves\nthe result into a different file. Thus, a pipeline of operations can be\ncreated where each step reads in the input of the previous step, and in the end\nwe have the end result and all intermediate steps.  This is particularly helpful\nif something has gone wrong, as we can go back, figure out which step went wrong\nand rerun this and all subsequent steps.\n\nThe command line interface also supports importing of data from DXF and csv \nformats and export to csv so that a whole pipeline from plan to statistical\noutput can be run programmatically.\n\n## The Command Line\n\nThe functionality in the depthmapX cli is split up into execution modes - each\nmode roughly represents a class of functionalities in the UI. The overall \ncommandline looks like:\n\nMac/Linux: `./depthmapXcli -f <infile.graph> -o <outfile.graph> -m <mode> [mode \noptions]`  \nWindows: `depthmapXcli.exe -f <infile.graph> -o <outfile.graph> -m <mode>\n[mode options]`\n\n### Global option\n\nThese are command line parameters that can be used for any run of the \napplication, no matter what the used mode is.\n\n- `-m <mode>` This chooses the mode (what depthmapX operation to execute). \nAvailable modes are\n  - `VGA` run visual graph analysis\n  - `LINK` create extra links between pixels\n  - `VISPREP` various operations to prepare a blank map for VGA or agent \n  analysis\n  - `AXIAL` run axial analysis\n  - `AGENTS` run an agent analysis\n  - `ISOVIST` calculate isovists\n  - `EXPORT` export data from the given graph file\n  - `IMPORT` import data into a graph file\n- `-f <filename>` input graph file to base the operation on\n- `-o <output file>` graph file the result of the operation will be written to\n- `-h` print a help text and exit\n- `-s` enable simple mode (off by default)\n- `-t <runtimes csv file>` enables dumping of the time used for various steps of\nthe processing into the specified file.\n\nEach mode has a set of suboptions to tailor what exactly will we done.\n\n### Mode options for `VGA`\n\n- `-vm` Sets the VGA mode. This option must be set when using `VGA`. These \nreflect the options from the VGA submenu in\nthe depthmap UI. Possible options are\n  - `isovist`\n  - `visibility`\n  - `metric`\n  - `angular`\n  - `thruvision`\n- `-vg` Turn on global measures (optional). When set, `-vr` must be used to set\na visibility radius.\n- `-vl` Turn on local measures (optional).\n- `-vr <radius>` Set the visibility radius to a number between 1 and 99 steps.\n\n\n### Mode options for `LINK`\n\nUse this mode to add links to a grid before running a `VGA` analysis. It takes\ntuples of coordinates and links the two closes pixels (as if using the link\ntool in the graphical user interface - the coordinates represent the mouse \npositions when clicking). This mode either takes a list of tuples on the command\nline, or it reads it in from a file\n\n- `-lf <links file>` Reads in the link coordinates from a file.\n- `-lnk <link coordinates> Defines one link to be made in the format \n`x1,y1,x2,y2` - e.g. to link from 0.0,0.0 to 1.0,2.3, specify 0.0,0.0,1.0,2.3.\n\nThe file format for the links file is 4 tabulator separated columns with headers\nx1, x2, y1, and y2. So the file for the example above would be:\n```\nx1  y1  x2  y2\n0.0 0.0 1.0 2.3\n```\n\n### Mode options for `VISPREP`\n\nThis mode can be used to run the preparation steps required after a map (dxf) \nhas been imported into depthmapX, but before a VGA or agent analysis can be\nrun. It will define a grid, fill the graph, and run the connectivity \ncalculation. It takes the following options\n- `-pg <gridsize>` defines the grid size in units of your drawing\n- `-pp <coordinate>` Defines a point where the fill algorithm starts in `x,y`\nformat. This option can be repeated if separate parts of the plan need to be\nfilled.\n- `-pf <point file>` Reads the points for filling from the specified file (tab\nseparated, headers `X` and `Y`). This option cannot be combined with `-pp`\n- `-pr <max visibility>` This restricts the visiblity in the connectivity \ncalculation to the given value. The default value is unrestricted (`-1`)\n- `-pb` Enables creating a boundary graph.\n\nExample: `./depthmapXcli_macos -f gallery.graph -o gallery_prep.graph -m VISPREP\n-pg 0.4 -pf 3.0,4.0 -pr 5`\n\n### Mode options for `AXIAL`\n\nThis modes runs the various things that depthmapX can do around axial analysis.\nIt has two different kinds of options: command options that specify what to run,\nand modifiers that impact how these are run. \n\nEach command options expects an input file that has the required inputs for \nthese options (e.g. an axial analysis expects the graph file to contain an\naxial map). The command options are\n- `-xl <coordinate>` Calculate an all lines map starting at the point given in\n`x,y` format.\n- `-xf` reduce an all lines map to a fewest lines map. Expects an axial map\nthat can be reduced to be in the graph file.\n- `-xu` Process unlink data (not yet supported on the command line)\n- `-xa` run the actual axial analysis. Expects an axial map to be present in \nthe graph file.\n\nThese command flags can be combined within one run, they will always run in the\norder `-xl -xf -xu -xa` and each step can produce the input for the next.\n\nIn addition to these flags, the following modifiers are available\n- `-xac` Include choice (betweenness) calculations\n- `-xal` Include local measures\n- `-xar` Include RA, RRA and total depth calculations\n\n\n### Mode options for `AGENTS`\n- `-am <agent mode>` one of\n  - `standard`\n  - `los-length` (Line of Sight length)\n  - `occ-length` (Occluded length)\n  - `occ-any` (Any occlusions)\n  - `occ-group-45` (Occlusion group bins - 45 degrees)\n  - `occ-group-60` (Occlusion group bins - 60 degrees)\n  - `occ-furthest` (Furthest occlusion per bin)\n  - `bin-far-dist` (Per bin far distance weighted)\n  - `bin-angle` (Per bin angle weighted)\n  - `bin-far-dist-angle` (Per bin far-distance and angle weighted)\n  - `bin-memory` (Per bin memory)\n- `-ats <timesteps>` set total system timesteps to be run\n- `-arr <rate>` set agent release rate (likelyhood of release per timestep)\n- `-atrails <no of trails>` record trails for this amount of agents (set to 0 \nto record all, with max possible currently = 50)\n- `-afov <fov>` set agent field-of-view (bins)\n- `-asteps <steps>` set agent steps before turn decision\n- `-alife <timesteps>` set agent total lifetime (in timesteps)\n- `-alocseed <seed>` set agents to start at random locations with specific seed (0 to 10)\n- `-alocfile <agent starting points file>`\n- `-aloc <coordinates>` provide the single agent starting point in format \n`x1,y1` for example `-aloc 0.1,0.2`.\n- `-ot <output type>` available output types (may use more than one\n  - `graph` (graph file, default)\n  - `gatecounts` (csv with cells of grid with gate counts)\n  - `trails` (csv with lines showing path traversed by each agent)\n\n### Mode options for `ISOVIST`\n- `-ii <x,y[,angle,viewangle]>` Define an isoivist at position x,y with\n    optional direction angle and view angle for partial isovists\n- `-if <isovist file>` load isovist definitions from a file (csv)\n    the relevant headers must be called x, y, angle and viewangle\n    the latter two are optional.\n\nThose two arguments cannot be mixed\nAngles for partial isovists are in degrees, counted anti-clockwise with 0\npointing to the right.\n\n\n### Mode options for `EXPORT`\nThis mode exports data from a graph file to a csv for further analysis in \nother tools, e.g. Excel or a statistics package. Thus, the output file (`-o` \nargument) should be a csv file, not a graph file in this mode.\n- `-em <export mode>` one of\n  - `pointmap-data-csv`\n  - `pointmap-connections-csv`\n\n### Mode options for `IMPORT`\nThe file provided by -f here will be used as the base. If that fileis not a \ngraph, a new graph will be created and the file will be imported.\n- `-if <file(s) to import>` one or more files to import\n\nExample for importing a dxf:\n\n`./depthmapXcli -f in.dxf -o out.graph`\n"
  },
  {
    "path": "docs/formatting.md",
    "content": "Formatting is done with ClangFormat with the following options:\n\n- IndentWidth: 4\n- ColumnLimit: 119\n- NamespaceIndentation: All\n"
  },
  {
    "path": "docs/gui.md",
    "content": "# depthmapX Graphical User Interface\n\nThe graphical user interface is the standard way of interacting with depthmapX.\nIt allows to load files, import plans, runs analyses and explore the data in\nan interactive way.\n\nA lot of the available functionality has been described in the [Depthmap Manual \nfor Dummies](./DepthmapManualForDummies-v13.pdf) by Akkie van Nes, which is slightly\noutdated but still worth a read to get an idea how things work in the GUI.\n\n"
  },
  {
    "path": "docs/howdoi.md",
    "content": "Calculate NACh and NAIn\n---\nNACh (Normalised Angular Choice) and NAIn (Normalised Angular Integration) were introduced in Hillier et al. (2012).\nTo create them first calculate Choice and Total depth (Tools -> Segment -> Run Angular Segment Analysis..., include choice), create the two new attributes/columns (Attributes -> Add Column) and finally set their formulas (Attribute -> Update Column).\n\nAccording to Hillier et al. (2012) the equation for NACh is:  \n**`NACh = log( ACH + 1) / log( ATD + 3)`**  \nwhere `ACH = Angular Choice` and `ATD = Angular Total Depth`.  \nThus the formula in depthmapX needs to be:  \n**`log(value(\"T1024 Choice\") + 1) / log(value(\"T1024 Total Depth\") + 3)`**,  \nassuming that the analysis carried out was Angular Tulip analysis with 1024 bins and no radius limit.\n\nThe equivalent for NAIn is:  \n**`NAIn = NC ^ 1.2 / ATD`**  \nwhere `NC = Node Count` and `ATD = Angular Total Depth`.  \nThus the formula for depthmapX needs to be:  \n**`value(\"T1024 Node Count\")^1.2 / value(\"T1024 Total Depth\")`**  \n\n\nReferences:\n- Hillier, W. R. G., Yang, T., & Turner, A. (2012). Normalising least angle choice in Depthmap - And how it opens up new perspectives on the global and local analysis of city space. Journal of Space Syntax, 3(2), 155–193.\n"
  },
  {
    "path": "docs/index.md",
    "content": "# depthmapX Documentation\n\ndepthmapX is a tool for spatial analysis, originally written as a research\nproject by Alasdair Turner (targeting the Windows platform only), then later\nported to Qt and made available cross platform by Tasos Varoudis, and is now\nunder active development by a small team of members of Bartlett School of \nArchitecture at UCL and volunteers.\n\n## Table of Contents\n- [About](./about.md)\n- [Using the Graphical User Interface (GUI)](./gui.md)\n- [The command line interface](./commandline.md)\n- [Building depthmapX yourself](./building.md)\n\n"
  },
  {
    "path": "genlib/CMakeLists.txt",
    "content": "set(genlib genlib)\nset(genlib_SRCS\n    bsptree.cpp  \n    p2dpoly.cpp  \n    pafmath.cpp  \n    stringutils.cpp  \n    xmlparse.cpp)\n\nadd_compile_definitions(GENLIB_LIBRARY)\n\nadd_library(${genlib} STATIC ${genlib_SRCS})\n"
  },
  {
    "path": "genlib/bsptree.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010 University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"bsptree.h\"\n\n#include <stack>\n\n// Binary Space Partition\n\n/* Takes a set of lines and creates a binary-space-partition tree by starting from a\n * root node, setting its left and right nodes and recursively doing the same process\n * over those. Through this process the set of lines is split in two (one set for each\n * left and right nodes) and those are split and passed again further down the recursion.\n * While the original implementation was actually recursive it was hitting the recursion\n * limit when the input was a large number of lines that fell on the same side (i.e. an\n * arc divided in 500 pieces). It has been refactored here to an iterative solution, where\n * the current node (left or right) is pushed to a stack along with the relevant set of lines.\n */\n\nvoid BSPTree::make(Communicator *communicator, time_t atime, const std::vector<TaggedLine> &lines, BSPNode *root) {\n\n    typedef std::pair<std::vector<TaggedLine>, std::vector<TaggedLine>> TagLineVecPair;\n\n    std::stack<BSPNode *> nodeStack;\n    std::stack<TagLineVecPair> lineStack;\n\n    nodeStack.push(root);\n    lineStack.push(makeLines(communicator, atime, lines, root));\n\n    int progress = 0;\n    while (!nodeStack.empty()) {\n        progress++; // might need to increase by 2 because it was one for each left/right in the previous iteration\n\n        if (communicator) {\n            if (communicator->IsCancelled()) {\n                throw Communicator::CancelledException();\n            }\n            if (qtimer(atime, 500)) {\n                communicator->CommPostMessage(Communicator::CURRENT_RECORD, progress);\n            }\n        }\n        BSPNode *currNode = nodeStack.top();\n        nodeStack.pop();\n        TagLineVecPair currLines = lineStack.top();\n        lineStack.pop();\n\n        if (!currLines.first.empty()) {\n            currNode->m_left = std::unique_ptr<BSPNode>(new BSPNode(currNode));\n            nodeStack.push(currNode->m_left.get());\n            lineStack.push(makeLines(communicator, atime, currLines.first, currNode->m_left.get()));\n        }\n        if (!currLines.second.empty()) {\n            currNode->m_right = std::unique_ptr<BSPNode>(new BSPNode(currNode));\n            nodeStack.push(currNode->m_right.get());\n            lineStack.push(makeLines(communicator, atime, currLines.second, currNode->m_right.get()));\n        }\n    }\n}\n\n/* Finds the midpoint from all the lines given and returns the index of the line\n * closest to it.\n */\n\nint BSPTree::pickMidpointLine(const std::vector<TaggedLine> &lines, BSPNode *par) {\n    int chosen = -1;\n    Point2f midpoint;\n    for (size_t i = 0; i < lines.size(); i++) {\n        midpoint += lines[i].line.start() + lines[i].line.end();\n    }\n    midpoint /= 2.0 * lines.size();\n    bool ver = true;\n    if (par && par->getLine().height() > par->getLine().width()) {\n        ver = false;\n    }\n    double chosendist = -1.0;\n    for (size_t i = 0; i < lines.size(); i++) {\n        const Line &line = lines[i].line;\n        if (ver) {\n            if (line.height() > line.width() && (chosen == -1 || dist(line.midpoint(), midpoint) < chosendist)) {\n                chosen = static_cast<int>(i);\n                chosendist = dist(line.midpoint(), midpoint);\n            }\n        } else {\n            if (line.width() > line.height() && (chosen == -1 || dist(line.midpoint(), midpoint) < chosendist)) {\n                chosen = static_cast<int>(i);\n                chosendist = dist(line.midpoint(), midpoint);\n            }\n        }\n    }\n    // argh... and again... there weren't any hoz / ver:\n    if (chosen == -1) {\n        for (size_t i = 0; i < lines.size(); i++) {\n            if (chosen == -1 || dist(lines[i].line.midpoint(), midpoint) < chosendist) {\n                chosen = static_cast<int>(i);\n                chosendist = dist(lines[i].line.midpoint(), midpoint);\n            }\n        }\n    }\n    return chosen;\n}\n\n/* Breaks a set of lines in two (left-right). First chooses a line closest to the midpoint\n * of the set (\"chosen\") and then classifies lines left or right depending on whether they\n * lie clockwise or anti-clockwise of the chosen one (with chosen start as centre, angles\n * from the chosen end up to 180 are clockwise, down to -180 anti-clockwise). Lines that cross\n * from one side of the chosen to the other are split in two and each part goes to the relevant set.\n */\n\nstd::pair<std::vector<TaggedLine>, std::vector<TaggedLine>>\nBSPTree::makeLines(Communicator *, time_t, const std::vector<TaggedLine> &lines, BSPNode *base) {\n    std::vector<TaggedLine> leftlines;\n    std::vector<TaggedLine> rightlines;\n\n    // for optimization of the tree (this reduced a six-minute gen time to a 38 second gen time)\n    int chosen = -1;\n    if (lines.size() > 3) {\n        chosen = BSPTree::pickMidpointLine(lines, base->m_parent);\n    } else {\n        chosen = pafrand() % lines.size();\n    }\n\n    Line chosenLine = lines[chosen].line;\n    int chosenTag = lines[chosen].tag;\n    base->setLine(chosenLine);\n    base->setTag(chosenTag);\n\n    Point2f v0 = chosenLine.end() - chosenLine.start();\n    v0.normalise();\n\n    for (size_t i = 0; i < lines.size(); i++) {\n        if (i == static_cast<unsigned int>(chosen)) {\n            continue;\n        }\n        const Line &testline = lines[i].line;\n        int tag = lines[i].tag;\n        Point2f v1 = testline.start() - chosenLine.start();\n        v1.normalise();\n        Point2f v2 = testline.end() - chosenLine.start();\n        v2.normalise();\n        // should use approxeq here:\n        double a = testline.start() == chosenLine.start() ? 0 : det(v0, v1);\n        double b = testline.end() == chosenLine.start() ? 0 : det(v0, v2);\n        // note sure what to do if a == 0 and b == 0 (i.e., it's parallel... this test at least ensures on the line is\n        // one or the other side)\n        if (a >= 0 && b >= 0) {\n            leftlines.push_back(TaggedLine(testline, tag));\n        } else if (a <= 0 && b <= 0) {\n            rightlines.push_back(TaggedLine(testline, tag));\n        } else {\n            Point2f p = intersection_point(chosenLine, testline);\n            Line x = Line(testline.start(), p);\n            Line y = Line(p, testline.end());\n            if (a >= 0) {\n                if (x.length() > 0.0) // should use a tolerance here too\n                    leftlines.push_back(TaggedLine(x, tag));\n                if (y.length() > 0.0) // should use a tolerance here too\n                    rightlines.push_back(TaggedLine(y, tag));\n            } else {\n                if (x.length() > 0.0) // should use a tolerance here too\n                    rightlines.push_back(TaggedLine(x, tag));\n                if (y.length() > 0.0) // should use a tolerance here too\n                    leftlines.push_back(TaggedLine(y, tag));\n            }\n        }\n    }\n\n    return std::make_pair(leftlines, rightlines);\n}\n"
  },
  {
    "path": "genlib/bsptree.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010 University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n\n#include <memory>\n\n// Binary Space Partition\n\nstruct BSPNode {\n\n  private:\n    Line m_line;\n    int m_tag;\n\n  public:\n    enum { BSPLEFT, BSPRIGHT };\n    std::unique_ptr<BSPNode> m_left;\n    std::unique_ptr<BSPNode> m_right;\n    BSPNode *m_parent;\n\n    BSPNode(BSPNode *parent = NULL) : m_left(nullptr), m_right(nullptr) {\n        m_parent = parent;\n        m_tag = -1;\n    }\n    bool isLeaf() { return m_left == nullptr && m_right == nullptr; }\n    int classify(const Point2f &p) {\n        Point2f v0 = m_line.end() - m_line.start();\n        v0.normalise();\n        Point2f v1 = p - m_line.start();\n        v1.normalise();\n        if (det(v0, v1) >= 0) {\n            return BSPLEFT;\n        } else {\n            return BSPRIGHT;\n        }\n    }\n    const Line &getLine() const { return m_line; }\n    void setLine(const Line &line) { m_line = line; }\n    int getTag() const { return m_tag; }\n    void setTag(const int tag) { m_tag = tag; }\n};\n\nnamespace BSPTree {\n    void make(Communicator *communicator, time_t atime, const std::vector<TaggedLine> &lines, BSPNode *root);\n    int pickMidpointLine(const std::vector<TaggedLine> &lines, BSPNode *par);\n    std::pair<std::vector<TaggedLine>, std::vector<TaggedLine>>\n    makeLines(Communicator *communicator, time_t atime, const std::vector<TaggedLine> &lines, BSPNode *base);\n} // namespace BSPTree\n"
  },
  {
    "path": "genlib/comm.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#pragma once\r\n\r\n//#include <io.h>\r\n#include <fstream>\r\n#include <string>\r\n#include <chrono>\r\n#include <sys/types.h>\r\n#include <vector>\r\n\r\n#ifdef _WIN32\r\n// Quick mod - TV\r\n#pragma warning(disable : 4244)\r\n#pragma warning(disable : 4100)\r\n#else\r\n\r\n#endif\r\n\r\nconst char *const g_default_file_set = \"File set\";\r\n\r\nstruct FilePath {\r\n    std::string m_path;\r\n    std::string m_name;\r\n    std::string m_ext;\r\n    FilePath(const std::string &pathname) {\r\n        size_t dot = pathname.find_last_of('.');\r\n#ifdef _WIN32\r\n        size_t slash = pathname.find_last_of('\\\\'); // WIN32\r\n#else\r\n        size_t slash = pathname.find_last_of('/'); // Other\r\n#endif\r\n        if (slash != std::string::npos) {\r\n            m_path = pathname.substr(0, slash + 1);\r\n        }\r\n        if (dot != std::string::npos) {\r\n            m_name = pathname.substr(slash + 1, dot - slash - 1);\r\n            m_ext = pathname.substr(dot + 1);\r\n        } else {\r\n            m_name = pathname.substr(slash + 1);\r\n        }\r\n    }\r\n};\r\n\r\nclass Communicator {\r\n  public:\r\n    class CancelledException // throw from your class\r\n    {\r\n      public:\r\n        CancelledException() { ; }\r\n    };\r\n    enum { NUM_STEPS, CURRENT_STEP, NUM_RECORDS, CURRENT_RECORD };\r\n\r\n  protected:\r\n    bool m_cancelled;\r\n    bool m_delete_flag;\r\n    // nb. converted to Win32 UTF-16 Unicode path (AT 31.01.11) Linux, MacOS use UTF-8 (AT 29.04.11)\r\n    std::string m_infilename;\r\n    std::ifstream *m_infile;\r\n    std::ifstream *m_infile2; // <- MapInfo MIF files come in two parts\r\n    std::ofstream *m_outfile;\r\n    // nb. converted to Win32 UTF-16 Unicode path (AT 31.01.11) Linux, MacOS use UTF-8 (AT 29.04.11)\r\n    std::vector<std::string> m_fileset; // <- sometimes you want to load a whole set of files\r\n  public:\r\n    Communicator() {\r\n        m_infile = NULL;\r\n        m_infile2 = NULL;\r\n        m_outfile = NULL;\r\n        m_cancelled = false;\r\n        m_delete_flag = false;\r\n    }\r\n    //\r\n    bool GetDeleteFlag() // used by ICommunicator and IComm together\r\n    {\r\n        return m_delete_flag;\r\n    }\r\n    //\r\n    virtual ~Communicator() {\r\n        if (m_infile)\r\n            delete m_infile;\r\n        m_infile = NULL;\r\n        if (m_infile2)\r\n            delete m_infile2;\r\n        m_infile2 = NULL;\r\n        if (m_outfile)\r\n            delete m_outfile;\r\n        m_outfile = NULL;\r\n    }\r\n    //\r\n    void SetInfile(const char *filename) {\r\n        m_infile = new std::ifstream(filename);\r\n        FilePath fp(filename);\r\n        m_infilename = fp.m_name;\r\n    }\r\n    void SetInfile2(const char *filename) { m_infile2 = new std::ifstream(filename); }\r\n    std::string GetInfileName() { return m_fileset.size() ? std::string(g_default_file_set) : m_infilename; }\r\n    std::string GetMBInfileName() {\r\n        std::string ret;\r\n        if (m_fileset.size()) {\r\n            ret = \"File set\";\r\n        } else {\r\n            ret = std::string(m_infilename.c_str());\r\n        }\r\n        return ret;\r\n    }\r\n    size_t GetInfileSize() {\r\n        if (m_infile) {\r\n            m_infile->seekg(0, std::ios::beg);\r\n            size_t begin_pos = m_infile->tellg();\r\n            m_infile->seekg(0, std::ios::end);\r\n            size_t end_pos = m_infile->tellg();\r\n            m_infile->seekg(0, std::ios::beg);\r\n            return size_t(end_pos - begin_pos);\r\n        }\r\n        return 0;\r\n    }\r\n    void SetOutfile(const char *filename) { m_outfile = new std::ofstream(filename); }\r\n    //\r\n    bool IsCancelled() const { return m_cancelled; }\r\n    void Cancel() { m_cancelled = true; }\r\n    //\r\n    std::ifstream &getInFileStream() { return *m_infile; }\r\n    std::ifstream &GetInfile2() { return *m_infile2; }\r\n    //\r\n    const std::vector<std::string> &GetFileSet() const { return m_fileset; }\r\n    //\r\n    virtual void CommPostMessage(int m, int x) const = 0; // Override for specific operating system\r\n};\r\n\r\n// this is a simple version of the Communicator which can be used for\r\n// an interface\r\n\r\nclass ICommunicator : public Communicator {\r\n    friend class IComm; // IComm is found in idepthmap.h\r\n                        //\r\n  protected:\r\n    mutable int num_steps;\r\n    mutable int num_records;\r\n    mutable int step;\r\n    mutable int record;\r\n    //\r\n  public:\r\n    ICommunicator() { m_delete_flag = true; } // note: an ICommunicator lets IComm know that it should delete it\r\n    virtual ~ICommunicator() { ; }\r\n    virtual void CommPostMessage(int m, int x) const;\r\n};\r\n\r\ninline void ICommunicator::CommPostMessage(int m, int x) const {\r\n    switch (m) {\r\n    case Communicator::NUM_STEPS:\r\n        num_steps = x;\r\n        break;\r\n    case Communicator::CURRENT_STEP:\r\n        step = x;\r\n        break;\r\n    case Communicator::NUM_RECORDS:\r\n        num_records = x;\r\n        break;\r\n    case Communicator::CURRENT_RECORD:\r\n        record = x;\r\n        break;\r\n    default:\r\n        break;\r\n    }\r\n}\r\n\r\n// a helpful little function...\r\n// This function is used exclusively to update the communicators at specific intervals (set in milliseconds\r\n// by the timeout argument). Typical usage: Create a time_t t1 and pass to this function with timeout = 0,\r\n// setting thus t1 to the current time in milliseconds. Then continuously pass the same t1 to this function\r\n// along with an interval timeout (in most cases 500ms). The function only synchronises t1 to the current\r\n// time if its difference to the current time is longer than the interval (i.e. more than 500 milliseconds\r\n// have passed since the last synchronisation). If a synchronisation occurs then the communicator is\r\n// updated along with the equivalent user interface element.\r\n// TODO: All time handling in the application uses time_t and stores milliseconds in it, though time_t\r\n// is supposed to only store seconds. Replace with std::chrono::time_point everywhere\r\ninline bool qtimer(time_t &t1, time_t timeout) {\r\n    auto time2 = std::chrono::system_clock::now().time_since_epoch();\r\n    time_t t2 = std::chrono::duration_cast<std::chrono::milliseconds>(time2).count();\r\n    if ((t2 - t1) > timeout || (t2 - t1) < 0) { // also catch a loop\r\n        t1 = t2;\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "genlib/containerutils.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <algorithm>\n#include <map>\n\nnamespace depthmapX {\n\n    template <typename T> void findAndErase(std::vector<T> &vec, T element) {\n        auto it = std::find(vec.begin(), vec.end(), element);\n        if (it != vec.end())\n            vec.erase(it);\n    }\n\n    template <typename T> bool addIfNotExists(std::vector<T> &vec, T element) {\n        auto it = std::find(vec.begin(), vec.end(), element);\n        if (it == vec.end()) {\n            vec.push_back(element);\n            return true;\n        }\n        return false;\n    }\n\n    template <typename K, typename V> bool addIfNotExists(std::map<K, V> &map, const K &key, const V &value) {\n        auto it = map.find(key);\n        if (it == map.end()) {\n            map[key] = value;\n            return true;\n        }\n        return false;\n    }\n\n    template <typename K, typename V>\n    typename std::map<K, V>::const_iterator getMapAtIndex(const std::map<K, V> &m, size_t idx) {\n        auto iter = m.begin();\n        std::advance(iter, idx);\n        return iter;\n    }\n\n    template <typename K, typename V> typename std::map<K, V>::iterator getMapAtIndex(std::map<K, V> &m, size_t idx) {\n        auto iter = m.begin();\n        std::advance(iter, idx);\n        return iter;\n    }\n\n    template <typename K, typename V> int findIndexFromKey(const std::map<K, V> &m, K key) {\n        auto iter = m.find(key);\n        return iter == m.end() ? -1 : std::distance(m.begin(), iter);\n    }\n\n    template <typename TContainer, typename TValue>\n    typename TContainer::iterator findBinary(TContainer &container, const TValue val) {\n        auto res = std::lower_bound(container.begin(), container.end(), val);\n        if (res == container.end() || val < *res) {\n            return container.end();\n        }\n        return res;\n    }\n\n    template <typename TContainer, typename TValue>\n    typename TContainer::const_iterator findBinary(const TContainer &container, const TValue val) {\n        auto res = std::lower_bound(container.begin(), container.end(), val);\n        if (res == container.end() || val < *res) {\n            return container.end();\n        }\n        return res;\n    }\n\n    template <typename T> typename std::vector<T>::iterator insert_sorted(std::vector<T> &vec, T const &item) {\n        return vec.insert(std::upper_bound(vec.begin(), vec.end(), item), item);\n    }\n\n} // namespace depthmapX\n"
  },
  {
    "path": "genlib/exceptions.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <exception>\n#include <string>\n\nnamespace depthmapX {\n    class BaseException : public std::exception {\n      public:\n        BaseException() {}\n        BaseException(std::string message) : _message(message) {}\n        virtual const char *what() const noexcept { return _message.c_str(); }\n\n      private:\n        std::string _message;\n    };\n\n    class RuntimeException : public BaseException {\n      public:\n        RuntimeException(std::string message) : BaseException(message) {}\n    };\n} // namespace depthmapX\n"
  },
  {
    "path": "genlib/lgpl.txt",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "genlib/linreg.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010 University College London, Alasdair Turner\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n\n// linear regression\n// T should be int, float or double\ntemplate <class T> struct LinReg {\n    double S_x;\n    double S_y;\n    double S_xx;\n    double S_yy;\n    double S_xy;\n    double n;\n    //\n    bool cached;\n    double ca;\n    double cb;\n    //\n    LinReg() {\n        S_x = 0;\n        S_y = 0;\n        S_xx = 0;\n        S_yy = 0;\n        S_xy = 0;\n        n = 0;\n        cached = false;\n    }\n    void clear() {\n        S_x = 0;\n        S_y = 0;\n        S_xx = 0;\n        S_yy = 0;\n        S_xy = 0;\n        n = 0;\n        cached = false;\n    }\n    void add(T x, T y) {\n        n++;\n        S_x += double(x);\n        S_y += double(y);\n        S_xx += sqr(double(x));\n        S_yy += sqr(double(y));\n        S_xy += double(x) * double(y);\n        cached = false;\n    }\n    void makecache() {\n        cb = (n * S_xy - S_x * S_y) / (n * S_xx - S_x * S_x);\n        ca = (S_y - cb * S_x) / n;\n        cached = true;\n    }\n    // Y = bX + a\n    double a() {\n        if (!cached)\n            makecache();\n        return ca;\n    }\n    double b() {\n        if (!cached)\n            makecache();\n        return cb;\n    }\n    double r() { return (n * S_xy - S_x * S_y) / sqrt((n * S_xx - sqr(S_x)) * (n * S_yy - sqr(S_y))); }\n    double mu_x() { return S_x / n; }\n    double mu_y() { return S_y / n; }\n    // note you will need to keep the vectors if you need\n    // to calculate the residuals: e[i] = y[i] - b() * x[i] - a();\n    double model(double x) {\n        if (!cached)\n            makecache();\n        return cb * x + ca;\n    }\n    double invmodel(double y) {\n        if (!cached)\n            makecache();\n        return (y - ca) / cb;\n    }\n};\n"
  },
  {
    "path": "genlib/p2dpoly.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// 2d polygons (and line sets too...)\r\n\r\n#include \"p2dpoly.h\"\r\n\r\n#include \"genlib/comm.h\" // used in BSP construction\r\n\r\n#include <cmath>\r\n#include <float.h>\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// gps2os: function to convert long-lat GPS coordinates to OS national grid\r\n\r\n// n.b.: approximation only\r\n\r\n// This algorithm is taken from:\r\n\r\n// \"A guide to coordinate systems in Great Britain\"\r\n// http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/index.html\r\n// (v1.9 Mar 2008 D00659, Crown Copyright)\r\n// Sourced: 21-Mar-08\r\n\r\n// It's truly ick... and nuts... there must be an easier way...\r\n\r\n// Outline:\r\n// 1. take long-lat on ETRS89 ellipsoid and convert to 3d cartesian coordinates\r\n// 2. shift 3d cartesian coordinates from ETRS89 ellipsoid to OSGB36 ellipsoid\r\n// 3. convert 3d cartesian coordinates to long-lat on OSGB36 ellipsoid\r\n// 4. project onto OSFB36 2d grid using a transverse Mercator projection\r\n\r\n// According to OS, accurate to within about 5 metres\r\n\r\nPoint2f gps2os(const Point2f &pt) {\r\n    // *first*, we have ETRS89 data...\r\n\r\n    // Convert it to 3D Cartesian Coordinates\r\n    double lambda = M_PI * pt.x / 180.0;\r\n    double phi = M_PI * pt.y / 180.0;\r\n\r\n    // GRS80 ellipsoid\r\n    double a = 6378137.0000;\r\n    double b = 6356752.3141;\r\n    double e_sq = (sqr(a) - sqr(b)) / sqr(a);\r\n\r\n    double nu = a / sqrt(1.0 - e_sq * sqr(sin(phi)));\r\n\r\n    double x = nu * cos(phi) * cos(lambda);\r\n    double y = nu * cos(phi) * sin(lambda);\r\n    double z = (1 - e_sq) * nu * sin(phi);\r\n\r\n    // Now we have the ETRS89 location, convert it to a rough OSGB36 location:\r\n\r\n    // rough conversion chart\r\n\r\n    // t_x (m)     t_y (m)   t_z (m)    s (ppm)    r_x (sec)  r_y (sec)  r_z (sec)\r\n    // -446.448    +125.157  -542.060   +20.4894   -0.1502    -0.2470    -0.8421 = (in radians: )\r\n\r\n    // nb, seconds converted to radians:\r\n    double r_x = -0.7281901490265230623720509817416e-6;\r\n    double r_y = -1.1974897923405539041670878328241e-6;\r\n    double r_z = -4.0826160086234026020206666559563e-6;\r\n\r\n    x = -446.448 + (1.0 + 2.04894e-5) * x - r_z * y + r_y * z;\r\n    y = +125.157 + r_z * x + (1.0 + 2.04894e-5) * y - r_x * z;\r\n    z = -542.060 - r_y * x + r_x * y + (1.0 + 2.04894e-5) * z;\r\n\r\n    double p = sqrt(sqr(x) + sqr(y));\r\n\r\n    // now place it back in long lat on the OSGB36 ellipsoid:\r\n\r\n    // Airy 1830 (OSGB36) ellipsoid\r\n    a = 6377563.396;\r\n    b = 6356256.910;\r\n    e_sq = (sqr(a) - sqr(b)) / sqr(a);\r\n\r\n    lambda = atan(y / x);\r\n    phi = atan(z / (p * (1.0 - e_sq)));\r\n    double lastphi = phi;\r\n\r\n    nu = a / sqrt(1.0 - e_sq * sqr(sin(phi)));\r\n    do {\r\n        phi = atan((z + e_sq * nu * sin(phi)) / p);\r\n    } while (fabs(lastphi - phi) > 1e-6);\r\n\r\n    // now, it's on the ellipsoid, project it onto the OSGB36 grid:\r\n\r\n    // E_0 easting of true origin                400 000m\r\n    double E_0 = 400000;\r\n    // N_0 northing of true origin              -100 000m\r\n    double N_0 = -100000;\r\n    // F_0 scaling factor on central meridian    0.9996012717\r\n    double F_0 = 0.9996012717;\r\n    // lambda_0 longitude of true origin         -2.0 radians: -0.034906585039886591538473815369772\r\n    double lambda_0 = -0.034906585039886591538473815369772;\r\n    // phi_0 latitude of true origin             49.0 radians:\r\n    double phi_0 = 0.85521133347722149269260847655942;\r\n\r\n    nu = a * F_0 * pow((1 - e_sq * sqr(sin(phi))), -0.5);\r\n\r\n    double n = (a - b) / (a + b);\r\n    double rho = a * F_0 * (1.0 - e_sq) * pow((1 - e_sq * sqr(sin(phi))), -1.5);\r\n    double eta_sq = nu / rho - 1;\r\n\r\n    double n_sq = pow(n, 2);\r\n    double n_cubed = pow(n, 3);\r\n    double M = b * F_0 *\r\n               ((1.0 + n + 0.25 * 5 * (n_sq + n_cubed)) * (phi - phi_0) -\r\n                (3.0 * (n + n_sq + 0.125 * 7 * n_cubed)) * sin(phi - phi_0) * cos(phi + phi_0) +\r\n                (0.125 * 15.0 * (n_sq + n_cubed)) * sin(2.0 * (phi - phi_0)) * cos(2.0 * (phi + phi_0)) -\r\n                (35.0 / 24.0 * n_cubed) * sin(3.0 * (phi - phi_0)) * cos(3.0 * (phi + phi_0)));\r\n    double I = M + N_0;\r\n    double II = 0.5 * nu * sin(phi) * cos(phi);\r\n    double tanphi = tan(phi);\r\n    double III = nu * sin(phi) * pow(cos(phi), 3.0) * (5.0 - sqr(tanphi) + 9.0 * eta_sq) / 24.0;\r\n    double IIIA = nu * sin(phi) * pow(cos(phi), 5.0) * (61.0 - 58.0 * sqr(tanphi) + pow(tanphi, 4.0)) / 720.0;\r\n    double IV = nu * cos(phi);\r\n    double V = nu * pow(cos(phi), 3.0) * (nu / rho - sqr(tanphi)) / 6.0;\r\n    double VI = nu * pow(cos(phi), 5.0) *\r\n                (5.0 - 18.0 * sqr(tanphi) + pow(tanphi, 4) + 14.0 * eta_sq - 58.0 * sqr(tanphi) * eta_sq) / 120.0;\r\n\r\n    double E = E_0 + IV * (lambda - lambda_0) + V * pow((lambda - lambda_0), 3) + VI * pow((lambda - lambda_0), 5);\r\n    double N =\r\n        I + II * pow((lambda - lambda_0), 2) + III * pow((lambda - lambda_0), 4) + IIIA * pow((lambda - lambda_0), 6);\r\n\r\n    return Point2f(E, N);\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////\r\n\r\nstatic long g_count = 0L;\r\n\r\nint bitcount(int a) {\r\n    int ret = 0;\r\n    while (a != 0) {\r\n        ret += (a & 1) ? 1 : 0;\r\n        a = a >> 1;\r\n    }\r\n    return ret;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// EdgeU is used for polygon clipping to viewports\r\n\r\n// are a,b,c in ccw order (true) or cw order (false)\r\nbool ccwEdgeU(const EdgeU &a, const EdgeU &b, const EdgeU &c) {\r\n    bool ccw = false;\r\n    if (c.edge > a.edge || (c.edge == a.edge && c.u > a.u)) {\r\n        if (b.edge > a.edge || (b.edge == a.edge && b.u > a.u)) {\r\n            if (b.edge < c.edge || (b.edge == c.edge && b.u < c.u)) {\r\n                ccw = true;\r\n            }\r\n        }\r\n    } else {\r\n        if (b.edge > a.edge || (b.edge == a.edge && b.u > a.u)) {\r\n            ccw = true;\r\n        } else if (b.edge < c.edge || (b.edge == c.edge && b.u < c.u)) {\r\n            ccw = true;\r\n        }\r\n    }\r\n    return ccw;\r\n}\r\n\r\n// EdgeU is used for polygon clipping to viewports\r\n// get the actual point from an EdgeU\r\nPoint2f QtRegion::getEdgeUPoint(const EdgeU &eu) {\r\n    switch (eu.edge) {\r\n    case 0:\r\n        return Point2f(bottom_left.x + (eu.u * width()), bottom_left.y);\r\n    case 1:\r\n        return Point2f(top_right.x, bottom_left.y + (eu.u * height()));\r\n    case 2:\r\n        return Point2f(top_right.x - (eu.u * width()), top_right.y);\r\n    case 3:\r\n        return Point2f(bottom_left.x, top_right.y - (eu.u * height()));\r\n    }\r\n    return Point2f();\r\n}\r\n\r\n// EdgeU is used for polygon clipping to viewports\r\n// get where the polygon exits the viewport\r\nEdgeU QtRegion::getCutEdgeU(const Point2f &inside, const Point2f &outside) {\r\n    EdgeU eu;\r\n    if (outside.x < bottom_left.x) {\r\n        double y = outside.y + (inside.y - outside.y) * (bottom_left.x - outside.x) / (inside.x - outside.x);\r\n        if (y >= bottom_left.y && y <= top_right.y) {\r\n            eu.edge = 3;\r\n            eu.u = (top_right.y - y) / height();\r\n        }\r\n    }\r\n    if (eu.edge == -1 && outside.x > top_right.x) {\r\n        double y = inside.y + (outside.y - inside.y) * (top_right.x - inside.x) / (outside.x - inside.x);\r\n        if (y >= bottom_left.y && y <= top_right.y) {\r\n            eu.edge = 1;\r\n            eu.u = (y - bottom_left.y) / height();\r\n        }\r\n    }\r\n    if (eu.edge == -1 && outside.y < bottom_left.y) {\r\n        double x = outside.x + (inside.x - outside.x) * (bottom_left.y - outside.y) / (inside.y - outside.y);\r\n        if (x >= bottom_left.x && x <= top_right.x) {\r\n            eu.edge = 0;\r\n            eu.u = (x - bottom_left.x) / width();\r\n        }\r\n    }\r\n    if (eu.edge == -1 && outside.y > top_right.y) {\r\n        double x = inside.x + (outside.x - inside.x) * (top_right.y - inside.y) / (outside.y - inside.y);\r\n        if (x >= bottom_left.x && x <= top_right.x) {\r\n            eu.edge = 2;\r\n            eu.u = (top_right.x - x) / width();\r\n        }\r\n    }\r\n    // if at this stage eu.edge is still -1 there's a problem!\r\n    return eu;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n\r\n// union of two regions\r\n\r\nQtRegion runion(const QtRegion &a, const QtRegion &b) {\r\n    QtRegion n;\r\n    n.bottom_left.x = a.bottom_left.x < b.bottom_left.x ? a.bottom_left.x : b.bottom_left.x;\r\n    n.bottom_left.y = a.bottom_left.y < b.bottom_left.y ? a.bottom_left.y : b.bottom_left.y;\r\n    n.top_right.x = a.top_right.x > b.top_right.x ? a.top_right.x : b.top_right.x;\r\n    n.top_right.y = a.top_right.y > b.top_right.y ? a.top_right.y : b.top_right.y;\r\n    return n;\r\n}\r\n\r\n// test intersecting regions, touching counts\r\n\r\nbool intersect_region(const QtRegion &a, const QtRegion &b, double tolerance) {\r\n    if (overlap_x(a, b, tolerance) && overlap_y(a, b, tolerance)) {\r\n        return true;\r\n    } else {\r\n        return false;\r\n    }\r\n}\r\n\r\nbool overlap_x(const QtRegion &a, const QtRegion &b, double tolerance) {\r\n    if (a.bottom_left.x > b.bottom_left.x) {\r\n        if (b.top_right.x >= a.bottom_left.x - tolerance) {\r\n            return true;\r\n        }\r\n    } else {\r\n        if (a.top_right.x >= b.bottom_left.x - tolerance) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\nbool overlap_y(const QtRegion &a, const QtRegion &b, double tolerance) {\r\n    if (a.bottom_left.y > b.bottom_left.y) {\r\n        if (b.top_right.y >= a.bottom_left.y - tolerance) {\r\n            return true;\r\n        }\r\n    } else {\r\n        if (a.top_right.y >= b.bottom_left.y - tolerance) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\n// line set up\r\n\r\n// default: nothing:\r\n\r\nLine::Line() {\r\n    bits.parity = 0;\r\n    bits.direction = 0;\r\n    // Points automatically assigned to 0,0\r\n}\r\n\r\nLine::Line(const Point2f &a, const Point2f &b) {\r\n    if (a.x == b.x) {\r\n        bottom_left.x = a.x;\r\n        top_right.x = b.x;\r\n        // vertical lines stored consistently as parity 1\r\n        if (a.y <= b.y) {\r\n            bottom_left.y = a.y;\r\n            top_right.y = b.y;\r\n            bits.parity = 1;\r\n            bits.direction = 1;\r\n        } else {\r\n            bottom_left.y = b.y;\r\n            top_right.y = a.y;\r\n            bits.parity = 1;\r\n            bits.direction = 0;\r\n        }\r\n    } else if (a.x < b.x) {\r\n        bottom_left.x = a.x;\r\n        top_right.x = b.x;\r\n        if (a.y <= b.y) {\r\n            bottom_left.y = a.y;\r\n            top_right.y = b.y;\r\n            bits.parity = 1;\r\n            bits.direction = 1;\r\n        } else {\r\n            bottom_left.y = b.y;\r\n            top_right.y = a.y;\r\n            bits.parity = 0; // -1\r\n            bits.direction = 1;\r\n        }\r\n    } else {\r\n        bottom_left.x = b.x;\r\n        top_right.x = a.x;\r\n        if (b.y <= a.y) {\r\n            bottom_left.y = b.y;\r\n            top_right.y = a.y;\r\n            bits.parity = 1;\r\n            bits.direction = 0;\r\n        } else {\r\n            bottom_left.y = a.y;\r\n            top_right.y = b.y;\r\n            bits.parity = 0; // -1\r\n            bits.direction = 0;\r\n        }\r\n    }\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n\r\ndouble dot(const Line &a, const Line &b) {\r\n    return (a.bx() - a.ax()) * (b.bx() - b.ax()) + (a.by() - a.ay()) * (b.by() - b.ay());\r\n}\r\n\r\n// intersection test: touching counts as an intersection\r\n// (uses dot product comparison)\r\n\r\n// NB You must MUST check that line *regions do not intersect* before using this test\r\n// By this test, *all parallel lines intersect*\r\n\r\nbool intersect_line(const Line &a, const Line &b, double tolerance) {\r\n    g_count++;\r\n\r\n    if (((a.ay() - a.by()) * (b.ax() - a.ax()) + (a.bx() - a.ax()) * (b.ay() - a.ay())) *\r\n                ((a.ay() - a.by()) * (b.bx() - a.ax()) + (a.bx() - a.ax()) * (b.by() - a.ay())) <=\r\n            tolerance &&\r\n        ((b.ay() - b.by()) * (a.ax() - b.ax()) + (b.bx() - b.ax()) * (a.ay() - b.ay())) *\r\n                ((b.ay() - b.by()) * (a.bx() - b.ax()) + (b.bx() - b.ax()) * (a.by() - b.ay())) <=\r\n            tolerance) {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n// intersection test: touching does not count as an intersection\r\n// (uses dot product comparison)\r\n\r\nbool intersect_line_no_touch(const Line &a, const Line &b, double tolerance) {\r\n    g_count++;\r\n\r\n    if (((a.ay() - a.by()) * (b.ax() - a.ax()) + (a.bx() - a.ax()) * (b.ay() - a.ay())) *\r\n                ((a.ay() - a.by()) * (b.bx() - a.ax()) + (a.bx() - a.ax()) * (b.by() - a.ay())) <\r\n            -tolerance &&\r\n        ((b.ay() - b.by()) * (a.ax() - b.ax()) + (b.bx() - b.ax()) * (a.ay() - b.ay())) *\r\n                ((b.ay() - b.by()) * (a.bx() - b.ax()) + (b.bx() - b.ax()) * (a.by() - b.ay())) <\r\n            -tolerance) {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n// returns 0 for no intersect, 1 for touching and 2 for crossing\r\nint intersect_line_distinguish(const Line &a, const Line &b, double tolerance) {\r\n    g_count++;\r\n\r\n    double alpha = ((a.ay() - a.by()) * (b.ax() - a.ax()) + (a.bx() - a.ax()) * (b.ay() - a.ay())) *\r\n                   ((a.ay() - a.by()) * (b.bx() - a.ax()) + (a.bx() - a.ax()) * (b.by() - a.ay()));\r\n\r\n    double beta = ((b.ay() - b.by()) * (a.ax() - b.ax()) + (b.bx() - b.ax()) * (a.ay() - b.ay())) *\r\n                  ((b.ay() - b.by()) * (a.bx() - b.ax()) + (b.bx() - b.ax()) * (a.by() - b.ay()));\r\n\r\n    if (alpha <= tolerance && beta <= tolerance) {\r\n        if (alpha < -tolerance && beta < -tolerance) {\r\n            return 2;\r\n        } else {\r\n            return 1;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\n// returns 0 for no intersect, 1 for touching and 2 for crossing\r\n// n.b. only used by polygon contains -- throws if the first point of line b is touching line a\r\n// (first point of line b is the point to be tested) -- i.e., throws if point touches polygon\r\nint intersect_line_b(const Line &a, const Line &b, double tolerance) {\r\n    g_count++;\r\n\r\n    double alpha = ((a.ay() - a.by()) * (b.ax() - a.ax()) + (a.bx() - a.ax()) * (b.ay() - a.ay()));\r\n\r\n    double beta = ((a.ay() - a.by()) * (b.bx() - a.ax()) + (a.bx() - a.ax()) * (b.by() - a.ay()));\r\n\r\n    double gamma = ((b.ay() - b.by()) * (a.ax() - b.ax()) + (b.bx() - b.ax()) * (a.ay() - b.ay())) *\r\n                   ((b.ay() - b.by()) * (a.bx() - b.ax()) + (b.bx() - b.ax()) * (a.by() - b.ay()));\r\n\r\n    if (alpha * beta <= tolerance && gamma <= tolerance) {\r\n        if (alpha * beta < -tolerance && gamma < -tolerance) {\r\n            return 2;\r\n        } else {\r\n            // this function is only used for poly contains point,\r\n            // the throw is defined if the point is *on* the polygon edge\r\n            // (within the tolerance)\r\n            if (fabs(alpha) <= tolerance) {\r\n                throw 1;\r\n            }\r\n            return 1;\r\n        }\r\n    }\r\n    return 0;\r\n}\r\n\r\ndouble Line::intersection_point(const Line &l, int axis, double tolerance) const {\r\n    // use axis = XAXIS for width() > height()\r\n    double loc;\r\n    if (axis == XAXIS) {\r\n        if (l.width() == 0.0) {\r\n            loc = l.bottom_left.x;\r\n        } else {\r\n            double lg = l.grad(YAXIS);\r\n            double g = grad(YAXIS);\r\n            if (fabs(lg - g) <= tolerance) {\r\n                // these have almost the same gradient, so it's impossible to tell where they intersect: going for\r\n                // midpoint\r\n                Point2f p = l.midpoint();\r\n                loc = (p.x > top_right.x) ? top_right.x : ((p.x < bottom_left.x) ? bottom_left.x : p.x);\r\n            } else {\r\n                // this is the same as: constant(YAXIS) - l.constant(YAXIS)) / (l.grad(YAXIS) - grad(YAXIS));\r\n                loc = ((ay() - g * ax()) - (l.ay() - lg * l.ax())) / (lg - g);\r\n            }\r\n        }\r\n    } else {\r\n        if (l.height() == 0.0) {\r\n            loc = l.bottom_left.y;\r\n        } else {\r\n            double lg = l.grad(XAXIS);\r\n            double g = grad(XAXIS);\r\n            if (fabs(lg - g) <= tolerance) {\r\n                // these have almost the same gradient, so it's impossible to tell where they intersect: going for\r\n                // midpoint\r\n                Point2f p = l.midpoint();\r\n                loc = (p.y > top_right.y) ? top_right.y : ((p.y < bottom_left.y) ? bottom_left.y : p.y);\r\n            } else {\r\n                // this is the same as: constant(XAXIS) - l.constant(XAXIS)) / (l.grad(XAXIS) - grad(XAXIS));\r\n                loc = ((ax() - g * ay()) - (l.ax() - lg * l.ay())) / (lg - g);\r\n            }\r\n        }\r\n    }\r\n    return loc;\r\n}\r\n\r\n// intersecting line segments, touching counts\r\n// (uses intersection point comparison)\r\n\r\nbool Line::intersect_line(const Line &l, int axis, double &loc) const {\r\n    // please be intelligent when passing the axis...\r\n    if (axis == XAXIS) {\r\n        if (l.width() == 0.0) {\r\n            // Special case:\r\n            double y = ay() + sign() * (l.ax() - ax()) * height() / width();\r\n            if (y >= bottom_left.y && y <= l.top_right.y) { // <- you must have checked\r\n                loc = l.bottom_left.x;                      //    the regions overlap first\r\n                return true;\r\n            }\r\n        } else {\r\n            // Standard:   (note: if m1 == m2, loc is NaN)\r\n            loc = (constant(YAXIS) - l.constant(YAXIS)) / (l.grad(YAXIS) - grad(YAXIS));\r\n            if (std::isnan(loc)) {\r\n                // lines are parallel --- are they coincident?\r\n                // you must have checked the regions overlap first\r\n                if (constant(YAXIS) == l.constant(YAXIS)) {\r\n                    return true;\r\n                }\r\n            } else if (loc >= l.bottom_left.x && loc <= l.top_right.x) {\r\n                return true;\r\n            }\r\n        }\r\n    } else {\r\n        if (l.height() == 0.0) {\r\n            // Special case:\r\n            double x = ax() + sign() * (l.ay() - ay()) * width() / height();\r\n            if (x >= bottom_left.x && x <= top_right.x) { // <- you must have checked\r\n                loc = l.bottom_left.y;                    //  the regions overlap first\r\n                return true;\r\n            }\r\n        } else {\r\n            // Standard:   (note: if m1 == m2, loc is NaN)\r\n            loc = (constant(XAXIS) - l.constant(XAXIS)) / (l.grad(XAXIS) - grad(XAXIS));\r\n            if (std::isnan(loc)) {\r\n                // lines are parallel --- are they coincident?\r\n                // you must have checked the regions overlap first\r\n                if (constant(XAXIS) == l.constant(XAXIS)) {\r\n                    return true;\r\n                }\r\n            } else if (loc >= l.bottom_left.y && loc <= l.top_right.y) {\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\n// this converts the loc back into a point:\r\n\r\nPoint2f Line::point_on_line(double loc, int axis) const {\r\n    Point2f p;\r\n    if (axis == XAXIS) {\r\n        p = Point2f(loc, grad(YAXIS) * loc + constant(YAXIS));\r\n    } else {\r\n        p = Point2f(grad(XAXIS) * loc + constant(XAXIS), loc);\r\n    }\r\n    return p;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n\r\n// distance from a point to a line segment\r\n\r\ndouble dist(const Point2f &point, const Line &line) {\r\n    double d = 0.0;\r\n\r\n    Point2f alpha = line.end() - line.start();\r\n    Point2f beta = point - line.end();\r\n    Point2f gamma = line.start() - line.end();\r\n    Point2f delta = point - line.start();\r\n\r\n    if (dot(alpha, beta) > 0) {\r\n        d = beta.length();\r\n    } else if (dot(gamma, delta) > 0) {\r\n        d = delta.length();\r\n    } else {\r\n        if (alpha.length() < 1e-9 * beta.length()) {\r\n            // should actually be a user-specified tolerance test\r\n            d = beta.length();\r\n        } else {\r\n            d = fabs(det(alpha, beta)) / alpha.length();\r\n        }\r\n    }\r\n    return d;\r\n}\r\n\r\n/*\r\n   // for infinite line rather than line segment\r\n   return fabs((line.bx() - line.ax()) * (line.ay() - point.y) -\r\n               (line.ax() - point.x) * (line.by() - line.ay())) / line.length();\r\n*/\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n\r\n// intersection test\r\n\r\nbool intersect(const RegionTree &a, const RegionTree &b) {\r\n    if (a.is_leaf() && b.is_leaf()) {\r\n        if (intersect_region(QtRegion(a), QtRegion(b))) {\r\n            return intersect_line((const Line &)QtRegion(a), (const Line &)QtRegion(b));\r\n        } else {\r\n            return false;\r\n        }\r\n    } else {\r\n        if (intersect_region(QtRegion(a), QtRegion(b))) {\r\n            return subintersect(a, b);\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n}\r\n\r\nbool subintersect(const RegionTree &a, const RegionTree &b) {\r\n    if (intersect(a.left(), b.left())) {\r\n        return true;\r\n    } else if (intersect(a.right(), b.right())) {\r\n        return true;\r\n    } else if (intersect(a.left(), b.right())) {\r\n        return true;\r\n    } else if (intersect(a.right(), b.left())) {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n// Intersection count\r\n\r\nint intersections(const RegionTree &a, const Line &b) {\r\n    int n = 0;\r\n\r\n    if (!a.is_leaf()) {\r\n        if (intersect_region(QtRegion(a), QtRegion(b))) {\r\n            n += intersections(a.left(), b);\r\n            n += intersections(a.right(), b);\r\n        }\r\n    } else {\r\n        // Note: touching lines count 1, non-touching lines count 2, this allows through\r\n        // vertex lines (where it touches both vertices)\r\n        n += intersect_line_b((const Line &)a, (const Line &)b);\r\n    }\r\n\r\n    return n;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n\r\n// crop a line to fit within bounds of region\r\n// if line lies outside region, returns false\r\n\r\nbool Line::crop(const QtRegion &r) {\r\n    if (bx() >= r.bottom_left.x) {\r\n        if (ax() < r.bottom_left.x) {\r\n            // crop!\r\n            ay() += sign() * (height() * (r.bottom_left.x - ax()) / width());\r\n            ax() = r.bottom_left.x;\r\n        }\r\n        if (ax() <= r.top_right.x) {\r\n            if (bx() > r.top_right.x) {\r\n                // crop!\r\n                by() -= sign() * height() * (bx() - r.top_right.x) / width();\r\n                bx() = r.top_right.x;\r\n            }\r\n            if (top_right.y >= r.bottom_left.y) {\r\n                if (bottom_left.y < r.bottom_left.y) {\r\n                    // crop!\r\n                    if (bits.parity) {\r\n                        ax() += width() * (r.bottom_left.y - bottom_left.y) / height();\r\n                    } else {\r\n                        bx() -= width() * (r.bottom_left.y - bottom_left.y) / height();\r\n                    }\r\n                    bottom_left.y = r.bottom_left.y;\r\n                }\r\n                if (bottom_left.y <= r.top_right.y) {\r\n                    if (top_right.y > r.top_right.y) {\r\n                        // crop!\r\n                        if (bits.parity) {\r\n                            bx() -= width() * (top_right.y - r.top_right.y) / height();\r\n                        } else {\r\n                            ax() += width() * (top_right.y - r.top_right.y) / height();\r\n                        }\r\n                        top_right.y = r.top_right.y;\r\n                    }\r\n                    // if we got this far, well done, it's in the region:\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    // returns false if the entire line is outside the region:\r\n    return false;\r\n}\r\n\r\n// cast a ray to the edge of a box\r\n\r\nvoid Line::ray(short dir, const QtRegion &r) {\r\n    if (dir == bits.direction) {\r\n        if (width() >= height()) {\r\n            by() = ay() + sign() * height() * (r.top_right.x - ax()) / width();\r\n            bx() = r.top_right.x;\r\n        } else if (bits.parity) {\r\n            bx() = ax() + width() * (r.top_right.y - ay()) / height();\r\n            by() = r.top_right.y;\r\n        } else {\r\n            bx() = ax() + width() * (ay() - r.bottom_left.y) / height();\r\n            by() = r.bottom_left.y;\r\n        }\r\n    } else {\r\n        if (width() >= height()) {\r\n            ay() = by() - sign() * height() * (bx() - r.bottom_left.x) / width();\r\n            ax() = r.bottom_left.x;\r\n        } else if (bits.parity) {\r\n            ax() = bx() - width() * (by() - r.bottom_left.y) / height();\r\n            ay() = r.bottom_left.y;\r\n        } else {\r\n            ax() = bx() - width() * (r.top_right.y - by()) / height();\r\n            ay() = r.top_right.y;\r\n        }\r\n    }\r\n    // now fit within bounds...\r\n    crop(r);\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n\r\n// Polygon set up (the hard bit!)\r\n\r\nvoid Poly::add_line_segment(const Line &l) {\r\n    m_line_segments++;\r\n    RegionTreeLeaf *leaf = new RegionTreeLeaf(l);\r\n\r\n    if (m_p_root == NULL) {\r\n        // first ever node\r\n\r\n        m_p_root = (RegionTree *)leaf;\r\n    } else {\r\n        // traverse the tree to the insertion point\r\n        //   you'll just have to take my word for it that the next line\r\n        //   gives you the correct position to insert\r\n        int cut_level = bitcount(m_line_segments - 1) - 2;\r\n\r\n        if (cut_level < 0) {\r\n            // replace the root node\r\n\r\n            QtRegion new_region = runion(QtRegion(*m_p_root), QtRegion(*leaf));\r\n            RegionTree *new_root = new RegionTreeBranch(new_region, *m_p_root, *leaf);\r\n            m_p_root = new_root;\r\n        } else {\r\n            RegionTree *here = m_p_root;\r\n            for (int i = 0; i < cut_level; i++) {\r\n                here = here->m_p_right;\r\n            }\r\n\r\n            // cut and insert\r\n\r\n            RegionTree &insertion_point = here->right();\r\n\r\n            QtRegion new_region = runion(QtRegion(insertion_point), QtRegion(*leaf));\r\n\r\n            RegionTree *new_node = new RegionTreeBranch(new_region, insertion_point, *leaf);\r\n\r\n            here->m_p_right = new_node;\r\n\r\n            // traverse up tree unioning regions\r\n            // (saving data by not recording parents!)\r\n            // Note must be '>=' to catch current root node --- I really stuffed up earlier with '>'!\r\n            while (cut_level >= 0) {\r\n                here = m_p_root;\r\n                for (int j = 0; j < cut_level; j++) {\r\n                    here = here->m_p_right;\r\n                }\r\n                here->m_p_region = new Line(runion(QtRegion(here->left()), QtRegion(here->right())));\r\n                cut_level--;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// ...and after all the efficient stuff, we have a really\r\n// inefficient polygon copy... hmm\r\n\r\nRegionTree *Poly::copy_region_tree(const RegionTree *tree) {\r\n    if (!tree) {\r\n        return NULL;\r\n    }\r\n\r\n    RegionTree *newtree;\r\n\r\n    if (tree->is_leaf()) {\r\n        newtree = new RegionTreeLeaf();\r\n        newtree->m_p_region = new Line(*(tree->m_p_region));\r\n        return newtree;\r\n    } else {\r\n        newtree = new RegionTreeBranch();\r\n    }\r\n\r\n    std::vector<RegionTree *> newlist;\r\n    std::vector<RegionTree *> oldlist;\r\n\r\n    oldlist.push_back((RegionTree *)tree);\r\n    newlist.push_back((RegionTree *)newtree);\r\n\r\n    do {\r\n        RegionTree *oldnode = oldlist.back();\r\n        oldlist.pop_back();\r\n        RegionTree *newnode = newlist.back();\r\n        newlist.pop_back();\r\n\r\n        newnode->m_p_region = new Line(*oldnode->m_p_region);\r\n\r\n        if (oldnode->m_p_left) {\r\n            if (oldnode->m_p_left->is_leaf()) {\r\n                newnode->m_p_left = new RegionTreeLeaf();\r\n                newnode->m_p_left->m_p_region = new Line(*(oldnode->m_p_left->m_p_region));\r\n            } else {\r\n                oldlist.push_back(oldnode->m_p_left);\r\n                newnode->m_p_left = new RegionTreeBranch();\r\n                newlist.push_back(newnode->m_p_left);\r\n            }\r\n        }\r\n        if (oldnode->m_p_right) {\r\n            if (oldnode->m_p_right->is_leaf()) {\r\n                newnode->m_p_right = new RegionTreeLeaf();\r\n                newnode->m_p_right->m_p_region = new Line(*(oldnode->m_p_right->m_p_region));\r\n            } else {\r\n                oldlist.push_back(oldnode->m_p_right);\r\n                newnode->m_p_right = new RegionTreeBranch();\r\n                newlist.push_back(newnode->m_p_right);\r\n            }\r\n        }\r\n\r\n    } while (oldlist.size() > 0);\r\n\r\n    return newtree;\r\n}\r\n\r\n// polygon destruction\r\n\r\nvoid Poly::destroy_region_tree() {\r\n    if (!m_p_root) {\r\n        return;\r\n    }\r\n\r\n    std::vector<RegionTree *> del_node_list;\r\n    std::vector<short> del_node_dir;\r\n\r\n    del_node_list.push_back(m_p_root);\r\n\r\n    do {\r\n        RegionTree *current_node = del_node_list.back();\r\n\r\n        if (current_node->m_p_left == current_node && current_node->m_p_right == current_node) {\r\n\r\n            delete current_node;\r\n            del_node_list.pop_back();\r\n\r\n            if (del_node_list.size() > 0) {\r\n                if (del_node_dir.back() == 0) {\r\n                    del_node_list.back()->m_p_left = del_node_list.back();\r\n                    del_node_dir.pop_back();\r\n                } else {\r\n                    del_node_list.back()->m_p_right = del_node_list.back();\r\n                    del_node_dir.pop_back();\r\n                }\r\n            }\r\n        } else {\r\n            if (current_node->m_p_right == NULL) {\r\n                current_node->m_p_right = current_node;\r\n            } else if (current_node->m_p_right != current_node) {\r\n                del_node_list.push_back(current_node->m_p_right);\r\n                del_node_dir.push_back(1);\r\n            } else {\r\n                del_node_list.push_back(current_node->m_p_left);\r\n                del_node_dir.push_back(0);\r\n            }\r\n        }\r\n    } while (del_node_list.size() > 0);\r\n\r\n    m_p_root = NULL;\r\n}\r\n\r\n// contains? intersects??\r\n\r\n// Here they are!\r\n\r\nbool Poly::contains(const Point2f &p) {\r\n    // n.b., intersections throws on some accidental alignments --\r\n    // we must use a point outside the polygon to extend our test\r\n    // line from to prevent them\r\n    Line l(p, Point2f(get_bounding_box().top_right.x + get_bounding_box().width(),\r\n                      get_bounding_box().top_right.y + get_bounding_box().height()));\r\n\r\n    int double_n;\r\n\r\n    // note, touching intersections count 1/2\r\n    try {\r\n        double_n = intersections(*(m_p_root), l);\r\n    } catch (int) {\r\n        throw 1; // throws if on edge\r\n    }\r\n\r\n    if (double_n % 2 == 0 && double_n % 4 != 0) {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool intersect(const Poly &a, const Poly &b) {\r\n    if (intersect(*(a.m_p_root), *(b.m_p_root))) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "genlib/p2dpoly.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// 2d poly (own format, adapted from the original Sala libraries\r\n\r\n// The idea is that from this format,\r\n// we can read into Cosmo3d as well as Sala based applications\r\n\r\n#pragma once\r\n\r\n// Using doubles right the way through can really eat memory for isovist\r\n// polygon files, thus we use a defined type, change as appropriate:\r\n\r\n#include \"genlib/comm.h\" // communicator used in BSP tree construction\r\n#include \"genlib/pafmath.h\"\r\n\r\n#include <algorithm>\r\n\r\n// Note: code depends on XAXIS being 0 and YAXIS being 1 --- do not change\r\nenum { NOAXIS = -1, XAXIS = 0, YAXIS = 1 };\r\n\r\nclass Point2f;\r\nbool approxeq(const Point2f &p1, const Point2f &p2, double tolerance = 0.0);\r\nclass QtRegion;\r\nbool intersect_region(const QtRegion &a, const QtRegion &b, double tolerance = 0.0);\r\nbool overlap_x(const QtRegion &a, const QtRegion &b, double tolerance = 0.0);\r\nbool overlap_y(const QtRegion &a, const QtRegion &b, double tolerance = 0.0);\r\nclass Line;\r\nbool intersect_line(const Line &a, const Line &b, double tolerance = 0.0);\r\nbool intersect_line_no_touch(const Line &a, const Line &b, double tolerance = 0.0);\r\nint intersect_line_distinguish(const Line &a, const Line &b, double tolerance = 0.0);\r\nint intersect_line_b(const Line &a, const Line &b, double tolerance = 0.0);\r\nPoint2f intersection_point(const Line &a, const Line &b, double tolerance = 0.0);\r\n\r\n// NaN on Intel:\r\n// Quick mod - TV\r\n// const double P2DNULL = (const double)0xFFFFFFFF7FF7FFFF;\r\n// for non-Intel:  0x7FF7FFFFFFFFFFFF\r\n\r\n// Point\r\n\r\nclass Point2f {\r\n  public:\r\n    double x;\r\n    double y;\r\n    Point2f()\r\n    //      { x = P2DNULL; y = P2DNULL; }\r\n    {\r\n        x = 0.0;\r\n        y = 0.0;\r\n    }\r\n    Point2f(double a, double b) {\r\n        x = a;\r\n        y = b;\r\n    }\r\n    bool atZero() const\r\n    //      { return x == P2DNULL || y == P2DNULL; }\r\n    {\r\n        return x == 0.0 && y == 0.0;\r\n    }\r\n    void normalScale(const QtRegion &); // inline function: below region\r\n    void denormalScale(const QtRegion &);\r\n    void operator+=(const Point2f &p) {\r\n        x += p.x;\r\n        y += p.y;\r\n    }\r\n    void operator-=(const Point2f &p) {\r\n        x -= p.x;\r\n        y -= p.y;\r\n    }\r\n    void operator*=(const double s) {\r\n        x *= s;\r\n        y *= s;\r\n    }\r\n    void operator/=(const double s) {\r\n        x /= s;\r\n        y /= s;\r\n    }\r\n    double &operator[](int i) { return (i == XAXIS) ? x : y; }\r\n    const double &operator[](int i) const { return (i == XAXIS) ? x : y; }\r\n    friend Point2f operator-(Point2f &p);\r\n    friend Point2f operator+(const Point2f &p1, const Point2f &p2);\r\n    friend Point2f operator-(const Point2f &p1, const Point2f &p2);\r\n    friend bool operator==(const Point2f &p1, const Point2f &p2);\r\n    friend bool operator!=(const Point2f &p1, const Point2f &p2);\r\n    friend bool operator>(const Point2f &a, const Point2f &b);\r\n    friend bool operator<(const Point2f &a, const Point2f &b);\r\n    friend Point2f operator*(const double s, const Point2f &p);\r\n    friend Point2f operator/(const Point2f &p, const double s);\r\n    friend double dot(const Point2f &p1, const Point2f &p2);\r\n    friend double det(const Point2f &p1, const Point2f &p2);\r\n    friend double dist(const Point2f &p1, const Point2f &p2);\r\n    friend double dist(const Point2f &point, const Line &line);\r\n    friend double angle(const Point2f &p1, const Point2f &p2, const Point2f &p3);\r\n    friend bool approxeq(const Point2f &p1, const Point2f &p2, double tolerance);\r\n    friend Point2f pointfromangle(double angle);\r\n    // a couple of useful tests\r\n    bool intriangle(const Point2f &p1, const Point2f &p2, const Point2f &p3);\r\n    bool insegment(const Point2f &key, const Point2f &p2, const Point2f &p3, double tolerance = 0.0);\r\n    // for OS transformation (note: accurate only to 5 metres according to OS)\r\n    Point2f longlat2os(const Point2f &p);\r\n\r\n  public:\r\n    // A few simple vector ops:\r\n    double length() const { return (double)sqrt(x * x + y * y); }\r\n    Point2f &scale(const double scalar) {\r\n        x *= scalar;\r\n        y *= scalar;\r\n        return *this;\r\n    }\r\n    Point2f &scale(const Point2f &scalevec) {\r\n        x *= scalevec.x;\r\n        y *= scalevec.y;\r\n        return *this;\r\n    }\r\n    Point2f &normalise() { return scale(1.0 / length()); }\r\n    Point2f &rotate(const double angle) {\r\n        double t = x;\r\n        x = x * cos(angle) - y * sin(angle);\r\n        y = y * cos(angle) + t * sin(angle);\r\n        return *this;\r\n    }\r\n    double angle() const { return (y < 0) ? (2.0 * M_PI - acos(x)) : acos(x); }\r\n};\r\n\r\ninline Point2f operator-(Point2f &p) { return Point2f(-p.x, -p.y); }\r\n\r\ninline Point2f operator+(const Point2f &p1, const Point2f &p2) { return Point2f(p1.x + p2.x, p1.y + p2.y); }\r\n\r\ninline Point2f operator-(const Point2f &p1, const Point2f &p2) { return Point2f(p1.x - p2.x, p1.y - p2.y); }\r\n\r\ninline bool operator==(const Point2f &p1, const Point2f &p2) { return (p1.x == p2.x && p1.y == p2.y); }\r\ninline bool operator!=(const Point2f &p1, const Point2f &p2) { return (p1.x != p2.x || p1.y != p2.y); }\r\ninline bool operator>(const Point2f &p1, const Point2f &p2) { return (p1.x > p2.x || (p1.x == p2.x && p1.y > p2.y)); }\r\ninline bool operator<(const Point2f &p1, const Point2f &p2) { return (p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y)); }\r\n\r\ninline Point2f operator*(const double s, const Point2f &p) { return Point2f(s * p.x, s * p.y); }\r\n\r\ninline Point2f operator/(const Point2f &p, const double s) { return Point2f(p.x / s, p.y / s); }\r\n\r\ninline double dot(const Point2f &p1, const Point2f &p2) { return (p1.x * p2.x + p1.y * p2.y); }\r\n\r\n// greater than 0 => p2 left (anticlockwise) of p1, less than 0 => p2 right (clockwise) of p1\r\ninline double det(const Point2f &p1, const Point2f &p2) { return (p1.x * p2.y - p1.y * p2.x); }\r\n\r\ninline double dist(const Point2f &p1, const Point2f &p2) { return sqrt(sqr(p1.x - p2.x) + sqr(p1.y - p2.y)); }\r\n\r\ninline double angle(const Point2f &p1, const Point2f &p2, const Point2f &p3) {\r\n    Point2f a = p1 - p2;\r\n    Point2f b = p3 - p2;\r\n    a.normalise();\r\n    b.normalise();\r\n    // ensure in range (f.p. error can throw out)\r\n    double d = std::min<double>(std::max<double>(dot(a, b), -1.0), 1.0);\r\n    return (sgn(det(a, b)) == 1) ? acos(d) : 2.0 * M_PI - acos(d);\r\n}\r\n\r\ninline bool approxeq(const Point2f &p1, const Point2f &p2, double tolerance) {\r\n    return (fabs(p1.x - p2.x) <= tolerance && fabs(p1.y - p2.y) <= tolerance);\r\n}\r\n\r\ninline bool Point2f::insegment(const Point2f &key, const Point2f &p2, const Point2f &p3, double tolerance) {\r\n    Point2f va = p2 - key;\r\n    Point2f vb = p3 - key;\r\n    Point2f vp = *this - key;\r\n    double ap = det(va, vp);\r\n    double bp = det(vb, vp);\r\n    if ((dot(va, vp) > 0 && dot(vb, vp) > 0) && (sgn(ap) != sgn(bp) || fabs(ap) < tolerance || fabs(bp) < tolerance)) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\ninline bool Point2f::intriangle(const Point2f &p1, const Point2f &p2, const Point2f &p3) {\r\n    // touching counts\r\n    int test = sgn(det(p2 - p1, *this - p1));\r\n    if (test == sgn(det(p3 - p2, *this - p2)) && test == sgn(det(p1 - p3, *this - p3))) {\r\n        return true;\r\n    }\r\n    return false;\r\n}\r\n\r\ninline Point2f pointfromangle(double angle) {\r\n    Point2f p;\r\n    p.x = cos(angle);\r\n    p.y = sin(angle);\r\n    return p;\r\n}\r\n\r\nPoint2f gps2os(const Point2f &p);\r\n\r\n// an event is a point plus time (as in spacetime technical language)\r\nclass Event2f : public Point2f {\r\n  public:\r\n    double t; // time in seconds\r\n    Event2f() : Point2f() { t = 0.0; }\r\n    Event2f(double _x, double _y, double _t) : Point2f(_x, _y) { t = _t; }\r\n    Event2f(Point2f &_p) : Point2f(_p) { t = 0.0; }\r\n    Event2f(Point2f &_p, double _t) : Point2f(_p) { t = _t; }\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nclass Point3f {\r\n  public:\r\n    double x;\r\n    double y;\r\n    double z;\r\n    Point3f(double a = 0.0, double b = 0.0, double c = 0.0) {\r\n        x = a;\r\n        y = b;\r\n        z = c;\r\n    }\r\n    Point3f(const Point2f &p) {\r\n        x = p.x;\r\n        y = 0.0;\r\n        z = p.y;\r\n    }                                                 // Note! not z = -y (due to an incosistency earlier...)\r\n    bool inside(const Point3f &bl, const Point3f &tr) // now inclusive (...)\r\n    {\r\n        return (x >= bl.x && y >= bl.y && z >= bl.z && x <= tr.x && y <= tr.y && z <= tr.z);\r\n    }\r\n    operator Point2f() { return Point2f(x, z); } // Note! not x, -z (due to an inconsistency earlier...)\r\n    Point2f xy() { return Point2f(x, y); }       // From the x, y plane\r\n    // A few simple vector ops:\r\n    double length() const { return (double)sqrt(x * x + y * y + z * z); }\r\n    Point3f &scale(const double scalar) {\r\n        x *= scalar;\r\n        y *= scalar;\r\n        z *= scalar;\r\n        return *this;\r\n    }\r\n    Point3f &normalise() { return scale(1.0 / length()); }\r\n    Point3f &rotate(double theta, double phi) {\r\n        double t = x;\r\n        x = t * cos(theta) - y * sin(theta);\r\n        y = y * cos(theta) + t * sin(theta);\r\n        t = x;\r\n        x = t * cos(phi) - z * sin(phi);\r\n        z = z * cos(phi) - t * sin(phi);\r\n        return *this;\r\n    }\r\n    //\r\n    friend double dot(const Point3f &a, const Point3f &b);\r\n    friend Point3f cross(const Point3f &a, const Point3f &b);\r\n};\r\n\r\ninline double dot(const Point3f &a, const Point3f &b) { return (a.x * b.x + a.y * b.y + a.z * b.z); }\r\ninline Point3f cross(const Point3f &a, const Point3f &b) {\r\n    return Point3f(a.y * b.z - b.y * a.z, a.z * b.x - b.z * a.x, a.x * b.y - b.x * a.y);\r\n}\r\n\r\n//\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n\r\n// used for clipping of polygons to regions\r\n\r\nstruct EdgeU {\r\n    int edge;\r\n    double u;\r\n    EdgeU(int e = -1, double _u = 0.0) {\r\n        edge = e;\r\n        u = _u;\r\n    }\r\n    EdgeU(const EdgeU &eu) {\r\n        edge = eu.edge;\r\n        u = eu.u;\r\n    }\r\n    friend bool ccwEdgeU(const EdgeU &a, const EdgeU &b, const EdgeU &c);\r\n};\r\n\r\n// QtRegion\r\n\r\nclass QtRegion {\r\n  public:\r\n    Point2f bottom_left;\r\n    Point2f top_right;\r\n    QtRegion(const Point2f &bl = Point2f(), const Point2f &tr = Point2f()) {\r\n        bottom_left = bl;\r\n        top_right = tr;\r\n    }\r\n    QtRegion(const QtRegion &r) {\r\n        bottom_left = r.bottom_left;\r\n        top_right = r.top_right;\r\n    }\r\n    QtRegion &operator=(const QtRegion &r) {\r\n        bottom_left = r.bottom_left;\r\n        top_right = r.top_right;\r\n        return *this;\r\n    }\r\n    //\r\n    double height() const { return fabs(top_right.y - bottom_left.y); }\r\n    double width() const\r\n    // The assumption that top_right.x is always > bottom_left.x is not always true.\r\n    // Returning a negative value here causes an infinite loop at axialmap.cpp line 3106\r\n    // after overlapdist is assigned a negative value at axialmap.cpp line 3084.\r\n    // height() above could also be changed for this reason, but this is a band-aid\r\n    // fix for the real problem, which is why the top_right > bottom_left assumption\r\n    // is assumed to be 100% valid but is, in some instances, not valid.\r\n    // { return top_right.x - bottom_left.x; }\r\n    {\r\n        return fabs(top_right.x - bottom_left.x);\r\n    }\r\n    double area() const { return height() * width(); }\r\n    void normalScale(const QtRegion &r) {\r\n        top_right.normalScale(r);\r\n        bottom_left.normalScale(r);\r\n    }\r\n    void denormalScale(const QtRegion &r) {\r\n        top_right.denormalScale(r);\r\n        bottom_left.denormalScale(r);\r\n    }\r\n    void scale(const Point2f &scalevec) {\r\n        top_right.scale(scalevec);\r\n        bottom_left.scale(scalevec);\r\n    }\r\n    void offset(const Point2f &offset) {\r\n        top_right += offset;\r\n        bottom_left += offset;\r\n    }\r\n    Point2f getCentre() const {\r\n        return Point2f((bottom_left.x + top_right.x) / 2.0, (bottom_left.y + top_right.y) / 2.0);\r\n    }\r\n    //\r\n    bool contains(const Point2f &p) const {\r\n        return (p.x > bottom_left.x && p.x < top_right.x && p.y > bottom_left.y && p.y < top_right.y);\r\n    }\r\n    bool contains_touch(const Point2f &p) const {\r\n        return (p.x >= bottom_left.x && p.x <= top_right.x && p.y >= bottom_left.y && p.y <= top_right.y);\r\n    }\r\n    void encompass(const Point2f &p) {\r\n        if (p.x < bottom_left.x)\r\n            bottom_left.x = p.x;\r\n        if (p.x > top_right.x)\r\n            top_right.x = p.x;\r\n        if (p.y < bottom_left.y)\r\n            bottom_left.y = p.y;\r\n        if (p.y > top_right.y)\r\n            top_right.y = p.y;\r\n    }\r\n    //\r\n    bool atZero() const { return bottom_left.atZero() || top_right.atZero(); }\r\n    //\r\n    Point2f getEdgeUPoint(const EdgeU &eu);\r\n    EdgeU getCutEdgeU(const Point2f &inside, const Point2f &outside);\r\n    //\r\n    friend bool intersect_region(const QtRegion &a, const QtRegion &b, double tolerance);\r\n    friend bool overlap_x(const QtRegion &a, const QtRegion &b, double tolerance);\r\n    friend bool overlap_y(const QtRegion &a, const QtRegion &b, double tolerance);\r\n    //\r\n    // set functions\r\n    friend QtRegion runion(const QtRegion &a, const QtRegion &b);\r\n    friend QtRegion rintersect(const QtRegion &a, const QtRegion &b); // undefined?\r\n    //\r\n    void grow(const double scalar) {\r\n        Point2f dim = top_right - bottom_left;\r\n        dim.scale(scalar - 1.0);\r\n        top_right += dim;\r\n        bottom_left -= dim;\r\n    }\r\n};\r\n\r\n// First time we have a region available to use...\r\ninline void Point2f::normalScale(const QtRegion &r) {\r\n    if (r.width())\r\n        x = (x - r.bottom_left.x) / r.width();\r\n    else\r\n        x = 0.0;\r\n    if (r.height())\r\n        y = (y - r.bottom_left.y) / r.height();\r\n    else\r\n        y = 0.0;\r\n}\r\n\r\ninline void Point2f::denormalScale(const QtRegion &r) {\r\n    x = x * r.width() + r.bottom_left.x;\r\n    y = y * r.height() + r.bottom_left.y;\r\n}\r\n\r\n// Lines are stored left to right as regions,\r\n// the parity tells us whether the region should be inverted\r\n// top to bottom to get the line\r\n\r\nclass Line : public QtRegion {\r\n  protected:\r\n    struct Bits {\r\n        Bits() : x_dummy(0), y_dummy(0), z_dummy(0) {}\r\n        char parity : 8;    // 1 ... positive, 0 ... negative\r\n        char direction : 8; // 1 ... positive, 0 ... negative\r\n\r\n        // dummy variables as it seems to be necessary that the width of this struct is 8 bytes\r\n        // and I don't want any uninitialised memory that gets written to file accidentally\r\n        char x_dummy : 8;\r\n        char y_dummy : 8;\r\n        int z_dummy : 32;\r\n    };\r\n    Bits bits;\r\n\r\n  public:\r\n    Line();\r\n    Line(const Point2f &a, const Point2f &b);\r\n    Line(const QtRegion &r) : QtRegion(r) {\r\n        bits.parity = 1;\r\n        bits.direction = 1;\r\n    }\r\n    Line(const Line &l) : QtRegion(l) { bits = l.bits; }\r\n    Line &operator=(const Line &l) {\r\n        this->QtRegion::operator=(l);\r\n        bits = l.bits;\r\n        return *this;\r\n    }\r\n    //\r\n    friend bool intersect_line(const Line &a, const Line &b, double tolerance);\r\n    friend bool intersect_line_no_touch(const Line &a, const Line &b, double tolerance);\r\n    friend int intersect_line_distinguish(const Line &a, const Line &b, double tolerance);\r\n    friend int intersect_line_b(const Line &a, const Line &b, double tolerance);\r\n    //\r\n    // fills in the location along the axis where the intersection happens\r\n    bool intersect_line(const Line &l, int axis, double &loc) const;\r\n    double intersection_point(const Line &l, int axis, double tolerance = 0.0) const;\r\n    // this converts a loc retrieved from intersect line or intersection point back into a point:\r\n    Point2f point_on_line(double loc, int axis) const;\r\n    // ...and a quick do it all in one go:\r\n    friend Point2f intersection_point(const Line &a, const Line &b, double tolerance);\r\n    //\r\n    bool crop(const QtRegion &r);\r\n    void ray(short dir, const QtRegion &r);\r\n    //\r\n    friend double dot(const Line &a, const Line &b);\r\n    //\r\n    double ax() const { return bottom_left.x; }\r\n    double &ax() { return bottom_left.x; }\r\n    double bx() const { return top_right.x; }\r\n    double &bx() { return top_right.x; }\r\n    double ay() const { return bits.parity ? bottom_left.y : top_right.y; }\r\n    double &ay() { return bits.parity ? bottom_left.y : top_right.y; }\r\n    double by() const { return bits.parity ? top_right.y : bottom_left.y; }\r\n    double &by() { return bits.parity ? top_right.y : bottom_left.y; }\r\n    //\r\n    const Point2f start() const { return Point2f(bottom_left.x, (bits.parity ? bottom_left.y : top_right.y)); }\r\n    const Point2f end() const { return Point2f(top_right.x, (bits.parity ? top_right.y : bottom_left.y)); }\r\n    const Point2f midpoint() const { return Point2f((start() + end()) / 2); }\r\n    //\r\n    // helpful to have a user friendly indication of direction:\r\n    bool rightward() const { return bits.direction == 1; }\r\n    bool upward() const { return bits.direction == bits.parity; }\r\n    //\r\n    const Point2f t_start() const {\r\n        return Point2f((rightward() ? bottom_left.x : top_right.x), (upward() ? bottom_left.y : top_right.y));\r\n    }\r\n    const Point2f t_end() const {\r\n        return Point2f((rightward() ? top_right.x : bottom_left.x), (upward() ? top_right.y : bottom_left.y));\r\n    }\r\n    //\r\n    short sign() const { return bits.parity ? 1 : -1; }\r\n    //\r\n    double grad(int axis) const { return (axis == YAXIS) ? sign() * height() / width() : sign() * width() / height(); }\r\n    double constant(int axis) const { return (axis == YAXIS) ? ay() - grad(axis) * ax() : ax() - grad(axis) * ay(); }\r\n    //\r\n    double length() const {\r\n        return (double)sqrt((top_right.x - bottom_left.x) * (top_right.x - bottom_left.x) +\r\n                            (top_right.y - bottom_left.y) * (top_right.y - bottom_left.y));\r\n    }\r\n    //\r\n    short direction() const { return bits.direction; }\r\n    Point2f vector() const { return t_end() - t_start(); }\r\n};\r\n\r\ninline Point2f intersection_point(const Line &a, const Line &b, double tolerance) {\r\n    int axis = (a.width() >= a.height()) ? XAXIS : YAXIS;\r\n    return a.point_on_line(a.intersection_point(b, axis, tolerance), axis);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nstruct TaggedLine {\r\n    Line line;\r\n    int tag;\r\n    TaggedLine(const Line &l = Line(), int t = -1) {\r\n        line = l;\r\n        tag = t;\r\n    }\r\n};\r\n\r\n// plain 2-point line without regions\r\nstruct SimpleLine {\r\n  public:\r\n    SimpleLine(const Line &line) {\r\n        m_start.x = line.t_start().x;\r\n        m_start.y = line.t_start().y;\r\n        m_end.x = line.t_end().x;\r\n        m_end.y = line.t_end().y;\r\n    }\r\n    SimpleLine(const Point2f &a, const Point2f &b) {\r\n        m_start.x = a.x;\r\n        m_start.y = a.y;\r\n        m_end.x = b.x;\r\n        m_end.y = b.y;\r\n    }\r\n    SimpleLine(double x1, double y1, double x2, double y2) {\r\n        m_start.x = x1;\r\n        m_start.y = y1;\r\n        m_end.x = x2;\r\n        m_end.y = y2;\r\n    }\r\n    const Point2f &start() const { return m_start; }\r\n    const Point2f &end() const { return m_end; }\r\n\r\n  private:\r\n    Point2f m_start;\r\n    Point2f m_end;\r\n};\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// not sure if this code is used any more:\r\n\r\n// Now the difficult bit: making the line segments into polygons...\r\n// The polygons are stored in a tree format so that intersection testing is easier\r\n\r\nclass RegionTree {\r\n    friend class Poly;\r\n\r\n  protected:\r\n    Line *m_p_region;\r\n    RegionTree *m_p_left;\r\n    RegionTree *m_p_right;\r\n\r\n  public:\r\n    RegionTree() {\r\n        m_p_region = NULL;\r\n        m_p_left = this;\r\n        m_p_right = this;\r\n    }\r\n    virtual ~RegionTree() {\r\n        if (m_p_region)\r\n            delete m_p_region;\r\n    }\r\n    //\r\n    virtual bool is_leaf() const = 0;\r\n    //\r\n    RegionTree &left() const { return *m_p_left; }\r\n    RegionTree &right() const { return *m_p_right; }\r\n    //\r\n    operator QtRegion() const { return *(QtRegion *)m_p_region; }\r\n    operator Line() const { return *(Line *)m_p_region; }\r\n    //\r\n    friend bool intersect(const RegionTree &a, const RegionTree &b);\r\n    friend bool subintersect(const RegionTree &a, const RegionTree &b);\r\n    friend int intersections(const RegionTree &a, const Line &b);\r\n};\r\n\r\n// Branch on a region tree...\r\n\r\nclass RegionTreeBranch : public RegionTree {\r\n  public:\r\n    RegionTreeBranch() : RegionTree() { ; }\r\n    RegionTreeBranch(const Line &r, const RegionTree &a, const RegionTree &b) {\r\n        m_p_left = (RegionTree *)&a;\r\n        m_p_right = (RegionTree *)&b;\r\n        m_p_region = new Line(r); // copy\r\n    }\r\n    virtual bool is_leaf() const { return false; }\r\n};\r\n\r\n// Leaf on a region tree...\r\n\r\nclass RegionTreeLeaf : public RegionTree {\r\n  public:\r\n    RegionTreeLeaf() : RegionTree() { ; }\r\n    RegionTreeLeaf(const Line &l) {\r\n        // no subnodes (but nice recursive properties)\r\n        m_p_left = this;\r\n        m_p_right = this;\r\n        m_p_region = new Line(l);\r\n    }\r\n    virtual bool is_leaf() const { return true; }\r\n};\r\n\r\nclass Poly {\r\n  protected:\r\n    int m_line_segments;\r\n    RegionTree *m_p_root;\r\n\r\n  public:\r\n    Poly() {\r\n        m_p_root = NULL;\r\n        m_line_segments = 0;\r\n    }\r\n    Poly(const Poly &p) {\r\n        m_line_segments = p.m_line_segments;\r\n        m_p_root = copy_region_tree(p.m_p_root);\r\n    }\r\n    Poly &operator=(const Poly &p) {\r\n        if (this != &p) {\r\n            m_line_segments = p.m_line_segments;\r\n            m_p_root = copy_region_tree(p.m_p_root);\r\n        }\r\n        return *this;\r\n    }\r\n    virtual ~Poly() { destroy_region_tree(); }\r\n    // essentially, the copy constructor...\r\n    RegionTree *copy_region_tree(const RegionTree *tree);\r\n    // essentially, the destructor...\r\n    void destroy_region_tree();\r\n    //\r\n    RegionTree &get_region_tree() const { return *m_p_root; }\r\n    //\r\n    void add_line_segment(const Line &l);\r\n    //\r\n    int get_line_segments() { return m_line_segments; }\r\n    QtRegion get_bounding_box() { return *(QtRegion *)(m_p_root->m_p_region); }\r\n    //\r\n    bool contains(const Point2f &p);\r\n    friend bool intersect(const Poly &a, const Poly &b);\r\n};\r\n"
  },
  {
    "path": "genlib/pafmath.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// a collection of math functions\r\n\r\n#include \"pafmath.h\"\r\n\r\n#include <inttypes.h>\r\n#include <math.h>\r\n\r\nuint64_t g_rand[11] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};\r\n\r\n// 25-Jul-2007: changed the g_mult and g_const used for random number generation\r\n// for some reason, there appeared to be a pattern to the numbers\r\n\r\n// Quick mod - TV\r\nconst uint64_t g_mult = /*(0xF9561B2E << 32) + */ 0x71A7FA85;\r\nconst uint64_t g_const = /*(0x9BB3920E << 32) + */ 0xF5E958B9;\r\n\r\nvoid pafsrand(unsigned int seed, int set) // = 0\r\n{\r\n    g_rand[set] = seed;\r\n}\r\n\r\n// Pafrand is a Linear Congruential Generator\r\n// After the 25-Jul-2007 changes:\r\n// The current version seems to meet standard randomness conditions\r\n// Tested using Diehard, the 32 bit version ((g_rand[set] >> 32) & 0xffffffff)\r\n// passes all tests for at least the first 5 seeds above\r\n// it is also independent in at least 20 dimensions\r\n// It should not be used for \"serious\" randomness, but should be fine\r\n// for most things (agents in depthmapX, genetic algorithms, etc)\r\n\r\n// 25-Jul-2007: moved up to take top 32 bits\r\n\r\nunsigned int pafrand(int set) // = 0\r\n{\r\n    g_rand[set] = g_mult * g_rand[set] + g_const;\r\n\r\n    return (unsigned int)((g_rand[set] >> 32) & PAF_RAND_MAX);\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\ndouble poisson(int x, double lambda) {\r\n    double f = exp(-lambda);\r\n    for (int i = 1; i <= x; i++) {\r\n        f *= lambda / double(i);\r\n    }\r\n    return f;\r\n}\r\n\r\ndouble cumpoisson(int x, double lambda) {\r\n    double f = exp(-lambda);\r\n    double c = f;\r\n    for (int i = 1; i <= x; i++) {\r\n        f *= lambda / double(i);\r\n        c += f;\r\n    }\r\n    return c;\r\n}\r\n\r\nint invcumpoisson(double p, double lambda) {\r\n    if (p <= 0) {\r\n        return 0;\r\n    }\r\n    if (p >= 1) {\r\n        // passing this 1 will cause an infinite loop, try this instead:\r\n        p = 1 - 1e-9;\r\n    }\r\n    double f = exp(-lambda);\r\n    int i = 0;\r\n    for (double c = f; c < p; c += f) {\r\n        i++;\r\n        f *= lambda / double(i);\r\n    }\r\n    return i;\r\n}\r\n"
  },
  {
    "path": "genlib/pafmath.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n\r\n// Paf Template Library --- a set of useful C++ templates\r\n//\r\n// Copyright (c) 1996-2011 Alasdair Turner (a.turner@ucl.ac.uk)\r\n//\r\n//-----------------------------------------------------------------------------\r\n//  This library is free software; you can redistribute it and/or\r\n//  modify it under the terms of the GNU Lesser General Public\r\n//  License as published by the Free Software Foundation; either\r\n//  version 2.1 of the License, or (at your option) any later version.\r\n//\r\n//  This library is distributed in the hope that it will be useful,\r\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n//  Lesser General Public License for more details.\r\n//\r\n//  You should have received a copy of the GNU Lesser General Public\r\n//  License along with this library; if not, write to the Free Software\r\n//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r\n//\r\n//  See the lgpl.txt file for details\r\n//-----------------------------------------------------------------------------\r\n\r\n// a collection of math functions\r\n\r\n#pragma once\r\n\r\n#include <cmath>\r\n\r\n#ifndef M_PI\r\n#define M_PI 3.1415926535897932384626433832795\r\n#endif\r\n\r\ninline double sqr(double a) { return (a * a); }\r\n\r\ninline int sgn(double a) { return (a < 0) ? -1 : 1; }\r\n\r\n#ifndef M_ROOT_1_2\r\n#define M_ROOT_1_2 0.70710678118654752440084436210485\r\n#endif\r\n\r\n#ifndef M_1_LN2\r\n#define M_1_LN2 1.4426950408889634073599246810019\r\n#endif\r\n\r\nconst unsigned int PAF_RAND_MAX = 0x0FFFFFFF;\r\nvoid pafsrand(unsigned int seed, int set = 0);\r\nunsigned int pafrand(int set = 0);\r\n\r\n// a random number from 0 to 1\r\ninline double prandom(int set = 0) { return double(pafrand(set)) / double(PAF_RAND_MAX); }\r\n\r\n// a random number from 0 to just less than 1\r\n\r\ninline double prandomr(int set = 0) { return double(pafrand(set)) / double(PAF_RAND_MAX + 1); }\r\n\r\n// note, in order to stop confusing myself I have ln defined:\r\n#define ln(X) log(X)\r\n\r\ninline double log2(double a) { return (ln(a) * M_1_LN2); }\r\n\r\n// Hillier Hanson dvalue\r\n/*\r\ninline double dvalue(double k)\r\n{\r\n   return 2.0 * (3.3231 * k * log10(k+2) - 2.5863 * k + 1.0) / ((k - 1.0) * (k - 2.0));\r\n}\r\n*/\r\n\r\n// Hillier Hanson dvalue (from Kruger 1989 -- see Teklenburg et al)\r\ninline double dvalue(double k) { return 2.0 * (k * (log2((k + 2.0) / 3.0) - 1.0) + 1.0) / ((k - 1.0) * (k - 2.0)); }\r\n\r\n// Hillier Hanson pvalue\r\ninline double pvalue(double k) { return 2.0 * (k - log2(k) - 1.0) / ((k - 1.0) * (k - 2.0)); }\r\n\r\n// Teklenburg integration (correction 31.01.11 due to Ulrich Thaler\r\ninline double teklinteg(double nodecount, double totaldepth) {\r\n    return ln(0.5 * (nodecount - 2.0)) / ln(double(totaldepth - nodecount + 1));\r\n}\r\n\r\n// Penn palmtree\r\n\r\ninline double palmtree(double n, double r) {\r\n    if (n > r) {\r\n        return r * (n - 0.5 * (r + 1));\r\n    } else {\r\n        return 0.5 * n * (n - 1);\r\n    }\r\n}\r\n\r\ndouble poisson(int x, double lambda);\r\ndouble cumpoisson(int x, double lambda);\r\nint invcumpoisson(double p, double lambda);\r\n"
  },
  {
    "path": "genlib/pflipper.h",
    "content": "// Copyright (c) 1996-2011 Alasdair Turner (a.turner@ucl.ac.uk)\n//\n//-----------------------------------------------------------------------------\n//  This library is free software; you can redistribute it and/or\n//  modify it under the terms of the GNU Lesser General Public\n//  License as published by the Free Software Foundation; either\n//  version 2.1 of the License, or (at your option) any later version.\n//\n//  This library is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n//  Lesser General Public License for more details.\n//\n//  You should have received a copy of the GNU Lesser General Public\n//  License along with this library; if not, write to the Free Software\n//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n//\n//  See the lgpl.txt file for details\n//-----------------------------------------------------------------------------\n\n#pragma once\n\ntemplate <class T> class pflipper {\n  protected:\n    T m_contents[2];\n    short parity;\n\n  public:\n    pflipper() { parity = 0; }\n    pflipper(const T &a, const T &b) {\n        parity = 0;\n        m_contents[0] = a;\n        m_contents[1] = b;\n    }\n    pflipper(const pflipper &f) {\n        parity = f.parity;\n        m_contents[0] = f.m_contents[0];\n        m_contents[1] = f.m_contents[1];\n    }\n    virtual ~pflipper() {}\n    pflipper &operator=(const pflipper &f) {\n        if (this != &f) {\n            parity = f.parity;\n            m_contents[0] = f.m_contents[0];\n            m_contents[1] = f.m_contents[1];\n        }\n        return *this;\n    }\n    void flip() { parity = (parity == 0) ? 1 : 0; }\n    T &a() { return m_contents[parity]; }\n    T &b() { return m_contents[(parity == 0) ? 1 : 0]; }\n    const T &a() const { return m_contents[parity]; }\n    const T &b() const { return m_contents[(parity == 0) ? 1 : 0]; }\n};\n"
  },
  {
    "path": "genlib/readwritehelpers.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/exceptions.h\"\n\n#include <iostream>\n#include <map>\n#include <vector>\n\nnamespace dXreadwrite {\n    // The read/write methods can only be used for vectors of stack allocated types (basic data, POD)\n    // read in vector data and write to an existing vector (overwriting its previous contents)\n    template <typename T> size_t readIntoVector(std::istream &stream, std::vector<T> &vec) {\n        vec.clear();\n        unsigned int size;\n        stream.read(reinterpret_cast<char *>(&size), sizeof(size));\n        if (size > 0) {\n            vec.resize(size);\n            stream.read(reinterpret_cast<char *>(vec.data()), sizeof(T) * std::streamsize(size));\n        }\n        return size;\n    }\n    // read in a vector into a new vector\n    template <typename T> std::vector<T> readVector(std::istream &stream) {\n        std::vector<T> vec;\n        readIntoVector(stream, vec);\n        return vec;\n    }\n\n    template <typename T> void writeVector(std::ostream &stream, const std::vector<T> &vec) {\n        // READ / WRITE USES 32-bit LENGTHS (number of elements) for compatibility reasons\n\n        if (vec.size() > size_t(static_cast<unsigned int>(-1))) {\n            throw new depthmapX::RuntimeException(\"Vector exceeded max size for streaming\");\n        }\n        const unsigned int length = static_cast<const unsigned int>(vec.size());\n        stream.write(reinterpret_cast<const char *>(&length), sizeof(length));\n        if (length > 0) {\n            stream.write(reinterpret_cast<const char *>(vec.data()), sizeof(T) * std::streamsize(length));\n        }\n    }\n\n    // read in map data and write to an existing map (overwriting its previous contents)\n    template <typename K, typename V> size_t readIntoMap(std::istream &stream, std::map<K, V> &map) {\n        map.clear();\n        unsigned int size;\n        stream.read(reinterpret_cast<char *>(&size), sizeof(size));\n        for (size_t i = 0; i < size; ++i) {\n            K key;\n            V value;\n            stream.read(reinterpret_cast<char *>(&key), sizeof(K));\n            stream.read(reinterpret_cast<char *>(&value), sizeof(V));\n            map.insert(std::make_pair(key, value));\n        }\n        return size;\n    }\n    // read in a map into a new map\n    template <typename K, typename V> std::map<K, V> readMap(std::istream &stream) {\n        std::map<K, V> map;\n        readIntoMap(stream, map);\n        return map;\n    }\n\n    template <typename K, typename V> void writeMap(std::ostream &stream, const std::map<K, V> &map) {\n        // READ / WRITE USES 32-bit LENGTHS (number of elements) for compatibility reasons\n\n        if (map.size() > size_t(static_cast<unsigned int>(-1))) {\n            throw new depthmapX::RuntimeException(\"Map exceeded max size for streaming\");\n        }\n        const unsigned int length = static_cast<const unsigned int>(map.size());\n        stream.write(reinterpret_cast<const char *>(&length), sizeof(length));\n        for (auto &pair : map) {\n            stream.write(reinterpret_cast<const char *>(&pair.first), sizeof(K));\n            stream.write(reinterpret_cast<const char *>(&pair.second), sizeof(V));\n        }\n    }\n\n} // namespace dXreadwrite\n"
  },
  {
    "path": "genlib/simplematrix.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2018, Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <algorithm>\n#include <stdexcept>\n\nnamespace depthmapX {\n\n    /**\n     *  Base class for 2 dimensional matrices. This can be used as reference/pointer, but you cannot\n     *  create this directly - you need to create either a row or a column matrix (the difference\n     *  being the memory layout either, contiguous rows, or contiguous columns.\n     *  Which layout to choose depends on the underlying data - if the data layout is given, it should be\n     *  simple to find the matching implementation. To choose a new data layout, think about access patterns.\n     *  If it is more likely to process several values from one row in one got, choose a row matrix. If processing\n     *  is more likely to be by column, choose a column matrix. If access is truly random, it makes no difference.\n     */\n    template <typename T> class BaseMatrix {\n      protected:\n        BaseMatrix(size_t rows, size_t columns) {\n            m_data = new T[rows * columns];\n            m_rows = rows;\n            m_columns = columns;\n        }\n\n        BaseMatrix<T>(const BaseMatrix<T> &other) : BaseMatrix<T>(other.m_rows, other.m_columns) {\n            std::copy(other.begin(), other.end(), m_data);\n        }\n\n        BaseMatrix<T>(BaseMatrix<T> &&other) : m_data(other.m_data), m_rows(other.m_rows), m_columns(other.m_columns) {\n            other.m_data = nullptr;\n            other.m_rows = 0;\n            other.m_columns = 0;\n        }\n\n      public:\n        virtual ~BaseMatrix<T>() { delete[] m_data; }\n\n        /**\n         * @brief Fill all values of the matrix with a default value\n         * @param value default value\n         */\n        virtual void initialiseValues(T const &value) { std::fill(begin(), end(), value); }\n\n        /**\n         * @brief Resets the matrix to a new size - this deletes all contents.\n         * This method provides a strong exception guarantee - if the new statement throws,\n         * the old state will be preserved.\n         * @param rows new number of rows\n         * @param columns new number of columns\n         */\n        virtual void reset(size_t rows, size_t columns) {\n            // allocate new memory first - if this throws, the old matrix is still intact.\n            T *tmp = new T[rows * columns];\n            delete[] m_data;\n            m_data = tmp;\n\n            m_rows = rows;\n            m_columns = columns;\n        }\n\n        /**\n         * @brief operator () access operator uses () instead of [] to allow giving two coordinates\n         * @param row row to access\n         * @param column column to access\n         * @return non-const reference to the data\n         */\n        virtual T &operator()(size_t row, size_t column) = 0;\n\n        /**\n         * @brief operator () access operator uses () instead of [] to allow giving two coordinates\n         * @param row row to access\n         * @param column column to access\n         * @return const reference to the data\n         */\n        virtual T const &operator()(size_t row, size_t column) const = 0;\n\n        /**\n         * @brief begin get a pointer to the data array (complies with std::iterator definitions)\n         * @return pointer to the first element\n         */\n        T *begin() { return m_data; }\n\n        /**\n         * @brief end pointer marking the end of the data array\n         * @return pointer behind the last element of the data array\n         */\n        T *end() { return m_data + size(); }\n\n        /**\n         * @brief begin get a pointer to the data array (complies with std::iterator definitions)\n         * @return const pointer to the first element\n         */\n        T const *begin() const { return m_data; }\n\n        /**\n         * @brief end pointer marking the end of the data array\n         * @return const pointer behind the last element of the data array\n         */\n        T const *end() const { return m_data + size(); }\n\n        /**\n         * @brief size\n         * @return size of the data array in elements\n         */\n        size_t size() const { return m_rows * m_columns; }\n\n        /**\n         * @brief rows\n         * @return number of rows\n         */\n        size_t rows() const { return m_rows; }\n\n        /**\n         * @brief columns\n         * @return number of columns\n         */\n        size_t columns() const { return m_columns; }\n\n      protected:\n        T *m_data;\n        size_t m_rows;\n        size_t m_columns;\n\n        void access_check(size_t row, size_t column) const {\n            if (row >= m_rows) {\n                throw std::out_of_range(\"row out of range\");\n            }\n            if (column >= m_columns) {\n                throw std::out_of_range(\"column out of range\");\n            }\n        }\n\n        void swap(BaseMatrix &other) {\n            std::swap(m_data, other.m_data);\n            std::swap(m_rows, other.m_rows);\n            std::swap(m_columns, other.m_columns);\n        }\n    };\n\n    /**\n     * Row matrix implementation - the data for each row is contiguous in memory, columns jump by the\n     * number of rows.\n     */\n    template <typename T> class RowMatrix : public BaseMatrix<T> {\n      public:\n        RowMatrix(size_t rows, size_t columns) : BaseMatrix<T>(rows, columns) {}\n        RowMatrix(RowMatrix const &other) : BaseMatrix<T>(other) {}\n        RowMatrix(RowMatrix &&other) : BaseMatrix<T>(std::move(other)) {}\n\n        RowMatrix<T> &operator=(RowMatrix<T> const &other) {\n            RowMatrix tmp(other);\n            this->swap(tmp);\n            return *this;\n        }\n\n        RowMatrix<T> &operator=(RowMatrix<T> &&other) {\n            RowMatrix<T> tmp(std::move(other));\n            this->swap(tmp);\n            return *this;\n        }\n\n        T &operator()(size_t row, size_t column) {\n            this->access_check(row, column);\n            return this->m_data[column + row * this->m_columns];\n        }\n\n        T const &operator()(size_t row, size_t column) const {\n            this->access_check(row, column);\n            return this->m_data[column + row * this->m_columns];\n        }\n    };\n\n    /**\n     * Column matrix implementation - the data for each column is contiguous in memory, rows jump by the\n     * number of columns.\n     */\n    template <typename T> class ColumnMatrix : public BaseMatrix<T> {\n      public:\n        ColumnMatrix(size_t rows, size_t columns) : BaseMatrix<T>(rows, columns) {}\n        ColumnMatrix(ColumnMatrix const &other) : BaseMatrix<T>(other) {}\n        ColumnMatrix(ColumnMatrix &&other) : BaseMatrix<T>(std::move(other)) {}\n\n        ColumnMatrix<T> &operator=(ColumnMatrix<T> const &other) {\n            ColumnMatrix tmp(other);\n            this->swap(tmp);\n            return *this;\n        }\n\n        ColumnMatrix<T> &operator=(ColumnMatrix<T> &&other) {\n            ColumnMatrix<T> tmp(std::move(other));\n            this->swap(tmp);\n            return *this;\n        }\n\n        T &operator()(size_t row, size_t column) {\n            this->access_check(row, column);\n            return this->m_data[row + column * this->m_rows];\n        }\n\n        T const &operator()(size_t row, size_t column) const {\n            this->access_check(row, column);\n            return this->m_data[row + column * this->m_rows];\n        }\n    };\n} // namespace depthmapX\n"
  },
  {
    "path": "genlib/stringutils.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"stringutils.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <ctype.h>\n#include <memory>\n#include <sstream>\n\nnamespace dXstring {\n    std::vector<std::string> split(const std::string &s, char delim, bool skipEmptyTokens) {\n        std::vector<std::string> elems;\n        std::stringstream ss;\n        ss.str(s);\n        std::string item;\n        while (std::getline(ss, item, delim)) {\n            if (skipEmptyTokens && item.empty()) {\n                continue;\n            }\n            elems.push_back(item);\n        }\n\n        return elems;\n    }\n\n    std::string readString(std::istream &stream) {\n        unsigned int length;\n        stream.read(reinterpret_cast<char *>(&length), sizeof(length));\n        if (length == 0) {\n            return std::string();\n        }\n        std::string result(length, '\\0');\n        char *ptr = &result[0];\n        stream.read(ptr, length);\n        return result;\n    }\n\n    void writeString(std::ostream &stream, const std::string &s) {\n        unsigned int length = static_cast<unsigned int>(s.length());\n        stream.write(reinterpret_cast<char *>(&length), sizeof(unsigned int));\n        if (length > 0) {\n            stream.write(s.data(), length);\n        }\n    }\n\n    std::string formatString(double value, const std::string &format) {\n        size_t bufferLength = 24 + format.length();\n        std::vector<char> buffer(bufferLength, '\\0');\n        snprintf(&buffer[0], bufferLength, format.c_str(), value);\n        return std::string(&buffer[0]);\n    }\n\n    std::string formatString(int value, const std::string &format) {\n        size_t bufferLength = 24 + format.length();\n        std::vector<char> buffer(bufferLength, '\\0');\n        snprintf(&buffer[0], bufferLength, format.c_str(), value);\n        return std::string(&buffer[0]);\n    }\n\n    std::string &toLower(std::string &str) {\n        std::transform(str.begin(), str.end(), str.begin(), tolower);\n        return str;\n    }\n\n    // trim from start (in place)\n    void ltrim(std::string &s, char c) {\n        s.erase(s.begin(), std::find_if(s.begin(), s.end(), [&c](int ch) { return ch != c; }));\n    }\n\n    // trim from end (in place)\n    void rtrim(std::string &s, char c) {\n        s.erase(std::find_if(s.rbegin(), s.rend(), [&c](int ch) { return ch != c; }).base(), s.end());\n    }\n\n    void makeInitCaps(std::string &s) {\n        bool literal = false;\n        bool reset = true;\n        for (auto &c : s) {\n            if (!isalpha(c)) {\n                if (c == '\"') {\n                    literal = !literal;\n                }\n                reset = true;\n            } else {\n                if (!literal) {\n                    if (reset) {\n                        c = static_cast<char>(toupper(c));\n                    } else {\n                        c = static_cast<char>(tolower(c));\n                    }\n                }\n                reset = false;\n            }\n        }\n    }\n\n    bool isDouble(const std::string &s) {\n        // nasty const cast to satisfy the function signature - we will not change the value of endPtr\n        char *endPtr = const_cast<char *>(&s[0]);\n        strtod(s.c_str(), &endPtr);\n        return endPtr != &s[0];\n    }\n\n    // handles all three line endings (\"\\r\", \"\\n\" and \"\\r\\n\"). taken from:\n    // https://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf\n    std::istream &safeGetline(std::istream &is, std::string &t) {\n        t.clear();\n\n        // The characters in the stream are read one-by-one using a std::streambuf.\n        // That is faster than reading them one-by-one using the std::istream.\n        // Code that uses streambuf this way must be guarded by a sentry object.\n        // The sentry object performs various tasks,\n        // such as thread synchronization and updating the stream state.\n\n        std::istream::sentry se(is, true);\n        std::streambuf *sb = is.rdbuf();\n\n        for (;;) {\n            int c = sb->sbumpc();\n            switch (c) {\n            case '\\n':\n                return is;\n            case '\\r':\n                if (sb->sgetc() == '\\n')\n                    sb->sbumpc();\n                return is;\n            case std::streambuf::traits_type::eof():\n                // Also handle the case when the last line has no line ending\n                if (t.empty())\n                    is.setstate(std::ios::eofbit);\n                return is;\n            default:\n                t += (char)c;\n            }\n        }\n    }\n} // namespace dXstring\n"
  },
  {
    "path": "genlib/stringutils.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// Collection of utility functions that are required to add pstring functionality\n// to std::strings (i.e. splitting and compatible serialisation/deserialisation)\n\n#pragma once\n\n#include <istream>\n#include <ostream>\n#include <string>\n#include <vector>\n\nnamespace dXstring {\n    std::vector<std::string> split(const std::string &s, char delim, bool skipEmptyTokens = false);\n    std::string readString(std::istream &stream);\n    void writeString(std::ostream &stream, const std::string &s);\n    std::string formatString(double value, const std::string &format = \"%+.16le\");\n    std::string formatString(int value, const std::string &format = \"% 16d\");\n    /// Inplace conversion to lower case\n    std::string &toLower(std::string &str);\n    void ltrim(std::string &s, char c = ' ');\n    void rtrim(std::string &s, char c = ' ');\n    void makeInitCaps(std::string &s);\n    bool isDouble(const std::string &s);\n    template <class T> bool beginsWith(const T &input, const T match) {\n        return input.size() >= match.size() && equal(match.begin(), match.end(), input.begin());\n    }\n    std::istream &safeGetline(std::istream &is, std::string &t);\n\n} // namespace dXstring\n"
  },
  {
    "path": "genlib/xmlparse.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include \"xmlparse.h\"\r\n\r\nenum {\r\n    STEP_START,\r\n    STEP_ELEMENT_NAME,\r\n    STEP_ATTRIBUTE_NAME,\r\n    STEP_START_ATTRIBUTE_VALUE,\r\n    STEP_ATTRIBUTE_VALUE,\r\n    STEP_CLOSING\r\n};\r\n\r\nbool iscrlf(char c) {\r\n    // \\n is MAC = 13, UNIX = 10, MS = 13,10\r\n    return (c == 10 || c == 13);\r\n}\r\n\r\nbool xmlelement::parse(std::ifstream &stream, bool parsesubelements) {\r\n    bool closed = false;\r\n    bool complete = false;\r\n    int step = STEP_START;\r\n    std::string buffer;\r\n    std::string attribute;\r\n    std::string value;\r\n    while (!complete && stream) {\r\n        char c = static_cast<char>(stream.get());\r\n        if (stream) {\r\n            switch (step) {\r\n            case STEP_START:\r\n                if (c == '<') {\r\n                    step = 1;\r\n                    buffer.clear();\r\n                }\r\n                break;\r\n            case STEP_ELEMENT_NAME:\r\n                if (isspace(c) || iscrlf(c)) {\r\n                    name = buffer;\r\n                    buffer.clear();\r\n                    step = STEP_ATTRIBUTE_NAME;\r\n                } else if (c == '/') {\r\n                    if (buffer.empty()) {\r\n                        closetag = true;\r\n                    } else {\r\n                        name = buffer;\r\n                        buffer.clear();\r\n                        step = STEP_CLOSING;\r\n                    }\r\n                } else if (c == '>') {\r\n                    if (buffer.empty()) {\r\n                        throw xmlerror(\"No element name\");\r\n                    } else {\r\n                        name = buffer;\r\n                        buffer.clear();\r\n                        complete = true;\r\n                        if (closetag) {\r\n                            closed = true;\r\n                        } else {\r\n                            if (parsesubelements) {\r\n                                closed = subparse(stream);\r\n                            }\r\n                        }\r\n                    }\r\n                } else if (isalnum(c) || ispunct(c)) {\r\n                    buffer += c;\r\n                } else {\r\n                    badcharacter(c, \"parsing element name\");\r\n                }\r\n                break;\r\n            case STEP_CLOSING:\r\n                if (c == '>') {\r\n                    // only get here if midway through tag\r\n                    closed = true;\r\n                    complete = true;\r\n                } else if (!isspace(c) && !iscrlf(c)) {\r\n                    badcharacter(c, \"closing element tag\");\r\n                }\r\n                break;\r\n            case STEP_ATTRIBUTE_NAME:\r\n                if (isspace(c) || iscrlf(c)) {\r\n                    if (attribute.empty()) {\r\n                        attribute = buffer;\r\n                        buffer.clear();\r\n                    }\r\n                } else if (c == '=') {\r\n                    if (attribute.empty()) {\r\n                        attribute = buffer;\r\n                        if (attribute.empty()) {\r\n                            throw xmlerror(\"No attribute name\");\r\n                        }\r\n                    }\r\n                    buffer.clear();\r\n                    step = STEP_START_ATTRIBUTE_VALUE;\r\n                } else if (c == '/') {\r\n                    // could be closing a tag without specifying attribute value, but we'll be okay:\r\n                    step = STEP_CLOSING;\r\n                } else if (c == '>') {\r\n                    complete = true;\r\n                    // could be closing a tag without specifying attribute value, but we'll be okay:\r\n                    if (parsesubelements) {\r\n                        closed = subparse(stream);\r\n                    }\r\n                } else if (isalnum(c) || ispunct(c)) {\r\n                    buffer += c;\r\n                } else {\r\n                    badcharacter(c, \"reading attribute name\");\r\n                }\r\n                break;\r\n            case STEP_START_ATTRIBUTE_VALUE:\r\n                if (c == '\\\"') {\r\n                    step = STEP_ATTRIBUTE_VALUE;\r\n                } else if (!isspace(c) && !iscrlf(c)) {\r\n                    badcharacter(c, \"expecting opening '\\\"'\");\r\n                }\r\n                break;\r\n            case STEP_ATTRIBUTE_VALUE:\r\n                if (c == '\\\"') {\r\n                    attributes[attribute] = buffer;\r\n                    buffer.clear();\r\n                    attribute.clear();\r\n                    step = STEP_ATTRIBUTE_NAME;\r\n                } else {\r\n                    // there was a bad char test for 'isprint(c)', but it didn't like certain characters!\r\n                    buffer += c;\r\n                }\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    if (!complete && step != STEP_START) {\r\n        throw xmlerror(std::string(\"Unexpected end of element \") + name);\r\n    }\r\n    return closed;\r\n}\r\n\r\nvoid xmlelement::badcharacter(char c, const std::string &location) {\r\n    if (isprint(c)) {\r\n        throw(std::string(\"Found '\") + c + std::string(\"' while \") + location);\r\n    } else {\r\n        std::stringstream s;\r\n        s << \"Found character \" << int(c) << \" while \" << location;\r\n        throw(s.str());\r\n    }\r\n}\r\n\r\nbool xmlelement::subparse(std::ifstream &stream) {\r\n    bool complete = false;\r\n    while (!complete && stream) {\r\n        subelements.push_back(xmlelement());\r\n        if (!subelements.back().parse(stream, true)) {\r\n            throw xmlerror(std::string(\"Unexplained error\"));\r\n        }\r\n        if (subelements.back().closetag) {\r\n            if (subelements.back().name == name) {\r\n                subelements.pop_back();\r\n                complete = true;\r\n            } else {\r\n                throw xmlerror(std::string(\"Element <\") + name + std::string(\"> closed with </\") +\r\n                               subelements.back().name + std::string(\">\"));\r\n            }\r\n        }\r\n    }\r\n    if (!complete) {\r\n        throw xmlerror(std::string(\"Unexpected end of element \") + name);\r\n    }\r\n    return true;\r\n}\r\n\r\nstd::ostream &operator<<(std::ostream &stream, const xmlelement &elem) {\r\n    stream << \"<\" << elem.name;\r\n    std::map<std::string, std::string>::const_iterator it;\r\n    for (it = elem.attributes.begin(); it != elem.attributes.end(); it++) {\r\n        stream << \" \" << it->first << \"=\\\"\" << it->second << \"\\\" \";\r\n    }\r\n    if (elem.subelements.size() == 0) {\r\n        stream << \" />\" << std::endl;\r\n    } else {\r\n        stream << \">\" << std::endl;\r\n        for (size_t i = 0; i < elem.subelements.size(); i++) {\r\n            stream << elem.subelements[i];\r\n        }\r\n        stream << \"</\" << elem.name << \">\" << std::endl;\r\n    }\r\n    return stream;\r\n}\r\n"
  },
  {
    "path": "genlib/xmlparse.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#ifndef __XMLPARSE_H__\r\n#define __XMLPARSE_H__\r\n\r\n#include <algorithm>\r\n#include <fstream>\r\n#include <map>\r\n#include <sstream>\r\n#include <string>\r\n#include <vector>\r\n\r\nstruct xmlelement {\r\n    std::string name;\r\n    bool closetag;\r\n    std::map<std::string, std::string> attributes;\r\n    std::vector<xmlelement> subelements;\r\n    xmlelement() { closetag = false; }\r\n    bool parse(std::ifstream &stream, bool parsesubelements = false);\r\n    friend std::ostream &operator<<(std::ostream &stream, const xmlelement &elem);\r\n\r\n  protected:\r\n    bool subparse(std::ifstream &stream);\r\n    void badcharacter(char c, const std::string &location);\r\n};\r\n\r\nstruct xmlerror {\r\n    std::string error;\r\n    xmlerror(const std::string &e = std::string()) { error = e; }\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "genlibTest/CMakeLists.txt",
    "content": "set(genlibtest genlibTest)\nset(genlibTest_SRCS\n    testreadwritehelpers.cpp\n    main.cpp\n    testsimplematrix.cpp\n    testbspnode.cpp\n    teststringutils.cpp\n    testcontainerutils.cpp)\n\nset(LINK_LIBS\n    genlib)\n\ninclude_directories(\"../ThirdParty/Catch\")\n\nadd_executable(${genlibtest} ${genlibTest_SRCS})\ntarget_link_libraries(${genlibtest} ${LINK_LIBS})\n    \n"
  },
  {
    "path": "genlibTest/main.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n"
  },
  {
    "path": "genlibTest/testbspnode.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"genlib/comm.h\"\n#include \"genlib/p2dpoly.h\"\n#include \"genlib/bsptree.h\"\n\nTEST_CASE(\"BSPTree::pickMidpointLine\")\n{\n    std::vector<TaggedLine> lines;\n    lines.push_back(TaggedLine(Line(Point2f(1, 2), Point2f(2, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(2, 2), Point2f(3, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(3, 2), Point2f(4, 2)), 0));\n\n    BSPNode node;\n\n    REQUIRE(BSPTree::pickMidpointLine(lines, 0) == 1);\n\n    SECTION(\"Additional lines\") {\n        lines.push_back(TaggedLine(Line(Point2f(4, 2), Point2f(5, 2)), 0));\n        REQUIRE(BSPTree::pickMidpointLine(lines, 0) == 1);\n\n        lines.push_back(TaggedLine(Line(Point2f(5, 1), Point2f(6, 1)), 0));\n        REQUIRE(BSPTree::pickMidpointLine(lines, 0) == 2);\n\n        // the only line with height > width becomes chosen\n        lines.push_back(TaggedLine(Line(Point2f(15, 4), Point2f(15, 0)), 0));\n        REQUIRE(BSPTree::pickMidpointLine(lines, 0) == 5);\n    }\n    SECTION(\"rotated middle\") {\n\n        // height > width, rotated, close to midpoint\n        lines.push_back(TaggedLine(Line(Point2f(4.5, 1), Point2f(4.5, 3)), 0));\n\n        lines.push_back(TaggedLine(Line(Point2f(5, 2), Point2f(6, 2)), 0));\n        lines.push_back(TaggedLine(Line(Point2f(6, 2), Point2f(7, 2)), 0));\n\n        // height > width, rotated, not close to midpoint\n        lines.push_back(TaggedLine(Line(Point2f(6.5, 1), Point2f(6.5, 3)), 0));\n\n        REQUIRE(BSPTree::pickMidpointLine(lines, 0) == 3);\n    }\n}\n\nvoid compareLines(Line l1, Line l2, float EPSILON) {\n    REQUIRE(l1.start().x == Approx(l2.start().x).epsilon(EPSILON));\n    REQUIRE(l1.start().y == Approx(l2.start().y).epsilon(EPSILON));\n    REQUIRE(l1.end().x == Approx(l2.end().x).epsilon(EPSILON));\n    REQUIRE(l1.end().y == Approx(l2.end().y).epsilon(EPSILON));\n}\n\nTEST_CASE(\"BSPTree::makeLines\")\n{\n    const float EPSILON = 0.001f;\n    typedef std::pair<std::vector<TaggedLine>, std::vector<TaggedLine> > TagLineVecPair;\n\n    std::vector<TaggedLine> lines;\n    lines.push_back(TaggedLine(Line(Point2f(1, 2), Point2f(2, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(2, 2), Point2f(3, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(3, 2), Point2f(4, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(4, 2), Point2f(5, 2)), 0));\n\n    std::unique_ptr<BSPNode> node(new BSPNode());\n\n    TagLineVecPair result = BSPTree::makeLines(0, 0, lines, node.get());\n\n    REQUIRE(result.first.size() == 3);\n    REQUIRE(result.second.size() == 0);\n\n    compareLines(result.first[0].line, lines[0].line, EPSILON);\n    compareLines(result.first[1].line, lines[2].line, EPSILON);\n    compareLines(result.first[2].line, lines[3].line, EPSILON);\n\n\n    SECTION(\"One on the right\")\n    {\n        lines.push_back(TaggedLine(Line(Point2f(5, 1), Point2f(6, 1)), 0));\n\n        result = BSPTree::makeLines(0, 0, lines, node.get());\n\n        REQUIRE(result.first.size() == 3);\n        REQUIRE(result.second.size() == 1);\n\n        compareLines(result.second[0].line, lines[4].line, EPSILON);\n    }\n    SECTION(\"One line with height > width becomes chosen\")\n    {\n        // height > width, rotated, not close to midpoint\n        lines.push_back(TaggedLine(Line(Point2f(5.5, 1), Point2f(5.5, 3)), 0));\n\n        lines.push_back(TaggedLine(Line(Point2f(6, 2), Point2f(7, 2)), 0));\n\n        result = BSPTree::makeLines(0, 0, lines, node.get());\n\n        REQUIRE(result.first.size() == 4);\n        REQUIRE(result.second.size() == 1);\n\n        compareLines(result.first[0].line, lines[0].line, EPSILON);\n        compareLines(result.first[1].line, lines[1].line, EPSILON);\n        compareLines(result.first[2].line, lines[2].line, EPSILON);\n        compareLines(result.first[3].line, lines[3].line, EPSILON);\n        compareLines(result.second[0].line, lines[5].line, EPSILON);\n    }\n\n    SECTION(\"One broken between\")\n    {\n        // height > width, rotated, close to midpoint\n        lines.push_back(TaggedLine(Line(Point2f(5.5, 1), Point2f(5.5, 3)), 0));\n\n        lines.push_back(TaggedLine(Line(Point2f(6, 2), Point2f(7, 2)), 0));\n        lines.push_back(TaggedLine(Line(Point2f(7, 2), Point2f(8, 2)), 0));\n        lines.push_back(TaggedLine(Line(Point2f(8, 2), Point2f(9, 2)), 0));\n        lines.push_back(TaggedLine(Line(Point2f(9, 2), Point2f(10, 2)), 0));\n\n        // line with two points at different sides of chosen\n        lines.push_back(TaggedLine(Line(Point2f(3, -2), Point2f(6, -2)), 0));\n\n        result = BSPTree::makeLines(0, 0, lines, node.get());\n\n        // adds one on each side\n        REQUIRE(result.first.size() == 5);\n        REQUIRE(result.second.size() == 5);\n\n        compareLines(result.first[0].line, lines[0].line, EPSILON);\n        compareLines(result.first[1].line, lines[1].line, EPSILON);\n        compareLines(result.first[2].line, lines[2].line, EPSILON);\n        compareLines(result.first[3].line, lines[3].line, EPSILON);\n\n        compareLines(result.second[0].line, lines[5].line, EPSILON);\n        compareLines(result.second[1].line, lines[6].line, EPSILON);\n        compareLines(result.second[2].line, lines[7].line, EPSILON);\n        compareLines(result.second[3].line, lines[8].line, EPSILON);\n\n        compareLines(result.first[4].line, Line(Point2f(3, -2), Point2f(5.5, -2)), EPSILON);\n        compareLines(result.second[4].line, Line(Point2f(5.5, -2), Point2f(6, -2)), EPSILON);\n    }\n}\n\nTEST_CASE(\"BSPTree::make (all horizontal lines)\", \"all-left tree\")\n{\n    const float EPSILON = 0.001f;\n\n    std::vector<TaggedLine> lines;\n    lines.push_back(TaggedLine(Line(Point2f(1, 2), Point2f(2, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(2, 2), Point2f(3, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(3, 2), Point2f(4, 2)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(4, 2), Point2f(5, 2)), 0));\n\n    std::unique_ptr<BSPNode> node(new BSPNode());\n\n    BSPTree::make(0, 0, lines, node.get());\n\n    compareLines(node->getLine(), lines[1].line, EPSILON);\n\n    REQUIRE(node->m_left != nullptr);\n    REQUIRE(node->m_right == nullptr);\n\n    compareLines(node->m_left->getLine(), lines[2].line, EPSILON);\n\n    REQUIRE(node->m_left->m_left != nullptr);\n    REQUIRE(node->m_left->m_right == nullptr);\n\n    compareLines(node->m_left->m_left->getLine(), lines[3].line, EPSILON);\n\n    REQUIRE(node->m_left->m_left->m_left != nullptr);\n    REQUIRE(node->m_left->m_left->m_right == nullptr);\n\n    compareLines(node->m_left->m_left->m_left->getLine(), lines[0].line, EPSILON);\n\n    REQUIRE(node->m_left->m_left->m_left->m_left == nullptr);\n    REQUIRE(node->m_left->m_left->m_left->m_right == nullptr);\n}\n\nTEST_CASE(\"BSPTree::make (all vertical lines)\", \"split tree\")\n{\n    const float EPSILON = 0.001f;\n\n    std::vector<TaggedLine> lines;\n    lines.push_back(TaggedLine(Line(Point2f(1.5, 1), Point2f(1.5, 3)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(2.5, 1), Point2f(2.5, 3)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(3.5, 1), Point2f(3.5, 3)), 0));\n    lines.push_back(TaggedLine(Line(Point2f(4.5, 1), Point2f(4.5, 3)), 0));\n\n    std::unique_ptr<BSPNode> node(new BSPNode());\n\n    BSPTree::make(0, 0, lines, node.get());\n\n    compareLines(node->getLine(), lines[1].line, EPSILON);\n\n    REQUIRE(node->m_left != nullptr);\n    REQUIRE(node->m_right != nullptr);\n\n    compareLines(node->m_left->getLine(), lines[0].line, EPSILON);\n    compareLines(node->m_right->getLine(), lines[3].line, EPSILON);\n\n    REQUIRE(node->m_left->m_left == nullptr);\n    REQUIRE(node->m_left->m_right == nullptr);\n\n    REQUIRE(node->m_right->m_left != nullptr);\n    REQUIRE(node->m_right->m_right == nullptr);\n\n    compareLines(node->m_right->m_left->getLine(), lines[2].line, EPSILON);\n\n    REQUIRE(node->m_right->m_left->m_left == nullptr);\n    REQUIRE(node->m_right->m_left->m_right == nullptr);\n}\n"
  },
  {
    "path": "genlibTest/testcontainerutils.cpp",
    "content": "// Copyright (C) 2018 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include <genlib/containerutils.h>\n#include <vector>\n\n\nTEST_CASE(\"Test binary search helper with container\", \"\"){\n    std::vector<int> testVec{ 1, 2, 4, 5};\n\n    REQUIRE(*depthmapX::findBinary(testVec, 2) == 2);\n    REQUIRE(depthmapX::findBinary(testVec, 3) == testVec.end());\n    REQUIRE(depthmapX::findBinary(testVec, 6) == testVec.end());\n    auto iter = depthmapX::findBinary(testVec, 2);\n    *iter = 3;\n    REQUIRE(*depthmapX::findBinary(testVec, 3) == 3);\n\n    const std::vector<int>& constVec = testVec;\n    REQUIRE(*depthmapX::findBinary(constVec, 3) == 3);\n    REQUIRE(depthmapX::findBinary(constVec, 2) == testVec.end());\n    REQUIRE(depthmapX::findBinary(constVec, 6) == testVec.end());\n}\n"
  },
  {
    "path": "genlibTest/testreadwritehelpers.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n\n#include \"cliTest/selfcleaningfile.h\"\n\n#include \"genlib/readwritehelpers.h\"\n#include \"genlib/containerutils.h\"\n\n#include <fstream>\n\nTEST_CASE(\"vector reading and writing\")\n{\n    using namespace dXreadwrite;\n    std::vector<int> intVec{1, 5, 34, -2, 5};\n    SelfCleaningFile intFile(\"integers.bin\");\n    {\n        std::ofstream outfile(intFile.Filename());\n        writeVector(outfile, intVec);\n    }\n\n    {\n        std::ifstream infile(intFile.Filename());\n        auto copy = readVector<int>(infile);\n        REQUIRE(copy == intVec);\n    }\n\n    std::vector<int> intCopy;\n    {\n        std::ifstream infile(intFile.Filename());\n        readIntoVector(infile, intCopy);\n    }\n    REQUIRE(intCopy == intVec);\n\n}\n\nTEST_CASE(\"map reading and writing\")\n{\n    using namespace dXreadwrite;\n    std::map<int, float> intFloatMap;\n    intFloatMap.insert(std::make_pair(1,0.1f));\n    intFloatMap.insert(std::make_pair(5,5000.0f));\n    intFloatMap.insert(std::make_pair(34,-3.4f));\n    intFloatMap.insert(std::make_pair(-2,0.2f));\n    intFloatMap.insert(std::make_pair(6,0.6f));\n    SelfCleaningFile intFloatFile(\"intFloatMap.bin\");\n    {\n        std::ofstream outfile(intFloatFile.Filename());\n        writeMap(outfile, intFloatMap);\n    }\n\n    {\n        std::ifstream infile(intFloatFile.Filename());\n        auto copy = readMap<int, float>(infile);\n        REQUIRE(copy == intFloatMap);\n    }\n\n    std::map<int, float> intCopy;\n    {\n        std::ifstream infile(intFloatFile.Filename());\n        readIntoMap(infile, intCopy);\n    }\n    REQUIRE(intCopy == intFloatMap);\n\n}\n"
  },
  {
    "path": "genlibTest/testsimplematrix.cpp",
    "content": "// Copyright (C) 2018 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../genlib/simplematrix.h\"\n#include <vector>\n#include <algorithm>\n\ntemplate<typename T> void compareMatrixContent( depthmapX::BaseMatrix<T> const & matrix, std::vector<T> const & expected ){\n    REQUIRE(matrix.size() == expected.size());\n    std::vector<T> result(matrix.size());\n    std::copy(matrix.begin(), matrix.end(), result.begin());\n    REQUIRE(result == expected);\n}\n\nTEST_CASE(\"Row matrix test assignemnt copy and move\"){\n   depthmapX::RowMatrix<std::string> matrix(2,3);\n   matrix(0,0) = \"0,0\";\n   matrix(1,0) = \"1,0\";\n   matrix(0,1) = \"0,1\";\n   matrix(1,1) = \"1,1\";\n   matrix(1,2) = \"1,2\";\n   matrix(0,2) = \"0,2\";\n\n   std::vector<std::string> expected{\"0,0\", \"0,1\", \"0,2\", \"1,0\", \"1,1\", \"1,2\"};\n   compareMatrixContent(matrix, expected);\n\n   depthmapX::RowMatrix<std::string> copy(matrix);\n   compareMatrixContent(matrix, expected);\n   compareMatrixContent(copy, expected);\n\n   depthmapX::RowMatrix<std::string> clone(std::move(copy));\n   compareMatrixContent(clone, expected);\n   REQUIRE(copy.size() == 0);\n\n   copy = clone;\n   compareMatrixContent(copy, expected);\n   REQUIRE(copy.columns() == 3);\n   REQUIRE(copy.rows() == 2);\n   compareMatrixContent(clone, expected);\n\n   depthmapX::RowMatrix<std::string> assignMove(1,1);\n   assignMove = std::move(copy);\n   compareMatrixContent(assignMove, expected);\n   REQUIRE(copy.size() == 0);\n}\n\nTEST_CASE(\"Row matrix test exceptions\"){\n    depthmapX::RowMatrix<int> matrix(2, 3);\n    matrix(0,0) = 1;\n    matrix(1,2) = -1;\n    matrix(0,1) = 2;\n    matrix(0,2) = 3;\n    matrix(1,0) = -23;\n    matrix(1,1) = 0;\n\n    REQUIRE(matrix(1,2) == -1);\n\n    compareMatrixContent(matrix, std::vector<int>{1, 2, 3, -23, 0, -1});\n\n    REQUIRE_THROWS_WITH(matrix(5, 0), Catch::Contains(\"row out of range\"));\n    REQUIRE_THROWS_WITH(matrix(0, 5), Catch::Contains(\"column out of range\"));\n}\n\nTEST_CASE(\"Column matrix test assignemnt copy and move\"){\n   depthmapX::ColumnMatrix<std::string> matrix(2,3);\n   matrix(0,0) = \"0,0\";\n   matrix(1,0) = \"1,0\";\n   matrix(0,1) = \"0,1\";\n   matrix(1,1) = \"1,1\";\n   matrix(1,2) = \"1,2\";\n   matrix(0,2) = \"0,2\";\n\n   std::vector<std::string> expected{\"0,0\", \"1,0\", \"0,1\", \"1,1\", \"0,2\", \"1,2\"};\n   compareMatrixContent(matrix, expected);\n\n   depthmapX::ColumnMatrix<std::string> copy(matrix);\n   compareMatrixContent(matrix, expected);\n   compareMatrixContent(copy, expected);\n\n   depthmapX::ColumnMatrix<std::string> clone(std::move(copy));\n   compareMatrixContent(clone, expected);\n   REQUIRE(copy.size() == 0);\n\n   copy = clone;\n   compareMatrixContent(copy, expected);\n   REQUIRE(copy.columns() == 3);\n   REQUIRE(copy.rows() == 2);\n   compareMatrixContent(clone, expected);\n\n   depthmapX::ColumnMatrix<std::string> assignMove(1,1);\n   assignMove = std::move(copy);\n   compareMatrixContent(assignMove, expected);\n   REQUIRE(copy.size() == 0);\n\n}\n\nTEST_CASE(\"Column matrix test exceptions\"){\n    depthmapX::ColumnMatrix<int> matrix(2, 3);\n    matrix(0,0) = 1;\n    matrix(1,2) = -1;\n    matrix(0,1) = 2;\n    matrix(0,2) = 3;\n    matrix(1,0) = -23;\n    matrix(1,1) = 0;\n\n    REQUIRE(matrix(1,2) == -1);\n\n    compareMatrixContent(matrix, std::vector<int>{1, -23, 2, 0, 3, -1});\n\n    REQUIRE_THROWS_WITH(matrix(5, 0), Catch::Contains(\"row out of range\"));\n    REQUIRE_THROWS_WITH(matrix(0, 5), Catch::Contains(\"column out of range\"));\n}\n\nTEST_CASE(\"Fill and reset\"){\n    depthmapX::ColumnMatrix<int> matrix(2,3);\n    matrix.initialiseValues(-42);\n    compareMatrixContent(matrix, std::vector<int>(6, -42));\n\n    matrix.reset(3,4);\n    REQUIRE(matrix.rows() == 3);\n    REQUIRE(matrix.columns() == 4);\n\n    matrix.initialiseValues(12);\n    compareMatrixContent(matrix, std::vector<int>(12, 12));\n}\n"
  },
  {
    "path": "genlibTest/teststringutils.cpp",
    "content": "// Copyright (C) 2017-2018 Christian Sailer\n// Copyright (C) 2017-2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../genlib/stringutils.h\"\n#include \"../cliTest/selfcleaningfile.h\"\n#include <fstream>\n\nTEST_CASE(\"Tests for split function\", \"\")\n{\n    {\n        std::vector<std::string> stringParts = dXstring::split(\"foo,bar\",',');\n        REQUIRE(stringParts.size() == 2);\n        REQUIRE(stringParts[0] == \"foo\");\n        REQUIRE(stringParts[1] == \"bar\");\n    }\n\n    {\n        std::vector<std::string> stringParts = dXstring::split(\"0.5,1.2\",',');\n        REQUIRE(stringParts.size() == 2);\n        REQUIRE(stringParts[0] == \"0.5\");\n        REQUIRE(stringParts[1] == \"1.2\");\n    }\n\n    {\n        std::vector<std::string> stringParts = dXstring::split(\"0.5\\t1.2\",'\\t');\n        REQUIRE(stringParts.size() == 2);\n        REQUIRE(stringParts[0] == \"0.5\");\n        REQUIRE(stringParts[1] == \"1.2\");\n    }\n\n    {\n        std::vector<std::string> stringParts = dXstring::split(\"0.5\\t1.2\\tfoo\",'\\t');\n        REQUIRE(stringParts.size() == 3);\n        REQUIRE(stringParts[0] == \"0.5\");\n        REQUIRE(stringParts[1] == \"1.2\");\n        REQUIRE(stringParts[2] == \"foo\");\n    }\n\n    {\n        // skip last blank element\n        std::vector<std::string> stringParts = dXstring::split(\"foo,bar,\",',');\n        REQUIRE(stringParts.size() == 2);\n    }\n\n    {\n        // do not skip middle blank element\n        std::vector<std::string> stringParts = dXstring::split(\"foo,,bar\",',');\n        REQUIRE(stringParts.size() == 3);\n    }\n\n    {\n        // do skip any empty elements when flag is set\n        // do not skip middle blank element\n        std::vector<std::string> stringParts = dXstring::split(\"foo,,bar\",',', true);\n        REQUIRE(stringParts.size() == 2);\n    }\n}\n\nTEST_CASE(\"Read String\")\n{\n    {\n        // case empty string - just read 0 length and return new string object\n        SelfCleaningFile f(\"test.bin\");\n        {\n            std::ofstream fs(f.Filename());\n            unsigned int length = 0;\n            fs.write(reinterpret_cast<char *>(&length), sizeof(unsigned int));\n        }\n        std::ifstream fs(f.Filename());\n        auto result = dXstring::readString(fs);\n        REQUIRE(result.empty());\n    }\n\n    // case non empty string - read length and then beam data into the string\n    {\n        SelfCleaningFile f(\"test.bin\");\n        {\n            std::ofstream fs(f.Filename());\n            unsigned int length = 5;\n            const char *payload = \"abcde\";\n            fs.write(reinterpret_cast<char *>(&length), sizeof(unsigned int));\n            fs.write(payload, 5);\n        }\n        std::ifstream fs(f.Filename());\n        std::string result = dXstring::readString(fs);\n        REQUIRE(result == \"abcde\");\n    }\n}\n\nTEST_CASE(\"Write String\")\n{\n    {\n        // case empty string - just write 0 length\n        std::string testString;\n        SelfCleaningFile f(\"test.bin\");\n        {\n            std::ofstream fs(f.Filename());\n            dXstring::writeString(fs, testString);\n        }\n        std::ifstream fs(f.Filename());\n        unsigned int length;\n        fs.read(reinterpret_cast<char *>(&length), sizeof(unsigned int));\n        REQUIRE(length == 0);\n        char dummy[1];\n        REQUIRE_FALSE(fs.read(dummy, 1));\n        REQUIRE(fs.eof());\n    }\n\n    {\n        // case non empty string - just write length plus content\n        std::string testString(\"cdfe\");\n        SelfCleaningFile f(\"test.bin\");\n        {\n            std::ofstream fs(f.Filename());\n            dXstring::writeString(fs, testString);\n        }\n        std::ifstream fs(f.Filename());\n        unsigned int length;\n        fs.read(reinterpret_cast<char *>(&length), sizeof(unsigned int));\n        REQUIRE(length == testString.length());\n        char buffer[5];\n        buffer[4] = '\\0';\n        fs.read(buffer, length);\n        REQUIRE(testString == buffer);\n        char dummy[1];\n        REQUIRE_FALSE(fs.read(dummy, 1));\n        REQUIRE(fs.eof());\n    }\n}\n\n\nTEST_CASE(\"test string format\")\n{\n    REQUIRE(dXstring::formatString(1.0, \"foo\") == \"foo\");\n    REQUIRE(dXstring::formatString(1.0, \"%+.16le\") == \"+1.0000000000000000e+00\");\n    REQUIRE(dXstring::formatString(1.0) == \"+1.0000000000000000e+00\");\n    REQUIRE(dXstring::formatString(1.0, \"%+.8le\") == \"+1.00000000e+00\");\n    REQUIRE(dXstring::formatString(1 ) == \"               1\");\n}\n\nTEST_CASE(\"test tolower\")\n{\n    std::string tstr = \"AbdUgs24*hHÜ\";\n    auto result = dXstring::toLower(tstr);\n    REQUIRE(tstr == \"abdugs24*hhÜ\");\n    REQUIRE(result == \"abdugs24*hhÜ\");\n}\n\nTEST_CASE(\"test ltrim\")\n{\n    std::string normal = \"   fo o \";\n    dXstring::ltrim(normal);\n    REQUIRE( normal == \"fo o \");\n    std::string empty = \"\";\n    dXstring::ltrim(empty);\n    REQUIRE( empty == \"\" );\n    std::string justBlanks = \"   \";\n    dXstring::ltrim(justBlanks);\n    REQUIRE( justBlanks == \"\");\n    std::string noBlanks = \"foo \";\n    dXstring::ltrim(noBlanks);\n    REQUIRE(noBlanks == \"foo \");\n}\n\nTEST_CASE(\"test rtrim\")\n{\n    std::string normal = \"   fo o \";\n    dXstring::rtrim(normal);\n    REQUIRE( normal == \"   fo o\");\n    std::string empty = \"\";\n    dXstring::rtrim(empty);\n    REQUIRE( empty == \"\" );\n    std::string justBlanks = \"   \";\n    dXstring::rtrim(justBlanks);\n    REQUIRE( justBlanks == \"\");\n    std::string noBlanks = \"foo \";\n    dXstring::rtrim(noBlanks);\n    REQUIRE(noBlanks == \"foo\");\n}\n\nTEST_CASE(\"test makeInitCaps\")\n{\n    std::string tstr = \"abC DEf dEf \\\"fOO Bar\\\" blah bLuB\";\n    dXstring::makeInitCaps(tstr);\n    REQUIRE(tstr == \"Abc Def Def \\\"fOO Bar\\\" Blah Blub\");\n}\n\nTEST_CASE(\"test isDouble\")\n{\n    REQUIRE(dXstring::isDouble(\"0\"));\n    REQUIRE(dXstring::isDouble(\" 1.345e23.1\"));\n    REQUIRE_FALSE(dXstring::isDouble(\"\"));\n    REQUIRE_FALSE(dXstring::isDouble(\"foo1234\"));\n}\n\nTEST_CASE(\"test begins with\")\n{\n    REQUIRE(dXstring::beginsWith<std::string>(\"abcd\", \"abcd\"));\n    REQUIRE(dXstring::beginsWith<std::string>(\"abcde\", \"abcd\"));\n    REQUIRE_FALSE(dXstring::beginsWith<std::string>(\"abcd\", \"abcde\"));\n    REQUIRE_FALSE(dXstring::beginsWith<std::string>(\"abcd\", \"ef\"));\n    REQUIRE_FALSE(dXstring::beginsWith<std::string>(\"abcd\", \"aec\"));\n}\n\nTEST_CASE(\"test safeGetline\")\n{\n    std::stringstream stream;\n    std::string out;\n\n    SECTION(\"Windows\") { stream << \"Test\\r\"; }\n    SECTION(\"Unix\") { stream << \"Test\\n\"; }\n    SECTION(\"Mixed\") { stream << \"Test\\r\\n\"; }\n\n    dXstring::safeGetline(stream, out);\n    REQUIRE(out == \"Test\");\n}\n"
  },
  {
    "path": "mgraph440/CMakeLists.txt",
    "content": "set(mgraph440 mgraph440)\nset(mgraph440_SRCS\n    pafcolor.cpp\n    attr.cpp\n    ngraph.cpp\n    datalayer.cpp\n    pointmap.cpp\n    attributes.cpp\n    connector.cpp\n    mgraph.cpp\n    axialmap.cpp\n    shapemap.cpp\n    pixelbase.cpp\n    spacepix.cpp\n    point.cpp\n    stringutils.cpp\n    p2dpoly.cpp\n    salaprogram.cpp\n    pafmath.cpp)\n\nif (\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"GNU\" OR\n    \"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n    set(warnings \"-Wnone\")\nelseif (\"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"MSVC\")\n    set(warnings \"/W0 /EHsc /wd4800\")\nendif() \n\nadd_compile_definitions(MGRAPH440_LIBRARY)\n\nadd_library(${mgraph440} ${mgraph440_SRCS})\n"
  },
  {
    "path": "mgraph440/attr.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// This is my code to make a set of axial lines from a set of boundary lines\n\n#include \"mgraph440/attr.h\"\n\n#include <math.h>\n#include <float.h> // _finite support\n\n//////////////////////////////////////////////////////////////////////////////\n\nnamespace mgraph440 {\n\nvoid AttrHeader::reset(AttrVal attributes[])\n{\n   attributes[NEIGHBOURHOOD_SIZE].intval = -1;\n   attributes[GRAPH_SIZE].intval = -1;\n   attributes[KERNEL_SIZE].intval = -1;\n   attributes[CLIQUE_SIZE].intval = -1;\n   attributes[TOTAL_DEPTH].intval = -1;\n   attributes[ENTROPY].floatval = -1.0f;\n   attributes[REL_ENTROPY].floatval = -1.0f;\n   attributes[CLUSTER].floatval = -1.0f;\n   attributes[UNUSED].floatval = -1.0f;\n   attributes[POINT_DEPTH].intval = -1;\n   attributes[CONTROL_HILL].floatval = -1.0f;\n   attributes[CONTROL_TURN].floatval = -1.0f;\n   attributes[MEDIAN_ANGLE].floatval = -1.0f;\n   attributes[FAR_NODE].intval = -1;\n   attributes[FAR_DIST].floatval = -1.0f;\n   attributes[TOTAL_DIST].floatval = -1.0f;\n   attributes[AGENT_COUNT].intval = -1;\n   attributes[AGENT_COLL_COUNT].intval = -1;\n   attributes[TOTAL_METRIC_DEPTH].floatval = -1.0f;\n   attributes[METRIC_GRAPH_SIZE].intval = -1;\n   attributes[METRIC_POINT_DEPTH].floatval = -1.0f;\n   attributes[TOTAL_EUCLID_DIST].floatval = -1.0f;\n   attributes[POINT_EUCLID_DIST].floatval = -1.0f;\n   attributes[TOTAL_METRIC_ANGLE].floatval = -1.0f;\n   attributes[METRIC_POINT_ANGLE].floatval = -1.0f;\n}\n\n#define QUICK_MD (double(attributes[TOTAL_DEPTH].intval) / double(attributes[GRAPH_SIZE].intval - 1))\n#define QUICK_METRIC_MD (double(attributes[TOTAL_METRIC_DEPTH].floatval) / double(attributes[METRIC_GRAPH_SIZE].intval - 1))\n#define QUICK_METRIC_AMD (double(attributes[TOTAL_METRIC_ANGLE].floatval) / double(attributes[METRIC_GRAPH_SIZE].intval - 1))\n\ndouble AttrHeader::getAttr(int attr, const AttrVal attributes[]) const\n{\n   double val;\n   // will eventually put the attributes in a table\n   switch (attr) {\n   case NEIGHBOURHOOD_SIZE:\n      val = double(attributes[NEIGHBOURHOOD_SIZE].intval);\n      break;\n   case GRAPH_SIZE:\n      val = double(attributes[GRAPH_SIZE].intval);\n      break;\n   case MEAN_DEPTH:\n      if (attributes[GRAPH_SIZE].intval > 1) {\n         val = QUICK_MD;\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case INTEGRATION_RA:\n      if (attributes[GRAPH_SIZE].intval > 2) {\n         val = 2.0 * (QUICK_MD - 1.0) / double(attributes[GRAPH_SIZE].intval - 2);\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case INTEGRATION_RRA:\n      if (attributes[GRAPH_SIZE].intval > 2) {\n         val = (2.0 * (QUICK_MD - 1.0)) / (double(attributes[GRAPH_SIZE].intval - 2) * dvalue(attributes[GRAPH_SIZE].intval));\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case INTEGRATION_HILL:\n      if (attributes[GRAPH_SIZE].intval > 2 && attributes[TOTAL_DEPTH].intval > attributes[GRAPH_SIZE].intval) {\n         val = (double(attributes[GRAPH_SIZE].intval - 2) * dvalue(attributes[GRAPH_SIZE].intval)) / (2.0 * (QUICK_MD - 1.0));\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case INTEGRATION_TEKL:\n      if (attributes[GRAPH_SIZE].intval > 2 && attributes[TOTAL_DEPTH].intval > attributes[GRAPH_SIZE].intval) {\n         val = ln(double(attributes[GRAPH_SIZE].intval - 2)/2.0) /\n               ln(double(attributes[TOTAL_DEPTH].intval - attributes[GRAPH_SIZE].intval + 1));\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case POINT_DEPTH:\n      val = attributes[POINT_DEPTH].intval;\n      break;\n   case AVG_DIST:\n      if (attributes[NEIGHBOURHOOD_SIZE].intval > 0) {\n         val = attributes[TOTAL_DIST].floatval / double(attributes[NEIGHBOURHOOD_SIZE].intval);\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case AGENT_COUNT:\n      val = attributes[attr].intval;\n      break;\n   case AGENT_COLL_COUNT:\n      val = attributes[attr].intval;\n      break;\n   case METRIC_MEAN_DEPTH:\n      if (attributes[METRIC_GRAPH_SIZE].intval > 1) {\n         val = QUICK_METRIC_MD;\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case METRIC_MEAN_ANGLE:\n      if (attributes[METRIC_GRAPH_SIZE].intval > 1) {\n         val = QUICK_METRIC_AMD;\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case DECENTRAL_INTEG:\n      if (attributes[TOTAL_METRIC_DEPTH].floatval >= 0.0 && attributes[TOTAL_DEPTH].intval > 0) {\n         val = ln(attributes[TOTAL_METRIC_DEPTH].floatval+1.0) / double(attributes[TOTAL_DEPTH].intval);\n      }\n      else {\n         val = -1.0;\n      }\n      break;\n   case MEAN_PENN_DIST:\n      if (attributes[METRIC_GRAPH_SIZE].intval > 1) {\n         if (attributes[TOTAL_METRIC_DEPTH].floatval > attributes[TOTAL_EUCLID_DIST].floatval) {\n            val = double(attributes[TOTAL_METRIC_DEPTH].floatval - attributes[TOTAL_EUCLID_DIST].floatval)\n                  / double(attributes[METRIC_GRAPH_SIZE].intval);\n         }\n         else {\n            val = 0.0f;\n         }\n      }\n      else {\n         val = -1.0f;\n      }\n      break;\n   case POINT_PENN_DIST:\n      if (attributes[METRIC_POINT_DEPTH].floatval >= 0.0) {\n         if (attributes[METRIC_POINT_DEPTH].floatval > attributes[POINT_EUCLID_DIST].floatval) {\n            val = attributes[METRIC_POINT_DEPTH].floatval - attributes[POINT_EUCLID_DIST].floatval;\n         }\n         else {\n            val = 0.0f;\n         }\n      }\n      else {\n         val = -1.0f;\n      }\n      break;\n   default:\n      val = attributes[attr].floatval;\n      break;\n   }\n   return val;\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n\nAttrBody::AttrBody( std::streampos p, const AttrHeader& h )\n{\n   pos = p;\n   ref = -1;\n   header = (AttrHeader *) &h;\n\n   color = 0.5;\n   highlight = false;\n   myagent = NULL;\n\n   attributes = new AttrVal[header->m_attr_count];\n\n   header->reset(attributes);\n}\n\nAttrBody::AttrBody(const AttrBody& attr)\n{\n   pos = attr.pos;\n   ref = attr.ref;\n   origin = attr.origin;\n   header = attr.header;\n\n   color = attr.color;\n   highlight = attr.highlight;\n   myagent = attr.myagent;\n\n   if (attr.attributes) {\n      attributes = new AttrVal[header->m_attr_count];\n      // fill in with original attributes:\n      for (int i = 0; i < header->m_attr_count; i++) {\n         attributes[i] = attr.attributes[i];\n      }\n   }\n}\n\nAttrBody::~AttrBody()\n{\n   if (attributes) {\n      delete [] attributes;\n      attributes = NULL;\n   }\n}\n\nstd::ostream& operator << (std::ostream& stream, const AttrBody& attr)\n{\n   stream << attr.ref << \"\\t\";\n   stream << attr.origin.x << \"\\t\" << attr.origin.y << \"\\t\" << attr.origin.z;\n\n   for (int i = 0; i < NUM_SUMMARISABLE_ATTRIBUTES; i++) {\n      if (g_attr_summary_map[i].usable()) {\n         if (g_attr_summary_map[i].intval()) {\n            stream << \"\\t\" << attr.attributes[g_attr_summary_map[i].ref].intval;\n         }\n         else {\n            stream << \"\\t\" << attr.attributes[g_attr_summary_map[i].ref].floatval;\n         }\n      }\n   }\n\n   return stream;\n}\n\nvoid AttrBody::write( std::ostream& stream ) const\n{\n   stream.write( (char *) &pos, sizeof(pos) );\n   stream.write( (char *) &ref, sizeof(ref) );\n   stream.write( (char *) &origin, sizeof(origin) );\n   if (attributes) {\n      stream.write( (char *) attributes, sizeof(AttrVal) * (header->m_attr_count) );\n   }\n}\n\nvoid AttrBody::read( std::ifstream& stream, int attr_count )\n{\n   stream.read( (char *) &pos, sizeof(pos) );\n   stream.read( (char *) &ref, sizeof(ref) );\n   stream.read( (char *) &origin, sizeof(origin) );\n   if (attributes) {\n      stream.read( (char *) attributes, sizeof(AttrVal) * attr_count );\n   }\n}\n\n///////////////////////////////////////////////////////////////////////////////////\n\nbool ArVertexList::openwrite( int nodes )\n{\n#ifdef _WIN32\n   m_stream = new std::fstream( m_filename.c_str(), std::ios::binary | std::ios::out | std::ios::trunc );\n#else\n   m_stream = new std::fstream( m_filename.c_str(), std::ios::out | std::ios::trunc );\n#endif\n\n   if (m_stream->fail()) {\n      if (m_stream->rdbuf()->is_open()) {\n         remove();\n      }\n      if (m_stream) {\n         delete m_stream;\n         m_stream = NULL;\n      }\n      return false;\n   }\n\n   m_stream->write( \"grf\", 3 );\n   int version = METAGRAPH_VERSION;\n   m_stream->write( (char *) &version, sizeof(int) );\n   m_stream->write( \"v\", 1 ); // <- signifies virtual memory section\n   m_stream->write( (char *) &nodes, sizeof(nodes) );\n\n   return true;\n}\n\nvoid ArVertexList::openread()\n{\n#ifdef _WIN32\n   m_stream = new std::fstream( m_filename.c_str(), std::ios::binary | std::ios::in );\n#else\n   m_stream = new std::fstream( m_filename.c_str(), std::ios::in );\n#endif\n}\n\nvoid ArVertexList::close()\n{\n   if (m_stream) {\n      if (m_stream->rdbuf()->is_open()) {\n         m_stream->close();\n      }\n      delete m_stream; m_stream = NULL;\n   }\n}\n\nvoid ArVertexList::remove()\n{\n   close();\n   if (!m_filename.empty()) {\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      _unlink(m_filename.c_str());\n#else\n      unlink(m_filename.c_str());\n#endif\n      m_filename = \"\";\n   }\n}\n\nvoid ArVertexList::add( int ref, const ArVertex& node )\n{\n   m_cache_ref = ref;\n   m_cache_data = node;\n}\n\nvoid ArVertexList::commit()                     // Copy\n{\n   if (m_cache_ref != -1) {\n      std::streampos pos = m_stream->tellp();\n      m_attributes[m_cache_ref].pos = pos;\n      m_cache_data.write( (std::ofstream&) *m_stream );\n      m_cache_data.clear();\n      m_stream->flush();\n   }\n   m_cache_ref = -1;\n}\n\nvoid ArVertexList::commit(const Point2f& p, int far_node, float far_dist, float total_dist) // Add\n{\n   if (m_cache_ref != -1) {\n      std::streampos pos = m_stream->tellp();\n      AttrBody attr(pos, m_attr_header);\n      {\n         // a few values we know\n         attr.ref = m_cache_ref;\n         attr.origin.x = p.x;\n         attr.origin.y = p.y;\n         attr.intval(AttrHeader::NEIGHBOURHOOD_SIZE) = m_cache_data.size();\n         attr.intval(AttrHeader::FAR_NODE) = far_node;\n         attr.floatval(AttrHeader::FAR_DIST) = far_dist;\n         attr.floatval(AttrHeader::TOTAL_DIST) = total_dist;\n      }\n      m_attributes.push_back( attr );\n      m_cache_data.write( (std::ofstream&) *m_stream );\n      m_cache_data.clear();\n      m_stream->flush();\n   }\n   m_cache_ref = -1;\n}\n\n\n// NOTE: ONLY READ AND WRITE ATTRIBUTES!\n// (At the moment, complex virtual mem stuff is handled at the meta graph level)\n\nbool ArVertexList::read( std::ifstream& stream, int metagraph_version )\n{\n   m_metagraph_version = metagraph_version;\n\n   int attr_count;\n   stream.read( (char *) &m_which_attributes, sizeof(m_which_attributes) );\n   stream.read( (char *) &attr_count, sizeof(int) );\n\n   int size;\n   stream.read( (char *) &size, sizeof(int) );\n\n   m_attributes.clear();\n   for (int i = 0; i < size; i++) {\n      AttrBody attr(-1, m_attr_header);\n      attr.read(stream, attr_count);   // <- only write in saved attributes\n      m_attributes.push_back( attr );\n   }\n\n   m_cache_ref = -1; // just in case... should really set this with virtual mem stuff...\n\n   return true;\n}\n\nbool ArVertexList::write( std::ostream& stream )\n{\n   stream.write( (char *) &m_which_attributes, sizeof(m_which_attributes) );\n   // I'm phasing this out again for now (attribute header),\n   // I'm thinking the map should really be stored rather than the header,\n   // in any case, the only important think about the header is the number of\n   // attributes...\n   stream.write( (char *) &m_attr_header.m_attr_count, sizeof(int) );\n\n   int size = m_attributes.size();\n   stream.write( (char *) &size, sizeof(int) );\n\n   for (size_t i = 0; i < m_attributes.size(); i++) {\n      m_attributes[i].write( stream );\n   }\n\n   return true;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/attr.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n// Modifed by Dream\n#if defined(_MSC_VER)\n#include <io.h>\n#else\n#include <unistd.h>\n#endif\n#include <fstream>\n\n#include \"mgraph440/paftl.h\"\n#include \"mgraph440/p2dpoly.h\"\n#include \"mgraph440/mgraph_consts.h\"\n\nnamespace mgraph440 {\n\n// Pretty much all of this is now deprecated...\n// the attrs will be replaced by the easier to use AttributeTables in the future...\n\n// ...and so it now is:\n\nunion AttrVal {\n   int   intval;\n   float floatval;\n};\n\nconst int NUM_PHYSICAL_ATTRIBUTES = 25;     // 25 physical attributes: see below\n\n// Note: also see AttrMap at bottom of file.\n\n// THIS ENTIRE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\nstruct AttrHeader {\n   enum { NEIGHBOURHOOD_SIZE =   0,\n          GRAPH_SIZE         =   1,\n          KERNEL_SIZE        =   2,\n          CLIQUE_SIZE        =   3,\n          TOTAL_DEPTH        =   4,\n          MEAN_DEPTH         = 101,\n          INTEGRATION_RA     = 102,\n          INTEGRATION_RRA    = 103,\n          INTEGRATION_HILL   = 104,\n          INTEGRATION_TEKL   = 105,\n          ENTROPY            =   5,\n          REL_ENTROPY        =   6,\n          CLUSTER            =   7,\n          UNUSED             =   8,\n          POINT_DEPTH        =   9,\n          CONTROL_HILL       =  10,\n          CONTROL_TURN       =  11,\n          MEDIAN_ANGLE       =  12,\n          FAR_NODE           =  13, // not output in text file\n          FAR_DIST           =  14,\n          AGENT_COUNT        =  15,\n          AGENT_COLL_COUNT   =  16, // collisions\n          TOTAL_DIST         =  17,\n          AVG_DIST           = 107, // derived\n          TOTAL_METRIC_DEPTH =  18,\n          METRIC_GRAPH_SIZE  =  19,\n          METRIC_MEAN_DEPTH  = 108, // derived\n          DECENTRAL_INTEG    = 109, // derived\n          METRIC_POINT_DEPTH =  20,\n          TOTAL_EUCLID_DIST  =  21,\n          POINT_EUCLID_DIST  =  22,\n          MEAN_PENN_DIST     = 110, // derived\n          POINT_PENN_DIST    = 111, // derived\n          TOTAL_METRIC_ANGLE =  23,\n          METRIC_POINT_ANGLE =  24,\n          METRIC_MEAN_ANGLE  = 112  // derived\n   };\n\n   int   m_attr_count;      // number of attributes: for storage\n\n   AttrHeader(int n = NUM_PHYSICAL_ATTRIBUTES)\n      { m_attr_count = n; }\n   void reset(AttrVal attributes[]);\n   double getAttr(int attr, const AttrVal attributes[]) const;\n};\n\nconst AttrHeader g_attr_header;\n\nclass PafAgent;\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\nstruct AttrBody {\n   //\n   // stored values\n   int         pos;\n   int         ref;\n   Point3f     origin;        // storing origin unnecessary, may revise later\n   AttrHeader *header;\n   AttrVal    *attributes;\n   // colour and highlight are not stored\n   float       color;\n   bool        highlight;\n   //\n   // you can have agents *in* the graph too (helps with looking them up!)\n   PafAgent   *myagent;\n   //\n   AttrBody(std::streampos p = -1, const AttrHeader& h = AttrHeader() );\n   AttrBody(const AttrBody& attr);\n   ~AttrBody();\n   void reset();\n   //\n   double getAttr(int attr) const\n      { return header->getAttr(attr, attributes); }\n   //\n   void write(std::ostream &stream ) const;\n   void read(  std::ifstream& stream, int attr_count );\n   //\n   // Save a bit of memory, use integer / floating as appropriate\n   int& intval(int i)\n      { return attributes[i].intval; }\n   float& floatval(int i)\n      { return attributes[i].floatval; }\n   //\n   friend std::ostream& operator << (std::ostream& stream, const AttrBody& attr);\n   //\n   friend bool operator == (const AttrBody& a, const AttrBody& b);\n   friend bool operator != (const AttrBody& a, const AttrBody& b);\n   friend bool operator < (const AttrBody& a, const AttrBody& b);\n   friend bool operator > (const AttrBody& a, const AttrBody& b);\n};\n\n// These allow an order list of attributes (used by the conversion routine)\ninline bool operator == (const AttrBody& a, const AttrBody& b)\n{\n   return a.ref == b.ref;\n}\ninline bool operator != (const AttrBody& a, const AttrBody& b)\n{\n   return a.ref != b.ref;\n}\ninline bool operator > (const AttrBody& a, const AttrBody& b)\n{\n   return a.ref > b.ref;\n}\ninline bool operator < (const AttrBody& a, const AttrBody& b)\n{\n   return a.ref < b.ref;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// a graph vertex\n\n/*\nclass GraphVertex {\n   friend class ArVertexList;\nprotected:\n   pvecint m_connections;\npublic:\n   GraphVertex()\n   {}\n   ~GraphVertex()\n   {}\npublic:\n   pvecint& get_connections() {\n      return m_connections;\n   }\n   int count_connections() {\n      return m_connections.size();\n   }\n   int& operator [] (int index) {\n      return m_connections[index];\n   }\n   void add_connection(int index) {\n#ifdef _DEBUG\n      if (m_connections.findindex(index) != paftl::npos) {\n         cerr << \"oops\" << endl;\n      }\n#endif\n      m_connections.push_back(index);\n   }\n};\n*/\n\n///////////////////////////////////////////////////////////////////////////////\n\n// new angular member\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\ninline short& loword(int& a) {return (short&) *((short *)&a);}\ninline short& hiword(int& a) {return (short&) *((short *)&a + 1); }\n\nclass ArVertex {\n   friend class ArVertexList;\nprotected:\n   pvecint m_nodes;\n   pvecint m_bins;\npublic:\n   class Iterator {\n   protected:\n      ArVertex *m_vertex;\n      short m_current;\n      short m_last;\n      short m_top;\n   public:\n      Iterator() {\n         m_vertex = NULL;\n      }\n      Iterator(ArVertex *vertex, int bin) {\n         m_vertex  = vertex;\n         m_current = loword(m_vertex->m_bins[bin]);\n         m_last    = hiword(m_vertex->m_bins[bin]);\n         m_top     = (short)m_vertex->m_nodes.size();\n         if (m_current == m_last)\n            m_current = -1;\n      }\n      Iterator(ArVertex *vertex, short current, short last) {\n         m_vertex  = vertex;\n         m_current = current;\n         m_last    = last;\n         m_top     = (short)m_vertex->m_nodes.size();\n         if (m_current == m_last)\n            m_current = -1;\n         else if (m_current == m_top)\n            m_current = 0;\n      }\n      int& operator *() { return m_vertex->m_nodes[m_current]; }\n      operator short() { return m_current; }\n      virtual Iterator& operator ++(int) {\n         if ((++m_current) - m_last == 0) // <- might jump, and then whoops\n            m_current = -1;\n         else if (m_current >= m_top)     // <- although this just loops back\n            m_current = 0;\n         return *this;\n      }\n   };\n   friend class Iterator;\n   Iterator fovealView(int bin) {\n      Iterator i( this, loword(m_bins[(bin+30)%32]), hiword(m_bins[(bin+2)%32]) );\n      return i;\n   }\n   Iterator peripheralViewFemale(int bin) {\n      // a fudge follows...\n      // essentially, the iterator can't determine the difference between 6,6 and 6,7...5,6\n      bool found = false;\n      for (int i = bin - 8; i <= bin + 8; i++) {\n         if (loword(m_bins[(i+32)%32]) != hiword(m_bins[(i+32)%32]))\n            found = true;\n      }\n      if (loword(m_bins[(bin+24)%32]) == hiword(m_bins[(bin+8)%32]) && found)\n         return Iterator( this, 0, (short)m_nodes.size() );\n      else\n         return Iterator( this, loword(m_bins[(bin+24)%32]), hiword(m_bins[(bin+8)%32]) );\n   }\n   Iterator peripheralViewMale(int bin) {\n      Iterator i( this, loword(m_bins[(bin+25)%32]), hiword(m_bins[(bin+7)%32]) );\n      return i;\n   }\npublic:\n   enum { bin_count = 32 };\n   ArVertex( const pvecint& nodes = pvecint(), const pvecint& bins = pvecint() )\n      { m_nodes = nodes; m_bins = bins; }\n   ArVertex( const ArVertex& v )\n      { m_nodes = v.m_nodes; m_bins = v.m_bins; }\n   ArVertex& operator = (const ArVertex& v )\n   {  if (&v != this) {\n         m_nodes = v.m_nodes; m_bins = v.m_bins;\n      }\n      return *this; }\n   void make( pvecint *bin_list ) {\n      // If you're a clever bunny using the sparkGraph algorithm, the bins come presorted\n      // ...this code is the same as the one below... tidy at some point!\n      int bin_marker;\n      loword(bin_marker) = 0;\n      hiword(bin_marker) = 0;\n      for (int i = 0; i < bin_count; i++) {\n         for (size_t j = 0; j < bin_list[i].size(); j++) {\n            m_nodes.push_back( bin_list[i][j] );\n         }\n         hiword(bin_marker) += (short)bin_list[i].size();\n         m_bins.push_back( bin_marker );\n         loword(bin_marker) = hiword(bin_marker);\n         bin_list[i].clear();    // <- NOTE: useful to clear this here\n      }\n   }\n   void make( pqmap<double,int> *bin_list ) {\n      // Same as above\n      int bin_marker;\n      loword(bin_marker) = 0;\n      hiword(bin_marker) = 0;\n      for (int i = 0; i < bin_count; i++) {\n         for (size_t j = 0; j < bin_list[i].size(); j++) {\n            m_nodes.push_back( bin_list[i][j] );\n         }\n         hiword(bin_marker) += (short)bin_list[i].size();\n         m_bins.push_back( bin_marker );\n         loword(bin_marker) = hiword(bin_marker);\n         bin_list[i].clear();    // <- NOTE: useful to clear this here\n      }\n   }\n   void clear()\n   {\n      m_nodes.clear();\n      m_bins.clear();\n   }\n   // Old version compatibility:\n   int& operator [] (int i) { return m_nodes[i]; }\n   int size() const { return (int)m_nodes.size(); }\n   //\n   // All connected vertices\n   pvecint& edgeset() { return m_nodes; }\n   // Edges from a particular bin\n   Iterator binset(int binnum) {\n      return Iterator( this, binnum );\n   }\n   int binsize(int bin) {\n      // NB --- bin with all nodes will give erroneous zero!\n      return (int)((m_nodes.size() + hiword(m_bins[bin]) - loword(m_bins[bin])) % m_nodes.size());\n   }\n   //\n   std::ifstream& read( std::ifstream& stream, std::streampos offset, int metagraph_version )\n   {\n      if (metagraph_version >= mgraph440::VERSION_BINS_INTROD) {\n         m_nodes.read(stream,offset);  // read from offset...\n         m_bins.read(stream);          // <- and now read bins straight away\n      }\n      else {\n         m_nodes.read(stream,offset);  // no angular before version 30\n      }\n      return stream;\n   }\n   std::ofstream& write(std::ofstream& stream )\n   {\n      m_nodes.write(stream);\n      m_bins.write(stream);\n      return stream;\n   }\n};\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\nclass ArVertexList {\npublic:\n   enum {   NONE              = 0x0000,\n            BASIC             = 0x0001,\n            LOCAL             = 0x0002,\n            GLOBAL            = 0x0004,\n            POINTDEPTH        = 0x0008,\n            ANGULAR           = 0x0010,\n            METRIC            = 0x0020,\n            METRICPOINTDEPTH  = 0x0040,\n            ANGULARPOINTDEPTH = 0x0080    // for historical reasons (which was implemented when) these are in a strange order\n   };    // which attributes have been calculated\nprotected:\n   // stored here for ease of use\n   int m_metagraph_version;\n   ::std::string m_filename;\n   std::fstream *m_stream;\n   AttrHeader m_attr_header;\n   prefvec<AttrBody> m_attributes;\n   int m_cache_ref;\n   ArVertex m_cache_data;         // either cached...\n   bool m_mem_loaded;\n   prefvec<ArVertex> m_mem_data;  // ...or all in memory\n   int m_which_attributes;\npublic:\n   ArVertexList( const ::std::string& filename = ::std::string() )   {\n      m_metagraph_version = mgraph440::METAGRAPH_VERSION;\n      m_filename = filename;\n      m_stream = NULL;\n      m_cache_ref = -1;\n      m_mem_loaded = false;\n      m_which_attributes = ArVertexList::NONE;\n   }\n   virtual ~ArVertexList() {\n      close(); // <-- used to be remove: ensure MetaGraph removes if a temporary file\n   }\n   int size() const {\n      return (int)m_attributes.size();\n   }\n   ArVertex& operator [] (int i) {\n      if (m_mem_loaded) {\n         return m_mem_data[i];\n      }\n      else if (i != m_cache_ref && m_stream) { // <- just make sure this doesn't crash\n         m_cache_data.read( (std::ifstream&) *m_stream, m_attributes[i].pos, m_metagraph_version );\n         m_cache_ref = i;\n      }\n      return m_cache_data;\n   }\n   //\n   long memsize() const {\n      return (m_attributes.tail().pos );  // roughly right : excludes final node\n   }\n   // file must be open to do this\n   void loadmem() {\n      for (size_t i = 0; i < m_attributes.size(); i++) {\n         m_mem_data.push_back( ArVertex() );\n         m_mem_data.tail().read( (std::ifstream&) *m_stream, m_attributes[i].pos, m_metagraph_version );\n      }\n      m_mem_loaded = true;\n   }\n   void unloadmem() {\n      m_mem_data.clear();\n      m_mem_loaded = false;\n   }\n   //\n   void setFilename( const std::string& filename ) {\n      m_filename = filename;\n   }\n   const std::string& getFilename() const {\n      return m_filename;\n   }\n   //\n   void setWhichAttributes(int which_attributes) {\n      m_which_attributes |= which_attributes;\n   }\n   int getWhichAttributes() const {\n      return m_which_attributes;\n   }\n   void clearAttributes() {\n      m_attributes.clear();\n      m_which_attributes = ArVertexList::NONE;\n   }\n   //\n   bool openwrite(int nodes);\n   void openread();\n   void close();\n   void remove();\n   void add( int ref, const ArVertex& node );\n   void commit();                                                 // when copying\n   void commit( const Point2f& p, int far_node, float far_dist, float total_dist ); // when creating new node\n   //\n   bool read( std::ifstream& stream, int metagraph_version );\n   bool write(std::ostream &stream );\n   //\n   const AttrBody& getAttributes(int i) const {\n      return m_attributes[i];\n   }\n   AttrBody& getAttributes(int i) {\n      return m_attributes[i];\n   }\n};\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\n///////////////////////////////////////////////////////////////////////////////\n\n// depthmap: file based graph vertex lists:\ntypedef ArVertex     GraphVertex;\ntypedef ArVertexList GraphVertexList;\n\n// standard: memory resident graph vertex lists:\n//   typedef Vertex                    GraphVertex;\n//   typedef pqmap<int,GraphVertex>    GraphVertexList;\n// --- now sadly dead and buried\n///////////////////////////////////////////////////////////////////////////////\n\n\n\n// Exception to be thrown if the thread is cancelled\n/*\nclass thread_cancelled_exception {\npublic:\n   thread_cancelled_exception()\n   {;}\n};\n*/\n\n\n// Attribute map is for choosing attributes by description\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\nstruct AttrMap {\n   enum  { ATTR_INT, ATTR_FLOAT };\n   int   ref;\n   char *desc;\n   int   attr_set;\n   int   modules_req;\n   int   type;\n   AttrMap(int r, char *d, int a, int m, int t) { ref = r; desc = d; attr_set = a; modules_req = m; type = t; }\n   int   usable() const {return true; }\n   bool  intval() const {return type == ATTR_INT;}\n   bool  floatval() const {return type == ATTR_FLOAT;}\n};\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\n// This *must* match number of attributes listed below!\nconst int NUM_DISPLAYABLE_ATTRIBUTES = 26;\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\nconst AttrMap g_attr_display_map[] = {\n   // 0\n   AttrMap(AttrHeader::NEIGHBOURHOOD_SIZE, (char *)\"Neighbourhood Size\",  GraphVertexList::BASIC,      0,  AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::MEAN_DEPTH,         (char *)\"Mean Depth\",          GraphVertexList::GLOBAL,     0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::INTEGRATION_RA,     (char *)\"Relative Asymmetry\",  GraphVertexList::GLOBAL,     0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::INTEGRATION_RRA,    (char *)\"Real Relative Asymmetry*\", GraphVertexList::GLOBAL,0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::INTEGRATION_HILL,   (char *)\"Integration (Hillier/Hanson)*\",  GraphVertexList::GLOBAL, 0, AttrMap::ATTR_FLOAT),\n   // 5\n   AttrMap(AttrHeader::INTEGRATION_TEKL,   (char *)\"Integration (Teklenburg et al.)\",  GraphVertexList::GLOBAL, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::GRAPH_SIZE,         (char *)\"Graph Size\",          GraphVertexList::GLOBAL,     0,  AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::ENTROPY,            (char *)\"Entropy\",             GraphVertexList::GLOBAL,     0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::REL_ENTROPY,        (char *)\"Relativised Entropy\", GraphVertexList::GLOBAL,     0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::CLUSTER,            (char *)\"Clustering Coefficient\", GraphVertexList::LOCAL,   0,  AttrMap::ATTR_FLOAT),\n   // 10\n   AttrMap(AttrHeader::CONTROL_HILL,       (char *)\"Control (Hillier/Hanson)\", GraphVertexList::LOCAL, 0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::CONTROL_TURN,       (char *)\"Control (Turner)\",    GraphVertexList::LOCAL,      0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::POINT_DEPTH,        (char *)\"Point Depth\",         GraphVertexList::POINTDEPTH, 0,  AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::MEDIAN_ANGLE,       (char *)\"Mean Angle\",          GraphVertexList::ANGULAR,    0,AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::FAR_DIST,           (char *)\"Far Neighbour Distance\",     GraphVertexList::BASIC,      0,  AttrMap::ATTR_FLOAT),\n   // 15\n   AttrMap(AttrHeader::TOTAL_DIST,         (char *)\"Total Neighbour Distance\",   GraphVertexList::BASIC,      0,    AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::AVG_DIST,           (char *)\"Average Neighbour Distance\", GraphVertexList::BASIC,      0,    AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::AGENT_COUNT,        (char *)\"Agent Trails\",        GraphVertexList::BASIC,      0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::AGENT_COLL_COUNT,   (char *)\"Agent Collisions\",    GraphVertexList::BASIC,      0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::METRIC_MEAN_DEPTH,  (char *)\"Metric Mean Depth\",   GraphVertexList::METRIC,     0,    AttrMap::ATTR_FLOAT),\n   // 20\n   AttrMap(AttrHeader::METRIC_MEAN_ANGLE,  (char *)\"Metric Mean Angle\",      GraphVertexList::METRIC,     0,    AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::MEAN_PENN_DIST,     (char *)\"Mean Penn Distance\",        GraphVertexList::METRIC, 0,  AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::DECENTRAL_INTEG,    (char *)\"Decentralised Integration\", GraphVertexList::METRIC, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::METRIC_POINT_DEPTH, (char *)\"Metric Point Depth\",        GraphVertexList::METRICPOINTDEPTH, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::METRIC_POINT_ANGLE, (char *)\"Metric Point Angle\",        GraphVertexList::METRICPOINTDEPTH, 0, AttrMap::ATTR_FLOAT),\n   // 25\n   AttrMap(AttrHeader::POINT_PENN_DIST,    (char *)\"Point Penn Distance\",       GraphVertexList::METRICPOINTDEPTH, 0, AttrMap::ATTR_FLOAT)\n};\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\n// This *must* match number of attributes listed below!\nconst int NUM_SUMMARISABLE_ATTRIBUTES = 23;\n\n// THIS PART OF THE FILE IS DEPRECATED\n// ATTRIBUTE TABLES ARE USED INSTEAD\n\nconst AttrMap g_attr_summary_map[] = {\n   // 0\n   AttrMap(AttrHeader::NEIGHBOURHOOD_SIZE, (char *)\"Neighbourhood Size\",     1, 0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::FAR_DIST,           (char *)\"Far Neighbour Distance\", 1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::TOTAL_DIST,         (char *)\"Total Neighbour Distance\", 1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::GRAPH_SIZE,         (char *)\"Graph Size\",             1, 0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::KERNEL_SIZE,        (char *)\"Kernel Size\",            1, 0, AttrMap::ATTR_INT),\n   // 5\n   AttrMap(AttrHeader::CLIQUE_SIZE,        (char *)\"Clique Size\",            1, 0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::TOTAL_DEPTH,        (char *)\"Total Visual Depth\",     1, 0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::ENTROPY,            (char *)\"Entropy\",                1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::REL_ENTROPY,        (char *)\"Relativised Entropy\",    1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::CLUSTER,            (char *)\"Clustering Coefficient\", 1, 0, AttrMap::ATTR_FLOAT),\n   // 10\n   AttrMap(AttrHeader::POINT_DEPTH,        (char *)\"Point Depth\",            1, 0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::CONTROL_HILL,       (char *)\"Control (Hillier/Hanson)\", 1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::CONTROL_TURN,       (char *)\"Control (Turner)\",       1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::MEDIAN_ANGLE,       (char *)\"Mean Angle\",             1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::AGENT_COUNT,        (char *)\"Agent Trails\",           1, 0, AttrMap::ATTR_INT),\n   // 15\n   AttrMap(AttrHeader::AGENT_COLL_COUNT,   (char *)\"Agent Collisions\",       1, 0, AttrMap::ATTR_INT),\n   AttrMap(AttrHeader::TOTAL_METRIC_DEPTH, (char *)\"Total Metric Depth\",     1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::TOTAL_METRIC_ANGLE, (char *)\"Total Metric Angle\",     1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::TOTAL_EUCLID_DIST,  (char *)\"Total Euclidean Distance\", 1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::METRIC_GRAPH_SIZE,  (char *)\"Metric Graph Size\",      1, 0, AttrMap::ATTR_INT),\n   // 20\n   AttrMap(AttrHeader::METRIC_POINT_DEPTH, (char *)\"Metric Point Depth\",     1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::METRIC_POINT_ANGLE, (char *)\"Metric Point Angle\",     1, 0, AttrMap::ATTR_FLOAT),\n   AttrMap(AttrHeader::POINT_EUCLID_DIST,  (char *)\"Euclidean Point Depth\",  1, 0, AttrMap::ATTR_FLOAT)\n};\n\n}\n"
  },
  {
    "path": "mgraph440/attributes.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include <math.h>\n#include <float.h>\n\n#include <mgraph440/mgraph.h>\n#include <mgraph440/attributes.h>\n\n#include \"mgraph440/stringutils.h\"\n\n#include <stdexcept>\n\nnamespace mgraph440 {\n\n////////////////////////////////////////////////////////////////////////////////////\n\n// helpers: local sorting routines\n\nint compareValuePair(const void *p1, const void *p2)\n{\n   double v = (((ValuePair *)p1)->value - ((ValuePair *)p2)->value);\n   return (v > 0.0 ? 1 : v < 0.0 ? -1 : 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n\nAttributeTable::AttributeTable(const std::string& name)\n{\n   // need memory initialised somewhere for these...\n   g_ref_number_name = std::string(\"Ref Number\");\n   g_ref_number_formula = std::string();\n   //\n   m_name = name;\n   // initially not showing any column:\n   m_display_column = -2;\n   // initially no selection:\n   m_sel_count = 0;\n   m_sel_value = 0.0;\n   //\n   // everything apart from the default layer is available for use:\n   // Quick mod - TV\n   m_available_layers = 0xffffffff << (32 + 0xfffffffe);\n   // display the default layer only (everything):\n   m_visible_layers = 0x1;\n   m_layers.add(1,\"Everything\");\n   m_visible_size = 0;\n}\n\nint AttributeTable::insertColumn(const std::string& name)\n{\n   size_t index = m_columns.searchindex(AttributeColumn(name));\n   if (index != paftl::npos) {\n      m_columns[index].reset();\n      int phys_col = m_columns[index].m_physical_col;\n      for (size_t i = 0; i < size(); i++) {\n         at(i)[phys_col] = -1.0f;\n      }\n   }\n   else {\n      index = m_columns.add(AttributeColumn(name));\n      for (size_t i = 0; i < size(); i++) {\n         at(i).push_back(-1.0f);\n      }\n      m_columns[index].m_physical_col = m_columns.size() - 1;\n   }\n   return index;\n}\n\nint AttributeTable::insertRow(int key)\n{\n   int index = add(key,AttributeRow());\n   value(index).init(m_columns.size());\n   return index;\n}\n\nvoid AttributeTable::deselectAll() const\n{\n   m_sel_count = 0;\n   m_sel_value = 0.0;\n   for (size_t i = 0; i < size(); i++) {\n      value(i).m_selected = false;\n   }\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\nvoid AttributeTable::setDisplayColumn(int col, bool override) const\n{\n   if (col != m_display_column || override) {\n      if (col != -2) {\n         m_sel_value = 0.0; // reset selection total for new column\n         // note, visible size is actually picked up by the display index\n         m_visible_size = m_display_index.makeIndex(*this, col, true);\n         if (col == -1)\n            m_display_params = m_ref_display_params;\n         else\n            m_display_params = m_columns[col].getDisplayParams();\n      }\n      m_display_column = col;\n   }\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\nbool AttributeTable::read( std::ifstream& stream, int version )\n{\n   if (version >= VERSION_MAP_LAYERS) {\n      m_layers.clear();\n      stream.read((char *)&m_available_layers,sizeof(int64));\n      stream.read((char *)&m_visible_layers,sizeof(int64));\n      int count;\n      stream.read((char *)&count,sizeof(int));\n      for (int i = 0; i < count; i++) {\n         int64 key;\n         stream.read((char *)&key,sizeof(key));\n         m_layers.add(key,dXstring440::readString(stream));\n      }\n   }\n   int colcount;\n   stream.read((char *)&colcount, sizeof(colcount));\n   for (int j = 0; j < colcount; j++) {\n      m_columns.push_back(AttributeColumn());\n      m_columns.tail().read(stream, version);\n      // this may need a bit of reordering, as the reader can chop up names:\n      m_columns.sort();\n   }\n   int rowcount, rowkey;\n   stream.read((char *)&rowcount, sizeof(rowcount));\n   for (int i = 0; i < rowcount; i++) {\n      stream.read((char *)&rowkey, sizeof(rowkey));\n      int index = add(rowkey,AttributeRow());\n      if (version >= VERSION_MAP_LAYERS) {\n         stream.read((char *)&(value(index).m_layers),sizeof(int64));\n      }\n      value(index).read(stream);\n   }\n   if (version >= VERSION_GATE_MAPS) {\n      // ref column display params\n      stream.read((char *)&m_display_params,sizeof(m_display_params));\n   }\n   return true;\n}\n\n////////////////////////////////////////////////////////////////////////\n\nvoid AttributeRow::init(size_t length)\n{\n   if (m_data) {\n      delete [] m_data;\n      m_data = NULL;\n   }\n   while (length >= storage_size())\n      m_shift++;\n   m_data = new float [storage_size()];\n   m_length = length;\n\n   for (size_t i = 0; i < m_length; i++) {\n      at(i) = -1.0;\n   }\n}\n\n////////////////////////////////////////////////////////////////////////\n\nvoid AttributeColumn::reset()\n{\n   m_min = -1.0;\n   m_max = 0.0;\n   m_tot = 0.0;\n   m_visible_min = -1.0;\n   m_visible_max = 0.0;\n   m_visible_tot = 0.0;\n}\n\nbool AttributeColumn::read( std::ifstream& stream, int version )\n{\n   m_updated = false;\n   m_name = dXstring440::readString(stream);\n   float min, max;\n   stream.read((char *)&min, sizeof(min));\n   stream.read((char *)&max, sizeof(max));\n   m_min = min;\n   m_max = max;\n   if (version >= VERSION_ATTRIBUTES_TABLE)  // m_tot has always been a double\n      stream.read((char *)&m_tot, sizeof(m_tot));\n   else\n      m_tot = 0.0;\n   stream.read((char *)&m_physical_col, sizeof(m_physical_col));\n   stream.read((char *)&m_hidden, sizeof(m_hidden));\n   if (version >= VERSION_ATTRIBUTE_LOCKING) {\n      stream.read((char *)&m_locked, sizeof(m_locked));\n   }\n   else {\n      if (m_name == \"Connectivity\" || m_name == \"Connectivity (Degree)\" || m_name == \"Axial Line Ref\" || m_name == \"Segment Length\" || m_name == \"Line Length\") {\n         m_locked = true;\n      }\n      else {\n         m_locked = false;\n      }\n   }\n   if (version >= VERSION_STORE_COLOR) {\n      stream.read((char*)&m_display_params,sizeof(m_display_params));\n   }\n   if (version >= VERSION_STORE_FORMULA) {\n      m_formula = dXstring440::readString(stream);\n   }\n   if (version >= VERSION_STORE_COLUMN_CREATOR && version < VERSION_FORGET_COLUMN_CREATOR) {\n      std::string dummy_creator = dXstring440::readString(stream);\n   }\n   return true;\n}\n\n////////////////////////////////////////////////////////////////////////\n\nAttributeIndex::AttributeIndex()\n{\n   m_col = -1;\n   m_data = NULL;\n}\n\nvoid AttributeIndex::clear()\n{\n   m_col = -1;\n   pvector<ValuePair>::clear();\n}\n\nint AttributeIndex::makeIndex(const AttributeTable& table, int col, bool setdisplayinfo)\n{\n   // clear contents:\n   clear();\n\n   // local copy since this will be reused a lot\n   size_t rowcount = table.getRowCount();\n\n   // preallocate vector:\n   while (rowcount >= storage_size())\n      m_shift++;\n   m_data = new ValuePair[storage_size()];\n   m_length = rowcount;\n   //\n   m_col = col;\n   //\n   double min = -1.0f, max = -1.0f, vismin = -1.0f, vismax = -1.0f;\n   double total = 0.0f, vistotal = 0.0;\n   // note that, for safety, *everything* is always indexed,\n   // viscount is simply a count of everything that is visible\n   int viscount = 0;\n   // n.b., attributes, axial lines and line refs must match\n   size_t i;\n   for (i = 0; i < rowcount; i++)\n   {\n      at(i).index = i;\n      if (col != -1) {\n         at(i).value = double(table.getValue(i,col));\n         if (at(i).value != -1) {\n            if (min == -1.0f || at(i).value < min) {\n               min = (double) at(i).value;\n            }\n            if (max == -1.0f || at(i).value > max) {\n               max = (double) at(i).value;\n            }\n            total += at(i).value;\n            if (table.isVisible(i)) {\n               // note, this may be useful -- the visible count does not include nulls\n               viscount++;\n               if (vismin == -1.0f || at(i).value < vismin) {\n                  vismin = (double) at(i).value;\n               }\n               if (vismax == -1.0f || at(i).value > vismax) {\n                  vismax = (double) at(i).value;\n               }\n               vistotal += at(i).value;\n            }\n         }\n         // note: qsort is slow when many values are the same -- so these values are perturbed\n         // -> perturbation used to be random, but now sub sort by ref number\n         // note: value needs to be double to work out in large tables\n         // (note also, max may build up through table, causing some disturbance to order)\n         at(i).value += (max * 1e-9 * double(i)) / table.getRowCount();\n      }\n      else {\n         if (table.isVisible(i)) {\n            // note, viscount is used by scatterplots at least\n            viscount++;\n            // eventually there should be a colour override on the ref column as well as any other)\n            vismax = i;\n            if (vismin == -1) {\n               vismin = i;\n            }\n         }\n         at(i).value = double(table.getRowKey(i))/table.getMaxRowKey();\n      }\n   }\n\n   // mutable override:\n   if (col != -1) {\n      table.setColumnInfo(col,min,max,total,vismin,vismax,vistotal);\n   }\n\n   qsort(m_data,rowcount,sizeof(ValuePair),compareValuePair);\n\n   for (i = 0; i < rowcount; i++) {\n      // note: this is to ensure we have save settings for the table ranges where data has been overwritten:\n      if (setdisplayinfo) {\n         at(i).value = (col != -1) ? table.getNormValue(at(i).index,col) : double(table.getRowKey(at(i).index))/table.getMaxRowKey();\n         // be able to lookup index pos from row:\n         ValuePair vp2;\n         vp2.index = i;\n         vp2.value = at(i).value;\n         table.setDisplayInfo(at(i).index,vp2);\n      }\n      else {\n         // don't normalise: you want the exact value for this row\n         at(i).value = (col != -1) ? table.getValue(at(i).index,col) : double(table.getRowKey(at(i).index));\n      }\n   }\n   return viscount;\n}\n\nbool AttributeTable::write( std::ostream& stream, int version )\n{\n\n   stream.write((char *)&m_available_layers,sizeof(int64));\n   stream.write((char *)&m_visible_layers,sizeof(int64));\n   int count = m_layers.size();\n   stream.write((char *)&count,sizeof(int));\n   for (size_t i = 0; i < m_layers.size(); i++) {\n      int64 key = m_layers.key(i);\n      stream.write((char *)&key,sizeof(key));\n      dXstring440::writeString(stream ,m_layers.value(i));\n   }\n\n   int colcount = m_columns.size();\n   stream.write((char *)&colcount, sizeof(colcount));\n   for (int j = 0; j < colcount; j++) {\n      m_columns[j].write(stream,version);\n   }\n   int rowcount = size(), rowkey;\n   stream.write((char *)&rowcount, sizeof(rowcount));\n   for (int i = 0; i < rowcount; i++) {\n      rowkey = key(i);\n      stream.write((char *)&rowkey, sizeof(rowkey));\n      stream.write((char *)&(value(i).m_layers),sizeof(int64));\n      value(i).write(stream);\n   }\n   // ref column display params\n   stream.write((char *)&m_display_params,sizeof(m_display_params));\n   return true;\n}\n\nbool AttributeColumn::write( std::ostream& stream, int version )\n{\n   m_updated = false;\n   dXstring440::writeString(stream, m_name);\n   float min = (float) m_min;\n   float max = (float) m_max;\n   stream.write((char *)&min, sizeof(min));\n   stream.write((char *)&max, sizeof(max));\n   stream.write((char *)&m_tot, sizeof(m_tot));\n   stream.write((char *)&m_physical_col, sizeof(m_physical_col));\n   stream.write((char *)&m_hidden, sizeof(m_hidden));\n   stream.write((char *)&m_locked, sizeof(m_locked));\n   stream.write((char *)&m_display_params,sizeof(m_display_params));\n   dXstring440::writeString(stream, m_formula);\n   return true;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/attributes.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#ifndef __ATTRIBUTES_H__\n#define __ATTRIBUTES_H__\n\n#include \"mgraph440/attr.h\"\n#include \"mgraph440/displayparams.h\"\n#include \"mgraph440/pafcolor.h\"\n#include <mgraph440/salaprogram.h> // for scripting object\n#include <string>\n\nnamespace mgraph440 {\n\n// yet another way to do attributes, but one that is easily expandable\n// it's slow to look for a column, since you have to find the column\n// by name, but other than that it's fairly easy\n\n// helpers... local sorting routines\n\n////////////////////////////////////////////////////////////////////////////////\n\nstruct ValuePair\n{\n   double value;  // needs to be double for sorting in index at higher resolution than the stored data\n   int index;\n   ValuePair(int i = -1, double v = -1.0)\n   { index = i; value = v; }\n   friend bool operator < (const ValuePair& vp1, const ValuePair& vp2);\n   friend bool operator > (const ValuePair& vp1, const ValuePair& vp2);\n   friend bool operator == (const ValuePair& vp1, const ValuePair& vp2);\n};\ninline bool operator < (const ValuePair& vp1, const ValuePair& vp2)\n{\n   return (vp1.value < vp2.value);\n}\ninline bool operator > (const ValuePair& vp1, const ValuePair& vp2)\n{\n   return (vp1.value > vp2.value);\n}\ninline bool operator == (const ValuePair& vp1, const ValuePair& vp2)\n{\n   return (vp1.value == vp2.value);\n}\nint compareValuePair(const void *p1, const void *p2);\n\n////////////////////////////////////////////////////////////////////////////////\n\n// These aren't really to do with attributes per se, but helpful to have\n// them around ValuePair definition\n\n// note! unsorted\nstruct IntPair\n{\n   int a;\n   int b;\n   IntPair(int x = -1, int y = -1) {\n      a = x;\n      b = y;\n   }\n   // inlined at end of file\n   friend bool operator == (const IntPair& x, const IntPair& y);\n   friend bool operator != (const IntPair& x, const IntPair& y);\n   friend bool operator <  (const IntPair& x, const IntPair& y);\n   friend bool operator >  (const IntPair& x, const IntPair& y);\n};\n\n// note! sorted\nstruct OrderedIntPair\n{\n   int a;\n   int b;\n   OrderedIntPair(int x = -1, int y = -1) {\n      a = (int) x < y ? x : y;\n      b = (int) x < y ? y : x;\n   }\n   // inlined at end of file\n   friend bool operator == (const OrderedIntPair& x, const OrderedIntPair& y);\n   friend bool operator != (const OrderedIntPair& x, const OrderedIntPair& y);\n   friend bool operator <  (const OrderedIntPair& x, const OrderedIntPair& y);\n   friend bool operator >  (const OrderedIntPair& x, const OrderedIntPair& y);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nclass AttributeRow : public pvector<float>\n{\n   friend class AttributeTable;\nprotected:\n   mutable bool m_selected;\n   mutable ValuePair m_display_info;\n   // this is for salascripting to allow \"checking\" a searched node:\n   mutable SalaObj m_sala_mark;\n   // this is for recording layers (up to 64 are possible)\n   int64 m_layers;\npublic:\n   AttributeRow()\n      { m_selected = false; m_layers = 1; }\n   void init(size_t length);\n   //\n   // For SalaScript\n   void setMark(SalaObj& mark)\n   { m_sala_mark = mark; }\n   const SalaObj& getMark() const\n   { return m_sala_mark; }\n};\n\n// note pvector: this is stored in order, reorder by qsort\nclass AttributeIndex : public pvector<ValuePair>\n{\n   friend class AttributeTable;\nprotected:\n   int m_col;\npublic:\n   AttributeIndex();\n   void clear();\n   int makeIndex(const AttributeTable& table, int col, bool setdisplayinfo);\n};\n\nclass AttributeColumn\n{\npublic:\n   std::string m_name;\n   bool m_updated; // <- this flag is not saved, and indicates new data in the column (set on insert column etc)\n   int m_physical_col;\n   mutable double  m_min;\n   mutable double  m_max;\n   mutable double m_tot;\n   mutable double m_visible_min;\n   mutable double m_visible_max;\n   mutable double m_visible_tot;\n   bool m_hidden;\n   bool m_locked;\n   // display parameters\n   DisplayParams m_display_params;\n   // retain formula used to create column\n   std::string m_formula;\n\n   AttributeColumn(const std::string& name = std::string(), int physical_col = -1)\n   {   m_name = name;\n       m_min = -1.0f;\n       m_max = 0.0f;\n       m_tot = 0.0;\n       m_visible_min = -1.0f;\n       m_visible_max = 0.0f;\n       m_visible_tot = 0.0;\n       m_physical_col = physical_col;\n       m_hidden = false;\n       m_locked = false;\n       m_updated = false;\n   }\n   float makeNormValue(float value) const\n   { return (m_min == m_max) ? 0.5f : (value == -1.0f) ? -1.0f : (float)((value - m_min) / (m_max - m_min)); }\n   void setValue(float value)\n   { m_updated = true; m_tot += value; if (m_min == -1.0f || value < m_min) m_min = value; if (value > m_max) m_max = value; }\n   void changeValue(float oldval, float newval)\n   { m_updated = true; if (oldval != -1.0f) m_tot -= oldval; if (newval != -1.0f) setValue(newval); }\n   void setInfo(double min, double max, double tot, double vismin, double vismax, double vistot) const\n   { m_min = min; m_max = max; m_tot = tot; m_visible_min = vismin; m_visible_max = vismax; m_visible_tot = vistot; }\n   const DisplayParams& getDisplayParams() const\n   { return m_display_params; }\n   void reset();\n   void setLock(bool lock = true)\n   { m_locked = lock; }\n   bool read( std::ifstream& stream, int version );\n   bool write(std::ostream &stream, int version );\n   friend bool operator == (const AttributeColumn& a, const AttributeColumn& b);\n   friend bool operator < (const AttributeColumn& a, const AttributeColumn& b);\n   friend bool operator > (const AttributeColumn& a, const AttributeColumn& b);\n};\ninline bool operator == (const AttributeColumn& a, const AttributeColumn& b)\n{ return a.m_name == b.m_name; }\ninline bool operator < (const AttributeColumn& a, const AttributeColumn& b)\n{ return a.m_name < b.m_name; }\ninline bool operator > (const AttributeColumn& a, const AttributeColumn& b)\n{ return a.m_name > b.m_name; }\n\nclass AttributeTable : protected pqmap<int,AttributeRow>\n{\npublic:\n   std::string m_name;\n   pqvector<AttributeColumn> m_columns;\n   mutable int m_sel_count;\n   mutable double m_sel_value;\n//   pqmap<int,AttributeRow> m_data;\n//   // display parameters for the reference id column\n   DisplayParams m_ref_display_params;\n   int64 m_available_layers;\n   pqmap<int64,std::string> m_layers;\n   mutable int64 m_visible_layers;\n   mutable int m_visible_size;\n   mutable int m_display_column;\n   mutable DisplayParams m_display_params;\n   // Display:\n   mutable AttributeIndex m_display_index;\n   std::string g_ref_number_name;    // = std::string(\"Ref Number\");\n   std::string g_ref_number_formula; // = std::string(\"\");\n\n\n   AttributeTable(const std::string& name = std::string());\n   int insertColumn(const std::string& name = std::string());\n   int insertRow(int key);\n   int getColumnIndex(const std::string& name) const\n      { size_t index = m_columns.searchindex(name); return (index == paftl::npos) ? -1 : int(index);} // note use -1 rather than paftl::npos for return value\n   int getOrInsertColumnIndex(const std::string& name)\n      { size_t col = m_columns.searchindex(name); if (col == paftl::npos) return insertColumn(name); else return (int) col; }\n   int getOrInsertLockedColumnIndex(const std::string& name)\n      { size_t col = m_columns.searchindex(name); if (col == paftl::npos) return insertLockedColumn(name); else return (int) col; }\n   int getRowKey(int index) const\n      { return key(index); }\n   int getRowid(const int key) const\n      { size_t i = searchindex(key); return (i == paftl::npos) ? -1 : int(i);} // note use -1 rather than paftl::npos for return value\n   int getRowCount() const\n      { return (int) size(); }\n   int getMaxRowKey() const\n      { return key(size()-1); }\n   // this version uses known row and col indices\n   float getValue(int row, int col) const\n      { return col != -1 ? value(row).at(m_columns[col].m_physical_col) : key(row); }\n   // this version is meant to use row key and col name\n   float getValue(int row, const std::string& name) const\n      { int col = getColumnIndex(name); return col != -1 ? value(row).at(m_columns[col].m_physical_col) : key(row); }\n   float getNormValue(int row, int col) const\n      { return col != -1 ? m_columns[col].makeNormValue(value(row).at(m_columns[col].m_physical_col)) : (float) (double(getRowKey(row))/double(getRowKey(int(size()-1)))); }\n   void setValue(int row, int col, float val)\n      { value(row).at(m_columns[col].m_physical_col) = val; m_columns[col].setValue(val); }\n   void setValue(int row, const std::string& name, float val)\n      { int col = getColumnIndex(name); if (col != -1) setValue(row,col,val); }\n   void changeValue(int row, int col, float val)\n      { float& theval = value(row).at(m_columns[col].m_physical_col); m_columns[col].changeValue(theval,val); theval = val; }\n   void changeValue(int row, const std::string& name, float val)\n      { int col = getColumnIndex(name); if (col != -1) changeValue(row,col,val); }\n   void changeSelValues(int col, float val)\n      { for (size_t i = 0; i < size(); i++) { if (value(i).m_selected) changeValue((int)i,col,val);} }\n   void incrValue(int row, int col, float amount = 1.0f)\n      { float& v = value(row).at(m_columns[col].m_physical_col); v = (v == -1.0f) ? amount : v+amount ; m_columns[col].changeValue(v-amount,v); }\n   void incrValue(int row, const std::string& name, float amount = 1.0f)\n      { int col = getColumnIndex(name);  if (col != -1) incrValue(row,col,amount); }\n\n   void setColumnInfo(int col, double min, double max, double tot, double vismin, double vismax, double vistot) const\n      { m_columns[col].setInfo(min,max,tot,vismin,vismax,vistot); }\n\n   void setColumnLock(int col, bool lock = true)\n   { m_columns[col].setLock(lock); }\n   int insertLockedColumn(const std::string& name = std::string())\n   { int col = insertColumn(name); setColumnLock(col); return col; }\n   // For SalaScript:\n   void setMark(int row, SalaObj& mark)\n      { value(row).setMark(mark); }\n   const SalaObj& getMark(int row) const\n      { return value(row).getMark(); }\n   void deselectAll() const;\n   void addSelValue(double value) const\n   { m_sel_value += (value != -1.0f) ? value : 0.0; }\n   bool isSelected(int index) const\n   { return value(index).m_selected; }\n\n   bool isVisible(int row) const\n      { return (m_visible_layers & (at(row).m_layers)) != 0; }\n   void setDisplayColumn(int col, bool override = false) const;\n   int getDisplayColumn() const\n      { return m_display_column; }\n   void setDisplayInfo(int row, ValuePair vp) const\n      { at(row).m_display_info = vp; if (at(row).m_selected) addSelValue((double)vp.value); }\n   const DisplayParams& getDisplayParams() const\n      { return m_display_params; }\n   void clear()  // <- totally destroy, not just clear values\n   { m_columns.clear(); pqmap<int,AttributeRow>::clear(); }\n\n   bool read( std::ifstream& stream, int version );\n   bool write(std::ostream &stream, int version );\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/axialmap.cpp",
    "content": "#include \"mgraph440/mgraph_consts.h\"\n#include \"mgraph440/axialmap.h\"\n#include \"mgraph440/stringutils.h\"\n\nnamespace mgraph440 {\n\nbool ShapeGraph::read( std::ifstream& stream, int version )\n{\n   m_attributes.clear();\n   m_connectors.clear();\n   m_selection = false;\n   m_map_type = ShapeMap::EMPTYMAP;\n\n   // the old version used SpacePixel as base class\n   // actually easiest to read and translate, rather than try to use new method\n   if (version < VERSION_AXIAL_SHAPES) {\n      readold(stream, version);\n   }\n   else {\n      bool segmentmap = false;\n      if (version < VERSION_MAP_TYPES) {\n         // axial specific reads -- segment map flag and keyvertices (part of all line map functionality)\n         // note, now stored in the \"map_type\", and read / written with shape map\n         char segmentmapc = stream.get();\n         if (segmentmapc == '1') {\n            segmentmap = true;\n         }\n      }\n      // note that keyvertexcount and keyvertices are different things! (length keyvertices not the same as keyvertexcount!)\n      stream.read((char *)&m_keyvertexcount,sizeof(m_keyvertexcount));\n      int size;\n      stream.read((char *)&size,sizeof(size));\n      for (int i = 0; i < size; i++) {\n         m_keyvertices.push_back(pvecint());\n         m_keyvertices[i].read(stream);\n      }\n      // now base class read:\n      ShapeMap::read(stream,version);\n      //\n      // override shapemap map type designation if necessary:\n      if (version < VERSION_MAP_TYPES) {\n         if (segmentmap) {\n            m_map_type = ShapeMap::SEGMENTMAP;\n         }\n         else {\n            m_map_type = ShapeMap::AXIALMAP;\n         }\n      }\n   }\n\n   return true;\n}\n\nbool ShapeGraph::readold( std::ifstream& stream, int version )\n{\n   // read in from old base class\n   SpacePixel linemap;\n   linemap.read(stream, version);\n   const pmap<int,LineTest>& lines = linemap.getAllLines();\n\n   m_name = linemap.getName();\n\n   // now copy to new base class:\n   init(lines.size(),linemap.getRegion());\n   for (size_t i = 0; i < lines.size(); i++) {\n      makeLineShape(lines[i].line);\n   }\n   // n.b., we now have to reclear attributes!\n   m_attributes.clear();\n\n   // continue old read:\n   int pushmap = -1;\n   if (version >= VERSION_SEGMENT_MAPS) {\n      char segmentmapc = stream.get();\n      if (segmentmapc == '1') {\n         m_map_type = ShapeMap::SEGMENTMAP;\n      }\n      else {\n         m_map_type = ShapeMap::AXIALMAP;\n      }\n   }\n   if (version >= VERSION_GATE_MAPS) {\n      char gatemapc = stream.get();\n      if (gatemapc == '1') {\n         m_map_type = ShapeMap::DATAMAP;\n      }\n      stream.read((char *)&pushmap,sizeof(pushmap));\n   }\n\n   int displayed_attribute;  // n.b., temp variable necessary to force recalc below\n   stream.read((char *)&displayed_attribute,sizeof(displayed_attribute));\n\n   m_attributes.read(stream,version);\n   int size;\n   stream.read((char *)&size,sizeof(size));\n   for (int j = 0; j < size; j++) {\n      m_keyvertices.push_back(pvecint());    // <- these were stored with the connector\n      int key;\n      stream.read((char *)&key,sizeof(key)); // <- key deprecated\n      m_connectors.push_back(Connector());\n      m_connectors[j].read(stream,version,&(m_keyvertices[j]));\n   }\n   stream.read((char *)&m_keyvertexcount,sizeof(m_keyvertexcount));\n\n   if (version >= VERSION_AXIAL_LINKS) {\n      m_links.read(stream);\n      m_unlinks.read(stream);\n   }\n   // some miscellaneous extra data for mapinfo files\n   if (m_mapinfodata) {\n      delete m_mapinfodata;\n      m_mapinfodata = NULL;\n   }\n   if (version >= VERSION_MAPINFO_DATA) {\n      char x = stream.get();\n      if (x == 'm') {\n         m_mapinfodata = new MapInfoData;\n         m_mapinfodata->read(stream,version);\n      }\n   }\n\n   // now, as soon as loaded, must recalculate our screen display:\n   // note m_displayed_attribute should be -2 in order to force recalc...\n   m_displayed_attribute = -2;\n   setDisplayedAttribute(displayed_attribute);\n\n   return true;\n}\n\nbool ShapeGraphs::read( std::ifstream& stream, int version )\n{\n   // base class read\n   if (version >= VERSION_AXIAL_SHAPES) {\n      ShapeMaps<ShapeGraph>::read(stream,version);\n   }\n   else {\n      readold(stream,version);\n   }\n\n   // these are additional essentially for all line axial maps\n   // should probably be kept *with* the all line axial map...\n   m_poly_connections.clear();\n   m_poly_connections.read(stream);\n   m_radial_lines.clear();\n   m_radial_lines.read(stream);\n\n   // this is an index to look up the all line map, used by UI to determine if can make fewest line map\n   // note: it is not saved for historical reasons\n   // will get confused by more than one all line map\n   m_all_line_map = getMapRef(\"All-Line Map\");\n   if (m_all_line_map == -1) {\n      // used to be called All Line Map\n      m_all_line_map = getMapRef(\"All Line Map\");\n   }\n   if (m_all_line_map != -1) {\n      at(m_all_line_map).m_map_type = ShapeMap::ALLLINEMAP;\n   }\n\n   // VERSION_AXIAL_REGION_FIX -- this fix is now deprecated\n   // some awful things could have gone wrong in the past, but the shapemap read should fix automatically\n\n   return true;\n}\n\n// for backward compatibility only:\nbool ShapeGraphs::readold( std::ifstream& stream, int version )\n{\n   // this read is based on SpacePixelGroup<ShapeGraph>::read(stream, version);\n   dXstring440::readString(stream);\n   QtRegion dummyregion;\n   stream.read( (char *) &dummyregion, sizeof(dummyregion) );\n   int count;\n   stream.read( (char *) &count, sizeof(count) );\n   for (int i = 0; i < count; i++) {\n      push_back(ShapeGraph());\n      tail().read(stream,version);\n   }\n   stream.read((char *)&m_displayed_map,sizeof(m_displayed_map));\n\n   return true;\n}\n\nbool ShapeGraphs::write(std::ostream &stream, int version, bool displayedmaponly )\n{\n   // base class write\n   ShapeMaps<ShapeGraph>::write(stream, version, displayedmaponly);\n\n   m_poly_connections.write(stream);\n   m_radial_lines.write(stream);\n\n   return true;\n}\n\nbool ShapeGraph::write( std::ostream& stream, int version )\n{\n   // note keyvertexcount and keyvertices are different things!  (length keyvertices not the same as keyvertexcount!)\n   stream.write((char *)&m_keyvertexcount,sizeof(m_keyvertexcount));\n   int size = m_keyvertices.size();\n   stream.write((char *)&size,sizeof(size));\n   for (size_t i = 0; i < m_keyvertices.size(); i++) {\n      m_keyvertices[i].write(stream);\n   }\n\n   // now simply run base class write:\n   ShapeMap::write(stream,version);\n\n   return true;\n}\n\nAxialPolygons::AxialPolygons()\n{\n   m_pixel_polys = NULL;\n}\n\nAxialPolygons::~AxialPolygons()\n{\n   if (m_pixel_polys) {\n      for (int i = 0; i < m_cols; i++) {\n         delete [] m_pixel_polys[i];\n      }\n      delete [] m_pixel_polys;\n      m_pixel_polys = NULL;\n   }\n}\n\nShapeGraph::ShapeGraph(const std::string& name, int type) : ShapeMap(name,type)\n{\n   m_keyvertexcount = 0;\n   m_hasgraph = true;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/axialmap.h",
    "content": "#pragma once\n\n#include \"mgraph440/spacepix.h\"\n#include \"mgraph440/shapemap.h\"\n#include \"mgraph440/connector.h\"\n\nnamespace mgraph440 {\n\nstruct AxialVertexKey\n{\n   int m_ref_key;\n   short m_ref_a;\n   short m_ref_b;\n   AxialVertexKey(int ref = -1, short a = -1, short b = -1)\n   { m_ref_key = ref; m_ref_a = a; m_ref_b = b; }\n   friend bool operator == (const AxialVertexKey& a, const AxialVertexKey& b);\n   friend bool operator != (const AxialVertexKey& a, const AxialVertexKey& b);\n   friend bool operator > (const AxialVertexKey& a, const AxialVertexKey& b);\n   friend bool operator < (const AxialVertexKey& a, const AxialVertexKey& b);\n};\ninline bool operator == (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key == b.m_ref_key && a.m_ref_a == b.m_ref_a && a.m_ref_b == b.m_ref_b); }\ninline bool operator != (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key != b.m_ref_key || a.m_ref_a != b.m_ref_a || a.m_ref_b != b.m_ref_b); }\ninline bool operator > (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key > b.m_ref_key || (a.m_ref_key == b.m_ref_key && (a.m_ref_a > b.m_ref_a || (a.m_ref_a == b.m_ref_a && a.m_ref_b > b.m_ref_b)))); }\ninline bool operator < (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key < b.m_ref_key || (a.m_ref_key == b.m_ref_key && (a.m_ref_a < b.m_ref_a || (a.m_ref_a == b.m_ref_a && a.m_ref_b < b.m_ref_b)))); }\n\nconst AxialVertexKey NoVertex(-1,-1,-1);\n\nstruct RadialKey {\n   AxialVertexKey vertex;\n   float ang;\n   bool segend;\n   // padding the remaining three bytes behind the bool - don't use int : 24 as this will grab the next 4 byte block\n   char pad1 : 8;\n   short pad2 : 16;\n\n   RadialKey(const AxialVertexKey& v = NoVertex, float a = -1.0f, bool se = false) : pad1(0), pad2(0)\n   { vertex = v; ang = a; segend = se; }\n   RadialKey(const RadialKey& rk) : pad1(0), pad2(0)\n   { vertex = rk.vertex; ang = rk.ang; segend = rk.segend; }\n   friend bool operator < (const RadialKey& a, const RadialKey& b);\n   friend bool operator > (const RadialKey& a, const RadialKey& b);\n   friend bool operator == (const RadialKey& a, const RadialKey& b);\n};\ninline bool operator < (const RadialKey& a, const RadialKey& b)\n{ return a.vertex < b.vertex || (a.vertex == b.vertex && (a.ang < b.ang || (a.ang == b.ang && a.segend < b.segend))); }\ninline bool operator > (const RadialKey& a, const RadialKey& b)\n{ return a.vertex > b.vertex || (a.vertex == b.vertex && (a.ang > b.ang || (a.ang == b.ang && a.segend > b.segend))); }\ninline bool operator == (const RadialKey& a, const RadialKey& b)\n{ return a.vertex == b.vertex && a.ang == b.ang && a.segend == b.segend; }\n\nstruct RadialLine : public RadialKey\n{\n   Point2f openspace;\n   Point2f keyvertex;\n   Point2f nextvertex;\n   RadialLine(const RadialKey& rk = RadialKey()) : RadialKey(rk) {;}\n   RadialLine(const AxialVertexKey& v, bool se, const Point2f& o, const Point2f& k, const Point2f& n)\n   { vertex = v; ang = (float) angle(o,k,n); segend = se; openspace = o; keyvertex = k; nextvertex = n; }\n   RadialLine(const RadialLine& rl) : RadialKey(rl)\n   { openspace = rl.openspace; keyvertex = rl.keyvertex; nextvertex = rl.nextvertex; }\n   bool cuts(const Line& l) const;\n};\nstruct PolyConnector {\n   Line line;\n   RadialKey key;\n   PolyConnector(const Line& l = Line(), const RadialKey& k = RadialKey())\n   { line = l; key = k; }\n};\nstruct AxialVertex : public AxialVertexKey\n{\n   Point2f m_point;\n   Point2f m_openspace;\n   Point2f m_a;\n   Point2f m_b;\n   bool m_clockwise;\n   bool m_convex;\n   bool m_initialised;\n   bool m_axial;\n   AxialVertex(const AxialVertexKey& vertex_key = NoVertex, const Point2f& point = Point2f(), const Point2f& openspace = Point2f()) : AxialVertexKey(vertex_key)\n   { m_point = point; m_openspace = openspace; m_initialised = false; m_axial = false; }\n};\n\nclass AxialPolygons : public SpacePixel\n{\n   friend class ShapeGraphs;\npublic:\n   pqmap<Point2f,pqvector<Point2f>> m_vertex_possibles;\n   pvecint m_vertex_polys;\n   pvecint **m_pixel_polys;\n   pqvector<AxialVertex> m_handled_list;\n   AxialPolygons();\n   virtual ~AxialPolygons();\n\n   void clear();\n   void init(prefvec<Line>& lines, const QtRegion& region);\n   void makeVertexPossibles(const prefvec<Line>& lines, const prefvec<Connector>& connectionset);\n   void makePixelPolys();\n   //\n   AxialVertex makeVertex(const AxialVertexKey& vertexkey, const Point2f& openspace);\n   // find a polygon corner visible from seed:\n   AxialVertexKey seedVertex(const Point2f& seed);\n   // make axial lines from corner vertices, visible from openspace\n   void makeAxialLines(pqvector<AxialVertex>& openvertices, prefvec<Line>& lines, prefvec<pvecint>& keyvertices, prefvec<PolyConnector>& poly_connections, pqvector<RadialLine>& radial_lines);\n   // extra: make all the polygons possible from the set of m_vertex_possibles\n   void makePolygons(prefvec<pqvector<Point2f>>& polygons);\n};\n\nclass ShapeGraph : public ShapeMap\n{\n   friend class ShapeGraphs;\n   friend class AxialMinimiser;\n   friend class MapInfoData;\npublic:\n   ShapeGraph(const std::string& name = \"<axial map>\", int type = ShapeMap::AXIALMAP);\n   virtual ~ShapeGraph() {;}\n\n   prefvec<pvecint> m_keyvertices;       // but still need to return keyvertices here\n   int m_keyvertexcount;\n   bool outputMifPolygons(std::ostream& miffile, std::ostream& midfile) const;\n   void outputNet(std::ostream& netfile) const;\n   virtual bool read( std::ifstream& stream, int version );\n   bool readold( std::ifstream& stream, int version );\n   virtual bool write(std::ostream &stream, int version );\n};\n\nclass ShapeGraphs : public ShapeMaps<ShapeGraph>\n{\npublic:\n   // helpful to know this for creating fewest line maps, although has to be reread at input\n   int m_all_line_map;\n   // For all line map work:\n   AxialPolygons m_polygons;\n   prefvec<PolyConnector> m_poly_connections;\n   pqvector<RadialLine> m_radial_lines;\n   ShapeGraphs() { m_all_line_map = -1; }\n   virtual ~ShapeGraphs() {;}\n   bool read( std::ifstream& stream, int version );\n   bool readold( std::ifstream& stream, int version );\n   bool write( std::ostream& stream, int version, bool displayedmaponly = false );\n};\n\n}\n"
  },
  {
    "path": "mgraph440/bspnode.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010 University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"mgraph440/paftl.h\"\n#include \"mgraph440/p2dpoly.h\"\n\n// Binary Space Partition\n\nnamespace mgraph440 {\n\nstruct BSPNode\n{\npublic:\n   enum { BSPLEFT, BSPRIGHT };\n   BSPNode *left;\n   BSPNode *right;\n   BSPNode *parent;\n   Line line;\n   int m_tag;\n   int m_count;\n   //\npublic:\n   BSPNode()\n   { left = NULL; right = NULL; parent = NULL; m_count = 0; m_tag = -1; }\n   virtual ~BSPNode()\n   { if (left) delete left; left = NULL; if (right) delete right; right = NULL; }\n   //\n   bool isLeaf() {\n      return left == NULL && right == NULL;\n   }\n   void make(Communicator *communicator, time_t atime, const prefvec<TaggedLine>& lines, BSPNode *par);\n   int classify(const Point2f& p);\n   const Line& getLine() const { return line; }\n   int getTag() const { return m_tag; }\n};\n\n}\n"
  },
  {
    "path": "mgraph440/comm.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef __COMM_H__\n#define __COMM_H__\n\n//#include <io.h>\n#include <sys/types.h>\n#include <sys/timeb.h>\n#include <vector>\n#include <string>\n#include <fstream>\n\n#ifdef _WIN32\n// Quick mod - TV\n#pragma warning (disable: 4244)\n#pragma warning (disable: 4100)\n#else\n\n#endif\n\nnamespace mgraph440 {\n\n    const char *const g_default_file_set = \"File set\";\n\nstruct FilePath {\n   std::string m_path;\n   std::string m_name;\n   std::string m_ext;\n   FilePath(const std::string& pathname)\n   {\n      size_t dot   = pathname.find_last_of('.');\n#ifdef _WIN32\n      size_t slash = pathname.find_last_of('\\\\'); // WIN32\n#else\n      size_t slash = pathname.find_last_of('/'); // Other\n#endif\n      if (slash != std::string::npos) {\n         m_path = pathname.substr(0,slash+1);\n      }\n      if (dot != std::string::npos) {\n         m_name = pathname.substr(slash+1,dot-slash-1);\n         m_ext = pathname.substr(dot+1);\n      }\n      else {\n         m_name = pathname.substr(slash+1);\n      }\n   }\n};\n\nclass Communicator\n{\npublic:\n   class CancelledException  // throw from your class\n   {\n   public:\n      CancelledException() {;}\n   };\n   enum { NUM_STEPS, CURRENT_STEP, NUM_RECORDS, CURRENT_RECORD };\nprotected:\n   bool m_cancelled;\n   bool m_delete_flag;\n   // nb. converted to Win32 UTF-16 Unicode path (AT 31.01.11) Linux, MacOS use UTF-8 (AT 29.04.11)\n   std::string m_infilename;\n   std::ifstream *m_infile;\n   std::ifstream *m_infile2; // <- MapInfo MIF files come in two parts\n   std::ofstream *m_outfile;\n   // nb. converted to Win32 UTF-16 Unicode path (AT 31.01.11) Linux, MacOS use UTF-8 (AT 29.04.11)\n   std::vector<std::string> m_fileset;   // <- sometimes you want to load a whole set of files\npublic:\n   Communicator()\n   { m_infile = NULL; m_infile2 = NULL; m_outfile = NULL; m_cancelled = false; m_delete_flag = false; }\n   //\n   bool GetDeleteFlag() // used by ICommunicator and IComm together\n   { return m_delete_flag; }\n   //\n   virtual ~Communicator()\n   { if (m_infile) delete m_infile; m_infile = NULL;\n     if (m_infile2) delete m_infile2; m_infile2 = NULL;\n     if (m_outfile) delete m_outfile; m_outfile = NULL; }\n   //\n   void SetInfile( const char* filename )\n   {\n      m_infile = new std::ifstream( filename );\n      FilePath fp(filename);\n      m_infilename = fp.m_name;\n   }\n   void SetInfile2( const char* filename )\n   {\n      m_infile2 = new std::ifstream( filename );\n   }\n   std::string GetInfileName()\n   {\n      return m_fileset.size() ? std::string(g_default_file_set) : m_infilename;\n   }\n   std::string GetMBInfileName()\n   {\n      std::string ret;\n      if (m_fileset.size()) {\n         ret = \"File set\";\n      }\n      else {\n         ret = std::string(m_infilename.c_str());\n      }\n      return ret;\n   }\n   size_t GetInfileSize()\n   {\n      if (m_infile) {\n         m_infile->seekg(0, std::ios::beg);\n         size_t begin_pos = m_infile->tellg();\n         m_infile->seekg(0, std::ios::end);\n         size_t end_pos = m_infile->tellg();\n         m_infile->seekg(0, std::ios::beg);\n         return size_t(end_pos - begin_pos);\n      }\n      return 0;\n   }\n   void SetOutfile( const char *filename )\n   { m_outfile = new std::ofstream( filename ); }\n   //\n   bool IsCancelled() const\n   { return m_cancelled; }\n   void Cancel()\n   { m_cancelled = true; }\n   //\n   operator std::ofstream& ()\n   { return *m_outfile; }\n   operator std::ifstream& ()\n   { return *m_infile; }\n   std::ifstream& GetInfile2()\n   { return *m_infile2; }\n   //\n   const std::vector<std::string>& GetFileSet() const\n   { return m_fileset; }\n   //\n   virtual void CommPostMessage(int m, int x, int y = 0) const = 0; // Override for specific operating system\n};\n\n// this is a simple version of the Communicator which can be used for\n// an interface\n\nclass ICommunicator : public Communicator\n{\n   friend class IComm; // IComm is found in idepthmap.h\n   //\nprotected:\n   mutable int num_steps;\n   mutable int num_records;\n   mutable int step;\n   mutable int record;\n   //\npublic:\n        ICommunicator() { m_delete_flag = true; } // note: an ICommunicator lets IComm know that it should delete it\n        virtual ~ICommunicator() {;}\n   virtual void CommPostMessage(int m, int x) const;\n};\n\ninline void ICommunicator::CommPostMessage(int m, int x) const\n{\n        switch (m) {\n                case Communicator::NUM_STEPS:\n                        num_steps = x;\n                        break;\n                case Communicator::CURRENT_STEP:\n                        step = x;\n                        break;\n                case Communicator::NUM_RECORDS:\n                        num_records = x;\n                        break;\n                case Communicator::CURRENT_RECORD:\n                        record = x;\n                        break;\n        default:\n            break;\n    }\n}\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/connector.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include <mgraph440/paftl.h>\n\n#include \"mgraph440/mgraph_consts.h\"\n#include <mgraph440/connector.h>\n#include <math.h>\n#include <float.h>\n#include <time.h>\n\nnamespace mgraph440 {\n\nbool Connector::read( ::std::ifstream& stream, int version, pvecint *keyvertices )\n{\n   m_connections.clear();\n   m_forward_segconns.clear();\n   m_back_segconns.clear();\n\n   // n.b., must set displayed attribute as soon as loaded...\n   m_connections.read(stream);\n\n   // keyvertices now stored with axial map itself, but need this read for backward compatibility\n   if (version < VERSION_AXIAL_SHAPES && keyvertices != NULL) {\n      keyvertices->read(stream);\n   }\n\n   if (version >= VERSION_SEGMENT_MAPS) {\n      stream.read((char *)&m_segment_axialref, sizeof(m_segment_axialref));\n      m_forward_segconns.read(stream);\n   }\n   if (version >= VERSION_SEGMENT_MAPS_FIX) {\n      m_back_segconns.read(stream);\n   }\n\n   return true;\n}\n\nbool Connector::write( ::std::ostream& stream )\n{\n   // n.b., must set displayed attribute as soon as loaded...\n   m_connections.write(stream);\n   // m_keyvertices.write(stream);\n   stream.write((char *)&m_segment_axialref, sizeof(m_segment_axialref));\n   m_forward_segconns.write(stream);\n   m_back_segconns.write(stream);\n\n   return true;\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n\n// Cursor extras\n\nint Connector::count(int mode) const\n{\n   int c = 0;\n   switch (mode) {\n   case CONN_ALL:\n      c = m_connections.size();\n      break;\n   case SEG_CONN_ALL:\n      c = m_back_segconns.size() + m_forward_segconns.size();\n      break;\n   case SEG_CONN_FW:\n      c = m_forward_segconns.size();\n      break;\n   case SEG_CONN_BK:\n      c = m_back_segconns.size();\n      break;\n   }\n   return c;\n}\nint Connector::cursor(int mode) const\n{\n   int cur = -1;\n   if (m_cursor != -1) {\n      switch (mode) {\n      case CONN_ALL:\n         if (m_cursor < (int)m_connections.size()) {\n            cur = m_connections[m_cursor];\n         }\n         break;\n      case SEG_CONN_ALL:\n         if (m_cursor < (int)m_back_segconns.size()) {\n            cur = m_back_segconns.key(m_cursor).ref;\n         }\n         else if (m_cursor - m_back_segconns.size() < m_forward_segconns.size()) {\n            cur = m_forward_segconns.key(m_cursor - m_back_segconns.size()).ref;\n         }\n         break;\n      case SEG_CONN_FW:\n         if (m_cursor < (int)m_forward_segconns.size()) {\n            cur = m_forward_segconns.key(m_cursor).ref;\n         }\n         break;\n      case SEG_CONN_BK:\n         if (m_cursor < (int)m_back_segconns.size()) {\n            cur = m_back_segconns.key(m_cursor).ref;\n         }\n         break;\n      }\n   }\n   if (cur == -1) {\n      m_cursor = -1;\n   }\n   return cur;\n}\nint Connector::direction(int mode) const\n{\n   int direction = 0;\n   if (m_cursor != -1) {\n      switch (mode) {\n      case SEG_CONN_ALL:\n         if (m_cursor < (int)m_back_segconns.size()) {\n            direction = m_back_segconns.key(m_cursor).dir;\n         }\n         else if (m_cursor - m_back_segconns.size() < m_forward_segconns.size()) {\n            direction = m_forward_segconns.key(m_cursor - m_back_segconns.size()).dir;\n         }\n         break;\n      case SEG_CONN_FW:\n         direction = m_forward_segconns.key(m_cursor).dir;\n         break;\n      case SEG_CONN_BK:\n         direction = m_back_segconns.key(m_cursor).dir;\n         break;\n      }\n   }\n   return direction;\n}\nfloat Connector::weight(int mode) const\n{\n   float weight = 0.0f;\n   if (m_cursor != -1) {\n      switch (mode) {\n      case SEG_CONN_ALL:\n         if (m_cursor < (int)m_back_segconns.size()) {\n            weight = m_back_segconns.value(m_cursor);\n         }\n         else if (m_cursor - m_back_segconns.size() < m_forward_segconns.size()) {\n            weight = m_forward_segconns.value(m_cursor - m_back_segconns.size());\n         }\n         break;\n      case SEG_CONN_FW:\n         weight = m_forward_segconns.value(m_cursor);\n         break;\n      case SEG_CONN_BK:\n         weight = m_back_segconns.value(m_cursor);\n         break;\n      }\n   }\n   return weight;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/connector.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#ifndef __CONNECTOR_H__\n#define __CONNECTOR_H__\n\n#include \"mgraph440/paftl.h\"\n/////////////////////////////////////////////////////////////////////////////\n\n// Additional for segment analysis\n\nnamespace mgraph440 {\n\nstruct SegmentRef\n{\n   char dir; int ref;\n   SegmentRef(char d = 0, int r = -1)\n   { dir = d; ref = r; }\n   friend bool operator < (SegmentRef a, SegmentRef b);\n   friend bool operator > (SegmentRef a, SegmentRef b);\n   friend bool operator == (SegmentRef a, SegmentRef b);\n   friend bool operator != (SegmentRef a, SegmentRef b);\n};\n// note, the dir is only a direction indicator, the ref should always be unique\ninline bool  operator < (SegmentRef a, SegmentRef b) { return a.ref < b.ref; }\ninline bool operator > (SegmentRef a, SegmentRef b)  { return a.ref > b.ref; }\ninline bool operator == (SegmentRef a, SegmentRef b) { return a.ref == b.ref; }\ninline bool operator != (SegmentRef a, SegmentRef b) { return a.ref != b.ref; }\n\n// used during angular analysis\nstruct SegmentData : public SegmentRef\n{\n   SegmentRef previous;\n   int segdepth;\n   float metricdepth;\n   unsigned int coverage;\n   SegmentData(char d = 0, int r = -1, SegmentRef p = SegmentRef(), int sd = 0, float md = 0.0f, unsigned int cv = 0xffffffff)\n   { dir = d; ref = r; previous = p; segdepth = sd; metricdepth = md; coverage = cv; }\n   SegmentData(SegmentRef ref, SegmentRef p = SegmentRef(), int sd = 0, float md = 0.0f, unsigned int cv = 0xffffffff) : SegmentRef(ref)\n   { previous = p; segdepth = sd; metricdepth = md; coverage = cv; }\n   friend bool operator < (SegmentData a, SegmentData b);\n   friend bool operator > (SegmentData a, SegmentData b);\n   friend bool operator == (SegmentData a, SegmentData b);\n   friend bool operator != (SegmentData a, SegmentData b);\n};\n// note, these are stored in reverse metric depth order (i.e., metric shorter paths are taken off the end of the list first)\ninline bool operator < (SegmentData a, SegmentData b)  { return a.metricdepth > b.metricdepth; }\ninline bool operator > (SegmentData a, SegmentData b)  { return a.metricdepth < b.metricdepth; }\ninline bool operator == (SegmentData a, SegmentData b) { return a.metricdepth == b.metricdepth; }\ninline bool operator != (SegmentData a, SegmentData b) { return a.metricdepth != b.metricdepth; }\n\n///////////////////////////////////////////////////////////////////////////\n\n// Main connector class for segments, convex spaces or axial lines\n\nstruct Connector\n{\n   // cursor included purely to make this compatible with DLL functionality\n   mutable int m_cursor;\n   //  if this is a segment, this is the key for the axial line:\n   int m_segment_axialref;\n   // use one or other of these\n   pvecint m_connections;\n   //\n   pmap<SegmentRef,float> m_back_segconns;\n   pmap<SegmentRef,float> m_forward_segconns;\n   //\n   Connector(int axialref = -1)\n   { m_segment_axialref = axialref; m_cursor = -1; }\n   void clear()\n   { m_connections.clear(); m_back_segconns.clear(); m_forward_segconns.clear(); }\n   //\n   bool read( ::std::ifstream& stream, int version, pvecint *keyvertices = NULL );\n   bool write(std::ostream &stream );\n   //\n   // Cursor extras\n   enum { CONN_ALL, SEG_CONN_ALL, SEG_CONN_FW, SEG_CONN_BK };\n   int count(int mode = CONN_ALL) const;\n   int cursor(int mode = CONN_ALL) const;\n   int direction(int mode = SEG_CONN_ALL) const;\n   float weight(int mode = SEG_CONN_ALL) const;\n   void first() const { m_cursor = 0; }\n   void next() const { m_cursor++; }\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/containerutils.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2017, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\nnamespace depthmapX440 {\n\ntemplate<typename T>\nvoid findAndErase(std::vector<T> &vec, T element) {\n    auto it = std::find(vec.begin(), vec.end(), element);\n    if(it != vec.end())\n        vec.erase(it);\n}\n\ntemplate<typename T>\nvoid addIfNotExists(std::vector<T> &vec, T element) {\n    auto it = std::find(vec.begin(), vec.end(), element);\n    if(it == vec.end())\n        vec.push_back(element);\n}\n\n}\n"
  },
  {
    "path": "mgraph440/datalayer.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// THIS CODE IS DEPRECATED DO NOT USE: USE SHAPE MAPS INSTEAD 21.08.05\n\n// INCLUDED ONLY TO ALLOW COMPATIBILITY WITH OLD VERSIONS\n\n// DataLayer.cpp: implementation of the DataLayer class.\n//\n//////////////////////////////////////////////////////////////////////\n\n#include <math.h>\n\n#include <mgraph440/mgraph.h>\n#include <mgraph440/datalayer.h>\n#include \"mgraph440/stringutils.h\"\n\nnamespace mgraph440 {\n\nbool DataLayers::read(std::ifstream& stream, int version)\n{\n   m_layers.clear();\n   stream.read( (char *) &m_current_layer_index, sizeof(int) );\n   int size;\n   stream.read( (char *) &size, sizeof(int) );\n   for (int i = 0; i < size; i++) {\n      DataLayer data;\n      m_layers.push_back(data);\n      m_layers.tail().read(stream, version);\n   }\n   return true;\n}\n\n////////////////////////////////////////////////////////\n\nvoid DataLayer::setDisplayColumn(int i)\n{\n   if (i == 0) {\n      for (size_t j = 0; j < m_data_objects.size(); j++) {\n         m_data_objects[j].m_color = float(j + 1) / m_data_objects.size();\n      }\n      m_display_min = 0;\n      m_display_max = m_data_objects.size();\n   }\n   else if (m_data_objects.size()) {\n      double max = m_data_objects[0][i-1], min = m_data_objects[0][i-1];\n      for (size_t j = 1; j < m_data_objects.size(); j++) {\n         if (m_data_objects[j][i-1] < min) {\n            min = m_data_objects[j][i-1];\n         }\n         else if (m_data_objects[j][i-1] > max) {\n            max = m_data_objects[j][i-1];\n         }\n      }\n      for (size_t k = 0; k < m_data_objects.size(); k++) {\n         m_data_objects[k].m_color = (float) ((m_data_objects[k][i-1] - min) / (max - min));\n      }\n      m_display_min = min;\n      m_display_max = max;\n   }\n   m_display_column = i;\n}\n\nbool DataLayer::read(std::ifstream& stream, int version)\n{\n   m_data_objects.clear();\n   m_column_titles.clear();\n   stream.read( (char *) &m_layer_ref, sizeof(int) );\n   m_layer_name = dXstring440::readString(stream);\n   stream.read( (char *) &m_next_object_ref, sizeof(int) );\n   int rows_size;\n   stream.read( (char *) &rows_size, sizeof(int) );\n   for (int i = 0; i < rows_size; i++) {\n      DataObject object;\n      m_data_objects.push_back(object);\n      m_data_objects.tail().read(stream,version);\n   }\n   int columns_size;\n   stream.read( (char *) &columns_size, sizeof(int) );\n   for (int j = 0; j < columns_size; j++) {\n      m_column_titles.push_back(dXstring440::readString(stream));\n   }\n\n   // Since it doesn't seem to be recorded, just display the initial column\n   setDisplayColumn(0);\n\n   return true;\n}\n\nbool DataLayer::output(std::ofstream& stream)\n{\n   stream << \"Ref\" << \"\\t\" << \"x\" << \"\\t\" << \"y\" << \"\\t\";\n   for (size_t i = 0; i < m_column_titles.size(); i++) {\n      stream << m_column_titles[i] << \"\\t\";\n   }\n   stream << std::endl;\n\n   for (size_t j = 0; j < m_data_objects.size(); j++) {\n      stream.precision(12);\n      stream << j << \"\\t\" << m_data_objects[j].getCentroid().x << \"\\t\" << m_data_objects[j].getCentroid().y << \"\\t\";\n      stream.precision(7);\n      for (size_t k = 0; k < m_column_titles.size(); k++) {\n         stream << m_data_objects[j].m_data_cols[k] << \"\\t\";\n      }\n      stream << std::endl;\n   }\n\n   return true;\n}\n\n//////////////////////////////////////////////////////////////\n\nbool DataObject::read(std::ifstream& stream, int version)\n{\n   stream.read( (char *) &m_object_ref, sizeof(int) );\n   m_object_name = dXstring440::readString(stream);\n   m_data_cols.read(stream);\n   if (version >= VERSION_LAYERS_CENTROID_INTROD) {\n      stream.read( (char *) &m_centroid, sizeof(Point2f) );\n   }\n   // default values for selection / output color\n   m_selected = false;\n   m_color = 0.0f;\n\n   return true;\n}\n\nbool DataObject::write(std::ostream& stream)\n{\n   stream.write( (char *) &m_object_ref, sizeof(int) );\n   dXstring440::writeString(stream, m_object_name);\n   m_data_cols.write(stream);\n   stream.write( (char *) &m_centroid, sizeof(Point2f) );\n   return true;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/datalayer.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n// THIS CODE IS DEPRECATED DO NOT USE: USE SHAPE MAPS INSTEAD 21.08.05\n\n// INCLUDED ONLY TO ALLOW COMPATIBILITY WITH OLD VERSIONS\n\n// DataLayer.h: interface for the DataLayer class.\n//\n//////////////////////////////////////////////////////////////////////\n\n#ifndef __DATA_LAYER_H__\n#define __DATA_LAYER_H__\n\nnamespace mgraph440 {\n\n// a layer object, e.g., a gate or a room\n\nclass DataException {\npublic:\n   enum {UNDEFINED, LAYER_HAS_COLUMNS};\nprotected:\n   int m_exception;\npublic:\n   DataException(int e = 0) {\n      m_exception = e;\n   }\n   int errorCode() {\n      return m_exception;\n   }\n};\n\nclass DataObject\n{\n   friend class DataLayer;\nprotected:\n   int m_object_ref;\n   std::string m_object_name;\n   Point2f m_centroid;\n   pvecdouble m_data_cols;\n   float m_color;\n   bool m_selected;\npublic:\n   DataObject(int ref = 0, const std::string& name = std::string()) {\n      m_object_ref = ref;\n      m_object_name = name;\n      m_selected = false;\n      m_color = 0.0f;\n   }\n   double& operator [] (int i) {\n      return m_data_cols[i];\n   }\n   const double& operator [] (int i) const {\n      return m_data_cols[i];\n   }\n   int size() const {\n      return (int) m_data_cols.size();\n   }\n   void setCentroid(const Point2f& p) {\n      m_centroid = p;\n   }\n   const Point2f& getCentroid() const {\n      return m_centroid;\n   }\n   float getColor() const {\n      return m_color;\n   }\n   bool isSelected() const {\n      return m_selected;\n   }\n   void setSelected(bool on = true) {\n      m_selected = on;\n   }\n   //\n   friend bool operator == (const DataObject& a, const DataObject& b);\n   friend bool operator != (const DataObject& a, const DataObject& b);\n   friend bool operator <  (const DataObject& a, const DataObject& b);\n   friend bool operator >  (const DataObject& a, const DataObject& b);\n   //\n   bool read( std::ifstream& stream, int version );\n   bool write(std::ostream &stream );\n};\n\ninline bool operator == (const DataObject& a, const DataObject& b) {\n   return a.m_object_ref == b.m_object_ref;\n}\ninline bool operator != (const DataObject& a, const DataObject& b) {\n   return a.m_object_ref != b.m_object_ref;\n}\ninline bool operator <  (const DataObject& a, const DataObject& b) {\n   return a.m_object_ref < b.m_object_ref;\n}\ninline bool operator >  (const DataObject& a, const DataObject& b) {\n   return a.m_object_ref > b.m_object_ref;\n}\n\nclass DataLayer\n{\nprotected:\n   int m_layer_ref;\n   std::string m_layer_name;\n   int m_next_object_ref;\n   pqvector<DataObject> m_data_objects;\n   std::vector<std::string> m_column_titles;\n   int m_display_column;\npublic:\n   DataLayer(int ref = -1, const std::string& name = std::string()) {\n      m_layer_ref = ref;\n      m_layer_name = name;\n      m_next_object_ref = -1;\n      m_display_column = 0; // n.b. display column 0 is ref... always present\n   }\n   // Display column used to just set a column to display:\n   // now it recalculates the colours too\n   void setDisplayColumn(int i);\n   //\n   int addObject() {\n      m_data_objects.push_back(DataObject(++m_next_object_ref));\n      for (size_t i = 0; i < m_column_titles.size(); i++) {\n         // this used to be a problem so I was throwing an exception\n         // throw LayerException(LayerException::LAYER_HAS_COLUMNS);\n         // but I decided just to fill the object with blanks instead:\n         m_data_objects.tail().m_data_cols.push_back(0.0);\n         m_data_objects.tail().m_color = 0.0;   // <- range 0 to 1\n      }\n      setDisplayColumn(m_display_column);\n      return m_next_object_ref;\n   }\n   void clear() {\n      m_data_objects.clear();\n      m_next_object_ref = -1;\n      m_display_column = 0;\n      m_column_titles.clear();\n   }\n   void clearSel() {\n      for (size_t i = 0; i < m_data_objects.size(); i++) {\n         m_data_objects[i].setSelected(false);\n      }\n   }\n   DataObject& operator [] (size_t i) {\n      return m_data_objects[i];\n   }\n   const DataObject& operator [] (size_t i) const {\n      return m_data_objects[i];\n   }\n   int getLayerRef() const\n   { return m_layer_ref; }\n   void setLayerName(const std::string& name)\n   { m_layer_name = name; }\n   const std::string& getLayerName() const\n   { return m_layer_name; }\n   //\n   int addColumn(std::string title) {\n      // probably ought to insert -1.0 to be consistent with -1.0 nulls in attributes tables\n      // but for the time being it's easier to set to 0.0\n      // -- and helps as agent trace / collision counts should default to 0.0\n      // -- and helps for push column to layer\n      auto iter = std::find(m_column_titles.begin(), m_column_titles.end(), title);\n      if (iter != m_column_titles.end()) {\n         size_t index = iter - m_column_titles.begin();\n         for (size_t i = 0; i < m_data_objects.size(); i++) {\n            m_data_objects[i][index] = 0.0;\n         }\n         return (int) index;\n      }\n      m_column_titles.push_back(title);\n      for (size_t i = 0; i < m_data_objects.size(); i++) {\n         m_data_objects[i].m_data_cols.push_back(0.0);\n      }\n      return (int) m_column_titles.size() - 1;\n   }\n   void delColumn(int col) {\n      m_column_titles.erase(m_column_titles.begin() + col);\n      for (size_t i = 0; i < m_data_objects.size(); i++) {\n         m_data_objects[i].m_data_cols.remove_at(col);\n      }\n   }\n   void setColumnTitle(int i, std::string& name) {\n      m_column_titles[i] = name;\n   }\n   std::string& getColumnTitle(int i) {\n      return m_column_titles[i];\n   }\n   int getColumnIndex(const std::string& title) {\n      auto iter = std::find(m_column_titles.begin(), m_column_titles.end(), title);\n      return (iter  == m_column_titles.end() ? -1 : int(iter - m_column_titles.begin())); // note: must convert to -1\n   }\n   int getColumnCount() {\n      return (int) m_column_titles.size();\n   }\n   int getObjectCount() {\n      return (int) m_data_objects.size();\n   }\npublic:\n   // temporarily public!\n   // min and max values displayed:\n   double m_display_min;\n   double m_display_max;\n   // and the average value displayed:\n   double m_display_avg;\npublic:\n   int getDisplayColumn() {\n      return m_display_column; // nb, 0 is used for ref... always present\n   }\n   float getObjectValue(int object_ref) {\n      if (m_display_column == 0) return (float)object_ref;\n      else return (float)m_data_objects[object_ref].m_data_cols[m_display_column-1];\n   }\n   std::string getObjectText(int object_ref) {\n      char val[16];\n      if (m_display_column == 0) sprintf(val,\"%d\",object_ref);\n      else sprintf(val,\"%g\",m_data_objects[object_ref].m_data_cols[m_display_column-1]);\n      return val;\n   }\n   PafColor getObjectColor(int object_ref) {\n      PafColor color;\n      return color.makeColor(m_data_objects[object_ref].m_color, DisplayParams());\n   }\n   //\n   friend bool operator == (const DataLayer& a, const DataLayer& b);\n   friend bool operator != (const DataLayer& a, const DataLayer& b);\n   friend bool operator <  (const DataLayer& a, const DataLayer& b);\n   friend bool operator >  (const DataLayer& a, const DataLayer& b);\n   //\n   bool read( std::ifstream& stream, int version );\n   bool write( std::ofstream& stream );\n   bool output( std::ofstream& stream );\n};\n\ninline bool operator == (const DataLayer& a, const DataLayer& b) {\n   return a.m_layer_ref == b.m_layer_ref;\n}\ninline bool operator != (const DataLayer& a, const DataLayer& b) {\n   return a.m_layer_ref != b.m_layer_ref;\n}\ninline bool operator <  (const DataLayer& a, const DataLayer& b) {\n   return a.m_layer_ref < b.m_layer_ref;\n}\ninline bool operator >  (const DataLayer& a, const DataLayer& b) {\n   return a.m_layer_ref > b.m_layer_ref;\n}\n\nclass DataLayers\n{\npublic:\n   // standard types I've thought of so far\n   // Note that BOUNDARIES comprise blocked locations (which may or may not be visibility graph members)\n   enum { GATES = 0, ATTRACTORS = 1, GENERATORS = 2, BOUNDARIES = 3 };\nprotected:\n   int m_current_layer_index;\n   pqvector<DataLayer> m_layers;\npublic:\n   DataLayers() {;}\n   bool addLayer(int layer_ref, const std::string& layer_name) {\n      size_t index = m_layers.searchindex(layer_ref);\n      if (index != paftl::npos) {\n         m_layers.remove_at(index);\n      }\n      m_current_layer_index = (int) m_layers.add(DataLayer(layer_ref,layer_name));\n      return true;\n   }\n   bool layerExists(int layer_ref) {\n      size_t index = m_layers.searchindex(layer_ref);\n      return (index != paftl::npos);\n   }\n   bool setCurrentLayerRef(int ref) {\n      size_t index = m_layers.searchindex(ref);\n      if (index == paftl::npos) {\n         return false;\n      }\n      m_current_layer_index = (int) index;\n      return true;\n   }\n   int getCurrentLayerRef() const {\n      return m_layers[m_current_layer_index].getLayerRef();\n   }\n   int getLayerRef(int i) const {\n      return m_layers[i].getLayerRef();\n   }\n   DataLayer& getLayer(int layer_ref) {\n      return m_layers.search(layer_ref);\n   }\n   const DataLayer& getLayer(int layer_ref) const {\n      return m_layers.search(layer_ref);\n   }\n   DataLayer& operator [] (int i) {\n      return m_layers[i];\n   }\n   const DataLayer& operator [] (int i) const {\n      return m_layers[i];\n   }\n   DataLayer& getCurrentLayer() {\n      return m_layers[m_current_layer_index];\n   }\n   const DataLayer& getCurrentLayer() const {\n      return m_layers[m_current_layer_index];\n   }\n   int getLayerCount() const {\n      return (int) m_layers.size();\n   }\n   //\n   bool read( std::ifstream& stream, int version );\n   bool write( std::ofstream& stream );\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/displayparams.h",
    "content": "#pragma once\n\n// For my colour scheme... some parameters to pass, and my own colour class\n\nnamespace mgraph440 {\n\nstruct DisplayParams\n{\n   enum { AXMANESQUE = 0, GREYSCALE = 1, MONOCHROME = 2, DEPTHMAPCLASSIC = 3, PURPLEORANGE = 4, BLUERED = 5 };\n   float blue;\n   float red;\n   int colorscale;\n   DisplayParams()\n   { blue = 0.0f; red = 1.0f; colorscale = 0; }\n};\n\n}\n"
  },
  {
    "path": "mgraph440/exceptions.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef EXCEPTIONS_H\n#define EXCEPTIONS_H\n\n#include <exception>\n\nnamespace depthmapX440\n{\n    class BaseException : public std::exception\n    {\n    public:\n        BaseException(){}\n        BaseException(std::string message) : _message(message)\n        {}\n        virtual const char * what() const noexcept\n        {\n            return _message.c_str();\n        }\n    private:\n        std::string _message;\n    };\n\n    class RuntimeException: public BaseException\n    {\n    public:\n        RuntimeException(std::string message) : BaseException(message)\n        {}\n    };\n}\n#endif // EXCEPTIONS_H\n"
  },
  {
    "path": "mgraph440/fileproperties.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#ifndef __FILEPROPERTIES_H__\n#define __FILEPROPERTIES_H__\n\n#include \"mgraph440/stringutils.h\"\n\nnamespace mgraph440 {\n\nclass FileProperties\n{\nprotected:\n   std::string m_create_person;\n   std::string m_create_organization;\n   std::string m_create_date;\n   std::string m_create_program;\n   std::string m_title;\n   std::string m_location;\n   std::string m_description;\npublic:\n   FileProperties() {;}\n   virtual ~FileProperties() {;}\n   //\n   void setProperties(const std::string& person, const std::string& organization, const std::string& date, const std::string& program)\n   { m_create_person = person; m_create_organization = organization; m_create_date = date; m_create_program = program; }\n   void setTitle(const std::string& title)\n   { m_title = title; }\n   void setLocation(const std::string& location)\n   { m_location = location; }\n   void setDescription(const std::string& description)\n   { m_description = description; }\n   //\n   const std::string& getPerson() const\n   { return m_create_person; }\n   const std::string& getOrganization() const\n   { return m_create_organization; }\n   const std::string& getDate() const\n   { return m_create_date; }\n   const std::string& getProgram() const\n   { return m_create_program; }\n   const std::string& getTitle() const\n   { return m_title; }\n   const std::string& getLocation() const\n   { return m_location; }\n   const std::string& getDescription() const\n   { return m_description; }\n   //\n   bool read( std::ifstream& stream, int version );\n   bool write(std::ostream &stream );\n};\n\ninline bool FileProperties::read(std::ifstream& stream, int version)\n{\n   m_create_person=dXstring440::readString(stream);\n   m_create_organization=dXstring440::readString(stream);\n   m_create_date=dXstring440::readString(stream);\n   m_create_program=dXstring440::readString(stream);\n   m_title=dXstring440::readString(stream);\n   m_location=dXstring440::readString(stream);\n   m_description=dXstring440::readString(stream);\n\n   return true;\n}\n\ninline bool FileProperties::write(std::ostream& stream)\n{\n   dXstring440::writeString(stream, m_create_person);\n   dXstring440::writeString(stream, m_create_organization);\n   dXstring440::writeString(stream, m_create_date);\n   dXstring440::writeString(stream, m_create_program);\n   dXstring440::writeString(stream, m_title);\n   dXstring440::writeString(stream, m_location);\n   dXstring440::writeString(stream, m_description);\n\n   return true;\n}\n\n}\n\n#endif\n\n"
  },
  {
    "path": "mgraph440/legacyconverters.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"mgraph440/paftl.h\"\n\n#include <algorithm>\n#include <map>\n#include <vector>\n\nnamespace genshim440 {\n    using namespace mgraph440;\n    /**\n     * Convert a std::vector to a pvec (preserving the order of elements)\n     * This is expensive as it copies every single element\n     */\n    template <class T> pvector<T> toPVector(const std::vector<T> &vec) {\n        pvector<T> pvec;\n        std::for_each(vec.begin(), vec.end(), [&pvec](const T &val) -> void { pvec.push_back(val); });\n        return pvec;\n    }\n\n    /**\n     * Convert a pvec to a std::vector (preserving the order of elements)\n     * This is expensive as it copies every single element\n     */\n    template <class T> std::vector<T> toSTLVector(pvector<T> &pvec) {\n        std::vector<T> vec;\n        for (int i = 0; i < pvec.size(); i++) {\n            vec.push_back(pvec[i]);\n        }\n        return vec;\n    }\n\n    /**\n     * Convert a std::vector to a pqvector (preserving the order of elements)\n     * This is expensive as it copies every single element\n     */\n    template <class T> pqvector<T> toPQVector(const std::vector<T> &vec) {\n        pqvector<T> pvec;\n        std::for_each(vec.begin(), vec.end(), [&pvec](const T &val) -> void { pvec.push_back(val); });\n        return pvec;\n    }\n\n    /**\n     * Convert a std::vector to a pqvec (preserving the order of elements)\n     * This is expensive as it copies every single element\n     */\n    template <class T> std::vector<T> toSTLVector(pqvector<T> &pqvec) {\n        std::vector<T> vec;\n        for (int i = 0; i < pqvec.size(); i++) {\n            vec.push_back(pqvec[i]);\n        }\n        return vec;\n    }\n\n    /**\n     * Convert a pmap to a std::map\n     * This is expensive as it copies every single element\n     */\n    template <class K, class V> std::map<K, V> toSTLMap(pmap<K, V> &pm) {\n        std::map<K, V> m;\n        for (int i = 0; i < pm.size(); i++) {\n            m.insert(std::make_pair(pm.key(i), pm.value(i)));\n        }\n        return m;\n    }\n\n    /**\n     * Convert a std::map to a pmap (preserving the order of elements)\n     * This is expensive as it copies every single element\n     */\n    template <class K, class V> pmap<K, V> toPMap(const std::map<K, V> &m) {\n        pmap<K, V> pm;\n        for (auto pair : m) {\n            pm.add(pair.first, pair.second);\n        }\n        return pm;\n    }\n} // namespace genshim440\n"
  },
  {
    "path": "mgraph440/mapinfodata.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n\n#ifndef __MAPINFODATA_H__\n#define __MAPINFODATA_H__\n\n#include \"mgraph440/mgraph_consts.h\"\n#include \"mgraph440/stringutils.h\"\n\nnamespace mgraph440 {\n\n// imported and exported data\n// note: this is very basic and designed for axial line import / export only\n\n// MapInfoData is stored with axial map data\n\nclass MapInfoData\n{\n    friend class ShapeGraph;\n    friend class ShapeGraphs;\n    friend class ShapeMap;\n\npublic:\n   std::string m_version;\n   std::string m_charset;\n   char m_delimiter;\n   std::string m_index;\n   std::string m_coordsys;\n   std::string m_bounds;\n\n   std::istream& read(std::istream& stream, int version)\n   {\n      m_version = dXstring440::readString(stream);\n      m_charset = dXstring440::readString(stream);\n      m_delimiter = stream.get();\n      m_index = dXstring440::readString(stream);\n      m_coordsys = dXstring440::readString(stream);\n      m_bounds = dXstring440::readString(stream);\n      //\n      // this is no longer used: just a dummy read:\n      if (version < mgraph440::VERSION_MAPINFO_SHAPES) {\n         int columns, rows;\n         std::vector<std::string> columnheads;\n         std::vector<std::string> table;\n         stream.read((char *) &columns, sizeof(int));\n         for (int i = 0; i < columns; i++) {\n             columnheads.push_back(dXstring440::readString(stream));\n         }\n         stream.read((char *) &rows, sizeof(int));\n         for (int j = 0; j < rows; j++) {\n            table.push_back(dXstring440::readString(stream));\n         }\n      }\n\n      return stream;\n   }\n   std::ostream& write(std::ostream& stream)\n   {\n      dXstring440::writeString(stream, m_version);\n      dXstring440::writeString(stream, m_charset);\n      stream.put(m_delimiter);\n      dXstring440::writeString(stream, m_index);\n      dXstring440::writeString(stream, m_coordsys);\n      dXstring440::writeString(stream, m_bounds);\n      /*\n      // No longer used as of VERSION_MAPINFO_SHAPES\n      int columns = m_columnheads.size();\n      int rows = m_table.size();\n      stream.write((char *)&columns, sizeof(columns));\n      for (int i = 0; i < m_columnheads.size(); i++) {\n         m_columnheads[i].write(stream);\n      }\n      stream.write((char *)&rows, sizeof(rows));\n      for (int j = 0; j < m_table.size(); j++) {\n         m_table[j].write(stream);\n      }\n      */\n      return stream;\n   }\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/mgraph.cpp",
    "content": "#include \"mgraph440/mgraph.h\"\n\nnamespace mgraph440 {\n\nMetaGraph::MetaGraph()\n{\n   m_state = 0;\n   m_view_class = VIEWNONE;\n   m_file_version = -1; // <- if unsaved, file version is -1\n\n   // Standard layers no longer added: the gates layer will be initialised with the first push to layer,\n   // or when made from axial lines.\n\n   m_attr_conv_table = NULL;\n\n   // whether or not showing text / grid saved with file:\n   m_showtext = false;\n   m_showgrid = false;\n}\n\nMetaGraph::~MetaGraph()\n{\n}\n\nint MetaGraph::convertAttributes( std::ifstream& stream, int version )\n{\n   int ret = 1;\n\n   // This is adapted from original ArVertexList code:\n\n   int attr_count, which_attributes;\n   stream.read( (char *) &which_attributes, sizeof(int) );\n   stream.read( (char *) &attr_count, sizeof(int) );\n\n   int size;\n   stream.read( (char *) &size, sizeof(int) );\n\n   if (m_attr_conv_table)\n      delete m_attr_conv_table;\n   m_attr_conv_table = new pqvector<AttrBody>;\n   pqvector<AttrBody>& attrs = *m_attr_conv_table;\n\n   size_t i;\n   for (i = 0; i < size_t(size); i++) {\n      AttrBody attr(-1, g_attr_header);\n      attr.read(stream, attr_count);   // <- only write in saved attributes\n      if (attr.ref != -1) {\n         attrs.add( attr );\n      }\n   }\n\n   for (size_t ii = 0; ii < attrs.size(); ii++) {\n      // Check these are numbered 0 to n, and set the pos to be used later:\n      if (attrs[ii].ref != ii) {\n         ret = 0;\n         break;\n      }\n      attrs[ii].pos = -1;\n   }\n\n   if (ret == 0) {\n      delete m_attr_conv_table;\n      m_attr_conv_table = NULL;\n      return 0;\n   }\n\n   for (i = 0; i < PointMaps::size(); i++) {\n      PointMap& map = PointMaps::at(i);\n      for (int j = 0; j < map.m_cols; j++) {\n         for (int k = 0; k < map.m_rows; k++) {\n            // Note: block used to be the noderef\n            if (map.m_points[j][k].filled() && map.m_points[j][k].m_block != -1) {\n               AttrBody test(-1,g_attr_header);\n               test.ref = map.m_points[j][k].m_block;\n               size_t pos = attrs.searchindex(test);\n               if (pos != paftl::npos) {\n                  map.m_points[j][k].setAttributes(attrs[pos]);\n                  attrs[pos].pos = (int) PixelRef(j,k);  // <- note this can be used to convert the virtual mem quickly\n               }\n               else {\n                  // oops\n                  ret = 0;\n               }\n            }\n         }\n      }\n   }\n   return ret;\n}\n\nint MetaGraph::convertVirtualMem( std::ifstream& stream, int version )\n{\n   if (!m_attr_conv_table) {\n      return 0;\n   }\n   if (~m_state & ANGULARGRAPH) {\n      // can't convert non-angular graphs:\n      if (m_attr_conv_table)\n         delete m_attr_conv_table;\n      m_attr_conv_table = NULL;\n      return DEPRECATED_VERSION;\n   }\n\n   // The attr conv table can help us quickly convert:\n   pqvector<AttrBody>& attrs = *m_attr_conv_table;\n\n   pvecint nodes;\n   pvecint bins;\n\n   PixelRefVector bins_b[32];\n   static float far_bin_dists[32];\n   for (int ii = 0; ii < 32; ii++) {\n      far_bin_dists[ii] = 0.0f;\n   }\n\n   char header[3];\n   stream.read( header, 3 );                             // 'grf'\n   stream.read( (char *) &version, sizeof( version ) );  // version\n   char type;\n   stream.read( (char *) &type, sizeof( type ) );        // 'v'\n\n   int size;\n   stream.read( (char *) &size, sizeof( size ) );\n\n   PointMap& map = PointMaps::tail();\n   for (int i = 0; i < size; i++) {\n      nodes.read(stream);\n      bins.read(stream);\n      if (attrs[i].pos != -1) {\n         PixelRef curs = (PixelRef) attrs[i].pos;\n\n         for (int j = 0; j < 32; j++) {\n            for (int k = loword(bins[j]); k < hiword(bins[j]); k++) {\n               int next = attrs[nodes[k]].pos;\n               if (next != -1) {\n                  bins_b[j].push_back( (PixelRef) next );\n               }\n            }\n         }\n\n         Point& pt = map.getPoint( curs );\n         pt.m_node = new Node;\n         pt.m_node->make( curs, bins_b, far_bin_dists, 0x00FF );\n      }\n      nodes.clear();\n      bins.clear();\n   }\n\n   delete m_attr_conv_table;\n   m_attr_conv_table = NULL;\n\n   return WARN_CONVERTED;\n}\n\nint MetaGraph::read( const std::string& filename )\n{\n   m_state = 0;   // <- clear the state out\n\n   if (filename.empty()) {\n      return NOT_A_GRAPH;\n   }\n\n#ifdef _WIN32\n   std::ifstream stream( filename.c_str(), std::ios::binary | std::ios::in );\n#else\n   std::ifstream stream( filename.c_str(), std::ios::in );\n#endif\n\n   char header[3];\n   stream.read( header, 3 );\n   if (stream.fail() || header[0] != 'g' || header[1] != 'r' || header[2] != 'f') {\n      stream.close();\n      return NOT_A_GRAPH;\n   }\n   int version;\n   stream.read( (char *) &version, sizeof( version ) );\n   m_file_version = version;  // <- recorded for easy debugging\n   if (version > METAGRAPH_VERSION) {\n      stream.close();\n      return NEWER_VERSION;\n   }\n   if (version == VERSION_VIEW_CLASS_ADDED) {\n      stream.close();\n      return DEPRECATED_VERSION; // trial version no longer supported\n   }\n\n   // have to use temporary state here as redraw attempt may come too early:\n   int temp_state = 0;\n   if (version >= VERSION_STATE_RECORDED) {\n      stream.read( (char *) &temp_state, sizeof( temp_state ) );\n   }\n\n   if (version >= VERSION_VIEW_CLASS_ADDED) {\n      stream.read( (char *) &m_view_class, sizeof(m_view_class) );\n   }\n\n   if (version >= VERSION_STORE_GRIDTEXTINFO) {\n      stream.read( (char *) &m_showgrid, sizeof(m_showgrid) );\n      stream.read( (char *) &m_showtext, sizeof(m_showtext) );\n   }\n\n   // type codes: x --- properties\n   //             v --- virtual graph (from versions below 70)\n   //             n --- ngraph format\n   //             l --- layer data\n   //             p --- point data\n   //             d --- data summary layers\n\n   bool conversion_required = false;\n\n   char type;\n   stream.read( &type, 1 );\n   if (type == 'x') {\n      FileProperties::read(stream,version);\n      if (stream.eof()) {\n         // erk... this shouldn't happen\n         stream.close();\n         return DAMAGED_FILE;\n      }\n      else if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   else {\n      FileProperties::setProperties(\"<unknown>\",\"<unknown>\",\"<unknown>\",\"<unknown>\");\n   }\n   if (stream.eof()) {\n       // file is still ok, just empty\n       stream.close();\n       return OK;\n   }\n   if (type == 'v') {\n\n      conversion_required = true;\n\n      skipVirtualMem(stream,version);\n\n      // and set our filename:\n      // Graph::m_nodes.setFilename( filename );\n\n      // and tell everyone it's been archived\n      // temp_state |= GRAPHARCHIVED;\n\n      if (stream.eof()) {\n         // erk... this shouldn't happen\n         stream.close();\n         return DAMAGED_FILE;\n      }\n      else if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   if (type == 'l') {\n      try {\n         SuperSpacePixel::read( stream, version );\n         temp_state |= LINEDATA;\n         if (!stream.eof()) {\n            stream.read( &type, 1 );\n         }\n      }\n      catch (pexception) {\n         // erk... this shouldn't happen\n         stream.close();\n         return DAMAGED_FILE;\n      }\n   }\n   if (type == 'p') {\n      if (version < VERSION_NGRAPH_INTROD) {\n         // This hasn't been coded yet\n         stream.close();\n         return DEPRECATED_VERSION;\n      }\n      if (version < VERSION_POINT_MAPS) {\n         PointMaps::push_back(PointMap());\n         if (temp_state & 0x0001) { // 0x0001 was \"GRAPH\"\n            PointMaps::tail().m_processed = true;\n            temp_state &= ~0x0001;\n         }\n         if (temp_state & 0x0080) { // 0x0080 was \"BOUNDARYGRAPH\"\n            PointMaps::tail().m_boundarygraph = true;\n            temp_state &= ~0x0080;\n         }\n         PointMaps::tail().read( stream, version );\n         setDisplayedPointMapRef(0);\n      }\n      else {\n         PointMaps::read( stream, version );\n      }\n      PointMaps::setSpacePixel( (SuperSpacePixel *) this );\n      temp_state |= POINTMAPS;\n      if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   if (type == 'g') {\n      // Note the older version stored its attributes in a different location...\n      // ...well, actually, now it's been rearranged, pretty similar to the original...\n      // hasn't been coded yet, though (see above)\n      if (version < VERSION_NGRAPH_INTROD) {\n         if (!convertAttributes( stream, version )) {\n            stream.close();\n            return DAMAGED_FILE;\n         }\n      }\n      // record on state of actual point map:\n      PointMaps::tail().m_processed = true;\n\n      if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   if (type == 'a') {\n      temp_state |= ANGULARGRAPH;\n      if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   if (type == 'd') {\n      // data layers are deprecated: data layers have been replaced by shape maps\n      // so: first read data layers:\n      DataLayers dl;\n      dl.read( stream, version );\n      // now replace with shape maps, but only if layer exists:\n      temp_state &= ~DATAMAPS;\n      // converter requires a point map to work on:\n      if (PointMaps::size()) {\n         // returns 0 if there are actually no objects in the shapemaps to convert,\n         int conv_ok = convertDataLayersToShapeMap(dl,getDisplayedPointMap());\n         if (conv_ok == 1) {\n            // read objects in:\n            temp_state |= DATAMAPS;\n         }\n         else if (conv_ok == -1) {\n            // read objects in, but had trouble converting them:\n            temp_state |= DATAMAPS;\n            temp_state |= WARN_CONVERTED;\n         }\n      }\n      if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   if (type == 'x') {\n      m_shape_graphs.read( stream, version );\n      temp_state |= SHAPEGRAPHS;\n      /*\n      // THIS CODE IS NO LONGER REQUIRED AS AXIAL MAPS *ARE* SHAPE MAPS -- can just be switched to shape map layer\n      if (version < VERSION_SHAPE_MAPS && m_shape_graphs.m_gate_map != -1) {\n         // check for a gate map:\n         convertShapeGraphToShapeMap(m_shape_graphs.at(m_shape_graphs.m_gate_map));\n         // delete the gate map:\n         m_shape_graphs.remove_at(m_shape_graphs.m_gate_map);\n         if (m_shape_graphs.m_displayed_map >= m_shape_graphs.m_gate_map) {\n            int map = m_shape_graphs.m_displayed_map;\n            m_shape_graphs.m_displayed_map = -1; // <- have to do this as setDisplayedShapeGraph clearSels a map that may not exist anymore\n            setDisplayedShapeGraph(map-1);\n         }\n         m_shape_graphs.m_gate_map = -1;\n         if (m_shape_graphs.size() == 0) {\n            temp_state &= ~SHAPEGRAPHS;\n         }\n         // assume objects read in okay:\n         temp_state |= DATAMAPS;\n      }\n      */\n      if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n   if (type == 's') {\n      m_data_maps.read( stream, version );\n      temp_state |= DATAMAPS;\n      if (!stream.eof()) {\n         stream.read( &type, 1 );\n      }\n   }\n\n   stream.close();\n\n   m_state = temp_state;\n\n   if (version < VERSION_VIEW_CLASS_ADDED) {\n      if (m_state & POINTMAPS) {\n         m_view_class = VIEWVGA;\n      }\n      else {\n         m_view_class = VIEWNONE;\n      }\n   }\n\n   // Note, below version 70, the graph data must be reread:\n   if (version < VERSION_NGRAPH_INTROD && conversion_required) {\n      // reopen the stream and convert\n      stream.open(filename.c_str(), std::ios::binary | std::ios::in );\n      int ok = convertVirtualMem(stream, version);\n      stream.close();\n      return ok;\n   }\n\n   if (version == VERSION_EXTRA_POINT_DATA_INTROD || version == VERSION_NGRAPH_INTROD || version == VERSION_SEGMENT_MAPS) {\n      m_state |= BUGGY;\n      return WARN_BUGGY_VERSION;\n   }\n\n   return OK;\n}\nstd::streampos MetaGraph::skipVirtualMem(std::ifstream& stream, int version)\n{\n   // it's graph virtual memory: skip it\n   int nodes = -1;\n   stream.read( (char *) &nodes, sizeof(nodes) );\n\n   // in angular version, have to skip two pvectors for each node:\n   if (version >= 30)\n      nodes *= 2;\n\n   for (int i = 0; i < nodes; i++) {\n      int connections;\n      stream.read( (char *) &connections, sizeof(connections) );\n      // This relies on the pvecint storage... hope it don't change!\n      stream.seekg( stream.tellg() + std::streamoff(connections * sizeof(connections)) );\n   }\n   return (stream.tellg());\n}\n\nint MetaGraph::convertDataLayersToShapeMap(DataLayers& datalayers, PointMap& pointmap)\n{\n   int retvar = 1;\n   // check for existence of data:\n   pmap<int,int> conversion_lookup;\n   size_t i;\n   for (i = 0; i < size_t(datalayers.getLayerCount()); i++) {\n      if (datalayers[i].getObjectCount()) {\n         int x = m_data_maps.addMap(datalayers[i].getLayerName(),ShapeMap::DATAMAP);\n         conversion_lookup.add(i,x);\n      }\n   }\n   // nothing to convert:\n   if (!conversion_lookup.size()) {\n      return 0;\n   }\n\n   for (i = 0; i < conversion_lookup.size(); i++) {\n      ShapeMap& shapemap = m_data_maps.getMap(conversion_lookup.value(i));\n      int layer_ref = datalayers.getLayerRef(conversion_lookup.key(i));\n      pvecint *shape_pixel_lists = new pvecint [datalayers[i].getObjectCount()];\n      int j;\n      for (j = 0; j < pointmap.getAttributeTable().getRowCount(); j++) {\n         PixelRef pix = pointmap.getAttributeTable().getRowKey(j);\n         int z = pointmap.getPoint(pix).getDataObject(layer_ref);\n         if (z != -1) {\n            shape_pixel_lists[z].push_back(pix);\n         }\n      }\n      // add shapes:\n      pvecint row_lookup;\n      for (j = 0; j < datalayers[i].getObjectCount(); j++) {\n         for (size_t k = 0; k < shape_pixel_lists[j].size(); k++) {\n            pointmap.overrideSelPixel(shape_pixel_lists[j][k]);\n         }\n         row_lookup.push_back(shapemap.makeShapeFromPointSet(pointmap));\n         pointmap.clearSel();\n      }\n      delete [] shape_pixel_lists;\n      // now add attributes:\n      AttributeTable& table = shapemap.getAttributeTable();\n      // add columns, note, we'll have to add and then have lookups because not necessarily in alphabetical order:\n      for (j = 0; j < datalayers[i].getColumnCount(); j++) {\n         table.insertColumn(datalayers[i].getColumnTitle(j));\n      }\n      pvecint column_lookup;\n      for (j = 0; j < datalayers[i].getColumnCount(); j++) {\n         column_lookup.push_back(table.getColumnIndex(datalayers[i].getColumnTitle(j)));\n      }\n\n      // now we can add the data for this horrible matrix:\n      for (j = 0; j < datalayers[i].getObjectCount(); j++) {\n         for (int k = 0; k < datalayers[i].getColumnCount(); k++) {\n            if (row_lookup[j] != -1) {\n               int row = table.getRowid(row_lookup[j]);  // row lookup should equal j since this is a new shape map, but for safety looked up\n               table.setValue(row,column_lookup[k],float(datalayers[i][j][k]));\n            }\n            else {\n               // conversion error occurred:\n               retvar = -1;\n            }\n         }\n      }\n\n      // set the displayed attribute ready for first draw:\n      shapemap.overrideDisplayedAttribute(-2);\n      shapemap.setDisplayedAttribute(-1);\n   }\n   // the horror is over:\n   return retvar;\n}\n\nint MetaGraph::writeToFile( const std::string& filename, int version, bool currentlayer )\n{\n   std::ofstream stream;\n\n   int oldstate = m_state;\n   m_state = 0;   // <- temporarily clear out state, avoids any potential read / write errors\n\n   // As of MetaGraph version 70 the disk caching has been removed\n   stream.open( filename.c_str(), std::ios::binary | std::ios::out | std::ios::trunc );\n   if (stream.fail()) {\n      if (stream.rdbuf()->is_open()) {\n         stream.close();\n      }\n      m_state = oldstate;\n      return DISK_ERROR;\n   }\n   m_state = oldstate;\n   int result = writeToStream(stream, version, currentlayer);\n   stream.close();\n   return result;\n}\nint MetaGraph::writeToStream(std::ostream &stream, int version, bool currentlayer) {\n   int oldstate = m_state;\n   char type;\n\n   stream.write(\"grf\", 3);\n   m_file_version = version; // <- note, the file may now have an updated file version\n   stream.write( (char *) &version, sizeof(version) );\n   if (currentlayer) {\n      int tempstate, tempclass;\n      if (m_view_class & VIEWVGA) {\n         tempstate = POINTMAPS;\n         tempclass = VIEWVGA;\n      }\n      else if (m_view_class & MetaGraph::VIEWAXIAL) {\n         tempstate = SHAPEGRAPHS;\n         tempclass = VIEWAXIAL;\n      }\n      else if (m_view_class & MetaGraph::VIEWDATA) {\n         tempstate = DATAMAPS;\n         tempclass = VIEWDATA;\n      }\n      stream.write( (char *) &tempstate, sizeof(tempstate) );\n      stream.write( (char *) &tempclass, sizeof(tempclass) );\n   }\n   else {\n      stream.write( (char *) &oldstate, sizeof(oldstate) );\n      stream.write( (char *) &m_view_class, sizeof(m_view_class) );\n   }\n   stream.write( (char *) &m_showgrid, sizeof(m_showgrid) );\n   stream.write( (char *) &m_showtext, sizeof(m_showtext) );\n\n   type = 'x';\n   stream.write(&type, 1);\n   FileProperties::write(stream);\n\n   if (currentlayer) {\n      if (m_view_class & MetaGraph::VIEWVGA) {\n         type = 'p';\n         stream.write(&type, 1);\n         PointMaps::write( stream, version, true );\n      }\n      else if (m_view_class & MetaGraph::VIEWAXIAL) {\n         type = 'x';\n         stream.write(&type, 1);\n         m_shape_graphs.write( stream, version, true );\n      }\n      else if (m_view_class & MetaGraph::VIEWDATA) {\n         type = 's';\n         stream.write(&type, 1);\n         m_data_maps.write( stream, version, true );\n      }\n   }\n   else {\n      if (oldstate & LINEDATA) {\n         type = 'l';\n         stream.write(&type, 1);\n         SuperSpacePixel::write( stream, version );\n      }\n      if (oldstate & POINTMAPS) {\n         type = 'p';\n         stream.write(&type, 1);\n         PointMaps::write( stream, version );\n      }\n      if (oldstate & SHAPEGRAPHS) {\n         type = 'x';\n         stream.write(&type, 1);\n         m_shape_graphs.write( stream, version );\n      }\n      if (oldstate & DATAMAPS) {\n         type = 's';\n         stream.write(&type, 1);\n         m_data_maps.write( stream, version );\n      }\n   }\n\n   m_state = oldstate;\n   return OK;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/mgraph.h",
    "content": "#pragma once\n\n#include \"mgraph440/ngraph.h\"  // for conversion\n#include \"mgraph440/pointmap.h\"\n#include \"mgraph440/axialmap.h\"\n#include \"mgraph440/shapemap.h\"\n#include \"mgraph440/spacepix.h\"\n#include \"mgraph440/datalayer.h\"\n#include \"mgraph440/fileproperties.h\"\n#include \"mgraph440/bspnode.h\"\n#include \"mgraph440/attr.h\"\n\nnamespace mgraph440 {\n\nclass MetaGraph : public SuperSpacePixel, public PointMaps, public FileProperties\n{\npublic:\n    MetaGraph();\n    ~MetaGraph();\n\n    enum { ANGULARGRAPH = 0x0010, LINEDATA = 0x0004, POINTMAPS = 0x0002, DATAMAPS = 0x0020, SHAPEGRAPHS = 0x0100, BUGGY = 0x8000 };\n    enum { OK, WARN_BUGGY_VERSION, WARN_CONVERTED, NOT_A_GRAPH, DAMAGED_FILE, DISK_ERROR, NEWER_VERSION, DEPRECATED_VERSION };\n    enum { VIEWNONE = 0x00, VIEWVGA = 0x01, VIEWAXIAL = 0x04, VIEWDATA = 0x20 };\n\n    int m_state;\n    int m_file_version;\n    int m_view_class;\n    bool m_showgrid;\n    bool m_showtext;\n\n    ShapeMaps<ShapeMap> m_data_maps;\n    ShapeGraphs m_shape_graphs;\n\n    // Standard layers no longer added: the gates layer will be initialised with the first push to layer,\n    // or when made from axial lines.\n\n    pqvector<AttrBody> *m_attr_conv_table = NULL;\n\n    std::streampos skipVirtualMem(std::ifstream& stream, int version);\n    int convertDataLayersToShapeMap(DataLayers& datalayers, PointMap& pointmap);\n    int convertAttributes(std::ifstream &stream, int version);\n    int convertVirtualMem(std::ifstream &stream, int version);\n    int read(const std::string &filename);\n    int writeToFile( const std::string& filename, int version, bool currentlayer = false);\n    int writeToStream(std::ostream &stream, int version, bool currentlayer = false);\n};\n\n}\n"
  },
  {
    "path": "mgraph440/mgraph_consts.h",
    "content": "#pragma once\n\nnamespace mgraph440 {\n\nconst int METAGRAPH_VERSION = 440;\n\n// Human readable(ish) metagraph version changes\n\nconst int VERSION_ALWAYS_RECORD_BINDISTANCES    = 440;\n\n// 17-Aug-2010 Version stamp for Depthmap 10.08.00\nconst int VERSION_100800                        = 430;\n\n// 12-Jul-2010 Version stamp for Depthmap 10.07.00\nconst int VERSION_100700                        = 430;\n\n// 12-Jul-2010 Occlusion distances for agent control test\nconst int VERSION_OCCDISTANCES                  = 430;\n\n// 07-Feb-2010 Axial lines no longer self-connect\nconst int VERSION_NO_SELF_CONNECTION            = 420;\n\n// 31-Jan-2009 Maps have sublayers\nconst int VERSION_MAP_LAYERS                    = 410;\n//\n// 390 and 400 used only for testing\n//\n// 31-Jan-2009 this is simply a version stamp for Depthmap 8.14.00 and 8.15.00\n// The idea is that I should start writing code that saves in version 380 format\n// as a benchmark \"save for older version\"\nconst int VERSION_81500                         = 380;\nconst int VERSION_81400                         = 380;\n//\n// 20-Apr-2008 The shape map name lookup could have been corrupted.  In addition it's not that useful (never much to sort through, unique layer names not necessary)\nconst int VERSION_NO_SHAPEMAP_NAME_LOOKUP       = 380;\n// 15-Mar-2008\nconst int VERSION_SHAPE_AREA_PERIMETER          = 370;\nconst int VERSION_FORGET_COLUMN_CREATOR         = 370;\n// 04-Oct-2007\nconst int VERSION_MAP_TYPES                     = 360;\n// 20-Sep-2007\nconst int VERSION_STORE_COLUMN_CREATOR          = 350;\nconst int VERSION_ATTRIBUTE_LOCKING             = 350;\n// version 340 unused\n// 08-Jun-2007: Store all drawing layers as shape maps rather than spacepixels (continued)\nconst int VERSION_DRAWING_SHAPES_B              = 330;\n// 27-Nov-2006: Store all drawing layers as shape maps rather than spacepixels\nconst int VERSION_DRAWING_SHAPES                = 320;\n// 27-Nov-2006: Store axial maps as children of shape maps rather than spacepixels\nconst int VERSION_AXIAL_SHAPES                  = 310;\n// 01-Sep-2006: Store formulae for columns\nconst int VERSION_STORE_FORMULA                 = 300;\n// 14-May-2006: Occlusions with node\nconst int VERSION_OCCLUSIONS                    = 290;\n// 28-Dec-2005: Polygon shapes have centroids\nconst int VERSION_SHAPE_CENTROIDS               = 280;\n// 18-Dec-2005: Mapinfo data read into shape maps instead of axial maps\nconst int VERSION_MAPINFO_SHAPES                = 270;\n// 14-Sep-2005: QtRegion bug with segment maps from imported axial maps fixed:\nconst int VERSION_AXIAL_REGION_FIX              = 263;\n// 01-Sep-2005: Now Pointmaps really ought to store their names:\nconst int VERSION_POINT_MAP_NAMES               = 262;\n// 25-Aug-2005: And an extension to shape maps to make them easier to use as lines or points\nconst int VERSION_EXTENDED_SHAPE_MAPS           = 261;\n// 23-Aug-2005: Although in test from 11-Aug-2005, useful to read the testing graphs created:\nconst int VERSION_SHAPE_MAPS                    = 260;\n// 11-Aug-2005: Also, a set of PointMaps now replace a single instance of PointData\nconst int VERSION_POINT_MAPS                    = 251;\n// 11-Aug-2005: Location stored with points, not depixelated on the fly\nconst int VERSION_POINT_LOCATIONS               = 250;\n// 01-Mar-2005: Quick grid connections\nconst int VERSION_GRID_CONNECTIONS              = 240;\n// 02-Dec-2004: Axial map gates\nconst int VERSION_GATE_MAPS                     = 230;\n// 29-Oct-2004: Store the colour display settings with the graph data\nconst int VERSION_STORE_GRIDTEXTINFO            = 220;\n// 29-Oct-2004: Store the colour display settings with the graph data\nconst int VERSION_STORE_COLOR                   = 210;\n// 16-Jun-2004: New boundary graph (now much simpler: nodes at edge of main graph)\nconst int VERSION_NEWBOUNDARYGRAPH              = 200;\n// 20-May-2004: Each segment must have forward and backward connections listed separately!\nconst int VERSION_SEGMENT_MAPS_FIX              = 191;\n// 17-May-2004: Axial maps can be either segment or axial maps.  Affects ShapeGraph and AxialLine classes\nconst int VERSION_SEGMENT_MAPS                  = 190;\n// 12-May-2004: Extra Mapinfo table data\nconst int VERSION_MAPINFO_DATA                  = 180;\n// 06-May-2004: Explicit links and unlinks for axial lines\nconst int VERSION_AXIAL_LINKS                   = 170;\n// 29-Feb-2004: Attributes table (already used for AxialLines) now used for PointData as well\nconst int VERSION_ATTRIBUTES_TABLE              = 160;\n// File compression introduced\nconst int VERSION_FILE_COMPRESSION              = 150;\n// Some minor modifications to the axial line format... won't load v.130 files\nconst int VERSION_REVISED_AXIAL                 = 140;\n// View class specifies whether axial or vga currently viewed\nconst int VERSION_VIEW_CLASS_ADDED              = 130;\n// A distance stored in the bin\nconst int VERSION_BINDISTANCES                  = 120;\n// A set of nodes on the boundaries of the isovist\nconst int VERSION_BOUNDARYGRAPH                 = 110;\n// Dynamic lines (addable and removable) in the visibility graph\nconst int VERSION_DYNAMICLINES                  = 100;\n// Line layers are coloured...\nconst int VERSION_LAYERCOLORS                   = 91;\n// Blocked locations split into 4, replaces m_noderef\nconst int VERSION_BLOCKEDQUAD                   = 90;\n// Space pixel groups have different space pixels for different layers (at their own resolution!)\nconst int VERSION_SPACEPIXELGROUPS              = 80;\n// The graph state is just recorded\nconst int VERSION_STATE_RECORDED                = 72;\n// The binsizes weren't included in the metagraph 70\nconst int VERSION_NGRAPH_BINCOUNT               = 71;\n// Major, major changes to the graph format (from now on it will now be held in memory only)\nconst int VERSION_NGRAPH_INTROD                 = 70;\n// Slight changes to PointData required for the actual implementation of the quick graph\nconst int VERSION_SPARK_GRAPH_INTROD            = 61;\n// Quick graph... add underlying info about lines into the pointdata structure\nconst int VERSION_QUICK_GRAPH_INTROD            = 60;\n// Layers\nconst int VERSION_LAYERS_CENTROID_INTROD        = 51;\nconst int VERSION_LAYERS_INTROD                 = 50;\n// version 41 repairs VERSION_EXTRA_POINT_DATA_INTROD bug\nconst int VERSION_EXTRA_POINT_DATA_INTROD       = 40;\nconst int VERSION_BINS_INTROD                   = 30;\n\nconst unsigned int SALA_SELECTED_COLOR = 0x00FFFF77;\nconst unsigned int SALA_HIGHLIGHTED_COLOR = 0x0077FFFF;\n\n}\n"
  },
  {
    "path": "mgraph440/ngraph.cpp",
    "content": "#include \"mgraph440/ngraph.h\"\n#include \"mgraph440/mgraph_consts.h\"\n#include \"mgraph440/legacyconverters.h\"\n\nnamespace mgraph440 {\n\ninline int processoctant(int bin)\n{\n   int q = -1;\n   switch (bin) {\n   case 0: case 1: case 2: case 3: case 4:\n      q = 1; break;\n   case 5: case 6: case 7:\n      q = 7; break;\n   case 8: case 9: case 10: case 11:\n      q = 6; break;\n   case 12: case 13: case 14: case 15: case 16:\n      q = 0; break;\n   case 17: case 18: case 19: case 20:\n      q = 2; break;\n   case 21: case 22: case 23:\n      q = 4; break;\n   case 24: case 25: case 26: case 27:\n      q = 5; break;\n   case 28: case 29: case 30: case 31:\n      q = 3; break;\n   }\n\n   return (1 << q);\n}\n\nvoid Node::make(const PixelRef pix, PixelRefVector *bins, float *bin_far_dists, int q_octants)\n{\n   m_pixel = pix;\n\n   for (int i = 0; i < 32; i++) {\n\n      if (q_octants != 0x00FF) {\n         // now, an octant filter has been used... note that the exact q-octants that\n         // will have been processed rely on adjacenies in the q_octants...\n         if (!(q_octants & processoctant(i))) {\n            continue;\n         }\n      }\n\n      m_bins[i].m_distance = bin_far_dists[i];\n\n      if (i == 4 || i == 20) {\n         m_bins[i].make(bins[i], PixelRef::POSDIAGONAL);\n      }\n      else if (i == 12 || i == 28) {\n         m_bins[i].make(bins[i], PixelRef::NEGDIAGONAL);\n      }\n      else if ((i > 4 && i < 12) || (i > 20 && i < 28)) {\n         m_bins[i].make(bins[i], PixelRef::VERTICAL);\n      }\n      else {\n         m_bins[i].make(bins[i], PixelRef::HORIZONTAL);\n      }\n      // Now clear the bin!\n      bins[i].clear();\n   }\n}\n\nvoid Bin::make(const PixelRefVector& pixels, char dir)\n{\n   if (m_pixel_vecs) {\n      delete [] m_pixel_vecs;\n      m_pixel_vecs = NULL;\n   }\n   m_length = 0;\n   m_node_count = 0;\n\n   if (pixels.size()) {\n\n      m_dir = dir;\n\n      if (m_dir & PixelRef::DIAGONAL) {\n\n         PixelVec cur( pixels[0], pixels[0] );\n\n         // Special, the diagonal should be pixels directly along the diagonal\n         // Both posdiagonal and negdiagonal are positive in the x direction\n         // Note that it is ordered anyway, so no need for anything too fancy:\n         if (pixels.back().x < cur.start().x) {\n            cur.m_start = pixels.back();\n         }\n         if (pixels.back().x > cur.end().x) {\n            cur.m_end = pixels.back();\n         }\n\n         m_length = 1;\n         m_pixel_vecs = new PixelVec[1];\n         m_pixel_vecs[0] = cur;\n         m_node_count = pixels.size();\n      }\n      else {\n         prefvec<PixelVec> pixel_vecs;\n         // Reorder the pixels:\n         if (m_dir == PixelRef::HORIZONTAL) {\n            pvector<PixelRefH> pixels_h;\n            for (size_t i = 0; i < pixels.size(); i++) {\n               pixels_h.add(pixels[i]);\n            }\n            // this looks like a simple bubble sort\n            pixel_vecs.push_back(PixelVec(pixels_h[0],pixels_h[0]));\n            for (size_t j = 1; j < pixels_h.size(); j++) {\n               if (pixels_h[j-1].y != pixels_h[j].y || pixels_h[j-1].x + 1 != pixels_h[j].x) {\n                  pixel_vecs.tail().m_end = pixels_h[j-1];\n                  pixel_vecs.push_back(PixelVec(pixels_h[j],pixels_h[j]));\n               }\n            }\n            pixel_vecs.tail().m_end = pixels_h.tail();\n         }\n         if (m_dir == PixelRef::VERTICAL) {\n            pvector<PixelRefV> pixels_v;\n            for (size_t i = 0; i < pixels.size(); i++) {\n               pixels_v.add(pixels[i]);\n            }\n            // this looks like a simple bubble sort\n            pixel_vecs.push_back(PixelVec(pixels_v[0],pixels_v[0]));\n            for (size_t j = 1; j < pixels_v.size(); j++) {\n               if (pixels_v[j-1].x != pixels_v[j].x || pixels_v[j-1].y + 1 != pixels_v[j].y) {\n                  pixel_vecs.tail().m_end = pixels_v[j-1];\n                  pixel_vecs.push_back(PixelVec(pixels_v[j],pixels_v[j]));\n               }\n            }\n            pixel_vecs.tail().m_end = pixels_v.tail();\n         }\n\n         // Now compact the representation:\n         m_length = pixel_vecs.size();\n         m_pixel_vecs = new PixelVec[m_length];\n         for (int k = 0; k < m_length; k++) {\n            m_pixel_vecs[k] = pixel_vecs[k];\n         }\n         m_node_count = pixels.size();\n      }\n   }\n}\nvoid Bin::first() const\n{\n   m_curvec = 0;\n   if (m_length)\n      m_curpix = m_pixel_vecs[m_curvec].m_start;\n}\n\nvoid Bin::next() const\n{\n   if (m_curpix.move(m_dir).col(m_dir) > m_pixel_vecs[m_curvec].end().col(m_dir)) {\n      m_curvec++;\n      if (m_curvec < m_length)\n         m_curpix = m_pixel_vecs[m_curvec].m_start;\n   }\n}\n\nbool Bin::is_tail() const\n{\n   return m_curvec >= m_length;\n}\n\nPixelRef Bin::cursor() const\n{\n   return (int) m_curpix;\n}\n::std::ifstream& Node::read(::std::ifstream& stream, int version)\n{\n   int i;\n   for (i = 0; i < 32; i++) {\n      m_bins[i].read(stream, version);\n   }\n   if (version >= VERSION_OCCLUSIONS) {\n      for (i = 0; i < 32; i++) {\n         pvector<PixelRef> tempPvector;\n         tempPvector.read(stream);\n         m_occlusion_bins[i] = genshim440::toSTLVector(tempPvector);\n      }\n   }\n   return stream;\n}\n\nstd::ostream& Node::write(std::ostream& stream, int version)\n{\n   int i;\n   for (i = 0; i < 32; i++) {\n      m_bins[i].write(stream,version);\n   }\n\n   for (i = 0; i < 32; i++) {\n      pvector<PixelRef> tempPvector = genshim440::toPVector(m_occlusion_bins[i]);\n      tempPvector.write(stream);\n   }\n   return stream;\n}\n\n::std::ifstream& Bin::read(::std::ifstream& stream, int version)\n{\n   stream.read( (char *) &m_dir, sizeof(m_dir) );\n   stream.read( (char *) &m_node_count, sizeof(m_node_count) );\n   if (version >= VERSION_FILE_COMPRESSION) {\n      if (version >= VERSION_ALWAYS_RECORD_BINDISTANCES) {\n         stream.read( (char *) &m_distance, sizeof(m_distance) );\n         stream.read( (char *) &m_occ_distance, sizeof(m_occ_distance) );\n      }\n      if (m_node_count) {\n         if (version < VERSION_ALWAYS_RECORD_BINDISTANCES) {\n            stream.read( (char *) &m_distance, sizeof(m_distance) );\n         }\n         if (m_dir & PixelRef::DIAGONAL) {\n            m_length = 1;\n            m_pixel_vecs = new PixelVec [m_length];\n            m_pixel_vecs[0].read(stream, version, m_dir);\n         }\n         else {\n            stream.read( (char *) &m_length, sizeof(m_length) );\n            m_pixel_vecs = new PixelVec [m_length];\n            m_pixel_vecs[0].read(stream, version, m_dir);\n            for (int i = 1; i < m_length; i++) {\n               m_pixel_vecs[i].read(stream, version, m_dir,m_pixel_vecs[i-1]);\n            }\n         }\n         if (version < VERSION_ALWAYS_RECORD_BINDISTANCES) {\n            if (version >= VERSION_OCCDISTANCES) {\n               stream.read( (char *) &m_occ_distance, sizeof(m_occ_distance) );\n            }\n            else {\n               m_occ_distance = 0.0f;\n            }\n         }\n      }\n      else {\n         m_pixel_vecs = NULL;\n         m_length = 0;\n         if (version < VERSION_ALWAYS_RECORD_BINDISTANCES) {\n            m_distance = 0.0f;\n            m_occ_distance = 0.0f;\n         }\n      }\n   }\n   else {\n      stream.read( (char *) &m_length, sizeof(m_length) );\n      if (version >= VERSION_BINDISTANCES) {\n         stream.read( (char *) &m_distance, sizeof(m_distance) );\n      }\n      else {\n         m_distance = 0.0f;\n      }\n      if (m_pixel_vecs) {\n         delete m_pixel_vecs;\n         m_pixel_vecs = NULL;\n      }\n      if (m_length) {\n         m_pixel_vecs = new PixelVec [m_length];\n         stream.read( (char *) m_pixel_vecs, sizeof(PixelVec) * m_length);\n      }\n   }\n\n   return stream;\n}\n\nstd::ostream& Bin::write(std::ostream& stream, int version)\n{\n   stream.write( (char *) &m_dir, sizeof(m_dir) );\n   stream.write( (char *) &m_node_count, sizeof(m_node_count) );\n\n   stream.write( (char *) &m_distance, sizeof(m_distance) );\n   stream.write( (char *) &m_occ_distance, sizeof(m_occ_distance) );\n\n   if (m_node_count) {\n\n      if (m_dir & PixelRef::DIAGONAL) {\n         m_pixel_vecs[0].write(stream,m_dir);\n      }\n      else {\n         stream.write( (char *) &m_length, sizeof(m_length) );\n         m_pixel_vecs[0].write(stream,m_dir);\n         for (int i = 1; i < m_length; i++) {\n            m_pixel_vecs[i].write(stream,m_dir,m_pixel_vecs[i-1]);\n         }\n      }\n   }\n\n   return stream;\n}\n\n::std::ifstream& PixelVec::read(::std::ifstream& stream, int version, const char dir)\n{\n   unsigned short runlength;\n   stream.read((char *) &m_start, sizeof(m_start));\n   stream.read((char *) &runlength, sizeof(runlength));\n   switch (dir) {\n      case PixelRef::POSDIAGONAL:\n         m_end.x = m_start.x + runlength;\n         m_end.y = m_start.y + runlength;\n         break;\n      case PixelRef::NEGDIAGONAL:\n         m_end.x = m_start.x + runlength;\n         m_end.y = m_start.y - runlength;\n         break;\n      case PixelRef::HORIZONTAL:\n         m_end.x = m_start.x + runlength;\n         m_end.y = m_start.y;\n         break;\n      case PixelRef::VERTICAL:\n         m_end.x = m_start.x;\n         m_end.y = m_start.y + runlength;\n         break;\n   }\n   return stream;\n}\n\nstruct ShiftLength {\n   unsigned short shift : 4;\n   unsigned short runlength : 12;\n};\n\n::std::ifstream& PixelVec::read(::std::ifstream& stream, int version, const char dir, const PixelVec& context)\n{\n   short primary;\n   ShiftLength shiftlength;\n   stream.read((char *) &primary, sizeof(primary));\n   stream.read((char *) &shiftlength, sizeof(shiftlength));\n   switch (dir) {\n      case PixelRef::HORIZONTAL:\n         m_start.x = primary;\n         m_start.y = context.m_start.y + shiftlength.shift;\n         m_end.x = m_start.x + shiftlength.runlength;\n         m_end.y = m_start.y;\n         break;\n      case PixelRef::VERTICAL:\n         m_start.x = context.m_start.x + shiftlength.shift;\n         m_start.y = primary;\n         m_end.x = m_start.x;\n         m_end.y = m_start.y + shiftlength.runlength;\n         break;\n   }\n\n   return stream;\n}\n\nstd::ostream& PixelVec::write(std::ostream& stream, const char dir)\n{\n   stream.write((char *) &m_start, sizeof(m_start));\n   unsigned short runlength;\n   switch (dir) {\n      case PixelRef::HORIZONTAL:\n      case PixelRef::POSDIAGONAL:\n      case PixelRef::NEGDIAGONAL:\n         runlength = m_end.x - m_start.x;\n         break;\n      case PixelRef::VERTICAL:\n         runlength = m_end.y - m_start.y;\n         break;\n   }\n   stream.write((char *) &runlength, sizeof(runlength));\n\n   return stream;\n}\n\nstd::ostream& PixelVec::write(std::ostream& stream, const char dir, const PixelVec& context)\n{\n   ShiftLength shiftlength;\n   switch (dir) {\n      case PixelRef::HORIZONTAL:\n         stream.write((char *) &(m_start.x), sizeof(m_start.x));\n         shiftlength.runlength = m_end.x - m_start.x;\n         shiftlength.shift = m_start.y - context.m_start.y;\n         break;\n      case PixelRef::VERTICAL:\n         stream.write((char *) &(m_start.y), sizeof(m_start.y));\n         shiftlength.runlength = m_end.y - m_start.y;\n         shiftlength.shift = m_start.x - context.m_start.x;\n         break;\n   }\n   stream.write((char *) &shiftlength, sizeof(shiftlength));\n\n   return stream;\n}\n\nvoid Node::first() const\n{\n   m_curbin = 0;\n   do {\n      m_bins[m_curbin].first();\n   } while (m_bins[m_curbin].is_tail() && ++m_curbin < 32);\n}\n\nvoid Node::next() const\n{\n   m_bins[m_curbin].next();\n   while (m_bins[m_curbin].is_tail() && ++m_curbin < 32) {\n      m_bins[m_curbin].first();\n   }\n}\n\nPixelRef Node::cursor() const\n{\n   return m_bins[m_curbin].cursor();\n}\n\n}\n"
  },
  {
    "path": "mgraph440/ngraph.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n// ngraph.h\n\n#ifndef __NGRAPH_H__\n#define __NGRAPH_H__\n\n#include \"mgraph440/pixelref.h\"\n#include \"mgraph440/paftl.h\"\n#include <set>\n\nnamespace mgraph440 {\n\nclass PointMap;\nstruct MetricPair;\nstruct MetricTriple;\n\nstruct PixelVec\n{\n   PixelRef m_start;\n   PixelRef m_end;\n   PixelVec(const PixelRef start = NoPixel, const PixelRef end = NoPixel)\n   { m_start = (int) start; m_end = (int) end; };\n   PixelRef start() const\n   { return m_start; }\n   PixelRef end() const\n   { return m_end; }\n   //\n   std::ifstream& read(std::ifstream& stream, int version, const char dir);\n   std::ifstream& read(std::ifstream& stream, int version, const char dir, const PixelVec& context);\n   std::ostream &write(std::ostream &stream, const char dir);\n   std::ostream& write(std::ostream& stream, const char dir, const PixelVec& context);\n};\n\nclass Bin\n{\n   friend class Node;\nprotected:\n   char m_dir;\n   unsigned short m_length;\n   unsigned short m_node_count;\n   float m_distance;\n   float m_occ_distance;\n   PixelVec *m_pixel_vecs;\npublic:\n   Bin()\n   { m_dir = PixelRef::NODIR; m_length = 0; m_pixel_vecs = NULL; m_node_count = 0; m_distance = 0.0f; m_occ_distance = 0.0f; }\n   Bin(const Bin&)\n   { throw 1; }\n   Bin& operator = (const Bin&)\n   { throw 1; }\n   ~Bin()\n   { if (m_pixel_vecs) delete [] m_pixel_vecs; m_pixel_vecs = NULL; }\n   //\n   void make(const PixelRefVector& pixels, char m_dir);\n   //\n   int count() const\n   { return m_node_count; }\n   float distance() const\n   { return m_distance; }\n   float occdistance() const\n   { return m_occ_distance; }\n   //\n   void setOccDistance(float d)\n   { m_occ_distance = d; }\n   //\n   bool containsPoint(const PixelRef p) const;\n   //\n   // Iterator\nprotected:\n   // Conversion back to old fashioned schema:\n   mutable int m_curvec;\n   mutable PixelRef m_curpix;\npublic:\n//   void contents(PixelRefVector& hood);\n   void first() const;\n   void next() const;\n   bool is_tail() const;\n   PixelRef cursor() const;\n   //\n   std::ifstream& read(std::ifstream& stream, int version);\n   std::ostream &write(std::ostream &stream, int version);\n};\n\nclass Node\n{\nprotected:\n   PixelRef m_pixel;\n   Bin m_bins[32];\npublic:\n   // testing some agent stuff:\n   std::vector<PixelRef> m_occlusion_bins[32];\npublic:\n   Node()\n   { ; }\n   Node(const Node&)\n   { throw 1; }\n   Node& operator = (const Node&)\n   { throw 1; }\n   ~Node()\n   { ; }\n   // Conversion back to old fashioned schema:\n   mutable int m_curbin;\n   // Note: this function clears the bins as it goes\n   void make(const PixelRef pix, PixelRefVector *bins, float *bin_far_dists, int q_octants);\n   //\n   void setPixel(const PixelRef& pixel)\n   { m_pixel = pixel; }\n   Bin& bin(int i)\n   { return m_bins[i]; }\n   float occdistance(int i)\n   { return m_bins[i].occdistance(); }\n   int count()\n   { int c = 0; for (int i = 0; i < 32; i++) c += m_bins[i].count(); return c; }\n   void first() const;\n   void next() const;\n   PixelRef cursor() const;\n   std::ifstream& read(std::ifstream& stream, int version);\n   std::ostream &write(std::ostream &stream, int version);\n};\n\n// Two little helpers:\n\nclass PixelRefH : public PixelRef\n{\npublic:\n   PixelRefH() : PixelRef()\n   {;}\n   PixelRefH(const PixelRef& p) : PixelRef(p)\n   {;}\n   friend bool operator > (const PixelRefH& a, const PixelRefH& b);\n   friend bool operator < (const PixelRefH& a, const PixelRefH& b);\n};\ninline bool operator > (const PixelRefH& a, const PixelRefH& b)\n{\n   return (a.y > b.y || (a.y == b.y && a.x > b.x));\n}\ninline bool operator < (const PixelRefH& a, const PixelRefH& b)\n{\n   return (a.y < b.y || (a.y == b.y && a.x < b.x));\n}\nclass PixelRefV : public PixelRef\n{\npublic:\n   PixelRefV() : PixelRef()\n   {;}\n   PixelRefV(const PixelRef& p) : PixelRef(p)\n   {;}\n   friend bool operator > (const PixelRefV& a, const PixelRefV& b);\n   friend bool operator < (const PixelRefV& a, const PixelRefV& b);\n};\ninline bool operator > (const PixelRefV& a, const PixelRefV& b)\n{\n   return (a.x > b.x || (a.x == b.x && a.y > b.y));\n}\ninline bool operator < (const PixelRefV& a, const PixelRefV& b)\n{\n   return (a.x < b.x || (a.x == b.x && a.y < b.y));\n}\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/options.h",
    "content": "#pragma once\n\nnamespace mgraph440 {\n\n// Options for mean depth calculations\nstruct Options\n{\n   enum output_t { OUTPUT_ISOVIST, OUTPUT_VISUAL, OUTPUT_METRIC, OUTPUT_ANGULAR, OUTPUT_THRU_VISION, OUTPUT_CLIQUE_GRAPH,\n      OUTPUT_KERNEL_GRAPH, OUTPUT_MATRIX_REDUCTION };\n   // Output type, see above\n   int output_type;\n   // Options for the summary type:\n   int local;\n   int global;\n   int cliques;\n   //\n   bool choice;\n   // include measures that can be derived: RA, RRA and total depth\n   bool fulloutput;\n   //\n   enum { RADIUS_STEPS, RADIUS_METRIC, RADIUS_ANGULAR };\n   int radius_type;\n   double radius; // <- n.b. for metric integ radius is floating point\n   // radius has to go up to a list (phase out radius as is)\n   pvecdouble radius_list;\n   //\n   int point_depth_selection;\n   int tulip_bins;\n   bool process_in_memory;\n   bool sel_only;\n   bool gates_only;\n   // for pushing to a gates layer\n   int gatelayer;\n   // a column to weight measures by:\n   int weighted_measure_col;\n   int weighted_measure_col2;  //EFEF\n    int routeweight_col;\t\t\t//EFEF\n   std::string output_file; // To save an output graph (for example)\n   // default values\n   Options()\n   { local = 0; global = 1; cliques = 0;\n     choice = false; fulloutput = false; point_depth_selection = 0;\n     tulip_bins = 1024;\n     radius = -1; radius_type = 0;\n     output_type = OUTPUT_ISOVIST; process_in_memory = false; gates_only = false; sel_only = false;\n     gatelayer = -1;\n     weighted_measure_col = -1;}\n};\n\n}\n"
  },
  {
    "path": "mgraph440/p2dpoly.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// 2d polygons (and line sets too...)\n\n#include <cmath>\n#include <float.h>\n\n#include <mgraph440/paftl.h>\n#include <mgraph440/p2dpoly.h>\n\nnamespace mgraph440 {\n\n//////////////////////////////////////////////////////////////////////////////////////\n\n// gps2os: function to convert long-lat GPS coordinates to OS national grid\n\n// n.b.: approximation only\n\n// This algorithm is taken from:\n\n// \"A guide to coordinate systems in Great Britain\"\n// http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/index.html\n// (v1.9 Mar 2008 D00659, Crown Copyright)\n// Sourced: 21-Mar-08\n\n// It's truly ick... and nuts... there must be an easier way...\n\n// Outline:\n// 1. take long-lat on ETRS89 ellipsoid and convert to 3d cartesian coordinates\n// 2. shift 3d cartesian coordinates from ETRS89 ellipsoid to OSGB36 ellipsoid\n// 3. convert 3d cartesian coordinates to long-lat on OSGB36 ellipsoid\n// 4. project onto OSFB36 2d grid using a transverse Mercator projection\n\n// According to OS, accurate to within about 5 metres\n\nPoint2f gps2os(const Point2f& pt)\n{\n   // *first*, we have ETRS89 data...\n\n   // Convert it to 3D Cartesian Coordinates\n   double lambda = M_PI * pt.x / 180.0;\n   double phi = M_PI * pt.y / 180.0;\n\n   // GRS80 ellipsoid\n   double a = 6378137.0000;\n   double b = 6356752.3141;\n   double e_sq = (sqr(a) - sqr(b)) / sqr(a);\n\n   double nu = a / sqrt(1.0 - e_sq * sqr(sin(phi)));\n\n   double x = nu * cos(phi) * cos(lambda);\n   double y = nu * cos(phi) * sin(lambda);\n   double z = (1 - e_sq) * nu * sin(phi);\n\n   // Now we have the ETRS89 location, convert it to a rough OSGB36 location:\n\n   // rough conversion chart\n\n   // t_x (m)     t_y (m)   t_z (m)    s (ppm)    r_x (sec)  r_y (sec)  r_z (sec)\n   // -446.448    +125.157  -542.060   +20.4894   -0.1502    -0.2470    -0.8421 = (in radians: )\n\n   // nb, seconds converted to radians:\n   double r_x = -0.7281901490265230623720509817416e-6;\n   double r_y = -1.1974897923405539041670878328241e-6;\n   double r_z = -4.0826160086234026020206666559563e-6;\n\n   x = -446.448 + (1.0 + 2.04894e-5) * x - r_z * y + r_y * z;\n   y = +125.157 + r_z * x + (1.0 + 2.04894e-5) * y - r_x * z;\n   z = -542.060 - r_y * x + r_x * y + (1.0 + 2.04894e-5) * z;\n\n   double p = sqrt(sqr(x)+sqr(y));\n\n   // now place it back in long lat on the OSGB36 ellipsoid:\n\n   // Airy 1830 (OSGB36) ellipsoid\n   a = 6377563.396;\n   b = 6356256.910;\n   e_sq = (sqr(a) - sqr(b)) / sqr(a);\n\n   lambda = atan( y / x );\n   phi = atan( z / (p * (1.0 - e_sq)) );\n   double lastphi = phi;\n\n   nu = a / sqrt(1.0 - e_sq * sqr(sin(phi)));\n   do {\n      phi = atan( (z + e_sq * nu * sin(phi)) / p );\n   } while (fabs(lastphi - phi) > 1e-6);\n\n   // now, it's on the ellipsoid, project it onto the OSGB36 grid:\n\n   // E_0 easting of true origin                400 000m\n   double E_0 = 400000;\n   // N_0 northing of true origin              -100 000m\n   double N_0 = -100000;\n   // F_0 scaling factor on central meridian    0.9996012717\n   double F_0 = 0.9996012717;\n   // lambda_0 longitude of true origin         -2.0 radians: -0.034906585039886591538473815369772\n   double lambda_0 = -0.034906585039886591538473815369772;\n   // phi_0 latitude of true origin             49.0 radians:\n   double phi_0 = 0.85521133347722149269260847655942;\n\n   nu = a * F_0 * pow((1 - e_sq * sqr(sin(phi))),-0.5);\n\n   double n = (a-b) / (a+b);\n   double rho = a * F_0 * (1.0 - e_sq) * pow((1 - e_sq * sqr(sin(phi))),-1.5);\n   double eta_sq = nu / rho - 1;\n\n   double n_sq = pow(n,2);\n   double n_cubed = pow(n,3);\n   double M = b * F_0 * ( (1.0 + n + 0.25 * 5 * (n_sq + n_cubed)) * (phi - phi_0)\n                         -(3.0 * (n + n_sq + 0.125 * 7 * n_cubed)) * sin(phi - phi_0) * cos(phi + phi_0)\n                         +(0.125 * 15.0 * (n_sq + n_cubed)) * sin(2.0 * (phi - phi_0)) * cos(2.0 * (phi + phi_0))\n                         -(35.0/24.0 * n_cubed) * sin(3.0 * (phi - phi_0)) * cos(3.0 * (phi + phi_0))\n                        );\n   double I = M + N_0;\n   double II = 0.5 * nu  * sin(phi) * cos(phi);\n   double tanphi = tan(phi);\n   double III = nu * sin(phi) * pow(cos(phi),3.0) * (5.0 - sqr(tanphi)+ 9.0 * eta_sq) / 24.0;\n   double IIIA = nu * sin(phi) * pow(cos(phi),5.0) * (61.0 - 58.0 * sqr(tanphi) + pow(tanphi,4.0)) / 720.0;\n   double IV = nu * cos(phi);\n   double V  = nu * pow(cos(phi),3.0) * (nu/rho - sqr(tanphi)) / 6.0;\n   double VI = nu * pow(cos(phi),5.0) * (5.0 - 18.0 * sqr(tanphi) + pow(tanphi,4) + 14.0 * eta_sq - 58.0 * sqr(tanphi) * eta_sq) / 120.0;\n\n   double E = E_0 + IV * (lambda - lambda_0) + V * pow((lambda - lambda_0),3) + VI * pow((lambda - lambda_0),5);\n   double N = I + II * pow((lambda - lambda_0),2) + III * pow((lambda - lambda_0),4) + IIIA * pow((lambda - lambda_0),6);\n\n   return Point2f(E,N);\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\nstatic long g_count = 0L;\n\nint bitcount(int a)\n{\n   int ret = 0;\n   while (a != 0) {\n      ret += (a & 1) ? 1 : 0;\n      a = a >> 1;\n   }\n   return ret;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////\n\n// EdgeU is used for polygon clipping to viewports\n\n// are a,b,c in ccw order (true) or cw order (false)\nbool ccwEdgeU(const EdgeU& a, const EdgeU& b, const EdgeU& c)\n{\n   bool ccw = false;\n   if (c.edge > a.edge || (c.edge == a.edge && c.u > a.u)) {\n      if (b.edge > a.edge || (b.edge == a.edge && b.u > a.u)) {\n         if  (b.edge < c.edge || (b.edge == c.edge && b.u < c.u)) {\n            ccw = true;\n         }\n      }\n   }\n   else {\n      if (b.edge > a.edge || (b.edge == a.edge && b.u > a.u)) {\n         ccw = true;\n      }\n      else if (b.edge < c.edge || (b.edge == c.edge && b.u < c.u)) {\n            ccw = true;\n      }\n   }\n   return ccw;\n}\n\n// EdgeU is used for polygon clipping to viewports\n// get the actual point from an EdgeU\nPoint2f QtRegion::getEdgeUPoint(const EdgeU& eu)\n{\n   switch (eu.edge) {\n      case 0:\n         return Point2f(bottom_left.x + (eu.u * width()), bottom_left.y);\n      case 1:\n         return Point2f(top_right.x, bottom_left.y + (eu.u * height()));\n      case 2:\n         return Point2f(top_right.x - (eu.u * width()), top_right.y);\n      case 3:\n         return Point2f(bottom_left.x, top_right.y - (eu.u * height()));\n   }\n   return Point2f();\n}\n\n// EdgeU is used for polygon clipping to viewports\n// get where the polygon exits the viewport\nEdgeU QtRegion::getCutEdgeU(const Point2f& inside, const Point2f& outside)\n{\n   EdgeU eu;\n   if (outside.x < bottom_left.x) {\n      double y = outside.y + (inside.y - outside.y) * (bottom_left.x - outside.x) / (inside.x-outside.x);\n      if (y >= bottom_left.y && y <= top_right.y) {\n         eu.edge = 3;\n         eu.u = (top_right.y - y) / height();\n      }\n   }\n   if (eu.edge == -1 && outside.x > top_right.x) {\n      double y = inside.y + (outside.y - inside.y) * (top_right.x - inside.x) / (outside.x-inside.x);\n      if (y >= bottom_left.y && y <= top_right.y) {\n         eu.edge = 1;\n         eu.u = (y - bottom_left.y) / height();\n      }\n   }\n   if (eu.edge == -1 && outside.y < bottom_left.y) {\n      double x = outside.x + (inside.x - outside.x) * (bottom_left.y - outside.y) / (inside.y-outside.y);\n      if (x >= bottom_left.x && x <= top_right.x) {\n         eu.edge = 0;\n         eu.u = (x - bottom_left.x) / width();\n      }\n   }\n   if (eu.edge == -1 && outside.y > top_right.y) {\n      double x = inside.x + (outside.x - inside.x) * (top_right.y - inside.y) / (outside.y-inside.y);\n      if (x >= bottom_left.x && x <= top_right.x) {\n         eu.edge = 2;\n         eu.u = (top_right.x - x) / width();\n      }\n   }\n   // if at this stage eu.edge is still -1 there's a problem!\n   return eu;\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n// union of two regions\n\nQtRegion runion(const QtRegion& a, const QtRegion& b)\n{\n   QtRegion n;\n   n.bottom_left.x = a.bottom_left.x < b.bottom_left.x ?\n                     a.bottom_left.x : b.bottom_left.x;\n   n.bottom_left.y = a.bottom_left.y < b.bottom_left.y ?\n                     a.bottom_left.y : b.bottom_left.y;\n   n.top_right.x   = a.top_right.x   > b.top_right.x ?\n                     a.top_right.x   : b.top_right.x;\n   n.top_right.y   = a.top_right.y   > b.top_right.y ?\n                     a.top_right.y   : b.top_right.y;\n   return n;\n}\n\n// test intersecting regions, touching counts\n\nbool intersect_region(const QtRegion& a, const QtRegion& b, double tolerance)\n{\n   if (overlap_x(a,b,tolerance) && overlap_y(a,b,tolerance)) {\n      return true;\n   }\n   else {\n      return false;\n   }\n}\n\nbool overlap_x(const QtRegion& a, const QtRegion& b, double tolerance)\n{\n   if (a.bottom_left.x > b.bottom_left.x) {\n      if (b.top_right.x >= a.bottom_left.x - tolerance) {\n         return true;\n      }\n   }\n   else {\n      if (a.top_right.x >= b.bottom_left.x - tolerance) {\n         return true;\n      }\n   }\n   return false;\n}\n\nbool overlap_y(const QtRegion& a, const QtRegion& b, double tolerance)\n{\n   if (a.bottom_left.y > b.bottom_left.y) {\n      if (b.top_right.y >= a.bottom_left.y - tolerance) {\n         return true;\n      }\n   }\n   else {\n      if (a.top_right.y >= b.bottom_left.y - tolerance) {\n         return true;\n      }\n   }\n   return false;\n}\n\n// line set up\n\n// default: nothing:\n\nLine::Line()\n{\n   bits.parity = 0;\n   bits.direction = 0;\n   // Points automatically assigned to 0,0\n}\n\nLine::Line(const Point2f& a, const Point2f& b)\n{\n   if (a.x == b.x) {\n      bottom_left.x = a.x;\n      top_right.x = b.x;\n      // vertical lines stored consistently as parity 1\n      if (a.y <= b.y) {\n         bottom_left.y = a.y;\n         top_right.y = b.y;\n         bits.parity = 1;\n         bits.direction = 1;\n      }\n      else {\n         bottom_left.y = b.y;\n         top_right.y = a.y;\n         bits.parity = 1;\n         bits.direction = 0;\n      }\n   }\n   else if (a.x < b.x) {\n      bottom_left.x = a.x;\n      top_right.x = b.x;\n      if (a.y <= b.y) {\n         bottom_left.y = a.y;\n         top_right.y = b.y;\n         bits.parity = 1;\n         bits.direction = 1;\n      }\n      else {\n         bottom_left.y = b.y;\n         top_right.y = a.y;\n         bits.parity = 0; // -1\n         bits.direction = 1;\n      }\n   }\n   else {\n      bottom_left.x = b.x;\n      top_right.x = a.x;\n      if (b.y <= a.y) {\n         bottom_left.y = b.y;\n         top_right.y = a.y;\n         bits.parity = 1;\n         bits.direction = 0;\n      }\n      else {\n         bottom_left.y = a.y;\n         top_right.y = b.y;\n         bits.parity = 0; // -1\n         bits.direction = 0;\n      }\n   }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ndouble dot(const Line& a, const Line& b) {\n   return (a.bx() - a.ax()) * (b.bx() - b.ax()) +\n          (a.by() - a.ay()) * (b.by() - b.ay());\n}\n\n// intersection test: touching counts as an intersection\n// (uses dot product comparison)\n\n// NB You must MUST check that line *regions do not intersect* before using this test\n// By this test, *all parallel lines intersect*\n\nbool intersect_line(const Line& a, const Line& b, double tolerance)\n{\n   g_count++;\n\n   if ( ((a.ay() - a.by()) * (b.ax() - a.ax()) +\n         (a.bx() - a.ax()) * (b.ay() - a.ay())) *\n        ((a.ay() - a.by()) * (b.bx() - a.ax()) +\n         (a.bx() - a.ax()) * (b.by() - a.ay())) <= tolerance &&\n        ((b.ay() - b.by()) * (a.ax() - b.ax()) +\n         (b.bx() - b.ax()) * (a.ay() - b.ay())) *\n        ((b.ay() - b.by()) * (a.bx() - b.ax()) +\n         (b.bx() - b.ax()) * (a.by() - b.ay())) <= tolerance)\n   {\n      return true;\n   }\n\n   return false;\n}\n\n// intersection test: touching does not count as an intersection\n// (uses dot product comparison)\n\nbool intersect_line_no_touch(const Line& a, const Line& b, double tolerance)\n{\n   g_count++;\n\n   if ( ((a.ay() - a.by()) * (b.ax() - a.ax()) +\n         (a.bx() - a.ax()) * (b.ay() - a.ay())) *\n        ((a.ay() - a.by()) * (b.bx() - a.ax()) +\n         (a.bx() - a.ax()) * (b.by() - a.ay())) < -tolerance &&\n        ((b.ay() - b.by()) * (a.ax() - b.ax()) +\n         (b.bx() - b.ax()) * (a.ay() - b.ay())) *\n        ((b.ay() - b.by()) * (a.bx() - b.ax()) +\n         (b.bx() - b.ax()) * (a.by() - b.ay())) < -tolerance)\n   {\n      return true;\n   }\n\n   return false;\n}\n\n// returns 0 for no intersect, 1 for touching and 2 for crossing\nint intersect_line_distinguish(const Line& a, const Line& b, double tolerance)\n{\n   g_count++;\n\n   double alpha = ((a.ay() - a.by()) * (b.ax() - a.ax()) +\n                   (a.bx() - a.ax()) * (b.ay() - a.ay())) *\n                  ((a.ay() - a.by()) * (b.bx() - a.ax()) +\n                   (a.bx() - a.ax()) * (b.by() - a.ay()));\n\n   double beta =  ((b.ay() - b.by()) * (a.ax() - b.ax()) +\n                   (b.bx() - b.ax()) * (a.ay() - b.ay())) *\n                  ((b.ay() - b.by()) * (a.bx() - b.ax()) +\n                   (b.bx() - b.ax()) * (a.by() - b.ay()));\n\n   if (alpha <= tolerance && beta <= tolerance) {\n      if (alpha < -tolerance && beta < -tolerance) {\n         return 2;\n      }\n      else {\n         return 1;\n      }\n   }\n\n   return 0;\n}\n\n// returns 0 for no intersect, 1 for touching and 2 for crossing\n// n.b. only used by polygon contains -- throws if the first point of line b is touching line a\n// (first point of line b is the point to be tested) -- i.e., throws if point touches polygon\nint intersect_line_b(const Line& a, const Line& b, double tolerance)\n{\n   g_count++;\n\n   double alpha = ((a.ay() - a.by()) * (b.ax() - a.ax()) +\n                   (a.bx() - a.ax()) * (b.ay() - a.ay()));\n\n   double beta  = ((a.ay() - a.by()) * (b.bx() - a.ax()) +\n                   (a.bx() - a.ax()) * (b.by() - a.ay()));\n\n   double gamma = ((b.ay() - b.by()) * (a.ax() - b.ax()) +\n                   (b.bx() - b.ax()) * (a.ay() - b.ay())) *\n                  ((b.ay() - b.by()) * (a.bx() - b.ax()) +\n                   (b.bx() - b.ax()) * (a.by() - b.ay()));\n\n   if (alpha * beta <= tolerance && gamma <= tolerance) {\n      if (alpha * beta < -tolerance && gamma < -tolerance) {\n         return 2;\n      }\n      else {\n         // this function is only used for poly contains point,\n         // the throw is defined if the point is *on* the polygon edge\n         // (within the tolerance)\n         if (fabs(alpha) <= tolerance) {\n            throw 1;\n         }\n         return 1;\n      }\n   }\n   return 0;\n}\n\ndouble Line::intersection_point(const Line& l, int axis, double tolerance) const\n{\n   // use axis = XAXIS for width() > height()\n   double loc;\n   if (axis == XAXIS) {\n      if (l.width() == 0.0) {\n         loc = l.bottom_left.x;\n      }\n      else {\n         double lg = l.grad(YAXIS);\n         double g = grad(YAXIS);\n         if (fabs(lg - g) <= tolerance) {\n            // these have almost the same gradient, so it's impossible to tell where they intersect: going for midpoint\n            Point2f p = l.midpoint();\n            loc = (p.x > top_right.x) ? top_right.x : ((p.x < bottom_left.x) ? bottom_left.x : p.x);\n         }\n         else {\n            // this is the same as: constant(YAXIS) - l.constant(YAXIS)) / (l.grad(YAXIS) - grad(YAXIS));\n            loc = ((ay() - g * ax()) - (l.ay() - lg * l.ax())) / (lg - g);\n         }\n      }\n   }\n   else {\n      if (l.height() == 0.0) {\n         loc = l.bottom_left.y;\n      }\n      else {\n         double lg = l.grad(XAXIS);\n         double g = grad(XAXIS);\n         if (fabs(lg - g) <= tolerance) {\n            // these have almost the same gradient, so it's impossible to tell where they intersect: going for midpoint\n            Point2f p = l.midpoint();\n            loc = (p.y > top_right.y) ? top_right.y : ((p.y < bottom_left.y) ? bottom_left.y : p.y);\n         }\n         else {\n            // this is the same as: constant(XAXIS) - l.constant(XAXIS)) / (l.grad(XAXIS) - grad(XAXIS));\n            loc = ((ax() - g * ay()) - (l.ax() - lg * l.ay())) / (lg - g);\n         }\n      }\n   }\n   return loc;\n}\n\n// intersecting line segments, touching counts\n// (uses intersection point comparison)\n\nbool Line::intersect_line(const Line& l, int axis, double& loc) const\n{\n   // please be intelligent when passing the axis...\n   if (axis == XAXIS) {\n      if (l.width() == 0.0) {\n         // Special case:\n         double y = ay() + sign() * (l.ax() - ax()) * height() / width();\n         if (y >= bottom_left.y && y <= l.top_right.y) { // <- you must have checked\n            loc = l.bottom_left.x;                       //    the regions overlap first\n            return true;\n         }\n         return false;\n      }\n      else {\n         // Standard:   (note: if m1 == m2, loc is NaN)\n         loc = (constant(YAXIS) - l.constant(YAXIS)) / (l.grad(YAXIS) - grad(YAXIS));\n         if (std::isnan(loc)) {\n            // lines are parallel --- are they coincident?\n            // you must have checked the regions overlap first\n            if (constant(YAXIS) == l.constant(YAXIS)) {\n               return true;\n            }\n         }\n         else if (loc >= l.bottom_left.x && loc <= l.top_right.x) {\n            return true;\n         }\n         return false;\n      }\n   }\n   else {\n      if (l.height() == 0.0) {\n         // Special case:\n         double x = ax() + sign() * (l.ay() - ay()) * width() / height();\n         if (x >= bottom_left.x && x <= top_right.x) { // <- you must have checked\n            loc = l.bottom_left.y;                     //  the regions overlap first\n            return true;\n         }\n         return false;\n      }\n      else {\n         // Standard:   (note: if m1 == m2, loc is NaN)\n         loc = (constant(XAXIS) - l.constant(XAXIS)) / (l.grad(XAXIS) - grad(XAXIS));\n         if (std::isnan(loc)) {\n            // lines are parallel --- are they coincident?\n            // you must have checked the regions overlap first\n            if (constant(XAXIS) == l.constant(XAXIS)) {\n               return true;\n            }\n         }\n         else if (loc >= l.bottom_left.y && loc <= l.top_right.y) {\n            return true;\n         }\n         return false;\n      }\n   }\n   return false;\n}\n\n// this converts the loc back into a point:\n\nPoint2f Line::point_on_line(double loc, int axis) const\n{\n   Point2f p;\n   if (axis == XAXIS) {\n      p = Point2f(loc, grad(YAXIS) * loc + constant(YAXIS));\n   }\n   else {\n      p = Point2f(grad(XAXIS) * loc + constant(XAXIS), loc);\n   }\n   return p;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\n// distance from a point to a line segment\n\ndouble dist(const Point2f& point, const Line& line)\n{\n   double d = 0.0;\n\n   Point2f alpha = line.end() - line.start();\n   Point2f beta = point - line.end();\n   Point2f gamma = line.start() - line.end();\n   Point2f delta = point - line.start();\n\n   if (dot(alpha,beta) > 0) {\n      d = beta.length();\n   }\n   else if (dot(gamma,delta) > 0) {\n      d = delta.length();\n   }\n   else {\n      if (alpha.length() < 1e-9 * beta.length()) {\n         // should actually be a user-specified tolerance test\n         d = beta.length();\n      }\n      else {\n         d = fabs(det(alpha,beta)) / alpha.length();\n      }\n   }\n   return d;\n}\n\n/*\n   // for infinite line rather than line segment\n   return fabs((line.bx() - line.ax()) * (line.ay() - point.y) -\n               (line.ax() - point.x) * (line.by() - line.ay())) / line.length();\n*/\n\n//////////////////////////////////////////////////////////////////////////////\n\n// intersection test\n\nbool intersect(const RegionTree& a, const RegionTree& b)\n{\n   if (a.is_leaf() && b.is_leaf()) {\n      if (intersect_region( QtRegion(a), QtRegion(b))) {\n         return intersect_line( (const Line&) QtRegion(a), (const Line&) QtRegion(b) );\n      }\n      else {\n         return false;\n      }\n   }\n   else {\n      if (intersect_region( QtRegion(a), QtRegion(b))) {\n         return subintersect(a, b);\n      }\n      else {\n         return false;\n      }\n   }\n}\n\nbool subintersect(const RegionTree& a, const RegionTree& b)\n{\n   if (intersect(a.left(),b.left())) {\n      return true;\n   }\n   else if (intersect(a.right(),b.right())) {\n      return true;\n   }\n   else if (intersect(a.left(),b.right())) {\n      return true;\n   }\n   else if (intersect(a.right(),b.left())) {\n      return true;\n   }\n\n   return false;\n}\n\n// Intersection count\n\nint intersections(const RegionTree& a, const Line& b)\n{\n   int n = 0;\n\n   if (!a.is_leaf()) {\n      if (intersect_region( QtRegion(a), QtRegion(b))) {\n         n += intersections(a.left(), b);\n              n += intersections(a.right(), b);\n      }\n   }\n   else {\n      // Note: touching lines count 1, non-touching lines count 2, this allows through\n      // vertex lines (where it touches both vertices)\n      n += intersect_line_b( (const Line&) a, (const Line&) b );\n   }\n\n   return n;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\n// crop a line to fit within bounds of region\n// if line lies outside region, returns false\n\nbool Line::crop(const QtRegion& r)\n{\n   if (bx() >= r.bottom_left.x) {\n      if (ax() < r.bottom_left.x) {\n         // crop!\n         ay() += sign() * (height() * (r.bottom_left.x - ax()) / width());\n         ax() = r.bottom_left.x;\n      }\n      if (ax() <= r.top_right.x) {\n         if (bx() > r.top_right.x) {\n            // crop!\n            by() -= sign() * height() * (bx() - r.top_right.x) / width();\n            bx() = r.top_right.x;\n         }\n         if (top_right.y >= r.bottom_left.y) {\n            if (bottom_left.y < r.bottom_left.y) {\n               // crop!\n               if (bits.parity) {\n                  ax() += width() * (r.bottom_left.y - bottom_left.y) / height();\n               }\n               else {\n                  bx() -= width() * (r.bottom_left.y - bottom_left.y) / height();\n               }\n               bottom_left.y = r.bottom_left.y;\n            }\n            if (bottom_left.y <= r.top_right.y) {\n               if (top_right.y > r.top_right.y) {\n                  // crop!\n                  if (bits.parity) {\n                     bx() -= width() * (top_right.y - r.top_right.y) / height();\n                  }\n                  else {\n                     ax() += width() * (top_right.y - r.top_right.y) / height();\n                  }\n                  top_right.y = r.top_right.y;\n               }\n               // if we got this far, well done, it's in the region:\n               return true;\n            }\n         }\n      }\n   }\n   // returns false if the entire line is outside the region:\n   return false;\n}\n\n// cast a ray to the edge of a box\n\nvoid Line::ray(short dir, const QtRegion& r)\n{\n   if (dir == bits.direction) {\n      if (width() >= height()) {\n         by() = ay() + sign() * height() * (r.top_right.x - ax()) / width();\n         bx() = r.top_right.x;\n      }\n      else if (bits.parity) {\n         bx() = ax() + width() * (r.top_right.y - ay()) / height();\n         by() = r.top_right.y;\n      }\n      else {\n         bx() = ax() + width() * (ay() - r.bottom_left.y) / height();\n         by() = r.bottom_left.y;\n      }\n   }\n   else {\n      if (width() >= height()) {\n         ay() = by() - sign() * height() * (bx() - r.bottom_left.x) / width();\n         ax() = r.bottom_left.x;\n      }\n      else if (bits.parity) {\n         ax() = bx() - width() * (by() - r.bottom_left.y) / height();\n         ay() = r.bottom_left.y;\n      }\n      else {\n         ax() = bx() - width() * (r.top_right.y - by()) / height();\n         ay() = r.top_right.y;\n      }\n   }\n   // now fit within bounds...\n   crop(r);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\n// Polygon set up (the hard bit!)\n\nvoid Poly::add_line_segment(const Line& l)\n{\n   m_line_segments++;\n   RegionTreeLeaf *leaf = new RegionTreeLeaf( l );\n\n   if (m_p_root == NULL)\n   {\n      // first ever node\n\n      m_p_root = (RegionTree *) leaf;\n   }\n   else\n   {\n      // traverse the tree to the insertion point\n      //   you'll just have to take my word for it that the next line\n      //   gives you the correct position to insert\n      int cut_level = bitcount(m_line_segments - 1) - 2;\n\n      if (cut_level < 0)\n      {\n         // replace the root node\n\n         QtRegion new_region =\n            runion( QtRegion(*m_p_root), QtRegion(*leaf) );\n         RegionTree *new_root =\n            new RegionTreeBranch( new_region, *m_p_root, *leaf );\n         m_p_root = new_root;\n     }\n     else\n     {\n         RegionTree *here = m_p_root;\n         for (int i = 0; i < cut_level; i++) {\n            here = here->m_p_right;\n         }\n\n         // cut and insert\n\n         RegionTree& insertion_point = here->right();\n\n         QtRegion new_region =\n            runion( QtRegion(insertion_point), QtRegion(*leaf) );\n\n         RegionTree *new_node =\n            new RegionTreeBranch( new_region, insertion_point, *leaf );\n\n         here->m_p_right = new_node;\n\n         // traverse up tree unioning regions\n         // (saving data by not recording parents!)\n         // Note must be '>=' to catch current root node --- I really stuffed up earlier with '>'!\n         while (cut_level >= 0)\n         {\n            here = m_p_root;\n            for (int j = 0; j < cut_level; j++) {\n               here = here->m_p_right;\n            }\n            here->m_p_region = new Line(\n               runion(QtRegion(here->left()), QtRegion(here->right())) );\n            cut_level--;\n         }\n      }\n   }\n}\n\n// ...and after all the efficient stuff, we have a really\n// inefficient polygon copy... hmm\n\nRegionTree *Poly::copy_region_tree( const RegionTree* tree )\n{\n   if ( !tree ) {\n      return NULL;\n   }\n\n   RegionTree *newtree;\n\n   if (tree->is_leaf()) {\n      newtree = new RegionTreeLeaf();\n      newtree->m_p_region = new Line( *(tree->m_p_region) );\n      return newtree;\n   }\n   else {\n      newtree = new RegionTreeBranch();\n   }\n\n   pvector<RegionTree *> newlist;\n   pvector<RegionTree *> oldlist;\n\n   oldlist.push_back( (RegionTree *) tree );\n   newlist.push_back( (RegionTree *) newtree );\n\n   do {\n      RegionTree *oldnode = oldlist.tail(); oldlist.pop_back();\n      RegionTree *newnode = newlist.tail(); newlist.pop_back();\n\n      newnode->m_p_region = new Line( *oldnode->m_p_region );\n\n      if (oldnode->m_p_left) {\n         if (oldnode->m_p_left->is_leaf()) {\n            newnode->m_p_left = new RegionTreeLeaf();\n            newnode->m_p_left->m_p_region =\n               new Line( *(oldnode->m_p_left->m_p_region) );\n         }\n         else {\n            oldlist.push_back( oldnode->m_p_left );\n            newnode->m_p_left = new RegionTreeBranch();\n            newlist.push_back( newnode->m_p_left );\n         }\n      }\n      if (oldnode->m_p_right) {\n         if (oldnode->m_p_right->is_leaf()) {\n            newnode->m_p_right = new RegionTreeLeaf();\n            newnode->m_p_right->m_p_region =\n               new Line( *(oldnode->m_p_right->m_p_region) );\n         }\n         else {\n            oldlist.push_back( oldnode->m_p_right );\n            newnode->m_p_right = new RegionTreeBranch();\n            newlist.push_back( newnode->m_p_right );\n         }\n      }\n\n   } while (oldlist.size() > 0);\n\n   return newtree;\n}\n\n// polygon destruction\n\nvoid Poly::destroy_region_tree()\n{\n   if ( !m_p_root ) {\n      return;\n   }\n\n   pvector<RegionTree *> del_node_list;\n   pvector<short> del_node_dir;\n\n   del_node_list.push_back( m_p_root );\n\n   do {\n      RegionTree *current_node = del_node_list.tail();\n\n      if (current_node->m_p_left == current_node &&\n          current_node->m_p_right == current_node) {\n\n         delete current_node;\n         del_node_list.pop_back();\n\n         if (del_node_list.size() > 0) {\n            if (del_node_dir.tail() == 0) {\n               del_node_list.tail()->m_p_left = del_node_list.tail();\n               del_node_dir.pop_back();\n            }\n            else {\n               del_node_list.tail()->m_p_right = del_node_list.tail();\n               del_node_dir.pop_back();\n            }\n         }\n      }\n      else {\n         if (current_node->m_p_right == NULL) {\n            current_node->m_p_right = current_node;\n         }\n         else if (current_node->m_p_right != current_node) {\n            del_node_list.push_back( current_node->m_p_right );\n            del_node_dir.push_back( 1 );\n         }\n         else {\n            del_node_list.push_back( current_node->m_p_left );\n            del_node_dir.push_back( 0 );\n         }\n      }\n   }\n   while (del_node_list.size() > 0);\n\n   m_p_root = NULL;\n}\n\n// contains? intersects??\n\n// Here they are!\n\nbool Poly::contains( const Point2f& p )\n{\n   // n.b., intersections throws on some accidental alignments --\n   // we must use a point outside the polygon to extend our test\n   // line from to prevent them\n   Line l( p, Point2f( get_bounding_box().top_right.x + get_bounding_box().width(),\n                       get_bounding_box().top_right.y + get_bounding_box().height()) );\n\n   int double_n;\n\n   // note, touching intersections count 1/2\n   try {\n      double_n = intersections( *(m_p_root), l );\n   }\n   catch (int) {\n      throw 1; // throws if on edge\n   }\n\n   if (double_n % 2 == 0 && double_n % 4 != 0) {\n      return true;\n   }\n\n   return false;\n}\n\nbool intersect( const Poly& a, const Poly& b )\n{\n   if ( intersect( *(a.m_p_root), *(b.m_p_root)) ) {\n      return true;\n   }\n   return false;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/p2dpoly.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n// 2d poly (own format, adapted from the original Sala libraries\n\n// The idea is that from this format,\n// we can read into Cosmo3d as well as Sala based applications\n\n#pragma once\n// Using doubles right the way through can really eat memory for isovist\n// polygon files, thus we use a defined type, change as appropriate:\n\n#include <algorithm>\n#include <mgraph440/pafmath.h>\n#include <mgraph440/comm.h> // communicator used in BSP tree construction\n\nnamespace mgraph440 {\n\n// Note: code depends on XAXIS being 0 and YAXIS being 1 --- do not change\nenum {\n   NOAXIS = -1, XAXIS = 0, YAXIS = 1\n};\n\nclass  Point2f;\nbool approxeq(const Point2f& p1, const Point2f& p2, double tolerance = 0.0);\nclass  QtRegion;\nbool intersect_region(const QtRegion& a, const QtRegion& b, double tolerance = 0.0);\nbool overlap_x(const QtRegion& a, const QtRegion& b, double tolerance = 0.0);\nbool overlap_y(const QtRegion& a, const QtRegion& b, double tolerance = 0.0);\nclass Line;\nbool intersect_line(const Line& a, const Line& b, double tolerance = 0.0);\nbool intersect_line_no_touch(const Line& a, const Line& b, double tolerance = 0.0);\nint  intersect_line_distinguish(const Line& a, const Line& b, double tolerance = 0.0);\nint  intersect_line_b(const Line& a, const Line& b, double tolerance = 0.0);\nPoint2f intersection_point(const Line& a, const Line& b, double tolerance = 0.0);\n\n// NaN on Intel:\n// Quick mod - TV\n// const double P2DNULL = (const double)0xFFFFFFFF7FF7FFFF;\n// for non-Intel:  0x7FF7FFFFFFFFFFFF\n\n// Point\n\nclass Point2f\n{\npublic:\n   double x;\n   double y;\n   Point2f()\n//      { x = P2DNULL; y = P2DNULL; }\n      { x = 0.0; y = 0.0; }\n   Point2f(double a, double b)\n      { x = a; y = b; }\n   bool atZero() const\n//      { return x == P2DNULL || y == P2DNULL; }\n      { return x == 0.0 && y == 0.0; }\n   void normalScale( const QtRegion& );  // inline function: below region\n   void denormalScale( const QtRegion& );\n   void operator += (const Point2f& p)\n      { x += p.x; y += p.y; }\n   void operator -= (const Point2f& p)\n      { x -= p.x; y -= p.y; }\n   void operator *= (const double s)\n      { x *= s; y *= s; }\n   void operator /= (const double s)\n      { x /= s; y /= s; }\n   double& operator [] (int i)\n      { return (i == XAXIS) ? x : y; }\n   const double& operator [] (int i) const\n      { return (i == XAXIS) ? x : y; }\n   friend Point2f operator - (Point2f& p);\n   friend Point2f operator + (const Point2f& p1, const Point2f& p2);\n   friend Point2f operator - (const Point2f& p1, const Point2f& p2);\n   friend bool operator == (const Point2f& p1, const Point2f& p2);\n   friend bool operator != (const Point2f& p1, const Point2f& p2);\n   friend bool operator > (const Point2f& a, const Point2f& b);\n   friend bool operator < (const Point2f& a, const Point2f& b);\n   friend Point2f operator * (const double s, const Point2f& p);\n   friend Point2f operator / (const Point2f& p, const double s);\n   friend double dot(const Point2f& p1, const Point2f& p2);\n   friend double det(const Point2f& p1, const Point2f& p2);\n   friend double dist(const Point2f& p1, const Point2f& p2);\n   friend double dist(const Point2f& point, const Line& line);\n   friend double angle(const Point2f& p1, const Point2f& p2, const Point2f& p3);\n   friend bool approxeq(const Point2f& p1, const Point2f& p2, double tolerance);\n   friend Point2f pointfromangle(double angle);\n   // a couple of useful tests\n   bool intriangle(const Point2f& p1, const Point2f& p2, const Point2f& p3);\n   bool insegment(const Point2f& key, const Point2f& p2, const Point2f& p3, double tolerance = 0.0);\n   // for OS transformation (note: accurate only to 5 metres according to OS)\n   Point2f longlat2os(const Point2f& p);\npublic:\n   // A few simple vector ops:\n   double length() const\n      { return (double) sqrt(x * x + y * y); }\n   Point2f& scale(const double scalar)\n      { x *= scalar; y *= scalar; return *this; }\n   Point2f& scale(const Point2f& scalevec)\n      { x *= scalevec.x; y *= scalevec.y; return *this; }\n   Point2f& normalise()\n      { return scale( 1.0 / length() ); }\n   Point2f& rotate(const double angle)\n      { double t = x;\n        x =  x * cos(angle) - y * sin(angle);\n        y =  y * cos(angle) + t * sin(angle);\n        return *this; }\n   double angle() const\n      { return (y < 0) ? (2.0 * M_PI - acos(x)) : acos(x); }\n};\n\ninline Point2f operator - (Point2f& p)\n{\n   return Point2f(-p.x, -p.y);\n}\n\ninline Point2f operator + (const Point2f& p1, const Point2f& p2)\n{\n   return Point2f(p1.x + p2.x, p1.y + p2.y);\n}\n\ninline Point2f operator - (const Point2f& p1, const Point2f& p2)\n{\n   return Point2f(p1.x - p2.x, p1.y - p2.y);\n}\n\ninline bool operator == (const Point2f& p1, const Point2f& p2)\n{ return (p1.x == p2.x && p1.y == p2.y); }\ninline bool operator != (const Point2f& p1, const Point2f& p2)\n{ return (p1.x != p2.x || p1.y != p2.y); }\ninline bool operator > (const Point2f& p1, const Point2f& p2)\n{ return (p1.x > p2.x || (p1.x == p2.x && p1.y > p2.y)); }\ninline bool operator < (const Point2f& p1, const Point2f& p2)\n{ return (p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y)); }\n\ninline Point2f operator * (const double s, const Point2f& p)\n{\n   return Point2f(s * p.x, s * p.y);\n}\n\ninline Point2f operator / (const Point2f& p, const double s)\n{\n   return Point2f(p.x / s, p.y / s);\n}\n\ninline double dot(const Point2f& p1, const Point2f& p2)\n{\n   return (p1.x * p2.x + p1.y * p2.y);\n}\n\n// greater than 0 => p2 left (anticlockwise) of p1, less than 0 => p2 right (clockwise) of p1\ninline double det(const Point2f& p1, const Point2f& p2)\n{\n   return (p1.x * p2.y - p1.y * p2.x);\n}\n\ninline double dist(const Point2f& p1, const Point2f& p2)\n{\n   return sqrt(sqr(p1.x - p2.x) + sqr(p1.y - p2.y));\n}\n\ninline double angle(const Point2f& p1, const Point2f& p2, const Point2f& p3)\n{\n   Point2f a = p1 - p2;\n   Point2f b = p3 - p2;\n   a.normalise();\n   b.normalise();\n   // ensure in range (f.p. error can throw out)\n   double d = std::min<double>(std::max<double>(dot(a,b),-1.0),1.0);\n   return (sgn(det(a,b)) == 1) ? acos(d) : 2.0 * M_PI - acos(d);\n}\n\ninline bool approxeq(const Point2f& p1, const Point2f& p2, double tolerance)\n{\n   return (fabs(p1.x - p2.x) <= tolerance && fabs(p1.y - p2.y) <= tolerance);\n}\n\ninline bool Point2f::insegment(const Point2f& key, const Point2f& p2, const Point2f& p3, double tolerance)\n{\n   Point2f va = p2 - key;\n   Point2f vb = p3 - key;\n   Point2f vp = *this - key;\n   double ap = det(va,vp);\n   double bp = det(vb,vp);\n   if ((dot(va,vp) > 0 && dot(vb,vp) > 0) && (sgn(ap) != sgn(bp) || fabs(ap) < tolerance || fabs(bp) < tolerance) ) {\n      return true;\n   }\n   return false;\n}\n\ninline bool Point2f::intriangle(const Point2f& p1, const Point2f& p2, const Point2f& p3)\n{\n   // touching counts\n   int test = sgn(det(p2-p1,*this-p1));\n   if (test == sgn(det(p3-p2,*this-p2)) && test == sgn(det(p1-p3,*this-p3))) {\n      return true;\n   }\n   return false;\n}\n\ninline Point2f pointfromangle(double angle)\n{\n   Point2f p;\n   p.x = cos(angle);\n   p.y = sin(angle);\n   return p;\n}\n\nPoint2f gps2os(const Point2f& p);\n\n// an event is a point plus time (as in spacetime technical language)\nclass Event2f : public Point2f\n{\npublic:\n   double t; // time in seconds\n   Event2f() : Point2f()\n   { t = 0.0; }\n   Event2f(double _x, double _y, double _t) : Point2f(_x,_y)\n   { t = _t; }\n   Event2f(Point2f& _p) : Point2f(_p)\n   { t = 0.0; }\n   Event2f(Point2f& _p, double _t) : Point2f(_p)\n   { t = _t; }\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////\n\nclass Point3f\n{\npublic:\n   double x;\n   double y;\n   double z;\n   Point3f(double a = 0.0, double b = 0.0, double c = 0.0)\n      { x = a; y = b; z = c;}\n   Point3f(const Point2f& p)\n      { x = p.x; y = 0.0; z = p.y; } // Note! not z = -y (due to an incosistency earlier...)\n   bool inside( const Point3f& bl, const Point3f& tr )   // now inclusive (...)\n      { return (x >= bl.x && y >= bl.y && z >= bl.z && x <= tr.x && y <= tr.y && z <= tr.z); }\n   operator Point2f()\n      { return Point2f( x, z ); } // Note! not x, -z (due to an inconsistency earlier...)\n   Point2f xy()\n      { return Point2f(x, y); }  // From the x, y plane\n   // A few simple vector ops:\n   double length() const\n      { return (double) sqrt(x * x + y * y + z * z); }\n   Point3f& scale(const double scalar)\n      { x *= scalar; y *= scalar; z *= scalar; return *this; }\n   Point3f& normalise()\n      { return scale( 1.0 / length() ); }\n   Point3f& rotate(double theta, double phi)\n      { double t = x;\n        x = t * cos(theta) - y * sin(theta);\n        y = y * cos(theta) + t * sin(theta);\n        t = x;\n        x = t * cos(phi) - z * sin(phi);\n        z = z * cos(phi) - t * sin(phi);\n        return *this; }\n   //\n   friend double dot(const Point3f& a, const Point3f& b);\n   friend Point3f cross(const Point3f& a, const Point3f& b);\n};\n\ninline double dot(const Point3f& a, const Point3f& b)\n{\n   return (a.x * b.x + a.y * b.y + a.z * b.z);\n}\ninline Point3f cross(const Point3f& a, const Point3f& b)\n{\n   return Point3f( a.y * b.z - b.y * a.z, a.z * b.x - b.z * a.x, a.x * b.y - b.x * a.y );\n}\n\n//\n\n//////////////////////////////////////////////////////////////////////////////\n\n// used for clipping of polygons to regions\n\nstruct EdgeU {\n   int edge;\n   double u;\n   EdgeU(int e = -1, double _u = 0.0)\n   { edge = e; u = _u; }\n   EdgeU(const EdgeU& eu)\n   { edge = eu.edge; u = eu.u; }\n   friend bool ccwEdgeU(const EdgeU& a, const EdgeU& b, const EdgeU& c);\n};\n\n// QtRegion\n\nclass QtRegion\n{\npublic:\n   Point2f bottom_left;\n   Point2f top_right;\n   QtRegion(const Point2f& bl = Point2f(), const Point2f& tr = Point2f())\n      { bottom_left = bl; top_right = tr; }\n   QtRegion(const QtRegion& r)\n      { bottom_left = r.bottom_left; top_right = r.top_right; }\n   QtRegion& operator = (const QtRegion& r)\n      { bottom_left = r.bottom_left; top_right = r.top_right; return *this; }\n   //\n   double height() const\n      { return top_right.y - bottom_left.y; }\n   double width() const\n   // The assumption that top_right.x is always > bottom_left.x is not always true.\n   // Returning a negative value here causes an infinite loop at axialmap.cpp line 3106\n   // after overlapdist is assigned a negative value at axialmap.cpp line 3084.\n   // height() above could also be changed for this reason, but this is a band-aid\n   // fix for the real problem, which is why the top_right > bottom_left assumption\n   // is assumed to be 100% valid but is, in some instances, not valid.\n   // { return top_right.x - bottom_left.x; }\n      { return fabs(top_right.x - bottom_left.x); }\n   double area() const\n      { return height() * width(); }\n   void normalScale( const QtRegion& r )\n      { top_right.normalScale(r); bottom_left.normalScale(r); }\n   void denormalScale( const QtRegion& r )\n      { top_right.denormalScale(r); bottom_left.denormalScale(r); }\n   void scale( const Point2f& scalevec )\n      { top_right.scale(scalevec); bottom_left.scale(scalevec); }\n   void offset( const Point2f& offset )\n      { top_right += offset; bottom_left += offset; }\n   Point2f getCentre() const\n      { return Point2f( (bottom_left.x + top_right.x) / 2.0,\n                        (bottom_left.y + top_right.y) / 2.0 ); }\n   //\n   bool contains ( const Point2f& p ) const\n   { return (p.x > bottom_left.x && p.x < top_right.x && p.y > bottom_left.y && p.y < top_right.y); }\n   bool contains_touch ( const Point2f& p ) const\n   { return (p.x >= bottom_left.x && p.x <= top_right.x && p.y >= bottom_left.y && p.y <= top_right.y); }\n   void encompass( const Point2f& p )\n   { if (p.x < bottom_left.x) bottom_left.x = p.x; if (p.x > top_right.x) top_right.x = p.x;\n     if (p.y < bottom_left.y) bottom_left.y = p.y; if (p.y > top_right.y) top_right.y = p.y; }\n   //\n   bool atZero() const\n   { return bottom_left.atZero() || top_right.atZero(); }\n   //\n   Point2f getEdgeUPoint(const EdgeU& eu);\n   EdgeU getCutEdgeU(const Point2f& inside, const Point2f& outside);\n   //\n   friend bool intersect_region(const QtRegion& a, const QtRegion& b, double tolerance);\n   friend bool overlap_x(const QtRegion& a, const QtRegion& b, double tolerance);\n   friend bool overlap_y(const QtRegion& a, const QtRegion& b, double tolerance);\n   //\n   // set functions\n   friend QtRegion runion(const QtRegion& a, const QtRegion& b);\n   friend QtRegion rintersect( const QtRegion& a, const QtRegion& b); // undefined?\n   //\n   void grow(const double scalar)\n   { Point2f dim = top_right - bottom_left;\n     dim.scale(scalar - 1.0);\n     top_right += dim;\n     bottom_left -= dim; }\n};\n\n// First time we have a region available to use...\ninline void Point2f::normalScale( const QtRegion& r )\n{\n   if(r.width()) x = (x - r.bottom_left.x) / r.width();\n   else x = 0.0;\n   if(r.height()) y = (y - r.bottom_left.y) / r.height();\n   else y = 0.0;\n}\n\ninline void Point2f::denormalScale( const QtRegion& r )\n{\n   x = x * r.width() + r.bottom_left.x;\n   y = y * r.height() + r.bottom_left.y;\n}\n\n// Lines are stored left to right as regions,\n// the parity tells us whether the region should be inverted\n// top to bottom to get the line\n\nclass Line : public QtRegion\n{\nprotected:\n   struct Bits {\n      Bits() : x_dummy(0), y_dummy(0), z_dummy(0){}\n      char parity      : 8;  // 1 ... positive, 0 ... negative\n      char direction   : 8;  // 1 ... positive, 0 ... negative\n\n      // dummy variables as it seems to be necessary that the width of this struct is 8 bytes\n      // and I don't want any uninitialised memory that gets written to file accidentally\n      char x_dummy : 8;\n      char y_dummy : 8;\n      int  z_dummy : 32;\n   };\n   Bits bits;\npublic:\n   Line();\n   Line(const Point2f& a, const Point2f& b);\n   Line(const QtRegion& r) : QtRegion(r)\n      { bits.parity = 1; bits.direction = 1; }\n   Line(const Line& l) : QtRegion(l)\n      { bits = l.bits; }\n   Line& operator = (const Line& l)\n      { this->QtRegion::operator = (l); bits = l.bits; return *this; }\n   //\n   friend bool intersect_line(const Line& a, const Line& b, double tolerance);\n   friend bool intersect_line_no_touch(const Line& a, const Line& b, double tolerance);\n   friend int  intersect_line_distinguish(const Line& a, const Line& b, double tolerance);\n   friend int  intersect_line_b(const Line& a, const Line& b, double tolerance);\n   //\n   // fills in the location along the axis where the intersection happens\n   bool intersect_line(const Line& l, int axis, double& loc) const;\n   double intersection_point(const Line& l, int axis, double tolerance = 0.0) const;\n   // this converts a loc retrieved from intersect line or intersection point back into a point:\n   Point2f point_on_line(double loc, int axis) const;\n   // ...and a quick do it all in one go:\n   friend Point2f intersection_point(const Line& a, const Line& b, double tolerance);\n   //\n   bool crop(const QtRegion& r);\n   void ray(short dir, const QtRegion& r);\n   //\n   friend double dot(const Line& a, const Line& b);\n   //\n   double ax() const { return bottom_left.x; }\n   double& ax() { return bottom_left.x; }\n   double bx() const { return top_right.x; }\n   double& bx() { return top_right.x; }\n   double ay() const { return bits.parity ? bottom_left.y : top_right.y; }\n   double& ay() { return bits.parity ? bottom_left.y : top_right.y; }\n   double by() const { return bits.parity ? top_right.y : bottom_left.y; }\n   double& by() { return bits.parity ? top_right.y : bottom_left.y; }\n   //\n   const Point2f start() const\n      { return Point2f( bottom_left.x, (bits.parity ? bottom_left.y : top_right.y) ); }\n   const Point2f end() const\n      { return Point2f( top_right.x,   (bits.parity ? top_right.y : bottom_left.y) ); }\n   const Point2f midpoint() const\n      { return Point2f( (start() + end()) / 2); }\n   //\n   // helpful to have a user friendly indication of direction:\n   bool rightward() const\n      { return bits.direction == 1; }\n   bool upward() const\n      { return bits.direction == bits.parity; }\n   //\n   const Point2f t_start() const\n      { return Point2f( (rightward() ? bottom_left.x : top_right.x), (upward() ? bottom_left.y : top_right.y) ); }\n   const Point2f t_end() const\n      { return Point2f( (rightward() ? top_right.x : bottom_left.x), (upward() ? top_right.y : bottom_left.y) ); }\n   //\n   short sign() const\n      { return bits.parity ? 1 : -1; }\n   //\n   double grad(int axis) const {\n      return (axis == YAXIS) ? sign() * height() / width() : sign() * width() / height();\n   }\n   double constant(int axis) const {\n      return (axis == YAXIS) ? ay() - grad(axis) * ax() : ax() - grad(axis) * ay();\n   }\n   //\n   double length() const\n      { return (double) sqrt((top_right.x - bottom_left.x) * (top_right.x - bottom_left.x) +\n                             (top_right.y - bottom_left.y) * (top_right.y - bottom_left.y)); }\n   //\n   short direction() const\n      { return bits.direction; }\n   Point2f vector() const\n      { return t_end() - t_start(); }\n};\n\ninline Point2f intersection_point(const Line& a, const Line& b, double tolerance)\n{\n   int axis = (a.width() >= a.height()) ? XAXIS : YAXIS;\n   return a.point_on_line(a.intersection_point(b,axis,tolerance),axis);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nstruct TaggedLine\n{\n   Line line;\n   int tag;\n   TaggedLine(const Line& l = Line(),int t = -1) { line = l; tag = t; }\n};\n\n// plain 2-point line without regions\nstruct SimpleLine\n{\npublic:\n    SimpleLine(const Line& line)\n    {\n        m_start.x = line.start().x;\n        m_start.y = line.start().y;\n        m_end.x = line.end().x;\n        m_end.y = line.end().y;\n    }\n    SimpleLine(const Point2f& a, const Point2f& b)\n    {\n        m_start.x = a.x;\n        m_start.y = a.y;\n        m_end.x = b.x;\n        m_end.y = b.y;\n    }\n    SimpleLine(double x1, double y1, double x2, double y2)\n    {\n        m_start.x = x1;\n        m_start.y = y1;\n        m_end.x = x2;\n        m_end.y = y2;\n    }\n    const Point2f& start() const { return m_start; }\n    const Point2f& end() const { return m_end; }\nprivate:\n    Point2f m_start;\n    Point2f m_end;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\n\n// not sure if this code is used any more:\n\n// Now the difficult bit: making the line segments into polygons...\n// The polygons are stored in a tree format so that intersection testing is easier\n\nclass Poly;\n\nclass RegionTree\n{\nfriend class mgraph440::Poly;\nprotected:\n   Line       *m_p_region;\n   RegionTree *m_p_left;\n   RegionTree *m_p_right;\npublic:\n   RegionTree()\n      { m_p_region = NULL; m_p_left = this; m_p_right = this; }\n   virtual ~RegionTree()\n      { if (m_p_region) delete m_p_region; }\n   //\n   virtual bool is_leaf() const = 0;\n   //\n   RegionTree& left() const\n      { return *m_p_left; }\n   RegionTree& right() const\n      { return *m_p_right; }\n   //\n   operator QtRegion() const\n      { return *(QtRegion *)m_p_region; }\n   operator Line() const\n      { return *(Line *)m_p_region; }\n   //\n   friend bool intersect(const RegionTree& a, const RegionTree& b);\n   friend bool subintersect(const RegionTree& a, const RegionTree& b);\n   friend int  intersections(const RegionTree& a, const Line& b);\n};\n\n// Branch on a region tree...\n\nclass RegionTreeBranch : public RegionTree\n{\npublic:\n   RegionTreeBranch() : RegionTree() {;}\n   RegionTreeBranch( const Line& r,\n                     const RegionTree& a,\n                     const RegionTree& b )\n   {\n      m_p_left   = (RegionTree *) &a;\n      m_p_right  = (RegionTree *) &b;\n      m_p_region = new Line(r);  // copy\n   }\n   virtual bool is_leaf() const\n      { return false; }\n};\n\n// Leaf on a region tree...\n\nclass RegionTreeLeaf : public RegionTree\n{\npublic:\n   RegionTreeLeaf() : RegionTree() {;}\n   RegionTreeLeaf(const Line &l)\n   {\n      // no subnodes (but nice recursive properties)\n      m_p_left = this;\n      m_p_right = this;\n      m_p_region = new Line(l);\n   }\n   virtual bool is_leaf() const\n      { return true; }\n};\n\nclass Poly\n{\nprotected:\n   int m_line_segments;\n   RegionTree *m_p_root;\npublic:\n   Poly()\n   {\n      m_p_root = NULL; m_line_segments = 0;\n   }\n   Poly( const Poly& p )\n   {\n      m_line_segments = p.m_line_segments;\n      m_p_root = copy_region_tree( p.m_p_root );\n   }\n   Poly& operator = (const Poly& p)\n   {\n      if (this != &p) {\n         m_line_segments = p.m_line_segments;\n         m_p_root = copy_region_tree( p.m_p_root );\n      }\n      return *this;\n   }\n   virtual ~Poly()\n   {\n      destroy_region_tree();\n   }\n   // essentially, the copy constructor...\n   RegionTree *copy_region_tree( const RegionTree* tree );\n   // essentially, the destructor...\n   void destroy_region_tree();\n   //\n   RegionTree& get_region_tree() const\n   {\n      return *m_p_root;\n   }\n   //\n   void add_line_segment(const Line& l);\n   //\n   int get_line_segments()\n      { return m_line_segments; }\n   QtRegion get_bounding_box()\n      { return *(QtRegion *)(m_p_root->m_p_region); }\n   //\n   bool contains( const Point2f& p );\n   friend bool intersect( const Poly& a, const Poly& b );\n};\n\n}\n"
  },
  {
    "path": "mgraph440/pafcolor.cpp",
    "content": "#include \"mgraph440/pafcolor.h\"\n\nnamespace mgraph440 {\n\nstatic unsigned int g_nicecolor[] = {\n   0x003333DD, // 0 blue\n   0x003388DD, // 1\n   0x0022CCDD, // 2\n   0x0022CCBB, // 3\n   0x0022DD88, // 4\n   0x0088DD22, // 5\n   0x00BBCC22, // 6\n   0x00DDCC22, // 7\n   0x00DD8833, // 8\n   0x00DD3333, // 9 red\n};\n\n// Test a range designed to try to keep consitent saturation and brightness of g_nicecolor, and only move hue\nstatic unsigned int g_nicecolorhsb[] = {\n   0x003333DD, // 0 blue\n   0x003377DD, // 1\n   0x0033BBDD, // 2\n   0x0033DDBB, // 3\n   0x0033DD55, // 4\n   0x0055DD33, // 5\n   0x00BBDD33, // 6\n   0x00DDBB33, // 7\n   0x00DD7733, // 8\n   0x00DD3333, // 9 red\n};\n\n\nstatic unsigned int g_hsbcolor[] = {\n   0x003333DD, // 0 blue\n   0x003388DD, // 1\n   0x0022CCDD, // 2\n   0x0022CCBB, // 3\n   0x0022DD88, // 4\n   0x0088DD22, // 5\n   0x00BBCC22, // 6\n   0x00DDCC22, // 7\n   0x00DD8833, // 8\n   0x00DD3333, // 9 red\n};\n\n\nstatic unsigned int g_greyscale[] = {\n   0x00000000, // 0 black\n   0x00444444, // 1\n   0x00777777, // 2\n   0x00AAAAAA, // 3\n   0x00CCCCCC, // 4\n   0x00EEEEEE, // 5\n   0x00FFFFFF, // 6 white\n};\n\nstatic unsigned int g_bluered[] = {\n   0x004575B4, // 0 blue\n   0x0091BFDB,\n   0x00E0F3F8,\n   0x00FFFFBF,\n   0x00FEE090,\n   0x00FC8D59,\n   0x00D73027  // 6 red\n};\n\nstatic unsigned int g_purpleorange[] = {\n   0x00542788, // 0 purple\n   0x00998EC3, // 1\n   0x00D8DAEB, // 2\n   0x00F7F7F7, // 3\n   0x00FEE0B6, // 4\n   0x00F1A340, // 5\n   0x00B35806  // 6 orange\n};\n\n// htmlByte converts a normalised number to an HTML safe byte\n\nunsigned char htmlByte440(double colorByte)\n{\n   // Quick mod - TV\n#if defined(_MSC_VER)\n   return (unsigned char((colorByte + 0.0333) * 15.0) * 0x11);\n#else\n   return ((unsigned char)((colorByte + 0.0333) * 15.0) * 0x11);\n#endif\n}\n\nPafColor& PafColor::makeColor(double field, DisplayParams dp)\n{\n   // Quick mod - TV\n   if (field == -1.0 || std::isnan(field)) {\n      // -1.0 is (currently) a nan value, set alpha channel to 0 (transparent)\n      switch (dp.colorscale) {\n         case DisplayParams::MONOCHROME:\n         case DisplayParams::GREYSCALE:\n            m_color = 0x00000000;   // <- monochrome and greyscale, simply hide\n            break;\n         default:\n            // if in colour, then show greyed out:\n            m_color = 0x007f7f7f;   // <- grey retained for visibility on certain values\n            break;\n      }\n      return *this;\n   }\n   if (dp.blue > dp.red) {\n      field = 1.0 - field;\n      dp.blue = 1.0f - dp.blue;\n      dp.red = 1.0f - dp.red;\n   }\n   if (dp.colorscale == DisplayParams::DEPTHMAPCLASSIC) {\n      makeDepthmapClassic(field, dp.blue, dp.red);\n   }\n   else {\n      field = (field - dp.blue) / (dp.red - dp.blue);\n      // Quick mod - TV\n      if (std::isnan(field)) {\n         field = 0.5;\n      }\n      if (field > 1.0) {\n         field = 1.0;\n      }\n      else if (field < 0.0) {\n         field = 0.0;\n      }\n      switch(dp.colorscale) {\n      case DisplayParams::AXMANESQUE:\n         makeAxmanesque(field);\n         break;\n      case DisplayParams::PURPLEORANGE:\n         makePurpleOrange(field);\n         break;\n      case DisplayParams::BLUERED:\n         makeBlueRed(field);\n         break;\n      case DisplayParams::GREYSCALE:\n      case DisplayParams::MONOCHROME:\n         makeGreyScale(field);\n         break;\n      }\n   }\n   return *this;\n}\n\n// this makes an Axman-like colour range\n\nPafColor& PafColor::makeAxmanesque( double field )\n{\n   m_color = 0xff000000 | g_nicecolor[int((field - 1e-9) * 10.0)];\n   return *this;\n}\n\n// this makes a purple-orange scheme that is red-green colour-blind safe\n\nPafColor& PafColor::makePurpleOrange( double field )\n{\n   m_color = 0xff000000 | g_purpleorange[int((field - 1e-9) * 7.0)];\n   return *this;\n}\n\n// this makes a blue-red scheme that is red-green colour-blind safe\n\nPafColor& PafColor::makeBlueRed( double field )\n{\n   m_color = 0xff000000 | g_bluered[int((field - 1e-9) * 7.0)];\n   return *this;\n}\n\n// this makes a greyscale colour range\n\nPafColor& PafColor::makeGreyScale( double field )\n{\n   m_color = 0xff000000 | g_greyscale[int((field - 1e-9) * 7.0)];\n   return *this;\n}\n\n// note, makeDepthmapClassic converts to a safe HTML colour\n\nPafColor& PafColor::makeDepthmapClassic( double field, double blue, double red )\n{\n   m_color = 0xff000000; // set alpha to 255, solid colour\n   double green = blue + (red-blue) / 10.0;\n   // NB previously included colour muting: the 1.0 was originally 0.9 to mute the colours slightly\n   if (field >= 0.0 && field < blue) {\n      setr(htmlByte440(0.5 * (blue - field)/blue * 1.0));\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      setb(unsigned char(0xFF));\n#else\n      setb((unsigned char)(0xFF));\n#endif\n   }\n   else if (field >= blue && field < (green+blue)/2.0) {\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      setb(unsigned char(0xFF));\n#else\n      setb((unsigned char)(0xFF));\n#endif\n      setg(htmlByte440((2.0*(field - blue)/(green-blue)) * 1.0));\n   }\n   else if (field >= (green+blue)/2.0 && field < green) {\n      setb(htmlByte440((2.0*(green - field)/(green-blue)) * 1.0));\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      setg(unsigned char(0xFF));\n#else\n      setg((unsigned char)(0xFF));\n#endif\n   }\n   else if (field >= green && field < (green+red)/2.0 ) {\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      setg(unsigned char(0xFF));\n#else\n      setg((unsigned char)(0xFF));\n#endif\n      setr(htmlByte440((2.0*(field - green)/(red-green)) * 1.0));\n   }\n   else if (field >= (green+red)/2.0 && field < red) {\n      setg(htmlByte440((2.0*(red - field)/(red-green)) * 1.0));\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      setr(unsigned char(0xFF));\n#else\n      setr((unsigned char)(0xFF));\n#endif\n   }\n   else if (field >= red) {\n      // Quick mod - TV\n#if defined(_MSC_VER)\n      setr(unsigned char(0xFF));\n#else\n      setr((unsigned char)(0xFF));\n#endif\n      setb(htmlByte440(0.5 * (field - red)/(1.0 - red) * 1.0));\n   }\n   return *this;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/pafcolor.h",
    "content": "#pragma once\n\n#include \"mgraph440/displayparams.h\"\n#include \"mgraph440/p2dpoly.h\"\n\n// Converts everything to safe HTML colours\n\nnamespace mgraph440 {\n\nstruct PafColor\n{\n   unsigned int m_color;\n   unsigned char redb() const\n   { return (unsigned char) (m_color >> 16); }\n   unsigned char greenb() const\n   { return (unsigned char) (m_color >> 8); }\n   unsigned char blueb() const\n   { return (unsigned char) (m_color);  }\n   unsigned char alphab() const\n   { return (unsigned char) (m_color >> 24); }\n   // Quick mod - TV\n   void setr(unsigned char r)\n   { m_color &= 0xff00ffff; m_color |= (((unsigned int)r) << 16);}\n   // Quick mod - TV\n   void setg(unsigned char g)\n   { m_color &= 0xffff00ff; m_color |= (((unsigned int)g) << 8);}\n   // Quick mod - TV\n   void setb(unsigned char b)\n   { m_color &= 0xffffff00; m_color |= ((unsigned int)b);}\n   float redf() const\n   { return float(redb()) / 255.0f; }\n   float greenf() const\n   { return float(greenb()) / 255.0f; }\n   float bluef() const\n   { return float(blueb()) / 255.0f; }\n   PafColor()\n   { m_color = 0x00000000; }\n   PafColor(unsigned int rgb) // color in 0x00rrggbb format\n   { m_color = 0xff000000 | rgb; }\n   PafColor( double r, double g, double b, double a = 1.0 )\n   {\n      m_color = 0x00000000 |\n      (((unsigned char) (a * 255.0)) << 24) |\n      (((unsigned char) (r * 255.0)) << 16) |\n      (((unsigned char) (g * 255.0)) << 8) |\n      (((unsigned char) (b * 255.0)));\n   }\n\n   PafColor( const Point2f& vec, double a = 1.0 )\n   {\n       m_color = 0x00000000 |\n      (((unsigned char) (a * 255.0)) << 24) |\n      (((unsigned char) (dot(vec,Point2f(1.0, 0.0)) * 255.0)) << 16) |\n      (((unsigned char) (dot(vec,Point2f(-0.5,0.86602540378443864676372317075294)) * 255.0)) << 8) |\n      (((unsigned char) (dot(vec,Point2f(-0.5,-0.86602540378443864676372317075294)) * 255.0)));\n   }\n\n   operator unsigned int ()\n      { return m_color & 0x00ffffff; }\n   friend bool operator == (const PafColor& a, const PafColor& b);\n   friend bool operator != (const PafColor& a, const PafColor& b);\n   PafColor& makeAxmanesque( double field);\n   PafColor& makePurpleOrange( double field );\n   PafColor& makeBlueRed( double field );\n   PafColor& makeGreyScale( double field );\n   PafColor& makeMonochrome( double field );\n   PafColor& makeDepthmapClassic( double field, double blue, double red );\n   PafColor& makeColor(double field, DisplayParams dp);  // <- note, make copy to play around with\n};\ninline bool operator == (const PafColor& a, const PafColor& b)\n{\n   return (a.m_color == b.m_color);\n}\ninline bool operator != (const PafColor& a, const PafColor& b)\n{\n   return (a.m_color != b.m_color);\n}\n\n}\n"
  },
  {
    "path": "mgraph440/pafmath.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n\n// a collection of math functions\n\n#include <mgraph440/pafmath.h>\n#include <math.h>\n#include <inttypes.h>\n\nnamespace mgraph440 {\n\nuint64_t g_rand[11] = {1,2,3,5,7,11,13,17,19,23,29};\n\n// 25-Jul-2007: changed the g_mult and g_const used for random number generation\n// for some reason, there appeared to be a pattern to the numbers\n\n// Quick mod - TV\nconst uint64_t g_mult  = /*(0xF9561B2E << 32) + */0x71A7FA85;\nconst uint64_t g_const = /*(0x9BB3920E << 32) + */0xF5E958B9;\n\nvoid pafsrand(unsigned int seed, int set) // = 0\n{\n   g_rand[set] = seed;\n}\n\n// Pafrand is a Linear Congruential Generator\n// After the 25-Jul-2007 changes:\n// The current version seems to meet standard randomness conditions\n// Tested using Diehard, the 32 bit version ((g_rand[set] >> 32) & 0xffffffff)\n// passes all tests for at least the first 5 seeds above\n// it is also independent in at least 20 dimensions\n// It should not be used for \"serious\" randomness, but should be fine\n// for most things (agents in depthmapX, genetic algorithms, etc)\n\n// 25-Jul-2007: moved up to take top 32 bits\n\nunsigned int pafrand(int set) // = 0\n{\n   g_rand[set] = g_mult * g_rand[set] + g_const;\n\n   return (unsigned int)((g_rand[set] >> 32) & PAF_RAND_MAX);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\ndouble poisson(int x, double lambda)\n{\n   double f = exp(-lambda);\n   for (int i = 1; i <= x; i++) {\n      f *= lambda / double(i);\n   }\n   return f;\n}\n\ndouble cumpoisson(int x, double lambda)\n{\n   double f = exp(-lambda);\n   double c = f;\n   for (int i = 1; i <= x; i++) {\n      f *= lambda / double(i);\n      c += f;\n   }\n   return c;\n}\n\nint invcumpoisson(double p, double lambda)\n{\n   if (p <= 0) {\n      return 0;\n   }\n   if (p >= 1) {\n      // passing this 1 will cause an infinite loop, try this instead:\n      p = 1-1e-9;\n   }\n   double f = exp(-lambda);\n   int i = 0;\n   for (double c = f; c < p; c += f) {\n      i++;\n      f *= lambda / double(i);\n   }\n   return i;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/pafmath.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\n\n// Paf Template Library --- a set of useful C++ templates\n//\n// Copyright (c) 1996-2011 Alasdair Turner (a.turner@ucl.ac.uk)\n//\n//-----------------------------------------------------------------------------\n//  This library is free software; you can redistribute it and/or\n//  modify it under the terms of the GNU Lesser General Public\n//  License as published by the Free Software Foundation; either\n//  version 2.1 of the License, or (at your option) any later version.\n//\n//  This library is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n//  Lesser General Public License for more details.\n//\n//  You should have received a copy of the GNU Lesser General Public\n//  License along with this library; if not, write to the Free Software\n//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n//\n//  See the lgpl.txt file for details\n//-----------------------------------------------------------------------------\n\n// a collection of math functions\n\n#ifndef __PAFMATH_H__\n#define __PAFMATH_H__\n\n#include <cmath>\n\nnamespace mgraph440 {\n\n#ifndef M_PI\n#define M_PI 3.1415926535897932384626433832795\n#endif\n\ninline double sqr(double a)\n{\n   return (a*a);\n}\n\ninline int sgn(double a)\n{\n   return (a < 0) ? -1 : 1;\n}\n\n#ifndef M_ROOT_1_2\n#define M_ROOT_1_2 0.70710678118654752440084436210485\n#endif\n\n#ifndef M_1_LN2\n#define M_1_LN2 1.4426950408889634073599246810019\n#endif\n\nconst unsigned int PAF_RAND_MAX = 0x0FFFFFFF;\nvoid pafsrand(unsigned int seed, int set = 0);\nunsigned int pafrand(int set = 0);\n\n// a random number from 0 to 1\ninline double prandom(int set = 0)\n{\n   return double(pafrand(set)) / double(PAF_RAND_MAX);\n}\n\n// a random number from 0 to just less than 1\n\ninline double prandomr(int set = 0)\n{\n   return double(pafrand(set)) / double(PAF_RAND_MAX + 1);\n}\n\n// note, in order to stop confusing myself I have ln defined:\n#define ln(X) log(X)\n\ninline double log2(double a)\n{\n   return (ln(a) * M_1_LN2);\n}\n\n// Hillier Hanson dvalue\n/*\ninline double dvalue(double k)\n{\n   return 2.0 * (3.3231 * k * log10(k+2) - 2.5863 * k + 1.0) / ((k - 1.0) * (k - 2.0));\n}\n*/\n\n// Hillier Hanson dvalue (from Kruger 1989 -- see Teklenburg et al)\ninline double dvalue(double k)\n{\n   return 2.0 * (k * (log2((k+2.0)/3.0) - 1.0) + 1.0) / ((k - 1.0) * (k - 2.0));\n}\n\n// Hillier Hanson pvalue\ninline double pvalue(double k)\n{\n   return 2.0 * (k - log2(k) - 1.0) / ((k - 1.0) * (k - 2.0));\n}\n\n// Teklenburg integration (correction 31.01.11 due to Ulrich Thaler\ninline double teklinteg(double nodecount, double totaldepth)\n{\n   return ln(0.5 * (nodecount - 2.0)) / ln(double(totaldepth - nodecount + 1));\n}\n\n// Penn palmtree\n\ninline double palmtree(double n, double r)\n{\n   if (n > r) {\n      return r * (n - 0.5 * (r+1));\n   }\n   else {\n      return 0.5 * n * (n - 1);\n   }\n}\n\ndouble poisson(int x, double lambda);\ndouble cumpoisson(int x, double lambda);\nint invcumpoisson(double p, double lambda);\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/paftl.h",
    "content": "// Paf Template Library --- a set of useful C++ templates\n//\n// Copyright (c) 1996-2011 Alasdair Turner (a.turner@ucl.ac.uk)\n//\n//-----------------------------------------------------------------------------\n//  This library is free software; you can redistribute it and/or\n//  modify it under the terms of the GNU Lesser General Public\n//  License as published by the Free Software Foundation; either\n//  version 2.1 of the License, or (at your option) any later version.\n//\n//  This library is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n//  Lesser General Public License for more details.\n//\n//  You should have received a copy of the GNU Lesser General Public\n//  License along with this library; if not, write to the Free Software\n//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n//\n//  See the lgpl.txt file for details\n//-----------------------------------------------------------------------------\n//\n// Paf's cross platform box of tricks\n// Everything you need to write any C++.  All in one file!\n//\n// pmemvec     base clase for pvector and prefvec\n// pvector     similar to STL vector\n// prefvec     pvector with a different allocator (vector of references)\n// pqvector    searchable prefvec\n// pqmap       a simple map class, based on a binary tree\n// ptree       a simple tree template\n// pflipper    used for flipping between two vectors (or anythings...)\n// pexception  exception class, base for various exception types\n//\n//\n// A3 eliminates the double referencing used previously in the\n// vector classes\n\n#ifndef __PAFTL_MGRAPH440_H__\n#define __PAFTL_MGRAPH440_H__\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n#include <string.h>\n#include <iostream>\n#include <fstream>\n\n\n#ifdef _MSC_VER // MSVC compiler\n#else\n   #include <stdint.h> // not guaranteed to exist, but does in Mac / Ubuntu\n#endif\n\nnamespace mgraph440 {\n\n#define PAFTL_DATE \"01-FEB-2011\"\n// 31-jan-2011: unicode constructor for pstring\n// 04-aug-2010: fix bug on quicksort to avoid sorting zero length array\n// 06-jun-2010: rewrite quicksort to avoid infinite loop\n// 31-aug-2009: change pstring constructors to align with STL string\n// 28-nov-2007: full implementation for ANSI standards\n// 28-nov-2007: minor bug on pvecsub construction: should be 2 << count rather than 1 << count\n// 30-aug-2007: make compatible with Unix / MacOS\n\n\n#ifdef _WIN32\n// Quick mod - TV\n#pragma warning (disable: 4996 )\n#pragma warning (disable: 4396 )\n#else\n\n#endif\n\n#ifdef _MSC_VER // MSVC compiler\n   typedef signed __int64 int64;\n   typedef unsigned __int64 uint64;\n#else\n   typedef int64_t int64;\n   typedef uint64_t uint64;\n#endif\n\n#ifndef bool\n//   #define bool int\n#endif\n#ifndef true\n   #define true 1\n#endif\n#ifndef false\n   #define false 0\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n\n// namespace paftl {\n\nclass pexception;\ntemplate <class T> class pvector;\ntemplate <class T> class prefvec;\ntemplate <class T> class pqvector;\ntemplate <class T1, class T2> class pqmap;\ntemplate <class T> class ptree;\ntemplate <class T> class pflipper;\n\n// a few basic types\n\ntypedef pvector<int>       pvecint;\ntypedef pvector<float>     pvecfloat;\ntypedef pvector<double>    pvecdouble;\n\n///////////////////////////////////////////////////////////////////////////////\n\n// miscellaneous enums (paftl used as namespace)\n\nnamespace paftl\n{\n   enum add_t {ADD_UNIQUE, ADD_REPLACE, ADD_DUPLICATE, ADD_HERE};\n   const size_t npos = size_t(-1);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\nclass pexception\n{\npublic:\n   enum exception_t { UNDEFINED           = 0x0000,\n                      MEMORY_ALLOCATION   = 0x0001,\n                      FILE_ERROR          = 0x0002,\n                      MAX_ARRAY_EXCEEDED  = 0x0003};\n\nprotected:\n   int m_exception;\n   size_t m_data;\npublic:\n   pexception(int n_exception = UNDEFINED, size_t data = 0)\n      { m_exception = n_exception; m_data = data; }\n   int error_code()\n      { return m_exception; }\n   size_t info()\n      { return m_data; }\n};\n\n\n///////////////////////////////////////////////////////////////////////////////\n\n// pmemvec: base allocation for pvector and prefvec\n\ntemplate <class T> class pmemvec\n{\npublic:\n   class exception : public pexception\n   {\n   public:\n      enum exception_t { PVECTOR_UNDEFINED      = 0x1000,\n                         EMPTY_VECTOR           = 0x1001,\n                         UNASSIGNED_ITERATOR    = 0x1002,\n                         OUT_OF_RANGE           = 0x1003};\n   public:\n      exception(int n_exception = PVECTOR_UNDEFINED, size_t data = 0) : pexception( n_exception, data ) {}\n   };\nprotected:\n   T *m_data;\n   unsigned short m_shift;\n   size_t m_length;\npublic:\n   // redefine\n   pmemvec(size_t sz = 0);\n   pmemvec(const pmemvec<T>& );\n   virtual ~pmemvec();\n   pmemvec<T>& operator = (const pmemvec<T>& );\n   //\n   virtual void push_back(const T& item);\n   virtual void pop_back();\n   virtual void remove_at(size_t pos = 0);\n   virtual void remove_at(const pvecint& list);\n   virtual void insert_at(size_t pos, const T& item);\n   //\n   virtual void set(size_t count);\n   virtual void set(const T& item, size_t count);\n   //\n   virtual void clear();\n   virtual void clearnofree();\nprotected:\n   size_t storage_size() const\n      { return m_shift ? (2 << m_shift) : 0; }\n   void grow(size_t pos);\n   void shrink();\npublic:\n   size_t size() const\n      { return m_length; }\n   T& base_at(size_t pos)\n      { return m_data[pos]; }\n   const T& base_at(size_t pos) const\n      { return m_data[pos]; }\npublic:\n   ::std::istream& read( ::std::istream& stream, ::std::streampos offset = ::std::streampos(-1) );\n   ::std::ostream& write( ::std::ostream& stream );\n};\n\ntemplate <class T>\npmemvec<T>::pmemvec(size_t sz)\n{\n   // note: uses same as grow / storage_size, but cannot rely on function existence when calling constructor\n   if (sz == 0) {\n      m_data = NULL;\n      m_shift = 0;\n   }\n   else {\n      do {\n         m_shift++;\n      } while ((size_t(2) << m_shift) < sz);\n      m_data = new T [storage_size()];\n      if (m_data == NULL) {\n         throw pexception(pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size());\n      }\n   }\n   m_length = 0;\n}\n\ntemplate <class T>\npmemvec<T>::pmemvec(const pmemvec& v)\n{\n   m_shift  = v.m_shift;\n   m_length = v.m_length;\n\n   if (m_shift) {\n      m_data = new T [storage_size()];\n      if (m_data == NULL)\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n\n      if (m_length) {\n         for (size_t i = 0; i < m_length; i++)\n            m_data[i] = v.m_data[i];\n      }\n   }\n   else {\n      m_data = NULL;\n   }\n}\n\ntemplate <class T>\npmemvec<T>::~pmemvec()\n{\n   if (m_data)\n   {\n      delete [] m_data;\n      m_data = NULL;\n   }\n}\n\ntemplate <class T>\npmemvec<T>& pmemvec<T>::operator = (const pmemvec<T>& v)\n{\n   if (m_shift < v.m_shift)\n   {\n      if (m_shift != 0) {\n         delete [] m_data;\n      }\n      m_shift = v.m_shift;\n      if (m_shift) {\n         m_data = new T [storage_size()];\n         if (!m_data)\n            throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n      }\n      else {\n         m_data = NULL;\n      }\n   }\n   m_length = v.m_length;\n   if (m_length) {\n      for (size_t i = 0; i < m_length; i++)\n         m_data[i] = v.m_data[i];\n   }\n   return *this;\n}\n\ntemplate <class T>\nvoid pmemvec<T>::push_back(const T& item)\n{\n   if (m_length >= storage_size()) {\n      grow( m_length );\n   }\n   m_data[m_length] = item;\n   m_length++;\n}\n\ntemplate <class T>\nvoid pmemvec<T>::pop_back()\n{\n   if (m_length == 0)\n      throw exception( exception::EMPTY_VECTOR );\n\n   --m_length;\n\n   // Preferably include shrink code here\n}\n\ntemplate <class T>\nvoid pmemvec<T>::insert_at(size_t pos, const T& item)\n{\n   if (pos == paftl::npos || pos > m_length) {\n      throw exception( exception::OUT_OF_RANGE );\n   }\n   if (m_length >= storage_size()) {\n      grow( pos );\n   }\n   else {\n      for (size_t i = m_length; i > pos; i--) {\n         m_data[i] = m_data[i - 1];\n      }\n   }\n   m_data[pos] = item;\n   m_length++;\n}\n\ntemplate <class T>\nvoid pmemvec<T>::remove_at(size_t pos)\n{\n   // This is a simple but reliable remove item from vector\n   if (m_length == 0)\n      throw exception( exception::EMPTY_VECTOR );\n   else if (pos == paftl::npos || pos >= m_length)\n      throw exception( exception::OUT_OF_RANGE );\n\n   for (size_t i = pos; i < m_length - 1; i++) {\n      m_data[i] = m_data[i + 1];\n   }\n   --m_length;\n\n   // Preferably include shrink code here\n}\n\ntemplate <class T>\nvoid pmemvec<T>::set(size_t count)\n{\n   clear();\n   do {\n      m_shift++;\n   } while ((size_t(2) << m_shift) < count);\n   m_data = new T [storage_size()];\n   if (!m_data)\n      throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n   m_length = count;\n}\n\ntemplate <class T>\nvoid pmemvec<T>::set(const T& item, size_t count)\n{\n   clear();\n   do {\n      m_shift++;\n   } while ((size_t(2) << m_shift) < count);\n   m_data = new T [storage_size()];\n   if (!m_data)\n      throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n   m_length = count;\n   for (size_t i = 0; i < m_length; i++) {\n      m_data[i] = item;\n   }\n}\n\ntemplate <class T>\nvoid pmemvec<T>::clear()\n{\n   m_length = 0;\n   m_shift = 0;\n   if (m_data)\n   {\n      delete [] m_data;\n      m_data = NULL;\n   }\n}\n\ntemplate <class T>\nvoid pmemvec<T>::clearnofree()\n{\n   m_length = 0;\n}\n\ntemplate <class T>\nvoid pmemvec<T>::grow(size_t pos)\n{\n   m_shift++;\n\n   T *new_data = new T [storage_size()];\n   if (!new_data)\n      throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n\n   if (m_length) {\n      for (size_t i = 0; i < m_length + 1; i++)\n         new_data[i] = (i < pos) ? m_data[i] : m_data[i-1];\n   }\n   if (m_data) {\n      delete [] m_data;\n   }\n   m_data = new_data;\n}\n\ntemplate <class T>\nvoid pmemvec<T>::shrink()\n{\n}\n\ntemplate <class T>\n::std::istream& pmemvec<T>::read( ::std::istream& stream, ::std::streampos offset )\n{\n   if (offset != ::std::streampos(-1)) {\n      stream.seekg( offset );\n   }\n   // READ / WRITE USES 32-bit LENGTHS (number of elements)\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n   unsigned int length;\n   stream.read( (char *) &length, sizeof(unsigned int) );\n   m_length = size_t(length);\n   if (m_length >= storage_size()) {\n      if (m_data) {\n         delete [] m_data;\n         m_data = NULL;\n      }\n      while (m_length >= storage_size())\n         m_shift++;\n      m_data = new T [storage_size()];\n      if (!m_data)\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n   }\n   if (m_length != 0) {\n      stream.read( (char *) m_data, sizeof(T) * ::std::streamsize(m_length) );\n   }\n   return stream;\n}\n\ntemplate <class T>\n::std::ostream& pmemvec<T>::write( ::std::ostream& stream )\n{\n   // READ / WRITE USES 32-bit LENGTHS (number of elements)\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n\n   // check for max unsigned int exceeded\n   if (m_length > size_t((unsigned int)-1)) {\n      throw pexception( pexception::MAX_ARRAY_EXCEEDED, m_length );\n   }\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n   unsigned int length = (unsigned int)(m_length);\n   stream.write( (char *) &length, sizeof(unsigned int) );\n   if (m_length != 0) {\n      stream.write( (char *) m_data, sizeof(T) * ::std::streamsize(m_length) );\n   }\n   return stream;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate <class T> class pvector : public pmemvec<T>\n{\nprotected:\n   mutable size_t m_current;\npublic:\n   pvector(size_t sz = 0) : pmemvec<T>(sz)\n      {m_current = paftl::npos;}\n   pvector(const pvector<T>& v) : pmemvec<T>(v)\n      {m_current = v.m_current;}\n   pvector<T>& operator = (const pvector<T>& );\n   virtual ~pvector()\n      {;}\n   //\n   T& at(size_t pos)\n      { return pmemvec<T>::m_data[pos]; }\n   const T& at(size_t pos) const\n      { return pmemvec<T>::m_data[pos]; }\n   T& operator[](size_t pos)\n      { return at(pos); }\n   const T& operator[](size_t pos) const\n      { return at(pos); }\n   //\n   T& head()\n      { return at(0); }\n   const T& head() const\n      { return at(0); }\n   T& tail()\n      { return at(pmemvec<T>::m_length-1); }\n   const T& tail() const\n      { return at(pmemvec<T>::m_length-1); }\n   // standard operations (unordered vector)\n   T& find(const T& item);\n   const T& find(const T& item) const;\n   size_t findindex(const T& item) const;\n   // binary operations (ordered vector)\n   size_t add(const T& item, int type = paftl::ADD_UNIQUE); // ignored if already exists\n   T& search(const T& item);\n   const T& search(const T& item) const;\n   size_t searchindex(const T& item) const;\n   size_t searchfloorindex(const T& item) const;\n   size_t searchceilindex(const T& item) const;\n   void remove(const T& item)\n   { pmemvec<T>::remove_at(searchindex(item)); }\n   // set operations (ordered vector)\n   void operator += (const pvector<T>& v);\n   // qsort algo:\n   void sort();\n   void sort(size_t left, size_t right);\n   //\n\n   // Quick mod - TV\n#if defined(_MSC_VER)\n   friend pvector<T> intersect(const pvector<T>& a, const pvector<T>& b);\n#endif\n};\n\ntemplate <class T>\npvector<T>& pvector<T>::operator = (const pvector<T>& v)\n{\n   if (&v != this)\n   {\n      pmemvec<T>::operator = (v);\n   }\n   return *this;\n}\n\ntemplate <class T>\nT& pvector<T>::find(const T& item)\n{\n   if (findindex(item) == paftl::npos) {\n      throw pmemvec<T>::exception::exception(pmemvec<T>::exception::OUT_OF_RANGE);\n   }\n   return at(m_current);\n}\ntemplate <class T>\nconst T& pvector<T>::find(const T& item) const\n{\n   if (findindex(item) == paftl::npos) {\n      throw pmemvec<T>::exception(pmemvec<T>::exception::OUT_OF_RANGE);\n   }\n   return at(m_current);\n}\n\ntemplate <class T>\nsize_t pvector<T>::findindex(const T& item) const\n{\n   for (size_t i = 0; i < pmemvec<T>::m_length; i++) {\n      if (at(i) == item) {\n         m_current = i;\n         return i;\n      }\n   }\n   return paftl::npos;\n}\n\n// oops... we need an iterator... add use a current position marker.\n\ntemplate <class T>\nT& pvector<T>::search(const T& item)\n{\n   if (searchindex(item) == paftl::npos) {\n      throw pmemvec<T>::exception(pmemvec<T>::exception::OUT_OF_RANGE); // Not found\n   }\n   return at(m_current);\n}\ntemplate <class T>\nconst T& pvector<T>::search(const T& item) const\n{\n   if (searchindex(item) == paftl::npos) {\n      throw pmemvec<T>::exception(pmemvec<T>::exception::OUT_OF_RANGE); // Not found\n   }\n   return at(m_current);\n}\n\ntemplate <class T>\nsize_t pvector<T>::searchindex(const T& item) const\n{\n   if (pmemvec<T>::m_length != 0) {\n      size_t ihere, ifloor = 0, itop = pmemvec<T>::m_length - 1;\n      while (itop != paftl::npos && ifloor <= itop) {\n         m_current = ihere = (ifloor + itop) / 2;\n         if (item == at(ihere)) {\n            return m_current;\n         }\n         else if (item > at(ihere)) {\n            ifloor = ihere + 1;\n         }\n         else {\n            itop = ihere - 1;\n         }\n      }\n   }\n   return paftl::npos;\n}\n\ntemplate <class T>\nsize_t pvector<T>::searchfloorindex(const T& item) const\n{\n   searchindex(item);\n   while (m_current != 0 && at(m_current) > item) {\n      m_current--;\n   }\n   return m_current;\n}\n\ntemplate <class T>\nsize_t pvector<T>::searchceilindex(const T& item) const\n{\n   searchindex(item);\n   while (m_current < pmemvec<T>::m_length && at(m_current) < item) {\n      m_current++;\n   }\n   return m_current;\n}\n\n\n// Note: uses m_current set by searchindex\n\n// Really need a list 'merge' function as well... will write this soon!\n\ntemplate <class T>\nsize_t pvector<T>::add(const T& item, int type) // UNIQUE by default\n{\n   size_t where = paftl::npos;\n   if (pmemvec<T>::m_length == 0 || item > pvector<T>::tail()) { // often used for push_back, so handle quickly if so\n      pmemvec<T>::push_back( item );\n      where = pmemvec<T>::m_length - 1;\n   }\n   else {\n      // if you call with ADD_HERE, it is assumed you've just used search or searchindex\n      // i.e., we don't need to go through the binary search again to find the insert position\n      if (type != paftl::ADD_HERE) {\n         searchindex(item);\n      }\n      if (item < at(m_current)) {\n         pmemvec<T>::insert_at( m_current, item );\n         where = m_current;\n      }\n      else if (item > at(m_current) || type == paftl::ADD_DUPLICATE) {\n         pmemvec<T>::insert_at( m_current + 1, item );\n         where = m_current + 1;\n      }\n      else if (type == paftl::ADD_REPLACE || type == paftl::ADD_HERE) {\n         // relies on good assignment operator\n         at(m_current) = item;\n      }\n      // n.b., type \"UNIQUE\" does not replace, returns -1\n   }\n   return where;\n}\n\ntemplate <class T>\nvoid pvector<T>::operator += (const pvector<T>& v)\n{\n   if (this != &v && pmemvec<T>::m_length + v.pmemvec<T>::m_length > 0) {\n\n      while (pmemvec<T>::m_length + v.pmemvec<T>::m_length >= pmemvec<T>::storage_size())\n         pmemvec<T>::m_shift++;\n\n      T *new_data = new T [pmemvec<T>::storage_size()];\n      if (!new_data)\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * pmemvec<T>::storage_size() );\n\n      size_t i = 0, j = 0, k = 0;\n      while (i + j < pmemvec<T>::m_length + v.pmemvec<T>::m_length) {\n         if ( i < pmemvec<T>::m_length ) {\n            if (j < v.pmemvec<T>::m_length) {\n               if (pmemvec<T>::m_data[i] < v.pmemvec<T>::m_data[j]) {\n                  new_data[k++] = pmemvec<T>::m_data[i++];\n               }\n               else if (pmemvec<T>::the_data()[i] > v.pmemvec<T>::the_data()[j]) {\n                  new_data[k++] = v.pmemvec<T>::m_data[j++];\n               }\n               else {\n                  new_data[k++] = pmemvec<T>::m_data[i++]; j++;\n               }\n            }\n            else {\n               while (i < pmemvec<T>::m_length) {\n                  new_data[k++] = pmemvec<T>::m_data[i++];\n               }\n            }\n         }\n         else {\n            while (j < v.pmemvec<T>::m_length) {\n               new_data[k++] = v.pmemvec<T>::m_data[j++];\n            }\n         }\n      }\n      if (pmemvec<T>::m_data) {\n         delete [] pmemvec<T>::m_data;\n      }\n      pmemvec<T>::m_length = k;\n      pmemvec<T>::m_data = new_data;\n   }\n}\n\ntemplate <class T>\nvoid pvector<T>::sort()\n{\n   if (pmemvec<T>::m_length != 0) {\n      sort(0,pmemvec<T>::m_length-1);\n   }\n}\n\n// rewrite 6-jun-10 (was entering infinite loop, now appears to work properly)\ntemplate <class T>\nvoid pvector<T>::sort(size_t left, size_t right)\n{\n   size_t i = left, j = right;\n   const T& val = pmemvec<T>::m_data[(left+right)/2];\n   while (j != paftl::npos && i <= j) {\n      while (i <= j && pmemvec<T>::m_data[i] < val)\n         i++;\n      while (j != paftl::npos && pmemvec<T>::m_data[j] > val)\n         j--;\n      if (j != paftl::npos && i <= j) {\n         // swap contents\n         T temp = pmemvec<T>::m_data[i];\n         pmemvec<T>::m_data[i] = pmemvec<T>::m_data[j];\n         pmemvec<T>::m_data[j] = temp;\n         i++; j--;\n      }\n   }\n   if (j != paftl::npos && left < j)\n      sort(left, j);\n   if (i < right)\n      sort(i, right);\n}\n\n// requires two sorted lists\ntemplate <class T>\ninline pvector<T> intersect(const pvector<T>& a, const pvector<T>& b)\n{\n   pvector<T> retvec;\n   size_t i = 0;\n   size_t j = 0;\n   while (i < a.size() && j < b.size()) {\n      if (a[i] == b[j]) {\n         retvec.push_back(a[i]);\n         i++; j++;\n      }\n      else {\n         while (a[i] < b[j] && i < a.size()) {\n            i++;\n         }\n         while (a[i] > b[j] && j < b.size()) {\n            j++;\n         }\n      }\n   }\n   return retvec;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// this version for bulk deletes: copies over entries to new list\n// (first requires pvector to have been defined)\n\ntemplate <class T>\nvoid pmemvec<T>::remove_at(const pvecint& list)\n{\n   if (m_length == 0)\n      throw exception( exception::EMPTY_VECTOR );\n   if (list.size() >= m_length) {\n      // if the list does not contain duplicates, then this simply means delete all contents:\n      clear();\n      return;\n   }\n   // shrink new vector:\n   while ((m_length - list.size()) * 2 < storage_size()) {\n      m_shift--;\n   }\n   size_t new_length = 0;\n   T *new_data = new T [storage_size()];\n   bool *rem_flag = new bool [m_length];\n   if (!new_data)\n      throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * storage_size() );\n   if (!rem_flag)\n      throw pexception( pexception::MEMORY_ALLOCATION, sizeof(bool) * storage_size() );\n   size_t i;\n   for (i = 0; i < m_length; i++) {\n      rem_flag[i] = false;\n   }\n   for (i = 0; i < list.size(); i++) {\n      if (size_t(list[i]) == paftl::npos || size_t(list[i]) >= m_length)\n         throw exception( exception::OUT_OF_RANGE );\n      rem_flag[list[i]] = true;\n   }\n   for (i = 0; i < m_length; i++) {\n      if (!rem_flag[i]) {\n         new_data[new_length] = m_data[i];\n         new_length++;\n      }\n   }\n   m_length = new_length;\n   delete [] m_data;\n   delete [] rem_flag;\n   m_data = new_data;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// prefvec: a vector of references (useful for larger objects)\n// should be able to use pqvector in most cases\n\ntemplate <class T> class prefvec : public pmemvec<T *>\n{\npublic:\n   prefvec(size_t sz = 0) : pmemvec<T *>(sz)\n      {;}\n   prefvec(const prefvec<T>& );\n   virtual ~prefvec();\n   prefvec<T>& operator = (const prefvec<T>& );\n   //\n   void push_back(const T& item);\n   void pop_back();\n   void remove_at(size_t pos = 0);\n   void free_at(size_t pos = 0);\n   void remove_at(const pvecint& list);\n   void insert_at(size_t pos, const T& item);\n   //\n   void set(size_t count);\n   void set(const T& item, size_t count);\n   //\n   void clear();\n   void clearnofree();\n   //\n   T& at(size_t pos)\n      { return  *(pmemvec<T *>::m_data[pos]); }\n   const T& at(size_t pos) const\n      { return *(pmemvec<T *>::m_data[pos]); }\n   T& operator[](size_t pos)\n      { return at(pos); }\n   const T& operator[](size_t pos) const\n      { return at(pos); }\n   //\n   T& head()\n      { return at(0); }\n   const T& head() const\n      { return at(0); }\n   T& tail()\n      { return at(pmemvec<T *>::m_length-1); }\n   const T& tail() const\n      { return at(pmemvec<T *>::m_length-1); }\n   //\n   // NOTE: no find (as often equivalence operator will not be defined)\n   //\n   // Override read and write\n   ::std::istream& read( ::std::istream& stream );\n   ::std::ostream& write( ::std::ostream& stream );\n};\n\ntemplate <class T>\nprefvec<T>::prefvec(const prefvec& v) : pmemvec<T *>(v)\n{\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      pmemvec<T *>::m_data[i] = new T(v.at(i));\n      if (pmemvec<T *>::m_data[i] == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) );\n      }\n   }\n}\n\ntemplate <class T>\nprefvec<T>& prefvec<T>::operator = (const prefvec<T>& v)\n{\n   if (&v != this) {\n      for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n         delete pmemvec<T *>::m_data[i];\n      }\n      pmemvec<T *>::operator = (v);\n      for (size_t j = 0; j < pmemvec<T *>::m_length; j++) {\n         pmemvec<T *>::m_data[j] = new T(v.at(j));\n         if (pmemvec<T *>::m_data[j] == NULL) {\n            throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) );\n         }\n      }\n   }\n   return *this;\n}\n\ntemplate <class T>\nprefvec<T>::~prefvec()\n{\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      if (pmemvec<T *>::m_data[i])\n         delete pmemvec<T *>::m_data[i];\n   }\n   // virtual destructor called for pmemvec\n}\n\ntemplate <class T>\nvoid prefvec<T>::push_back(const T& item)\n{\n   T *p = new T(item);\n   pmemvec<T *>::push_back( p );\n}\n\ntemplate <class T>\nvoid prefvec<T>::pop_back()\n{\n   if (pmemvec<T *>::m_data[pmemvec<T *>::m_length - 1]) {\n      delete pmemvec<T *>::m_data[pmemvec<T *>::m_length - 1];\n      pmemvec<T *>::m_data[pmemvec<T *>::m_length - 1] = NULL;\n   }\n   pmemvec<T *>::pop_back();\n}\n\ntemplate <class T>\nvoid prefvec<T>::remove_at(size_t pos)\n{\n   if (pmemvec<T *>::m_length == 0)\n      throw (typename pmemvec<T *>::exception)( pmemvec<T *>::exception::EMPTY_VECTOR );\n   else if (pos == paftl::npos || pos >= pmemvec<T *>::m_length)\n      throw (typename pmemvec<T *>::exception)( pmemvec<T *>::exception::OUT_OF_RANGE );\n\n   if (pmemvec<T *>::m_data[pos]) {\n      delete pmemvec<T *>::m_data[pos];\n      pmemvec<T *>::m_data[pos] = NULL;\n   }\n   pmemvec<T *>::remove_at( pos );\n}\n\n// just frees the memory at position: does not manipulate vector\n\ntemplate <class T>\nvoid prefvec<T>::free_at(size_t pos)\n{\n   if (pmemvec<T *>::m_length == 0)\n      throw (typename pmemvec<T *>::exception)( pmemvec<T *>::exception::EMPTY_VECTOR );\n   else if (pos == paftl::npos || pos >= pmemvec<T *>::m_length)\n      throw (typename pmemvec<T *>::exception)( pmemvec<T *>::exception::OUT_OF_RANGE );\n\n   delete pmemvec<T *>::m_data[pos];\n   pmemvec<T *>::m_data[pos] = NULL;\n}\n\n// this version for intended for bulk deletes (also retains previous ordering)\ntemplate <class T>\nvoid prefvec<T>::remove_at(const pvecint& list)\n{\n   if (pmemvec<T *>::m_length == 0)\n      throw (typename pmemvec<T *>::exception)( pmemvec<T *>::exception::EMPTY_VECTOR );\n\n   for (size_t i = 0; i < list.size(); i++) {\n      if (size_t(list[i]) == paftl::npos || size_t(list[i]) >= pmemvec<T *>::m_length)\n         throw (typename pmemvec<T *>::exception)( pmemvec<T *>::exception::OUT_OF_RANGE );\n      if (pmemvec<T *>::m_data[list[i]]) {\n         delete pmemvec<T *>::m_data[list[i]];\n         pmemvec<T *>::m_data[list[i]] = NULL;\n      }\n   }\n   pmemvec<T *>::remove_at( list );\n}\n\n\ntemplate <class T>\nvoid prefvec<T>::insert_at(size_t pos, const T& item)\n{\n   T *p = new T(item);\n   if (p == NULL) {\n      throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) );\n   }\n   pmemvec<T *>::insert_at(pos, p);\n}\n\ntemplate <class T>\nvoid prefvec<T>::set(size_t count)\n{\n   pmemvec<T *>::set(count);\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      pmemvec<T *>::m_data[i] = NULL;\n      if (pmemvec<T *>::m_data[i] == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) );\n      }\n   }\n}\n\ntemplate <class T>\nvoid prefvec<T>::set(const T& item, size_t count)\n{\n   pmemvec<T *>::set(count);\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      pmemvec<T *>::m_data[i] = new T(item);\n      if (pmemvec<T *>::m_data[i] == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) );\n      }\n   }\n}\n\n\ntemplate <class T>\nvoid prefvec<T>::clear()\n{\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      if (pmemvec<T *>::m_data[i]) {\n         delete pmemvec<T *>::m_data[i];\n         pmemvec<T *>::m_data[i] = NULL;\n      }\n   }\n   pmemvec<T *>::clear();\n}\n\ntemplate <class T>\nvoid prefvec<T>::clearnofree()\n{\n   // still have to delete objects pointed to, just doesn't just clear the list of pointers:\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      if (pmemvec<T *>::m_data[i]) {\n         delete pmemvec<T *>::m_data[i];\n         pmemvec<T *>::m_data[i] = NULL;\n      }\n   }\n   pmemvec<T *>::clearnofree();\n}\n\n// Note: read and write only work for structures without pointers\n\ntemplate <class T>\n::std::istream& prefvec<T>::read( ::std::istream& stream )\n{\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      if (pmemvec<T *>::m_data[i]) {\n         delete pmemvec<T *>::m_data[i];\n         pmemvec<T *>::m_data[i] = NULL;\n      }\n   }\n   // READ / WRITE USES 32-bit LENGTHS (number of elements)\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n   unsigned int length;\n   stream.read( (char *) &length, sizeof(unsigned int) );\n   if (stream.fail()) {\n      throw pexception(pexception::FILE_ERROR);\n   }\n   pmemvec<T *>::m_length = size_t(length);\n   if (pmemvec<T *>::m_length >= pmemvec<T *>::storage_size()) {\n      if (pmemvec<T *>::m_data) {\n         delete [] pmemvec<T *>::m_data;\n      }\n      while (pmemvec<T *>::m_length >= pmemvec<T *>::storage_size())\n         pmemvec<T *>::m_shift++;\n      pmemvec<T *>::m_data = new T * [pmemvec<T *>::storage_size()];\n      if (pmemvec<T *>::m_data == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, pmemvec<T *>::storage_size() * sizeof(T) );\n      }\n   }\n   for (size_t j = 0; j < pmemvec<T *>::m_length; j++) {\n      T *p = new T;\n      if (p == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) );\n      }\n      stream.read( (char *) p, sizeof(T) );\n      if (stream.fail()) {\n         throw pexception(pexception::FILE_ERROR);\n      }\n      pmemvec<T *>::m_data[j] = p;\n   }\n   return stream;\n}\n\ntemplate <class T>\n::std::ostream& prefvec<T>::write( ::std::ostream& stream )\n{\n   // READ / WRITE USES 32-bit LENGTHS (number of elements)\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n\n   // check for max unsigned int exceeded\n   if (pmemvec<T *>::m_length > size_t((unsigned int)-1)) {\n      // Quick mod - TV\n#if 0\n      throw exception( pexception::MAX_ARRAY_EXCEEDED, pmemvec<T *>::m_length );\n#else\n        ;\n#endif\n   }\n\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n   unsigned int length = (unsigned int)(pmemvec<T *>::m_length);\n   stream.write( (char *) &length, sizeof(unsigned int) );\n\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      stream.write( (char *) &at(i), sizeof(T) );\n   }\n   return stream;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// pqvector... prefvec with the binary addition routine...\n// (i.e., almost the hash table...)\n\n// (so... I think we might replace pqmap with an inherited form of this soon)\n// (if MS would oblige...)\n\ntemplate <class T> class pqvector : public prefvec<T>\n{\nprotected:\n   mutable size_t m_current;\npublic:\n   pqvector(size_t sz = 0) : prefvec<T>(sz) {;}\n   pqvector(const pqvector<T>& v) : prefvec<T>( v ) {;}\n   virtual ~pqvector() {;}\n   pqvector<T>& operator = (const pqvector<T>& v)\n   { prefvec<T>::operator = (v); return *this; }\n   //\n   // at, [] and so on as before\n   //\n   // standard operations (unordered vector)\n   T& find(const T& item);\n   const T& find(const T& item) const;\n   size_t findindex(const T& item) const;\n   //\n   // binary operations (ordered vector)\n   T& search(const T& item);\n   const T& search(const T& item) const;\n   size_t searchindex(const T& item) const;\n   void remove(const T& item)\n   { remove_at(searchindex(item)); }\n   size_t add(const T& item, int type = paftl::ADD_UNIQUE);\n   T& current()\n   { return prefvec<T>::at(m_current); }\n   const T& current() const\n   { return pmemvec<T *>::at(m_current); }\n   // qsort algo:\n   void sort();\n   void sort(size_t left, size_t right);\n};\n\ntemplate <class T>\nT& pqvector<T>::find(const T& item)\n{\n   if (findindex(item) == paftl::npos) {\n      throw pmemvec<T *>::exception(pmemvec<T *>::exception::OUT_OF_RANGE);\n   }\n   return prefvec<T>::at(m_current);\n}\ntemplate <class T>\nconst T& pqvector<T>::find(const T& item) const\n{\n   if (findindex(item) == paftl::npos) {\n      throw pmemvec<T *>::exception(pmemvec<T *>::exception::OUT_OF_RANGE);\n   }\n   return prefvec<T>::at(m_current);\n}\n\ntemplate <class T>\nsize_t pqvector<T>::findindex(const T& item) const\n{\n   for (size_t i = 0; i < pmemvec<T *>::m_length; i++) {\n      if (prefvec<T>::at(i) == item) {\n         m_current = i;\n         return i;\n      }\n   }\n   return paftl::npos;\n}\n\n// oops... we need an iterator... add use a current position marker.\n\ntemplate <class T>\nT& pqvector<T>::search(const T& item)\n{\n   if (searchindex(item) == paftl::npos) {\n      throw (typename pmemvec<T *>::exception)(pmemvec<T *>::exception::OUT_OF_RANGE); // Not found\n   }\n   return prefvec<T>::at(m_current);\n}\ntemplate <class T>\nconst T& pqvector<T>::search(const T& item) const\n{\n   if (searchindex(item) == paftl::npos) {\n      throw (typename pmemvec<T *>::exception)(pmemvec<T *>::exception::OUT_OF_RANGE); // Not found\n   }\n   return prefvec<T>::at(m_current);\n}\n\ntemplate <class T>\nsize_t pqvector<T>::searchindex(const T& item) const\n{\n  if (pmemvec<T *>::size() != 0) {\n      size_t ihere, ifloor = 0, itop = pmemvec<T *>::size() - 1;\n      while (itop != paftl::npos && ifloor <= itop) {\n         m_current = ihere = (ifloor + itop) / 2;\n         if (item == prefvec<T>::at(ihere)) {\n            return m_current;\n         }\n         else if (item > prefvec<T>::at(ihere)) {\n            ifloor = ihere + 1;\n         }\n         else {\n            itop = ihere - 1;\n         }\n      }\n   }\n   return paftl::npos;\n}\n\n// Note: uses m_current set by searchindex\n\n// Really need a list 'merge' function as well... will write this soon!\n\ntemplate <class T>\nsize_t pqvector<T>::add(const T& item, int type) // default type UNIQUE\n{\n   size_t where = paftl::npos;\n   if (pmemvec<T *>::size() == 0 || item > prefvec<T>::tail()) { // often used for push_back, so handle quickly if so\n      prefvec<T>::push_back( item );\n      where = pmemvec<T *>::size() - 1;\n   }\n   else {\n      // if you call with ADD_HERE, it is assumed you've just used search or searchindex\n      // i.e., we don't need to go through the binary search again to find the insert position\n      if (type != paftl::ADD_HERE) {\n         searchindex(item);\n      }\n      if (item < prefvec<T>::at(m_current)) {\n         prefvec<T>::insert_at( m_current, item );\n         where = m_current;\n      }\n      else if (item > prefvec<T>::at(m_current) || type == paftl::ADD_DUPLICATE) {\n         prefvec<T>::insert_at( m_current + 1, item );\n         where = m_current + 1;\n      }\n      else if (type == paftl::ADD_REPLACE || type == paftl::ADD_HERE) {\n         // relies on good assignment operator\n         prefvec<T>::at(m_current) = item;\n      }\n      // n.b., type \"UNIQUE\" does not replace, returns paftl::npos\n   }\n   return where;\n}\n\ntemplate <class T>\nvoid pqvector<T>::sort()\n{\n   if (pmemvec<T *>::m_length != 0) {\n      sort(0,pmemvec<T *>::m_length-1);\n   }\n}\n\n// rewrite 6-jun-10 (was entering infinite loop, now appears to work properly)\ntemplate <class T>\nvoid pqvector<T>::sort(size_t left, size_t right)\n{\n   size_t i = left, j = right;\n   const T& val = prefvec<T>::at((left+right)/2);\n   while (j != paftl::npos && i <= j) {\n      while (i <= j && prefvec<T>::at(i) < val)\n         i++;\n      while (j != paftl::npos && prefvec<T>::at(j) > val)\n         j--;\n      if (j != paftl::npos && i <= j) {\n         // swap contents (using pointer)\n         T* temp = pmemvec<T *>::m_data[i];\n         pmemvec<T *>::m_data[i] = pmemvec<T *>::m_data[j];\n         pmemvec<T *>::m_data[j] = temp;\n         i++; j--;\n      }\n   }\n   if (j != paftl::npos && left < j)\n      sort(left, j);\n   if (i < right)\n      sort(i, right);\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\n// psubvec is based on pvector, designed for arrays of chars or shorts, it subsumes itself\n// so can be stored as a single pointer: useful if you have a lot of empty arrays\n\ntemplate <class T> class psubvec\n{\npublic:\n   static const T npos = -1;\nprotected:\n   T *m_data;\npublic:\n   psubvec()\n      { m_data = NULL; }\n   psubvec(const psubvec<T>& );\n   ~psubvec();\n   psubvec<T>& operator = (const psubvec<T>& );\n   //\n   virtual void push_back(const T item);\n   virtual void clear();\npublic:\n   bool isEmpty() // isEmpty is provided in addition to size as is quicker to test\n      { return m_data == NULL; }\n   T size() const\n      { return m_data ? m_data[0] : 0; }\n   T& operator [] (T pos)\n      { return m_data[pos+1]; }\n   const T& operator [] (T pos) const\n      { return m_data[pos+1]; }\npublic:\n   ::std::istream& read(::std::istream& stream, ::std::streampos = -1);\n   ::std::ostream& write( ::std::ostream& stream );\n};\n\ntemplate <class T>\npsubvec<T>::psubvec(const psubvec& v)\n{\n   if (v.m_data) {\n      T length = v.m_data[0];\n      T count = 0;\n      while (length >>= 1) // find bit length (note: cannot assume int)\n         count++;\n      m_data = new T [2 << count];\n      if (m_data == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * size_t(2 << count) );\n      }\n      length = v.m_data[0];\n      for (T i = 0; i < length + 1; i++) {\n         m_data[i] = v.m_data[i];\n      }\n   }\n   else {\n      m_data = NULL;\n   }\n}\n\ntemplate <class T>\npsubvec<T>::~psubvec()\n{\n   if (m_data)\n   {\n      delete [] m_data;\n      m_data = NULL;\n   }\n}\n\ntemplate <class T>\npsubvec<T>& psubvec<T>::operator = (const psubvec<T>& v)\n{\n   if (this != &v) {\n      if (v.m_data) {\n         T length = v.m_data[0];\n         T count = 0;\n         while (length >>= 1) // find bit length (note: cannot assume int)\n            count++;\n         m_data = new T [2 << count];\n         if (m_data == NULL) {\n            throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * size_t(2 << count) );\n         }\n         length = v.m_data[0];\n         for (T i = 0; i < length + 1; i++) {\n            m_data[i] = v.m_data[i];\n         }\n      }\n      else {\n         m_data = NULL;\n      }\n   }\n   return *this;\n}\n\ntemplate <class T>\nvoid psubvec<T>::push_back(const T item)\n{\n   if (!m_data) {\n      m_data = new T [2];\n      m_data[0] = 1;\n      m_data[1] = item;\n   }\n   else {\n      T length = m_data[0] + 1;\n      if ((length & (length - 1)) == 0) { // determine if next length would be power of 2\n         T *new_data = new T [length << 1];\n         if (new_data == NULL) {\n            throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * size_t(length << 1) );\n         }\n         for (T i = 0; i < length; i++)\n            new_data[i] = m_data[i];\n         delete [] m_data;\n         m_data = new_data;\n      }\n      m_data[0] = length;\n      m_data[length] = item;\n   }\n}\n\ntemplate <class T>\nvoid psubvec<T>::clear()\n{\n   if (m_data)\n   {\n      delete [] m_data;\n      m_data = NULL;\n   }\n}\n\ntemplate <class T>\n::std::istream& psubvec<T>::read( ::std::istream& stream, ::std::streampos )\n{\n   if (m_data) {\n      delete [] m_data;\n      m_data = NULL;\n   }\n   T length;\n   stream.read( (char *) &length, sizeof(T) );\n   if (length) {\n      T copy = length;\n       T count = 0;\n      while (length >>= 1) // find bit length (note: cannot assume int)\n        count++;\n      m_data = new T [2 << count];\n      if (m_data == NULL) {\n         throw pexception( pexception::MEMORY_ALLOCATION, sizeof(T) * size_t(2 << count) );\n      }\n      stream.read((char *) &m_data, sizeof(T)*(copy+1) );\n   }\n   return stream;\n}\n\ntemplate <class T>\n::std::ostream& psubvec<T>::write( ::std::ostream& stream )\n{\n   if (m_data) {\n      stream.write((char *) &m_data, sizeof(T)*(m_data[0]+1));\n   }\n   return stream;\n}\n\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\n// And now the quick mapping routine\n\n// Helper class keyvaluepair...\n\ntemplate <class T1, class T2> class keyvaluepair {\npublic:\n   T1 m_key;\n   T2 m_value;\npublic:\n   keyvaluepair(const T1 key = T1(), const T2 value = T2())\n   { m_key = key; m_value = value; }\n   T1& key() { return m_key; }\n   const T1 key() const { return m_key; }\n   T2& value() { return m_value; }\n   const T2& value() const { return m_value; }\n\n   ::std::istream& read( ::std::istream& stream );\n   ::std::ostream& write( ::std::ostream& stream );\n};\ntemplate <class T1, class T2>\ninline bool operator == (const keyvaluepair<T1,T2>& a, const keyvaluepair<T1,T2>& b)\n{ return (a.m_key == b.m_key); }\ntemplate <class T1, class T2>\ninline bool operator < (const keyvaluepair<T1,T2>& a, const keyvaluepair<T1,T2>& b)\n{ return (a.m_key < b.m_key); }\ntemplate <class T1, class T2>\ninline bool operator > (const keyvaluepair<T1,T2>& a, const keyvaluepair<T1,T2>& b)\n{ return (a.m_key > b.m_key); }\n// Note: read and write only work for structures without pointers\ntemplate <class T1, class T2>\n::std::istream& keyvaluepair<T1,T2>::read( ::std::istream& stream )\n{\n   stream.read( (char *) &m_key, sizeof(T1) );\n   stream.read( (char *) &m_value, sizeof(T2) );\n   return stream;\n}\ntemplate <class T1, class T2>\n::std::ostream& keyvaluepair<T1,T2>::write( ::std::ostream& stream )\n{\n   stream.write( (char *) &m_key, sizeof(T1) );\n   stream.write( (char *) &m_value, sizeof(T2) );\n   return stream;\n}\n\ntemplate <class T1, class T2> class keyvaluepairref\n{\n   // Quick mod - TV\n#if defined(_MSC_VER)\nprotected:\n#else\npublic:\n#endif\n   T1 m_key;\n   T2 *m_value;\npublic:\n   keyvaluepairref(const T1 key = T1())\n   { m_key = key; m_value = NULL; }\n   keyvaluepairref(const T1 key, const T2& value)\n   { m_key = key; m_value = new T2(value); }\n   keyvaluepairref(const keyvaluepairref& k)\n   { m_key = k.m_key; m_value = new T2(*(k.m_value)); }\n   keyvaluepairref& operator = (const keyvaluepairref& k)\n   {\n      if (this != &k)\n      {\n         m_key = k.m_key;\n         m_value = new T2(*(k.m_value));\n      }\n      return *this;\n   }\n   virtual ~keyvaluepairref()\n   { if (m_value) {delete m_value; m_value = NULL;} }\n   T1& key() { return m_key; }\n   const T1 key() const { return m_key; }\n   T2& value() { return *m_value; }\n   const T2& value() const { return *m_value; }\n\n   // Quick mod - TV\n#if defined(_MSC_VER)\n   friend bool operator == <T1,T2>(const keyvaluepairref<T1,T2>& a, const keyvaluepairref<T1,T2>& b);\n   friend bool operator <  <T1,T2>(const keyvaluepairref<T1,T2>& a, const keyvaluepairref<T1,T2>& b);\n   friend bool operator >  <T1,T2>(const keyvaluepairref<T1,T2>& a, const keyvaluepairref<T1,T2>& b);\n#endif\n\n   //\n   virtual ::std::istream& read( ::std::istream& stream );\n   virtual ::std::ostream& write( ::std::ostream& stream );\n};\ntemplate <class T1, class T2>\ninline bool operator == (const keyvaluepairref<T1,T2>& a, const keyvaluepairref<T1,T2>& b)\n{ return (a.m_key == b.m_key); }\ntemplate <class T1, class T2>\ninline bool operator < (const keyvaluepairref<T1,T2>& a, const keyvaluepairref<T1,T2>& b)\n{ return (a.m_key < b.m_key); }\ntemplate <class T1, class T2>\ninline bool operator > (const keyvaluepairref<T1,T2>& a, const keyvaluepairref<T1,T2>& b)\n{ return (a.m_key > b.m_key); }\n// Note: read and write only work for structures without pointers\ntemplate <class T1, class T2>\n::std::istream& keyvaluepairref<T1,T2>::read( ::std::istream& stream )\n{\n   stream.read( (char *) &m_key, sizeof(T1) );\n\n#ifndef _WIN32\n   m_value = new T2;\n#endif\n   stream.read( (char *) m_value, sizeof(T2) );\n   return stream;\n}\ntemplate <class T1, class T2>\n::std::ostream& keyvaluepairref<T1,T2>::write( ::std::ostream& stream )\n{\n   stream.write( (char *) &m_key, sizeof(T1) );\n   stream.write( (char *) m_value, sizeof(T2) );\n   return stream;\n}\n\n// ...and yuk! it gets worse... now we have to define a whole new class:\n\ntemplate <class T1,class T2,class Pair> class pmemmap\n{\n// It looks very similar to a pqvector...\nprotected:\n   pqvector<Pair> m_vector;\npublic:\n   pmemmap() {;}\n   pmemmap(const pmemmap<T1,T2,Pair>& map ) { m_vector = map.m_vector; }\n   ~pmemmap() {;}\n   pmemmap<T1,T2,Pair>& operator = (const pmemmap<T1,T2,Pair>& map )\n   { if (this != &map) m_vector = map.m_vector; return *this; }\n   //\n   // at, [] and so on\n   T2& at(size_t i)\n   { return m_vector.at(i).value(); }\n   const T2& at(size_t i) const\n   { return m_vector.at(i).value(); }\n   T2& operator [] (size_t i)\n   { return m_vector.at(i).value(); }\n   const T2& operator [] (size_t i) const\n   { return m_vector.at(i).value(); }\n   T2& head()\n   { return m_vector.head().value(); }\n   const T2& head() const\n   { return m_vector.head().value(); }\n   T2& tail()\n   { return m_vector.tail().value(); }\n   const T2& tail() const\n   { return m_vector.tail().value(); }\n   size_t size() const\n   { return m_vector.size(); }\n   void clear()\n   { m_vector.clear(); }\n   //\n   // standard operations (unordered vector)\n   T2& find(const T1& item) const\n   { return m_vector.find(Pair(item)).value(); }\n   size_t findindex(const T1& item) const\n   { return m_vector.findindex(Pair(item)); }\n   //\n   // binary operations (ordered vector)\n   T2& search(const T1& item)\n   { return m_vector.search(Pair(item)).value(); }\n   const T2& search(const T1& item) const\n   { return m_vector.search(Pair(item)).value(); }\n   size_t searchindex(const T1& item) const\n   { return m_vector.searchindex(Pair(item)); }\n   void remove_at(size_t i)\n   { m_vector.remove_at(i); }\n   void remove_at(const pvecint& list)\n   { m_vector.remove_at(list); }\n   void remove(const T1& item)\n   { remove_at(m_vector.searchindex(item)); }\n   size_t add(const T1& k, const T2& v, int type = paftl::ADD_UNIQUE) // note: does not replace!\n   { return m_vector.add( Pair(k,v), type ); }\n   // extras\n   T1& key(size_t i)\n   { return m_vector.at(i).key(); }\n   const T1 key(size_t i) const\n   { return m_vector.at(i).key(); }\n   T2& value(size_t i)\n   { return m_vector.at(i).value(); }\n   const T2& value(size_t i) const\n   { return m_vector.at(i).value(); }\n   T2& current()\n   { return m_vector.current().value(); }\n   const T2& current() const\n   { return m_vector.current().value(); }\n   // read and write (structures without pointers *only*)\n   ::std::istream& read( ::std::istream& stream );\n   ::std::ostream& write( ::std::ostream& stream );\n};\n\n// Note: read and write only work for structures without pointers\n\ntemplate <class T1,class T2,class Pair>\n::std::istream& pmemmap<T1,T2,Pair>::read( ::std::istream& stream )\n{\n   for (size_t i = m_vector.size() - 1; i != paftl::npos; i--) {\n      m_vector.remove_at(i);\n   }\n   // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\n   unsigned int length;\n   stream.read( (char *) &length, sizeof(unsigned int) );\n   for (size_t j = 0; j < size_t(length); j++) {\n      // these should be in order, so just push them:\n      Pair p;\n      p.read(stream);\n      m_vector.push_back(p);\n   }\n   return stream;\n}\n\ntemplate <class T1,class T2,class Pair>\n::std::ostream& pmemmap<T1,T2,Pair>::write( ::std::ostream& stream )\n{\n   // check for max unsigned int exceeded\n   if (m_vector.size() > size_t((unsigned int)-1)) {\n      throw pexception( pexception::MAX_ARRAY_EXCEEDED, m_vector.size() );\n   }\n\n   // n.b., do not change this to size_t as it will cause 32bit to 64bit conversion problems\n   unsigned int length = (unsigned int)(m_vector.size());\n   stream.write( (char *) &length, sizeof(unsigned int) );\n   for (size_t i = 0; i < m_vector.size(); i++) {\n      m_vector[i].write(stream);\n   }\n   return stream;\n}\n\n// ...to stop the MS compiler complaining...\n#define kvp(T1,T2) keyvaluepair<T1,T2>\n\ntemplate <class T1, class T2> class pmap : public pmemmap<T1,T2,kvp(T1,T2)>\n{\n};\n\n// ...to stop the MS compiler complaining...\n#define kvpr(T1,T2) keyvaluepairref<T1,T2>\n\ntemplate <class T1, class T2> class pqmap : public pmemmap<T1,T2,kvpr(T1,T2)>\n{\n};\n\n///////////////////////////////////////////////////////////////////////////////\n\n// ptree: a simple tree class\n\n// Allows template of a template (recursive) definition for tree\n#define ptreeT ptree<T>\n\ntemplate <class T> class ptree\n{\npublic:\n   class exception : public pexception\n   {\n   public:\n      enum exception_t { PTREE_UNDEFINED = 0x1000,\n                         UNASSIGNED_DATA = 0x1001 };\n   public:\n      exception(int n_exception = PTREE_UNDEFINED) : pexception( n_exception ) {}\n   };\nprotected:\n   T *m_data;\n   ptree<T> *m_parent;\n   pvector<ptreeT *> m_children;\npublic:\n   ptree() {\n      m_data = NULL;\n      m_parent = NULL;\n   }\n   ptree(const T& data) {\n      m_data = new T(data);\n      m_parent = NULL;\n   }\n   ptree(const ptree<T>& tree ) {\n      m_data = tree.m_data;\n      for (int i = 0; i < tree.m_children.size(); i++) {\n         ptree<T> *child = new ptree<T>( *(tree.m_children[i]) );\n         m_children.push_back( child );\n         m_children.tail()->m_parent = this;\n      }\n   }\n   ptree<T>& operator = (const ptree<T>& tree) {\n      if (this != &tree) {\n         m_data = tree.m_data;\n         for (int i = 0; i < tree.m_children.size(); i++) {\n            ptree<T> *child = new ptree<T>( *(tree.m_children[i]) );\n            m_children.push_back( child );\n            m_children.tail()->m_parent = this;\n         }\n      }\n      return *this;\n   }\n   ~ptree() {\n      delete m_data;\n      m_data = NULL;\n      while (m_children.size()) {\n         delete m_children.tail();\n         m_children.pop_back();\n      }\n   }\n   void addChild(const T& data) {\n      m_children.push_back( new ptree<T>(data) );\n      m_children.tail()->m_parent = this;\n   }\n   void removeChild(int ref) {\n      ptree<T> *child = m_children[ref];\n      m_children.remove(ref);\n      delete child;\n   }\n   int getChildCount() const {\n      return m_children.size();\n   }\n   ptree<T>& getChild(int ref) const {\n      return *(m_children[ref]);\n   }\n   ptree<T>& getLastChild() const {\n      return *(m_children[m_children.size() - 1]);\n   }\n   int hasParent() const {\n      return m_parent ? 1 : 0;\n   }\n   ptree<T>& getParent() const {\n      return *m_parent;\n   }\n   void setParent(ptree<T>& parent) {\n      if (m_parent) {\n         for (int i = 0; i < m_parent->m_children.size(); i++) {\n            if (m_parent->m_children[i] == this) {\n               m_parent->m_children.remove(i);\n            }\n         }\n      }\n      m_parent = &parent;\n   }\n   void setValue(const T& data) {\n      m_data = new T(data);\n   }\n   T& getValue() const {\n      if (!m_data)\n         throw exception( exception::UNASSIGNED_DATA );\n      return *m_data;\n   }\n   pvector<T> getPath() {\n      pvector<T> path;\n      getPath(path);\n      return path;\n   }\n   void getPath(pvector<T>& path) {\n      path.push_back( getValue() );\n      if (m_parent) {\n         m_parent->getPath(path);\n      }\n   }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n\ntemplate <class T> class pflipper\n{\nprotected:\n   T m_contents[2];\n   short parity;\npublic:\n   pflipper() {\n      parity = 0;\n   }\n   pflipper( const T& a, const T& b ) {\n      parity = 0;\n      m_contents[0] = a;\n      m_contents[1] = b;\n   }\n   pflipper( const pflipper& f ) {\n      parity = f.parity;\n      m_contents[0] = f.m_contents[0];\n      m_contents[1] = f.m_contents[1];\n   }\n   virtual ~pflipper() {\n   }\n   pflipper& operator = (const pflipper& f ) {\n      if (this != &f) {\n         parity = f.parity;\n         m_contents[0] = f.m_contents[0];\n         m_contents[1] = f.m_contents[1];\n      }\n      return *this;\n   }\n   void flip() {\n      parity = (parity == 0) ? 1 : 0;\n   }\n   T& a() {\n      return m_contents[parity];\n   }\n   T& b() {\n      return m_contents[(parity == 0) ? 1 : 0];\n   }\n   const T& a() const {\n      return m_contents[parity];\n   }\n   const T& b() const {\n      return m_contents[(parity == 0) ? 1 : 0];\n   }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n\n// Read and write runlength encoded vectors, with byte alignment through T\n\n// note: vector must have been allocated to accept stream\ntemplate <class T>\n::std::istream& read_rle( ::std::istream& stream, T *vector, size_t length )\n{\n   unsigned char *data = (unsigned char *) vector;\n   for (size_t i = 0; i < sizeof(T); i++) {\n      unsigned char runlength = 0, current, last;\n      size_t count = 0;\n      while (count < length) {\n         stream.get((char&)current);\n         if (count && current == last) {\n            stream.get((char&)runlength);\n         }\n         else {\n            last = current;\n            runlength = 1;\n         }\n         for (size_t i = count; i < count + runlength; i++) {\n            data[i + sizeof(T) * count] = current;\n         }\n         count += runlength;\n      }\n   }\n   return stream;\n}\n\ntemplate <class T> ::std::ostream& write_rle( ::std::ostream& stream, T *vector, size_t length )\n{\n   unsigned char *data = (unsigned char *) vector;\n   for (size_t i = 0; i < sizeof(T); i++) {\n      unsigned char runlength = 0, current;\n      size_t count = 0;\n      while (count < length) {\n         do {\n            current = data[i + sizeof(T) * count];\n            runlength++;\n            count++;\n         } while (count < length && current == data[i + sizeof(T) * count] && runlength < 255);\n         if (runlength == 1) {\n            stream.put(current);\n         }\n         else {\n            stream.put(current);\n            stream.put(current);\n            runlength -= 1; // since we've written current twice anyway to mark the run\n            stream.put(runlength);\n         }\n         runlength = 0;\n      }\n   }\n   return stream;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// Hashing for LZW compression\n\nconst size_t HASHBITSIZE = 12;\nconst size_t HASHTABLESIZE = 5021; // n.b., prime > 4096\n//const size_t HASHTABLESIZE = 65983; // n.b., prime > 65536\nconst size_t HASHMAXVALUE = (1 << HASHBITSIZE) - 1;\nconst size_t HASHMAXCODE = HASHMAXVALUE - 1;\n\nstruct phash\n{\n   unsigned int code;\n   unsigned int prefix;\n   unsigned char character;\n};\n\nclass phashtable\n{\nprotected:\n   mutable size_t m_current;\n   unsigned int m_nextcode;\n   phash m_table[HASHTABLESIZE];\npublic:\n   phashtable();\n   void add_encode(unsigned int prefix, unsigned char character);\n   void add_decode(unsigned int prefix, unsigned char character);\n   size_t search(unsigned int prefix, unsigned char character) const;\n   unsigned char *decode(unsigned char *buffer, unsigned int code);\n   int getnextcode()\n   { return m_nextcode; }\n};\n\ninline phashtable::phashtable()\n{\n   for (size_t i = 0; i < HASHTABLESIZE; i++) {\n      m_table[i].code = -1;\n   }\n   m_nextcode = 256; // 0-255 for standard characters\n}\n\ninline void phashtable::add_encode(unsigned int prefix, unsigned char character)\n{\n   if (m_nextcode <= HASHMAXCODE) {\n      m_table[m_current].code = m_nextcode;\n      m_table[m_current].prefix = prefix;\n      m_table[m_current].character = character;\n      m_nextcode++;\n   }\n}\n\ninline void phashtable::add_decode(unsigned int prefix, unsigned char character)\n{\n   if (m_nextcode <= HASHMAXCODE) {\n      m_table[m_nextcode].prefix = prefix;\n      m_table[m_nextcode].character = character;\n      m_nextcode++;\n   }\n}\n\ninline size_t phashtable::search(unsigned int prefix, unsigned char character) const\n{\n   // the bracket overkill on the following line ensures paftl.h compiles on a GNU compiler\n   m_current = (((unsigned int) character) << (HASHBITSIZE-8)) ^ prefix;\n   size_t offset;\n   if (m_current == 0) {\n      offset = 1;\n   }\n   else {\n      offset = HASHTABLESIZE - m_current;\n   }\n   while ( m_table[m_current].code != (unsigned int) -1 &&\n          (m_table[m_current].prefix != prefix || m_table[m_current].character != character))\n   {\n      if (offset > m_current)\n         m_current += HASHTABLESIZE;\n      m_current -= offset;\n   }\n   return m_table[m_current].code;\n}\n\ninline unsigned char *phashtable::decode(unsigned char *buffer, unsigned int code)\n{\n  while (code > 255)\n  {\n    *buffer++ = m_table[code].character;\n    code = m_table[code].prefix;\n  }\n  *buffer = code;\n  return buffer;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// LZW as of June 2003 US patent has expired\n//     as of June 2004 the European patent expires\n\n// Note to paftl users: ensure that you meet patent requirements for your usage\n\n// LZW uses a class so that the hash table may be retained over multiple\n// vector read / writes, as well as holding a read buffer\n\n// 12 bit, 4096 pattern holder\n\n// Note: you must *flush* after writing -- the idea is you can write several\n// vectors before a flush\n\ntemplate <class T> class plzw\n{\nprotected:\n   // read / write buffering\n   unsigned long m_bitbuffer;\n   bool m_bitswaiting;\nprotected:\n   bool m_firstever;\n   unsigned char m_character;\n   unsigned int m_prefix;\n   phashtable m_hashtable;\n   unsigned char m_decodedstring[HASHTABLESIZE];   // <- impossible that the decode string is ever as long as the hash table size\npublic:\n   plzw();\n   ::std::istream& read( ::std::istream& stream, T *vector, int length );\n   ::std::ostream& write( ::std::ostream& stream, T *vector, int length );\nprotected:\n   ::std::istream& get(::std::istream& stream, unsigned int& code);\n   ::std::ostream& put(::std::ostream& stream, const unsigned int code);\n};\n\ntemplate <class T>\nplzw<T>::plzw()\n{\n   m_firstever = true;\n   m_bitswaiting = false;\n}\n\ntemplate <class T>\n::std::istream& plzw<T>::read(::std::istream& stream, T *vector, int length )\n{\n   unsigned char *data = (unsigned char *) vector;\n   unsigned char *string;\n\n   if (m_firstever) {\n      get(stream, m_prefix);\n      m_character = m_prefix;\n      data[0] = m_character;\n   }\n\n   // T is sequenced, as we assume that patterns will recur through aligned bytes of T\n   for (unsigned int i = (m_firstever ? 1 : 0); i < sizeof(T) * length;) {\n      unsigned int nextcode;\n      get(stream, nextcode);\n      if (nextcode >= (unsigned int) m_hashtable.getnextcode()) {\n         *m_decodedstring = m_character;\n         string = m_hashtable.decode(m_decodedstring + 1, m_prefix);\n      }\n      else {\n         string = m_hashtable.decode(m_decodedstring, nextcode);\n      }\n      m_character = *string;\n      if (i != 0) {\n         // this should be skipped on initial read\n         m_hashtable.add_decode(m_prefix,m_character);\n      }\n      while (string >= m_decodedstring && i < sizeof(T) * length) {\n         data[i] = *string--;\n         i++;\n      }\n      m_prefix = nextcode;\n   }\n\n   // skip to next byte boundary for next read... (and retain context)\n   m_bitswaiting = false;\n   m_firstever = false;\n\n   return stream;\n}\n\ntemplate <class T>\n::std::ostream& plzw<T>::write(::std::ostream& stream, T *vector, int length )\n{\n   unsigned char *data = (unsigned char *) vector;\n\n   m_prefix = data[0];\n\n   for (unsigned int i = 0; i < sizeof(T) * length; i++) {\n      m_character = data[i];\n      int code = m_hashtable.search(m_prefix, m_character);\n      if (code != -1) {\n         m_prefix = code;\n      }\n      else {\n         m_hashtable.add_encode(m_prefix, m_character);\n         put(stream, m_prefix);\n         m_prefix = m_character;\n      }\n   }\n\n   // skip to next byte boundary\n   put(stream, m_prefix);\n   if (m_bitswaiting) {\n      stream.put((unsigned char)(m_bitbuffer & 0xFF));\n      m_bitswaiting = false;\n   }\n\n   return stream;\n}\n\n// stored, 1 and 2 are the 12-bit codes,\n// a b & c are first 4 bits, second 4 bits and third four bits respectively\n// b1 a1\n// c2 c1\n// b2 a2\n\ntemplate <class T>\n::std::istream& plzw<T>::get(::std::istream& stream, unsigned int& code)\n{\n   unsigned char bits;\n   if (!m_bitswaiting) {\n      stream.get((char&)bits);\n      code = bits;\n      stream.get((char&)bits);\n      code |= (bits & 0x0F) << 8;\n      m_bitbuffer = bits & 0xF0;\n      m_bitswaiting = true;\n   }\n   else {\n      stream.get((char&)bits);\n      code = ((unsigned int)bits) | (m_bitbuffer << 4);\n      m_bitswaiting = false;\n   }\n\n   return stream;\n}\n\ntemplate <class T>\n::std::ostream& plzw<T>::put(::std::ostream& stream, const unsigned int code)\n{\n   if (!m_bitswaiting) {\n      stream.put((unsigned char)(code & 0xFF));\n      m_bitbuffer = code >> 8;\n      m_bitswaiting = true;\n   }\n   else {\n      unsigned char bits;\n      bits = ((code >> 4) & 0xF0) | m_bitbuffer;\n      stream.put(bits);\n      stream.put((unsigned char)(code & 0xFF));\n      m_bitswaiting = false;\n   }\n\n   return stream;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// } // namespace paftl\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/pixelbase.cpp",
    "content": "#include \"mgraph440/pixelbase.h\"\n\nnamespace mgraph440 {\n\nPixelRefVector PixelBase::pixelateLine( Line l, int scalefactor ) const\n{\n   PixelRefVector pixel_list;\n\n   // this is *not* correct for lines that are off the edge...\n   // should use non-constrained version (false), and find where line enters the region\n   PixelRef a = pixelate( l.start(), true, scalefactor );\n   PixelRef b = pixelate( l.end(), true, scalefactor );\n\n   l.normalScale( m_region );\n\n   pixel_list.push_back( a );\n\n   int scaledcols = m_cols * scalefactor;\n   int scaledrows = m_rows * scalefactor;\n\n   int parity = 1;   // Line goes upwards\n   if (a.y > b.y) {\n      parity = -1;   // Line goes downwards\n      a.y *= -1;\n      b.y *= -1;     // Set ay and by saves work on comparisons later on\n   }\n\n   // special case 1\n   if (a.x == b.x) {\n      while (a.y < b.y ) {\n         a.y += 1;\n         pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n      }\n   }\n   else if (a.y == b.y) {\n      while ( a.x < b.x ) {\n         a.x += 1;\n         pixel_list.push_back( PixelRef(a.x,parity * a.y) );     // Lines always go left to right\n      }\n   }\n   else {\n\n      double hw_ratio = l.height() / l.width(); // Working all of these out leaves less scope for floating point error\n      double wh_ratio = l.width() / l.height();\n      double x0_const = l.ay() - double(parity) * hw_ratio * l.ax();\n      double y0_const = l.ax() - double(parity) * wh_ratio * l.ay();\n\n      while (a.x < b.x || a.y < b.y) {\n         PixelRef e;\n         e.y = parity * int( double(scaledrows) * (x0_const + parity * hw_ratio * (double(a.x + 1) / double(scaledcols))) );\n         // Note when decending 1.5 -> 1 and ascending 1.5 -> 2\n         if (parity < 0) {\n            e.x = int( double(scaledcols) * (y0_const + wh_ratio * ( double(a.y)   / double(scaledrows))) );\n         }\n         else {\n            e.x = int( double(scaledcols) * (y0_const + wh_ratio * (double(a.y + 1) / double(scaledrows))) );\n         }\n\n         if (a.y < e.y) {\n            while (a.y < e.y && a.y < b.y) {\n               a.y += 1;\n               pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n            }\n            if (a.x < b.x) {\n               a.x += 1;\n               pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n            }\n         }\n         else if (a.x < e.x) {\n            while (a.x < e.x && a.x < b.x) {\n               a.x += 1;\n               pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n            }\n            if (a.y < b.y) {\n               a.y += 1;\n               pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n            }\n         }\n         else {\n            // Special case: exactly diagonal step (should only require one step):\n            // (Should actually never happen) (Doesn't: checked with RFH)\n            a.x += 1;\n            pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n            a.y += 1;\n            pixel_list.push_back( PixelRef(a.x,parity * a.y) );\n         }\n      }\n   }\n   return pixel_list;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/pixelbase.h",
    "content": "#pragma once\n\n#include \"mgraph440/p2dpoly.h\"\n#include \"mgraph440/pixelref.h\"\n\nnamespace mgraph440 {\n\nclass PixelBase\n{\npublic:\n   int m_rows;\n   int m_cols;\n   QtRegion m_region;\n   PixelBase() {;}\n   // constrain is constrain to bounding box (i.e., in row / col bounds)\n   virtual PixelRef pixelate(const Point2f&, bool constrain = true, int scalefactor = 1 ) const = 0;\n   PixelRefVector pixelateLine( Line l, int scalefactor = 1 ) const;\n   bool includes(const PixelRef pix) const {\n      return (pix.x >= 0 && pix.x < m_cols && pix.y >= 0 && pix.y < m_rows);\n   }\n   const QtRegion& getRegion() const {\n      return m_region;\n   }\n};\n\n}\n"
  },
  {
    "path": "mgraph440/pixelref.h",
    "content": "#pragma once\n\n#include \"mgraph440/p2dpoly.h\"\n\nnamespace mgraph440 {\n\nclass PixelRef\n{\npublic:\n   short x = 0;\n   short y = 0;\n   PixelRef( short ax = -1, short ay = -1 )\n      { x = ax; y = ay; }\n   PixelRef( int i )\n      { x = short(i >> 16); y = short(i & 0xffff); }\n   bool empty()\n      { return x == -1 && y == -1; }\n   PixelRef up() const\n      { return PixelRef(x, y + 1); }\n   PixelRef left() const\n      { return PixelRef(x - 1, y); }\n   PixelRef right() const\n      { return PixelRef(x + 1, y); }\n   PixelRef down() const\n      { return PixelRef(x, y - 1); }\n   short& operator [] (int i)\n      { return (i == XAXIS) ? x : y; }\n   bool within( const PixelRef bl, const PixelRef tr ) const\n      { return (x >= bl.x && x <= tr.x && y >= bl.y && y <= tr.y); }\n   bool encloses( PixelRef testpoint ) const\n      { return (testpoint.x >= 0 && testpoint.x < x && testpoint.y >= 0 && testpoint.y < y);}\n   // directions for the ngraph:\n   enum {NODIR = 0x00, HORIZONTAL = 0x01, VERTICAL = 0x02, POSDIAGONAL = 0x04, NEGDIAGONAL = 0x08, DIAGONAL = 0x0c, NEGHORIZONTAL = 0x10, NEGVERTICAL = 0x20};\n   short& row(char dir)\n      { return (dir & VERTICAL) ? x : y; }\n   short& col(char dir)\n      { return (dir & VERTICAL) ? y : x; }\n   const short& row(char dir) const\n      { return (dir & VERTICAL) ? x : y; }\n   const short& col(char dir) const\n      { return (dir & VERTICAL) ? y : x; }\n   PixelRef& move(char dir)\n      { switch (dir)\n        {\n           case POSDIAGONAL: x++; y++; break;\n           case NEGDIAGONAL: x++; y--; break;\n           case HORIZONTAL: x++; break;\n           case VERTICAL: y++; break;\n           case NEGHORIZONTAL: x--; break;\n           case NEGVERTICAL: y--; break;\n        }\n        return *this; }\n   friend bool operator == (const PixelRef a, const PixelRef b);\n   friend bool operator != (const PixelRef a, const PixelRef b);\n   friend bool operator < (const PixelRef a, const PixelRef b);\n   friend bool operator > (const PixelRef a, const PixelRef b);\n   friend PixelRef operator + (const PixelRef a, const PixelRef b);\n   friend PixelRef operator - (const PixelRef a, const PixelRef b);\n   friend PixelRef operator / (const PixelRef a, const int factor);\n   friend double dist(const PixelRef a, const PixelRef b);\n   friend double angle(const PixelRef a, const PixelRef b, const PixelRef c);\n   operator int() const\n   { return ((int(x) << 16) + (int(y) & 0xffff)); }\n};\n\nconst PixelRef NoPixel( -1, -1 );\ntypedef std::vector<PixelRef> PixelRefVector;\n\n\ninline bool operator == (const PixelRef a, const PixelRef b)\n{\n   return (a.x == b.x) && (a.y == b.y);\n}\ninline bool operator != (const PixelRef a, const PixelRef b)\n{\n   return (a.x != b.x) || (a.y != b.y);\n}\ninline bool operator < (const PixelRef a, const PixelRef b)\n{\n   return (a.x < b.x) || (a.x == b.x && a.y < b.y);\n}\ninline bool operator > (const PixelRef a, const PixelRef b)\n{\n   return (a.x > b.x) || (a.x == b.x && a.y > b.y);\n}\ninline PixelRef operator + (const PixelRef a, const PixelRef b)\n{\n   return PixelRef(a.x + b.x, a.y + b.y);\n}\ninline PixelRef operator - (const PixelRef a, const PixelRef b)\n{\n   return PixelRef(a.x - b.x, a.y - b.y);\n}\ninline PixelRef operator / (const PixelRef a, const int factor)\n{\n   return PixelRef(a.x / factor, a.y / factor);\n}\n\n\nstruct PixelRefPair\n{\n   PixelRef a;\n   PixelRef b;\n   PixelRefPair(const PixelRef x = NoPixel, const PixelRef y = NoPixel)\n   {\n      a =  x < y ? x : y;\n      b =  x < y ? y : x;\n   }\n   friend bool operator == (const PixelRefPair& x, const PixelRefPair& y);\n   friend bool operator != (const PixelRefPair& x, const PixelRefPair& y);\n   friend bool operator <  (const PixelRefPair& x, const PixelRefPair& y);\n   friend bool operator >  (const PixelRefPair& x, const PixelRefPair& y);\n\n};\n\n// note: these are made with a is always less than b\ninline bool operator == (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return (x.a == y.a && x.b == y.b);\n}\ninline bool operator != (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return (x.a != y.a || x.b != y.b);\n}\ninline bool operator < (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return ( (x.a == y.a) ? x.b < y.b : x.a < y.a );\n}\ninline bool operator > (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return ( (x.a == y.a) ? x.b > y.b : x.a > y.a );\n}\n\n}\n"
  },
  {
    "path": "mgraph440/point.cpp",
    "content": "#include \"mgraph440/point.h\"\n\nnamespace mgraph440 {\n\nPoint::~Point()\n{\n   if (m_node) {\n      delete m_node;\n      m_node = NULL;\n      delete m_attributes;\n      m_attributes = NULL;\n   }\n}\n\nstd::ifstream& Point::read(std::ifstream& stream, int version, int attr_count)\n{\n   if (m_node) {\n      delete m_node;\n      m_node = NULL;\n      delete m_attributes;\n      m_attributes = NULL;\n   }\n   stream.read( (char *) &m_state, sizeof(m_state) );\n   // block is the same size as m_noderef used to be for ease of replacement:\n   // (note block NO LONGER used!)\n   stream.read( (char *) &m_block, sizeof(m_block) );\n   if (version < VERSION_BLOCKEDQUAD) {\n      m_block = 0;\n   }\n   stream.read( (char *) &m_misc, sizeof(m_misc) );\n   if (version >= VERSION_GRID_CONNECTIONS) {\n      stream.read( (char *) &m_grid_connections, sizeof(m_grid_connections) );\n   }\n   if (version >= VERSION_NGRAPH_INTROD) {\n      stream.read( (char *) &m_merge, sizeof(m_merge) );\n      bool ngraph;\n      stream.read( (char *) &ngraph, sizeof(ngraph) );\n      if (ngraph) {\n         m_node = new Node;\n         m_node->read(stream, version);\n         if (version < VERSION_ATTRIBUTES_TABLE) {\n            // don't deal with this here, just get the attributes into memory\n            m_attributes = new AttrBody(-1,g_attr_header);\n            m_attributes->read( stream, attr_count );\n         }\n      }\n   }\n   if (version >= VERSION_POINT_LOCATIONS) {\n      stream.read((char *) &m_location, sizeof(m_location));\n   }\n   if (version < VERSION_SHAPE_MAPS) {\n      // old layer information\n      m_data_objects.read(stream);\n   }\n   if (version >= VERSION_BOUNDARYGRAPH && version < VERSION_NEWBOUNDARYGRAPH) {\n      // dummy pvecint to hold old format boundary nodes\n      pvecint old_boundary_nodes;\n      old_boundary_nodes.read(stream);\n   }\n   return stream;\n}\n\nstd::ostream& Point::write(std::ostream& stream, int version)\n{\n   stream.write( (char *) &m_state, sizeof(m_state) );\n   // block is the same size as m_noderef used to be for ease of replacement:\n   // note block is no longer used at all\n   stream.write( (char *) &m_block, sizeof(m_block) );\n   stream.write( (char *) &m_misc, sizeof(m_misc) );\n   stream.write( (char *) &m_grid_connections, sizeof(m_grid_connections) );\n   stream.write( (char *) &m_merge, sizeof(m_merge) );\n   bool ngraph;\n   if (m_node) {\n      ngraph = true;\n      stream.write( (char *) &ngraph, sizeof(ngraph) );\n      m_node->write(stream, version);\n   }\n   else {\n      ngraph = false;\n      stream.write( (char *) &ngraph, sizeof(ngraph) );\n   }\n   stream.write((char *) &m_location, sizeof(m_location));\n   return stream;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/point.h",
    "content": "#pragma once\n\n#include \"mgraph440/attr.h\"\n#include \"mgraph440/ngraph.h\"\n\nnamespace mgraph440 {\n\nclass OldPoint1 {\n   friend class PointMap;\nprotected:\n   int m_noderef;\n   int m_state;\n};\n\nclass OldPoint2 {\n   friend class PointMap;\nprotected:\n   int m_noderef;\n   int m_state;\n   int m_misc;\n};\n\nclass Point {\n   friend class Bin;\n   friend class PointMap;\n   friend class MetaGraph; // <- for file conversion routines\n   friend class PafAgent;\n   friend class PafWalker;\npublic:\n   enum { EMPTY = 0x0001, FILLED = 0x0002,\n          BLOCKED = 0x0004, CONTEXTFILLED = 0x0008, // PARTBLOCKED = 0x0008 deprecated\n          SELECTED = 0x0010, EDGE = 0x0020, MERGED = 0x0040,  // PINNED = 0x0020 deprecated\n          AGENTFILLED = 0x0080, AGENTFADE = 0x0100, AGENTA = 0x0200, AGENTB = 0x0400, AGENTC = 0x0800,\n          UPDATELINEADDED = 0x1000, UPDATELINEREMOVED = 0x2000, HIGHLIGHT = 0x4000,\n          AUGMENTED = 0x8000 // AV TV\n        };\n   // note the order of these connections is important and used elsewhere:\n   enum { CONNECT_E = 0x01, CONNECT_NE = 0x02, CONNECT_N = 0x04, CONNECT_NW = 0x08,\n          CONNECT_W = 0x10, CONNECT_SW = 0x20, CONNECT_S = 0x40, CONNECT_SE = 0x80 };\n   int m_block;   // not used, unlikely to be used, but kept for time being\n   int m_state;\n   int m_misc; // <- undocounter / point seen register / agent reference number, etc\n   char m_grid_connections; // this is a standard set of grid connections, with bits set for E,NE,N,NW,W,SW,S,SE\n   Node *m_node;            // graph links\n   Point2f m_location;      // note: this is large, but it helps allow loading of non-standard grid points,\n                            // whilst allowing them to be displayed as a visibility graph, also speeds up time to\n                            // display\n   float m_color;           // although display color for the point now introduced\n   PixelRef m_merge;        // to merge with another point\n   PixelRef m_extent;       // used to speed up graph analysis (not sure whether or not it breaks it!)\n   float m_dist;            // used to speed up metric analysis\n   float m_cumangle;        // cummulative angle -- used in metric analysis and angular analysis\n   // hmm... this is for my 3rd attempt at a quick line intersect algo:\n   // every line that goes through the gridsquare -- memory intensive I know, but what can you do:\n   // accuracy is imperative here!  Calculated pre-fillpoints / pre-makegraph, and (importantly) it works.\n   pqmap<int,Line> m_lines;\n   // and when dynamic lines are being used, the process flag tells you which q octants to reprocess:\n   //\n   // Deprecated, kept for compatibility with previous versions:\n   AttrBody *m_attributes;  // deprecated: now PointMap has an attribute table to handle this\n   pmap<int,int> m_data_objects; // deprecated: (first int is data layer -- presumably the KEY not the index, second int is object ref)\n   //\n   int m_processflag;\npublic:\n   Point()\n      { m_state = EMPTY; m_block = 0; m_misc = 0; m_grid_connections = 0; m_node = NULL; m_attributes = NULL; m_processflag = 0; m_merge = NoPixel; m_user_data = NULL; }\n   Point& operator = (const Point&)\n      { throw 1; }\n   Point(const Point&)\n      { throw 1; }\n   ~Point();\n   bool filled() const\n      { return (m_state & FILLED) == FILLED; }\n   bool selected() const\n      { return (m_state & SELECTED) == SELECTED; }\n   int getDataObject( int layer ) {\n      size_t var = m_data_objects.searchindex( layer );\n      if (var != paftl::npos)\n         return m_data_objects.at(var);\n      return -1;  // note: not paftl::npos\n   }\n   AttrBody& getAttributes()\n      { return *m_attributes; }\n   void setAttributes(const AttrBody& attr)\n      { if (m_attributes) delete m_attributes;\n        m_attributes = new AttrBody(attr); }\n   std::ifstream& read(std::ifstream& stream, int version, int attr_count);\n   std::ostream &write(std::ostream &stream, int version);\n   void *m_user_data;\n   Node& getNode()\n      { return *m_node; }\n};\n\n}\n"
  },
  {
    "path": "mgraph440/pointmap.cpp",
    "content": "#include \"mgraph440/pointmap.h\"\n#include \"mgraph440/containerutils.h\"\n\nnamespace mgraph440 {\n\nbool PointMap::read(std::ifstream& stream, int version )\n{\n   if (version >= VERSION_POINT_MAP_NAMES) {\n      m_name = dXstring440::readString(stream);\n   }\n   else {\n      m_name = \"VGA Map\";\n   }\n\n   // NOTE: You MUST set m_spacepix manually!\n   m_displayed_attribute = -1;\n\n   if (m_points) {\n      for (int i = 0; i < m_cols; i++) {\n         delete [] m_points[i];\n      }\n      delete [] m_points;\n      m_points = NULL;\n   }\n\n   stream.read( (char *) &m_spacing, sizeof(m_spacing) );\n\n   if (version < VERSION_STATE_RECORDED) {\n      if (version >= VERSION_SPARK_GRAPH_INTROD) {\n         bool redundant;\n         stream.read( (char *) &redundant, sizeof(redundant) );\n      }\n      else {\n         double redundant;\n         stream.read( (char *) &redundant, sizeof(redundant) );\n      }\n   }\n\n   stream.read( (char *) &m_rows, sizeof(m_rows) );\n   stream.read( (char *) &m_cols, sizeof(m_cols) );\n\n   stream.read( (char *) &m_point_count, sizeof(m_point_count) );\n\n   stream.read( (char *) &m_bottom_left, sizeof(m_bottom_left) );\n\n   m_region = QtRegion(\n      Point2f(m_bottom_left.x-m_spacing/2.0, m_bottom_left.y-m_spacing/2.0),\n      Point2f(m_bottom_left.x+double(m_cols-1)*m_spacing + m_spacing/2.0,\n              m_bottom_left.y+double(m_rows-1)*m_spacing + m_spacing/2.0) );\n\n   // for old data versions:\n   int attr_count = -1, which_attributes = -1;\n\n   int displayed_attribute;  // n.b., temp variable necessary to force recalc below\n   if (version >= VERSION_ATTRIBUTES_TABLE) {\n      // our data read\n      stream.read((char *)&displayed_attribute,sizeof(displayed_attribute));\n      m_attributes.read( stream, version );\n   }\n   else if (version >= VERSION_NGRAPH_INTROD) {\n      // ick, a very specific subset have this file format:\n      stream.read( (char *) &which_attributes, sizeof(which_attributes) );\n      stream.read( (char *) &attr_count, sizeof(int) );\n   }\n\n   m_points = new Point *[m_cols];\n\n   for (int j = 0; j < m_cols; j++) {\n      m_points[j] = new Point [m_rows];\n      // ...and read...\n      if (version >= VERSION_LAYERS_INTROD) {\n         for (int k = 0; k < m_rows; k++) {\n            m_points[j][k].read(stream,version,attr_count);\n\n            // check if occdistance of any pixel's bin is set, meaning that\n            // the isovist analysis was done\n            if(!m_hasIsovistAnalysis) {\n                for(int b = 0; b < 32; b++) {\n                   if(m_points[j][k].m_node && m_points[j][k].m_node->occdistance(b) > 0) {\n                       m_hasIsovistAnalysis = true;\n                       break;\n                   }\n                }\n            }\n         }\n      }\n      else if (version >= VERSION_EXTRA_POINT_DATA_INTROD) {\n         // Hmm... more untidiness from a previous incarnation\n         OldPoint2 *oldpoints = new OldPoint2 [m_rows];\n         stream.read( (char *) oldpoints, sizeof(OldPoint2) * m_rows );\n         for (int k = 0; k < m_rows; k++) {\n            m_points[j][k].m_block = oldpoints[k].m_noderef;  // <- block is actually for something else!\n            m_points[j][k].m_state = oldpoints[k].m_state;\n            m_points[j][k].m_misc = oldpoints[k].m_misc;\n         }\n      }\n      else {\n         // Hmm... more untidiness from a previous incarnation\n         OldPoint1 *oldpoints = new OldPoint1 [m_rows];\n         stream.read( (char *) oldpoints, sizeof(OldPoint1) * m_rows );\n         for (int k = 0; k < m_rows; k++) {\n            m_points[j][k].m_block= oldpoints[k].m_noderef;  // <- block is actually for something else!\n            m_points[j][k].m_state = oldpoints[k].m_state;\n         }\n      }\n\n      for (int k = 0; k < m_rows; k++) {\n         // Old style point node reffing and also unselects selected nodes which would otherwise be difficult\n         if (version >= VERSION_QUICK_GRAPH_INTROD) {\n            // would soon be better simply to turn off the select flag....\n            m_points[j][k].m_state &= ( Point::EMPTY | Point::FILLED | Point::MERGED | Point::BLOCKED | Point::CONTEXTFILLED | Point::EDGE);\n         }\n         else if (m_points[j][k].m_state == -1) {\n            m_points[j][k].m_state = Point::EMPTY;\n         }\n         else {\n            m_points[j][k].m_state = Point::FILLED;\n         }\n         // Set the node pixel if it exists:\n         if (m_points[j][k].m_node) {\n            m_points[j][k].m_node->setPixel(PixelRef(j,k));\n         }\n         // Set the point location if required:\n         if (version < VERSION_POINT_LOCATIONS) {\n            m_points[j][k].m_location = depixelate(PixelRef(j,k));\n         }\n         // Add merge line if merged:\n         if (!m_points[j][k].m_merge.empty()) {\n             depthmapX440::addIfNotExists(m_merge_lines, PixelRefPair(PixelRef(j,k),m_points[j][k].m_merge));\n         }\n      }\n   }\n\n   // this is my attempt to enter these into the new attribute table:\n   if (version >= VERSION_NGRAPH_INTROD && version < VERSION_ATTRIBUTES_TABLE) {\n      if (which_attributes != GraphVertexList::NONE) {\n         displayed_attribute = 0;\n         convertAttributes(which_attributes);\n      }\n      else {\n         displayed_attribute = -1;\n      }\n   }\n\n   // and if the attribute tables are ready, calculate the direct grid connections:\n   if (version >= VERSION_NGRAPH_INTROD && version < VERSION_GRID_CONNECTIONS) {\n      addGridConnections();\n   }\n\n   m_selection = NO_SELECTION;\n   m_pinned_selection = false;\n\n   m_initialised = true;\n   m_blockedlines = false;\n\n   if (version >= VERSION_POINT_MAPS) {\n      stream.read((char *) &m_processed, sizeof(m_processed));\n      stream.read((char *) &m_boundarygraph, sizeof(m_boundarygraph));\n   }\n\n   // now, as soon as loaded, must recalculate our screen display:\n   // note m_displayed_attribute should be -2 in order to force recalc...\n   m_displayed_attribute = -2;\n   setDisplayedAttribute(displayed_attribute);\n\n   return true;\n}\n\n// A horrible piece of code: this is to convert a file from the old format\n// AttrHeader / AttrBody to the new format Attributes Table\n\n// This code converts attributes for all versions\n// between VERSION_NGRAPH_INTROD and VERSION_ATTRIBUTES_TABLE\n\nvoid PointMap::convertAttributes(int which_attributes)\n{\n   if (which_attributes & GraphVertexList::BASIC) {\n      int connectivity_col = m_attributes.insertLockedColumn(\"Connectivity\");\n      for (int i = 0; i < m_cols; i++) {\n         for (int j = 0; j < m_rows; j++) {\n            if (m_points[i][j].m_attributes) {\n               // insert row...\n               int row = m_attributes.insertRow(PixelRef(i,j));\n               float val;\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::NEIGHBOURHOOD_SIZE);\n               m_attributes.setValue(row, connectivity_col, val);\n            }\n         }\n      }\n   }\n   if (which_attributes & GraphVertexList::LOCAL) {\n      int cluster_col = m_attributes.insertColumn(\"Visual Clustering Coefficient\");\n      int control_col = m_attributes.insertColumn(\"Visual Control\");\n      int controllability_col = m_attributes.insertColumn(\"Visual Controllability\");\n      for (int i = 0; i < m_cols; i++) {\n         for (int j = 0; j < m_rows; j++) {\n            if (m_points[i][j].m_attributes) {\n               int row = m_attributes.getRowid(PixelRef(i,j));\n               float val;\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::CLUSTER);\n               m_attributes.setValue(row, cluster_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::CONTROL_HILL);\n               m_attributes.setValue(row, control_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::CONTROL_TURN);\n               m_attributes.setValue(row, controllability_col, val);\n            }\n         }\n      }\n   }\n   if (which_attributes & GraphVertexList::GLOBAL) {\n      int entropy_col = m_attributes.insertColumn(\"Visual Entropy\");\n      int integ_hh_col = m_attributes.insertColumn(\"Visual Integration [HH]\");\n      int integ_tk_col = m_attributes.insertColumn(\"Visual Integration [Tekl]\");\n      int depth_col = m_attributes.insertColumn(\"Visual Mean Depth\");\n      int count_col = m_attributes.insertColumn(\"Visual Node Count\");\n      int rel_entropy_col = m_attributes.insertColumn(\"Visual Relativised Entropy\");\n      for (int i = 0; i < m_cols; i++) {\n         for (int j = 0; j < m_rows; j++) {\n            if (m_points[i][j].m_attributes) {\n               int row = m_attributes.getRowid(PixelRef(i,j));\n               float val;\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::ENTROPY);\n               m_attributes.setValue(row, entropy_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::REL_ENTROPY);\n               m_attributes.setValue(row, rel_entropy_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::INTEGRATION_HILL);\n               m_attributes.setValue(row, integ_hh_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::INTEGRATION_TEKL);\n               m_attributes.setValue(row, integ_tk_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::MEAN_DEPTH);\n               m_attributes.setValue(row, depth_col, val);\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::GRAPH_SIZE);\n               m_attributes.setValue(row, count_col, val);\n            }\n         }\n      }\n   }\n   if (which_attributes & GraphVertexList::POINTDEPTH) {\n      int col = m_attributes.insertColumn(\"Visual Step Depth\");\n      for (int i = 0; i < m_cols; i++) {\n         for (int j = 0; j < m_rows; j++) {\n            if (m_points[i][j].m_attributes) {\n               int row = m_attributes.getRowid(PixelRef(i,j));\n               float val;\n               val = (float) m_points[i][j].getAttributes().getAttr(AttrHeader::POINT_DEPTH);\n               m_attributes.setValue(row, col, val);\n            }\n         }\n      }\n   }\n   if (which_attributes & GraphVertexList::METRIC) {\n      int mspa_col = m_attributes.insertColumn(\"Metric Mean Shortest-Path Angle\");\n      int mspl_col = m_attributes.insertColumn(\"Metric Mean Shortest-Path Distance\");\n      int dist_col = m_attributes.insertColumn(\"Metric Mean Straight-Line Distance\");\n      int count_col = m_attributes.insertColumn(\"Metric Node Count\");\n      for (int i = 0; i < m_cols; i++) {\n         for (int j = 0; j < m_rows; j++) {\n            if (m_points[i][j].m_attributes) {\n               int row = m_attributes.getRowid(PixelRef(i,j));\n               double val, total = m_points[i][j].getAttributes().getAttr(AttrHeader::METRIC_GRAPH_SIZE);\n               //\n               val = m_points[i][j].getAttributes().getAttr(AttrHeader::TOTAL_METRIC_ANGLE) / total;\n               m_attributes.setValue(row, mspa_col, float(val));\n               val = m_points[i][j].getAttributes().getAttr(AttrHeader::TOTAL_METRIC_DEPTH) / total;\n               m_attributes.setValue(row, mspl_col, float(val));\n               val = m_points[i][j].getAttributes().getAttr(AttrHeader::TOTAL_EUCLID_DIST) / total;\n               m_attributes.setValue(row, dist_col, float(val));\n               //\n               m_attributes.setValue(row, count_col, float(total));\n            }\n         }\n      }\n   }\n   for (int i = 0; i < m_cols; i++) {\n      for (int j = 0; j < m_rows; j++) {\n         if (m_points[i][j].m_attributes) {\n            delete m_points[i][j].m_attributes;\n            m_points[i][j].m_attributes = NULL;\n         }\n      }\n   }\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n// Update connections will load an old graph and add char information\n\nvoid PointMap::addGridConnections()\n{\n   for (int i = 0; i < m_attributes.getRowCount(); i++) {\n      PixelRef curs = m_attributes.getRowKey(i);\n      PixelRef node = curs.right();\n      Point& point = getPoint(curs);\n      point.m_grid_connections = 0;\n      for (int i = 0; i < 32; i += 4) {\n         Bin& bin = point.m_node->bin(i);\n         bin.first();\n         while (!bin.is_tail()) {\n            if (node == bin.cursor()) {\n               point.m_grid_connections |= (1 << (i / 4));\n               break;\n            }\n            bin.next();\n         }\n         char dir;\n         if (i == 0) {\n            dir = PixelRef::VERTICAL;\n         }\n         else if (i == 4 || i == 8) {\n            dir = PixelRef::NEGHORIZONTAL;\n         }\n         else if (i == 12 || i == 16) {\n            dir = PixelRef::NEGVERTICAL;\n         }\n         else if (i == 20 || i == 24) {\n            dir = PixelRef::HORIZONTAL;\n         }\n         node.move(dir);\n      }\n   }\n}\n\nvoid PointMap::setDisplayedAttribute(int col)\n{\n   if (m_displayed_attribute == col) {\n      return;\n   }\n   else {\n      m_displayed_attribute = col;\n   }\n   // make a local copy of the display params for access speed:\n   m_display_params = m_attributes.getDisplayParams();\n\n   m_attributes.setDisplayColumn(m_displayed_attribute,true);\n}\n\n// constrain is used to constrain to existing rows / cols\n// (not quite the same as constraining to bounding box due to spacing offsets)\nPixelRef PointMap::pixelate( const Point2f& p, bool constrain, int scalefactor ) const\n{\n   PixelRef ref;\n\n   double spacing = m_spacing / double(scalefactor);\n   ref.x = int(floor( (p.x - m_bottom_left.x + (m_spacing / 2.0)) / spacing ));\n   ref.y = int(floor( (p.y - m_bottom_left.y + (m_spacing / 2.0)) / spacing ));\n\n   if (constrain) {\n      if (ref.x < 0)\n         ref.x = 0;\n      else if (ref.x >= m_cols * scalefactor)\n         ref.x = (m_cols * scalefactor) - 1;\n      if (ref.y < 0)\n         ref.y = 0;\n      else if (ref.y >= m_rows * scalefactor)\n         ref.y = (m_rows * scalefactor) - 1;\n   }\n\n   return ref;\n}\n\n// dangerous: used only for making a false selection set\nbool PointMap::overrideSelPixel(PixelRef pix)\n{\n   m_selection = OVERRIDE_SELECTION;\n   if (!(m_points[pix.x][pix.y].m_state & Point::SELECTED)) {\n      m_points[pix.x][pix.y].m_state |= Point::SELECTED;\n      m_selection_set.insert(pix);\n   }\n   return true;\n}\nbool PointMap::clearSel()\n{\n   if (m_selection == NO_SELECTION) {\n      return false;\n   }\n   for (auto& sel: m_selection_set) {\n      getPoint(sel).m_state &= ~Point::SELECTED;\n   }\n   m_selection_set.clear();\n   m_selection = NO_SELECTION;\n   m_attributes.deselectAll();\n   return true;\n}\n\nbool PointMaps::write(std::ostream& stream, int version, bool displayedmaponly)\n{\n   if (!displayedmaponly) {\n      stream.write((char *) &m_displayed_map, sizeof(m_displayed_map));\n      int count = size();\n      stream.write((char *) &count, sizeof(count));\n      for (int i = 0; i < count; i++) {\n         at(i).write( stream, version );\n      }\n   }\n   else {\n      int dummy;\n      // displayed map is 0:\n      dummy = 0;\n      stream.write((char *) &dummy, sizeof(dummy));\n      // count is 1\n      dummy = 1;\n      stream.write((char *) &dummy, sizeof(dummy));\n      //\n      at(m_displayed_map).write(stream, version);\n   }\n   return true;\n}\nbool PointMap::write( std::ostream& stream, int version )\n{\n   dXstring440::writeString(stream, m_name);\n\n   stream.write( (char *) &m_spacing, sizeof(m_spacing) );\n\n   stream.write( (char *) &m_rows, sizeof(m_rows) );\n   stream.write( (char *) &m_cols, sizeof(m_cols) );\n\n   stream.write( (char *) &m_point_count, sizeof(m_point_count) );\n\n   stream.write( (char *) &m_bottom_left, sizeof(m_bottom_left) );\n\n   stream.write( (char *) &m_displayed_attribute, sizeof(m_displayed_attribute) );\n   m_attributes.write( stream, version );\n\n   for (int j = 0; j < m_cols; j++) {\n      for (int k = 0; k < m_rows; k++) {\n         m_points[j][k].write( stream, version );\n      }\n   }\n\n   stream.write((char *) &m_processed, sizeof(m_processed));\n   stream.write((char *) &m_boundarygraph, sizeof(m_boundarygraph));\n\n   return false;\n}\n}\n"
  },
  {
    "path": "mgraph440/pointmap.h",
    "content": "#pragma once\n\n#include \"mgraph440/spacepix.h\"\n#include \"mgraph440/point.h\"\n#include \"mgraph440/pixelref.h\"\n#include \"mgraph440/attributes.h\"\n\nnamespace mgraph440 {\n\nclass PointMap : public PixelBase\n{\npublic:\n    enum { NO_SELECTION = 0, SINGLE_SELECTION = 1, COMPOUND_SELECTION = 2, LAYER_SELECTION = 4, OVERRIDE_SELECTION = 8 };\n\n    bool m_processed;\n    bool m_boundarygraph;\n    std::string m_name;\n    SuperSpacePixel *m_spacepix;\n    Point2f m_bottom_left;\n    double m_spacing;\n    mutable int m_displayed_attribute;\n    AttributeTable m_attributes;\n    int m_point_count;\n    bool m_hasIsovistAnalysis = false;\n    int m_selection;\n    bool m_pinned_selection;\n    bool m_initialised;\n    bool m_blockedlines;\n    mutable DisplayParams m_display_params;\n    std::set<int> m_selection_set;      // n.b., m_selection_set stored as int for compatibility with other map layers\n\n    Point **m_points;    // will contain the graph reference when created\n    std::vector<PixelRefPair> m_merge_lines;\n\n    Point& getPoint(const PixelRef& p) const\n       { return m_points[p.x][p.y]; }\n    bool setSpacePixel(const SuperSpacePixel *spacepix)\n    {m_spacepix = (SuperSpacePixel *) spacepix; return true;}\n    bool read( std::ifstream& stream, int version );\n    Point2f depixelate( const PixelRef& p, double scalefactor = 1.0 ) const;   // Inlined below\n    void convertAttributes( int which_attributes );\n    void addGridConnections(); // adds grid connections where graph does not include them\n    void setDisplayedAttribute( int col );\n    PixelRef pixelate(const Point2f &p, bool constrain, int scalefactor) const;\n    AttributeTable& getAttributeTable()\n    { return m_attributes; }\n    bool overrideSelPixel(PixelRef pix);\n    double getSpacing() const\n    { return m_spacing; }\n    bool clearSel(); // clear the current selection\n    // Note: passed by ref, use with care in multi-threaded app\n    const std::set<int>& getSelSet() const\n       { return m_selection_set; }\n    bool write(std::ostream &stream, int version );\n};\n\ninline Point2f PointMap::depixelate( const PixelRef& p, double scalefactor ) const\n{\n   return Point2f( m_bottom_left.x + m_spacing * scalefactor * double(p.x),\n                   m_bottom_left.y + m_spacing * scalefactor * double(p.y) );\n}\n\nclass PointMaps : public prefvec<PointMap>\n{\npublic:\n   int m_displayed_map;\n   SuperSpacePixel *m_spacepix;\n   pmap<int,int> m_data_objects; // deprecated: (first int is data layer -- presumably the KEY not the index, second int is object ref)\n\n   void setDisplayedPointMapRef(int i)\n   { m_displayed_map = i; }\n   PointMap& getDisplayedPointMap()\n   { return at(m_displayed_map); }\n   bool overrideSelPixel(PixelRef pix);    // set a pixel to selected: careful!\n   void setSpacePixel(SuperSpacePixel *spacepix)\n   { m_spacepix = spacepix; for (size_t i = 0; i < size(); i++) at(i).setSpacePixel(spacepix); }\n   int getDataObject( int layer ) {\n      size_t var = m_data_objects.searchindex( layer );\n      if (var != paftl::npos)\n         return m_data_objects.at(var);\n      return -1;  // note: not paftl::npos\n   }\n   bool read(std::ifstream& stream, int version)\n   {\n      stream.read((char *) &m_displayed_map, sizeof(m_displayed_map));\n      int count;\n      stream.read((char *) &count, sizeof(count));\n      for (int i = 0; i < count; i++) {\n         push_back(PointMap());\n         tail().setSpacePixel( (SuperSpacePixel *) this );\n         tail().read( stream, version );\n      }\n      return true;\n   }\n   bool write(std::ostream &stream, int version, bool displayedmaponly = false );\n};\n\n}\n"
  },
  {
    "path": "mgraph440/salaprogram.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// salaprogram.cpp - a component of the depthmapX - spatial network analysis platform\n// SalaScripting language\n\n\n/////////////////////////////////////////////////////////////////////////\n\n// SalaScripting language\n\n// A \"Pythonesque\" language, which is pre-interpretted, and thus generally\n// should run fairly fast\n\n// The class implementation is very much hardcoded for built-in classes,\n// so user defined classes will be difficult to implement\n// (but would you really want classes in an inbuilt scripting language?! -- I guess some people would)\n\n// User defined functions are not included yet, but should be fairly easy using a global function stack\n// alongside the global variable stack\n\n#include <mgraph440/salaprogram.h>\n#include <mgraph440/mgraph.h>\n#include <mgraph440/ngraph.h>\n#include \"mgraph440/pafmath.h\"\n\n#include <math.h>\n#include <float.h>\n#include <time.h>\n#include <cmath>\n\nnamespace mgraph440 {\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\n// Assign and list access rather incongruently in math ops, but never mind:\n\nbool g_sala_loaded = false;\n\nprefvec<SalaFuncLabel> g_sala_math_ops;\nprefvec<SalaFuncLabel> g_sala_comp_ops;\nprefvec<SalaFuncLabel> g_sala_logical_ops;\nprefvec<SalaFuncLabel> g_sala_global_funcs;\nprefvec<SalaMemberFuncLabel> g_sala_member_funcs;\n\nvoid loadSalaProgram()\n{\n    // math ops\n    g_sala_math_ops.push_back( SalaFuncLabel( SalaObj::S_ADD, \"+\", \"add\" ) );\n    g_sala_math_ops.push_back( SalaFuncLabel( SalaObj::S_SUBTRACT, \"-\", \"subtract\" ) );\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_MINUS, \"-\", \"negative\" ));\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_PLUS, \"+\", \"positive\" ));\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_MULTIPLY, \"*\", \"multiply\" ));\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_DIVIDE, \"/\", \"divide\" ));\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_MODULO, \"%\", \"modulo\" ));\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_POWER, \"^\", \"power\" ));\n    g_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_ASSIGN, \"=\", \"assignment\" ));\n    g_sala_math_ops.push_back(SalaFuncLabel( SalaObj::S_LIST_ACCESS, \"[]\", \"list access\" )); // list access included even though not parsed directly like this\n\n    // comp ops\n   g_sala_comp_ops.push_back( SalaFuncLabel( SalaObj::S_GT, \">\", \"greater than\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_LT, \"<\", \"less than\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_GEQ, \">=\", \"greater than or equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_LEQ, \"<=\", \"less than or equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_NEQ, \"!=\", \"not equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_EQ, \"==\", \"equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_IS, \"is\", \"is the same object as\" ));\n\n   // logical ops\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_NOT, \"not\", \"logical not\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_NOT, \"!\", \"logical not\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_AND, \"and\", \"logical and\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_AND, \"&&\", \"logical and\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_OR, \"or\", \"logical or\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_OR, \"||\", \"logical or\" ));\n\n   // global functions\n    g_sala_global_funcs.push_back(   SalaFuncLabel( SalaObj::S_SQRT, \"sqrt\", \"square root\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_LOG, \"log\", \"log base 10\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_LN, \"ln\", \"natural logarithm\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_RAND, \"random\", \"random number (0.0 to 1.0)\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_SIN, \"sin\", \"sine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_COS, \"cos\", \"cosine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_TAN, \"tan\", \"tangent\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_ASIN, \"asin\", \"inverse sine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_ACOS, \"acos\", \"inverse cosine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_ATAN, \"atan\", \"inverse tangent\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_LEN, \"len\", \"array or string length\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_RANGE, \"range\", \"set of integers\" ));\n\n   // member functions\n    g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FAPPEND, \"append\", \"append item\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FEXTEND, \"extend\", \"extend by list\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FPOP, \"pop\", \"pop (last) item\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FCLEAR, \"clear\", \"clear contents\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FVALUE, \"value\", \"get attribute value\" ));\n    g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FSETVALUE, \"setvalue\", \"set attribute value\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FMARK, \"mark\", \"get node mark\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FSETMARK, \"setmark\", \"set node mark\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FCONNECTIONS, \"connections\", \"get list of connections\" ));\n\n    g_sala_loaded = true;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\nSalaProgram::SalaProgram(SalaObj context)\n{\n    if (!g_sala_loaded) {\n       loadSalaProgram();\n    }\n\n   // col is used when run in update mode, it does not form part of the program:\n   m_col = -1;\n   m_thisobj = context;\n}\n\nSalaProgram::~SalaProgram()\n{\n}\n\n// use istrstream to make an istream from a string:\n// istrstream file(char *);\n\nbool SalaProgram::parse(std::istream& program)\n{\n   m_var_stack.clear();\n   m_error_stack.clear();\n\n   // this ensures wipe of any pre-existing variables in the global context:\n   m_root_command = SalaCommand(this,NULL,-1,SalaCommand::SC_ROOT);\n\n   int line = 0;\n\n   SalaCommand *parent = &m_root_command;\n\n   while (!program.eof()) {\n\n      // the problem with a language being \"Pythonesque\" is that the \"end\" of\n      // any control is implicit through the amount of indentation\n      // Thus, the parser eats the white space, only handing of control\n      // to a function when it is ready to parse, and knows its parent\n      int indent = 0;\n      bool endloop = false;\n      while (!endloop) {\n         char ch = program.peek();\n         switch (ch) {\n            case ' ':\n               indent++; break;\n            case 13:\n               break; // ignore\n            case '\\n':\n               line++; indent = 0; break;\n            case '#':\n               // hit comment, read to end of line:\n               while (ch != EOF && ch != '\\n')\n                  { program.get(); ch = program.peek(); }\n               line++;\n               break;\n            case '\\\\':\n               // hit line continuation, ignore everything after it:\n               while (ch != EOF && ch != '\\n')\n                  { program.get(); ch = program.peek(); }\n               line++;\n               break;\n            case EOF:\n               program.get(); // actually shift onto the eof character\n               endloop = true;\n               break;\n            default:\n               endloop = true;\n               break;\n            }\n            if (!endloop) {\n               program.get();\n            }\n      }\n\n      // okay, we now know indent level, and we are ready to parse:\n      if (!program.eof()) {\n         while (indent <= parent->m_indent) {\n            parent = parent->m_parent;\n         }\n\n         parent->m_children.push_back(SalaCommand(this,parent,indent));\n\n         SalaCommand &thiscommand = parent->m_children.tail();\n\n         try {\n            line = thiscommand.parse(program,line);\n         }\n         catch (SalaError e) {\n            if (e.lineno == -1)\n               e.lineno = line;\n            m_error_stack.push_back(e);\n            return false;\n         }\n\n         // sort out commands capable of having children:\n         if (thiscommand.m_command == SalaCommand::SC_FOR || thiscommand.m_command == SalaCommand::SC_IF || thiscommand.m_command == SalaCommand::SC_WHILE) {\n            parent = &thiscommand;\n         }\n         else if (thiscommand.m_command == SalaCommand::SC_ELSE) {\n            if (parent->m_children.size() < 2) {\n               m_error_stack.push_back(SalaError(\"'Else' must be preceded by an 'if','for' or 'while'\", thiscommand.m_line));\n               return false;\n            }\n            int command = parent->m_children[parent->m_children.size()-2].m_command;\n            if (command != SalaCommand::SC_IF && command != SalaCommand::SC_ELIF && command != SalaCommand::SC_FOR && command != SalaCommand::SC_WHILE) {\n               m_error_stack.push_back(SalaError(\"'Else' must be preceded by an 'if','for' or 'while'\", thiscommand.m_line));\n               return false;\n            }\n            parent = &thiscommand;\n         }\n         else if (thiscommand.m_command == SalaCommand::SC_ELIF) {\n            if (parent->m_children.size() < 2) {\n               m_error_stack.push_back(SalaError(\"'Elif' must be preceded by an 'if' condition\", thiscommand.m_line));\n               return false;\n            }\n            int command = parent->m_children[parent->m_children.size()-2].m_command;\n            if (command != SalaCommand::SC_IF && command != SalaCommand::SC_ELIF) {\n               m_error_stack.push_back(SalaError(\"'Elif' must be preceded by an 'if' condition\", thiscommand.m_line));\n               return false;\n            }\n            parent = &thiscommand;\n         }\n      }\n   }\n\n   // do a quick check that all 'for', 'if' and 'elif' have children:\n   // TO DO!\n\n   return true;\n}\n\nSalaObj SalaProgram::evaluate()\n{\n   for (size_t i = 0; i < m_var_stack.size(); i++) {\n      // uninitialise all variables:\n      m_var_stack[i].uninit();\n   }\n   m_marked = false;\n\n   // run the program\n   SalaObj obj;\n   bool ret = false, ifhandled = false;\n   m_root_command.evaluate(obj,ret,ifhandled);\n\n   // clear marks if they've been used:\n   if (m_marked) {\n      AttributeTable *table = m_thisobj.getTable();\n      for (int i = 0; i < table->getRowCount(); i++) {\n     // Quick mod - TV\n#if defined(_MSC_VER)\n         table->setMark(i,SalaObj());\n#else\n     SalaObj objTmp = SalaObj();\n         table->setMark(i,objTmp);\n#endif\n      }\n      m_marked = false;\n   }\n\n   return obj;\n}\n\n// this function is called by depthmapX to run a script to update a column\n// the operation is on a single node / row of the database combination\n\nbool SalaProgram::runupdate(int col, const std::set<int> &selset)\n{\n   AttributeTable *table = m_thisobj.getTable();\n   bool pointmap = (m_thisobj.type & SalaObj::S_POINTMAP) ? true : false;\n   //\n   // note: reference, will change object directly, which is important for commands running the program\n   int& row = m_thisobj.data.graph.node;\n   m_col = col;\n   if (selset.size()) {\n      for (auto& sel: selset) {\n         row = sel;  // *** NB! selsets for vga store pixelrefs keys, *all* others use rowids directly ***\n         try {\n            SalaObj val = evaluate();\n            float v = (float) val.toDouble();   // note, toDouble will type check and throw if there's a problem\n            if (!std::isfinite(v)) {\n               v = -1.0f;\n            }\n            table->changeValue(pointmap ? table->getRowid(row) : row,m_col,v);\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   else {\n      for (int i = 0; i < table->getRowCount(); i++) {\n         row = pointmap ? table->getRowKey(i) : i; // *** NB! selsets for vga store pixelrefs keys, *all* others use rowids directly ***\n         try {\n            SalaObj val = evaluate();\n            float v = (float) val.toDouble();   // note, toDouble will type check and throw if there's a problem\n            if (!std::isfinite(v)) {\n               v = -1.0f;\n            }\n            table->changeValue(i,m_col,v);\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   return true;\n}\n\n// this function is called by depthmapX to run a script to select values\n// the operation is on a single node / row of the database combination\n\nbool SalaProgram::runselect(std::vector<int> &selsetout, const std::set<int>& selsetin)\n{\n   AttributeTable *table = m_thisobj.getTable();\n   bool pointmap = (m_thisobj.type & SalaObj::S_POINTMAP) ? true : false;\n   //\n   int& row = m_thisobj.data.graph.node;\n   if (selsetin.size()) {\n      for (auto& sel: selsetin) {\n         row = sel;  // *** NB! selsets for vga store pixelrefs keys, *all* others use rowids directly ***\n         try {\n            SalaObj val = evaluate();\n            bool v = val.toBool();   // note, toBool will type check and throw if there's a problem\n            if (v) {\n               selsetout.push_back(sel);\n            }\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   else {\n      for (int i = 0; i < table->getRowCount(); i++) {\n         row = pointmap ? table->getRowKey(i) : i; // *** NB! selsets for vga store pixelrefs keys, *all* others use rowids directly ***\n         try {\n            SalaObj val = evaluate();\n            bool v = val.toBool();   // note, toBool will type check and throw if there's a problem\n            if (v) {\n               selsetout.push_back(row);\n            }\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   return true;\n}\n\nstd::string SalaProgram::getLastErrorMessage() const\n{\n   const SalaError& error = m_error_stack.tail();\n   if (error.lineno == -1) {\n      return error.message;\n   }\n   else {\n      return error.message + \" on line \" + dXstring440::formatString(error.lineno+1,\"%d\");\n   }\n}\n\n////////////////////////////////////////////////////////////////////////////\n\nSalaCommand::SalaCommand(SalaProgram *program, SalaCommand *parent, int indent, Command command)\n{\n   m_program = program;\n   m_parent = parent;\n   m_indent = indent;\n   m_command = command;\n   m_line = 0;\n}\n\nint SalaCommand::parse(std::istream& program, int line)\n{\n   m_func_stack.clear();\n   m_eval_stack.clear();\n   m_var_names.clear();\n\n   m_command = SC_NONE;\n\n   // useful to know which line the command starts on for debugging purposes\n   m_line = line;\n\n   int last = SP_FUNCTION;\n   bool endloop = false;\n   bool overridecache = false;\n   bool firstword = true;\n   SalaBuffer buffer;\n   char cache = ' ';\n   //\n   while (!endloop && !program.eof()) {\n      char alpha = program.get();\n      switch (alpha) {\n      // string constant\n      case '\\\"': case '\\'': // variants: either delimit with single or double quotes\n         if (!buffer.empty()) {\n            decode(buffer);\n            buffer.clear();\n         }\n         {\n            char delim = alpha;\n            char beta = program.peek();\n            while (beta != EOF && beta != '\\n' && (beta != delim || alpha == '\\\\')) {\n               alpha = program.get();\n               beta = program.peek();\n               buffer.add(alpha);\n            }\n            if (beta == EOF || beta == '\\n') {\n               throw SalaError(\"No closing quote\",m_line);\n            }\n            else {\n               program.get(); // take off closing quote and discard\n            }\n            // add even if the string constant is empty:\n            m_eval_stack.push_back( std::string(buffer) );\n            buffer.clear();\n            last = SP_DATA;\n         }\n         break;\n      // operator stack\n      case '+': case '-':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            if (last & SP_NUMBER && cache == 'e') {\n               // check for 9.999e+99...\n               // decode will handle later:\n               buffer.add(alpha);\n               break;\n            }\n            // otherwise handled, clear the buffer:\n            buffer.clear();\n         }\n         if (last == SP_FUNCTION || last == SP_COMMAND) {\n            pushFunc( alpha == '+' ? SalaObj(SalaObj::S_PLUS) : SalaObj(SalaObj::S_MINUS) );\n         }\n         else {\n            pushFunc( alpha == '+' ? SalaObj(SalaObj::S_ADD) : SalaObj(SalaObj::S_SUBTRACT) );\n         }\n         last = SP_FUNCTION;\n         break;\n      case '=':\n         if (!buffer.empty()) {\n            // n.b., this will catch '>=', '<=', '==' and '!='\n            if (strchr(\"><=!\",cache) != NULL) {\n               buffer.add(alpha);\n               last = decode(buffer);\n               buffer.clear();\n               overridecache = true;\n               // handled next step (see default clause below)\n               break;\n            }\n            else {\n               last = decode(buffer);\n               buffer.clear();\n            }\n         }\n         buffer.add(alpha); // <- '=' decoded later\n         break;\n      case '!': case '<': case '>':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         // note: this looks a little odd, simply adding to the buffer, but these\n         // are handled by the default function next step if still hanging on the buffer\n         buffer.add(alpha);\n         break;\n      case '/': case '*':  case '%':  case '^':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         last = decode(std::string(1,alpha));\n         break;\n      case '(':\n         // note: the opening bracket forms a function\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         if (last == SP_DATA) {\n            // whatever that just went onto the eval stack, the user thought it was a function...\n            // alert them:\n            throw SalaError(m_last_string + \" is not a known function name\", m_line);\n            // (in the future, we may well want to transfer an object hashed function name to the func stack instead)\n         }\n         else if (last == SP_NUMBER) {\n            throw SalaError(\"Cannot treat a number as if it were a function\", m_line);\n         }\n         // check for pair of open / close brackets: () or (  ) -- this is a null value\n         {\n            char beta = program.peek();\n            while (beta != EOF && beta == ' ') {\n               alpha = program.get();\n               beta = program.peek();\n            }\n            if (beta == ')') {\n               alpha = program.get();\n               m_eval_stack.push_back(SalaObj());\n               last = SP_DATA;\n            }\n            else {\n               pushFunc( SalaObj::S_OPEN_BRACKET );\n               last = SP_FUNCTION;\n            }\n         }\n         break;\n      case ')':\n         // note: the closing bracket forms a data packet:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         pushFunc( SalaObj::S_CLOSE_BRACKET );\n         last = SP_DATA;\n         break;\n      case '[':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         // check for pair of open / close brackets: [] or [  ] -- this is a null value or empty list depending on context\n         {\n            char beta = program.peek();\n            while (beta != EOF && beta == ' ') {\n               alpha = program.get();\n               beta = program.peek();\n            }\n            if (beta == ']') {\n               alpha = program.get();\n               if (last == SP_DATA) {\n                  throw SalaError(\"Accessor operator ('[]') requires a parameter\", m_line);\n               }\n               else {\n                  // put an empty list on the stack\n                  m_eval_stack.push_back( SalaObj(SalaObj::S_CONST_LIST, 0) );\n               }\n               last = SP_DATA;\n            }\n            else {\n               if (last == SP_DATA) {\n                  // list accessor function\n                  pushFunc( SalaObj::S_LIST_ACCESS );\n                  pushFunc( SalaObj::S_OPEN_SQR_BRACKET_ACCESS );\n               }\n               else {\n                  // making an list...\n                  pushFunc( SalaObj::S_OPEN_SQR_BRACKET_LIST );\n               }\n               last = SP_FUNCTION;\n            }\n         }\n         break;\n      case ']':\n         // note: the closing bracket forms a data packet:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         pushFunc( SalaObj::S_CLOSE_SQR_BRACKET );\n         last = SP_DATA;\n         break;\n      case ',':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         pushFunc( SalaObj::S_COMMA );\n         last = SP_FUNCTION;\n         break;\n      case ':':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         // end of command (def, if, else, elif and for)\n         if (m_command == SC_FOR || m_command == SC_WHILE || m_command == SC_IF || m_command == SC_ELIF || m_command == SC_ELSE) {\n            bool commentfound = false;\n            alpha = program.get();\n            while (!program.eof() && alpha != '\\n') {\n               // continue to end of line, only comments allowed though!\n               if (!commentfound) {\n                  if (alpha == '#') {\n                     commentfound = true;\n                  }\n                  else if (alpha != ' ' && alpha != 13) { // 13 ignored, as it appears \\n is 10 in this stream... (so 13,10 can be found)\n                     throw SalaError(\"'For', 'if', 'else', etc cannot have execution part on same line; insert a new line after ':'\", m_line);\n                  }\n               }\n               alpha = program.get();\n            }\n            line++;\n            endloop = true;\n         }\n         else {\n            throw SalaError(\"Unexpected colon ':' in expression\",m_line);\n         }\n         break;\n      // end of line:\n      case '\\\\':\n         // hit line continuation, read to end of line:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         while (!program.eof() && program.get() != '\\n');\n         // note, end loop is not set, this is a continuation character\n         line++; // line is incremented, although it this command will still start on the original line\n         break;\n      case '#':\n         // loop through until hit \\n or end\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         while (!program.eof() && program.get() != '\\n');\n         line++;  // should have hit a line end (or if it's end of file, it doesn't matter)\n         endloop = true;\n         break;\n      case '\\n':\n         // force end of command parse:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         line++;  // hit a line end\n         endloop = true;\n         break;\n      case ' ':\n         // white space: read word\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         break;\n      case '.':\n         // currently handled inelegantly through decode for either number (1.002) or member access (blah.x())\n         buffer.add('.');\n         break;\n      case '\\t':\n         throw SalaError(\"Tab character found: please use only spaces to indent lines\",m_line);\n         break;\n      default:\n         if (strchr(\"<>=!\",cache)) {\n            // >, <, = and ! are held as next step operators\n            last = decode(buffer);\n            buffer.clear();\n         }\n         if (alpha != EOF && alpha != 13) {  // 13 ignored, as it appears \\n is 10 in this stream...\n            if (!isalphanum_(alpha) && alpha != '&' && alpha != '|') { // include & and | for and and or\n               throw SalaError(\"Unrecognised symbol ('\" + std::string(1,alpha) + \"')\",m_line);\n            }\n            buffer.add(alpha);\n         }\n         break;\n      }\n      if (overridecache) {\n         cache = ' ';\n         overridecache = false;\n      }\n      else {\n         cache = alpha;\n      }\n      if (last == SP_COMMAND) {\n         if (m_command == SC_FOR) {\n            // check the name of the for variable:\n            alpha = program.get();\n            while (alpha == ' ') {\n               alpha = program.get();\n            }\n            if (!isalpha_(alpha)) {\n               throw SalaError(\"'For' command expecting variable name\",m_line);\n            }\n            while (isalphanum_(alpha)) {\n               buffer.add(alpha);\n               alpha = program.get();\n            }\n            if (alpha != ' ') {\n               throw SalaError(\"Command expecting syntax 'for xyz in'...\",m_line);\n            }\n            // add the for iterator variable:\n            m_program->m_var_stack.push_back(SalaObj());\n            int x = m_program->m_var_stack.size() - 1;\n            m_var_names.add(buffer,x);\n            m_for_iter = SalaObj( SalaObj::S_VAR, x);\n            // now check for 'in'\n            while (alpha == ' ') {\n               alpha = program.get();\n            }\n            if (alpha != 'i' || program.get() != 'n') {\n               throw SalaError(\"Command expecting syntax 'for xyz in'...\",m_line);\n            }\n         }\n         last = SP_FUNCTION;\n      }\n   }\n   if (!buffer.empty()) {\n      decode(buffer);\n      buffer.clear();\n      last = SP_DATA;\n   }\n   // push remaining functions onto eval stack:\n   while (m_func_stack.size()) {\n      if (m_func_stack.tail().type & SalaObj::S_BRACKET) {\n         throw SalaError(\"Unmatched brackets\",m_line);\n      }\n      m_eval_stack.push_back(m_func_stack.tail());\n      m_func_stack.pop_back();\n   }\n\n   if (m_eval_stack.size() == 0 && m_command != SC_ELSE) { // note, else is by definition empty\n      throw SalaError(\"Partial or missing command\",m_line);\n   }\n   return line;\n}\n\nint SalaCommand::decode(std::string string)   // string copied as makelower applied\n{\n   // ideally, some form of hashing the string should be performed so that\n   // functions can be found quicker than a long list of \"else ifs\"\n   int retvar = SP_NONE;\n   dXstring440::toLower(string);\n\n   if (m_command == SC_NONE) {\n      if (string == \"return\") {\n         m_command = SC_RETURN;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"for\") {\n         m_command = SC_FOR;  // n.b. will still need a variable name and \"in\": for x in ...\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"while\") {\n         m_command = SC_WHILE;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"if\") {\n         m_command = SC_IF;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"elif\") {\n         m_command = SC_ELIF;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"else\") {\n         m_command = SC_ELSE;\n         retvar = SP_COMMAND;\n      }\n   }\n   if (retvar == SP_COMMAND) {\n      //\n      m_last_string = string; // make a copy for debugging purposes\n      return retvar;\n   }\n\n   // numeric constant\n   if (isdigit(string[0]) || (string.length() > 1 && string[0] == '.' && isdigit(string[1]))) {\n      if (string[string.length()-1] == 'e') {\n         // handle later... at the moment we have hit + or - in 9.999e+99 or 9.999e-99\n         m_last_string = string; // make a copy for debugging purposes\n         return SP_NUMBER;\n      }\n      if (string.find_first_of('.') != std::string::npos || string.find_first_of('e') != std::string::npos) {\n         m_eval_stack.push_back( atof(string.c_str()) );\n      }\n      else {\n         m_eval_stack.push_back( atoi(string.c_str()) );\n      }\n      retvar = SP_NUMBER;\n   }\n   // this is a different 'e' to the 'e' above -> natural logarithm\n   else if (string == \"e\") {\n      m_eval_stack.push_back( 2.7182818284590452353602874713527 );\n      retvar = SP_NUMBER;\n   }\n   else if (string == \"pi\") {\n      m_eval_stack.push_back( 3.1415926535897932384626433832795 );\n      retvar = SP_NUMBER;\n   }\n   // boolean constants\n   else if (string == \"true\") {\n      m_eval_stack.push_back( bool(true) );\n      retvar = SP_NUMBER;\n   }\n   else if (string == \"false\") {\n      m_eval_stack.push_back( bool(false) );\n      retvar = SP_NUMBER;\n   }\n   // this\n   else if (string == \"this\") {\n      m_eval_stack.push_back( SalaObj(SalaObj::S_THIS) );\n      retvar = SP_DATA;\n   }\n   else if (string == \"none\") {\n      m_eval_stack.push_back(SalaObj());\n      retvar = SP_DATA;\n   }\n   else {\n      // everything else should be in one of the operator / func lists:\n      size_t i;\n      if (retvar == SP_NONE) {\n         // note, math ops include assignment\n         for (i = 0 ; i < g_sala_math_ops.size(); i++) {\n            if (string == g_sala_math_ops[i].name) {\n               pushFunc( g_sala_math_ops[i].func );\n               retvar = SP_FUNCTION;\n               break;\n            }\n         }\n      }\n      if (retvar == SP_NONE) {\n         for (i = 0 ; i < g_sala_comp_ops.size(); i++) {\n            if (string == g_sala_comp_ops[i].name) {\n               pushFunc( g_sala_comp_ops[i].func );\n               retvar = SP_FUNCTION;\n               break;\n            }\n         }\n      }\n      if (retvar == SP_NONE) {\n         for (i = 0 ; i < g_sala_logical_ops.size(); i++) {\n            if (string == g_sala_logical_ops[i].name) {\n               pushFunc( g_sala_logical_ops[i].func );\n               retvar = SP_FUNCTION;\n               break;\n            }\n         }\n      }\n      if (retvar == SP_NONE) {\n         for (i = 0 ; i < g_sala_global_funcs.size(); i++) {\n            if (string == g_sala_global_funcs[i].name) {\n               pushFunc( g_sala_global_funcs[i].func );\n               retvar = SP_FUNCTION;\n            }\n         }\n      }\n   }\n\n   if (retvar == SP_NONE) {\n      size_t n = string.find_first_of(\".\");\n      if (n != std::string::npos) {\n         if (n > 0) {\n            decode(string.substr(0,n));\n         }\n         if (decode_member(string.substr(n+1),false) == SP_NONE) {\n            throw SalaError(\"There is no known member function called \" + string.substr(n+1),m_line);\n         }\n         retvar = SP_FUNCTION;\n      }\n      else {\n         // see if it's a member function of 'this':\n         retvar = decode_member(string,true);\n\n         if (retvar == SP_NONE) {\n            // see if it exists in the variable stack (walk up scope)\n            SalaCommand *parent = m_parent;\n            size_t n = paftl::npos;\n            int x = -1;\n            while (parent != NULL && n == -1) {\n               n = parent->m_var_names.searchindex(string);\n               if (n != paftl::npos) {\n                  x = parent->m_var_names.value(n);\n               }\n               parent = parent->m_parent;\n            }\n            if (x != -1) {\n               m_eval_stack.push_back( SalaObj( SalaObj::S_VAR, x) );\n               retvar = SP_DATA;\n            }\n            else {\n               m_program->m_var_stack.push_back(SalaObj());\n               x = m_program->m_var_stack.size() - 1;\n               // note: attach simply to your m_parent, not parent variable, which has walked up the stack\n               m_parent->m_var_names.add(string,x);\n               m_eval_stack.push_back( SalaObj( SalaObj::S_VAR, x) );\n               retvar = SP_DATA;\n            }\n         }\n      }\n   }\n\n   if (retvar == SP_NONE) {\n      // should never reach this point\n      throw SalaError(\"There is no known function or variable called \" + string,m_line);\n   }\n\n\n   if (m_command == SC_NONE) {\n      m_command = SC_EXPR;\n   }\n\n   m_last_string = string; // make a copy for debugging purposes\n\n   return retvar;\n}\n\n// note, thisobj not usually known (type S_NALL),\n// but, depending where SalaScript is called from, it may be:\n//    a graph node / table row (for \"select by query\" and \"edit connections\")\n//    a map (not yet implemented, but intended for scripting agents)\n\nint SalaCommand::decode_member(const std::string& string, bool apply_to_this)\n{\n   int retvar = SP_NONE;\n\n   // note, all hardcoded for built in classes:\n   // string classes:\n   for (size_t i = 0; i < g_sala_member_funcs.size(); i++) {\n      // note '&' in the type -- essentially allows for inheritance between objects (tuple is type of list, etc)\n      if (!apply_to_this || (m_program->m_thisobj.type & g_sala_member_funcs[i].type) != 0) {\n         if (string == g_sala_member_funcs[i].name) {\n            pushFunc( g_sala_member_funcs[i].func );\n            retvar = SP_FUNCTION;\n            break;\n         }\n      }\n   }\n   if (retvar == SP_FUNCTION && apply_to_this) {\n      m_eval_stack.push_back(SalaObj(SalaObj::S_THIS));\n   }\n   return retvar;\n}\n\nvoid SalaCommand::pushFunc(const SalaObj& func)\n{\n   // note comma is part of the \"Bracket\" class of things:\n   if (func.type & SalaObj::S_BRACKET) {\n      if (func.type == SalaObj::S_CLOSE_BRACKET) {\n         while (m_func_stack.size() && m_func_stack.tail().type != SalaObj::S_OPEN_BRACKET) {\n            m_eval_stack.push_back(m_func_stack.tail());\n            m_func_stack.pop_back();\n         }\n         if (m_func_stack.size()) {\n            // don't necessarily pop it... if it's a group marker, we want to hang onto it:\n            if (m_func_stack.tail().data.count > 1) {\n               m_func_stack.tail().type = SalaObj::S_CONST_TUPLE;\n               m_eval_stack.push_back(m_func_stack.tail());\n            }\n            m_func_stack.pop_back(); // remove opening bracket\n         }\n      }\n      else if (func.type == SalaObj::S_CLOSE_SQR_BRACKET) {\n         while (m_func_stack.size() && (m_func_stack.tail().type & SalaObj::S_OPEN_SQR_BRACKET) == 0) {\n            m_eval_stack.push_back(m_func_stack.tail());\n            m_func_stack.pop_back();\n         }\n         if (m_func_stack.size()) {\n            // don't pop it, always make a list from a make list command, even if it's only one item long:\n            if (m_func_stack.tail().type == SalaObj::S_OPEN_SQR_BRACKET_LIST || m_func_stack.tail().data.count > 1) {\n               m_func_stack.tail().type = SalaObj::S_CONST_LIST;\n               m_eval_stack.push_back(m_func_stack.tail());\n            }\n            m_func_stack.pop_back();\n         }\n      }\n      else if (func.type == SalaObj::S_COMMA) {\n         // go and increment your associated group / list\n         while (m_func_stack.size() && m_func_stack.tail().type != SalaObj::S_OPEN_BRACKET && (m_func_stack.tail().type & SalaObj::S_OPEN_SQR_BRACKET) == 0) {\n            m_eval_stack.push_back(m_func_stack.tail());\n            m_func_stack.pop_back();\n         }\n         if (m_func_stack.size()) {\n            m_func_stack.tail().data.count++;\n         }\n      }\n      else {\n         m_func_stack.push_back( func );\n      }\n   }\n   else if (!m_func_stack.size() || func.precedence() > m_func_stack.tail().precedence()) {    // original: >\n      m_func_stack.push_back(func);\n   }\n   else {\n      while (m_func_stack.size() && func.precedence() <= m_func_stack.tail().precedence()) {     // original <=\n         m_eval_stack.push_back(m_func_stack.tail());\n         m_func_stack.pop_back();\n      }\n      m_func_stack.push_back(func);\n   }\n}\n\nvoid SalaCommand::evaluate(SalaObj& obj, bool& ret, bool& ifhandled)\n{\n   int begin = m_eval_stack.size()-1;\n   SalaObj *p_obj = NULL;\n   switch (m_command) {\n   case SC_EXPR:\n      obj = evaluate(begin,p_obj);\n      break;\n   case SC_RETURN:\n      ret = true;\n      obj = evaluate(begin,p_obj);\n      break;\n   case SC_ROOT:\n      {\n         for (size_t i = 0; i < m_children.size(); i++) {\n            m_children[i].evaluate(obj,ret,ifhandled);\n            if (ret)\n               break;\n         }\n      }\n      break;\n   case SC_IF:\n      {\n         SalaObj test = evaluate(begin,p_obj);\n         if (test.toBool() == true) {\n            for (size_t i = 0; i < m_children.size(); i++) {\n               m_children[i].evaluate(obj,ret,ifhandled);\n               if (ret)\n                  break;\n            }\n            ifhandled = true;\n         }\n         else {\n            ifhandled = false;\n         }\n      }\n      break;\n   case SC_ELIF:\n      if (!ifhandled) {\n         SalaObj test = evaluate(begin,p_obj);\n         if (test.toBool() == true) {\n            for (size_t i = 0; i < m_children.size(); i++) {\n               m_children[i].evaluate(obj,ret,ifhandled);\n               if (ret)\n                  break;\n            }\n            ifhandled = true;\n         }\n      }\n      break;\n   case SC_ELSE:\n      if (!ifhandled) {\n         for (size_t i = 0; i < m_children.size(); i++) {\n            m_children[i].evaluate(obj,ret,ifhandled);\n            if (ret)\n               break;\n         }\n      }\n      break;\n   case SC_FOR:\n      {\n         // eventually I'd like to do this with generators / iterators rather than constructing a list each time\n         SalaObj list = evaluate(begin,p_obj);\n         if (list.type == SalaObj::S_LIST) {\n            int len = list.data.list.list->size();\n            if (len != 0) {\n               for (int i = 0; i < len; i++) {\n                  // reset all my stack (actually, all parent functions should do this!)\n                  for (size_t j = 0; j < m_var_names.size(); j++) {\n                     m_program->m_var_stack[m_var_names.value(j)].uninit();\n                  }\n                  m_program->m_var_stack[m_for_iter.data.var] = list.data.list.list->at(i);\n                  for (size_t k = 0; k < m_children.size(); k++) {\n                     m_children[k].evaluate(obj,ret,ifhandled);\n                     if (ret)\n                        break;\n                  }\n                  if (ret)\n                     break;\n               }\n               ifhandled = true;\n            }\n            else {\n               ifhandled = false;\n            }\n         }\n         else {\n            ifhandled = false;\n         }\n      }\n      break;\n   case SC_WHILE:\n      {\n         int counter = 0;\n         while (evaluate(begin,p_obj).toBool()) {\n            for (size_t k = 0; k < m_children.size(); k++) {\n               m_children[k].evaluate(obj,ret,ifhandled);\n               if (ret)\n                  break;\n            }\n            if (ret)\n               break;\n            if (++counter == 0x04000000) { // <- an arbitrary big number\n               throw SalaError(\"Infinite loop\",m_line);\n            }\n            begin = m_eval_stack.size()-1;\n         }\n         if (counter) {\n            ifhandled = true;\n         }\n         else {\n            ifhandled = false;\n         }\n      }\n      break;\n   default:\n      throw SalaError(\"Unknown command\",m_line);\n      break;\n   }\n}\n\nSalaObj SalaCommand::evaluate(int& pointer, SalaObj* &p_obj)\n{\n   if (pointer < 0) {\n      throw SalaError(\"Missing argument\",m_line);\n   }\n   SalaObj data = m_eval_stack[pointer];\n   pointer--;\n   if (data.type == SalaObj::S_FUNCTION) {\n      SalaObj::Func func = data.data.func;\n      int group = (func & SalaObj::S_GROUP);\n      if (group == SalaObj::S_MATH_OPS) {\n         try {\n            switch (func) {\n            case SalaObj::S_ADD:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) + evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                SalaObj tmp2 = evaluate(pointer,p_obj);\n                    data = tmp1 + tmp2;\n               }\n#endif\n               break;\n            case SalaObj::S_SUBTRACT:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) - evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                SalaObj tmp2 = evaluate(pointer,p_obj);\n                    data = tmp1 - tmp2;\n               }\n#endif\n               break;\n            case SalaObj::S_PLUS:\n               data = evaluate(pointer,p_obj);  // just ignore it\n               break;\n            case SalaObj::S_MINUS:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = -evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                    data = -tmp1;\n               }\n#endif\n               break;\n            case SalaObj::S_MULTIPLY:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) * evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                SalaObj tmp2 = evaluate(pointer,p_obj);\n                    data = tmp1 * tmp2;\n               }\n#endif\n               break;\n            case SalaObj::S_DIVIDE:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) / evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                SalaObj tmp2 = evaluate(pointer,p_obj);\n                    data = tmp2 / tmp1;\n               }\n#endif\n               break;\n            case SalaObj::S_MODULO:\n               data = evaluate(pointer,p_obj);\n\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) % data;   // reverse order\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer, p_obj);\n                data = tmp1 % data;\n           }\n#endif\n               break;\n            case SalaObj::S_POWER:\n               data = evaluate(pointer,p_obj);   // reverse order\n               data = pow(evaluate(pointer,p_obj).toDouble(),data.toDouble());\n               break;\n            case SalaObj::S_ASSIGN:\n               data = evaluate(pointer,p_obj);  // reverse order\n               evaluate(pointer,p_obj);\n               if (p_obj != nullptr) {\n                  *p_obj = data;\n               }\n               else {\n                  throw SalaError(\"Cannot assign to constant, function or none\",m_line);\n               }\n               data = SalaObj(); // assign returns nil value\n               break;\n            case SalaObj::S_LIST_ACCESS:\n               {\n                  int x = evaluate(pointer,p_obj).toInt();\n                  data = evaluate(pointer,p_obj);\n                  if (data.type == SalaObj::S_LIST) {\n                     // setting p_obj allows things above this in the stack to modify it\n                     p_obj = &(data.list_at(x));\n                     return *p_obj;\n                  }\n                  else if (data.type == SalaObj::S_STRING) {\n                     // but n.b., strings cannot be modified, keep p_obj as null\n                     p_obj = NULL;\n                     return data.char_at(x);\n                  }\n                  else\n                     throw SalaError(\"Cannot be applied to \" + data.getTypeIndefArt() + data.getTypeStr(),m_line);\n               }\n               break;\n            default:\n               break;\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_math_ops.size(); i++) {\n               if (g_sala_math_ops[i].func == func) {\n                  e.message = \"In '\" + g_sala_math_ops[i].name + \"' operator: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw e;\n         }\n      }\n      else if (group == SalaObj::S_LOGICAL_OPS) {\n         try {\n            switch (func) {\n            case SalaObj::S_OR:\n               // note: you cannot simply say evaluate(x) || evaluate(y) because if evaluate(x) is true,\n               // the in-built || operator will not evaluate(y)\n               // but... it's on the eval stack... it would be nice simply to pop the eval stack at\n               // this point if the first half evaluates to true, thus emulating C... but it's in reverse order too!\n               data = evaluate(pointer,p_obj);\n               data = evaluate(pointer,p_obj).toBool() || data.toBool();\n               break;\n            case SalaObj::S_AND:\n               data = evaluate(pointer,p_obj).toBool() && evaluate(pointer,p_obj).toBool();\n               break;\n            case SalaObj::S_NOT:\n               data = !evaluate(pointer,p_obj).toBool();\n               break;\n            case SalaObj::S_EQ:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) == evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer, p_obj);\n                SalaObj tmp2 = evaluate(pointer, p_obj);\n                data = (tmp1 == tmp2);\n           }\n#endif\n               break;\n            case SalaObj::S_IS:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = op_is(evaluate(pointer,p_obj),evaluate(pointer,p_obj));\n#else\n           {\n            SalaObj tmp1 = evaluate(pointer, p_obj);\n            SalaObj tmp2 = evaluate(pointer, p_obj);\n            data = op_is(tmp1, tmp2);\n           }\n#endif\n               break;\n            case SalaObj::S_NEQ:\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) != evaluate(pointer,p_obj);\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                SalaObj tmp2 = evaluate(pointer,p_obj);\n                data = (tmp1 != tmp2);\n           }\n#endif\n               break;\n            case SalaObj::S_GT:\n               data = evaluate(pointer,p_obj);\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) > data;   // revese order\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                data = (tmp1 > data);\n           }\n#endif\n               break;\n            case SalaObj::S_LT:\n               data = evaluate(pointer,p_obj);\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) < data;   // revese order\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                data = (tmp1 < data);\n           }\n#endif\n               break;\n            case SalaObj::S_GEQ:\n               data = evaluate(pointer,p_obj);\n\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) >= data;   // revese order\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                data = (tmp1 >= data);\n           }\n#endif\n               break;\n            case SalaObj::S_LEQ:\n               data = evaluate(pointer,p_obj);\n\n               // Quick mod - TV\n#if defined(_MSC_VER)\n               data = evaluate(pointer,p_obj) <= data;   // revese order\n#else\n           {\n                SalaObj tmp1 = evaluate(pointer, p_obj);\n                data = (tmp1 <= data);\n           }\n#endif\n               break;\n            default:\n               break;\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_logical_ops.size(); i++) {\n               if (g_sala_logical_ops[i].func == func) {\n                  e.message = \"In '\" + g_sala_logical_ops[i].name + \"' operator: \" + e.message;\n                  break;\n               }\n            }\n            for (size_t j = 0; j < g_sala_comp_ops.size(); j++) {\n               if (g_sala_comp_ops[j].func == func) {\n                  e.message = \"In '\" + g_sala_comp_ops[j].name + \"' operator: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw e;\n         }\n      }\n      else if (group == SalaObj::S_GLOBAL_FUNCS) {\n         try {\n            switch (func) {\n            case SalaObj::S_LEN:\n               data = evaluate(pointer,p_obj);\n               data = SalaObj( data.length() );\n               break;\n            case SalaObj::S_RANGE:\n               data = evaluate(pointer,p_obj);\n               {\n                  int len = data.length();\n                  if (len != 2 && len != 3) {\n                     throw SalaError(\"Range takes either 2 or 3 parameters\",m_line);\n                  }\n                  int start = data.data.list.list->at(0).toInt();\n                  int end = data.data.list.list->at(1).toInt();\n                  int step = (len == 3) ? data.data.list.list->at(2).toInt() : 1;\n                  if (step == 0) {\n                     throw SalaError(\"Range cannot have a step of 0\",m_line);\n                  }\n                  int listlen = (int) ceil(float(end - start) / float(step));\n                  if (listlen <= 0) {\n                     data = SalaObj( SalaObj::S_LIST );\n                  }\n                  else {\n                     data = SalaObj( SalaObj::S_LIST, listlen );\n                     for (int i = start, j = 0; i < end; i += step, j++) {\n                        data.data.list.list->at(j) = i;\n                     }\n                  }\n               }\n               break;\n            case SalaObj::S_SQRT:\n               data = sqrt(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_LOG:\n               data = log10(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_LN:\n               data = ln(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_RAND:\n               data = evaluate(pointer,p_obj);\n               data.ensureNone();\n               data = SalaObj(prandom());\n               break;\n            case SalaObj::S_SIN:\n               data = sin(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_COS:\n               data = cos(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_TAN:\n               data = tan(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_ASIN:\n               data = asin(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_ACOS:\n               data = acos(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_ATAN:\n               data = atan(evaluate(pointer,p_obj).toDouble());\n               break;\n            default:\n               break;\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_global_funcs.size(); i++) {\n               if (g_sala_global_funcs[i].func == func) {\n                  e.message = \"In '\" + g_sala_global_funcs[i].name + \"' function: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw e;\n         }\n      }\n      else if (group == SalaObj::S_MEMBER_FUNCS) {\n         try {\n            SalaObj param = evaluate(pointer,p_obj);\n            SalaObj obj = evaluate(pointer,p_obj);\n            switch (obj.type) {\n            case SalaObj::S_LIST: case SalaObj::S_TUPLE:\n               switch (func) {\n               case SalaObj::S_FAPPEND:\n                  obj.data.list.list->push_back(param);\n                  data = SalaObj(); // returns none\n                  break;\n               case SalaObj::S_FEXTEND:\n                  if (param.type & SalaObj::S_LIST) {\n                     int count = param.data.list.list->size();\n                     for (int i = 0; i < count; i++) {\n                        obj.data.list.list->push_back(param.data.list.list->at(i));\n                     }\n                  }\n                  else {\n                     throw SalaError(\"Parameter must be a list not \"  + param.getTypeIndefArt() + param.getTypeStr(),m_line);\n                  }\n                  data = SalaObj(); // returns none\n                  break;\n               case SalaObj::S_FPOP:\n                  if (obj.data.list.list->size() == 0) {\n                     throw SalaError(\"List is empty\", m_line);\n                  }\n                  if (param.type == SalaObj::S_NONE) {\n                     data = obj.data.list.list->tail();\n                     obj.data.list.list->pop_back();\n                  }\n                  else {\n                     pvector<SalaObj>& list = *(obj.data.list.list);\n                     int i = param.toInt();\n                     if (i < 0)\n                        i += list.size();\n                     if (i < 0 || i >= (int)list.size())\n                        throw SalaError(\"Index out of range\");\n                     data = list.at(i);\n                     list.remove_at(i);\n                  }\n                  break;\n               case SalaObj::S_FCLEAR:\n                  param.ensureNone();\n                  obj.data.list.list->clear();\n                  obj = SalaObj();\n                  break;\n               default:\n                  throw SalaError(\"Not a member function of \" + obj.getTypeStr(),m_line);\n               }\n               break;\n            case SalaObj::S_SHAPEMAPOBJ: case SalaObj::S_POINTMAPOBJ:\n               switch (func) {\n               case SalaObj::S_FVALUE:\n                  {\n                     const std::string& str = param.toStringRef();\n                     AttributeTable *table = obj.getTable();\n                     int col = -1;\n                     if (str != \"Ref Number\") {\n                        col = table->getColumnIndex(str);\n                        if (col == -1) {\n                           throw SalaError(str + \" is an unknown column\",m_line);\n                        }\n                     }\n                     // *** NB! vga is keyed off pixelrefs *all* others use rowids directly ***\n                     // (this may seem an odd way to do it, but it speeds up connection hunting to use whichever method the map uses -- note idepthmap uses the method to access attributes)\n                     data = SalaObj(table->getValue((obj.type == SalaObj::S_POINTMAPOBJ) ? table->getRowid(obj.data.graph.node) : obj.data.graph.node,col));\n                  }\n                  break;\n               case SalaObj::S_FSETVALUE:\n                  {\n                     if (param.length() != 2) {\n                        throw SalaError(\"Function takes 2 parameters\");\n                     }\n                     const std::string& str = param.list_at(0).toStringRef();\n                     float val = (float) param.list_at(1).toDouble();\n                     AttributeTable *table = obj.getTable();\n                     int col = -1;\n                     if (str != \"Ref Number\") {\n                        col = table->getColumnIndex(str);\n                        if (col == -1) {\n                           throw SalaError(str + \" is an unknown column\",m_line);\n                        }\n                     }\n                     // *** NB! vga is keyed off pixelrefs *all* others use rowids directly ***\n                     // (this may seem an odd way to do it, but it speeds up connection hunting to use whichever method the map uses -- note idepthmap uses the method to access attributes)\n                     table->setValue((obj.type == SalaObj::S_POINTMAPOBJ) ? table->getRowid(obj.data.graph.node) : obj.data.graph.node, col, val);\n                     data = SalaObj(); // returns none\n                  }\n                  break;\n               case SalaObj::S_FCONNECTIONS:\n                  {\n                     data = connections(obj, param);\n                  }\n                  break;\n               case SalaObj::S_FMARK:\n                  {\n                     param.ensureNone();\n                     AttributeTable *table = obj.getTable();\n                     data = table->getMark((obj.type == SalaObj::S_POINTMAPOBJ) ? table->getRowid(obj.data.graph.node) : obj.data.graph.node);\n                  }\n                  break;\n               case SalaObj::S_FSETMARK:\n                  {\n                     AttributeTable *table = obj.getTable();\n                     table->setMark((obj.type == SalaObj::S_POINTMAPOBJ) ? table->getRowid(obj.data.graph.node) : obj.data.graph.node, param);\n                     m_program->m_marked = true;   // <- this tells the program to tidy up marks between executions\n                     data = SalaObj(); // returns none\n                  }\n                  break;\n               default:\n                  throw SalaError(\"Not a member function of \" + obj.getTypeStr(),m_line);\n               }\n               break;\n            default:\n               throw SalaError(\"Not a member function of \" + obj.getTypeStr(), m_line);\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_member_funcs.size(); i++) {\n               if (g_sala_member_funcs[i].func == func) {\n                  SalaObj type = SalaObj(g_sala_member_funcs[i].type);\n                  e.message = \"In \" + type.getTypeStr() + \" '\" + g_sala_member_funcs[i].name + \"' function: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw e;\n         }\n      }\n   }\n   else if (data.type == SalaObj::S_THIS) {\n      p_obj = &(m_program->m_thisobj);\n      return *p_obj;\n   }\n   else if (data.type & SalaObj::S_VAR) {\n      // retrieve value from variable stack (keeping in a variable stack means it can be reassigned dynamically)\n      p_obj = &(m_program->m_var_stack[data.data.var]);\n      return *p_obj;\n   }\n   else if (data.type & SalaObj::S_CONST_LIST) {\n      // build an list from either a const tuple or const list:\n      int x = data.data.count;\n      data = SalaObj((data.type == SalaObj::S_CONST_LIST) ? SalaObj::S_LIST : SalaObj::S_TUPLE, x);\n      for (--x; x >= 0; x--) {\n         data.data.list.list->at(x) = evaluate(pointer,p_obj);  // n.b., direct access to the list\n      }\n   }\n   p_obj = NULL;\n   return data;\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n\nSalaObj SalaCommand::connections(SalaObj graphobj, SalaObj param)\n{\n   // now, depending on type of object, it may or may not be allowed parameters:\n   // for point maps it can be none (all connections) or a bin number (0-32)\n   // for segment maps it can be 'all' or 'forward' or 'back' (a string -- no parameters is excluded due to potential for errors)\n   // for axial maps it must be none\n   SalaObj list;\n   if ((graphobj.type & SalaObj::S_MAP) == SalaObj::S_POINTMAP) {\n      // point map version\n      Node& node = graphobj.data.graph.map.point->getPoint(graphobj.data.graph.node).getNode();\n      if (param.type == SalaObj::S_NONE) {\n         int count = node.count();\n         list = SalaObj( SalaObj::S_LIST, count);\n         node.first();\n         for (int i = 0; i < count; i++) {\n            graphobj.data.graph.node = node.cursor();\n            list.data.list.list->at(i) = graphobj;\n            node.next();\n         }\n      }\n      else {\n         int b = param.toInt(); // note, will throw if it's not the right type\n         if (b < 0 || b > 31) {\n            throw SalaError(\"Bin must be in range 0 to 31\");\n         }\n         Bin& bin = node.bin(b);\n         int count = bin.count();\n         list = SalaObj( SalaObj::S_LIST, count);\n         bin.first();\n         for (int i = 0; i < count; i++) {\n            graphobj.data.graph.node = bin.cursor();\n            list.data.list.list->at(i) = graphobj;\n            bin.next();\n         }\n      }\n   }\n   else {\n      const Connector& connector = graphobj.data.graph.map.shape->getConnections().at(graphobj.data.graph.node);\n      int mode = Connector::CONN_ALL;\n      if (graphobj.data.graph.map.shape->isSegmentMap()) {\n         const std::string& str = param.toStringRef();\n         if (str == \"forward\") {\n            mode = Connector::SEG_CONN_FW;\n         }\n         else if (str == \"back\") {\n            mode = Connector::SEG_CONN_BK;\n         }\n         else if (str == \"all\") {\n            mode = Connector::SEG_CONN_ALL;\n         }\n      }\n      else {\n         param.ensureNone();\n      }\n      int count = connector.count(mode);\n      list = SalaObj( SalaObj::S_LIST, count);\n      connector.first();\n      for (int i = 0; i < count; i++) {\n         graphobj.data.graph.node = connector.cursor(mode);\n         list.data.list.list->at(i) = graphobj;\n         connector.next();\n      }\n   }\n   return list;\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n\nAttributeTable *SalaObj::getTable()\n{\n   if ((type & SalaObj::S_MAP) == SalaObj::S_POINTMAP) {\n      return &(data.graph.map.point->getAttributeTable());\n   }\n   else {\n      return &(data.graph.map.shape->getAttributeTable());\n   }\n}\n\nint SalaObj::precedence() const\n{\n   int prec = 0;\n   if ((type & S_BRACKET) == 0) { // preserve bracket on func stack until after close bracket, remember to strip any at end\n      switch (func()) {\n         case S_ASSIGN:\n            prec = 1; // do absolutely last!\n            break;\n         case S_AND:\n            prec = 2;\n            break;\n         case S_OR:\n            prec = 3;\n            break;\n         case S_NOT:\n            prec = 4;\n            break;\n         case S_EQ: case S_IS: case S_LT: case S_GT: case S_LEQ: case S_GEQ: case S_NEQ:\n            prec = 5;\n            break;\n         case S_ADD: case S_SUBTRACT:\n            prec = 6;\n            break;\n         case S_MULTIPLY: case S_DIVIDE: case S_MODULO:\n            prec = 7;\n            break;\n         case S_POWER:\n            prec = 8;\n            break;\n         default: // function -- place straight on eval stack when you meet next operator\n            prec = 9;\n            break;\n      }\n   }\n   return prec;\n}\n}\n"
  },
  {
    "path": "mgraph440/salaprogram.h",
    "content": "// salaprogram.h - a component of the depthmapX - spatial network analysis platform\n// SalaScripting language\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#ifndef __SALAPROGRAM_H__\n#define __SALAPROGRAM_H__\n\n#include \"mgraph440/stringutils.h\"\n#include \"mgraph440/paftl.h\"\n#include <vector>\n#include <set>\n#include <cmath>\n\nnamespace mgraph440 {\n\nclass AttributeTable;\nclass PointMap;\nclass ShapeMap;\n\ninline bool isalphanum_(char c)\n{\n   if (isalnum(c) || c == '_')\n      return true;\n   else\n      return false;\n}\n\ninline bool isalpha_(char c)\n{\n   if (isalpha(c) || c == '_')\n      return true;\n   else\n      return false;\n}\n\nstruct SalaError\n{\n   int lineno;\n   std::string message;\n   SalaError(const std::string& m = std::string(), int li = -1)\n   { message = m; lineno = li; }\n};\n\n/////////////////////////////////////////////////////////////////////////////////////////\n\n// A series of 8-byte types to go in the SalaObj data union\n// note, they cannot cannot instantiate a copy constructor as it is used as\n// a member of the union in SalaObj\n\nclass SalaObj;\n\nstruct SalaStr\n{\npublic:\n   int *refcount;\n   std::string *string;\npublic:\n   friend bool operator == (const SalaStr& a, const SalaStr& b);\n   friend bool operator != (const SalaStr& a, const SalaStr& b);\n   friend bool operator < (const SalaStr& a, const SalaStr& b);\n   friend bool operator > (const SalaStr& a, const SalaStr& b);\n   // operator const std::string&() { return *string; }\n   char char_at(size_t i) const\n   { return string->operator[](i); }\n   size_t length() const\n   { return string->length(); }\n};\ninline bool operator == (const SalaStr& a, const SalaStr& b)\n{ return *(a.string) == *(b.string); }\ninline bool operator != (const SalaStr& a, const SalaStr& b)\n{ return *(a.string) != *(b.string); }\ninline bool operator < (const SalaStr& a, const SalaStr& b)\n{ return *(a.string) < *(b.string); }\ninline bool operator > (const SalaStr& a, const SalaStr& b)\n{ return *(a.string) > *(b.string); }\n\nstruct SalaList {\n   int *refcount;\n   pvector<SalaObj> *list;\npublic:\n   friend bool operator == (const SalaList& a, const SalaList& b);\n   friend bool operator != (const SalaList& a, const SalaList& b);\n   // inlines below\n};\n\nstruct SalaGrf {\n   int node;\n   union Map {\n      PointMap *point;  // vga\n      ShapeMap *shape;  // everything else\n   };\n   Map map;\n};\n\n// SalaObj is 16 bytes, which is larger than I intended, but it appears\n// when you put both a double (8 bytes) and an int (4 bytes) into a class, it pads\n// to 16 bytes rather than the 12 you would expect\n\n// union members aren't allow copy constructors, so the list functionality\n// is built directly into the SalaObj, making it no more inefficient than if it\n// were to reference directly to another object to find, e.g., length or refcount\n\n// note lists are stored by reference.  I'm not sure if this is a good idea!\n\nclass SalaObj\n{\n   friend class SalaProgram;\n   friend class SalaCommand;\n   friend class SalaArray;\npublic:\n   // Object types\n   enum Type { S_BRACKET = 0x0000003f, S_OPEN_SQR_BRACKET = 0x0000000c,\n               S_OPEN_BRACKET = 0x00000001, S_CLOSE_BRACKET = 0x00000002,\n               S_OPEN_SQR_BRACKET_LIST = 0x00000004, S_OPEN_SQR_BRACKET_ACCESS = 0x00000008,\n               S_CLOSE_SQR_BRACKET = 0x00000010, S_COMMA = 0x00000020, // bracket includes comma for checking purposes\n               S_NONE = 0x00000100, S_UNINIT = 0x00000200, S_FUNCTION = 0x00000400,\n               S_BOOL = 0x00001000, S_CHAR = 0x00002000,\n               S_INT = 0x00004000, S_DOUBLE = 0x00008000, S_NUMBER = 0x0000c000,\n               S_STRING = 0x00010000, S_VAR = 0x00020000,\n               S_CONST_LIST = 0x00100000, S_CONST_TUPLE = 0x00300000, // tuple is a type of list\n               S_LIST = 0x00400000, S_TUPLE = 0x00500000,  // tuple is a type of list\n               // maps are bitwise 'or'ed to node to make appropriate node type for each map\n               S_GRAPHOBJ = 0x01000000, S_MAP = 0x06000000, S_POINTMAP = 0x02000000, S_SHAPEMAP = 0x04000000,\n               // however, as the variable is uses the typename of the enum, each must be filled in explicitly:\n               S_POINTMAPOBJ = 0x03000000, S_SHAPEMAPOBJ = 0x05000000,\n               S_THIS = 0x10000000\n         };\n   // Built-in Functions, note, some of the groupings contain other operations (eg., math ops includes assign, and logical ops includes both comparators and logical ops)\n   enum Func {\n          S_FNULL = 0x00000000, S_GROUP = 0xf0000000,\n          S_MATH_OPS = 0x10000000, S_LOGICAL_OPS = 0x20000000, S_GLOBAL_FUNCS = 0x30000000, S_MEMBER_FUNCS = 0x40000000,\n          S_ADD = 0x10000001, S_SUBTRACT = 0x10000002, S_MINUS = 0x10000003, S_PLUS = 0x10000004,\n          S_MULTIPLY = 0x10000005, S_DIVIDE = 0x10000006, S_MODULO = 0x10000007, S_POWER = 0x10000008,\n          S_ASSIGN = 0x10000009, S_LIST_ACCESS = 0x1000000a,\n          S_LT  = 0x20000001, S_GT = 0x20000002, S_LEQ = 0x20000003, S_GEQ = 0x20000004, S_EQ = 0x20000005,\n          S_NEQ = 0x20000006, S_AND = 0x20000007, S_OR = 0x20000008, S_NOT = 0x20000009, S_IS = 0x2000000a,\n          S_LEN = 0x30000001, S_RANGE = 0x30000002,\n          S_SQRT = 0x30000003, S_LOG = 0x30000004, S_LN = 0x30000005, S_RAND = 0x30000006,\n          S_SIN = 0x30000007, S_COS = 0x30000008, S_TAN = 0x30000009,\n          S_ASIN = 0x3000000a, S_ACOS = 0x3000000b, S_ATAN = 0x3000000c,\n          S_FPOP = 0x40000001, S_FAPPEND = 0x40000002, S_FEXTEND = 0x40000003, S_FCLEAR = 0x40000004,\n          S_FVALUE = 0x40000011, S_FSETVALUE = 0x40000012, S_FCONNECTIONS = 0x40000013,\n          S_FMARK = 0x40000014, S_FSETMARK = 0x40000015\n   };\nprotected:\n   union Data {\n      bool   b;\n      char   ch;\n      int    i;\n      double f;\n      SalaList list;\n      SalaStr str;\n      SalaGrf graph;\n      Func   func;\n      int    var;\n      int    count;  // used by brackets to count how many objects they have\n   };\n   Data data;\n   Type type;\npublic:\n   SalaObj() { type = S_NONE; }\n   // Two usages: (a) used for brackets (=groups of things, hence the count) and commas\n   //             (b) used for lists\n   SalaObj(Type t)\n   {\n      type = t;\n      if (t & S_LIST) {\n         data.list.refcount = new int(1);\n         data.list.list = new pvector<SalaObj>;\n      }\n      else {\n         data.count = 1;\n      }\n   }\n   // Two usages: (a) used to address variable or user function tables\n   //             (b) used for lists\n   SalaObj(Type t, int v)\n   {\n      type = t;\n      if (t & S_LIST) {\n         data.list.refcount = new int(1);\n         data.list.list = new pvector<SalaObj>;\n         data.list.list->set(v); // set blanks\n      }\n      else {\n         data.var = v;\n      }\n   }\n   // other constructors\n   SalaObj(bool a) { type = S_BOOL; data.b = a; }\n   SalaObj(int a) { type = S_INT; data.i = a; }\n   SalaObj(double a) { type = S_DOUBLE; data.f = a; }\n   SalaObj(Func f) { type = S_FUNCTION; data.func = f; }\n   SalaObj(const std::string& a) { type = S_STRING; data.str.refcount = new int(1); data.str.string = new std::string(a); }\n   // note, type required here as sometimes this will be an axial map, sometimes segment map, sometimes point map,\n   // also not fully filled in until runtime, but still required by parse\n   SalaObj(Type t, SalaGrf graph)\n   { type = t; data.graph = graph; }\n   //\n   SalaObj(const SalaObj& obj);\n   SalaObj& operator = (const SalaObj& obj);\n   ~SalaObj();\n   void reset();\n   void uninit() { reset(); type = S_UNINIT; }  // <- used to uninitialise variables before running program, thus they give nice error messages if used before initialisation\n   int func() const { return data.func; }\n   int precedence() const;\n   bool toBool() const;\n   int toInt() const;\n   double toDouble() const;\n   std::string toString() const;\n   const std::string& toStringRef() const;\n   friend SalaObj op_is(SalaObj& a, SalaObj& b);\n   friend SalaObj operator - (SalaObj& a);\n   friend SalaObj operator + (SalaObj& a, SalaObj& b);\n   friend SalaObj operator - (SalaObj& a, SalaObj& b);\n   friend SalaObj operator / (SalaObj& a, SalaObj& b);\n   friend SalaObj operator * (SalaObj& a, SalaObj& b);\n   friend SalaObj operator % (SalaObj& a, SalaObj& b);\n   friend bool operator || (SalaObj& a, SalaObj& b);\n   friend bool operator && (SalaObj& a, SalaObj& b);\n   friend bool operator ! (SalaObj& a);\n   friend bool operator == (SalaObj& a, SalaObj& b);\n   friend bool operator != (SalaObj& a, SalaObj& b);\n   friend bool operator > (SalaObj& a, SalaObj& b);\n   friend bool operator < (SalaObj& a, SalaObj& b);\n   friend bool operator >= (SalaObj& a, SalaObj& b);\n   friend bool operator <= (SalaObj& a, SalaObj& b);\n   // operations for lists:\n   SalaObj& list_at(int i);\n   SalaObj char_at(int i); // actually returns a string of the char -- note constant\n   int length();\n   // check for no parameters\n   void ensureNone()\n   { if (type != SalaObj::S_NONE) throw SalaError(\"Does not take any parameters\"); }\n   //\n   // operations for graphs / graph nodes:\n   AttributeTable *getTable();\n   //\n   const std::string getTypeStr() const;\n   const std::string getTypeIndefArt() const;\n};\n\n// Quick mod - TV\nclass SalaProgram;\n\nclass SalaCommand\n{\n   friend class SalaProgram;\n   //\n   enum Command { SC_NONE, SC_ROOT, SC_EXPR, SC_RETURN, SC_FOR, SC_WHILE, SC_IF, SC_ELIF, SC_ELSE };\n   enum { SP_NONE, SP_DATA, SP_NUMBER, SP_FUNCTION, SP_COMMAND }; // used while calculating what is on eval stack\nprotected:\n   //\n   SalaProgram *m_program; // information about the running program (in particular, the global variable and error stack)\n   SalaCommand *m_parent;\n   prefvec<SalaCommand> m_children;\n   //\n   pqmap<std::string,int> m_var_names;\n   //\n   Command m_command;\n   int m_indent;  // vital for program flow due to Pythonesque syntax\n   pvector<SalaObj> m_eval_stack;\n   pvector<SalaObj> m_func_stack;\n   //\n   SalaObj m_for_iter;  // object used in a for loop\n   //\n   int m_line; // useful for debugging to know which line this command starts on\n   std::string m_last_string; // occassionally useful in debugging if the user does something unsyntactical\n   //\npublic:\n   SalaCommand() { m_program = NULL; m_parent = NULL; m_indent = 0; m_command = SC_NONE; }\n   SalaCommand(SalaProgram *program, SalaCommand *parent, int indent, Command command = SC_NONE);\nprotected:\n   int parse(::std::istream& program, int line);\n   int decode(std::string string);\n   int decode_member(const std::string& string, bool apply_to_this);\n   void pushFunc(const SalaObj& func);\n   //\n   void evaluate(SalaObj& obj, bool& ret, bool& ifhandled);\n   SalaObj evaluate(int& pointer, SalaObj* &p_obj);\n   SalaObj connections(SalaObj graphnode, SalaObj param);\n};\n\nclass SalaProgram\n{\n   friend class SalaCommand;\n   //\n   SalaCommand m_root_command;\n   pvector<SalaObj> m_var_stack;\n   prefvec<SalaError> m_error_stack;\n   //\n   // column is stored away from the context, as it's not actually passed to the program itself, just used to update a column\n   int m_col;\n   // m_thisobj stores contextual information (which attribute table, node etc)\n   // NB ! -- this can be messed with by SalaCommand!\n   SalaObj m_thisobj;\n   //\n   bool m_marked; // this is used to tell the program that a node has been \"marked\" -- all marks are cleared at the end of the execution\n   //\npublic:\n   SalaProgram(SalaObj context);\n   ~SalaProgram();\n   bool parse(::std::istream& program);\n   SalaObj evaluate();\n   bool runupdate(int col, const std::set<int> &selset = std::set<int>());\n   bool runselect(std::vector<int>& selsetout, const std::set<int> &selsetin = std::set<int>());\n   std::string getLastErrorMessage() const;\n};\n\ninline SalaObj::SalaObj(const SalaObj& obj)\n{\n   type = obj.type;\n   switch(obj.type) {\n      case S_FUNCTION: data.func = obj.data.func; break;\n      case S_BOOL: data.b = obj.data.b; break;\n      case S_INT: data.i = obj.data.i; break;\n      case S_DOUBLE: data.f = obj.data.f; break;\n      case S_VAR: data.var = obj.data.var; break;\n      case S_STRING:\n         data.str.string = obj.data.str.string;\n         data.str.refcount = obj.data.str.refcount;\n         *(data.str.refcount) += 1;\n         break;\n      case S_LIST: case S_TUPLE:\n         data.list.list = obj.data.list.list;\n         data.list.refcount = obj.data.list.refcount;\n         *(data.list.refcount) += 1;\n         break;\n      case S_NONE: case S_UNINIT: case S_THIS:\n         break;\n      case S_SHAPEMAPOBJ: case S_SHAPEMAP:\n         data.graph.map.shape = obj.data.graph.map.shape;\n         data.graph.node = obj.data.graph.node;\n         break;\n      case S_POINTMAPOBJ: case S_POINTMAP:\n         data.graph.map.point = obj.data.graph.map.point;\n         data.graph.node = obj.data.graph.node;\n         break;\n      case S_OPEN_BRACKET: case S_CLOSE_BRACKET: case S_OPEN_SQR_BRACKET_LIST: case S_OPEN_SQR_BRACKET_ACCESS:\n      case S_CLOSE_SQR_BRACKET: case S_COMMA: case S_CONST_LIST: case S_CONST_TUPLE:\n         data.count = obj.data.count; break;\n      default: throw SalaError(\"Cannot instantiate unknown type\");\n   }\n}\ninline SalaObj& SalaObj::operator = (const SalaObj& obj)\n{\n   if (this != &obj) {\n      reset();\n      type = obj.type;\n      switch(obj.type) {\n         case S_FUNCTION: data.func = obj.data.func; break;\n         case S_BOOL: data.b = obj.data.b; break;\n         case S_INT: data.i = obj.data.i; break;\n         case S_DOUBLE: data.f = obj.data.f; break;\n         case S_VAR: data.var = obj.data.var; break;\n         case S_STRING:\n            data.str.string = obj.data.str.string;\n            data.str.refcount = obj.data.str.refcount;\n            *(data.str.refcount) += 1;\n            break;\n         case S_LIST: case S_TUPLE:\n            data.list.list = obj.data.list.list;\n            data.list.refcount = obj.data.list.refcount;\n            *(data.list.refcount) += 1;\n            break;\n         case S_NONE: case S_UNINIT: case S_THIS:\n            break;\n         case S_SHAPEMAPOBJ: case S_SHAPEMAP:\n            data.graph.map.shape = obj.data.graph.map.shape;\n            data.graph.node = obj.data.graph.node;\n            break;\n         case S_POINTMAPOBJ: case S_POINTMAP:\n            data.graph.map.point = obj.data.graph.map.point;\n            data.graph.node = obj.data.graph.node;\n            break;\n         case S_OPEN_BRACKET: case S_CLOSE_BRACKET: case S_OPEN_SQR_BRACKET_LIST: case S_OPEN_SQR_BRACKET_ACCESS:\n         case S_CLOSE_SQR_BRACKET: case S_COMMA: case S_CONST_LIST: case S_CONST_TUPLE:\n            data.count = obj.data.count; break;\n         default: throw SalaError(\"Cannot instantiate unknown type\");\n      }\n   }\n   return *this;\n}\ninline SalaObj::~SalaObj()\n{\n   reset();\n}\ninline void SalaObj::reset()\n{\n   if (type & S_STRING) {\n      *(data.str.refcount) -= 1;\n      if (*(data.str.refcount) == 0) {\n         delete data.str.refcount;\n         delete data.str.string;\n      }\n      data.str.refcount = NULL;\n      data.str.string = NULL;\n   }\n   else if (type & S_LIST)\n   {\n      *(data.list.refcount) -= 1;\n      if (*(data.list.refcount) == 0) {\n         delete data.str.refcount;\n         delete data.list.list;\n      }\n      data.str.refcount = NULL;\n      data.list.list = NULL;\n   }\n   type = S_NONE;\n}\ninline bool SalaObj::toBool() const\n{\n   switch(type) {\n      case S_BOOL: return data.b;\n      case S_INT: return data.i != 0;\n      case S_DOUBLE: return data.f != 0.0;\n      default:\n         throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a boolean value\"));\n   }\n   return false;\n}\ninline int SalaObj::toInt() const\n{\n   switch(type) {\n      case S_BOOL: return data.b ? 1 : 0;\n      case S_INT: return data.i;\n      case S_DOUBLE: return int(floor(data.f)); // ensure properly implemented\n      default: throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to an integer value\"));\n   }\n   return 0;\n}\ninline double SalaObj::toDouble() const\n{\n   switch(type) {\n      case S_BOOL: return data.b ? 1.0 : 0.0;\n      case S_INT: return double(data.i);\n      case S_DOUBLE: return data.f;\n      default: throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a floating point number\"));\n   }\n   return 0.0;\n}\ninline std::string SalaObj::toString() const\n{\n   switch(type) {\n      case S_INT: return dXstring440::formatString(data.i);\n      case S_DOUBLE: return dXstring440::formatString(data.f);\n      case S_STRING: return *(data.str.string);\n      default: throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a string\"));\n   }\n   return std::string();\n}\ninline const std::string& SalaObj::toStringRef() const\n{\n   if (type != S_STRING) {\n      throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a string reference\"));\n   }\n   return *(data.str.string);\n}\n\ninline SalaObj operator + (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: throw SalaError(\"Cannot add booleans\");\n      case SalaObj::S_INT: return SalaObj(a.data.i + b.data.i);\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f + b.data.f);\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) + b.data.f) : (a.data.f + double(b.data.i));\n      case SalaObj::S_STRING: return SalaObj(*(a.data.str.string) + *(b.data.str.string));\n      default: throw SalaError(std::string(\"Cannot add \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" to \")  + b.getTypeIndefArt() + b.getTypeStr());\n   }\n   return SalaObj();\n}\ninline SalaObj operator - (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: throw SalaError(\"Cannot subtract booleans\");\n      case SalaObj::S_INT: return SalaObj(a.data.i - b.data.i);\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f - b.data.f);\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) - b.data.f) : (a.data.f - double(b.data.i));\n      default: throw SalaError(std::string(\"Cannot subtract \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" from \") + a.getTypeIndefArt() + a.getTypeStr());\n   }\n   return SalaObj();\n}\ninline SalaObj operator - (SalaObj& a)\n{\n   switch (a.type) {\n      case SalaObj::S_BOOL: throw SalaError(\"Cannot minus booleans\");\n      case SalaObj::S_INT: return SalaObj(-a.data.i);\n      case SalaObj::S_DOUBLE: return SalaObj(-a.data.f);\n      default: throw SalaError(std::string(\"Cannot minus \") + a.getTypeIndefArt() + a.getTypeStr());\n   }\n   return SalaObj();\n}\ninline SalaObj operator * (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_INT: return SalaObj(a.data.i * b.data.i);\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f * b.data.f);\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) * b.data.f) : (a.data.f * double(b.data.i));\n      default: throw SalaError(std::string(\"Cannot multiply \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" by \") + b.getTypeIndefArt() + b.getTypeStr());\n   }\n   return SalaObj();\n}\ninline SalaObj operator % (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_INT: return SalaObj(a.data.i % b.data.i);\n      case SalaObj::S_DOUBLE: return SalaObj(::std::fmod(a.data.f,b.data.f));\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? fmod(double(a.data.i),b.data.f) : fmod(a.data.f,double(b.data.i));\n      default: throw SalaError(std::string(\"Cannot multiply \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" by \") + b.getTypeIndefArt() + b.getTypeStr());\n   }\n   return SalaObj();\n}\ninline SalaObj operator / (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_INT: if (b.data.i != 0) return SalaObj(a.data.i / b.data.i); else throw SalaError(\"Integer divide by zero error\");\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f / b.data.f);\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) / b.data.f) : (a.data.f / double(b.data.i));\n      default: throw SalaError(std::string(\"Cannot divide \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" by \")  + a.getTypeIndefArt() + b.getTypeStr());\n   }\n   return SalaObj();\n}\n// assume already bools (use convert to bool first)\ninline bool operator && (SalaObj& a, SalaObj& b)\n{\n   return a.data.b && b.data.b;\n}\n// assume already bools (use convert to bool first)\ninline bool operator || (SalaObj& a, SalaObj& b)\n{\n   return a.data.b || b.data.b;\n}\n// assume already bools (use convert to bool first)\ninline bool operator ! (SalaObj& a)\n{\n   return !a.data.b;\n}\ninline bool operator == (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_NONE: return true; // none == none\n      case SalaObj::S_BOOL: return a.data.b == b.data.b;\n      case SalaObj::S_INT: return a.data.i == b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f == b.data.f;\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) == b.data.f) : (a.data.f == double(b.data.i));\n      case SalaObj::S_STRING: return a.data.str == b.data.str;\n      case SalaObj::S_LIST: return a.data.list == b.data.list;\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '=='\"));\n   }\n   return false;\n}\ninline SalaObj op_is(SalaObj& a, SalaObj& b)\n{\n   // note, op_is is forgiving: does not complain if cannot compare, just returns false\n   switch (a.type & b.type) {\n      case SalaObj::S_NONE: return true; // none is none\n      case SalaObj::S_BOOL: return a.data.b == b.data.b;\n      case SalaObj::S_INT: return a.data.i == b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f == b.data.f;\n      // n.b., no number! int is not double and v.v.\n      case SalaObj::S_STRING: return a.data.str.string == b.data.str.string;  // n.b.: pointer compare!\n      case SalaObj::S_LIST: return a.data.list.list == b.data.list.list;      // n.b.: pointer compare!\n   }\n   return false;\n}\n\ninline bool operator != (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: return a.data.b != b.data.b;\n      case SalaObj::S_INT: return a.data.i != b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f != b.data.f;\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) != b.data.f) : (a.data.f != double(b.data.i));\n      case SalaObj::S_STRING: return a.data.str != b.data.str;\n      case SalaObj::S_LIST: return a.data.list != b.data.list;\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '!='\"));\n   }\n   return false;\n}\ninline bool operator < (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: return a.data.b < b.data.b;\n      case SalaObj::S_INT: return a.data.i < b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f < b.data.f;\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) < b.data.f) : (a.data.f < double(b.data.i));\n      case SalaObj::S_STRING: return a.data.str < b.data.str;\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '<'\"));\n   }\n   return false;\n}\ninline bool operator > (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: return a.data.b > b.data.b;\n      case SalaObj::S_INT: return a.data.i > b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f > b.data.f;\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) > b.data.f) : (a.data.f > double(b.data.i));\n      case SalaObj::S_STRING: return a.data.str > b.data.str;\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '>'\"));\n   }\n   return false;\n}\ninline bool operator <= (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: return a.data.b <= b.data.b;\n      case SalaObj::S_INT: return a.data.i <= b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f <= b.data.f;\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) <= b.data.f) : (a.data.f <= double(b.data.i));\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '<='\"));\n   }\n   return false;\n}\ninline bool operator >= (SalaObj& a, SalaObj& b)\n{\n   switch (a.type | b.type) {\n      case SalaObj::S_BOOL: return a.data.b >= b.data.b;\n      case SalaObj::S_INT: return a.data.i >= b.data.i;\n      case SalaObj::S_DOUBLE: return a.data.f >= b.data.f;\n      case SalaObj::S_NUMBER:\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) >= b.data.f) : (a.data.f >= double(b.data.i));\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '>='\"));\n   }\n   return false;\n}\n// list operations: note -> precheck in program and sort into list and string\ninline SalaObj& SalaObj::list_at(int i)\n{\n   if (i < 0)\n      i += (int)data.list.list->size();\n   if (i < 0 || size_t(i) >= data.list.list->size())\n      throw SalaError(\"Index out of range\");\n   return data.list.list->at(i);\n}\ninline SalaObj SalaObj::char_at(int i) // actually returns a string of the char\n{\n   if (i < 0)\n      i += data.str.length();\n   if (i < 0 || i >= static_cast<int>(data.str.length()))\n      throw SalaError(\"String index out of range\");\n   return SalaObj(std::string(1,data.str.char_at(i)));\n}\ninline int SalaObj::length()\n{\n   if (type & S_LIST)\n      return (int)data.list.list->size();\n   else if (type == S_STRING)\n      return (int)data.str.length();\n   throw SalaError(\"Cannot get the length of \" + getTypeIndefArt() + getTypeStr());\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n\ninline const std::string SalaObj::getTypeStr() const\n{\n   switch(type) {\n   case S_NONE:\n      return \"none\";\n   case S_UNINIT:\n      return \"uninitialised variable\";\n   case S_FUNCTION:\n      return \"function\";\n   case S_BOOL:\n      return \"boolean\";\n   case S_INT:\n      return \"integer\";\n   case S_DOUBLE:\n      return \"float\";\n   case S_STRING:\n      return \"string\";\n   case S_LIST:\n      return \"list\";\n   case S_TUPLE:\n      return \"tuple\";\n   case S_THIS:\n      return \"this\";\n   default:\n       break;\n   }\n   if (type & S_GRAPHOBJ) {\n      return \"graph object\";\n   }\n   else if (type & S_MAP) {\n      return \"graph\";\n   }\n   return \"unknown type\";\n}\n\ninline const std::string SalaObj::getTypeIndefArt() const\n{\n   switch(type & ~S_GRAPHOBJ) {\n   case S_FUNCTION: case S_BOOL: case S_DOUBLE: case S_STRING: case S_TUPLE: case S_LIST:\n   case S_SHAPEMAP: case S_POINTMAP:\n      return \"a \";\n   case S_INT: case S_UNINIT:\n      return \"an \";\n   case S_NONE: case S_THIS:\n      return \"\";\n   default:\n      return \"an \";  // unknown type\n   }\n   return std::string();\n}\n\n/////////////////////////////////////////////////////////////////////////////////////\n\n// comparisons for lists (must be after the associated SalaObj comparisons have been declared)\n\ninline bool operator == (const SalaList& a, const SalaList& b)\n{\n   if (a.list->size() != a.list->size())\n      return false;\n   for (size_t i = 0; i < a.list->size(); i++) {\n      if (a.list->at(i) != b.list->at(i))\n         return false;\n   }\n   return true;\n}\ninline bool operator != (const SalaList& a, const SalaList& b)\n{\n   if (a.list->size() != a.list->size())\n      return true;\n   for (size_t i = 0; i < a.list->size(); i++) {\n      if (a.list->at(i) != b.list->at(i))\n         return true;\n   }\n   return false;\n}\n\n/////////////////////////////////////////////\n\n// helpers for parser:\n\nstruct SalaBuffer\n{\n   int bufpos;\n   char buffer[128];\n   SalaBuffer()\n   { bufpos = -1; buffer[0] = '\\0'; }\n   void add(char c)\n   { bufpos++; if (bufpos > 127) throw SalaError(\"Overlong string of characters\");\n     buffer[bufpos] = c; }\n   void clear()\n   { bufpos = -1; buffer[0] = '\\0'; }\n   operator std::string()\n   { buffer[bufpos + 1] = '\\0'; return std::string(buffer); }\n   bool empty()\n   { return bufpos == -1; }\n};\n\n///////////////////////////////////////////////////\n\n/////////////////////////////////////////////\n\n// Operator and function names\n\nstruct SalaFuncLabel\n{\n   SalaObj::Func func;\n   std::string name;\n   std::string desc;\n   SalaFuncLabel(SalaObj::Func f = SalaObj::S_FNULL, const std::string& str = std::string(), const std::string& des = std::string()) {\n      func = f; name = str; desc = des;\n   }\n};\n\nstruct SalaMemberFuncLabel : public SalaFuncLabel\n{\n   SalaObj::Type type;\n   SalaMemberFuncLabel(SalaObj::Type t = SalaObj::S_NONE, SalaObj::Func f = SalaObj::S_FNULL, const std::string& str = std::string(), const std::string& des = std::string()) {\n      type = t; func = f; name = str; desc = des;\n   }\n};\n\n\n/////////////////////////////////////////////////////////////////////////////////////\n\n}\n\n#endif\n"
  },
  {
    "path": "mgraph440/shapemap.cpp",
    "content": "#include \"mgraph440/shapemap.h\"\n#include \"mgraph440/pointmap.h\"\n#include \"mgraph440/spacepix.h\"\n#include \"mgraph440/exceptions.h\"\n\nnamespace mgraph440 {\n\nstatic const double TOLERANCE_A = 1e-9;\n\n// import TOLERANCE_B from axial map...\nstatic const double TOLERANCE_B = 1e-12;\n\n// copied from SpacePixel\n\nPixelRef ShapeMap::pixelate( const Point2f& p, bool constrain, int ) const\n{\n   PixelRef r;\n\n   Point2f p1 = p;\n   p1.normalScale(m_region);\n\n   if (constrain) {\n      if (p1.x <= 0.0) {\n         r.x = 0;\n      }\n      else if (p1.x >= 1.0) {\n         r.x = m_cols - 1;\n      }\n      else {\n         r.x = short(floor(p1.x * m_cols));\n      }\n   }\n   else {\n      r.x = short(floor(p1.x * m_cols));\n   }\n\n   if (constrain) {\n      if (p1.y <= 0.0) {\n         r.y = 0;\n      }\n      else if (p1.y >= 1.0) {\n         r.y = m_rows - 1;\n      }\n      else {\n         r.y = short(floor(p1.y * m_rows));\n      }\n   }\n   else {\n      r.y = short(floor(p1.y * m_rows));\n   }\n\n   return r;\n}\n\nbool ShapeMap::read( std::ifstream& stream, int version, bool drawinglayer )\n{\n   // turn off selection / editable etc\n   m_selection = false;\n   m_editable = false;\n   m_show = true; // <- by default show\n   m_map_type = ShapeMap::EMPTYMAP;\n\n   // clear old BSP tree (if exists)\n   m_bsp_tree = false;\n   m_bsp_root = NULL;\n\n   // clear old:\n   if (m_pixel_shapes) {\n      for (int i = 0; i < m_cols; i++) {\n         delete [] m_pixel_shapes[i];\n      }\n      delete [] m_pixel_shapes;\n      m_pixel_shapes = NULL;\n   }\n   if (m_display_shapes) {\n      delete [] m_display_shapes;\n      m_display_shapes = NULL;\n   }\n   m_objects.clear();\n   m_shapes.clear();\n   m_attributes.clear();\n   m_connectors.clear();\n   m_links.clear();\n   m_unlinks.clear();\n   m_undobuffer.clear();\n\n   // read in an old file:\n   if (drawinglayer && version < VERSION_DRAWING_SHAPES) {\n      // the data in the file is for a SpacePixel\n      // the easiest solution, although not the most memory effective, is to read in the space pixel,\n      // and convert to a shape map:\n      SpacePixel layer;\n      layer.read(stream,version);\n      m_name = layer.m_name;\n      m_show = layer.m_show;\n      m_editable = false;  // <- don't take from spacepixel in case conflicts in some way\n      m_region = layer.m_region;\n      m_rows = layer.m_rows;\n      m_cols = layer.m_cols;\n      m_tolerance = std::max(m_region.width(), m_region.height()) * TOLERANCE_A;\n      m_shape_ref = -1;\n      for (size_t i = 0; i < layer.m_lines.size(); i++) {\n         m_shape_ref++;\n         int index = m_shapes.add(m_shape_ref, SalaShape(layer.m_lines[i].line));\n         // insert a dummy attribute row:\n         m_attributes.insertRow(m_shape_ref);\n         // note: as this is always a drawing layer, no need to set shape attributes\n      }\n      // prepare pixel map (using same number of cols and rows as the original spacepixel for convenience)\n      m_pixel_shapes = new pqvector<ShapeRef> *[m_cols];\n      for (int j = 0; j < m_cols; j++) {\n         m_pixel_shapes[j] = new pqvector<ShapeRef>[m_rows];\n      }\n      // Now add the pixel shapes pixel map:\n      // pixelate all polys in the pixel structure:\n      for (size_t k = 0; k < m_shapes.size(); k++) {\n         makePolyPixels(m_shapes.key(k));\n      }\n      // set to read in display attribute:\n      // note that even though it's only a drawing layer, this still needs to be done\n      invalidateDisplayedAttribute();\n      setDisplayedAttribute(-1);\n\n      // all done\n      return true;\n   }\n\n   // name\n   m_name = dXstring440::readString(stream);\n\n   if (version >= VERSION_MAP_TYPES) {\n      stream.read( (char *) &m_map_type, sizeof(m_map_type));\n   }\n   else {\n      // old versions data maps or drawing maps,\n      // the axial reader will override this with its own map type designation if necessary\n      if (drawinglayer) {\n         m_map_type = DRAWINGMAP;\n      }\n      else {\n         m_map_type = DATAMAP;\n      }\n   }\n\n   if (version >= VERSION_DRAWING_SHAPES_B) {\n      stream.read( (char *) &m_show, sizeof(m_show) );\n      stream.read( (char *) &m_editable, sizeof(m_editable) );\n   }\n\n   // PixelBase read\n   // read extents:\n   stream.read( (char *) &m_region, sizeof(m_region) );\n   // read rows / cols\n   stream.read( (char *) &m_rows, sizeof(m_rows) );\n   stream.read( (char *) &m_cols, sizeof(m_cols) );\n   // calculate geom data:\n   m_tolerance = std::max(m_region.width(), m_region.height()) * TOLERANCE_A;\n\n   // read next object ref to be used:\n   stream.read((char *) &m_obj_ref, sizeof(m_obj_ref));\n   stream.read((char *) &m_shape_ref, sizeof(m_shape_ref));\n\n   // read shape data\n   int count = 0;\n   stream.read((char *) &count, sizeof(count));\n   for (int j = 0; j < count; j++) {\n      int key;\n      stream.read((char *) &key, sizeof(key));\n      int index = m_shapes.add(key, SalaShape());\n      m_shapes.value(index).read(stream,version);\n   }\n   if (version < VERSION_SHAPE_CENTROIDS) {\n      // manually set centroid according to type:\n      for (size_t i = 0; i < m_shapes.size(); i++) {\n         switch (m_shapes[i].m_type & SalaShape::SHAPE_TYPE) {\n         case SalaShape::SHAPE_POINT:\n            m_shapes[i].m_centroid = m_shapes[i].m_region.bottom_left;\n            break;\n         case SalaShape::SHAPE_LINE:\n            m_shapes[i].m_centroid = m_shapes[i].m_region.getCentre();\n            break;\n         case SalaShape::SHAPE_POLY:\n            m_shapes[i].setCentroidAreaPerim();\n            break;\n         default:\n            break;\n         }\n      }\n   }\n\n   // read object data (currently unused)\n   stream.read((char *) &count, sizeof(count));\n   for (int k = 0; k < count; k++) {\n      int key;\n      stream.read((char *) &key, sizeof(key));\n      int index = m_objects.add(key, SalaObject());\n      m_objects.value(index).read(stream,version);\n   }\n   // read attribute data\n   m_attributes.read(stream,version);\n   stream.read((char *)&m_displayed_attribute,sizeof(m_displayed_attribute));\n\n   // prepare pixel map:\n   m_pixel_shapes = new pqvector<ShapeRef> *[m_cols];\n   int i;\n   for (i = 0; i < m_cols; i++) {\n      m_pixel_shapes[i] = new pqvector<ShapeRef>[m_rows];\n   }\n   // Now add the pixel shapes pixel map:\n   // pixelate all polys in the pixel structure:\n   for (size_t j = 0; j < m_shapes.size(); j++) {\n      makePolyPixels(m_shapes.key(j));\n   }\n\n   // later versions can have shape connections:\n   if (version >= VERSION_AXIAL_SHAPES) {\n      int count;\n      stream.read((char *)&count,sizeof(count));\n      for (int i = 0; i < count; i++) {\n         m_connectors.push_back(Connector());\n         m_connectors[i].read(stream,version);\n         if (version < VERSION_NO_SELF_CONNECTION) {\n            size_t self = m_connectors[i].m_connections.searchindex(i);\n            if (self != paftl::npos) {\n               m_connectors[i].m_connections.remove_at(self);\n            }\n         }\n      }\n      m_links.read(stream);\n      m_unlinks.read(stream);\n   }\n\n   // some miscellaneous extra data for mapinfo files\n   if (m_mapinfodata) {\n      delete m_mapinfodata;\n      m_mapinfodata = NULL;\n   }\n   if (version >= VERSION_MAPINFO_SHAPES) {\n      char x = stream.get();\n      if (x == 'm') {\n         m_mapinfodata = new MapInfoData;\n         m_mapinfodata->read(stream,version);\n      }\n   }\n\n   invalidateDisplayedAttribute();\n   setDisplayedAttribute(m_displayed_attribute);\n\n   return true;\n}\nvoid ShapeMap::makePolyPixels(int polyref)\n{\n   // first add into pixels, and ensure you have a bl, tr for the set (useful for testing later)\n   SalaShape& poly = m_shapes.search(polyref);\n   if (poly.isClosed()) {\n      pmap<int,int> relations;\n      for (size_t k = 0; k < poly.size(); k++) {\n         int nextk = (k + 1) % poly.size();\n         Line li(poly[k],poly[nextk]);\n         if (k == 0) {\n            poly.m_region = li;\n         }\n         else {\n            poly.m_region = runion(poly.m_region,li);\n         }\n         PixelRefVector pixels = pixelateLine(li);\n         // debug\n         // int duplicate_shaperefs = 0;\n         // end debug\n         for (size_t i = 0; i < pixels.size(); i++) {\n            PixelRef pix = pixels[i];\n            size_t x = m_pixel_shapes[pix.x][pix.y].searchindex(ShapeRef(polyref));\n            if (x == paftl::npos) {\n               x = m_pixel_shapes[pix.x][pix.y].add(ShapeRef(polyref),paftl::ADD_HERE);\n            }\n            m_pixel_shapes[pix.x][pix.y][x].m_polyrefs.push_back(k);\n            relations.add(pixels[i],ShapeRef::SHAPE_EDGE);\n         }\n      }\n      // erase joined sides, and look for min:\n      PixelRef minpix = NoPixel;\n      for (size_t j = 0; j < relations.size(); j++) {\n         PixelRef pix = relations.key(j);\n         PixelRef nextpix;\n         nextpix = pix.right();\n         if (includes(nextpix) && m_pixel_shapes[nextpix.x][nextpix.y].searchindex(ShapeRef(polyref)) != paftl::npos) {\n            relations.value(j) &= ~ShapeRef::SHAPE_R;\n         }\n         nextpix = pix.up();\n         if (includes(nextpix) && m_pixel_shapes[nextpix.x][nextpix.y].searchindex(ShapeRef(polyref)) != paftl::npos) {\n            relations.value(j) &= ~ShapeRef::SHAPE_T;\n         }\n         nextpix = pix.down();\n         if (includes(nextpix) && m_pixel_shapes[nextpix.x][nextpix.y].searchindex(ShapeRef(polyref)) != paftl::npos) {\n            relations.value(j) &= ~ShapeRef::SHAPE_B;\n         }\n         nextpix = pix.left();\n         if (includes(nextpix) && m_pixel_shapes[nextpix.x][nextpix.y].searchindex(ShapeRef(polyref)) != paftl::npos) {\n            relations.value(j) &= ~ShapeRef::SHAPE_L;\n         }\n         if ((relations.value(j) & (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) == (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) {\n            if ((minpix == NoPixel) || (relations.key(j) < (int)minpix)) {\n               minpix = relations.key(j);\n            }\n         }\n      }\n      shapePixelBorder(relations,polyref,ShapeRef::SHAPE_L,minpix,minpix,true);\n      // go through any that aren't on the outer border: this will be internal edges, and will cause problems\n      // for point in polygon algorithms!\n      size_t i;\n      for (i = 0; i < relations.size(); i++) {\n         PixelRef pix = relations.key(i);\n         unsigned char& tags = m_pixel_shapes[pix.x][pix.y].search(polyref).m_tags;\n         if (tags == 0x00) {\n            tags |= ShapeRef::SHAPE_INTERNAL_EDGE;\n         }\n      }\n      // now, any remaining tags are internal sides, and need to be cleared through fill\n      // we could go either direction, but we just go left to right:\n      for (i = 0; i < relations.size(); i++) {\n         PixelRef pix = relations.key(i);\n         if (relations.value(i) & ShapeRef::SHAPE_R) {\n            int pos = 0;\n            do {\n               PixelRef nextpix = pix.right();\n               if (!includes(nextpix)) {\n                  // this shouldn't happen\n                  break;\n               }\n               // returns -1 if cannot add due to already existing:\n               pos = m_pixel_shapes[nextpix.x][nextpix.y].add(ShapeRef(polyref,ShapeRef::SHAPE_CENTRE));\n               pix = nextpix;\n            } while (pos != -1);\n         }\n      }\n      // Done...! This polygon is registered in the pixel polygon structure\n   }\n   else {\n      // Open shapes much easier!\n      switch (poly.m_type & SalaShape::SHAPE_TYPE)\n      {\n      case SalaShape::SHAPE_POINT:\n         {\n            PixelRef pix = pixelate(poly.m_centroid);\n            size_t x = m_pixel_shapes[pix.x][pix.y].searchindex(ShapeRef(polyref));\n            if (x == paftl::npos) {\n               x = m_pixel_shapes[pix.x][pix.y].add(ShapeRef(polyref,ShapeRef::SHAPE_OPEN),paftl::ADD_HERE);\n            }\n         }\n         break;\n      case SalaShape::SHAPE_LINE:\n         {\n            PixelRefVector pixels = pixelateLine(poly.m_region);\n            for (size_t i = 0; i < pixels.size(); i++) {\n               PixelRef pix = pixels[i];\n               size_t x = m_pixel_shapes[pix.x][pix.y].searchindex(ShapeRef(polyref));\n               if (x == paftl::npos) {\n                  x = m_pixel_shapes[pix.x][pix.y].add(ShapeRef(polyref,ShapeRef::SHAPE_OPEN),paftl::ADD_HERE);\n               }\n            }\n         }\n         break;\n      case SalaShape::SHAPE_POLY:\n         for (size_t k = 0; k < poly.size() - 1; k++) {\n            int nextk = (k + 1);\n            Line li(poly[k],poly[nextk]);\n            if (k == 0) {\n               poly.m_region = li;\n            }\n            else {\n               poly.m_region = runion(poly.m_region,li);\n            }\n            PixelRefVector pixels = pixelateLine(li);\n            for (size_t i = 0; i < pixels.size(); i++) {\n               PixelRef pix = pixels[i];\n               size_t x = m_pixel_shapes[pix.x][pix.y].searchindex(ShapeRef(polyref));\n               if (x == paftl::npos) {\n                  x = m_pixel_shapes[pix.x][pix.y].add(ShapeRef(polyref,ShapeRef::SHAPE_OPEN),paftl::ADD_HERE);\n               }\n               m_pixel_shapes[pix.x][pix.y][x].m_polyrefs.push_back(k);\n            }\n         }\n         break;\n      }\n   }\n}\n\nvoid SalaShape::setCentroidAreaPerim()\n{\n   m_area = 0.0;\n   m_perimeter = 0.0;\n   m_centroid = Point2f(0,0);\n   for (size_t i = 0; i < size(); i++) {\n      Point2f& p1 = at(i);\n      Point2f& p2 = at((i+1)%size());\n      double a_i = (p1.x * p2.y - p2.x * p1.y) / 2.0;\n      m_area += a_i;\n      a_i /= 6.0;\n      m_centroid.x += (p1.x+p2.x) * a_i;\n      m_centroid.y += (p1.y+p2.y) * a_i;\n      Point2f side = p2 - p1;\n      m_perimeter += side.length();\n   }\n   m_type &= ~SHAPE_CCW;\n   if (sgn(m_area) == 1) {\n      m_type |= SHAPE_CCW;\n   }\n   m_centroid.scale(2.0/m_area); // note, *not* fabs(m_area) as it is then confused by clockwise ordered shapes\n   m_area = fabs(m_area);\n   if (isOpen()) {\n      // take off the automatically collected final side\n      Point2f side = tail() - head();\n      m_perimeter -= side.length();\n   }\n}\n\nvoid ShapeMap::setDisplayedAttribute(int col) const\n{\n   if (!m_invalidate && m_displayed_attribute == col) {\n      return;\n   }\n   m_displayed_attribute = col;\n   m_invalidate = true;\n\n   // always override at this stage:\n   m_attributes.setDisplayColumn(m_displayed_attribute,true);\n\n   m_invalidate = false;\n}\n\nvoid ShapeMap::shapePixelBorder(pmap<int,int>& relations, int polyref, int side, PixelRef currpix, PixelRef minpix, bool first)\n{\n   if (!first && currpix == minpix && side == ShapeRef::SHAPE_L) {\n      // looped:\n      return;\n   }\n   size_t rel = relations.searchindex(currpix);\n   if (relations[rel] & side) {\n      m_pixel_shapes[currpix.x][currpix.y].search(polyref).m_tags |= side;\n      relations[rel] &= ~side;   // <- clear to check all have been done later\n      side <<= 1;\n      if (side > ShapeRef::SHAPE_T) {\n         side = ShapeRef::SHAPE_L;\n      }\n      shapePixelBorder(relations,polyref,side,currpix,minpix,false);\n   }\n   else {\n      currpix.move( moveDir(side) );\n      side >>= 1;\n      if (side < ShapeRef::SHAPE_L) {\n         side = ShapeRef::SHAPE_T;\n      }\n      shapePixelBorder(relations,polyref,side,currpix,minpix,false);\n   }\n}\n\nbool SalaShape::read(std::ifstream& stream, int version)\n{\n   // defaults\n   m_draworder = -1;\n   m_selected = false;\n\n   stream.read((char *)&m_type,sizeof(m_type));\n\n   int sss = sizeof(m_region);\n   stream.read((char *)&m_region,sizeof(m_region));\n\n   if (version >= VERSION_SHAPE_CENTROIDS) {\n      stream.read((char *)&m_centroid,sizeof(m_centroid));\n      if (version >= VERSION_SHAPE_AREA_PERIMETER) {\n         stream.read((char *)&m_area,sizeof(m_area));\n         stream.read((char *)&m_perimeter,sizeof(m_perimeter));\n      }\n   }\n   else {\n      // old types were simply 1,2,3... these are now labelled using bits:\n      if (m_type == 3) {\n         m_type = SHAPE_POLY;\n      }\n      else if (m_type == 4) {\n         m_type = SHAPE_POLY | SHAPE_CLOSED;\n      }\n   }\n   pqvector<Point2f>::read(stream);\n\n   if (version < VERSION_SHAPE_AREA_PERIMETER) {\n      if (m_type & SHAPE_POLY) {\n         setCentroidAreaPerim();\n      }\n      else if (m_type & SHAPE_LINE) {\n         m_perimeter = m_region.length();\n      }\n   }\n\n   return true;\n}\n\nint ShapeMap::moveDir(int side)\n{\n   int dir;\n   switch (side)\n   {\n   case ShapeRef::SHAPE_L:\n      dir = PixelRef::NEGHORIZONTAL;\n      break;\n   case ShapeRef::SHAPE_B:\n      dir = PixelRef::NEGVERTICAL;\n      break;\n   case ShapeRef::SHAPE_R:\n      dir = PixelRef::HORIZONTAL;\n      break;\n   case ShapeRef::SHAPE_T:\n      dir = PixelRef::VERTICAL;\n      break;\n   }\n   return dir;\n}\n// n.b., only works from current selection (and uses point selected attribute)\n\nint ShapeMap::makeShapeFromPointSet(const PointMap& pointmap)\n{\n   bool bounds_good = true;\n   PixelRefVector selset;\n   Point2f offset = Point2f(pointmap.getSpacing()/2,pointmap.getSpacing()/2);\n   for (auto &sel: pointmap.getSelSet()) {\n      selset.push_back(sel);\n      if (!m_region.contains_touch(pointmap.depixelate(sel)-offset) || !m_region.contains_touch(pointmap.depixelate(sel)+offset)) {\n         bounds_good = false;\n      }\n   }\n   if (!bounds_good) {\n      QtRegion r(pointmap.getRegion().bottom_left - offset,pointmap.getRegion().top_right + offset);\n      init(m_shapes.size(),r);\n   }\n   pmap<int,int> relations;\n   for (size_t j = 0; j < selset.size(); j++) {\n      PixelRef pix = selset[j];\n      int x = relations.add(pix,ShapeRef::SHAPE_EDGE);\n      if (pointmap.includes(pix.right()) && pointmap.getPoint(pix.right()).selected()) {\n         relations.value(x) &= ~ShapeRef::SHAPE_R;\n      }\n      if (pointmap.includes(pix.up()) && pointmap.getPoint(pix.up()).selected()) {\n         relations.value(x) &= ~ShapeRef::SHAPE_T;\n      }\n      if (pointmap.includes(pix.down()) && pointmap.getPoint(pix.down()).selected()) {\n         relations.value(x) &= ~ShapeRef::SHAPE_B;\n      }\n      if (pointmap.includes(pix.left()) && pointmap.getPoint(pix.left()).selected()) {\n         relations.value(x) &= ~ShapeRef::SHAPE_L;\n      }\n   }\n   // now find pixel with SHAPE_B | SHAPE_L\n   PixelRef minpix = NoPixel;\n   size_t k;\n   for (k = 0; k < relations.size(); k++) {\n      if ((relations.value(k) & (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) == (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) {\n         if ((minpix == NoPixel) || (relations.key(k) < (int)minpix)) {\n            minpix = relations.key(k);\n         }\n      }\n   }\n   // now follow round anticlockwise...\n   SalaShape poly(SalaShape::SHAPE_POLY | SalaShape::SHAPE_CLOSED);\n   pointPixelBorder(pointmap,relations,poly,ShapeRef::SHAPE_L,minpix,minpix,true);\n\n   bool retvar = true;\n\n   for (k = 0; k < relations.size(); k++) {\n      if (relations[k] != 0) {\n         // more than one shape!\n         return -1;\n      }\n   }\n   poly.setCentroidAreaPerim();\n\n   m_shape_ref++;\n   int rowid = m_shapes.add(m_shape_ref,poly);\n\n   if (bounds_good) {\n      // note: also sets polygon bounding box:\n      makePolyPixels(m_shape_ref);\n   }\n   else {\n      // pixelate all polys in the pixel new structure:\n      for (size_t i = 0; i < m_shapes.size(); i++) {\n         makePolyPixels(m_shapes.key(i));\n      }\n   }\n\n   m_attributes.insertRow(m_shape_ref);\n   m_newshape = true;\n\n   return m_shape_ref;\n}\n\n// the replacement for datalayers\n\nShapeMap::ShapeMap(const std::string& name, int type) : m_attributes(name)\n{\n   m_name = name;\n   m_map_type = type;\n   m_hasgraph = false;\n\n   // shape and object counters\n   m_obj_ref = -1;\n   m_shape_ref = -1;\n   // pixel map\n   m_pixel_shapes = NULL;\n   //\n   // -1 is the shape ref column (which will be shown by default)\n   m_displayed_attribute = -1;\n   m_display_shapes = NULL;\n   m_invalidate = false;\n   // for polygons:\n   m_show_lines = true;\n   m_show_fill = true;\n   m_show_centroids = false;\n\n   // data (MUST be set before use)\n   m_tolerance = 0.0;\n\n   m_selection = false;\n\n   // note show is\n   m_show = true;\n   m_editable = false;\n\n   m_bsp_tree = false;\n   m_bsp_root = NULL;\n   //\n   m_mapinfodata = NULL;\n}\n\nShapeMap::~ShapeMap()\n{\n   if (m_bsp_root) {\n      delete m_bsp_root;\n      m_bsp_root = NULL;\n   }\n   if (m_pixel_shapes) {\n      for (int i = 0; i < m_cols; i++) {\n         delete [] m_pixel_shapes[i];\n      }\n      delete [] m_pixel_shapes;\n      m_pixel_shapes = NULL;\n   }\n   if (m_display_shapes) {\n      delete [] m_display_shapes;\n      m_display_shapes = NULL;\n   }\n   if (m_mapinfodata) {\n      delete m_mapinfodata;\n      m_mapinfodata = NULL;\n   }\n}\n\nPoint2f ShapeMap::pointOffset(const PointMap& pointmap, int currpix, int side)\n{\n   Point2f p;\n   switch (side)\n   {\n   case ShapeRef::SHAPE_L:\n      p = Point2f(-pointmap.getSpacing()/2,0.0);\n      break;\n   case ShapeRef::SHAPE_B:\n      p = Point2f(0.0,-pointmap.getSpacing()/2);\n      break;\n   case ShapeRef::SHAPE_R:\n      p = Point2f(pointmap.getSpacing()/2,0.0);\n      break;\n   case ShapeRef::SHAPE_T:\n      p = Point2f(0.0,pointmap.getSpacing()/2);\n      break;\n   }\n   return p;\n}\n\n// note that this is almost exactly the same as shapePixelBorder\nvoid ShapeMap::pointPixelBorder(const PointMap& pointmap, pmap<int,int>& relations, SalaShape& poly, int side, PixelRef currpix, PixelRef minpix, bool first)\n{\n   if (!first && currpix == minpix && side == ShapeRef::SHAPE_L) {\n      // looped:\n      return;\n   }\n   size_t rel = relations.searchindex(currpix);\n   if (relations[rel] & side) {\n      poly.push_back(pointmap.depixelate(currpix)+pointOffset(pointmap,currpix,side));\n      relations[rel] &= ~side;   // <- clear to check all have been done later\n      side <<= 1;\n      if (side > ShapeRef::SHAPE_T) {\n         side = ShapeRef::SHAPE_L;\n      }\n      pointPixelBorder(pointmap,relations,poly,side,currpix,minpix,false);\n   }\n   else {\n      currpix.move( moveDir(side) );\n      side >>= 1;\n      if (side < ShapeRef::SHAPE_L) {\n         side = ShapeRef::SHAPE_T;\n      }\n      pointPixelBorder(pointmap,relations,poly,side,currpix,minpix,false);\n   }\n}\n\nbool ShapeMap::clearSel()\n{\n   // note, only clear if need be, as m_attributes.deselectAll is slow\n   if (m_selection_set.size()) {\n      m_attributes.deselectAll();\n      m_selection = false;\n      for (auto& sel: m_selection_set) {\n         m_shapes.value(sel).m_selected = false;\n      }\n      m_selection_set.clear();\n   }\n   return true;\n}\n\n// this can be reinit as well\n\nvoid ShapeMap::init(int size, const QtRegion &r)\n{\n   if (m_pixel_shapes) {\n      for (int i = 0; i < m_cols; i++) {\n         delete [] m_pixel_shapes[i];\n      }\n      delete [] m_pixel_shapes;\n      m_pixel_shapes = NULL;\n   }\n   if (m_display_shapes) {\n      delete [] m_display_shapes;\n      m_display_shapes = NULL;\n   }\n   m_rows = std::min(std::max(20,(int)sqrt((double)size)),32768);\n   m_cols = std::min(std::max(20,(int)sqrt((double)size)),32768);\n   if (m_region.atZero()) {\n      m_region = r;\n   }\n   else {\n      m_region = runion(m_region,r);\n   }\n   // calculate geom data:\n   m_tolerance = std::max(m_region.width(), m_region.height()) * TOLERANCE_A;\n   //\n   m_pixel_shapes = new pqvector<ShapeRef> *[m_cols];\n   for (int i = 0; i < m_cols; i++) {\n      m_pixel_shapes[i] = new pqvector<ShapeRef>[m_rows];\n   }\n}\n\nint ShapeMap::makeLineShape(const Line& line, bool through_ui, bool tempshape)\n{\n   // note, map must have editable flag on if we are to make a shape through the user interface:\n   if (through_ui && !m_editable) {\n      return -1;\n   }\n\n   bool bounds_good = true;\n\n   if (!(m_region.contains_touch(line.start()) && m_region.contains_touch(line.end()))) {\n      bounds_good = false;\n      init(m_shapes.size(),line);\n   }\n\n   m_shape_ref++;\n   // note, shape constructor sets centroid, length etc\n   int rowid = m_shapes.add(m_shape_ref,SalaShape(line));\n\n   if (bounds_good) {\n      // note: also sets polygon bounding box:\n      makePolyPixels(m_shape_ref);\n   }\n   else {\n      // pixelate all polys in the pixel new structure:\n      for (size_t i = 0; i < m_shapes.size(); i++) {\n         makePolyPixels(m_shapes.key(i));\n      }\n   }\n\n   if (!tempshape) {\n      m_attributes.insertRow(m_shape_ref);\n      m_newshape = true;\n   }\n\n   if (through_ui) {\n      //\n      // manually add connections:\n      if (m_hasgraph) {\n         if (isAxialMap()) {\n            connectIntersected(rowid,true); // \"true\" means line-line intersections only will be applied\n         }\n         else {\n            connectIntersected(rowid,false);\n         }\n      }\n      // if through ui, set undo counter:\n      m_undobuffer.push_back(SalaEvent(SalaEvent::SALA_CREATED,m_shape_ref));\n      // update displayed attribute if through ui:\n      invalidateDisplayedAttribute();\n      setDisplayedAttribute(m_displayed_attribute);\n   }\n\n   return m_shape_ref;\n}\n// code to add intersections when shapes are added to the graph one by one:\nint ShapeMap::connectIntersected(int rowid, bool linegraph)\n{\n   int shaperef = m_shapes.key(rowid);\n   int conn_col = m_attributes.getOrInsertColumnIndex(\"Connectivity\");\n   m_attributes.setColumnLock(conn_col);\n   int leng_col = -1;\n   if (linegraph) {\n      // historically line length has always been added at this point\n      leng_col = m_attributes.getOrInsertLockedColumnIndex(\"Line Length\");\n   }\n   // all indices should match... this grows connectors if necessary to same length as shapes\n   while (m_connectors.size() < m_shapes.size()) {\n      m_connectors.push_back( Connector() );\n   }\n   int connectivity = linegraph ?\n      getLineConnections( shaperef, m_connectors[rowid].m_connections, TOLERANCE_B*std::max(m_region.height(),m_region.width())) :\n      getShapeConnections( shaperef, m_connectors[rowid].m_connections, TOLERANCE_B*std::max(m_region.height(),m_region.width()));\n   m_attributes.setValue(rowid, conn_col, (float) connectivity );\n   if (linegraph) {\n      m_attributes.setValue(rowid, leng_col, (float) m_shapes[rowid].getLength() );\n   }\n   // now go through our connections, and add ourself:\n   for (size_t k = 0; k < m_connectors[rowid].m_connections.size(); k++) {\n      int myplace = m_connectors[rowid].m_connections[k];\n      if (myplace != rowid) { // <- exclude self!\n         m_connectors[myplace].m_connections.add(rowid);\n         m_attributes.incrValue(myplace,conn_col);\n      }\n   }\n   return connectivity;\n}\n// this assumes this is a line map (to speed up axial map creation)\n// use the other version, getShapeConnections for arbitrary shape-shape connections\n// note, connections are listed by rowid in list, *not* reference number\n// (so they may vary: must be checked carefully when shapes are removed / added)\nint ShapeMap::getLineConnections(int lineref, pvecint& connections, double tolerance)\n{\n   SalaShape& poly = m_shapes.search(lineref);\n   if (!poly.isLine()) {\n      return 0;\n   }\n   const Line& l = poly.getLine();\n\n   pvecint testedshapes;\n\n   // As of version 10, self-connections are *not* added\n   // In the past:\n   // <exclude> it's useful to have yourself in your connections list\n   // (apparently! -- this needs checking, as most of the time it is then checked to exclude self again!) </exclude>\n   // <exclude> connections.add(m_shapes.searchindex(lineref)); </exclude>\n\n   testedshapes.add(lineref);\n\n   int num_intersections = 0;\n\n   PixelRefVector list = pixelateLine( l );\n\n   for (size_t i = 0; i < list.size(); i++) {\n      pqvector<ShapeRef>& shapes = m_pixel_shapes[ list[i].x ][ list[i].y ];\n      for (size_t j = 0; j < shapes.size(); j++) {\n         ShapeRef& shape = shapes[j];\n         if (testedshapes.searchindex(shape.m_shape_ref) != paftl::npos) {\n            continue;\n         }\n         testedshapes.add(shape.m_shape_ref,paftl::ADD_HERE);\n         if ((shape.m_tags & ShapeRef::SHAPE_OPEN) == ShapeRef::SHAPE_OPEN) {\n            try {\n               const Line& line = m_shapes.search(shape.m_shape_ref).getLine();\n               if ( intersect_region(line, l, line.length() * tolerance) ) {\n                  // n.b. originally this followed the logic that we must normalise intersect_line properly: tolerance * line length one * line length two\n                  // in fact, works better if it's just line.length() * tolerance...\n                  if ( intersect_line(line, l, line.length() * tolerance) ) {\n                     connections.add(m_shapes.searchindex(shape.m_shape_ref));\n                     num_intersections++;\n                  }\n               }\n            }\n            catch (pexception) {\n               // the lineref may have been deleted -- this is supposed to be tidied up\n               // just ignore...\n            }\n         }\n      }\n   }\n\n   return num_intersections;\n}\n\n// this is only problematic as there is lots of legacy code with shape-in-shape testing,\nint ShapeMap::getShapeConnections(int shaperef, pvecint& connections, double tolerance)\n{\n   // In versions prior to 10, note that unlike getLineConnections, self-connection is excluded by all of the following functions\n   // As of version 10, both getShapeConnections and getLineConnections exclude self-connection\n\n   size_t index = m_shapes.searchindex(shaperef);\n   if (index != paftl::npos) {\n      SalaShape& shape = m_shapes[index];\n      if (shape.isPoint()) {\n         // a point is simple, it never intersects itself:\n         pointInPolyList(shape.getPoint(),connections);\n      }\n      else if (shape.isPolygon()) {\n         // a closed poly is actually quite simple too as we already have code using a polyref:\n         polyInPolyList(shaperef,connections,tolerance);\n      }\n      else if (shape.isLine()) {\n         // line is a bit slow because there's no tested shape as in getLineConnections, but similar:\n         lineInPolyList(shape.getLine(),connections,shaperef,tolerance);\n      }\n      else if (shape.isPolyLine()) {\n         // this is the worst for efficiency: potential for many possible retries of the same shape:\n         for (size_t i = 1; i < shape.size() - 1; i++) {\n            Line li(shape[i-1], shape[i]);\n            lineInPolyList(li,connections,shaperef,tolerance);\n         }\n      }\n   }\n\n   return connections.size();\n}\n\n// similar to above, but builds a list\n\nvoid ShapeMap::pointInPolyList(const Point2f& p, pvecint& shapeindexlist) const\n{\n   if (!m_region.contains(p)) {\n      return ;\n   }\n   pvecint testedshapes;\n   PixelRef pix = pixelate(p);\n   pqvector<ShapeRef> &shapes = m_pixel_shapes[pix.x][pix.y];\n   for (size_t i = 0; i < shapes.size(); i++) {\n      const ShapeRef& shape = shapes[i];\n      if (testedshapes.searchindex(shape.m_shape_ref) != paftl::npos) {\n         continue;\n      }\n      testedshapes.add(shape.m_shape_ref,paftl::ADD_HERE);\n\n      int shapeindex = testPointInPoly(p,shape);\n\n      // if there's a shapeindex, then add (note it is an add -- you may be passed a list again to expand)\n      if (shapeindex != -1) {\n         shapeindexlist.add(shapeindex);\n      }\n   }\n}\n\n// note, lineref is only used as an \"exclude self\" test when called from getShapeConnections\nvoid ShapeMap::lineInPolyList(const Line& li_orig, pvecint& shapeindexlist, int lineref, double tolerance) const\n{\n   if (!intersect_region(m_region,li_orig)) {\n      return;\n   }\n   Line li = li_orig;\n   if (!m_region.contains(li.start()) || !m_region.contains(li.end())) {\n      li.crop(m_region);\n   }\n\n   pointInPolyList(li.start(),shapeindexlist);\n   pointInPolyList(li.end(),shapeindexlist);\n\n   // only now pixelate and test for any other shapes:\n   PixelRefVector list = pixelateLine(li);\n   for (size_t i = 0; i < list.size(); i++) {\n      PixelRef pix = list[i];\n      if (includes(pix)) {\n         pqvector<ShapeRef>& shapes = m_pixel_shapes[pix.x][pix.y];\n         for (size_t j = 0; j < shapes.size(); j++) {\n            const ShapeRef& shape = shapes[j];\n            // slow to do this as it can repeat -- really need to use a linetest like structure to avoid retest of\n            // polygon lines\n            if (shape.m_shape_ref != lineref && shape.m_tags & (ShapeRef::SHAPE_EDGE | ShapeRef::SHAPE_INTERNAL_EDGE | ShapeRef::SHAPE_OPEN)) {\n               const SalaShape& poly = m_shapes.search(shape.m_shape_ref);\n               switch (poly.m_type & (SalaShape::SHAPE_LINE | SalaShape::SHAPE_POLY)) {\n               case SalaShape::SHAPE_LINE:\n                  if (intersect_region(li,poly.m_region)) {\n                     // note: in this case m_region is stored as a line:\n                     if (intersect_line(li,poly.m_region,tolerance)) {\n                        shapeindexlist.add(m_shapes.searchindex(shape.m_shape_ref));\n                     }\n                  }\n                  break;\n               case SalaShape::SHAPE_POLY:\n                  {\n                     for (int k = 0; k < shape.m_polyrefs.size(); k++) {\n                        Line lineb = Line(poly[shape.m_polyrefs[k]],poly[((shape.m_polyrefs[k]+1)%poly.size())]);\n                        if (intersect_region(li,lineb)) {\n                           if (intersect_line(li,lineb,tolerance)) {\n                              shapeindexlist.add(m_shapes.searchindex(shape.m_shape_ref));\n                           }\n                        }\n                     }\n                  }\n                  break;\n               default:\n                  break;\n               }\n            }\n         }\n      }\n   }\n}\n\nvoid ShapeMap::polyInPolyList(int polyref, pvecint& shapeindexlist, double tolerance) const\n{\n   size_t index = m_shapes.searchindex(polyref);\n   if (index == paftl::npos) {\n      return;\n   }\n   const SalaShape& poly = m_shapes[index];\n   if (poly.isClosed()) { // <- it ought to be, you shouldn't be using this function if not!\n      pvecint testedlist;\n      // easiest just to use scan lines to find internal pixels rather than trace a complex border:\n      PixelRef minpix = pixelate(poly.m_region.bottom_left);\n      PixelRef maxpix = pixelate(poly.m_region.top_right);\n      // pass one: shape centre of either object coincident automatically adds\n      int x;\n      for (x = minpix.x; x <= maxpix.x; x++) {\n         for (int y = minpix.y; y <= maxpix.y; y++) {\n            size_t pos = m_pixel_shapes[x][y].searchindex(polyref);\n            if (pos != paftl::npos) {\n               pqvector<ShapeRef>& shaperefs = m_pixel_shapes[x][y];\n               // this has us in it, now looked through everything else:\n               for (size_t i = 0; i < shaperefs.size(); i++) {\n                  ShapeRef& shaperef = shaperefs[i];\n                  if (i != pos && ((shaperefs[pos].m_tags & ShapeRef::SHAPE_CENTRE) || (shaperef.m_tags & ShapeRef::SHAPE_CENTRE))) {\n                     if (testedlist.add(shaperef.m_shape_ref) != -1) {\n                        shapeindexlist.add(m_shapes.searchindex(shaperef.m_shape_ref));\n                     }\n                  }\n               }\n            }\n         }\n      }\n      // that was the easy bit... now, pass 2, for non centre things:\n      for (x = minpix.x; x <= maxpix.x; x++) {\n         for (int y = minpix.y; y <= maxpix.y; y++) {\n            size_t pos = m_pixel_shapes[x][y].searchindex(polyref);\n            if (pos != paftl::npos) {\n               pqvector<ShapeRef>& shaperefs = m_pixel_shapes[x][y];\n               ShapeRef& shaperef = shaperefs[pos];\n               if ((shaperef.m_tags & ShapeRef::SHAPE_CENTRE) == 0) {\n                  // this has us in it, now looked through everything else:\n                  for (size_t i = 0; i < shaperefs.size(); i++) {\n                     ShapeRef& shaperefb = shaperefs[i];\n                     if (i != pos && testedlist.searchindex(shaperefb.m_shape_ref) == paftl::npos) {\n                        size_t indexb = m_shapes.searchindex(shaperefb.m_shape_ref);\n                        const SalaShape& polyb = m_shapes[indexb];\n                        if (polyb.isPoint()) {\n                           if (testPointInPoly(polyb.getPoint(),shaperef) != -1) {\n                              shapeindexlist.add((int)indexb);\n                           }\n                        }\n                        else if (polyb.isLine()) {\n                           if (testPointInPoly(polyb.getLine().start(),shaperef) != -1 || testPointInPoly(polyb.getLine().end(),shaperef) != -1) {\n                              testedlist.add(shaperefb.m_shape_ref,paftl::ADD_HERE);\n                              shapeindexlist.add((int)indexb);\n                           }\n                           else {\n                              for (int k = 0; k < shaperef.m_polyrefs.size(); k++) {\n                                 Line line = Line(poly[shaperef.m_polyrefs[k]],poly[((shaperef.m_polyrefs[k]+1)%poly.size())]);\n                                 if (intersect_region(line,polyb.getLine())) {\n                                    if (intersect_line(line,polyb.getLine(),tolerance)) {\n                                       testedlist.add(shaperefb.m_shape_ref,paftl::ADD_HERE);\n                                       shapeindexlist.add((int)indexb);\n                                       break;\n                                    }\n                                 }\n                              }\n                           }\n                        }\n                        else if (polyb.isPolyLine()) {\n                           if (testPointInPoly(polyb[shaperefb.m_polyrefs[0]],shaperef) != -1)  {\n                              testedlist.add(shaperefb.m_shape_ref,paftl::ADD_HERE);\n                              shapeindexlist.add(indexb);\n                           }\n                           else {\n                              for (int k = 0; k < shaperef.m_polyrefs.size(); k++) {\n                                 for (int kk = 0; kk < shaperefb.m_polyrefs.size(); kk++) {\n                                    Line line = Line(poly[shaperef.m_polyrefs[k]],poly[((shaperef.m_polyrefs[k]+1)%poly.size())]);\n                                    Line lineb = Line(polyb[shaperefb.m_polyrefs[kk]],polyb[((shaperefb.m_polyrefs[kk]+1)%polyb.size())]);\n                                    if (intersect_region(line,lineb)) {\n                                       if (intersect_line(line,lineb,tolerance)) {\n                                          if (testedlist.add(shaperefb.m_shape_ref) != -1) {\n                                             shapeindexlist.add(indexb);\n                                             break;\n                                          }\n                                       }\n                                    }\n                                 }\n                              }\n                           }\n                        }\n                        else {\n                           // poly to poly, ick!\n                           // first test one entirely inside the other\n                           // any point at all will suffice to check this: however, we need to check that the polyref point *itself* is within the\n                           // pixel, not just part of the line associated with it...\n                           if ((pixelate(polyb[shaperefb.m_polyrefs[0]]) == PixelRef(x,y) && testPointInPoly(polyb[shaperefb.m_polyrefs[0]],shaperef) != -1) ||\n                               (pixelate(poly[shaperef.m_polyrefs[0]]) == PixelRef(x,y) && testPointInPoly(poly[shaperef.m_polyrefs[0]],shaperefb) != -1))  {\n                              testedlist.add(shaperefb.m_shape_ref,paftl::ADD_HERE);\n                              shapeindexlist.add(indexb);\n                           }\n                           else {\n                              // now check crossing\n                              bool breakit = false;\n                              for (int k = 0; k < shaperef.m_polyrefs.size() && !breakit; k++) {\n                                 for (int kk = 0; kk < shaperefb.m_polyrefs.size(); kk++) {\n                                    Line line = Line(poly[shaperef.m_polyrefs[k]],poly[((shaperef.m_polyrefs[k]+1)%poly.size())]);\n                                    Line lineb = Line(polyb[shaperefb.m_polyrefs[kk]],polyb[((shaperefb.m_polyrefs[kk]+1)%polyb.size())]);\n                                    if (intersect_region(line,lineb)) {\n                                       if (intersect_line(line,lineb,tolerance)) {\n                                          testedlist.add(shaperefb.m_shape_ref,paftl::ADD_HERE);\n                                          shapeindexlist.add(indexb);\n                                          breakit = true;\n                                          break;\n                                       }\n                                    }\n                                 }\n                              }\n                           }\n                        }\n                     }\n                  }\n               }\n            }\n         }\n      }\n\n   }\n   else {\n      throw depthmapX440::RuntimeException(\"this function is to be used for polygons only\");\n   }\n}\n\n// helper for point in poly --\n// currently needs slight rewrite to avoid problem if point is in line with a vertex\n// (counter incremented twice on touching implies not in poly when is)\n\nint ShapeMap::testPointInPoly(const Point2f& p, const ShapeRef& shape) const\n{\n   size_t shapeindex = paftl::npos;\n   // simplist: in shape centre\n   if (shape.m_tags & ShapeRef::SHAPE_CENTRE) {\n      shapeindex = m_shapes.searchindex(shape.m_shape_ref);\n   }\n   // check not an open shape (cannot be inside)\n   else if ((shape.m_tags & ShapeRef::SHAPE_OPEN) == 0) {\n      const SalaShape& poly = m_shapes.search(shape.m_shape_ref);\n      if (poly.m_region.contains_touch(p)) {\n         // next simplest, on the outside border:\n         int alpha = 0;\n         int counter = 0;\n         int parity = 0;\n         if (shape.m_tags & ShapeRef::SHAPE_EDGE) {\n            // run a test line to the edge:\n            if (shape.m_tags & (ShapeRef::SHAPE_L | ShapeRef::SHAPE_R)) {\n               if (shape.m_tags & ShapeRef::SHAPE_L) {\n                  parity = -1;\n               }\n               else if (shape.m_tags & ShapeRef::SHAPE_R) {\n                  parity = +1;\n               }\n               for (int j = 0; j < shape.m_polyrefs.size(); j++) {\n                  Line lineb = Line(poly[shape.m_polyrefs[j]],poly[((shape.m_polyrefs[j]+1)%poly.size())]);\n                  if (lineb.bottom_left.y <= p.y && lineb.top_right.y >= p.y) {\n                     // crosses or touches... but we need to check\n                     // touching exception:\n                     if (lineb.t_start().y == p.y) {\n                        if (parity * lineb.t_start().x >= parity * p.x) {\n                           alpha -= 1;\n                           counter++;\n                        }\n                     }\n                     // the other touching exception\n                     else if (lineb.t_end().y == p.y) {\n                        if (parity * lineb.t_end().x >= parity * p.x) {\n                           alpha += 1;\n                           // n.b., no counter here\n                        }\n                     }\n                     // at this stage we know the line isn't horizontal, so we can find the intersection point:\n                     else if (parity * (lineb.grad(XAXIS)*(p.y-lineb.ay()) + lineb.ax()) >= parity * p.x) {\n                        counter++;\n                     }\n                  }\n               }\n            }\n            else {\n               if (shape.m_tags & ShapeRef::SHAPE_B) {\n                  parity = -1;\n               }\n               else if (shape.m_tags & ShapeRef::SHAPE_T) {\n                  parity = +1;\n               }\n               for (int j = 0; j < shape.m_polyrefs.size(); j++) {\n                  Line lineb = Line(poly[shape.m_polyrefs[j]],poly[((shape.m_polyrefs[j]+1)%poly.size())]);\n                  if (lineb.bottom_left.x <= p.x && lineb.top_right.x >= p.x) {\n                     // crosses or touches... but we need to check\n                     // touching exception:\n                     if (lineb.top_right.x == p.x) {\n                        if (parity * lineb.by() >= parity * p.y) {\n                           alpha -= 1;\n                           counter++;\n                        }\n                     }\n                     // the other touching exception\n                     else if (lineb.bottom_left.x == p.x) {\n                        if (parity * lineb.ay() >= parity * p.y) {\n                           alpha += 1;\n                           // n.b., no counter here\n                        }\n                     }\n                     // at this stage we know the line isn't vertical, so we can find the intersection point:\n                     else if (parity * (lineb.grad(YAXIS)*(p.x-lineb.ax()) + lineb.ay()) >= parity * p.y) {\n                        counter++;\n                     }\n                  }\n               }\n            }\n            if (counter % 2 != 0 && alpha == 0) {\n               shapeindex = m_shapes.searchindex(shape.m_shape_ref);\n            }\n         }\n         // and now the pig -- it's somewhere in the middle of the poly:\n         else if (shape.m_tags & ShapeRef::SHAPE_INTERNAL_EDGE) {\n            pvecint testnodes;\n            size_t j;\n            for (j = 0; j < size_t(shape.m_polyrefs.size()); j++) { // <- note, polyrefs is a subvec and has maximum number according to sizeof(T)\n               testnodes.add(shape.m_polyrefs[j]);\n            }\n            PixelRef pix2 = pixelate(p);\n            // bit of code duplication like this, but easier on params to this function:\n            pix2.move(PixelRef::NEGVERTICAL); // move pix2 down, search for this shape...\n            size_t nextindex = m_pixel_shapes[pix2.x][pix2.y].searchindex(shape.m_shape_ref);\n            while (nextindex != paftl::npos) {\n               const ShapeRef& shape2 = m_pixel_shapes[pix2.x][pix2.y][nextindex];\n               for (int k = 0; k < shape2.m_polyrefs.size(); k++) {\n                  testnodes.add(shape2.m_polyrefs[k]);\n               }\n               pix2.move(PixelRef::NEGVERTICAL); // move pix2 down, search for this shape...\n               if (includes(pix2)) {\n                  nextindex = m_pixel_shapes[pix2.x][pix2.y].searchindex(shape.m_shape_ref);\n               }\n               else {\n                  nextindex = paftl::npos;\n               }\n            }\n            int alpha = 0;\n            int counter = 0;\n            int parity = -1;\n            for (j = 0; j < testnodes.size(); j++) {\n               Line lineb = Line(poly[testnodes[j]],poly[((testnodes[j]+1)%poly.size())]);\n               if (lineb.bottom_left.x <= p.x && lineb.top_right.x >= p.x) {\n                  // crosses or touches... but we need to check\n                  // touching exception:\n                  if (lineb.top_right.x == p.x) {\n                     if (parity * lineb.by() >= parity * p.y) {\n                        alpha -= 1;\n                        counter++;\n                     }\n                  }\n                  // the other touching exception\n                  else if (lineb.bottom_left.x == p.x) {\n                     if (parity * lineb.ay() >= parity * p.y) {\n                        alpha += 1;\n                        // n.b., no counter here\n                     }\n                  }\n                  // at this stage we know the line isn't vertical, so we can find the intersection point:\n                  else if (parity * (lineb.grad(YAXIS)*(p.x-lineb.ax()) + lineb.ay()) >= parity * p.y) {\n                     counter++;\n                  }\n               }\n            }\n            if (counter % 2 != 0 && alpha == 0) {\n               shapeindex = m_shapes.searchindex(shape.m_shape_ref);\n            }\n         }\n      }\n   }\n   return (shapeindex == paftl::npos) ? -1 : int(shapeindex); // note convert to -1\n}\n\nbool ShapeMap::write(std::ostream &stream, int version )\n{\n   // name\n   dXstring440::writeString(stream, m_name);\n\n   stream.write( (char *) &m_map_type, sizeof(m_map_type));\n   stream.write( (char *) &m_show, sizeof(m_show) );\n   stream.write( (char *) &m_editable, sizeof(m_editable) );\n\n   // PixelBase write\n   // write extents:\n   stream.write( (char *) &m_region, sizeof(m_region) );\n   // write rows / cols\n   stream.write( (char *) &m_rows, sizeof(m_rows) );\n   stream.write( (char *) &m_cols, sizeof(m_cols) );\n\n   // write next object ref to be used:\n   stream.write((char *) &m_obj_ref, sizeof(m_obj_ref));\n   stream.write((char *) &m_shape_ref, sizeof(m_shape_ref));\n\n   // write shape data\n   int count = m_shapes.size();\n   stream.write((char *) &count, sizeof(count));\n   for (int j = 0; j < count; j++) {\n      int key = m_shapes.key(j);\n      stream.write((char *) &key, sizeof(key));\n      m_shapes.value(j).write(stream);\n   }\n   // write object data (currently unused)\n   count = m_objects.size();\n   stream.write((char *) &count, sizeof(count));\n   for (int k = 0; k < count; k++) {\n      int key = m_objects.key(k);\n      stream.write((char *) &key, sizeof(key));\n      m_objects.value(k).write(stream);\n   }\n   // write attribute data\n   m_attributes.write(stream,version);\n   stream.write((char *)&m_displayed_attribute,sizeof(m_displayed_attribute));\n\n   // write connections data\n   count = m_connectors.size();\n   stream.write((char *)&count,sizeof(count));\n\n   for (int i = 0; i < count; i++) {\n      m_connectors[i].write(stream);\n   }\n   m_links.write(stream);\n   m_unlinks.write(stream);\n\n   // some miscellaneous extra data for mapinfo files\n   if (m_mapinfodata) {\n      stream.put('m');\n      m_mapinfodata->write(stream);\n   }\n   else {\n      stream.put('x');\n   }\n\n   return true;\n}\n\nbool SalaShape::write(std::ostream &stream)\n{\n   stream.write((char *)&m_type,sizeof(m_type));\n   stream.write((char *)&m_region,sizeof(m_region));\n   stream.write((char *)&m_centroid,sizeof(m_centroid));\n   stream.write((char *)&m_area,sizeof(m_area));\n   stream.write((char *)&m_perimeter,sizeof(m_perimeter));\n   pqvector<Point2f>::write(stream);\n   return true;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/shapemap.h",
    "content": "#pragma once\n\n#include \"mgraph440/pixelbase.h\"\n#include \"mgraph440/mapinfodata.h\"\n#include \"mgraph440/attributes.h\"\n#include \"mgraph440/connector.h\"\n#include \"mgraph440/paftl.h\"\n#include \"mgraph440/mgraph_consts.h\"\n#include \"mgraph440/stringutils.h\"\n#include \"mgraph440/bspnode.h\"\n\nnamespace mgraph440 {\n\nclass SalaShape : public pqvector<Point2f>\n{\npublic:\n   enum {SHAPE_POINT = 0x01, SHAPE_LINE = 0x02, SHAPE_POLY = 0x04, SHAPE_CIRCLE = 0x08, SHAPE_TYPE = 0x0f, SHAPE_CLOSED = 0x40, SHAPE_CCW = 0x80 };\n   friend class ShapeMap;\n\n   unsigned char m_type;\n   Point2f m_centroid; // centre of mass, but also used as for point if object is a point\n   Line m_region; // bounding box, but also used as a line if object is a line, hence type\n   double m_area;\n   double m_perimeter;\n   // these are all temporary data which are recalculated on reload\n   mutable bool m_selected;\n   mutable float m_color;\n   mutable int m_draworder;\n\n   SalaShape(unsigned char type = 0)\n   { m_type = type; m_draworder = -1; m_selected = false; m_area = 0.0; m_perimeter = 0.0; }\n   SalaShape(const Point2f& point)\n   { m_type = SHAPE_POINT; m_draworder = -1; m_selected = false; m_region = Line(point,point); m_centroid = point; m_area = 0.0; m_perimeter = 0.0; }\n   SalaShape(const Line& line)\n   { m_type = SHAPE_LINE; m_draworder = -1; m_selected = false; m_region = line; m_centroid = m_region.getCentre(); m_area = 0.0; m_perimeter = m_region.length(); }\n   //\n   bool isOpen() const\n   { return (m_type & SHAPE_CLOSED) == 0; }\n   bool isClosed() const\n   { return (m_type & SHAPE_CLOSED) == SHAPE_CLOSED; }\n   bool isPoint() const\n   { return (m_type == SHAPE_POINT); }\n   bool isLine() const\n   { return (m_type == SHAPE_LINE); }\n   bool isPolyLine() const\n   { return (m_type & (SHAPE_POLY | SHAPE_CLOSED)) == SHAPE_POLY; }\n   bool isPolygon() const\n   { return (m_type & (SHAPE_POLY | SHAPE_CLOSED)) == (SHAPE_POLY | SHAPE_CLOSED); }\n//   bool isCCW() const\n//   { return (m_type & SHAPE_CCW) == SHAPE_CCW; }\n//   //\n   const Point2f& getPoint() const\n   { return m_centroid; }\n   const Line& getLine() const\n   { return m_region; }\n//   const QtRegion& getBoundingBox() const\n//   { return m_region; }\n//   //\n//   double getArea() const\n//   { return m_area; }\n//   double getPerimeter() const\n//   { return m_perimeter; }\n//   // duplicate function, but easier to understand naming convention\n   double getLength() const\n   { return m_perimeter; }\n//   //\n   void setCentroidAreaPerim();\n//   void setCentroid(const Point2f& p);\n//   // duplicate function, but easier to understand naming convention\n//   const Point2f& getCentroid() const\n//   { return m_centroid; }\n//   //\n//   double getAngDev() const;\n//   //\n//   pqvector<SalaEdgeU> getClippingSet(QtRegion& clipframe) const;\n//   //\n   bool read(std::ifstream& stream, int version);\n   bool write(std::ostream& stream);\n};\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass SalaObject : public pvecint\n{\n   friend class ShapeMap;\nprotected:\n   Point2f m_centroid;\npublic:\n   SalaObject() {;}\n   //\n   bool read(std::ifstream& stream, int version);\n   bool write(std::ostream& stream);\n};\ninline bool SalaObject::read(std::ifstream& stream, int)\n{\n   stream.read((char *)&m_centroid,sizeof(m_centroid));\n   pvecint::read(stream);\n   return true;\n}\ninline bool SalaObject::write(std::ostream& stream)\n{\n   stream.write((char *)&m_centroid,sizeof(m_centroid));\n   pvecint::write(stream);\n   return true;\n}\nstruct SalaEvent\n{\n   enum { SALA_NULL_EVENT, SALA_CREATED, SALA_DELETED, SALA_MOVED };\n   int m_action;\n   int m_shape_ref;\n   SalaShape m_geometry;\n   SalaEvent(int action = SALA_NULL_EVENT, int shape_ref = -1) { m_action = action; m_shape_ref = shape_ref; }\n};\n\nstruct ShapeRef\n{\n   enum {SHAPE_REF_NULL = 0xFFFFFFFF};\n   enum {SHAPE_L = 0x01, SHAPE_B = 0x02, SHAPE_R = 0x04, SHAPE_T = 0x08 };\n   enum {SHAPE_EDGE = 0x0f, SHAPE_INTERNAL_EDGE = 0x10, SHAPE_CENTRE = 0x20, SHAPE_OPEN = 0x40 };\n   unsigned char m_tags;\n   unsigned int m_shape_ref;\n   psubvec<short> m_polyrefs;\n   ShapeRef( unsigned int sref = SHAPE_REF_NULL, unsigned char tags = 0x00 )\n      { m_shape_ref = sref; m_tags = tags; }\n   friend bool operator == (const ShapeRef& a, const ShapeRef& b);\n   friend bool operator != (const ShapeRef& a, const ShapeRef& b);\n   friend bool operator < (const ShapeRef& a, const ShapeRef& b);\n   friend bool operator > (const ShapeRef& a, const ShapeRef& b);\n};\ninline bool operator == (const ShapeRef& a, const ShapeRef& b)\n{ return a.m_shape_ref == b.m_shape_ref; }\ninline bool operator != (const ShapeRef& a, const ShapeRef& b)\n{ return a.m_shape_ref != b.m_shape_ref; }\ninline bool operator < (const ShapeRef& a, const ShapeRef& b)\n{ return a.m_shape_ref < b.m_shape_ref; }\ninline bool operator > (const ShapeRef& a, const ShapeRef& b)\n{ return a.m_shape_ref > b.m_shape_ref; }\n\nclass ShapeMap : public PixelBase\n{\npublic:\n    ShapeMap(const std::string& name = std::string(),int type = EMPTYMAP);\n    virtual ~ShapeMap();\n\n    enum {EMPTYMAP = 0x0000, SEGMENTMAP = 0x0040, AXIALMAP = 0x0020, ALLLINEMAP = 0x0010, DRAWINGMAP = 0x0001, DATAMAP = 0x0002};\n    int m_map_type;\n    std::string m_name;\n    bool m_show;              // used when shape map is a drawing layer\n    bool m_editable;\n    bool m_selection;\n    mutable BSPNode *m_bsp_root;\n    mutable bool m_bsp_tree;\n    // quick grab for shapes\n    pqvector<ShapeRef> **m_pixel_shapes;    // i rows of j columns\n    // for screen drawing\n    mutable int *m_display_shapes;\n    pqmap<int,SalaShape> m_shapes;\n    pqmap<int,SalaObject> m_objects;   // THIS IS UNUSED! Meant for each object to have many shapes\n    prefvec<SalaEvent> m_undobuffer;\n    AttributeTable m_attributes;\n    // for graph functionality\n    // Note: this list is stored PACKED for optimal performance on graph analysis\n    // ALWAYS check it is in the same order as the shape list and attribute table\n    prefvec<Connector> m_connectors;\n    int m_shape_ref;\n    pqvector<OrderedIntPair> m_links;\n    pqvector<OrderedIntPair> m_unlinks;\n    double m_tolerance;\n    int m_obj_ref;\n    mutable bool m_invalidate;\n    mutable int m_displayed_attribute;\n    MapInfoData *m_mapinfodata;\n    std::set<int> m_selection_set;   // note: uses rowids not keys\n    mutable bool m_show_lines;\n    mutable bool m_show_fill;\n    mutable bool m_show_centroids;\n    bool m_hasgraph;\n    mutable bool m_newshape;   // if a new shape has been added\n\n    void makePolyPixels(int shaperef);\n    // required for PixelBase, have to implement your own version of pixelate\n    PixelRef pixelate( const Point2f& p, bool constrain = true, int = 1) const;\n    const std::string& getName() const\n       { return m_name; }\n    bool read( std::ifstream& stream, int version, bool drawinglayer = false );\n    bool write( std::ostream& stream, int version );\n    void invalidateDisplayedAttribute()\n       { m_invalidate = true; }\n    void setDisplayedAttribute( int col ) const;\n    void shapePixelBorder(pmap<int,int>& relations, int shaperef, int side, PixelRef currpix, PixelRef minpix, bool first);\n    int moveDir(int side);\n    // convert a selected pixels to a layer object (note, uses selection attribute on pixel, you must select to make this work):\n    int makeShapeFromPointSet(const PointMap& pointmap);\n    AttributeTable& getAttributeTable()\n       { return m_attributes; }\n    // use set displayed attribute instead unless you are deliberately changing the column order:\n    void overrideDisplayedAttribute(int attribute)\n    { m_displayed_attribute = attribute; }\n    const prefvec<Connector>& getConnections() const\n    { return m_connectors; }\n    bool isSegmentMap() const\n    { return m_map_type == SEGMENTMAP; }\n    void pointPixelBorder(const PointMap& pointmap, pmap<int,int>& relations, SalaShape& shape, int side, PixelRef currpix, PixelRef minpix, bool first);\n    bool clearSel();\n    void init(int size, const QtRegion& r);\n    Point2f pointOffset(const PointMap& pointmap, int currpix, int side);\n    int makeLineShape(const Line& line, bool through_ui = false, bool tempshape = false);\n    bool isAxialMap() const\n    { return m_map_type == ALLLINEMAP || m_map_type == AXIALMAP; }\n    // Connect a particular shape into the graph\n    int connectIntersected(int rowid, bool linegraph);\n    // Get the connections for a particular line\n    int getLineConnections(int lineref, pvecint& connections, double tolerance);\n    // Get arbitrary shape connections for a particular shape\n    int getShapeConnections(int polyref, pvecint& connections, double tolerance);\n    // retrieve lists of polys point intersects:\n    void pointInPolyList(const Point2f& p, pvecint& shapeindexlist) const;\n    void lineInPolyList(const Line& li, pvecint& shapeindexlist, int lineref = -1, double tolerance = 0.0) const;\n    void polyInPolyList(int polyref, pvecint& shapeindexlist, double tolerance = 0.0) const;\n    // helper to make actual test of point in shape:\n    int testPointInPoly(const Point2f& p, const ShapeRef& shape) const;\n};\n\n// Quick mod - TV\ntemplate <class T>\nclass ShapeMaps : public /*protected*/ prefvec<T>\n{\npublic:\n   size_t m_displayed_map;\n   ShapeMaps() { m_displayed_map = paftl::npos;}\n   virtual ~ShapeMaps() {;}\n   //\n   size_t addMap(const std::string& name, int type);\n   void setDisplayedMapRef(size_t map);\n   // Quick mod - TV\n   T& getMap(size_t index)\n   { return prefvec<T>::at(index); }\n   size_t getMapRef(const std::string& name) const;\n   bool read( std::ifstream& stream, int version );\n   bool write(::std::ostream &stream, int version, bool displayedmaponly = false );\n};\ntemplate <class T>\nvoid ShapeMaps<T>::setDisplayedMapRef(size_t map)\n{\n   if (m_displayed_map != paftl::npos && m_displayed_map != map)\n      prefvec<T>::at(m_displayed_map).clearSel();\n   m_displayed_map = map;\n}\ntemplate <class T>\nsize_t ShapeMaps<T>::addMap(const std::string& name, int type)\n{\n   ShapeMaps<T>::push_back(T(name,type));\n   setDisplayedMapRef(pmemvec<T*>::size()-1);\n   return (pmemvec<T*>::size()-1);\n}\ntemplate <class T>\nbool ShapeMaps<T>::read( std::ifstream& stream, int version )\n{\n    prefvec<T>::clear(); // empty existing data\n   // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\n   unsigned int displayed_map;\n   stream.read((char *)&displayed_map,sizeof(displayed_map));\n   m_displayed_map = size_t(displayed_map);\n   // read maps\n   // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\n   unsigned int count = 0;\n   stream.read((char *) &count, sizeof(count));\n   if (version < VERSION_NO_SHAPEMAP_NAME_LOOKUP) {\n      for (size_t i = 0; i < size_t(count); i++) {\n         // dummy name lookup (now simply creates on fly, as the name lookup may be corrupted in earlier versions)\n         std::string name = dXstring440::readString(stream);\n         int number;\n         stream.read((char *)&number,sizeof(number));\n      }\n   }\n   for (size_t j = 0; j < size_t(count); j++) {\n      ShapeMaps<T>::push_back(T());\n      prefvec<T>::tail().read(stream,version);\n   }\n   return true;\n}\ntemplate <class T>\nbool ShapeMaps<T>::write( ::std::ostream& stream, int version, bool displayedmaponly )\n{\n   if (!displayedmaponly) {\n      // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\n      unsigned int displayed_map = (unsigned int)(m_displayed_map);\n      stream.write((char *)&displayed_map,sizeof(displayed_map));\n      // write maps\n      // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\n      unsigned int count = (unsigned int) pmemvec<T*>::size();\n      stream.write((char *) &count, sizeof(count));\n      for (size_t j = 0; j < count; j++) {\n         prefvec<T>::at(j).write(stream,version);\n      }\n   }\n   else {\n      unsigned int dummy;\n      // displayed map is 0\n      dummy = 0;\n      stream.write((char *)&dummy,sizeof(dummy));\n      // count is 1\n      dummy = 1;\n      stream.write((char *)&dummy,sizeof(dummy));\n      // write map:\n      prefvec<T>::at(m_displayed_map).write(stream,version);\n   }\n   return true;\n}\ntemplate <class T>\nsize_t ShapeMaps<T>::getMapRef(const std::string& name) const\n{\n   // note, only finds first map with this name\n   for (size_t i = 0; i < pmemvec<T*>::size(); i++) {\n      if (prefvec<T>::at(i).getName() == name)\n         return i;\n   }\n   return -1;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/spacepix.cpp",
    "content": "#include \"mgraph440/spacepix.h\"\n\nnamespace mgraph440 {\n\nPixelRef SpacePixel::pixelate( const Point2f& p, bool constrain, int ) const\n{\n   PixelRef r;\n\n   Point2f p1 = p;\n   p1.normalScale(m_region);\n\n   r.x = short(p1.x * double(m_cols-1e-9));\n   if (constrain) {\n      if (r.x >= m_cols)\n         r.x = m_cols - 1;\n      else if (r.x < 0)\n         r.x = 0;\n   }\n   r.y = short(p1.y * double(m_rows-1e-9));\n   if (constrain) {\n      if (r.y >= m_rows)\n         r.y = m_rows - 1;\n      else if (r.y < 0)\n         r.y = 0;\n   }\n\n   return r;\n}\n\nbool SpacePixel::read( std::ifstream& stream, int version )\n{\n   // clear anything that was there:\n   if (m_pixel_lines)\n   {\n      for (int i = 0; i < m_cols; i++) {\n         delete [] m_pixel_lines[i];\n      }\n      delete [] m_pixel_lines;\n      m_pixel_lines = NULL;\n   }\n   if (m_display_lines) {\n      delete [] m_display_lines;\n      m_display_lines = NULL;\n   }\n   m_lines.clear();\n\n   // read name:\n   if (version >= VERSION_SPACEPIXELGROUPS) {\n      m_name = dXstring440::readString(stream );\n      stream.read( (char *) &m_show, sizeof(m_show) );\n   }\n   else {\n      m_name = \"<unknown>\";\n   }\n   if (m_name.empty()) {\n      m_name = \"<unknown>\";\n   }\n\n   m_edit = false; // <- just default to not editable on read\n\n   if (version >= VERSION_LAYERCOLORS) {\n      stream.read( (char *) &m_color, sizeof(m_color) );\n   }\n\n   // read extents:\n   stream.read( (char *) &m_region, sizeof(m_region) );\n\n   // read rows / cols\n   stream.read( (char *) &m_rows, sizeof(m_rows) );\n   stream.read( (char *) &m_cols, sizeof(m_cols) );\n\n   // could work these two out on the fly, but it's easier to have them stored:\n   //m_pixel_height = m_region.height() / double(m_rows);\n   //m_pixel_width  = m_region.width()  / double(m_cols);\n\n   // prepare loader:\n   m_pixel_lines = new pvecint *[m_cols];\n   for (int i = 0; i < m_cols; i++) {\n      m_pixel_lines[i] = new pvecint[m_rows];\n   }\n\n   if (version < VERSION_DYNAMICLINES) {\n      // read lines as refvec...\n      prefvec<Line> lines;\n      lines.read( stream );\n      // ... and transfer to new system:\n      m_ref = -1;\n      for (size_t i = 0; i < lines.size(); i++) {\n         m_lines.add(++m_ref, LineTest(lines[i],0));\n      }\n   }\n   else {\n      stream.read((char *) &m_ref, sizeof(m_ref));\n      m_lines.read( stream );\n   }\n\n   if (version < VERSION_SPACEPIXELGROUPS) {\n      // Scale up lines (should just work)\n      for (size_t i = 0; i < m_lines.size(); i++) {\n         m_lines[i].line.denormalScale(m_region);\n      }\n   }\n\n   // now load into structure:\n   for (size_t n = 0; n < m_lines.size(); n++) {\n\n      PixelRefVector list = pixelateLine( m_lines[n].line );\n\n      for (size_t m = 0; m < list.size(); m++) {\n         // note: m_pixel_lines is an *ordered* list! --- used by other ops.\n         m_pixel_lines[list[m].x][list[m].y].push_back( n );\n      }\n   }\n\n   return true;\n}\n\n}\n"
  },
  {
    "path": "mgraph440/spacepix.h",
    "content": "#pragma once\n\n#include \"mgraph440/shapemap.h\"\n#include \"mgraph440/pafcolor.h\"\n#include \"mgraph440/paftl.h\"\n#include \"mgraph440/p2dpoly.h\"\n\nnamespace mgraph440 {\n\nstruct LineTest {\n   Line line;\n   unsigned int test;\n   LineTest(const Line& l = Line(), int t = -1)\n   { line = l; test = t; }\n};\n\nclass SpacePixel : public PixelBase\n{\n   friend class PointMap;\n   friend class AxialMaps;\n   friend class AxialPolygons;\n   friend class ShapeMap; // for transfer to everything being ShapeMaps\npublic:\n//protected:\n   PafColor m_color;\n   std::string m_name;\n   bool m_show;\n   bool m_edit;\n   pvecint **m_pixel_lines;\n   int m_ref;\n   pmap<int,LineTest> m_lines;\n   //\n   // for screen drawing\n   mutable int *m_display_lines;\n   PixelRef pixelate( const Point2f& p, bool constrain = true, int = 1 ) const;\n   const pmap<int,LineTest>& getAllLines() const // Danger! Use solely to look at the raw line data\n      { return m_lines; }\n   std::string getName()\n      { return m_name; }\n   virtual bool read( std::ifstream& stream, int version );\n};\n\n// simply check they are the same name... useful for findindex from the group\ninline bool operator == (const SpacePixel& a, const SpacePixel& b)\n{\n   return a.m_name == b.m_name;\n}\n\ntemplate <class T>\nclass SpacePixelGroup : public pqvector<T>\n{\nprotected:\n   std::string m_name;   // <- file name\n   mutable int m_current_layer;\npublic:\n   QtRegion m_region;  // easier public for now\n   //\n   SpacePixelGroup(const std::string& name = std::string())\n   { m_name = name; m_current_layer = -1; }\n   void setName(const std::string& name)\n   { m_name = name; }\n   const std::string& getName() const\n   { return m_name; }\n   //\n   QtRegion& getRegion() const\n      { return (QtRegion&) m_region; }\n   //\n   // Screen functionality:\n   void makeViewportShapes( const QtRegion& viewport = QtRegion() ) const;\n   bool findNextShape(bool& nextlayer) const;\n\n   // Quick mod - TV\n#if 0\n#if !defined(_MSC_VER)\n   size_t size() const\n   { return pmemvec<T>::size(); }\n\n   T& at(size_t pos)\n   { return  prefvec<T>::at(pos); }\n\n   T& tail()\n   { return prefvec<T>::tail(); }\n\n#endif\n#endif\n\npublic:\n   bool read(std::ifstream& stream, int version, bool = true);\n   bool write(std::ostream &stream, int version );\n};\n\ntemplate <class T>\nbool SpacePixelGroup<T>::read( std::ifstream& stream, int version, bool )\n{\n   if (version >= VERSION_SPACEPIXELGROUPS) {\n      m_name = dXstring440::readString(stream);\n      stream.read( (char *) &m_region, sizeof(m_region) );\n      int count;\n      stream.read( (char *) &count, sizeof(count) );\n      for (int i = 0; i < count; i++) {\n         SpacePixelGroup<T>::push_back(T());\n         prefvec<T>::tail().read(stream,version,true);\n      }\n   }\n   else {\n      m_name = \"<unknown>\";\n      SpacePixelGroup<T>::push_back(T());\n      prefvec<T>::tail().read(stream,version,true);\n      m_region = prefvec<T>::tail().getRegion();\n   }\n   if (m_name.empty()) {\n      m_name = \"<unknown>\";\n   }\n   return true;\n}\n\ntemplate <class T>\nbool SpacePixelGroup<T>::write( std::ostream& stream, int version )\n{\n   dXstring440::writeString(stream, m_name);\n   stream.write( (char *) &m_region, sizeof(m_region) );\n\n   // Quick mod - TV\n   int count = prefvec<T>::size();\n   stream.write( (char *) &count, sizeof(count) );\n   for (int i = 0; i < count; i++) {\n      prefvec<T>::at(i).write(stream,version);\n   }\n   return true;\n}\ntypedef SpacePixelGroup < ShapeMap> SpacePixelFile;\ntypedef SpacePixelGroup<SpacePixelFile > SuperSpacePixel;\n\n}\n"
  },
  {
    "path": "mgraph440/stringutils.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"mgraph440/stringutils.h\"\n#include <sstream>\n#include <memory>\n#include <cstring>\n#include <algorithm>\n#include <ctype.h>\n\nnamespace dXstring440 {\n    std::vector<std::string> split(const std::string &s, char delim, bool skipEmptyTokens)\n    {\n        std::vector<std::string> elems;\n        std::stringstream ss;\n        ss.str(s);\n        std::string item;\n        while (std::getline(ss, item, delim))\n        {\n            if (skipEmptyTokens && item.empty())\n            {\n                continue;\n            }\n            elems.push_back(item);\n        }\n\n        return elems;\n    }\n\n    std::string readString(std::istream & stream)\n    {\n        unsigned int length;\n        stream.read(reinterpret_cast<char *>(&length), sizeof(length));\n        if ( length == 0)\n        {\n            return std::string();\n        }\n        std::string result( length, '\\0');\n        char *ptr  = &result[0];\n        stream.read(ptr, length);\n        return result;\n    }\n\n    void writeString(std::ostream &stream, const std::string &s)\n    {\n        unsigned int length = s.length();\n        stream.write(reinterpret_cast<char *>(&length), sizeof(unsigned int));\n        if (length > 0)\n        {\n            stream.write(s.data(), length);\n        }\n    }\n\n    std::string formatString(double value, const std::string &format)\n    {\n        std::vector<char> buffer(24 + format.length(), '\\0');\n        sprintf( &buffer[0], format.c_str(), value );\n        return std::string(&buffer[0]);\n    }\n\n    std::string formatString(int value, const std::string &format)\n    {\n        std::vector<char> buffer(24 + format.length(), '\\0');\n        sprintf( &buffer[0], format.c_str(), value );\n        return std::string(&buffer[0]);\n    }\n\n\n    std::string& toLower(std::string &str)\n    {\n        std::transform(str.begin(), str.end(), str.begin(), tolower);\n        return str;\n    }\n\n    // trim from start (in place)\n    void ltrim(std::string &s, char c) {\n        s.erase(s.begin(), std::find_if(s.begin(), s.end(), [&c](int ch) {\n            return ch != c;\n        }));\n    }\n\n    // trim from end (in place)\n    void rtrim(std::string &s, char c) {\n        s.erase(std::find_if(s.rbegin(), s.rend(), [&c](int ch) {\n            return ch != c;\n        }).base(), s.end());\n    }\n\n    void makeInitCaps(std::string &s)\n    {\n        bool literal = false;\n        bool reset = true;\n        for( auto& c : s)\n        {\n            if (!isalpha(c))\n            {\n                if ( c == '\"')\n                {\n                    literal = !literal;\n                }\n                reset = true;\n            }\n            else\n            {\n                if (!literal)\n                {\n                    if (reset)\n                    {\n                        c = toupper(c);\n                    }\n                    else\n                    {\n                        c = tolower(c);\n                    }\n                }\n                reset = false;\n            }\n        }\n    }\n\n    bool isDouble(const std::string &s)\n    {\n        // nasty const cast to satisfy the function signature - we will not change the value of endPtr\n        char *endPtr = const_cast<char *>(&s[0]);\n        strtod(s.c_str(), &endPtr);\n        return endPtr != &s[0];\n    }\n\n}\n"
  },
  {
    "path": "mgraph440/stringutils.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// Collection of utility functions that are required to add pstring functionality\n// to std::strings (i.e. splitting and compatible serialisation/deserialisation)\n#include <vector>\n#include <string>\n#include <istream>\n#include <ostream>\n\n#pragma once\nnamespace dXstring440 {\n    std::vector<std::string> split(const std::string &s, char delim, bool skipEmptyTokens = false);\n    std::string readString(std::istream & stream);\n    void writeString(std::ostream &stream, const std::string &s);\n    std::string formatString(double value, const std::string &format = \"%+.16le\");\n    std::string formatString(int value, const std::string &format = \"% 16d\");\n    /// Inplace conversion to lower case\n    std::string &toLower(std::string &str);\n    void ltrim(std::string &s, char c = ' ');\n    void rtrim(std::string &s, char c = ' ');\n    void makeInitCaps(std::string &s);\n    bool isDouble(const std::string &s);\n    template<class T> bool beginsWith(const T &input, const T match)\n    {\n        return input.size() >= match.size() &&\n                equal(match.begin(), match.end(), input.begin());\n    }\n\n\n}\n"
  },
  {
    "path": "mgraph440Test/CMakeLists.txt",
    "content": "set(mgraph440Test mgraph440Test)\nset(mgraph440Test_SRCS\n    main.cpp\n    testcontainers.cpp\n    testconverters.cpp)\n\nset(LINK_LIBS\n    salalib\n    mgraph440\n    genlib)\n\ninclude_directories(\"../ThirdParty/Catch\")\n\nadd_executable(${mgraph440Test} ${mgraph440Test_SRCS})\ntarget_link_libraries(${mgraph440Test} ${LINK_LIBS})\n"
  },
  {
    "path": "mgraph440Test/main.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n"
  },
  {
    "path": "mgraph440Test/testcontainers.cpp",
    "content": "// Copyright (C) 2018 Christian Sailer\n// Copyright (C) 2019 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n\n#include \"../cliTest/selfcleaningfile.h\"\n#include \"../genlib/containerutils.h\"\n#include \"../genlib/readwritehelpers.h\"\n#include \"../mgraph440/paftl.h\"\n\nusing namespace mgraph440;\n\ntemplate <typename T> void comparePvecAndStdVec(const pvector<T> &pvec, const std::vector<T> &stdVec) {\n    REQUIRE(pvec.size() == stdVec.size());\n    for (size_t i = 0; i < stdVec.size(); ++i) {\n        REQUIRE(pvec[i] == stdVec[i]);\n    }\n}\n\nTEST_CASE(\"Comaptibility between vector pvector streaming\") {\n    std::vector<int> intVec{1, 5, 34, -2, 5};\n    SelfCleaningFile intFile(\"integers.bin\");\n    {\n        std::ofstream outfile(intFile.Filename());\n        dXreadwrite::writeVector(outfile, intVec);\n    }\n\n    pvector<int> pveci;\n    {\n        std::ifstream infile(intFile.Filename());\n        pveci.read(infile);\n    }\n    comparePvecAndStdVec(pveci, intVec);\n\n    pvector<int> intPvec;\n    intPvec.push_back(324);\n    intPvec.push_back(-23);\n    intPvec.push_back(87764);\n    intPvec.push_back(-9);\n\n    {\n        std::ofstream outfile(intFile.Filename());\n        intPvec.write(outfile);\n    }\n\n    std::vector<int> copyVec;\n    {\n        std::ifstream infile(intFile.Filename());\n        dXreadwrite::readIntoVector(infile, copyVec);\n    }\n\n    comparePvecAndStdVec(intPvec, copyVec);\n}\n\ntemplate <typename K, typename V> void comparePmapAndStdMap(const pmap<K, V> &pMap, const std::map<K, V> &stdMap) {\n    const double EPSILON = 0.001;\n\n    REQUIRE(pMap.size() == stdMap.size());\n    for (size_t i = 0; i < stdMap.size(); ++i) {\n        REQUIRE(pMap.key(i) == depthmapX::getMapAtIndex(stdMap, i)->first);\n        REQUIRE(pMap.value(i) == Approx(double(depthmapX::getMapAtIndex(stdMap, i)->second)).epsilon(EPSILON));\n    }\n}\n\nTEST_CASE(\"Comaptibility between map pmap streaming\") {\n    std::map<int, float> intFloatMap;\n    intFloatMap.insert(std::make_pair(1, 0.1f));\n    intFloatMap.insert(std::make_pair(5, 5000.0f));\n    intFloatMap.insert(std::make_pair(34, -3.4f));\n    intFloatMap.insert(std::make_pair(-2, 0.2f));\n    intFloatMap.insert(std::make_pair(6, 0.6f));\n    SelfCleaningFile intFloatFile(\"intFloatMap.bin\");\n    {\n        std::ofstream outfile(intFloatFile.Filename());\n        dXreadwrite::writeMap(outfile, intFloatMap);\n    }\n\n    pmap<int, float> pmapi;\n    {\n        std::ifstream infile(intFloatFile.Filename());\n        pmapi.read(infile);\n    }\n    comparePmapAndStdMap(pmapi, intFloatMap);\n\n    pmap<int, float> intFloatPmap;\n    intFloatPmap.add(324, 0.2f);\n    intFloatPmap.add(-23, 14000);\n    intFloatPmap.add(87764, -0.102f);\n    intFloatPmap.add(-9, 0.00001f);\n\n    {\n        std::ofstream outfile(intFloatFile.Filename());\n        intFloatPmap.write(outfile);\n    }\n\n    std::map<int, float> copyMap;\n    {\n        std::ifstream infile(intFloatFile.Filename());\n        dXreadwrite::readIntoMap(infile, copyMap);\n    }\n\n    comparePmapAndStdMap(intFloatPmap, copyMap);\n}\n"
  },
  {
    "path": "mgraph440Test/testconverters.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"../mgraph440/legacyconverters.h\"\n#include \"catch.hpp\"\n\nTEST_CASE(\"vector conversion\") {\n    std::vector<int> vec{1, 4, 5};\n    mgraph440::pvector<int> result = genshim440::toPVector(vec);\n    REQUIRE(result.size() == 3);\n    REQUIRE(result[0] == 1);\n    REQUIRE(result[1] == 4);\n    REQUIRE(result[2] == 5);\n}\n"
  },
  {
    "path": "moduleTest/CMakeLists.txt",
    "content": "set(moduleTest moduleTest)\n\nset(moduleTest_SRCS\n    main.cpp)\n\ninclude_directories(\"../ThirdParty/Catch\" \"../ThirdParty/FakeIt\")\n\nset(modules_coreTest \"\" CACHE INTERNAL \"modules_coreTest\" FORCE)\nset(MODULES_GUI FALSE)\nset(MODULES_CLI FALSE)\nset(MODULES_CLI_TEST FALSE)\nset(MODULES_CORE FALSE)\nset(MODULES_CORE_TEST TRUE)\nadd_subdirectory(../modules modules)\n\nadd_executable(${moduleTest} ${moduleTest_SRCS})\ntarget_link_libraries(${moduleTest} salalib genlib mgraph440 ${modules_coreTest} ${modules_core})\n"
  },
  {
    "path": "moduleTest/main.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n"
  },
  {
    "path": "modules/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nfile(GLOB children \"*\")\nforeach(child ${children})\n    if(IS_DIRECTORY ${child} AND EXISTS ${child}/CMakeLists.txt)\n        add_subdirectory(${child})\n    endif()\nendforeach()\n"
  },
  {
    "path": "modules/segmentshortestpaths/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nif(MODULES_CORE)\nadd_subdirectory(core)\nendif()\n\nif(MODULES_GUI)\n  add_subdirectory(gui)\nendif()\n\nif(MODULES_CLI)\n  add_subdirectory(cli)\nendif()\n\nif(MODULES_CORE_TEST)\n    add_subdirectory(coreTest)\nendif()\n\nif(MODULES_CLI_TEST)\n    add_subdirectory(cliTest)\nendif()\n"
  },
  {
    "path": "modules/segmentshortestpaths/RegressionTest/regressionconfig.json",
    "content": "{\n    \"rundir\": \"rundir\",\n    \"basebinlocation\": \"../../BaselineBinaries\",\n    \"testbinlocation\": \"../../../build\",\n    \"testcases\": {\n        \"shortest_segment_metric_path\": [{\n            \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENTSHORTESTPATH\",\n            \"extraArgs\": {\n                \"-sspo\":\"531074,185526\",\n                \"-sspd\":\"534231,183853\",\n                \"-sspt\":\"metric\"\n            }\n        }],\n        \"shortest_segment_tulip_path\": [{\n            \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENTSHORTESTPATH\",\n            \"extraArgs\": {\n                \"-sspo\":\"531074,185526\",\n                \"-sspd\":\"534231,183853\",\n                \"-sspt\":\"tulip\"\n            }\n        }],\n        \"shortest_segment_topological_path\": [{\n            \"infile\": \"../../../testdata/barnsbury_extended1_segment.graph\",\n            \"outfile\": \"out.graph\",\n            \"mode\": \"SEGMENTSHORTESTPATH\",\n            \"extraArgs\": {\n                \"-sspo\":\"531074,185526\",\n                \"-sspd\":\"534231,183853\",\n                \"-sspt\":\"topological\"\n            }\n        }]\n    }\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/cli/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nset(segmentpathscli segmentpathscli)\nset(segmentpathscli_SRCS\n    segmentshortestpathparser.cpp)\n\nset(modules_cli \"${modules_cli}\" \"segmentpathscli\" CACHE INTERNAL \"modules_cli\" FORCE)\n\nadd_compile_definitions(SEGMENTPATHS_CLI_LIBRARY)\n\nadd_library(${segmentpathscli} OBJECT ${segmentpathscli_SRCS})\n"
  },
  {
    "path": "modules/segmentshortestpaths/cli/segmentshortestpathparser.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"segmentshortestpathparser.h\"\n#include \"depthmapXcli/exceptions.h\"\n#include \"depthmapXcli/parsingutils.h\"\n#include \"depthmapXcli/runmethods.h\"\n#include \"depthmapXcli/simpletimer.h\"\n#include \"modules/segmentshortestpaths/core/segmmetricshortestpath.h\"\n#include \"modules/segmentshortestpaths/core/segmtopologicalshortestpath.h\"\n#include \"modules/segmentshortestpaths/core/segmtulipshortestpath.h\"\n#include \"salalib/entityparsing.h\"\n#include <cstring>\n#include <sstream>\n\nusing namespace depthmapX;\n\nvoid SegmentShortestPathParser::parse(int argc, char **argv) {\n\n    std::string originPoint;\n    std::string destinationPoint;\n    for (int i = 1; i < argc; ++i) {\n        if (std::strcmp(\"-sspo\", argv[i]) == 0) {\n            if (!originPoint.empty()) {\n                throw CommandLineException(\"-sspo can only be provided once\");\n            }\n            ENFORCE_ARGUMENT(\"-sspo\", i)\n            if (!has_only_digits_dots_commas(argv[i])) {\n                std::stringstream message;\n                message << \"Invalid origin point provided (\" << argv[i]\n                        << \"). Should only contain digits dots and commas\" << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            originPoint = argv[i];\n        }\n        if (std::strcmp(\"-sspd\", argv[i]) == 0) {\n            if (!destinationPoint.empty()) {\n                throw CommandLineException(\"-sspd can only be provided once\");\n            }\n            ENFORCE_ARGUMENT(\"-sspd\", i)\n            if (!has_only_digits_dots_commas(argv[i])) {\n                std::stringstream message;\n                message << \"Invalid destination point provided (\" << argv[i]\n                        << \"). Should only contain digits dots and commas\" << std::flush;\n                throw CommandLineException(message.str().c_str());\n            }\n            destinationPoint = argv[i];\n        } else if (std::strcmp(\"-sspt\", argv[i]) == 0) {\n            ENFORCE_ARGUMENT(\"-sspt\", i)\n            if (std::strcmp(argv[i], \"tulip\") == 0) {\n                m_stepType = StepType::TULIP;\n            } else if (std::strcmp(argv[i], \"metric\") == 0) {\n                m_stepType = StepType::METRIC;\n            } else if (std::strcmp(argv[i], \"topological\") == 0) {\n                m_stepType = StepType::TOPOLOGICAL;\n            } else {\n                throw CommandLineException(std::string(\"Invalid step type: \") + argv[i]);\n            }\n        }\n    }\n\n    if (originPoint.empty() || destinationPoint.empty()) {\n        throw CommandLineException(\"Both -sspo and -sspd must be provided\");\n    }\n\n    std::stringstream pointsStream;\n    pointsStream << \"x,y\";\n    pointsStream << \"\\n\" << originPoint;\n    pointsStream << \"\\n\" << destinationPoint;\n    std::vector<Point2f> parsed = EntityParsing::parsePoints(pointsStream, ',');\n    m_originPoint = parsed[0];\n    m_destinationPoint = parsed[1];\n\n    if (m_stepType == StepType::NONE) {\n        throw CommandLineException(\"Step depth type (-sspt) must be provided\");\n    }\n}\n\nvoid SegmentShortestPathParser::run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const {\n    auto mGraph = dm_runmethods::loadGraph(clp.getFileName().c_str(), perfWriter);\n\n    std::cout << \"ok\\nSelecting cells... \" << std::flush;\n\n    auto graphRegion = mGraph->getRegion();\n\n    if (!graphRegion.contains(m_originPoint)) {\n        throw depthmapX::RuntimeException(\"Origin point outside of target region\");\n    }\n    if (!graphRegion.contains(m_destinationPoint)) {\n        throw depthmapX::RuntimeException(\"Destination point outside of target region\");\n    }\n    QtRegion r(m_originPoint, m_originPoint);\n    mGraph->setCurSel(r, false);\n\n    r = QtRegion(m_destinationPoint, m_destinationPoint);\n    mGraph->setCurSel(r, true);\n\n    std::cout << \"ok\\nCalculating shortest path... \" << std::flush;\n\n    std::unique_ptr<Communicator> comm(new ICommunicator());\n\n    switch (m_stepType) {\n    case SegmentShortestPathParser::StepType::TULIP: {\n        DO_TIMED(\"Calculating tulip shortest path\",\n                 SegmentTulipShortestPath(mGraph->getDisplayedShapeGraph()).run(comm.get()))\n        break;\n    }\n    case SegmentShortestPathParser::StepType::METRIC: {\n        DO_TIMED(\"Calculating metric shortest path\",\n                 SegmentMetricShortestPath(mGraph->getDisplayedShapeGraph()).run(comm.get()))\n        break;\n    }\n    case SegmentShortestPathParser::StepType::TOPOLOGICAL: {\n        DO_TIMED(\"Calculating topological shortest path\",\n                 SegmentTopologicalShortestPath(mGraph->getDisplayedShapeGraph()).run(comm.get()))\n        break;\n    }\n    default: {\n        throw depthmapX::SetupCheckException(\"Error, unsupported step type\");\n    }\n    }\n\n    std::cout << \" ok\\nWriting out result...\" << std::flush;\n    DO_TIMED(\"Writing graph\", mGraph->write(clp.getOuputFile().c_str(), METAGRAPH_VERSION, false))\n    std::cout << \" ok\" << std::endl;\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/cli/segmentshortestpathparser.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapXcli/imodeparser.h\"\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n\nclass SegmentShortestPathParser : public IModeParser {\n  public:\n    SegmentShortestPathParser() : m_stepType(StepType::NONE) {}\n\n    virtual std::string getModeName() const { return \"SEGMENTSHORTESTPATH\"; }\n\n    virtual std::string getHelp() const {\n        return \"Mode options for pointmap SEGMENTSHORTESTPATH are:\\n\"\n               \"  -sspo <shortest path origin point> point where to calculate shortest path between.\\n\"\n               \"  -sspd <shortest path destination point> point where to calculate shortest path between.\\n\"\n               \"  -sspt <type> step type. One of metric, tulip or topological.\\n\";\n    }\n\n    enum class StepType { NONE, TULIP, METRIC, TOPOLOGICAL };\n\n    virtual void parse(int argc, char **argv);\n\n    virtual void run(const CommandLineParser &clp, IPerformanceSink &perfWriter) const;\n\n    Point2f getShortestPathOrigin() const { return m_originPoint; }\n    Point2f getShortestPathDestination() const { return m_destinationPoint; }\n\n    StepType getStepType() const { return m_stepType; }\n\n  private:\n    Point2f m_originPoint;\n    Point2f m_destinationPoint;\n\n    StepType m_stepType;\n};\n"
  },
  {
    "path": "modules/segmentshortestpaths/cliTest/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nset(segmentpathsclitest segmentpathsclitest)\nset(segmentpathsclitest_SRCS\n    segmentshortestpathparsertest.cpp)\n\nset(modules_cliTest \"${modules_cliTest}\" \"segmentpathsclitest\" CACHE INTERNAL \"modules_cliTest\" FORCE)\n\nadd_compile_definitions(SEGMENTPATHS_CLI_TEST_LIBRARY)\n\nadd_library(${segmentpathsclitest} OBJECT ${segmentpathsclitest_SRCS})\n"
  },
  {
    "path": "modules/segmentshortestpaths/cliTest/segmentshortestpathparsertest.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"cliTest/argumentholder.h\"\n#include \"cliTest/selfcleaningfile.h\"\n#include \"modules/segmentshortestpaths/cli/segmentshortestpathparser.h\"\n#include <catch.hpp>\n\nTEST_CASE(\"SegmentShortestPathParser\", \"Error cases\") {\n    SECTION(\"Missing argument to -sspo\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\", \"-sspd\", \"0,0\", \"-sspo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sspo requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -sspd\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\", \"-sspo\", \"0,0\", \"-sspd\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sspd requires an argument\"));\n    }\n\n    SECTION(\"Missing argument to -sspt\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\", \"-sspo\", \"0,0\", \"-sspd\", \"0,0\", \"-sspt\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"-sspt requires an argument\"));\n    }\n\n    SECTION(\"rubbish input to -sspo\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\", \"-sspd\", \"0,0\", \"-sspo\", \"foo\"};\n        REQUIRE_THROWS_WITH(\n            parser.parse(ah.argc(), ah.argv()),\n            Catch::Contains(\"Invalid origin point provided (foo). Should only contain digits dots and commas\"));\n    }\n\n    SECTION(\"rubbish input to -sspd\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\", \"-sspo\", \"0,0\", \"-sspd\", \"foo\"};\n        REQUIRE_THROWS_WITH(\n            parser.parse(ah.argc(), ah.argv()),\n            Catch::Contains(\"Invalid destination point provided (foo). Should only contain digits dots and commas\"));\n    }\n\n    SECTION(\"rubbish input to -sspt\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\", \"-sspo\", \"0,0\", \"-sspd\", \"0,0\", \"-sspt\", \"foo\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()), Catch::Contains(\"Invalid step type: foo\"));\n    }\n\n    SECTION(\"Neiter points nor point file provided\") {\n        SegmentShortestPathParser parser;\n        ArgumentHolder ah{\"prog\"};\n        REQUIRE_THROWS_WITH(parser.parse(ah.argc(), ah.argv()),\n                            Catch::Contains(\"Both -sspo and -sspd must be provided\"));\n    }\n}\n\nTEST_CASE(\"Successful SegmentShortestPathParser\", \"Read successfully\") {\n    SegmentShortestPathParser parser;\n    double originX = 1.0;\n    double originY = 2.0;\n    double destinationX = 1.1;\n    double destinationY = 1.2;\n\n    SECTION(\"Read from commandline\") {\n        std::stringstream originStream;\n        originStream << originX << \",\" << originY << std::flush;\n        std::stringstream destinationStream;\n        destinationStream << destinationX << \",\" << destinationY << std::flush;\n\n        ArgumentHolder ah{\"prog\",  \"-sspo\",      originStream.str(), \"-sspd\", destinationStream.str(),\n                          \"-sspt\", \"topological\"};\n        parser.parse(ah.argc(), ah.argv());\n    }\n\n    auto originPoint = parser.getShortestPathOrigin();\n    auto destinationPoint = parser.getShortestPathDestination();\n    REQUIRE(originPoint.x == Approx(originX));\n    REQUIRE(originPoint.y == Approx(originY));\n    REQUIRE(destinationPoint.x == Approx(destinationX));\n    REQUIRE(destinationPoint.y == Approx(destinationY));\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nset(segmentpathscore segmentpathscore)\nset(segmentpathscore_SRCS\n    segmmetricshortestpath.cpp\n    segmtopologicalshortestpath.cpp\n    segmtulipshortestpath.cpp)\n\nset(modules_core \"${modules_core}\" \"segmentpathscore\" CACHE INTERNAL \"modules_core\" FORCE)\n\nadd_compile_definitions(SEGMENTPATHS_CORE_LIBRARY)\n\nadd_library(${segmentpathscore} OBJECT ${segmentpathscore_SRCS})\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/segmmetricshortestpath.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"segmmetricshortestpath.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentMetricShortestPath::run(Communicator *) {\n\n    AttributeTable &attributes = m_map.getAttributeTable();\n    int shapeCount = m_map.getShapeCount();\n\n    bool retvar = true;\n\n    int dist_col = attributes.insertOrResetColumn(\"Metric Shortest Path Distance\");\n    int path_col = attributes.insertOrResetColumn(\"Metric Shortest Path Order\");\n\n    // record axial line refs for topological analysis\n    std::vector<int> axialrefs;\n    // quick through to find the longest seg length\n    std::vector<float> seglengths;\n    float maxseglength = 0.0f;\n    for (size_t cursor = 0; cursor < shapeCount; cursor++) {\n        AttributeRow &row = m_map.getAttributeRowFromShapeIndex(cursor);\n        axialrefs.push_back(row.getValue(\"Axial Line Ref\"));\n        seglengths.push_back(row.getValue(\"Segment Length\"));\n        if (seglengths.back() > maxseglength) {\n            maxseglength = seglengths.back();\n        }\n    }\n\n    int maxbin = 512;\n\n    std::vector<unsigned int> seen(shapeCount, 0xffffffff);\n    std::vector<TopoMetSegmentRef> audittrail(shapeCount);\n    std::vector<int> list[512]; // 512 bins!\n    int open = 0;\n\n    auto &selected = m_map.getSelSet();\n    if (selected.size() != 2) {\n        return false;\n    }\n    int refFrom = *selected.begin();\n    int refTo = *selected.rbegin();\n\n    seen[refFrom] = 0;\n    open++;\n    double length = seglengths[refFrom];\n    audittrail[refFrom] = TopoMetSegmentRef(refFrom, Connector::SEG_CONN_ALL, length * 0.5, -1);\n    // better to divide by 511 but have 512 bins...\n    list[(int(floor(0.5 + 511 * length / maxseglength))) % 512].push_back(refFrom);\n    m_map.getAttributeRowFromShapeIndex(refFrom).setValue(dist_col, 0);\n\n    unsigned int segdepth = 0;\n    int bin = 0;\n\n    std::map<unsigned int, unsigned int> parents;\n    bool refFound = false;\n\n    while (open != 0 && !refFound) {\n        while (list[bin].empty()) {\n            bin++;\n            segdepth += 1;\n            if (bin == maxbin) {\n                bin = 0;\n            }\n        }\n        //\n        TopoMetSegmentRef &here = audittrail[list[bin].back()];\n        list[bin].pop_back();\n        open--;\n        // this is necessary using unsigned ints for \"seen\", as it is possible to add a node twice\n        if (here.done) {\n            continue;\n        } else {\n            here.done = true;\n        }\n\n        Connector &axline = m_map.getConnections().at(here.ref);\n        int connected_cursor = -2;\n\n        auto iter = axline.m_back_segconns.begin();\n        bool backsegs = true;\n\n        while (connected_cursor != -1) {\n            if (backsegs && iter == axline.m_back_segconns.end()) {\n                iter = axline.m_forward_segconns.begin();\n                backsegs = false;\n            }\n            if (!backsegs && iter == axline.m_forward_segconns.end()) {\n                break;\n            }\n\n            connected_cursor = iter->first.ref;\n            if (seen[connected_cursor] > segdepth) {\n                float length = seglengths[connected_cursor];\n                seen[connected_cursor] = segdepth;\n                audittrail[connected_cursor] =\n                    TopoMetSegmentRef(connected_cursor, here.dir, here.dist + length, here.ref);\n                parents[connected_cursor] = here.ref;\n                // puts in a suitable bin ahead of us...\n                open++;\n                //\n                // better to divide by 511 but have 512 bins...\n                list[(bin + int(floor(0.5 + 511 * length / maxseglength))) % 512].push_back(connected_cursor);\n                AttributeRow &row = m_map.getAttributeRowFromShapeIndex(connected_cursor);\n                row.setValue(dist_col, here.dist + length * 0.5);\n            }\n            if (connected_cursor == refTo) {\n                refFound = true;\n                break;\n            }\n            iter++;\n        }\n    }\n\n    auto refToParent = parents.find(refTo);\n    int counter = 0;\n    while (refToParent != parents.end()) {\n        AttributeRow &row = m_map.getAttributeRowFromShapeIndex(refToParent->first);\n        row.setValue(path_col, counter);\n        counter++;\n        refToParent = parents.find(refToParent->second);\n    }\n    m_map.getAttributeRowFromShapeIndex(refFrom).setValue(path_col, counter);\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        AttributeRow &row = iter->getRow();\n        if (row.getValue(path_col) < 0) {\n            row.setValue(dist_col, -1);\n        } else {\n            row.setValue(path_col, counter - row.getValue(path_col));\n        }\n    }\n\n    m_map.overrideDisplayedAttribute(-2);\n    m_map.setDisplayedAttribute(path_col);\n\n    return retvar;\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/segmmetricshortestpath.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/segmmodules/segmhelpers.h\"\n\n#include \"salalib/ianalysis.h\"\n\nclass SegmentMetricShortestPath : public IAnalysis {\n  private:\n    ShapeGraph &m_map;\n\n  public:\n    SegmentMetricShortestPath(ShapeGraph &map) : m_map(map) {}\n    std::string getAnalysisName() const override { return \"Metric Shortest Path\"; }\n    bool run(Communicator *) override;\n};\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/segmtopologicalshortestpath.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"segmtopologicalshortestpath.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentTopologicalShortestPath::run(Communicator *comm) {\n\n    AttributeTable &attributes = m_map.getAttributeTable();\n    int shapeCount = m_map.getShapeCount();\n\n    bool retvar = true;\n\n    int depth_col = attributes.insertOrResetColumn(\"Topological Shortest Path Depth\");\n    int path_col = attributes.insertOrResetColumn(\"Topological Shortest Path Order\");\n\n    // record axial line refs for topological analysis\n    std::vector<int> axialrefs;\n    // quick through to find the longest seg length\n    std::vector<float> seglengths;\n    float maxseglength = 0.0f;\n    for (size_t cursor = 0; cursor < shapeCount; cursor++) {\n        AttributeRow &row = m_map.getAttributeRowFromShapeIndex(cursor);\n        axialrefs.push_back(row.getValue(\"Axial Line Ref\"));\n        seglengths.push_back(row.getValue(\"Segment Length\"));\n        if (seglengths.back() > maxseglength) {\n            maxseglength = seglengths.back();\n        }\n    }\n\n    int maxbin = 2;\n\n    std::vector<unsigned int> seen(shapeCount, 0xffffffff);\n    std::vector<TopoMetSegmentRef> audittrail(shapeCount);\n    std::vector<int> list[512]; // 512 bins!\n    int open = 0;\n\n    auto &selected = m_map.getSelSet();\n    if (selected.size() != 2) {\n        return false;\n    }\n    int refFrom = *selected.begin();\n    int refTo = *selected.rbegin();\n\n    seen[refFrom] = 0;\n    open++;\n    double length = seglengths[refFrom];\n    audittrail[refFrom] = TopoMetSegmentRef(refFrom, Connector::SEG_CONN_ALL, length * 0.5, -1);\n    list[0].push_back(refFrom);\n    m_map.getAttributeRowFromShapeIndex(refFrom).setValue(depth_col, 0);\n\n    unsigned int segdepth = 0;\n    int bin = 0;\n\n    std::map<unsigned int, unsigned int> parents;\n    bool refFound = false;\n\n    while (open != 0) {\n        while (list[bin].empty()) {\n            bin++;\n            segdepth += 1;\n            if (bin == maxbin) {\n                bin = 0;\n            }\n        }\n        //\n        TopoMetSegmentRef &here = audittrail[list[bin].back()];\n        list[bin].pop_back();\n        open--;\n        // this is necessary using unsigned ints for \"seen\", as it is possible to add a node twice\n        if (here.done) {\n            continue;\n        } else {\n            here.done = true;\n        }\n\n        Connector &axline = m_map.getConnections().at(here.ref);\n        int connected_cursor = -2;\n\n        auto iter = axline.m_back_segconns.begin();\n        bool backsegs = true;\n\n        while (connected_cursor != -1) {\n            if (backsegs && iter == axline.m_back_segconns.end()) {\n                iter = axline.m_forward_segconns.begin();\n                backsegs = false;\n            }\n            if (!backsegs && iter == axline.m_forward_segconns.end()) {\n                break;\n            }\n\n            connected_cursor = iter->first.ref;\n            AttributeRow &row = m_map.getAttributeRowFromShapeIndex(connected_cursor);\n            if (seen[connected_cursor] > segdepth) {\n                float length = seglengths[connected_cursor];\n                int axialref = axialrefs[connected_cursor];\n                seen[connected_cursor] = segdepth;\n                audittrail[connected_cursor] =\n                    TopoMetSegmentRef(connected_cursor, here.dir, here.dist + length, here.ref);\n                // puts in a suitable bin ahead of us...\n                open++;\n                //\n                if (axialrefs[here.ref] == axialref) {\n                    list[bin].push_back(connected_cursor);\n                    row.setValue(depth_col, segdepth);\n                } else {\n                    list[(bin + 1) % 2].push_back(connected_cursor);\n                    seen[connected_cursor] =\n                        segdepth +\n                        1; // this is so if another node is connected directly to this one but is found later it is\n                           // still handled -- note it can result in the connected cursor being added twice\n                    row.setValue(depth_col, segdepth + 1);\n                }\n                if(parents.find(connected_cursor) == parents.end()) {\n                    parents[connected_cursor] = here.ref;\n                }\n            }\n            if (connected_cursor == refTo) {\n                refFound = true;\n                break;\n            }\n            iter++;\n        }\n        if (refFound)\n            break;\n    }\n\n    auto refToParent = parents.find(refTo);\n    int counter = 0;\n    while (refToParent != parents.end()) {\n        AttributeRow &row = m_map.getAttributeRowFromShapeIndex(refToParent->first);\n        row.setValue(path_col, counter);\n        counter++;\n        refToParent = parents.find(refToParent->second);\n    }\n    m_map.getAttributeRowFromShapeIndex(refFrom).setValue(path_col, counter);\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        AttributeRow &row = iter->getRow();\n        if (row.getValue(path_col) < 0) {\n            row.setValue(depth_col, -1);\n        } else {\n            row.setValue(path_col, counter - row.getValue(path_col));\n        }\n    }\n\n    m_map.overrideDisplayedAttribute(-2); // <- override if it's already showing\n    m_map.setDisplayedAttribute(depth_col);\n\n    return retvar;\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/segmtopologicalshortestpath.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/segmmodules/segmhelpers.h\"\n\n#include \"salalib/ianalysis.h\"\n\nclass SegmentTopologicalShortestPath : public IAnalysis {\n  private:\n    ShapeGraph &m_map;\n\n  public:\n    SegmentTopologicalShortestPath(ShapeGraph &map) : m_map(map) {}\n    std::string getAnalysisName() const override { return \"Topological Shortest Path\"; }\n    bool run(Communicator *comm) override;\n};\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/segmtulipshortestpath.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"segmtulipshortestpath.h\"\n\n#include \"genlib/stringutils.h\"\n\n// revised to use tulip bins for faster analysis of large spaces\n\nbool SegmentTulipShortestPath::run(Communicator *) {\n\n    AttributeTable &attributes = m_map.getAttributeTable();\n\n    int angle_col = attributes.insertOrResetColumn(\"Angular Shortest Path Angle\");\n    int path_col = attributes.insertOrResetColumn(\"Angular Shortest Path Order\");\n\n    // The original code set tulip_bins to 1024, divided by two and added one\n    // in order to duplicate previous code (using a semicircle of tulip bins)\n    size_t tulip_bins = 513;\n\n    std::vector<bool> covered(m_map.getConnections().size());\n    for (size_t i = 0; i < m_map.getConnections().size(); i++) {\n        covered[i] = false;\n    }\n    std::vector<std::vector<SegmentData>> bins(tulip_bins);\n\n    auto &selected = m_map.getSelSet();\n    if (selected.size() != 2) {\n        return false;\n    }\n    int refFrom = *selected.begin();\n    int refTo = *selected.rbegin();\n\n    int opencount = 0;\n\n    int row = std::distance(m_map.getAllShapes().begin(), m_map.getAllShapes().find(refFrom));\n    if (row != -1) {\n        bins[0].push_back(SegmentData(0, row, SegmentRef(), 0, 0.0, 0));\n        opencount++;\n    }\n\n    std::map<unsigned int, unsigned int> parents;\n    bool refFound = false;\n\n    int depthlevel = 0;\n    auto binIter = bins.begin();\n    int currentbin = 0;\n    while (opencount && !refFound) {\n        while (binIter->empty()) {\n            depthlevel++;\n            binIter++;\n            currentbin++;\n            if (binIter == bins.end()) {\n                binIter = bins.begin();\n            }\n        }\n        SegmentData lineindex;\n        if (binIter->size() > 1) {\n            // it is slightly slower to delete from an arbitrary place in the bin,\n            // but it is necessary to use random paths to even out the number of times through equal paths\n            int curr = pafrand() % binIter->size();\n            auto currIter = binIter->begin() + curr;\n            lineindex = *currIter;\n            binIter->erase(currIter);\n            // note: do not clear choice values here!\n        } else {\n            lineindex = binIter->front();\n            binIter->pop_back();\n        }\n        opencount--;\n        if (!covered[lineindex.ref]) {\n            covered[lineindex.ref] = true;\n            Connector &line = m_map.getConnections()[lineindex.ref];\n            // convert depth from tulip_bins normalised to standard angle\n            // (note the -1)\n            double depth_to_line = depthlevel / ((tulip_bins - 1) * 0.5);\n            m_map.getAttributeRowFromShapeIndex(lineindex.ref).setValue(angle_col, depth_to_line);\n            int extradepth;\n            if (lineindex.dir != -1) {\n                for (auto &segconn : line.m_forward_segconns) {\n                    if (!covered[segconn.first.ref]) {\n                        extradepth = (int)floor(segconn.second * tulip_bins * 0.5);\n                        bins[(currentbin + tulip_bins + extradepth) % tulip_bins].push_back(\n                            SegmentData(segconn.first, lineindex.ref, lineindex.segdepth + 1, 0.0, 0));\n                        if(parents.find(segconn.first.ref) == parents.end()) {\n                            parents[segconn.first.ref] = lineindex.ref;\n                        }\n                        opencount++;\n                    }\n                }\n            }\n            if (lineindex.dir != 1) {\n                for (auto &segconn : line.m_back_segconns) {\n                    if (!covered[segconn.first.ref]) {\n                        extradepth = (int)floor(segconn.second * tulip_bins * 0.5);\n                        bins[(currentbin + tulip_bins + extradepth) % tulip_bins].push_back(\n                            SegmentData(segconn.first, lineindex.ref, lineindex.segdepth + 1, 0.0, 0));\n                        if(parents.find(segconn.first.ref) == parents.end()) {\n                            parents[segconn.first.ref] = lineindex.ref;\n                        }\n                        opencount++;\n                    }\n                }\n            }\n            if (lineindex.ref == refTo) {\n                refFound = true;\n                break;\n            }\n        }\n    }\n\n    auto refToParent = parents.find(refTo);\n    int counter = 0;\n    while (refToParent != parents.end()) {\n        AttributeRow &row = m_map.getAttributeRowFromShapeIndex(refToParent->first);\n        row.setValue(path_col, counter);\n        counter++;\n        refToParent = parents.find(refToParent->second);\n    }\n    m_map.getAttributeRowFromShapeIndex(refFrom).setValue(path_col, counter);\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        AttributeRow &row = iter->getRow();\n        if (row.getValue(path_col) < 0) {\n            row.setValue(angle_col, -1);\n        } else {\n            row.setValue(path_col, counter - row.getValue(path_col));\n        }\n    }\n\n    m_map.overrideDisplayedAttribute(-2); // <- override if it's already showing\n    m_map.setDisplayedAttribute(angle_col);\n\n    return true;\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/core/segmtulipshortestpath.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ianalysis.h\"\n\nclass SegmentTulipShortestPath : public IAnalysis {\n  private:\n    ShapeGraph &m_map;\n\n  public:\n    SegmentTulipShortestPath(ShapeGraph &map) : m_map(map) {}\n    std::string getAnalysisName() const override { return \"Tulip Shortest Path\"; }\n    bool run(Communicator *) override;\n};\n"
  },
  {
    "path": "modules/segmentshortestpaths/coreTest/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nset(segmentpathscoretest segmentpathscoretest)\nset(segmentpathscoretest_SRCS\n    segmentpathscoretest.cpp)\n\nset(modules_coreTest \"${modules_coreTest}\" \"segmentpathscoretest\" CACHE INTERNAL \"modules_coreTest\" FORCE)\n\nadd_compile_definitions(SEGMENTPATHS_CORE_TEST_LIBRARY)\n\nadd_library(${segmentpathscoretest} OBJECT ${segmentpathscoretest_SRCS})\n"
  },
  {
    "path": "modules/segmentshortestpaths/coreTest/segmentpathscoretest.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"modules/segmentshortestpaths/core/segmmetricshortestpath.h\"\n#include \"modules/segmentshortestpaths/core/segmtopologicalshortestpath.h\"\n#include \"modules/segmentshortestpaths/core/segmtulipshortestpath.h\"\n#include \"salalib/axialmap.h\"\n#include \"salalib/mapconverter.h\"\n\nTEST_CASE(\"Shortest paths working examples\", \"\") {\n    const float EPSILON = 0.001;\n\n    // construct an axial map which will result in three different paths for the three types\n    ShapeGraph axialMap(\"Dummy drawing map\", ShapeMap::AXIALMAP);\n    axialMap.initialiseAttributesAxial();\n    std::vector<Line> lines;\n    lines.push_back(Line(Point2f(1.05000000, 1.00000000), Point2f(3.60000000, 1.00000000)));\n    lines.push_back(Line(Point2f(3.43455142, 2.92439257), Point2f(4.15448579, 3.75607430)));\n    lines.push_back(Line(Point2f(2.40000000, 3.00000000), Point2f(3.60000000, 3.00000000)));\n    lines.push_back(Line(Point2f(1.15022677, 0.90136061), Point2f(1.34977323, 2.09863939)));\n    lines.push_back(Line(Point2f(3.50000000, 3.10000000), Point2f(3.50000000, 0.90000000)));\n    lines.push_back(Line(Point2f(1.24560093, 1.95201016), Point2f(2.11199711, 2.42593102)));\n    lines.push_back(Line(Point2f(1.96351621, 2.29850806), Point2f(2.56074850, 3.07943312)));\n\n    lines.push_back(Line(Point2f(1.28848772, 1.91061952), Point2f(1.75546653, 2.84134127)));\n    lines.push_back(Line(Point2f(1.61521977, 2.72198377), Point2f(2.59540115, 3.02997701)));\n    lines.push_back(Line(Point2f(1.23737734, 1.07071068), Point2f(0.45955989, 0.29289322)));\n    for (Line line : lines) {\n        axialMap.makeLineShape(line);\n    }\n    axialMap.makeConnections();\n\n    REQUIRE(axialMap.getShapeCount() == 10);\n\n    std::unique_ptr<ShapeGraph> segmentMap =\n        MapConverter::convertAxialToSegment(nullptr, axialMap, \"Dummy segment map\", true, true, 0.4);\n\n    REQUIRE(segmentMap->getShapeCount() == 10);\n\n    // select the two edges\n    QtRegion selRegion(lines[1].midpoint(), lines[1].midpoint());\n    segmentMap->setCurSel(selRegion, false);\n    selRegion.bottom_left = lines[9].midpoint();\n    selRegion.top_right = lines[9].midpoint();\n    segmentMap->setCurSel(selRegion, true);\n    REQUIRE(segmentMap->getSelCount() == 2);\n\n    {\n        REQUIRE_FALSE(segmentMap->getAttributeTable().hasColumn(\"Angular Shortest Path Angle\"));\n        REQUIRE_FALSE(segmentMap->getAttributeTable().hasColumn(\"Angular Shortest Path Order\"));\n        SegmentTulipShortestPath(*segmentMap.get()).run(nullptr);\n        REQUIRE(segmentMap->getAttributeTable().hasColumn(\"Angular Shortest Path Angle\"));\n        REQUIRE(segmentMap->getAttributeTable().hasColumn(\"Angular Shortest Path Order\"));\n        int angleColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Angular Shortest Path Angle\");\n        int orderColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Angular Shortest Path Order\");\n        std::vector<double> expectedAngles = {-1, 0, 0.54297, 1.42969, -1, -1, -1, 1.24219, 0.734375, 1.82422};\n        std::vector<int> expectedOrder = {-1, 0, 1, 4, -1, -1, -1, 3, 2, 5};\n        for (int i = 0; i < lines.size(); i++) {\n            QtRegion selRegion(lines[i].midpoint(), lines[i].midpoint());\n            AttributeRow &shapeRow =\n                segmentMap->getAttributeRowFromShapeIndex(segmentMap->getShapesInRegion(selRegion).begin()->first);\n\n            REQUIRE(shapeRow.getValue(angleColIdx) == Approx(expectedAngles[i]).epsilon(EPSILON));\n            REQUIRE(shapeRow.getValue(orderColIdx) == expectedOrder[i]);\n        }\n    }\n\n    {\n        REQUIRE_FALSE(segmentMap->getAttributeTable().hasColumn(\"Metric Shortest Path Distance\"));\n        REQUIRE_FALSE(segmentMap->getAttributeTable().hasColumn(\"Metric Shortest Path Order\"));\n        SegmentMetricShortestPath(*segmentMap.get()).run(nullptr);\n        REQUIRE(segmentMap->getAttributeTable().hasColumn(\"Metric Shortest Path Distance\"));\n        REQUIRE(segmentMap->getAttributeTable().hasColumn(\"Metric Shortest Path Order\"));\n        int distanceColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Metric Shortest Path Distance\");\n        int orderColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Metric Shortest Path Order\");\n        std::vector<double> expectedDistances = {-1, 0, 1, 3.57756, -1, 2.67689, 1.89156, -1, -1, 4.58446};\n        std::vector<int> expectedOrder = {-1, 0, 1, 4, -1, 3, 2, -1, -1, 5};\n        for (int i = 0; i < lines.size(); i++) {\n            QtRegion selRegion(lines[i].midpoint(), lines[i].midpoint());\n            AttributeRow &shapeRow =\n                segmentMap->getAttributeRowFromShapeIndex(segmentMap->getShapesInRegion(selRegion).begin()->first);\n            REQUIRE(shapeRow.getValue(distanceColIdx) == Approx(expectedDistances[i]).epsilon(EPSILON));\n            REQUIRE(shapeRow.getValue(orderColIdx) == expectedOrder[i]);\n        }\n    }\n\n    {\n        REQUIRE_FALSE(segmentMap->getAttributeTable().hasColumn(\"Topological Shortest Path Depth\"));\n        REQUIRE_FALSE(segmentMap->getAttributeTable().hasColumn(\"Topological Shortest Path Order\"));\n        SegmentTopologicalShortestPath(*segmentMap.get()).run(nullptr);\n        REQUIRE(segmentMap->getAttributeTable().hasColumn(\"Topological Shortest Path Depth\"));\n        REQUIRE(segmentMap->getAttributeTable().hasColumn(\"Topological Shortest Path Order\"));\n        int depthColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Topological Shortest Path Depth\");\n        int orderColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Topological Shortest Path Order\");\n        std::vector<double> expectedDepths = {2, 0, -1, -1, 1, -1, -1, -1, -1, 3};\n        std::vector<int> expectedOrder = {2, 0, -1, -1, 1, -1, -1, -1, -1, 3};\n        for (int i = 0; i < lines.size(); i++) {\n            QtRegion selRegion(lines[i].midpoint(), lines[i].midpoint());\n            AttributeRow &shapeRow =\n                segmentMap->getAttributeRowFromShapeIndex(segmentMap->getShapesInRegion(selRegion).begin()->first);\n            REQUIRE(shapeRow.getValue(depthColIdx) == Approx(expectedDepths[i]).epsilon(EPSILON));\n            REQUIRE(shapeRow.getValue(orderColIdx) == expectedOrder[i]);\n        }\n    }\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/gui/CMakeLists.txt",
    "content": "# Copyright (C) 2020 Petros Koutsolampros\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nset(segmentpathsgui segmentpathsgui)\nset(segmentpathsgui_SRCS\n    uictrigger.cpp\n    segmentpathsmainwindow.cpp)\nset(modules_gui \"${modules_gui}\" \"segmentpathsgui\" CACHE INTERNAL \"modules_gui\" FORCE)\n\nfind_package(Qt5 COMPONENTS Core Widgets Gui OpenGL REQUIRED)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\ninclude_directories(${CMAKE_CURRENT_BINARY_DIR})\ninclude_directories(${Qt5Core_INCLUDE_DIRS})\ninclude_directories(${Qt5Widgets_INCLUDE_DIRS})\ninclude_directories(${Qt5Gui_INCLUDE_DIRS})\n\nset(CMAKE_AUTOMOC ON)\nset(CMAKE_AUTOUIC ON)\nset(CMAKE_AUTOUIC_SEARCH_PATHS \"../../../depthmapX/UI\")\n\nadd_definitions(${Qt5Core_DEFINITIONS})\nadd_definitions(${Qt5Widgets_DEFINITIONS})\nadd_definitions(${Qt5Gui_DEFINITIONS})\n\nadd_compile_definitions(SEGMENTPATHS_GUI_LIBRARY)\n\nadd_library(${segmentpathsgui} OBJECT ${segmentpathsgui_SRCS}\n    ../../../depthmapX/imainwindowmodule.h)\n"
  },
  {
    "path": "modules/segmentshortestpaths/gui/segmentpathsmainwindow.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"segmentpathsmainwindow.h\"\n\n#include \"modules/segmentshortestpaths/core/segmmetricshortestpath.h\"\n#include \"modules/segmentshortestpaths/core/segmtopologicalshortestpath.h\"\n#include \"modules/segmentshortestpaths/core/segmtulipshortestpath.h\"\n\n#include \"depthmapX/mainwindowhelpers.h\"\n\n#include <QMenuBar>\n#include <QMessageBox>\n\nbool SegmentPathsMainWindow::createMenus(MainWindow *mainWindow) {\n    QMenu *toolsMenu = MainWindowHelpers::getOrAddRootMenu(mainWindow, tr(\"&Tools\"));\n    QMenu *segmentMenu = MainWindowHelpers::getOrAddMenu(toolsMenu, tr(\"&Segment\"));\n    QMenu *shortestPathsMenu = MainWindowHelpers::getOrAddMenu(segmentMenu, tr(\"Shortest Paths\"));\n\n    QAction *angularPathAct = new QAction(tr(\"Angular shortest path\"), mainWindow);\n    angularPathAct->setStatusTip(tr(\"Create an angular shortest path\"));\n    connect(angularPathAct, &QAction::triggered, this,\n            [this, mainWindow] { OnShortestPath(mainWindow, PathType::ANGULAR); });\n    shortestPathsMenu->addAction(angularPathAct);\n\n    QAction *metricPathAct = new QAction(tr(\"Metric shortest path\"), mainWindow);\n    metricPathAct->setStatusTip(tr(\"Create a metric shortest path\"));\n    connect(metricPathAct, &QAction::triggered, this,\n            [this, mainWindow] { OnShortestPath(mainWindow, PathType::METRIC); });\n    shortestPathsMenu->addAction(metricPathAct);\n\n    QAction *topoPathAct = new QAction(tr(\"Topological shortest path\"), mainWindow);\n    topoPathAct->setStatusTip(tr(\"Create a topological shortest path\"));\n    connect(topoPathAct, &QAction::triggered, this,\n            [this, mainWindow] { OnShortestPath(mainWindow, PathType::TOPOLOGICAL); });\n    shortestPathsMenu->addAction(topoPathAct);\n\n    return true;\n}\n\nvoid SegmentPathsMainWindow::OnShortestPath(MainWindow *mainWindow, PathType pathType) {\n    QGraphDoc *graphDoc = mainWindow->activeMapDoc();\n    if (graphDoc == nullptr)\n        return;\n\n    if (graphDoc->m_communicator) {\n        QMessageBox::warning(mainWindow, tr(\"Warning\"), tr(\"Please wait, another process is running\"), QMessageBox::Ok,\n                             QMessageBox::Ok);\n        return;\n    }\n    if (graphDoc->m_meta_graph->getDisplayedMapType() != ShapeMap::SEGMENTMAP) {\n        QMessageBox::warning(mainWindow, tr(\"Warning\"), tr(\"Please make sure the displayed map is a segment map\"),\n                             QMessageBox::Ok, QMessageBox::Ok);\n        return;\n    }\n    if (graphDoc->m_meta_graph->getDisplayedShapeGraph().getSelSet().size() != 2) {\n        QMessageBox::warning(mainWindow, tr(\"Warning\"), tr(\"Please select two segments to create a path between\"),\n                             QMessageBox::Ok, QMessageBox::Ok);\n        return;\n    }\n\n    graphDoc->m_communicator = new CMSCommunicator();\n    switch (pathType) {\n    case PathType::ANGULAR:\n        graphDoc->m_communicator->setAnalysis(std::unique_ptr<IAnalysis>(\n            new SegmentTulipShortestPath(graphDoc->m_meta_graph->getDisplayedShapeGraph())));\n        break;\n    case PathType::METRIC:\n        graphDoc->m_communicator->setAnalysis(std::unique_ptr<IAnalysis>(\n            new SegmentMetricShortestPath(graphDoc->m_meta_graph->getDisplayedShapeGraph())));\n        break;\n    case PathType::TOPOLOGICAL:\n        graphDoc->m_communicator->setAnalysis(std::unique_ptr<IAnalysis>(\n            new SegmentTopologicalShortestPath(graphDoc->m_meta_graph->getDisplayedShapeGraph())));\n        break;\n    }\n    graphDoc->m_communicator->SetFunction(CMSCommunicator::FROMCONNECTOR);\n    graphDoc->m_communicator->setSuccessUpdateFlags(QGraphDoc::NEW_DATA);\n    graphDoc->m_communicator->setSuccessRedrawFlags(QGraphDoc::VIEW_ALL, QGraphDoc::REDRAW_POINTS,\n                                                    QGraphDoc::NEW_DATA);\n\n    graphDoc->CreateWaitDialog(tr(\"Calculating shortest path...\"));\n    graphDoc->m_thread.render(graphDoc);\n}\n"
  },
  {
    "path": "modules/segmentshortestpaths/gui/segmentpathsmainwindow.h",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"depthmapX/imainwindowmodule.h\"\n\nclass SegmentPathsMainWindow : public IMainWindowModule {\n\n  private:\n    enum PathType { ANGULAR, METRIC, TOPOLOGICAL };\n\n  private slots:\n    void OnShortestPath(MainWindow *mainWindow, PathType pathType);\n\n  public:\n    SegmentPathsMainWindow() : IMainWindowModule() {}\n    bool createMenus(MainWindow *mainWindow);\n};\n"
  },
  {
    "path": "modules/segmentshortestpaths/gui/uictrigger.cpp",
    "content": "// This file is required to trigger cmake's AUTOUIC in the depthmapX directory\n// if it is not included then the ui_*.h files in that directory are not generated\n// and then not found by the module which is built first because it is a dependency\n// of depthmapX.\n#include \"depthmapX/ui_ColourScaleDlg.h\"\n"
  },
  {
    "path": "releases/README.txt",
    "content": "depthmapX\n\nTo install, just unpack the content of this zip file to your local hard drive and start depthmapX - this should contain everything you need.\n\ndepthmapX documentation can be found at https://github.com/blackseamonster/depthmapX/tree/master/docs\n\nThe wiki for this project is at:\nhttps://github.com/blackseamonster/depthmapX/wiki\n\nChangelog\n- Fixed some internal memory/runtime issues\n- Import links from file\n- Fixed crash on zoom-out issue\n- command line app (depthmapXcli)\n- restructured the code base to have more libraries that can be tested and reused\n- added catch as unit test framework\n- made simple mode option persistent\n- fixed persistence of user options on Windows\n- fixed mouse wheel zoom (center on mouse pointer, not center of the map)\n\n\nIf you have any issues or questions, you can raise a ticket at https://github.com/blackseamonster/depthmapX/issues or send an email to depthmapX@blackseamonster.com\n"
  },
  {
    "path": "releases/gplv3.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "releases/lgplv3.txt",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "releases/licenses.txt",
    "content": "depthmapX \nC 2000-2010 University College London, Alasdair Turner, Eva Friedrich\nC 2011-2014 Tasos Varoudis, UCL\nC 2017 Christian Sailer, Petros Koutsolampros\n\nReleased under Gnu Public License (GPL v3)\nPlease see gplv3.txt for license details\n\nThis program uses QT5 under the LGPL v3\nPlease see lgplv3.txt for license details\n"
  },
  {
    "path": "salaTest/CMakeLists.txt",
    "content": "set(salaTest salaTest)\n\nset(salaTest_SRCS\n    main.cpp\n    testentityparsing.cpp\n    testpointmap.cpp\n    testlinkutils.cpp\n    testgridproperties.cpp\n    testisovistdef.cpp\n    testmgraph.cpp\n    testshapegraphs.cpp\n    teststructsizes.cpp\n    testsparksieve.cpp\n    testattributetable.cpp\n    testattributetableindex.cpp\n    testlayermanager.cpp\n    testattributetablehelpers.cpp\n    testattributetableview.cpp\n    testshapemaps.cpp\n    testgeometrygenerators.cpp\n    testmapinfodata.cpp\n    testsalaprogram.cpp\n    testdxfp.cpp\n    testshaperemove.cpp\n    testmapconversion.cpp\n    testpointinpoly.cpp\n    testpushvalues.cpp\n    testisovist.cpp\n) # salaTest_SRCS\n\ninclude_directories(\"../ThirdParty/Catch\" \"../ThirdParty/FakeIt\")\n\nset(LINK_LIBS salalib genlib mgraph440)\n\nadd_executable(${salaTest} ${salaTest_SRCS})\ntarget_link_libraries(${salaTest} ${LINK_LIBS})\n"
  },
  {
    "path": "salaTest/main.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#define CATCH_CONFIG_MAIN\n#include \"catch.hpp\"\n"
  },
  {
    "path": "salaTest/testattributetable.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"Catch/fakeit.hpp\"\n#include <salalib/attributetable.h>\n#include <cliTest/selfcleaningfile.h>\n#include <fstream>\n#include <salalib/mgraph_consts.h>\n#include <salalib/layermanagerimpl.h>\n\nTEST_CASE(\"test attribute column\")\n{\n    AttributeColumnImpl col(\"colName\");\n    REQUIRE(col.getName() == \"colName\");\n    REQUIRE(col.getFormula() == \"\");\n\n    REQUIRE_FALSE(col.isHidden());\n    REQUIRE_FALSE(col.isLocked());\n\n    col.setLock(true);\n    REQUIRE_FALSE(col.isHidden());\n    REQUIRE(col.isLocked());\n\n    col.setHidden(true);\n    REQUIRE(col.isHidden());\n    REQUIRE(col.isLocked());\n\n    REQUIRE(col.m_stats.max == -1.0);\n    REQUIRE(col.m_stats.min == -1.0);\n    REQUIRE(col.m_stats.total == -1.0);\n    REQUIRE(col.m_stats.visibleMax == -1.0);\n    REQUIRE(col.m_stats.visibleMin == -1.0);\n    REQUIRE(col.m_stats.visibleTotal == -1.0);\n\n    col.updateStats(1.2f);\n    REQUIRE(col.m_stats.max == Approx(1.2));\n    REQUIRE(col.m_stats.min == Approx(1.2));\n    REQUIRE(col.m_stats.total == Approx(1.2));\n    REQUIRE(col.m_stats.visibleMax == -1.0);\n    REQUIRE(col.m_stats.visibleMin == -1.0);\n    REQUIRE(col.m_stats.visibleTotal == -1.0);\n\n    col.updateStats(2.0f);\n    REQUIRE(col.m_stats.max == Approx(2.0));\n    REQUIRE(col.m_stats.min == Approx(1.2));\n    REQUIRE(col.m_stats.total == Approx(3.2));\n    REQUIRE(col.m_stats.visibleMax == -1.0);\n    REQUIRE(col.m_stats.visibleMin == -1.0);\n    REQUIRE(col.m_stats.visibleTotal == -1.0);\n\n    col.updateStats(3.0f,1.2f);\n    REQUIRE(col.m_stats.max == Approx(3.0));\n    REQUIRE(col.m_stats.min == Approx(1.2));\n    REQUIRE(col.m_stats.total == Approx(5));\n    REQUIRE(col.m_stats.visibleMax == -1.0);\n    REQUIRE(col.m_stats.visibleMin == -1.0);\n    REQUIRE(col.m_stats.visibleTotal == -1.0);\n\n    // test read/write\n    SelfCleaningFile scf(\"column.bin\");\n    {\n        std::ofstream outfile(scf.Filename());\n        col.write(outfile, 0);\n    }\n    AttributeColumnImpl copy(\"\");\n    {\n        std::ifstream infile(scf.Filename());\n        copy.read(infile);\n    }\n    REQUIRE(copy.getName() == \"colName\");\n    REQUIRE(copy.getFormula() == \"\");\n    REQUIRE(copy.isHidden());\n    REQUIRE(copy.isLocked());\n    REQUIRE(copy.m_stats.max == Approx(3.0));\n    REQUIRE(copy.m_stats.min == Approx(1.2));\n    REQUIRE(copy.m_stats.total == Approx(5));\n    REQUIRE(copy.m_stats.visibleMax == -1.0);\n    REQUIRE(copy.m_stats.visibleMin == -1.0);\n    REQUIRE(copy.m_stats.visibleTotal == -1.0);\n\n\n}\n\nTEST_CASE(\"test attribute row\")\n{\n    using namespace fakeit;\n    Mock<AttributeColumnManager> colMan;\n    When(Method(colMan,getColumnIndex).Using(std::string(\"col1\"))).AlwaysReturn(0);\n    When(Method(colMan,getColumnIndex).Using(std::string(\"col2\"))).AlwaysReturn(1);\n    When(Method(colMan,getColumnIndex).Using(std::string(\"colx\"))).AlwaysThrow(std::out_of_range(\"mock out of range\"));\n\n    When(Method(colMan,getNumColumns)).Return(2);\n\n    Mock<AttributeColumn> col1;\n    Mock<AttributeColumn> col2;\n    When(Method(colMan, getColumn).Using(0)).AlwaysReturn(col1.get());\n    When(Method(colMan, getColumn).Using(1)).AlwaysReturn(col2.get());\n    When(Method(col1,updateStats)).AlwaysReturn();\n    When(Method(col2,updateStats)).AlwaysReturn();\n\n    AttributeRowImpl row(colMan.get());\n    row.setValue(\"col1\", 1.2f);\n    REQUIRE(row.getValue(\"col1\") == Approx(1.2f));\n    REQUIRE(row.getValue(0) == Approx(1.2f));\n\n    row.setValue(1, 2.2f);\n    REQUIRE(row.getValue(\"col2\") == Approx(2.2f));\n    REQUIRE(row.getValue(1) == Approx(2.2f));\n\n    row.setValue(1, 3.2f);\n    REQUIRE(row.getValue(\"col2\") == Approx(3.2f));\n    REQUIRE(row.getValue(1) == Approx(3.2f));\n\n\n    Verify(Method(col1,updateStats).Using(1.2f,0.0f)).Once();\n    Verify(Method(col2,updateStats).Using(2.2f,0.0f)).Once();\n    Verify(Method(col2,updateStats).Using(3.2f,2.2f)).Once();\n\n    REQUIRE_THROWS_AS(row.setValue(\"colx\", 1.1f), std::out_of_range);\n    REQUIRE_THROWS_AS(row.setValue(2, 1.2f), std::out_of_range);\n    REQUIRE_THROWS_AS(row.getValue(\"colx\"), std::out_of_range);\n    REQUIRE_THROWS_AS(row.getValue(2), std::out_of_range);\n\n    // test attribute row impl only methods\n    // note that these do not affect the column manager - that will have to\n    // be handled by the caller - that's why these are impl only!\n    row.addColumn();\n    REQUIRE(row.getValue(2) == -1.0f);\n\n    row.removeColumn(1);\n    REQUIRE(row.getValue(1) == -1.0f);\n    REQUIRE(row.getValue(0) == Approx(1.2f));\n    REQUIRE_THROWS_AS(row.getValue(2), std::out_of_range);\n\n    //test reading/writing\n    SelfCleaningFile scf(\"rowfile.bin\");\n    {\n        std::ofstream outfile(scf.Filename());\n        row.write(outfile);\n    }\n    Mock<AttributeColumnManager> copiedColMan;\n    When(Method(copiedColMan,getNumColumns)).Return(2);\n    AttributeRowImpl copiedRow(copiedColMan.get());\n    {\n        std::ifstream infile(scf.Filename());\n        copiedRow.read(infile);\n    }\n\n    REQUIRE(copiedRow.getValue(0) == Approx(1.2f));\n\n    row.incrValue(0, 1.0f);\n    REQUIRE(row.getValue(0) == Approx(2.2f));\n    Verify(Method(col1,updateStats).Using(2.2f,1.2f)).Once();\n\n    AttributeRow& ifRef = row;\n    ifRef.incrValue(0);\n    REQUIRE(row.getValue(0) == Approx(3.2f));\n    Verify(Method(col1,updateStats).Using(3.2f,2.2f)).Once();\n\n\n}\n\nTEST_CASE(\"test attribute table\")\n{\n    AttributeTable table;\n\n    table.insertOrResetColumn(\"col1\");\n    table.getOrInsertColumn(\"col2\");\n    table.insertOrResetLockedColumn(\"lcol1\");\n    table.getOrInsertLockedColumn(\"lcol2\", \"formula\");\n\n    REQUIRE(table.getNumColumns() == 4);\n    REQUIRE(table.getColumnIndex(\"col2\") == 1);\n    REQUIRE(table.getColumnName(1) == \"col2\");\n    REQUIRE(table.getColumn(1).getName() == \"col2\");\n    REQUIRE(table.getColumn(1).isLocked() == false);\n    REQUIRE(table.getColumn(3).getName() == \"lcol2\");\n    REQUIRE(table.getColumn(3).isLocked());\n\n    table.addRow(AttributeKey(0));\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(\"col1\") == -1 );\n    table.getRow(AttributeKey(0)).setValue(\"col1\", 1.2f );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(\"col1\") == Approx(1.2f) );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(0) == Approx(1.2f) );\n\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(\"lcol2\") == -1 );\n    table.getRow(AttributeKey(0)).setValue(3, 1.4f );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(\"lcol2\") == Approx(1.4f) );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(3) == Approx(1.4f) );\n\n    REQUIRE_THROWS_AS(table.getRow(AttributeKey(0)).getValue(4), std::out_of_range);\n\n    table.removeColumn(0);\n    table.removeColumn(1);\n\n    REQUIRE(table.getNumColumns() == 2);\n    REQUIRE(table.getColumn(0).getName() == \"col2\");\n    REQUIRE(table.getColumn(1).getName() == \"lcol2\");\n    REQUIRE(table.getColumnIndex(\"lcol2\") == 1);\n\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(\"col2\") == -1.0 );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(0) == -1.0 );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(\"lcol2\") == Approx(1.4f) );\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(1) == Approx(1.4f) );\n\n\n    REQUIRE_THROWS_AS(table.getRow(AttributeKey(0)).getValue(2), std::out_of_range);\n\n    table.addRow(AttributeKey(1));\n    REQUIRE_THROWS_AS(table.getRow(AttributeKey(1)).getValue(2), std::out_of_range);\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(\"col2\") == -1.0 );\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(0) == -1.0 );\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(\"lcol2\") == -1.0 );\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(1) == -1.0 );\n\n    table.getRow(AttributeKey(1)).setValue(0, 2.4f);\n    table.getRow(AttributeKey(1)).setValue(\"lcol2\", 2.6f);\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(\"col2\") == Approx(2.4) );\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(1) == Approx(2.6) );\n\n    size_t idx = table.getOrInsertColumn(\"col2\");\n    REQUIRE(idx == 0);\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(\"col2\") == Approx(2.4) );\n    REQUIRE(table.getColumn(0).getStats().max == Approx(2.4));\n\n    idx = table.insertOrResetColumn(\"col2\");\n    REQUIRE(idx == 0);\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(\"col2\") == -1.0 );\n    REQUIRE(table.getColumn(0).getStats().max == -1.0);\n\n    size_t newColIndex = table.getOrInsertColumn(\"newCol\");\n    REQUIRE(newColIndex == 2);\n    REQUIRE(table.getColumnName(2) == \"newCol\");\n    REQUIRE(table.getColumnIndex(\"newCol\") == 2);\n    REQUIRE(table.getColumn(2).getName() == \"newCol\");\n\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(2) == -1.0);\n\n    table.renameColumn(\"col2\", \"col_foo\");\n    REQUIRE(table.getColumnName(0) == \"col_foo\");\n    REQUIRE(table.getColumnIndex(\"col_foo\") == 0);\n    REQUIRE(table.getColumn(0).getName() == \"col_foo\");\n\n    REQUIRE_THROWS_AS(table.getColumnIndex(\"col2\"), std::out_of_range);\n\n    table.getRow(AttributeKey(0)).setSelection(true);\n\n    REQUIRE(table.getRow(AttributeKey(0)).isSelected());\n    auto iter = table.begin();\n    REQUIRE(iter->getRow().isSelected());\n    ++iter;\n    REQUIRE_FALSE(iter->getRow().isSelected());\n\n    table.deselectAllRows();\n    for (auto& item : table)\n    {\n        REQUIRE_FALSE(item.getRow().isSelected());\n    }\n\n    // check read/write\n    LayerManagerImpl layerManager;\n    SelfCleaningFile scf(\"tablefile.bin\");\n    {\n        std::ofstream outfile(scf.Filename());\n        table.write(outfile, layerManager);\n    }\n}\n\nTEST_CASE(\"Existing and non-existing rows\")\n{\n    AttributeTable table;\n    table.getOrInsertColumn(\"col1\");\n    table.getOrInsertColumn(\"col2\");\n    table.addRow(AttributeKey(0)).setValue(0, 1.0f);\n    table.addRow(AttributeKey(1)).setValue(0, 0.5f);\n    table.addRow(AttributeKey(2)).setValue(0, 2.0f);\n\n    const AttributeTable& constRef = table;\n\n    table.getRow(AttributeKey(0));\n    constRef.getRow(AttributeKey(0));\n    REQUIRE_THROWS_AS(table.getRow(AttributeKey(5)), std::out_of_range);\n    REQUIRE_THROWS_AS(constRef.getRow(AttributeKey(5)), std::out_of_range);\n\n    REQUIRE( table.getRowPtr(AttributeKey(1)) != 0);\n    REQUIRE( constRef.getRowPtr(AttributeKey(1)) != 0);\n\n    REQUIRE( table.getRowPtr(AttributeKey(5)) == 0);\n    REQUIRE( constRef.getRowPtr(AttributeKey(5)) == 0);\n}\n\nTEST_CASE(\"normalised values\"){\n    AttributeTable table;\n    table.getOrInsertColumn(\"col1\");\n    table.getOrInsertColumn(\"col2\");\n    table.addRow(AttributeKey(0)).setValue(0, 1.0f);\n    table.addRow(AttributeKey(1)).setValue(0, 0.5f);\n    table.addRow(AttributeKey(2)).setValue(0, 2.0f);\n\n    REQUIRE(table.getRow(AttributeKey(0)).getNormalisedValue(1) == Approx(0.5f));\n    REQUIRE(table.getRow(AttributeKey(0)).getNormalisedValue(0) == Approx(0.33333f));\n    REQUIRE(table.getRow(AttributeKey(1)).getNormalisedValue(0) == Approx(0.0f));\n    REQUIRE(table.getRow(AttributeKey(2)).getNormalisedValue(0) == Approx(1.0f));\n\n    table.addRow(AttributeKey(3)).setValue(1,1.0f);\n\n    REQUIRE(table.getRow(AttributeKey(1)).getNormalisedValue(1) == Approx(0.5f));\n    REQUIRE(table.getRow(AttributeKey(3)).getNormalisedValue(1) == Approx(0.5f));\n\n    table.getRow(AttributeKey(0)).setValue(1,1.1f);\n    REQUIRE(table.getRow(AttributeKey(3)).getNormalisedValue(1) == Approx(0.0f));\n    REQUIRE(table.getRow(AttributeKey(1)).getNormalisedValue(1) == Approx(-1.0f));\n\n\n}\n\nTEST_CASE(\"attibute table iterations\")\n{\n    AttributeTable table;\n\n    table.insertOrResetColumn(\"col1\");\n    table.getOrInsertColumn(\"col2\");\n\n    auto& row = table.addRow(AttributeKey(0));\n    row.setValue(0, 0.5f);\n    auto& row2 = table.addRow(AttributeKey(1));\n    row2.setValue(0, 1.0f);\n\n    AttributeTable::iterator iter = table.begin();\n    REQUIRE((*iter).getKey().value == 0);\n    REQUIRE(iter->getRow().getValue(0) == Approx(0.5));\n    iter++;\n    REQUIRE((*iter).getKey().value == 1);\n    REQUIRE(iter->getRow().getValue(0) == Approx(1.0));\n    iter++;\n\n    REQUIRE(iter == table.end());\n\n    for( auto& item :  table)\n    {\n        item.getRow().setValue(1, 2.0f);\n    }\n\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(1) == Approx(2.0));\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(1) == Approx(2.0));\n\n    const AttributeTable& const_table = table;\n\n    auto citer = const_table.begin();\n    REQUIRE((*citer).getKey().value == 0);\n    REQUIRE(citer->getRow().getValue(0) == Approx(0.5));\n    citer++;\n    REQUIRE((*citer).getKey().value == 1);\n    REQUIRE(citer->getRow().getValue(0) == Approx(1.0));\n    citer++;\n\n    auto cend = const_table.end();\n    REQUIRE(citer == cend);\n    REQUIRE(citer == table.end());\n\n    AttributeTable::iterator foo(iter);\n    AttributeTable::const_iterator cfoo(iter);\n    AttributeTable::const_iterator ccfoo(citer);\n\n    REQUIRE(iter == foo);\n    REQUIRE(cfoo == iter);\n    REQUIRE(ccfoo == iter);\n\n    cfoo = table.end();\n    foo = table.begin();\n\n    cfoo = foo;\n\n    foo->getRow().setValue(1,2.2f);\n    ++foo;\n    foo->getRow().setValue(1, 3.2f);\n\n    REQUIRE(table.getRow(AttributeKey(0)).getValue(1) == Approx(2.2));\n    REQUIRE(table.getRow(AttributeKey(1)).getValue(1) == Approx(3.2));\n}\n\n#include <salalib/attributetablehelpers.h>\n\nTEST_CASE(\"Attribute Table - serialisation\")\n{\n    LayerManagerImpl layerManager;\n    layerManager.addLayer(\"extra layer\");\n    REQUIRE(layerManager.getLayerIndex(\"extra layer\") == 1);\n\n    AttributeTable newTable;\n    size_t colIndex1 = newTable.getOrInsertColumn(\"foo\", \"foo formula\");\n    size_t colIndex2 = newTable.getOrInsertColumn(\"bar\");\n\n    DisplayParams overAllDp;\n    overAllDp.blue = 1.2f;\n    overAllDp.red  = 1.3f;\n\n    DisplayParams fooDp;\n    fooDp.blue = 2.2f;\n    fooDp.red = 2.3f;\n\n    DisplayParams barDp;\n\n    newTable.getColumn(colIndex1).setDisplayParams(fooDp);\n    newTable.getColumn(colIndex2).setDisplayParams(barDp);\n    newTable.setDisplayParams(overAllDp);\n\n    auto& row = newTable.addRow(AttributeKey(0));\n    auto& row2 = newTable.addRow(AttributeKey(10));\n\n    row.setValue(0,1.0f);\n    row.setValue(1,2.0f);\n\n    row2.setValue(0, 11.0f);\n    row2.setValue(1, 12.0f);\n    row2.setSelection(true);\n\n    dXreimpl::pushSelectionToLayer(newTable, layerManager, \"sel layer\");\n    REQUIRE(isObjectVisible(layerManager, row2));\n    REQUIRE_FALSE(isObjectVisible(layerManager, row));\n\n\n\n    SelfCleaningFile newTableFile(\"newtable.bin\");\n\n    {\n        std::ofstream outfile(newTableFile.Filename());\n        newTable.write(outfile, layerManager);\n    }\n\n    AttributeTable copyTable;\n    LayerManagerImpl copyLayerManager;\n    {\n        std::ifstream infile(newTableFile.Filename());\n        copyTable.read(infile, copyLayerManager);\n    }\n\n    auto& copyRow = copyTable.getRow(AttributeKey(0));\n    REQUIRE(copyRow.getValue(0) == Approx(1.0f));\n    REQUIRE(copyRow.getValue(1) == Approx(2.0f));\n\n    auto& copyRow2 = copyTable.getRow(AttributeKey(10));\n    REQUIRE(copyRow2.getValue(0) == Approx(11.0f));\n    REQUIRE(copyRow2.getValue(1) == Approx(12.0f));\n\n    REQUIRE(isObjectVisible(copyLayerManager, copyRow2));\n    REQUIRE_FALSE(isObjectVisible(copyLayerManager, copyRow));\n\n    REQUIRE(copyTable.getColumnIndex(\"foo\") == colIndex1);\n    REQUIRE(copyTable.getColumnIndex(\"bar\") == colIndex2);\n\n    REQUIRE(copyTable.getColumn(colIndex1).getDisplayParams().blue == Approx(fooDp.blue));\n    REQUIRE(copyTable.getDisplayParams().blue == Approx(overAllDp.blue));\n\n}\n\n"
  },
  {
    "path": "salaTest/testattributetablehelpers.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include <Catch/fakeit.hpp>\n#include <salalib/attributetablehelpers.h>\n\n\nTEST_CASE(\"push to layer\")\n{\n    using namespace dXreimpl;\n    using namespace fakeit;\n    Mock<LayerManager> layMan;\n    AttributeTable table;\n    When(Method(layMan,addLayer)).Do([](const std::string &name)->size_t{REQUIRE(name == \"testlayer\"); return 1;});\n    When(Method(layMan,getKey).Using(1)).AlwaysReturn(2);\n    When(Method(layMan,isVisible).Using(1)).AlwaysReturn(true);\n    When(Method(layMan,setLayerVisible)).AlwaysReturn();\n\n    table.insertOrResetColumn(\"col1\");\n    table.getOrInsertColumn(\"col2\");\n\n    auto& row = table.addRow(AttributeKey(0));\n    row.setValue(0, 0.5f);\n    row.setSelection(true);\n    auto& row2 = table.addRow(AttributeKey(1));\n    row2.setValue(0, 1.0f);\n\n   pushSelectionToLayer(table, layMan.get(), \"testlayer\");\n   Verify(Method(layMan,addLayer)).Once();\n   Verify(Method(layMan,getKey).Using(1)).Once();\n   Verify(Method(layMan,setLayerVisible).Using(1, true)).Once();\n\n   REQUIRE(row.getLayerKey()== 3);\n   REQUIRE(row2.getLayerKey() == 1);\n}\n\n"
  },
  {
    "path": "salaTest/testattributetableindex.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include <salalib/attributetableindex.h>\n\nTEST_CASE(\"Check index creation\")\n{\n    AttributeTable table;\n    table.getOrInsertColumn(\"col1\");\n    table.getOrInsertColumn(\"col2\");\n\n    auto& row0 = table.addRow(AttributeKey(0));\n    auto& row1 = table.addRow(AttributeKey(1));\n    auto& row2 = table.addRow(AttributeKey(2));\n    auto& row3 = table.addRow(AttributeKey(3));\n\n    row0.setValue(0, 10.0);\n    row1.setValue(0, 8.5);\n    row2.setValue(0, 11.0);\n    row3.setValue(0, 4.5);\n\n    auto index = makeAttributeIndex(table, 0);\n    REQUIRE(index.size() == 4);\n    REQUIRE(index[0].key.value == 3);\n    REQUIRE(index[1].key.value == 1);\n    REQUIRE(index[2].key.value == 0);\n    REQUIRE(index[3].key.value == 2);\n\n    index[3].mutable_row->setValue(1, 1.5);\n    REQUIRE(table.getRow(AttributeKey(2)).getValue(1) == Approx(1.5));\n}\n\n"
  },
  {
    "path": "salaTest/testattributetableview.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include <salalib/attributetableview.h>\n\nTEST_CASE(\"Test Attribute view\"){\n    AttributeTable table;\n\n    table.insertOrResetColumn(\"foo\");\n    table.insertOrResetColumn(\"bar\");\n    table.addRow(AttributeKey(0)).setValue(0,1.0f).setValue(1, 1.1f);\n    table.addRow(AttributeKey(7)).setValue(0,0.7f).setValue(1,1.7f);\n\n    AttributeTableView view(table);\n    view.setDisplayColIndex(0);\n\n    REQUIRE(view.getConstTableIndex().front().key.value == 7);\n\n    REQUIRE(view.getNormalisedValue(view.getConstTableIndex().front().key, *view.getConstTableIndex().front().row) == Approx(0.0f));\n\n    REQUIRE(&view.getDisplayParams() != &table.getDisplayParams());\n    REQUIRE(&view.getDisplayParams() == &table.getColumn(0).getDisplayParams());\n\n\n    table.addRow(AttributeKey(3));\n    view.setDisplayColIndex(-1);\n    REQUIRE(view.getNormalisedValue(AttributeKey(3), table.getRow(AttributeKey(3))) == Approx(3.0/7));\n    REQUIRE(view.getConstTableIndex().size() == 3);\n\n    REQUIRE(&table.getDisplayParams() == &view.getDisplayParams());\n\n    view.setDisplayColIndex(-2);\n    REQUIRE(view.getNormalisedValue(AttributeKey(3), table.getRow(AttributeKey(3))) == Approx(3.0/7));\n    REQUIRE(view.getConstTableIndex().empty());\n\n    REQUIRE(&table.getDisplayParams() == &view.getDisplayParams());\n\n}\n\n\nTEST_CASE(\"Test attribute table handle\")\n{\n    AttributeTable table;\n\n    table.insertOrResetColumn(\"foo\");\n    table.insertOrResetColumn(\"bar\");\n    table.addRow(AttributeKey(0)).setValue(0,1.0f).setValue(1, 1.1f);\n    table.addRow(AttributeKey(7)).setValue(0,0.7f).setValue(1,1.7f);\n\n    AttributeTableHandle handle(table);\n    handle.setDisplayColIndex(0);\n\n    REQUIRE(handle.getTableIndex().front().key.value == 7);\n    REQUIRE(handle.getConstTableIndex().front().key.value == 7);\n\n\n    handle.getTableIndex().front().mutable_row->setValue(0, 0.8f);\n\n    REQUIRE(table.getRow(AttributeKey(7)).getValue(0) == Approx(0.8));\n\n    handle.setDisplayColIndex(-1);\n    REQUIRE(handle.getTableIndex().size() == 2);\n\n    REQUIRE(&table.getDisplayParams() == &handle.getDisplayParams());\n\n    handle.setDisplayColIndex(-2);\n    REQUIRE(handle.getTableIndex().empty());\n\n    REQUIRE(&table.getDisplayParams() == &handle.getDisplayParams());\n\n\n}\n"
  },
  {
    "path": "salaTest/testdxfp.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/parsers/dxfp.h\"\n\n#include \"genlib/comm.h\"\n#include \"genlib/p2dpoly.h\"\n\nTEST_CASE(\"DXF Parsing (lines)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f lineStart(-1,-2);\n    Point2f lineEnd(3,4);\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nLINE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << lineStart.x << \"\\n\"\n           << \"20\\n\" << lineStart.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"11\\n\" << lineEnd.x << \"\\n\"\n           << \"21\\n\" << lineEnd.y << \"\\n\"\n           << \"31\\n0\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numLines() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getStart().x == Approx(lineStart.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getStart().y == Approx(lineStart.y).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getEnd().x == Approx(lineEnd.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getEnd().y == Approx(lineEnd.y).epsilon(EPSILON));\n}\n\nTEST_CASE(\"DXF Parsing (arcs)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f centre(1,-2);\n    float radius = 3;\n    float startAngle = 45;\n    float endAngle = 67;\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nARC\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << centre.x << \"\\n\"\n           << \"20\\n\" << centre.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"40\\n\" << radius << \"\\n\"\n           << \"50\\n\" << startAngle << \"\\n\"\n           << \"51\\n\" << endAngle << \"\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numArcs() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getArc(0).getCentre().x == Approx(centre.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getArc(0).getCentre().y == Approx(centre.y).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getArc(0).getRadius() == Approx(radius).epsilon(EPSILON));\n    // arc start angle not publicly accessible\n    // arc end angle not publicly accessible\n}\n\nTEST_CASE(\"DXF Parsing (circles)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f centre(1,-2);\n    float radius = 3;\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nCIRCLE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << centre.x << \"\\n\"\n           << \"20\\n\" << centre.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"40\\n\" << radius << \"\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numCircles() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getCircle(0).getCentre().x == Approx(centre.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getCircle(0).getCentre().y == Approx(centre.y).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getCircle(0).getRadius() == Approx(radius).epsilon(EPSILON));\n}\n\nTEST_CASE(\"DXF Parsing (points)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f point(1,-2);\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nPOINT\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << point.x << \"\\n\"\n           << \"20\\n\" << point.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numPoints() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getPoint(0).x == Approx(point.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getPoint(0).y == Approx(point.y).epsilon(EPSILON));\n}\n\nTEST_CASE(\"DXF Parsing (lwpolyline)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f point1(-1,-2);\n    Point2f point2(3,4);\n    Point2f point3(-5,6);\n    Point2f point4(7,-8);\n    std::string layer(\"0\");\n\n    int closed = 0;\n\n    SECTION (\"open polyline\") {\n        closed = 0;\n    }\n    SECTION (\"closed polyline\") {\n        closed = 1;\n    }\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nLWPOLYLINE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << point1.x << \"\\n\"\n           << \"20\\n\" << point1.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"10\\n\" << point2.x << \"\\n\"\n           << \"20\\n\" << point2.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"10\\n\" << point3.x << \"\\n\"\n           << \"20\\n\" << point3.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"10\\n\" << point4.x << \"\\n\"\n           << \"20\\n\" << point4.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"70\\n\" << closed << \"\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numPolyLines() == 1);\n    DxfPolyLine polyline = dxfParser.getLayer(layer.c_str())->getPolyLine(0);\n    REQUIRE(polyline.numVertices() == 4);\n    REQUIRE(polyline.getVertex(0).x == Approx(point1.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(0).y == Approx(point1.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(1).x == Approx(point2.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(1).y == Approx(point2.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(2).x == Approx(point3.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(2).y == Approx(point3.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(3).x == Approx(point4.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(3).y == Approx(point4.y).epsilon(EPSILON));\n    REQUIRE((polyline.getAttributes() & polyline.CLOSED) == closed);\n}\n\nTEST_CASE(\"DXF Parsing (polyline)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f point1(-1,-2);\n    Point2f point2(3,4);\n    Point2f point3(-5,6);\n    Point2f point4(7,-8);\n    std::string layer(\"0\");\n\n    int closed = 0;\n\n    SECTION (\"open polyline\") {\n        closed = 0;\n    }\n    SECTION (\"closed polyline\") {\n        closed = 1;\n    }\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nPOLYLINE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"70\\n\" << closed << \"\\n\"\n           << \"0\\nVERTEX\\n\"\n           << \"10\\n\" << point1.x << \"\\n\"\n           << \"20\\n\" << point1.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"0\\nVERTEX\\n\"\n           << \"10\\n\" << point2.x << \"\\n\"\n           << \"20\\n\" << point2.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"0\\nVERTEX\\n\"\n           << \"10\\n\" << point3.x << \"\\n\"\n           << \"20\\n\" << point3.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"0\\nVERTEX\\n\"\n           << \"10\\n\" << point4.x << \"\\n\"\n           << \"20\\n\" << point4.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"0\\nSEQEND\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numPolyLines() == 1);\n    DxfPolyLine polyline = dxfParser.getLayer(layer.c_str())->getPolyLine(0);\n    REQUIRE(polyline.numVertices() == 4);\n    REQUIRE(polyline.getVertex(0).x == Approx(point1.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(0).y == Approx(point1.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(1).x == Approx(point2.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(1).y == Approx(point2.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(2).x == Approx(point3.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(2).y == Approx(point3.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(3).x == Approx(point4.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(3).y == Approx(point4.y).epsilon(EPSILON));\n    REQUIRE((polyline.getAttributes() & polyline.CLOSED) == closed);\n}\n\nTEST_CASE(\"DXF Parsing (spline)\")\n{\n    const float EPSILON = 0.001f;\n\n    std::vector<double> weights = {\n        0.0, 0.0, 0.0, 0.0,\n        2.72, 5.15, 6.93,\n        6.93, 6.93, 6.93};\n\n    std::vector<Point2f> controlPoints = {\n        Point2f(32.80, 27.09),\n        Point2f(31.58, 26.71),\n        Point2f(29.28, 25.98),\n        Point2f(30.69, 30.55),\n        Point2f(31.35, 28.67),\n        Point2f(31.64, 27.87)\n    };\n\n    std::vector<Point2f> fitPoints = {\n       Point2f(32.80, 27.09),\n       Point2f(30.08, 27.09),\n       Point2f(30.75, 29.42),\n       Point2f(31.64, 27.87),\n    };\n    std::string layer(\"0\");\n\n    int closed = 0;\n\n    SECTION (\"open spline\") {\n        closed = 0;\n    }\n    SECTION (\"closed spline\") {\n        closed = 1;\n    }\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nSPLINE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"70\\n\"<< closed << \"\\n\"\n           << \"72\\n\"<< (controlPoints.size() + fitPoints.size()) << \"\\n\"\n           << \"73\\n\"<< controlPoints.size() << \"\\n\";\n\n    std::vector<double>::iterator weightsIter = weights.begin(), weightsEnd =\n    weights.end();\n    for ( ; weightsIter != weightsEnd; ++weightsIter )\n    {\n        stream << \"40\\n\" << *weightsIter << \"\\n\";\n    }\n\n    std::vector<Point2f>::iterator cPointsIter = controlPoints.begin(), cPointsEnd =\n    controlPoints.end();\n    for ( ; cPointsIter != cPointsEnd; ++cPointsIter )\n    {\n        Point2f point = *cPointsIter;\n        stream << \"10\\n\" << point.x << \"\\n\"\n               << \"20\\n\" << point.y << \"\\n\"\n               << \"30\\n0\\n\";\n    }\n\n    std::vector<Point2f>::iterator fPointsIter = fitPoints.begin(), fPointsEnd =\n    fitPoints.end();\n    for ( ; fPointsIter != fPointsEnd; ++fPointsIter )\n    {\n        Point2f point = *fPointsIter;\n        stream << \"11\\n\" << point.x << \"\\n\"\n               << \"21\\n\" << point.y << \"\\n\"\n               << \"31\\n0\\n\";\n    }\n\n    stream << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numSplines() == 1);\n    DxfSpline spline = dxfParser.getLayer(layer.c_str())->getSpline(0);\n    REQUIRE(spline.numVertices() == controlPoints.size());\n    for (size_t i = 0; i < controlPoints.size(); i++)\n    {\n        REQUIRE(spline.getVertex(i).x == Approx(controlPoints[i].x).epsilon(EPSILON));\n        REQUIRE(spline.getVertex(i).y == Approx(controlPoints[i].y).epsilon(EPSILON));\n    }\n    REQUIRE((spline.getAttributes() & spline.CLOSED) == closed);\n}\nTEST_CASE(\"DXF Parsing (zero-length line)\")\n{\n    // parser skips zero-length lines\n\n    const float EPSILON = 0.001f;\n    Point2f lineStart(1,2);\n    Point2f lineEnd(1,2);\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nLINE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << lineStart.x << \"\\n\"\n           << \"20\\n\" << lineStart.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"11\\n\" << lineEnd.x << \"\\n\"\n           << \"21\\n\" << lineEnd.y << \"\\n\"\n           << \"31\\n0\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numLines() == 0);\n}\n\nTEST_CASE(\"DXF Parsing (zero-length lwpolyline)\")\n{\n    // parser does not skip zero-length polylines\n\n    const float EPSILON = 0.001f;\n    Point2f point1(1,2);\n    Point2f point2(1,2);\n    std::string layer(\"0\");\n\n    int closed = 0;\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nLWPOLYLINE\\n\"\n           << \"8\\n\"<< layer << \"\\n\"\n           << \"10\\n\" << point1.x << \"\\n\"\n           << \"20\\n\" << point1.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"10\\n\" << point2.x << \"\\n\"\n           << \"20\\n\" << point2.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"70\\n\" << closed << \"\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numPolyLines() == 1);\n    DxfPolyLine polyline = dxfParser.getLayer(layer.c_str())->getPolyLine(0);\n    REQUIRE(polyline.numVertices() == 2);\n    REQUIRE(polyline.getVertex(0).x == Approx(point1.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(0).y == Approx(point1.y).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(1).x == Approx(point2.x).epsilon(EPSILON));\n    REQUIRE(polyline.getVertex(1).y == Approx(point2.y).epsilon(EPSILON));\n    REQUIRE((polyline.getAttributes() & polyline.CLOSED) == closed);\n}\n\n\nTEST_CASE(\"DXF Parsing (block)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f lineStart(-1,-2);\n    Point2f lineEnd(3,4);\n    std::string block(\"bl\");\n    Point2f blockTranslation(5, -6);\n    Point2f blockScale(1, 1);\n    double blockRotation = 0;\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nBLOCKS\\n\"\n           << \"0\\nBLOCK\\n\"\n           << \"2\\n\" << block << \"\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"0\\nLINE\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"10\\n\" << lineStart.x << \"\\n\"\n           << \"20\\n\" << lineStart.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"11\\n\" << lineEnd.x << \"\\n\"\n           << \"21\\n\" << lineEnd.y << \"\\n\"\n           << \"31\\n0\\n\"\n           << \"0\\nENDBLK\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nINSERT\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"2\\n\" << block << \"\\n\"\n           << \"10\\n\" << blockTranslation.x << \"\\n\"\n           << \"20\\n\" << blockTranslation.y << \"\\n\"\n           << \"30\\n\" << 0 << \"\\n\"\n           << \"41\\n\" << blockScale.x << \"\\n\"\n           << \"42\\n\" << blockScale.y << \"\\n\"\n           << \"43\\n\" << 0 << \"\\n\"\n           << \"50\\n\" << blockRotation << \"\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numLines() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getStart().x == Approx(lineStart.x + blockTranslation.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getStart().y == Approx(lineStart.y + blockTranslation.y).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getEnd().x == Approx(lineEnd.x + blockTranslation.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getEnd().y == Approx(lineEnd.y + blockTranslation.y).epsilon(EPSILON));\n}\n\n\nTEST_CASE(\"DXF Parsing (deeper blocks)\")\n{\n    const float EPSILON = 0.001f;\n    Point2f lineStart(-1,-2);\n    Point2f lineEnd(3,4);\n    std::string block(\"bl\");\n    std::string blockInternal(\"bli\");\n    Point2f blockTranslation(5, -6);\n    Point2f blockScale(1, 1);\n    double blockRotation = 0;\n    std::string layer(\"0\");\n\n    std::stringstream stream;\n\n    stream << \"0\\nSECTION\\n\"\n           << \"2\\nBLOCKS\\n\"\n           << \"0\\nBLOCK\\n\"\n           << \"2\\n\" << block << \"\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n\n           << \"0\\nINSERT\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"2\\n\" << blockInternal << \"\\n\"\n           << \"10\\n\" << blockTranslation.x << \"\\n\"\n           << \"20\\n\" << blockTranslation.y << \"\\n\"\n           << \"30\\n\" << 0 << \"\\n\"\n           << \"41\\n\" << blockScale.x << \"\\n\"\n           << \"42\\n\" << blockScale.y << \"\\n\"\n           << \"43\\n\" << 0 << \"\\n\"\n           << \"50\\n\" << blockRotation << \"\\n\"\n\n           << \"0\\nENDBLK\\n\"\n           << \"0\\nBLOCK\\n\"\n           << \"2\\n\" << blockInternal << \"\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"0\\nLINE\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"10\\n\" << lineStart.x << \"\\n\"\n           << \"20\\n\" << lineStart.y << \"\\n\"\n           << \"30\\n0\\n\"\n           << \"11\\n\" << lineEnd.x << \"\\n\"\n           << \"21\\n\" << lineEnd.y << \"\\n\"\n           << \"31\\n0\\n\"\n           << \"0\\nENDBLK\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nSECTION\\n\"\n           << \"2\\nENTITIES\\n\"\n           << \"0\\nINSERT\\n\"\n           << \"8\\n\" << layer << \"\\n\"\n           << \"2\\n\" << block << \"\\n\"\n           << \"10\\n\" << blockTranslation.x << \"\\n\"\n           << \"20\\n\" << blockTranslation.y << \"\\n\"\n           << \"30\\n\" << 0 << \"\\n\"\n           << \"41\\n\" << blockScale.x << \"\\n\"\n           << \"42\\n\" << blockScale.y << \"\\n\"\n           << \"43\\n\" << 0 << \"\\n\"\n           << \"50\\n\" << blockRotation << \"\\n\"\n           << \"0\\nENDSEC\\n\"\n           << \"0\\nEOF\\n\";\n\n    DxfParser dxfParser;\n    dxfParser.open(stream);\n    REQUIRE(dxfParser.numLayers() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->numLines() == 1);\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getStart().x == Approx(lineStart.x + 2*blockTranslation.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getStart().y == Approx(lineStart.y + 2*blockTranslation.y).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getEnd().x == Approx(lineEnd.x + 2*blockTranslation.x).epsilon(EPSILON));\n    REQUIRE(dxfParser.getLayer(layer.c_str())->getLine(0).getEnd().y == Approx(lineEnd.y + 2*blockTranslation.y).epsilon(EPSILON));\n}\n"
  },
  {
    "path": "salaTest/testentityparsing.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros, Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/entityparsing.h\"\n#include \"genlib/p2dpoly.h\"\n#include <sstream>\n#include <vector>\n\nTEST_CASE(\"Failing line parser\", \"\")\n{\n    const float EPSILON = 0.001;\n    {\n        // header only has 3 elements\n        std::stringstream stream;\n        stream << \"x1,y1,x2\" << std::endl;\n        REQUIRE_THROWS_WITH(EntityParsing::parseLines(stream,','), Catch::Contains(\"Badly formatted header (should contain x1, y1, x2 and y2)\"));\n    }\n\n    {\n        // header has y1 twice instead of y2\n        std::stringstream stream;\n        stream << \"x1,y1,x2,y1\" << std::endl;\n        REQUIRE_THROWS_WITH(EntityParsing::parseLines(stream,','), Catch::Contains(\"Badly formatted header (should contain x1, y1, x2 and y2)\"));\n    }\n\n    {\n        // error parsing line\n        std::stringstream stream;\n        stream << \"x1,y1,x2,y2\" << std::endl;\n        stream << \"1.2,3.4,5.6\" << std::endl;\n        REQUIRE_THROWS_WITH(EntityParsing::parseLines(stream,','), Catch::Contains(\"Error parsing line\"));\n    }\n}\nTEST_CASE(\"Successful line parser\", \"\")\n{\n    const float EPSILON = 0.001;\n    {\n        std::stringstream stream;\n        stream << \"x1,y1,x2,y2\" << std::endl;\n        stream << \"1.2,3.4,5.6,7.8\" << std::endl;\n        std::vector<Line> lines = EntityParsing::parseLines(stream,',');\n        REQUIRE(lines.size() == 1);\n        REQUIRE(lines[0].start().x == Approx(1.2).epsilon(EPSILON));\n        REQUIRE(lines[0].start().y == Approx(3.4).epsilon(EPSILON));\n        REQUIRE(lines[0].end().x == Approx(5.6).epsilon(EPSILON));\n        REQUIRE(lines[0].end().y == Approx(7.8).epsilon(EPSILON));\n    }\n\n    {\n        std::stringstream stream;\n        stream << \"x1\\ty1\\tx2\\ty2\" << std::endl;\n        stream << \"1.2\\t3.4\\t5.6\\t7.8\" << std::endl;\n        std::vector<Line> lines = EntityParsing::parseLines(stream,'\\t');\n        REQUIRE(lines.size() == 1);\n        REQUIRE(lines[0].start().x == Approx(1.2).epsilon(EPSILON));\n        REQUIRE(lines[0].start().y == Approx(3.4).epsilon(EPSILON));\n        REQUIRE(lines[0].end().x == Approx(5.6).epsilon(EPSILON));\n        REQUIRE(lines[0].end().y == Approx(7.8).epsilon(EPSILON));\n    }\n\n    {\n        std::stringstream stream;\n        stream << \"x1\\ty1\\tx2\\ty2\" << std::endl;\n        stream << \"1.2\\t3.4\\t5.6\\t7.8\" << std::endl;\n        stream << \"0.1\\t0.2\\t0.3\\t0.4\" << std::endl;\n        std::vector<Line> lines = EntityParsing::parseLines(stream,'\\t');\n        REQUIRE(lines.size() == 2);\n        REQUIRE(lines[0].start().x == Approx(1.2).epsilon(EPSILON));\n        REQUIRE(lines[0].start().y == Approx(3.4).epsilon(EPSILON));\n        REQUIRE(lines[0].end().x == Approx(5.6).epsilon(EPSILON));\n        REQUIRE(lines[0].end().y == Approx(7.8).epsilon(EPSILON));\n        REQUIRE(lines[1].start().x == Approx(0.1).epsilon(EPSILON));\n        REQUIRE(lines[1].start().y == Approx(0.2).epsilon(EPSILON));\n        REQUIRE(lines[1].end().x == Approx(0.3).epsilon(EPSILON));\n        REQUIRE(lines[1].end().y == Approx(0.4).epsilon(EPSILON));\n    }\n}\n\nTEST_CASE(\"Failing point parser\", \"\")\n{\n    const float EPSILON = 0.001;\n    {\n        // header only has 3 elements\n        std::stringstream stream;\n        stream << \"x\" << std::endl;\n        REQUIRE_THROWS_WITH(EntityParsing::parsePoints(stream,','), Catch::Contains(\"Badly formatted header (should contain x and y)\"));\n    }\n\n    {\n        // header has y1 twice instead of y2\n        std::stringstream stream;\n        stream << \"x,x\" << std::endl;\n        REQUIRE_THROWS_WITH(EntityParsing::parsePoints(stream,','), Catch::Contains(\"Badly formatted header (should contain x and y)\"));\n    }\n\n    {\n        // error parsing line\n        std::stringstream stream;\n        stream << \"x,y\" << std::endl;\n        stream << \"1.2\" << std::endl;\n        REQUIRE_THROWS_WITH(EntityParsing::parsePoints(stream,','), Catch::Contains(\"Error parsing line\"));\n    }\n}\nTEST_CASE(\"Successful point parser\", \"\")\n{\n    const float EPSILON = 0.001;\n    {\n        std::stringstream stream;\n        stream << \"x,y\" << std::endl;\n        stream << \"1.2,3.4\" << std::endl;\n        std::vector<Point2f> points = EntityParsing::parsePoints(stream,',');\n        REQUIRE(points.size() == 1);\n        REQUIRE(points[0].x == Approx(1.2).epsilon(EPSILON));\n        REQUIRE(points[0].y == Approx(3.4).epsilon(EPSILON));\n    }\n\n    {\n        std::stringstream stream;\n        stream << \"x\\ty\" << std::endl;\n        stream << \"1.2\\t3.4\" << std::endl;\n        std::vector<Point2f> points = EntityParsing::parsePoints(stream,'\\t');\n        REQUIRE(points.size() == 1);\n        REQUIRE(points[0].x == Approx(1.2).epsilon(EPSILON));\n        REQUIRE(points[0].y == Approx(3.4).epsilon(EPSILON));\n    }\n\n    {\n        std::stringstream stream;\n        stream << \"x\\ty\" << std::endl;\n        stream << \"1.2\\t3.4\" << std::endl;\n        stream << \"0.1\\t0.2\" << std::endl;\n        std::vector<Point2f> points = EntityParsing::parsePoints(stream,'\\t');\n        REQUIRE(points.size() == 2);\n        REQUIRE(points[0].x == Approx(1.2).epsilon(EPSILON));\n        REQUIRE(points[0].y == Approx(3.4).epsilon(EPSILON));\n        REQUIRE(points[1].x == Approx(0.1).epsilon(EPSILON));\n        REQUIRE(points[1].y == Approx(0.2).epsilon(EPSILON));\n    }\n}\n\n\nTEST_CASE(\"Test point parsing\")\n{\n    REQUIRE_THROWS_WITH(EntityParsing::parsePoint(\"foo\", '|'), Catch::Contains(\"Badly formatted point data, should be <number>|<number>, was foo\" ));\n    auto point = EntityParsing::parsePoint(\"1.235|27.25\", '|');\n    REQUIRE(point.x == Approx(1.235));\n    REQUIRE(point.y == Approx(27.25));\n\n    point = EntityParsing::parsePoint(\"1.235|bar\", '|');\n    REQUIRE(point.x == Approx(1.235));\n    REQUIRE(point.y == 0.0);\n}\n\nTEST_CASE(\"Successful Isovist parser\")\n{\n    const float EPSILON = 0.0001;\n    {\n        std::stringstream stream;\n        stream << \"x,y\\n1.0,2.34\\n0.5,9.2\\n\" << std::flush;\n        auto result = EntityParsing::parseIsovists(stream, ',');\n        REQUIRE(result.size() == 2);\n        REQUIRE(result[0].getLocation().x == Approx(1.0).epsilon(EPSILON));\n        REQUIRE(result[0].getLocation().y == Approx(2.34).epsilon(EPSILON));\n        REQUIRE(result[0].getAngle() == Approx(0.0).epsilon(EPSILON));\n        REQUIRE(result[0].getViewAngle() == 0.0);\n        REQUIRE(result[1].getLocation().x == Approx(0.5).epsilon(EPSILON));\n        REQUIRE(result[1].getLocation().y == Approx(9.2).epsilon(EPSILON));\n        REQUIRE(result[1].getAngle() == Approx(0.0).epsilon(EPSILON));\n        REQUIRE(result[1].getViewAngle() == 0.0);\n    }\n    {\n        std::stringstream stream;\n        stream << \"x,y,angle,viewAngle\\n1.0,2.34,90,90\\n0.5,9.2,180,270\\n\" << std::flush;\n        auto result = EntityParsing::parseIsovists(stream, ',');\n        REQUIRE(result.size() == 2);\n        REQUIRE(result[0].getLocation().x == Approx(1.0).epsilon(EPSILON));\n        REQUIRE(result[0].getLocation().y == Approx(2.34).epsilon(EPSILON));\n        REQUIRE(result[0].getAngle() == Approx(M_PI/2.0).epsilon(EPSILON));\n        REQUIRE(result[0].getViewAngle() == Approx(M_PI/2.0).epsilon(EPSILON));\n        REQUIRE(result[1].getLocation().x == Approx(0.5).epsilon(EPSILON));\n        REQUIRE(result[1].getLocation().y == Approx(9.2).epsilon(EPSILON));\n        REQUIRE(result[1].getAngle() == Approx(M_PI).epsilon(EPSILON));\n        REQUIRE(result[1].getViewAngle() == Approx(M_PI*1.5).epsilon(EPSILON));\n    }\n}\n\nTEST_CASE(\"Failing Isovist parser\")\n{\n    {\n        std::stringstream stream;\n        stream << \"x,angle,viewAngle\\n\" << std::flush;\n        REQUIRE_THROWS_WITH(EntityParsing::parseIsovists(stream, ','), Catch::Contains(\"Badly formatted header (should contain x and y, might also have angle and viewangle for partial isovists)\"));\n    }\n\n    {\n        std::stringstream stream;\n        stream << \"x,y,angle,viewAngle\\n1.0,1.0,270\" << std::flush;\n        REQUIRE_THROWS_WITH(EntityParsing::parseIsovists(stream, ','), Catch::Contains(\"Error parsing line: 1.0,1.0,270\"));\n    }\n}\n\nTEST_CASE(\"Parsing single isovist\")\n{\n    SECTION(\"Success full\")\n    {\n        auto result =  EntityParsing::parseIsovist(\"1,1\");\n        REQUIRE(result.getLocation().x == Approx(1.0));\n        REQUIRE(result.getLocation().y == Approx(1.0));\n        REQUIRE(result.getAngle() == 0.0);\n        REQUIRE(result.getViewAngle() == 0.0);\n    }\n\n    SECTION(\"Success partial isovist\")\n    {\n        auto result =  EntityParsing::parseIsovist(\"1,1,27,90\");\n        REQUIRE(result.getLocation().x == Approx(1.0));\n        REQUIRE(result.getLocation().y == Approx(1.0));\n        REQUIRE(result.getAngle() == Approx(0.4712388));\n        REQUIRE(result.getViewAngle() == Approx(M_PI/2.0));\n    }\n\n    SECTION(\"Failed bad string\")\n    {\n        REQUIRE_THROWS_WITH(EntityParsing::parseIsovist(\"1,1,27\"), Catch::Contains(\"Failed to parse '1,1,27' to an isovist definition\"));\n    }\n}\n"
  },
  {
    "path": "salaTest/testgeometrygenerators.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros, Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/geometrygenerators.h\"\n#include \"genlib/p2dpoly.h\"\n\nTEST_CASE(\"Test disk triangles generation\", \"\")\n{\n    const float EPSILON = 0.001;\n    int sides = 8;\n    float radius = 2;\n\n    std::vector<Point2f> expected {\n        Point2f(0,0), Point2f(1.41421,1.41421),   Point2f(0,2),\n        Point2f(0,0), Point2f(2,0),               Point2f(1.41421,1.41421),\n        Point2f(0,0), Point2f(1.41421,-1.41421),  Point2f(2,0),\n        Point2f(0,0), Point2f(0,-2),              Point2f(1.41421,-1.41421),\n        Point2f(0,0), Point2f(-1.41421,-1.41421), Point2f(0,-2),\n        Point2f(0,0), Point2f(-2,0),              Point2f(-1.41421,-1.41421),\n        Point2f(0,0), Point2f(-1.41421,1.41421),  Point2f(-2,0),\n        Point2f(0,0), Point2f(0,2),               Point2f(-1.41421,1.41421)\n    };\n\n    std::vector<Point2f> diskTriangles = GeometryGenerators::generateDiskTriangles(sides, radius);\n\n    REQUIRE(diskTriangles.size() == expected.size());\n    for(size_t i = 0; i < diskTriangles.size(); i++) {\n        REQUIRE(diskTriangles[i].x == Approx(expected[i].x).epsilon(EPSILON));\n        REQUIRE(diskTriangles[i].y == Approx(expected[i].y).epsilon(EPSILON));\n    }\n\n    std::vector<Point2f> offsets {\n        Point2f(1,2), Point2f(3, -4), Point2f(-5, -6), Point2f(-7, 8)\n    };\n\n    std::vector<Point2f> multiDiskTriangles = GeometryGenerators::generateMultipleDiskTriangles(sides, radius, offsets);\n\n    REQUIRE(multiDiskTriangles.size() == expected.size()*offsets.size());\n\n    for(size_t i = 0; i < multiDiskTriangles.size(); i++) {\n        REQUIRE(multiDiskTriangles[i].x == Approx(expected[i%(sides*3)].x + offsets[i/(sides*3)].x).epsilon(EPSILON));\n        REQUIRE(multiDiskTriangles[i].y == Approx(expected[i%(sides*3)].y + offsets[i/(sides*3)].y).epsilon(EPSILON));\n    }\n}\n\nTEST_CASE(\"Test circle perimeter line generation\", \"\")\n{\n    const float EPSILON = 0.001;\n    int sides = 8;\n    float radius = 2;\n\n    std::vector<SimpleLine> expected {\n        SimpleLine(Point2f(1.41421,1.41421),   Point2f(0,2)),\n        SimpleLine(Point2f(2,0),               Point2f(1.41421,1.41421)),\n        SimpleLine(Point2f(1.41421,-1.41421),  Point2f(2,0)),\n        SimpleLine(Point2f(0,-2),              Point2f(1.41421,-1.41421)),\n        SimpleLine(Point2f(-1.41421,-1.41421), Point2f(0,-2)),\n        SimpleLine(Point2f(-2,0),              Point2f(-1.41421,-1.41421)),\n        SimpleLine(Point2f(-1.41421,1.41421),  Point2f(-2,0)),\n        SimpleLine(Point2f(0,2),               Point2f(-1.41421,1.41421))\n    };\n\n    std::vector<SimpleLine> circleLines = GeometryGenerators::generateCircleLines(sides, radius);\n\n    REQUIRE(circleLines.size() == expected.size());\n    for(size_t i = 0; i < circleLines.size(); i++) {\n        REQUIRE(circleLines[i].start().x == Approx(expected[i].start().x).epsilon(EPSILON));\n        REQUIRE(circleLines[i].start().y == Approx(expected[i].start().y).epsilon(EPSILON));\n        REQUIRE(circleLines[i].end().x == Approx(expected[i].end().x).epsilon(EPSILON));\n        REQUIRE(circleLines[i].end().y == Approx(expected[i].end().y).epsilon(EPSILON));\n    }\n\n    std::vector<Point2f> offsets {\n        Point2f(1,2), Point2f(3, -4), Point2f(-5, -6), Point2f(-7, 8)\n    };\n\n    std::vector<SimpleLine> multiCircleLines = GeometryGenerators::generateMultipleCircleLines(sides, radius, offsets);\n\n    REQUIRE(multiCircleLines.size() == expected.size()*offsets.size());\n\n    for(size_t i = 0; i < multiCircleLines.size(); i++) {\n        REQUIRE(multiCircleLines[i].start().x == Approx(expected[i%sides].start().x + offsets[i/sides].x).epsilon(EPSILON));\n        REQUIRE(multiCircleLines[i].start().y == Approx(expected[i%sides].start().y + offsets[i/sides].y).epsilon(EPSILON));\n        REQUIRE(multiCircleLines[i].end().x == Approx(expected[i%sides].end().x + offsets[i/sides].x).epsilon(EPSILON));\n        REQUIRE(multiCircleLines[i].end().y == Approx(expected[i%sides].end().y + offsets[i/sides].y).epsilon(EPSILON));\n    }\n}\n"
  },
  {
    "path": "salaTest/testgridproperties.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/gridproperties.h\"\n\nTEST_CASE(\"TestGridProperties\", \"Test the calculations of grid properties\")\n{\n    double maxDimension = 4.583;\n    GridProperties gp(maxDimension);\n    REQUIRE(gp.getDefault() == Approx(0.04));\n    REQUIRE(gp.getMax() == Approx(0.8));\n    REQUIRE(gp.getMin() == Approx(0.004));\n}\n"
  },
  {
    "path": "salaTest/testisovist.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mgraph.h\"\n\nTEST_CASE(\"Simple Isovist\") {\n\n    const float EPSILON = 0.001;\n\n    // simple plan for isovist. dot as the origin\n    //  _ _ _ _\n    // |     . |\n    // |    _ _|\n    // |   |\n    // |_ _|\n\n    std::vector<Line> planLines = {\n        Line(Point2f(1, 1), Point2f(1, 3)), //\n        Line(Point2f(1, 3), Point2f(3, 3)), //\n        Line(Point2f(3, 3), Point2f(3, 2)), //\n        Line(Point2f(3, 2), Point2f(2, 2)), //\n        Line(Point2f(2, 2), Point2f(2, 1)), //\n        Line(Point2f(2, 1), Point2f(1, 1))  //\n    };\n\n    Point2f isovistOrigin(2.5, 2.5);\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n    metaGraph->m_drawingFiles.emplace_back(\"Test SpacePixelGroup\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Test ShapeMap\");\n    for (Line &line : planLines) {\n        metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(line);\n    }\n\n    SECTION(\"With a communicator\") {\n        std::unique_ptr<Communicator> comm(new ICommunicator);\n        metaGraph->makeIsovist(comm.get(), isovistOrigin, 0, 0, false);\n    }\n    SECTION(\"Without a communicator\") { metaGraph->makeIsovist(nullptr, isovistOrigin, 0, 0, false); }\n\n    SalaShape &isovist = metaGraph->getDataMaps().front().getAllShapes().begin()->second;\n\n    REQUIRE(isovist.isClosed());\n    REQUIRE(isovist.isPolygon());\n\n\n    // TODO: The current implementation generates a polygon of 12 points, potentially\n    // because it takes them directly from the isovist gaps. This isovist only really\n    // needs 5 points so it might make sense to run some sort of optimisation right\n    // after generating the isovists\n\n    REQUIRE(isovist.m_points.size() == 12);\n\n    REQUIRE(isovist.m_points[0].x == Approx(3.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[0].y == Approx(3.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[1].x == Approx(2.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[1].y == Approx(3.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[2].x == Approx(1.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[2].y == Approx(3.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[3].x == Approx(1.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[3].y == Approx(3.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[4].x == Approx(1.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[4].y == Approx(1.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[5].x == Approx(2.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[5].y == Approx(2.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[6].x == Approx(2.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[6].y == Approx(2.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[7].x == Approx(2.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[7].y == Approx(2.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[8].x == Approx(3.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[8].y == Approx(2.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[9].x == Approx(3.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[9].y == Approx(2.0).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[10].x == Approx(3.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[10].y == Approx(2.5).epsilon(EPSILON));\n\n    REQUIRE(isovist.m_points[11].x == Approx(3.0).epsilon(EPSILON));\n    REQUIRE(isovist.m_points[11].y == Approx(2.5).epsilon(EPSILON));\n}\n"
  },
  {
    "path": "salaTest/testisovistdef.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"../salalib/isovistdef.h\"\n\nTEST_CASE(\"Full Isovist\")\n{\n    IsovistDefinition isovist(1.0, 1.0);\n    REQUIRE(isovist.getLocation().x == Approx(1.0));\n    REQUIRE(isovist.getLocation().y == Approx(1.0));\n    REQUIRE(isovist.getAngle() == 0.0);\n    REQUIRE(isovist.getViewAngle() == 0.0);\n}\n\nTEST_CASE(\"Partial Isovist\")\n{\n    SECTION(\"No overrun\")\n    {\n        IsovistDefinition isovist(1.0, 1.0, 2.0, 1.0);\n        REQUIRE(isovist.getLocation().x == Approx(1.0));\n        REQUIRE(isovist.getLocation().y == Approx(1.0));\n        REQUIRE(isovist.getAngle() == Approx(2.0));\n        REQUIRE(isovist.getViewAngle() == Approx(1.0));\n        REQUIRE(isovist.getLeftAngle() == Approx(1.5) );\n        REQUIRE(isovist.getRightAngle() == Approx(2.5) );\n    }\n\n    SECTION(\"Overrun left\")\n    {\n        IsovistDefinition isovist(1.0, 1.0, 0.1, 1.0);\n        REQUIRE(isovist.getLocation().x == Approx(1.0));\n        REQUIRE(isovist.getLocation().y == Approx(1.0));\n        REQUIRE(isovist.getAngle() == Approx(0.1));\n        REQUIRE(isovist.getViewAngle() == Approx(1.0));\n        REQUIRE(isovist.getLeftAngle() == Approx(5.8831853072) );\n        REQUIRE(isovist.getRightAngle() == Approx(0.6) );\n\n    }\n\n    SECTION(\"Overrun right\")\n    {\n        IsovistDefinition isovist(1.0, 1.0, 6.1, 1.0);\n        REQUIRE(isovist.getLocation().x == Approx(1.0));\n        REQUIRE(isovist.getLocation().y == Approx(1.0));\n        REQUIRE(isovist.getAngle() == Approx(6.1));\n        REQUIRE(isovist.getViewAngle() == Approx(1.0));\n        REQUIRE(isovist.getLeftAngle() == Approx(5.6) );\n        REQUIRE(isovist.getRightAngle() == Approx(0.31681469) );\n    }\n\n    SECTION(\"Actually a full isovist in a partial list\")\n    {\n        IsovistDefinition isovist(1.0, 1.0, 6.1, 2 * M_PI);\n        REQUIRE(isovist.getLocation().x == Approx(1.0));\n        REQUIRE(isovist.getLocation().y == Approx(1.0));\n        REQUIRE(isovist.getAngle() == 0.0);\n        REQUIRE(isovist.getViewAngle() == 0.0);\n        REQUIRE(isovist.getLeftAngle() == 0.0);\n        REQUIRE(isovist.getRightAngle() == 0.0 );\n\n    }\n\n}\n"
  },
  {
    "path": "salaTest/testlayermanager.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include <catch.hpp>\n#include <salalib/layermanagerimpl.h>\n#include <cliTest/selfcleaningfile.h>\n#include <fstream>\n\nTEST_CASE(\"Test layer manager\")\n{\n    LayerManagerImpl manager;\n    REQUIRE(manager.isVisible(1));\n    REQUIRE(manager.getLayerName(0) == \"Everything\");\n    REQUIRE(manager.isLayerVisible(0));\n    REQUIRE(manager.getLayerIndex(\"Everything\") == 0);\n    REQUIRE(manager.getKey(0) == 1);\n\n\n    size_t index1 = manager.addLayer(\"some layer\");\n    REQUIRE(index1 == 1);\n    REQUIRE_FALSE(manager.isVisible(2));\n    REQUIRE_FALSE(manager.isLayerVisible(1));\n    REQUIRE(manager.getLayerName(1) == \"some layer\");\n    REQUIRE(manager.getLayerIndex(\"some layer\") == 1);\n    REQUIRE(manager.getKey(1) == 2);\n    REQUIRE(manager.getKey(5) == 32);\n\n    manager.setLayerVisible(1, true);\n    REQUIRE_FALSE(manager.isVisible(1));\n    REQUIRE(manager.isVisible(2));\n\n    size_t index2 = manager.addLayer(\"another layer\");\n    REQUIRE(index2 == 2);\n    REQUIRE(manager.getLayerName(2) == \"another layer\");\n    REQUIRE(manager.getLayerIndex(\"another layer\") == 2);\n    REQUIRE_FALSE(manager.isLayerVisible(2));\n\n    manager.setLayerVisible(2, true);\n    REQUIRE_FALSE(manager.isVisible(1));\n    REQUIRE(manager.isVisible(2));\n    REQUIRE(manager.isVisible(4));\n\n    manager.setLayerVisible(2, false);\n    REQUIRE_FALSE(manager.isVisible(1));\n    REQUIRE(manager.isVisible(2));\n    REQUIRE_FALSE(manager.isVisible(4));\n\n    manager.setLayerVisible(0, false);\n    REQUIRE_FALSE(manager.isVisible(1));\n    REQUIRE_FALSE(manager.isVisible(2));\n    REQUIRE_FALSE(manager.isVisible(4));\n\n    manager.setLayerVisible(2, true);\n    REQUIRE_FALSE(manager.isVisible(1));\n    REQUIRE_FALSE(manager.isVisible(2));\n    REQUIRE(manager.isVisible(4));\n\n    manager.setLayerVisible(0, true);\n    REQUIRE(manager.isVisible(1));\n    REQUIRE_FALSE(manager.isVisible(2));\n    REQUIRE_FALSE(manager.isVisible(4));\n\n    REQUIRE_THROWS_AS(manager.addLayer(\"another layer\"), LayerManager::DuplicateKeyException);\n\n    // test read and write\n    SelfCleaningFile serialisedManager(\"manager.bin\");\n    {\n        std::ofstream file(serialisedManager.Filename());\n        manager.write(file);\n    }\n\n    LayerManagerImpl copy;\n    {\n        std::ifstream file(serialisedManager.Filename());\n        copy.read(file);\n    }\n    REQUIRE(copy.getLayerName(1) == \"some layer\");\n    REQUIRE(copy.getLayerIndex(\"some layer\") == 1);\n    REQUIRE(copy.isVisible(1));\n    REQUIRE_FALSE(copy.isVisible(2));\n    REQUIRE_FALSE(copy.isVisible(4));\n\n\n}\n"
  },
  {
    "path": "salaTest/testlinkutils.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mgraph.h\"\n#include \"salalib/linkutils.h\"\n\n\nTEST_CASE(\"Test linking - fully filled grid (no geometry)\", \"\")\n{\n    double spacing = 0.5;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n    Point2f bottomLeft(0,0);\n    Point2f topRight(2,4);\n    int fill_type = 0; // = QDepthmapView::FULLFILL\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n    metaGraph->setRegion(bottomLeft, topRight);\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n    pointMap.setGrid(spacing, offset);\n    Point2f gridBottomLeft = pointMap.getRegion().bottom_left;\n    Point2f midPoint(gridBottomLeft.x + spacing * (floor(pointMap.getCols() * 0.5) + 0.5),\n                         gridBottomLeft.y + spacing * (floor(pointMap.getRows() * 0.5) + 0.5));\n    pointMap.makePoints(midPoint, fill_type);\n\n    std::vector<Line> mergeLines;\n\n    SECTION (\"Successful: bottom-left to top-right\")\n    {\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE(links.size() == 1);\n        REQUIRE(links[0].a.x == 0);\n        REQUIRE(links[0].a.y == 0);\n        REQUIRE(links[0].b.x == 4);\n        REQUIRE(links[0].b.y == 8);\n\n        // make sure pixels are not already merged\n        REQUIRE(!pointMap.isPixelMerged(links[0].a));\n        REQUIRE(!pointMap.isPixelMerged(links[0].b));\n\n        // merge\n        depthmapX::mergePixelPairs(links, pointMap);\n\n        // make sure pixels are merged\n        REQUIRE(pointMap.isPixelMerged(links[0].a));\n        REQUIRE(pointMap.isPixelMerged(links[0].b));\n\n        const std::vector<std::pair<PixelRef, PixelRef>> &mergedPixelPairs = pointMap.getMergedPixelPairs();\n\n        REQUIRE(mergedPixelPairs.size() == 1);\n        REQUIRE(mergedPixelPairs[0].first.x == 0);\n        REQUIRE(mergedPixelPairs[0].first.y == 0);\n        REQUIRE(mergedPixelPairs[0].second.x == 4);\n        REQUIRE(mergedPixelPairs[0].second.y == 8);\n\n        const std::vector<SimpleLine> &mergeLines = depthmapX::getMergedPixelsAsLines(pointMap);\n\n        Point2f p1position = pointMap.depixelate(links[0].a);\n        Point2f p2position = pointMap.depixelate(links[0].b);\n\n        REQUIRE(mergeLines.size() == 1);\n        REQUIRE(mergeLines[0].start().x == p1position.x);\n        REQUIRE(mergeLines[0].start().y == p1position.y);\n        REQUIRE(mergeLines[0].end().x == p2position.x);\n        REQUIRE(mergeLines[0].end().y == p2position.y);\n    }\n\n    SECTION (\"Successfull: bottom-left to top-right and bottom-right to top-left\")\n    {\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        Point2f start(topRight.x, bottomLeft.y);\n        Point2f end(bottomLeft.x, topRight.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE(links.size() == 2);\n        REQUIRE(links[0].a.x == 0);\n        REQUIRE(links[0].a.y == 0);\n        REQUIRE(links[0].b.x == 4);\n        REQUIRE(links[0].b.y == 8);\n        REQUIRE(links[1].a.x == 0);\n        REQUIRE(links[1].a.y == 8);\n        REQUIRE(links[1].b.x == 4);\n        REQUIRE(links[1].b.y == 0);\n\n        // make sure pixels are not already merged\n        REQUIRE(!pointMap.isPixelMerged(links[0].a));\n        REQUIRE(!pointMap.isPixelMerged(links[0].b));\n        REQUIRE(!pointMap.isPixelMerged(links[1].a));\n        REQUIRE(!pointMap.isPixelMerged(links[1].b));\n\n        // merge\n        depthmapX::mergePixelPairs(links, pointMap);\n\n        // make sure pixels are merged\n        REQUIRE(pointMap.isPixelMerged(links[0].a));\n        REQUIRE(pointMap.isPixelMerged(links[0].b));\n        REQUIRE(pointMap.isPixelMerged(links[1].a));\n        REQUIRE(pointMap.isPixelMerged(links[1].b));\n    }\n\n    SECTION (\"Failing: merge line start out of grid\")\n    {\n        Point2f start(bottomLeft.x - spacing, bottomLeft.y - spacing);\n        mergeLines.push_back(Line(start,topRight));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Line ends not both on painted analysis space\"));\n    }\n\n    SECTION (\"Failing: merge line end out of grid\")\n    {\n        Point2f end(topRight.x + spacing, topRight.y + spacing);\n        mergeLines.push_back(Line(bottomLeft,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Line ends not both on painted analysis space\"));\n    }\n\n    SECTION (\"Failing: second link start overlapping\")\n    {\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        Point2f start(bottomLeft.x, bottomLeft.y);\n        Point2f end(topRight.x - 1, topRight.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Overlapping link found\"));\n    }\n\n    SECTION(\"Failing: second link end overlapping\")\n    {\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        Point2f start(bottomLeft.x + 1, bottomLeft.y);\n        Point2f end(topRight.x, topRight.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Overlapping link found\"));\n    }\n\n    SECTION(\"Failing: fully overlapping link (bottom-left to top-right)\")\n    {\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Overlapping link found\"));\n    }\n\n    SECTION(\"Failing: link overlapping to previously merged\")\n    {\n        mergeLines.push_back(Line(bottomLeft,topRight));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE(links.size() == 1);\n        REQUIRE(links[0].a.x == 0);\n        REQUIRE(links[0].a.y == 0);\n        REQUIRE(links[0].b.x == 4);\n        REQUIRE(links[0].b.y == 8);\n\n        // make sure pixels are not already merged\n        REQUIRE(!pointMap.isPixelMerged(links[0].a));\n        REQUIRE(!pointMap.isPixelMerged(links[0].b));\n\n        // merge\n        depthmapX::mergePixelPairs(links, pointMap);\n\n        // make sure pixels are merged\n        REQUIRE(pointMap.isPixelMerged(links[0].a));\n        REQUIRE(pointMap.isPixelMerged(links[0].b));\n\n        // now try to merge the same link again\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Link pixel found that is already linked on the map\"));\n    }\n}\n\nTEST_CASE(\"Test linking - half filled grid\", \"\")\n{\n\n    double spacing = 0.5;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n    int fill_type = 0; // = QDepthmapView::FULLFILL\n\n    Point2f lineStart(0,0);\n    Point2f lineEnd(2,4);\n\n    Point2f bottomLeft(std::min(lineStart.x,lineEnd.x),std::min(lineStart.y,lineEnd.y));\n    Point2f topRight(std::max(lineStart.x,lineEnd.x),std::max(lineStart.y,lineEnd.y));\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n    metaGraph->m_drawingFiles.emplace_back(\"Test SpacePixelGroup\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Test ShapeMap\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(lineStart, lineEnd));\n    metaGraph->m_drawingFiles.back().m_region = metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion();\n    metaGraph->setRegion(metaGraph->m_drawingFiles.back().m_region.bottom_left,\n                         metaGraph->m_drawingFiles.back().m_region.top_right);\n\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n    pointMap.setGrid(spacing, offset);\n\n    Point2f gridBottomLeft = pointMap.getRegion().bottom_left;\n    Point2f gridTopRight = pointMap.getRegion().top_right;\n    Point2f topLeftFillPoint(gridBottomLeft.x+spacing, gridTopRight.y-spacing);\n    pointMap.makePoints(topLeftFillPoint, fill_type);\n\n    std::vector<Line> mergeLines;\n\n    SECTION(\"Successful: top-left pixel to one to its right\")\n    {\n        Point2f start(bottomLeft.x, topRight.y);\n        Point2f end(bottomLeft.x + spacing, topRight.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE(links.size() == 1);\n        REQUIRE(links[0].a.x == 0);\n        REQUIRE(links[0].a.y == 8);\n        REQUIRE(links[0].b.x == 1);\n        REQUIRE(links[0].b.y == 8);\n\n        // make sure pixels are not already merged\n        REQUIRE(!pointMap.isPixelMerged(links[0].a));\n        REQUIRE(!pointMap.isPixelMerged(links[0].b));\n\n        // merge\n        depthmapX::mergePixelPairs(links, pointMap);\n\n        // make sure pixels are merged\n        REQUIRE(pointMap.isPixelMerged(links[0].a));\n        REQUIRE(pointMap.isPixelMerged(links[0].b));\n    }\n\n    SECTION(\"Failing: merge line (bottom-right to the one its left) completely out of grid\")\n    {\n        Point2f start(topRight.x, bottomLeft.y);\n        Point2f end(topRight.x - 1, bottomLeft.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Line ends not both on painted analysis space\"));\n    }\n\n    SECTION(\"Failing: merge line (bottom-right to top-left) start out of grid\")\n    {\n        Point2f start(topRight.x, bottomLeft.y);\n        Point2f end(bottomLeft.x, topRight.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Line ends not both on painted analysis space\"));\n    }\n\n    SECTION(\"Failing: merge line (top-left to bottom-right) end out of grid\")\n    {\n        Point2f start(bottomLeft.x, topRight.y);\n        Point2f end(topRight.x, bottomLeft.y);\n        mergeLines.push_back(Line(start,end));\n        std::vector<PixelRefPair> links = depthmapX::pixelateMergeLines(mergeLines,pointMap);\n        REQUIRE_THROWS_WITH(depthmapX::mergePixelPairs(links, pointMap),\n                            Catch::Contains(\"Line ends not both on painted analysis space\"));\n    }\n}\n"
  },
  {
    "path": "salaTest/testmapconversion.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mapconverter.h\"\n#include \"salalib/mgraph.h\"\n\nTEST_CASE(\"Failing empty drawing map conversion\", \"\") {\n    std::vector<SpacePixelFile> drawingFiles;\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToAxial(nullptr, \"Axial map\", drawingFiles),\n                        Catch::Contains(\"Failed to convert lines\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToSegment(nullptr, \"Segment map\", drawingFiles),\n                        Catch::Contains(\"No lines found in drawing\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToConvex(nullptr, \"Convex map\", drawingFiles),\n                        Catch::Contains(\"No polygons found in drawing\"));\n\n    drawingFiles.push_back(SpacePixelFile(\"Drawing file\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToAxial(nullptr, \"Axial map\", drawingFiles),\n                        Catch::Contains(\"Failed to convert lines\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToSegment(nullptr, \"Segment map\", drawingFiles),\n                        Catch::Contains(\"No lines found in drawing\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToConvex(nullptr, \"Convex map\", drawingFiles),\n                        Catch::Contains(\"No polygons found in drawing\"));\n\n    drawingFiles.back().m_spacePixels.push_back(ShapeMap(\"Drawing layer\", ShapeMap::DRAWINGMAP));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToAxial(nullptr, \"Axial map\", drawingFiles),\n                        Catch::Contains(\"Failed to convert lines\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToSegment(nullptr, \"Segment map\", drawingFiles),\n                        Catch::Contains(\"No lines found in drawing\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDrawingToConvex(nullptr, \"Convex map\", drawingFiles),\n                        Catch::Contains(\"No polygons found in drawing\"));\n}\n\nTEST_CASE(\"Failing empty axial to segment map conversion\", \"\") {\n    ShapeGraph segmentMap(\"Axial map\", ShapeMap::AXIALMAP);\n    // TODO: Does not throw an exception but maybe it should as the axial map is empty?\n    // REQUIRE_THROWS_WITH(MapConverter::convertAxialToSegment(nullptr, segmentMap, \"Segment map\", false, false, 0),\n    // Catch::Contains(\"No lines found in drawing\"));\n}\n\nTEST_CASE(\"Failing empty data map conversion\", \"\") {\n    ShapeMap dataMap(\"Data map\", ShapeMap::DATAMAP);\n    REQUIRE_THROWS_WITH(MapConverter::convertDataToAxial(nullptr, \"Axial map\", dataMap),\n                        Catch::Contains(\"No lines found in data map\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDataToSegment(nullptr, \"Segment map\", dataMap),\n                        Catch::Contains(\"No lines found in data map\"));\n    REQUIRE_THROWS_WITH(MapConverter::convertDataToConvex(nullptr, \"Convex map\", dataMap),\n                        Catch::Contains(\"No polygons found in data map\"));\n}\n\nTEST_CASE(\"Test drawing to segment conversion\", \"\") {\n    const float EPSILON = 0.001;\n\n    Line line1(Point2f(0, 0), Point2f(0, 1));\n    Line line2(Point2f(0, 1), Point2f(1, 1));\n    Line line3(Point2f(1, 1), Point2f(1, 0));\n\n    std::vector<SpacePixelFile> drawingFiles;\n    drawingFiles.push_back(SpacePixelFile(\"Drawing file\"));\n    drawingFiles.back().m_spacePixels.push_back(ShapeMap(\"Drawing layer\", ShapeMap::DRAWINGMAP));\n    ShapeMap &drawingLayer = drawingFiles.back().m_spacePixels.back();\n\n    SECTION(\"Single line\") {\n        drawingLayer.makeLineShape(line1);\n\n        // TODO: This fails with std::bad_alloc because there's only 1 line in the drawing\n        REQUIRE_THROWS_WITH(MapConverter::convertDrawingToSegment(nullptr, \"Segment map\", drawingFiles),\n                            Catch::Contains(\"std::bad_alloc\"));\n    }\n\n    SECTION(\"Two lines\") {\n        drawingLayer.makeLineShape(line1);\n        drawingLayer.makeLineShape(line2);\n\n        // TODO: This fails with std::bad_alloc because there's only 2 lines in the drawing\n        REQUIRE_THROWS_WITH(MapConverter::convertDrawingToSegment(nullptr, \"Segment map\", drawingFiles),\n                            Catch::Contains(\"std::bad_alloc\"));\n    }\n\n    SECTION(\"Three lines\") {\n        drawingLayer.makeLineShape(line1);\n        drawingLayer.makeLineShape(line2);\n        drawingLayer.makeLineShape(line3);\n        std::unique_ptr<ShapeGraph> segmentMap =\n            MapConverter::convertDrawingToSegment(nullptr, \"Segment map\", drawingFiles);\n        std::map<int, SalaShape> &shapes = segmentMap->getAllShapes();\n        REQUIRE(shapes.size() == 3);\n        auto shapeIter = shapes.begin();\n        REQUIRE(shapeIter->first == 0);\n        const Line &segmentLine1 = shapeIter->second.getLine();\n        REQUIRE(segmentLine1.ax() == Approx(line1.ax()).epsilon(EPSILON));\n        REQUIRE(segmentLine1.ay() == Approx(line1.ay()).epsilon(EPSILON));\n        REQUIRE(segmentLine1.bx() == Approx(line1.bx()).epsilon(EPSILON));\n        REQUIRE(segmentLine1.by() == Approx(line1.by()).epsilon(EPSILON));\n        shapeIter++;\n        REQUIRE(shapeIter->first == 1);\n        const Line &segmentLine2 = shapeIter->second.getLine();\n        REQUIRE(segmentLine2.ax() == Approx(line2.ax()).epsilon(EPSILON));\n        REQUIRE(segmentLine2.ay() == Approx(line2.ay()).epsilon(EPSILON));\n        REQUIRE(segmentLine2.bx() == Approx(line2.bx()).epsilon(EPSILON));\n        REQUIRE(segmentLine2.by() == Approx(line2.by()).epsilon(EPSILON));\n        shapeIter++;\n        REQUIRE(shapeIter->first == 2);\n        const Line &segmentLine3 = shapeIter->second.getLine();\n        REQUIRE(segmentLine3.ax() == Approx(line3.ax()).epsilon(EPSILON));\n        REQUIRE(segmentLine3.ay() == Approx(line3.ay()).epsilon(EPSILON));\n        REQUIRE(segmentLine3.bx() == Approx(line3.bx()).epsilon(EPSILON));\n        REQUIRE(segmentLine3.by() == Approx(line3.by()).epsilon(EPSILON));\n    }\n}\n\nTEST_CASE(\"Test data to segment conversion\", \"\") {\n    const float EPSILON = 0.001;\n\n    std::string newAttributeName = \"testID\";\n    ShapeMap dataMap(\"Data map\", ShapeMap::DATAMAP);\n    int newAttributeID = dataMap.addAttribute(newAttributeName);\n\n    std::vector<Line> lines;\n    std::vector<std::map<int, float>> extraAttributes;\n\n    lines.push_back(Line(Point2f(0, 0), Point2f(0, 1)));\n    lines.push_back(Line(Point2f(0, 1), Point2f(1, 1)));\n    lines.push_back(Line(Point2f(1, 1), Point2f(1, 0)));\n\n    for (int i = 0; i < lines.size(); i++) {\n        extraAttributes.push_back(std::map<int, float>());\n        extraAttributes.back()[newAttributeID] = extraAttributes.size();\n    }\n\n    SECTION(\"Single line with extra attributes\") {\n        dataMap.makeLineShape(lines[0], false, false, extraAttributes[0]);\n\n        // TODO: This fails with std::bad_alloc because there's only 1 line in the data map\n        REQUIRE_THROWS_WITH(MapConverter::convertDataToSegment(nullptr, \"Segment map\", dataMap, true),\n                            Catch::Contains(\"std::bad_alloc\"));\n    }\n\n    SECTION(\"Two lines with extra attributes\") {\n        dataMap.makeLineShape(lines[0], false, false, extraAttributes[0]);\n        dataMap.makeLineShape(lines[1], false, false, extraAttributes[1]);\n\n        // TODO: This fails with std::bad_alloc because there's only 2 lines in the data map\n        REQUIRE_THROWS_WITH(MapConverter::convertDataToSegment(nullptr, \"Segment map\", dataMap, true),\n                            Catch::Contains(\"std::bad_alloc\"));\n    }\n\n    SECTION(\"Three lines\") {\n        dataMap.makeLineShape(lines[0], false, false, extraAttributes[0]);\n        dataMap.makeLineShape(lines[1], false, false, extraAttributes[1]);\n        dataMap.makeLineShape(lines[2], false, false, extraAttributes[2]);\n        std::unique_ptr<ShapeGraph> segmentMap =\n            MapConverter::convertDataToSegment(nullptr, \"Segment map\", dataMap, true);\n        int segmentNewAttributeID = segmentMap->getAttributeTable().getColumnIndex(newAttributeName);\n        std::map<int, SalaShape> &shapes = segmentMap->getAllShapes();\n        REQUIRE(shapes.size() == 3);\n        auto shapeIter = shapes.begin();\n        for (int i = 0; i < lines.size(); i++) {\n            REQUIRE(shapeIter->first == i);\n            AttributeRow &row = segmentMap->getAttributeRowFromShapeIndex(shapeIter->first);\n            REQUIRE(row.getValue(segmentNewAttributeID) == extraAttributes[i][newAttributeID]);\n            const Line &segmentLine = shapeIter->second.getLine();\n            REQUIRE(segmentLine.ax() == Approx(lines[i].ax()).epsilon(EPSILON));\n            REQUIRE(segmentLine.ay() == Approx(lines[i].ay()).epsilon(EPSILON));\n            REQUIRE(segmentLine.bx() == Approx(lines[i].bx()).epsilon(EPSILON));\n            REQUIRE(segmentLine.by() == Approx(lines[i].by()).epsilon(EPSILON));\n            shapeIter++;\n        }\n    }\n\n    SECTION(\"Four lines, second line twice\") {\n        dataMap.makeLineShape(lines[0], false, false, extraAttributes[0]);\n        dataMap.makeLineShape(lines[1], false, false, extraAttributes[1]);\n        dataMap.makeLineShape(lines[1], false, false, extraAttributes[1]); // this one should be removed by tidylines\n        dataMap.makeLineShape(lines[2], false, false, extraAttributes[2]);\n        std::unique_ptr<ShapeGraph> segmentMap =\n            MapConverter::convertDataToSegment(nullptr, \"Segment map\", dataMap, true);\n        int segmentNewAttributeID = segmentMap->getAttributeTable().getColumnIndex(newAttributeName);\n        std::map<int, SalaShape> &shapes = segmentMap->getAllShapes();\n        REQUIRE(shapes.size() == 3);\n        auto shapeIter = shapes.begin();\n        for (int i = 0; i < lines.size(); i++) {\n            REQUIRE(shapeIter->first == i);\n            AttributeRow &row = segmentMap->getAttributeRowFromShapeIndex(shapeIter->first);\n            REQUIRE(row.getValue(segmentNewAttributeID) == extraAttributes[i][newAttributeID]);\n            const Line &segmentLine = shapeIter->second.getLine();\n            REQUIRE(segmentLine.ax() == Approx(lines[i].ax()).epsilon(EPSILON));\n            REQUIRE(segmentLine.ay() == Approx(lines[i].ay()).epsilon(EPSILON));\n            REQUIRE(segmentLine.bx() == Approx(lines[i].bx()).epsilon(EPSILON));\n            REQUIRE(segmentLine.by() == Approx(lines[i].by()).epsilon(EPSILON));\n            shapeIter++;\n        }\n    }\n}\n"
  },
  {
    "path": "salaTest/testmapinfodata.cpp",
    "content": "// Copyright (C) 2017-2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mgraph.h\"\n#include \"salalib/parsers/mapinfodata.h\"\n\nTEST_CASE(\"MapInfo failing header\", \"\")\n{\n    std::string mifdata = \"Version 300\\n\";\n\n    SECTION(\"Missing quotes around delimiter\") {\n        mifdata += \"Charset \\\"WindowsLatin1\\\"\\n\" \\\n                   \"Delimiter ,\\n\" \\\n                   \"Index 1,2\\n\" \\\n                   \"CoordSys Earth Projection 8, 79, \\\"m\\\", -2, 49, 0.9996012717, 400000, -100000\";\n    }\n\n    SECTION(\"Missing CoordSys\") {\n        mifdata += \"Charset \\\"WindowsLatin1\\\"\\n\" \\\n                   \"Delimiter \\\",\\\"\\n\" \\\n                   \"Index 1,2\\n\" \\\n                   \"Bounds (-7845061.1011, -15524202.1641) (8645061.1011, 4470074.53373)\\n\";\n    }\n\n    std::stringstream mifstream(mifdata);\n\n    MapInfoData mapinfodata;\n    REQUIRE_FALSE(mapinfodata.readheader(mifstream));\n}\n\nTEST_CASE(\"MapInfo failing column attribute columns\", \"\")\n{\n\n    std::string mifdata = \"\";\n\n\n    SECTION(\"Missing Columns at beginning\") {\n        mifdata += \"Tolumns 2\\n\" \\\n                   \"  ID Integer\\n\" \\\n                   \"  Length_m Float\\n\" \\\n                   \"Data\\n\";\n    }\n\n    SECTION(\"Missing Column number\") {\n        mifdata += \"Columns\\n\" \\\n                   \"  ID Integer\\n\" \\\n                   \"  Length_m Float\\n\" \\\n                   \"Data\\n\";\n    }\n\n    SECTION(\"Missing Data at end\") {\n        mifdata += \"Columns 2\\n\" \\\n                   \"  ID Integer\\n\" \\\n                   \"  Length_m Float\\n\" \\\n                   \"Bata\\n\";\n    }\n\n    std::string middata =\n            \"1,1017.81\\n\" \\\n            \"2,568.795\\n\" \\\n            \"3,216.026\";\n\n    std::stringstream mifstream(mifdata);\n    std::stringstream midstream(middata);\n\n    std::vector<std::string> columnheads;\n\n    MapInfoData mapinfodata;\n    REQUIRE_FALSE(mapinfodata.readcolumnheaders(mifstream, columnheads));\n}\n\nTEST_CASE(\"MapInfo MID file with empty column\", \"\")\n{\n    const float EPSILON = 0.001;\n\n    // A typical MIF\n\n    std::string mifdata =\n            \"Version 300\\n\" \\\n            \"Charset \\\"WindowsLatin1\\\"\\n\" \\\n            \"Delimiter \\\",\\\"\\n\" \\\n            \"Index 1,2,3,4\\n\" \\\n            \"CoordSys Earth Projection 8, 79, \\\"m\\\", -2, 49, 0.9996012717, 400000, -100000\\n\";\n\n    mifdata +=\n            \"Columns 4\\n\" \\\n            \"  ID Integer\\n\" \\\n            \"  Length_m Float\\n\" \\\n            \"  Height_m Float\\n\" \\\n            \"  Width_m Float\\n\" \\\n            \"Data\\n\" \\\n            \"\\n\" \\\n            \"Line 534014.29 182533.33 535008.52 182764.11\\n\" \\\n            \"    Pen (1,2,0)\\n\" \\\n            \"Line 533798.68 183094.69 534365.48 183159.01\\n\" \\\n            \"    Pen (1,2,0)\\n\" \\\n            \"Point 534014.29 182533.33\\n\" \\\n            \"    Symbol (34,0,12)\";\n\n\n    // A MID with empty columns\n\n    std::string middata =\n            \"1,1017.81,,\\n\" \\\n            \"2,568.795,,\\n\" \\\n            \"3,216.026,,\";\n\n    ShapeMap shapeMap(\"MapInfoTest\");\n    MapInfoData mapinfodata;\n\n    std::stringstream mifstream(mifdata);\n    std::stringstream midstream(middata);\n    REQUIRE(mapinfodata.import(mifstream, midstream, shapeMap) == MINFO_OK);\n\n    AttributeTable& att = shapeMap.getAttributeTable();\n\n    REQUIRE(att.getNumColumns() == 4);\n    REQUIRE(att.getColumn(0).getName() == \"Id\");\n    REQUIRE(att.getColumn(1).getName() == \"Length_M\");\n    REQUIRE(att.getColumn(2).getName() == \"Height_M\");\n    REQUIRE(att.getColumn(3).getName() == \"Width_M\");\n\n    std::map<int, SalaShape> shapes = shapeMap.getAllShapes();\n    auto shapeRef0 = depthmapX::getMapAtIndex(shapes, 0);\n    auto shapeRef1 = depthmapX::getMapAtIndex(shapes, 1);\n    auto shapeRef2 = depthmapX::getMapAtIndex(shapes, 2);\n\n    REQUIRE(att.getNumRows() == 3);\n    auto &row0 = att.getRow(AttributeKey(shapeRef0->first));\n    auto &row1 = att.getRow(AttributeKey(shapeRef1->first));\n    auto &row2 = att.getRow(AttributeKey(shapeRef2->first));\n\n    REQUIRE(row0.getValue(\"Id\") == 1);\n    REQUIRE(row1.getValue(\"Id\") == 2);\n    REQUIRE(row2.getValue(\"Id\") == 3);\n    REQUIRE(row0.getValue(\"Length_M\") == Approx(1017.81).epsilon(EPSILON));\n    REQUIRE(row1.getValue(\"Length_M\") == Approx(568.795).epsilon(EPSILON));\n    REQUIRE(row2.getValue(\"Length_M\") == Approx(216.026).epsilon(EPSILON));\n    REQUIRE(row0.getValue(\"Height_M\") == -1);\n    REQUIRE(row1.getValue(\"Height_M\") == -1);\n    REQUIRE(row2.getValue(\"Height_M\") == -1);\n    REQUIRE(row0.getValue(\"Width_M\") == -1);\n    REQUIRE(row1.getValue(\"Width_M\") == -1);\n    REQUIRE(row2.getValue(\"Width_M\") == -1);\n\n}\n\nTEST_CASE(\"Complete proper MapInfo file\", \"\")\n{\n    const float EPSILON = 0.001;\n\n    // A typical MIF\n\n    std::string mifdata =\n            \"Version 300\\n\" \\\n            \"Charset \\\"WindowsLatin1\\\"\\n\" \\\n            \"Delimiter \\\",\\\"\\n\" \\\n            \"Index 1,2\\n\" \\\n            \"CoordSys Earth Projection 8, 79, \\\"m\\\", -2, 49, 0.9996012717, 400000, -100000\";\n\n    SECTION(\"With Bounds\") {\n        mifdata += \"Bounds (-7845061.1011, -15524202.1641) (8645061.1011, 4470074.53373)\\n\";\n    }\n\n    SECTION(\"Without Bounds\") {\n        mifdata += \"\\n\";\n    }\n\n    mifdata +=\n            \"Columns 2\\n\" \\\n            \"  ID Integer\\n\" \\\n            \"  Length_m Float\\n\" \\\n            \"Data\\n\" \\\n            \"\\n\" \\\n            \"Line 534014.29 182533.33 535008.52 182764.11\\n\" \\\n            \"    Pen (1,2,0)\\n\" \\\n            \"Line 533798.68 183094.69 534365.48 183159.01\\n\" \\\n            \"    Pen (1,2,0)\\n\" \\\n            \"Point 534014.29 182533.33\\n\" \\\n            \"    Symbol (34,0,12)\";\n\n\n    // A Typical MID\n\n    std::string middata =\n            \"1,1017.81\\n\" \\\n            \"2,568.795\\n\" \\\n            \"3,216.026\";\n\n    ShapeMap shapeMap(\"MapInfoTest\");\n    MapInfoData mapinfodata;\n\n    std::stringstream mifstream(mifdata);\n    std::stringstream midstream(middata);\n    REQUIRE(mapinfodata.import(mifstream, midstream, shapeMap) == MINFO_OK);\n\n    std::map<int, SalaShape> shapes = shapeMap.getAllShapes();\n    auto shapeRef0 = depthmapX::getMapAtIndex(shapes, 0);\n    auto shapeRef1 = depthmapX::getMapAtIndex(shapes, 1);\n    auto shapeRef2 = depthmapX::getMapAtIndex(shapes, 2);\n\n    auto &shape0 = shapeRef0->second;\n    auto &shape1 = shapeRef1->second;\n    auto &shape2 = shapeRef2->second;\n    REQUIRE(shapes.size() == 3);\n    REQUIRE(shape0.isLine());\n    REQUIRE(shape0.getLine().ax() == Approx(534014.29).epsilon(EPSILON));\n    REQUIRE(shape0.getLine().ay() == Approx(182533.33).epsilon(EPSILON));\n    REQUIRE(shape0.getLine().bx() == Approx(535008.52).epsilon(EPSILON));\n    REQUIRE(shape0.getLine().by() == Approx(182764.11).epsilon(EPSILON));\n    REQUIRE(shape1.isLine());\n    REQUIRE(shape1.getLine().ax() == Approx(533798.68).epsilon(EPSILON));\n    REQUIRE(shape1.getLine().ay() == Approx(183094.69).epsilon(EPSILON));\n    REQUIRE(shape1.getLine().bx() == Approx(534365.48).epsilon(EPSILON));\n    REQUIRE(shape1.getLine().by() == Approx(183159.01).epsilon(EPSILON));\n    REQUIRE(shape2.isPoint());\n    REQUIRE(shape2.getPoint().x == Approx(534014.29).epsilon(EPSILON));\n    REQUIRE(shape2.getPoint().y == Approx(182533.33).epsilon(EPSILON));\n\n    AttributeTable& att = shapeMap.getAttributeTable();\n    REQUIRE(att.getNumColumns() == 2);\n    REQUIRE(att.getColumnName(0) == \"Id\");\n    REQUIRE(att.getColumnName(1) == \"Length_M\");\n\n    REQUIRE(att.getNumRows() == 3);\n    auto &row0 = att.getRow(AttributeKey(shapeRef0->first));\n    auto &row1 = att.getRow(AttributeKey(shapeRef1->first));\n    auto &row2 = att.getRow(AttributeKey(shapeRef2->first));\n    REQUIRE(row0.getValue(\"Id\") == 1);\n    REQUIRE(row1.getValue(\"Id\") == 2);\n    REQUIRE(row2.getValue(\"Id\") == 3);\n    REQUIRE(row0.getValue(\"Length_M\") == Approx(1017.81).epsilon(EPSILON));\n    REQUIRE(row1.getValue(\"Length_M\") == Approx(568.795).epsilon(EPSILON));\n    REQUIRE(row2.getValue(\"Length_M\") == Approx(216.026).epsilon(EPSILON));\n}\n"
  },
  {
    "path": "salaTest/testmgraph.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mgraph.h\"\n\n\nTEST_CASE(\"Test getVisibleLines\", \"\")\n{\n    const float EPSILON = 0.001;\n\n    // create a new MetaGraph\n    std::unique_ptr<MetaGraph> mgraph(new MetaGraph());\n\n    Point2f visibleLineStart(0,0);\n    Point2f visibleLineEnd(2,4);\n    Point2f hiddenLineStart(1,1);\n    Point2f hiddenLineEnd(3,5);\n\n    // push a SpacePixelFile in the MetaGraph\n    mgraph->m_drawingFiles.emplace_back(\"Test SpacePixelFile\");\n\n    // push a ShapeMap in the SpacePixelFile\n    mgraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Visible ShapeMap\");\n\n    // add a line to the first ShapeMap\n    mgraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(visibleLineStart, visibleLineEnd));\n\n    // push a ShapeMap in the SpacePixelFile\n    mgraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Hidden ShapeMap\");\n\n    // add a line to the second ShapeMap\n    mgraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(hiddenLineStart, hiddenLineEnd));\n\n    SECTION( \"Get visible lines when none is hidden\" )\n    {\n        // first check without hiding anything\n\n        const std::vector<SimpleLine>& visibleLines = mgraph->getVisibleDrawingLines();\n\n        REQUIRE(visibleLines.size() == 2);\n        REQUIRE(visibleLines[0].start().x == Approx(visibleLineStart.x).epsilon(EPSILON));\n        REQUIRE(visibleLines[0].start().y == Approx(visibleLineStart.y).epsilon(EPSILON));\n        REQUIRE(visibleLines[0].end().x == Approx(visibleLineEnd.x).epsilon(EPSILON));\n        REQUIRE(visibleLines[0].end().y == Approx(visibleLineEnd.y).epsilon(EPSILON));\n        REQUIRE(visibleLines[1].start().x == Approx(hiddenLineStart.x).epsilon(EPSILON));\n        REQUIRE(visibleLines[1].start().y == Approx(hiddenLineStart.y).epsilon(EPSILON));\n        REQUIRE(visibleLines[1].end().x == Approx(hiddenLineEnd.x).epsilon(EPSILON));\n        REQUIRE(visibleLines[1].end().y == Approx(hiddenLineEnd.y).epsilon(EPSILON));\n    }\n\n    SECTION( \"Get visible lines when some are hidden\" )\n    {\n        // now hide the second SpacePixelFile\n        mgraph->m_drawingFiles.back().m_spacePixels.back().setShow(false);\n\n        const std::vector<SimpleLine>& visibleLines = mgraph->getVisibleDrawingLines();\n\n        REQUIRE(visibleLines.size() == 1);\n        REQUIRE(visibleLines[0].start().x == Approx(visibleLineStart.x).epsilon(EPSILON));\n        REQUIRE(visibleLines[0].start().y == Approx(visibleLineStart.y).epsilon(EPSILON));\n        REQUIRE(visibleLines[0].end().x == Approx(visibleLineEnd.x).epsilon(EPSILON));\n        REQUIRE(visibleLines[0].end().y == Approx(visibleLineEnd.y).epsilon(EPSILON));\n    }\n}\n\nTEST_CASE(\"Test pointMaps\", \"\")\n{\n    std::unique_ptr<MetaGraph> mgraph(new MetaGraph());\n    int pointMapIdx = mgraph->addNewPointMap(\"Kenny\");\n    REQUIRE(mgraph->getPointMaps().size() == 1);\n    REQUIRE(pointMapIdx == 0);\n    REQUIRE(mgraph->getPointMaps()[0].getName() == \"Kenny\");\n    REQUIRE(mgraph->getDisplayedPointMapRef() == pointMapIdx);\n    REQUIRE(mgraph->getDisplayedPointMap().getName() == \"Kenny\");\n\n    SECTION( \"Add another and remove the first through the MetaGraph\" )\n    {\n        int pointMapIdx = mgraph->addNewPointMap(\"Stan\");\n        REQUIRE(mgraph->getPointMaps().size() == 2);\n        REQUIRE(pointMapIdx == 1);\n        REQUIRE(mgraph->getPointMaps()[1].getName() == \"Stan\");\n        REQUIRE(mgraph->getDisplayedPointMapRef() == 1);\n        REQUIRE(mgraph->getDisplayedPointMap().getName() == \"Stan\");\n\n        mgraph->setState(MetaGraph::POINTMAPS);\n        mgraph->setViewClass(MetaGraph::SHOWVGATOP);\n        mgraph->setDisplayedPointMapRef(0);\n        REQUIRE(mgraph->getDisplayedPointMapRef() == 0);\n        REQUIRE(mgraph->getDisplayedPointMap().getName() == \"Kenny\");\n\n        mgraph->removeDisplayedMap();\n        REQUIRE(mgraph->getPointMaps().size() == 1);\n        REQUIRE(mgraph->getPointMaps()[0].getName() == \"Stan\");\n        REQUIRE(mgraph->getDisplayedPointMapRef() == 0);\n    }\n}\n"
  },
  {
    "path": "salaTest/testpointinpoly.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mapconverter.h\"\n#include \"salalib/shapemap.h\"\n\nTEST_CASE(\"Test point in polygon in shapemap\", \"\") {\n    // The problem this test was made to demostrate was that shapemaps with\n    // extended bounds tended to make the point-in-polygon more inaccurate.\n\n    std::unique_ptr<ShapeMap> shapeMap(new ShapeMap(\"Test ShapeMap\"));\n\n    // main testing shape\n    shapeMap->makePolyShape(\n        {\n            Point2f(4.50, 5.75), //\n            Point2f(5.75, 5.50), //\n            Point2f(5.25, 4.75), //\n            Point2f(4.75, 4.50)  //\n        },\n        false);\n\n    // points inside the polygon\n    std::vector<Point2f> pointsInsidePoly = {\n        Point2f(5.1250, 5.1250), //\n        Point2f(5.6345, 5.4522), //\n        Point2f(4.5884, 5.6616), //\n        Point2f(4.8049, 4.6123), //\n        Point2f(5.1673, 4.8437), //\n        Point2f(4.9441, 4.7368), //\n        Point2f(4.7476, 5.1495), //\n        Point2f(5.1005, 5.5024), //\n        Point2f(5.3960, 5.1943)  //\n    };\n\n    // points outside (but very close to) the polygon\n    std::vector<Point2f> pointsOutsidePoly = {\n        Point2f(4.6951, 4.3877), //\n        Point2f(4.4116, 5.8384), //\n        Point2f(5.8655, 5.5478), //\n        Point2f(5.3327, 4.6563), //\n        Point2f(5.0559, 4.5132), //\n        Point2f(4.5024, 5.1005), //\n        Point2f(5.1495, 5.7476), //\n        Point2f(5.6040, 5.0557)  //\n    };\n\n    for (Point2f point : pointsInsidePoly) {\n        REQUIRE(shapeMap->pointInPolyList(point)[0] == 0);\n    }\n\n    for (Point2f point : pointsOutsidePoly) {\n        REQUIRE(shapeMap->pointInPolyList(point).size() == 0);\n    }\n\n    // now extend the bounds\n\n    // first little extra rectangle to extend the map region to 0.25, 0.25\n    shapeMap->makePolyShape(\n        {\n            Point2f(0.25, 0.25), //\n            Point2f(0.50, 0.25), //\n            Point2f(0.50, 0.50), //\n            Point2f(0.25, 0.50)  //\n        },\n        false);\n\n    // second little extra rectangle to extend the map region to 10.0, 10.0\n    shapeMap->makePolyShape(\n        {\n            Point2f(9.75, 9.75), //\n            Point2f(10.0, 9.75), //\n            Point2f(10.0, 10.0), //\n            Point2f(9.75, 10.0)  //\n        },\n        false);\n\n\n    for (Point2f point : pointsInsidePoly) {\n        REQUIRE(shapeMap->pointInPolyList(point)[0] == 0);\n    }\n\n    for (Point2f point : pointsOutsidePoly) {\n        REQUIRE(shapeMap->pointInPolyList(point).size() == 0);\n    }\n}\n"
  },
  {
    "path": "salaTest/testpointmap.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mgraph.h\"\n\n\nTEST_CASE(\"Test MetaGraph construction\", \"\")\n{\n    const float EPSILON = 0.001;\n    double spacing = 0.5;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n\n    // create a new MetaGraph\n    // The PointMap needs the m_region variable from this\n    // object as a definition of the area the grid needs to cover\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n\n    SECTION( \"Construct a plain MetaGraph without underlying geometry\" )\n    {\n        Point2f bottomLeft(0,0);\n        Point2f topRight(2,4);\n\n        // set m_region to the bounds\n        metaGraph->setRegion(bottomLeft, topRight);\n\n        // check if the bounds are set correctly\n        REQUIRE(metaGraph->getRegion().bottom_left.x == Approx(bottomLeft.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().bottom_left.y == Approx(bottomLeft.y).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().top_right.x == Approx(topRight.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().top_right.y == Approx(topRight.y).epsilon(EPSILON));\n    }\n\n    SECTION( \"Construct a MetaGraph using underlying geometry\" )\n    {\n        Point2f lineStart(0,0);\n        Point2f lineEnd(2,4);\n\n        Point2f bottomLeft(std::min(lineStart.x,lineEnd.x),std::min(lineStart.y,lineEnd.y));\n        Point2f topRight(std::max(lineStart.x,lineEnd.x),std::max(lineStart.y,lineEnd.y));\n\n        // push a SpacePixelFile in the MetaGraph\n        metaGraph->m_drawingFiles.emplace_back(\"Test MetaGraph\");\n\n        // push a ShapeMap in the SpacePixelFile\n        metaGraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Test ShapeMap\");\n\n        // add a line to the ShapeMap\n        metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(lineStart, lineEnd));\n\n        // check if the ShapeMap bounds are set correctly\n        REQUIRE(metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion().bottom_left.x == Approx(bottomLeft.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion().bottom_left.y == Approx(bottomLeft.y).epsilon(EPSILON));\n        REQUIRE(metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion().top_right.x == Approx(topRight.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion().top_right.y == Approx(topRight.y).epsilon(EPSILON));\n\n        // MetaGraph and SpacePixelFile do not automatically grow\n        // their region when new shapemaps/files are added to them\n        // therefore we have to do this externally\n        metaGraph->m_drawingFiles.back().m_region = metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion();\n\n        // check if the SpacePixelFile bounds are set correctly\n        REQUIRE(metaGraph->m_drawingFiles.back().m_region.bottom_left.x == Approx(bottomLeft.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->m_drawingFiles.back().m_region.bottom_left.y == Approx(bottomLeft.y).epsilon(EPSILON));\n        REQUIRE(metaGraph->m_drawingFiles.back().m_region.top_right.x == Approx(topRight.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->m_drawingFiles.back().m_region.top_right.y == Approx(topRight.y).epsilon(EPSILON));\n\n        metaGraph->setRegion(metaGraph->m_drawingFiles.back().m_region.bottom_left,\n                             metaGraph->m_drawingFiles.back().m_region.top_right);\n\n        // check if the MetaGraph bounds are set correctly\n        REQUIRE(metaGraph->getRegion().bottom_left.x == Approx(bottomLeft.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().bottom_left.y == Approx(bottomLeft.y).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().top_right.x == Approx(topRight.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().top_right.y == Approx(topRight.y).epsilon(EPSILON));\n    }\n\n    // construct a sample pointMap\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n}\n\nTEST_CASE(\"Test grid filling\", \"\")\n{\n    const float EPSILON = 0.001;\n    double spacing = 0.5;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n\n    // create a new MetaGraph\n    // The PointMap needs the m_region variable from this\n    // object as a definition of the area the grid needs to cover\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n\n    // Construct a plain MetaGraph without underlying geometry\n    {\n        Point2f bottomLeft(0,0);\n        Point2f topRight(2,4);\n\n        // set m_region to the bounds\n        metaGraph->setRegion(bottomLeft, topRight);\n\n        // check if the bounds are set correctly\n        REQUIRE(metaGraph->getRegion().bottom_left.x == Approx(bottomLeft.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().bottom_left.y == Approx(bottomLeft.y).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().top_right.x == Approx(topRight.x).epsilon(EPSILON));\n        REQUIRE(metaGraph->getRegion().top_right.y == Approx(topRight.y).epsilon(EPSILON));\n    }\n\n    // construct a sample pointMap\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n\n    // set the grid\n\n    // create the grid with bounds as set above\n    bool gridIsSet = pointMap.setGrid(spacing, offset);\n\n    // check if the grid was set\n    REQUIRE(gridIsSet);\n\n    // check if the spacing is correct\n    REQUIRE(spacing == pointMap.getSpacing());\n\n    // fill the grid\n\n    // seems like fill_type is actually connected to the\n    // QDepthmapView class which is a GUI class (depthmapview.h)\n    // TODO Disentangle GUI enum from pointMap.makePoints\n    int fill_type = 0; // = QDepthmapView::FULLFILL\n\n    Point2f gridBottomLeft = pointMap.getRegion().bottom_left;\n\n    SECTION( \"Check if the points are made when fill selection in a cell\" )\n    {\n        // Check if the points are made (grid filled) when\n        // the selected position is certainly in a cell\n        // This calculation should make the point directly\n        // at the centre of a central cell\n        Point2f midPoint(gridBottomLeft.x + spacing * (floor(pointMap.getCols() * 0.5) + 0.5),\n                         gridBottomLeft.y + spacing * (floor(pointMap.getRows() * 0.5) + 0.5));\n        bool pointsMade = pointMap.makePoints(midPoint, fill_type);\n        REQUIRE(pointsMade);\n\n    }\n\n    SECTION(\"Check if the points are made when fill selection between cells\")\n    {\n        // Check if the points are made (grid filled) when\n        // the selected position is certainly between cells\n        // This calculation should make the point directly\n        // at the edge of a central cell\n        Point2f midPoint(gridBottomLeft.x + spacing * (floor(pointMap.getCols() * 0.5)),\n                         gridBottomLeft.y + spacing * (floor(pointMap.getRows() * 0.5)));\n        bool pointsMade = pointMap.makePoints(midPoint, fill_type);\n        REQUIRE(pointsMade);\n    }\n}\n\n// PointMap::setGrid is quite convoluted with various parameters\n// affecting the result, such as the limits of the region to be\n// covered (bottomLeft, topRight), the spacing and the location\n// of the plan in space. For example every grid created will be\n// in relation to the origin (0,0), no matter where the region\n// is and the current pixel can always be calculated as if the\n// origin always falls in the centre of a cell.\n\nTEST_CASE(\"Quirks in grid creation - Origin always at 0\", \"\")\n{\n\n    double spacing = 0.5;\n    const float EPSILON = 0.001;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n\n    Point2f bottomLeft(0,0);\n    Point2f topRight(0,0);\n\n    SECTION (\"Region from origin to positive x, positive y quadrant\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = 0;\n        bottomLeft.y = 0;\n        topRight.x = 1;\n        topRight.y = 1;\n    }\n\n    SECTION (\"Region away from origin to positive x, positive y quadrant\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = 1;\n        bottomLeft.y = 1;\n        topRight.x = 2;\n        topRight.y = 2;\n    }\n\n    SECTION (\"Region from origin to negative x, negative y quadrant\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = -1;\n        bottomLeft.y = -1;\n        topRight.x = 0;\n        topRight.y = 0;\n    }\n\n    SECTION (\"Region in all quadrants\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = -1;\n        bottomLeft.y = -1;\n        topRight.x = 1;\n        topRight.y = 1;\n    }\n\n    SECTION (\"Region in positive x, positive y quadrant, non-rectangular\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = 1;\n        bottomLeft.y = 2;\n        topRight.x = 3;\n        topRight.y = 4;\n    }\n\n    SECTION (\"Region in positive x, positive y quadrant, floating-point limits\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = 1.1;\n        bottomLeft.y = 2.2;\n        topRight.x = 3.3;\n        topRight.y = 4.4;\n    }\n\n    SECTION (\"Region in positive x, positive y quadrant, floating-point limits\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = 0.1;\n        bottomLeft.y = 0.2;\n        topRight.x = 0.3;\n        topRight.y = 0.4;\n    }\n\n    SECTION (\"Region in negative x, negative y quadrant, floating-point limits\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = -0.4;\n        bottomLeft.y = -0.3;\n        topRight.x = -0.2;\n        topRight.y = -0.1;\n    }\n\n    SECTION (\"Region in all quadrants, floating-point limits\")\n    {\n        spacing = 0.5;\n        bottomLeft.x = -1.1;\n        bottomLeft.y = -2.2;\n        topRight.x = 3.3;\n        topRight.y = 4.4;\n    }\n\n    SECTION (\"Region in all quadrants, floating-point limits, smaller spacing\")\n    {\n        spacing = 0.25;\n        bottomLeft.x = 1.1;\n        bottomLeft.y = 2.2;\n        topRight.x = 3.3;\n        topRight.y = 4.4;\n    }\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n    metaGraph->setRegion(bottomLeft, topRight);\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n    bool gridIsSet = pointMap.setGrid(spacing, offset);\n\n    int bottomLeftPixelIndexX = int(floor(bottomLeft.x / spacing - 0.5)) + 1;\n    int bottomLeftPixelIndexY = int(floor(bottomLeft.y / spacing - 0.5)) + 1;\n\n    int topRightPixelIndexX = int(floor(topRight.x / spacing - 0.5)) + 1;\n    int topRightPixelIndexY = int(floor(topRight.y / spacing - 0.5)) + 1;\n\n    int numCellsX = topRightPixelIndexX - bottomLeftPixelIndexX + 1;\n    int numCellsY = topRightPixelIndexY - bottomLeftPixelIndexY + 1;\n\n    // check if the size of the grid is as expected\n    REQUIRE(pointMap.getCols() == numCellsX);\n    REQUIRE(pointMap.getRows() == numCellsY);\n\n    Point2f gridBottomLeft(bottomLeftPixelIndexX * spacing - 0.5 * spacing,\n                           bottomLeftPixelIndexY * spacing - 0.5 * spacing);\n\n    // check if the bottom-left corner of the bottom-left pixel is as expected\n    REQUIRE(pointMap.getRegion().bottom_left.x == Approx(gridBottomLeft.x).epsilon(EPSILON));\n    REQUIRE(pointMap.getRegion().bottom_left.y == Approx(gridBottomLeft.y).epsilon(EPSILON));\n\n    Point2f midPoint(gridBottomLeft.x + spacing * (floor(numCellsX * 0.5) + 0.5),\n                      gridBottomLeft.y + spacing * (floor(numCellsY * 0.5) + 0.5));\n\n    int fill_type = 0; // = QDepthmapView::FULLFILL\n\n    bool pointsMade = pointMap.makePoints(midPoint, fill_type);\n\n    // check if the grid is filled\n    REQUIRE(pointsMade);\n}\n\nTEST_CASE(\"Test PointMap connections output\", \"\")\n{\n    const float EPSILON = 0.001;\n    double spacing = 0.5;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n\n    double rectSize = 1.5;\n\n    Point2f line0Start(0,0);\n    Point2f line0End(0,rectSize);\n    Point2f line1Start(0,rectSize);\n    Point2f line1End(rectSize,rectSize);\n    Point2f line2Start(rectSize,rectSize);\n    Point2f line2End(rectSize,0);\n    Point2f line3Start(rectSize,0);\n    Point2f line3End(0,0);\n\n    metaGraph->m_drawingFiles.emplace_back(\"Test SpacePixelGroup\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Test ShapeMap\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line0Start, line0End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line1Start, line1End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line2Start, line2End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line3Start, line3End));\n    metaGraph->m_drawingFiles.back().m_region = metaGraph->m_drawingFiles.back().m_spacePixels.back().getRegion();\n    metaGraph->setRegion(metaGraph->m_drawingFiles.back().m_region.bottom_left,\n                         metaGraph->m_drawingFiles.back().m_region.top_right);\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n\n    Point2f gridBottomLeft = pointMap.getRegion().bottom_left;\n\n    Point2f midPoint(gridBottomLeft.x + spacing * (floor(pointMap.getCols() * 0.5) + 0.5),\n                     gridBottomLeft.y + spacing * (floor(pointMap.getRows() * 0.5) + 0.5));\n\n    int fill_type = 0; // = QDepthmapView::FULLFILL\n    bool gridIsSet = pointMap.setGrid(spacing, offset);\n\n    bool pointsMade = pointMap.makePoints(midPoint, fill_type);\n\n    bool boundaryGraph = false;\n    double maxDist = -1;\n    // a communicator is required in order to create the connections between the pixels\n    std::unique_ptr<Communicator> comm(new ICommunicator());\n\n    bool graphMade = pointMap.sparkGraph2(comm.get(), boundaryGraph, maxDist);\n\n    REQUIRE(graphMade);\n\n    SECTION(\"PointMap::outputLinksAsCSV\") {\n        std::stringstream stream;\n        pointMap.mergePixels(65537, 131074);\n        pointMap.mergePixels(131073, 65538);\n        pointMap.outputLinksAsCSV(stream);\n\n        REQUIRE(stream.good());\n        char line[1000];\n        std::vector<std::string> lines;\n        while( !stream.eof())\n        {\n            stream.getline(line, 1000);\n            lines.push_back(line);\n        }\n        std::vector<std::string> expected{ \"RefFrom,RefTo\",\n                                           \"65537,131074\",\n                                           \"65538,131073\"};\n        REQUIRE(lines == expected);\n    }\n\n    SECTION(\"PointMap::outputConnectionsAsCSV\") {\n        std::stringstream stream;\n        pointMap.outputConnectionsAsCSV(stream);\n\n        REQUIRE(stream.good());\n        char line[1000];\n        std::vector<std::string> lines;\n        while( !stream.eof())\n        {\n            stream.getline(line, 1000);\n            lines.push_back(line);\n        }\n        std::vector<std::string> expected{ \"RefFrom,RefTo\",\n                                           \"65537,131073\", \"65537,131074\", \"65537,65538\",\n                                           \"65538,131074\", \"65538,131073\", \"131073,131074\"};\n        REQUIRE(lines == expected);\n    }\n\n    SECTION(\"PointMap::outputConnections\") {\n        std::stringstream stream;\n        pointMap.outputConnections(stream);\n\n        REQUIRE(stream.good());\n        char line[1000];\n        std::vector<std::string> lines;\n        while( !stream.eof())\n        {\n            stream.getline(line, 1000);\n            lines.push_back(line);\n        }\n        std::vector<std::string> expected{ \"#graph v1.0\",\n                                           \"node {\",\n                                           \"  ref    65537\",\n                                           \"  origin 0.5 0.5 0\",\n                                           \"  connections [\",\n                                           \"    131073,\",\n                                           \"    131074,\",\n                                           \"    65538,\",\n                                           \"  ]\",\n                                           \"}\",\n                                           \"node {\",\n                                           \"  ref    65538\",\n                                           \"  origin 0.5 1 0\",\n                                           \"  connections [\",\n                                           \"    131074,\",\n                                           \"    65537,\",\n                                           \"    131073,\",\n                                           \"  ]\",\n                                           \"}\",\n                                           \"node {\",\n                                           \"  ref    131073\",\n                                           \"  origin 1 0.5 0\",\n                                           \"  connections [\",\n                                           \"    131074,\",\n                                           \"    65538,\",\n                                           \"    65537,\",\n                                           \"  ]\",\n                                           \"}\",\n                                           \"node {\",\n                                           \"  ref    131074\",\n                                           \"  origin 1 1 0\",\n                                           \"  connections [\",\n                                           \"    65538,\",\n                                           \"    65537,\",\n                                           \"    131073,\",\n                                           \"  ]\",\n                                           \"}\",\n                                           \"\" };\n        REQUIRE(lines == expected);\n    }\n\n}\nTEST_CASE(\"Direct pointmap linking - fully filled grid (no geometry)\", \"\")\n{\n    double spacing = 0.5;\n    Point2f offset(0,0); // seems that this is always set to 0,0\n    Point2f bottomLeft(0,0);\n    Point2f topRight(2,4);\n    int fill_type = 0; // = QDepthmapView::FULLFILL\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n    metaGraph->setRegion(bottomLeft, topRight);\n    PointMap pointMap(metaGraph->getRegion(), metaGraph->m_drawingFiles, \"Test PointMap\");\n    pointMap.setGrid(spacing, offset);\n    Point2f gridBottomLeft = pointMap.getRegion().bottom_left;\n    Point2f midPoint(gridBottomLeft.x + spacing * (floor(pointMap.getCols() * 0.5) + 0.5),\n                         gridBottomLeft.y + spacing * (floor(pointMap.getRows() * 0.5) + 0.5));\n    pointMap.makePoints(midPoint, fill_type);\n\n    std::vector<Line> mergeLines;\n\n    PixelRef bottomLeftPixel = pointMap.pixelate(bottomLeft);\n    PixelRef topRightPixel = pointMap.pixelate(topRight);\n\n    // make sure pixels are not already merged\n    REQUIRE(!pointMap.isPixelMerged(bottomLeftPixel));\n    REQUIRE(!pointMap.isPixelMerged(topRightPixel));\n\n    // merge\n    pointMap.mergePixels(bottomLeftPixel, topRightPixel);\n\n    // make sure pixels are merged\n    REQUIRE(pointMap.isPixelMerged(bottomLeftPixel));\n    REQUIRE(pointMap.isPixelMerged(topRightPixel));\n\n    SECTION (\"Make sure we get the correct number of merged pixel pairs\")\n    {\n        const std::vector<std::pair<PixelRef, PixelRef>> &pixelPairs = pointMap.getMergedPixelPairs();\n        REQUIRE(pixelPairs.size() == 1);\n        REQUIRE(pixelPairs[0].first == bottomLeftPixel);\n        REQUIRE(pixelPairs[0].second == topRightPixel);\n    }\n\n    SECTION (\"Overwrite the pixelpair by re-merging the first pixel of the pair\")\n    {\n        PixelRef aboveBottomLeftPixel = pointMap.pixelate(Point2f(bottomLeft.x, bottomLeft.y + 1));\n\n        // merge\n        pointMap.mergePixels(aboveBottomLeftPixel, topRightPixel);\n\n        // make sure pixels are merged\n        REQUIRE(pointMap.isPixelMerged(aboveBottomLeftPixel));\n        REQUIRE(pointMap.isPixelMerged(topRightPixel));\n\n        // and previous pixel is not merged any more\n        REQUIRE(!pointMap.isPixelMerged(bottomLeftPixel));\n\n        // make sure we get the correct number of merged pixel pairs\n        const std::vector<std::pair<PixelRef, PixelRef>> &pixelPairs = pointMap.getMergedPixelPairs();\n        REQUIRE(pixelPairs.size() == 1);\n        REQUIRE(pixelPairs[0].first == aboveBottomLeftPixel);\n        REQUIRE(pixelPairs[0].second == topRightPixel);\n    }\n\n    SECTION (\"Overwrite the pixelpair by re-merging the second pixel of the pair\")\n    {\n        PixelRef belowTopRightPixel = pointMap.pixelate(Point2f(topRight.x, topRight.y - 1));\n\n        // merge\n        pointMap.mergePixels(bottomLeftPixel, belowTopRightPixel);\n\n        // make sure pixels are merged\n        REQUIRE(pointMap.isPixelMerged(bottomLeftPixel));\n        REQUIRE(pointMap.isPixelMerged(belowTopRightPixel));\n\n        // and previous pixel is not merged any more\n        REQUIRE(!pointMap.isPixelMerged(topRightPixel));\n\n        // make sure we get the correct number of merged pixel pairs\n        const std::vector<std::pair<PixelRef, PixelRef>> &pixelPairs2 = pointMap.getMergedPixelPairs();\n        REQUIRE(pixelPairs2.size() == 1);\n        REQUIRE(pixelPairs2[0].first == bottomLeftPixel);\n        REQUIRE(pixelPairs2[0].second == belowTopRightPixel);\n    }\n\n    SECTION (\"Merge the same pixel twice to erase the pair\")\n    {\n        pointMap.mergePixels(bottomLeftPixel, bottomLeftPixel);\n\n        // make sure no pixel is merged\n        REQUIRE(!pointMap.isPixelMerged(bottomLeftPixel));\n        REQUIRE(!pointMap.isPixelMerged(topRightPixel));\n\n        // make sure we get the correct number of merged pixel pairs\n        const std::vector<std::pair<PixelRef, PixelRef>> &pixelPairs3 = pointMap.getMergedPixelPairs();\n        REQUIRE(pixelPairs3.size() == 0);\n    }\n}\n"
  },
  {
    "path": "salaTest/testpushvalues.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mgraph.h\"\n#include \"salalib/pointdata.h\"\n#include \"salalib/shapemap.h\"\n#include \"salalib/spacepixfile.h\"\n\nTEST_CASE(\"Push values from shapemaps to VGA\", \"\") {\n\n    float vgaMinX = 0.00;\n    float vgaMinY = 0.00;\n    float vgaMaxX = 6.00;\n    float vgaMaxY = 6.00;\n    float cellSize = 1.0;\n    float minorOffset = cellSize * 0.05; // used to make sure that shapes don't fall exactly on the pointmap pixels\n\n    // The testing pointmap looks like below, filled at the 'o'\n    //\n    //         1   2   3   4   5\n    //       |   |   |   |   |   |\n    //     - + - + - + - + - + - + -\n    //  1    | o | o | o | o | o |\n    //     - + - + - + - + - + - + -\n    //  2    | o | o | o | o | o |\n    //     - + - + - + - + - + - + -\n    //  3    | o | o | o | o | o |\n    //     - + - + - + - + - + - + -\n    //  4    | o | o | o | o | o |\n    //     - + - + - + - + - + - + -\n    //  5    | o | o | o | o | o |\n    //     - + - + - + - + - + - + -\n    //       |   |   |   |   |   |\n\n    // in fact it should not be a requirement to make all these maps through\n    // the metagraph, but instead through a \"map pusher\" of some sorts\n\n    std::unique_ptr<MetaGraph> mgraph(new MetaGraph);\n    mgraph->m_drawingFiles.emplace_back(\"Drawing file\");\n    mgraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Drawing Map\");\n    ShapeMap &drawingMap = mgraph->m_drawingFiles.back().m_spacePixels.back();\n\n    // rectangle containing the filled area of the pointmap offset by 0.5 to\n    // make sure it falls exactly on the edge of the 1.0-sized cell\n    drawingMap.makePolyShape(\n        {\n            Point2f(vgaMinX + cellSize * 0.5, vgaMinY + cellSize * 0.5), //\n            Point2f(vgaMinX + cellSize * 0.5, vgaMaxY - cellSize * 0.5), //\n            Point2f(vgaMaxX - cellSize * 0.5, vgaMaxY - cellSize * 0.5), //\n            Point2f(vgaMaxX - cellSize * 0.5, vgaMinY + cellSize * 0.5)  //\n        },\n        false);\n    Point2f bl = drawingMap.getRegion().bottom_left;\n    Point2f tr = drawingMap.getRegion().top_right;\n    mgraph->updateParentRegions(drawingMap);\n\n    mgraph->addNewPointMap(\"VGA Map\");\n    PointMap &vgaMap = mgraph->getPointMaps().back();\n    vgaMap.setGrid(1.0);\n    vgaMap.makePoints(Point2f((vgaMinX + vgaMaxX) * 0.5 + minorOffset, (vgaMinY + vgaMaxY) * 0.5 + minorOffset), 0);\n    vgaMap.sparkGraph2(nullptr, false, -1);\n    AttributeTable &vgaTable = vgaMap.getAttributeTable();\n\n    int minI = std::numeric_limits<int>::max();\n    int minJ = std::numeric_limits<int>::max();\n    int maxI = -std::numeric_limits<int>::max();\n    int maxJ = -std::numeric_limits<int>::max();\n    for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n        PixelRef key(vgaRowIter->getKey().value);\n        if (key.x < minI)\n            minI = key.x;\n        if (key.y < minJ)\n            minJ = key.y;\n        if (key.x > maxI)\n            maxI = key.x;\n        if (key.y > maxJ)\n            maxJ = key.y;\n    }\n    int midI = floor((minI + maxI) * 0.5);\n    int midJ = floor((minJ + maxJ) * 0.5);\n\n    std::string attributeName = \"Shape Value\";\n    int vgaAttrColIdx = vgaMap.addAttribute(attributeName);\n\n    SECTION(\"Data map\") {\n        mgraph->addShapeMap(\"Test ShapeMap\");\n        ShapeMap &sourceMap = mgraph->getDataMaps().back();\n\n        int sourceAttrColIdx = sourceMap.addAttribute(attributeName);\n\n        for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n            REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == -1);\n        }\n\n        SECTION(\"Single polygon input\") {\n\n            // main testing shape. drawn in a way so that it contains the pixels\n            // that are not on the outer-edge of the pointmap\n            sourceMap.makePolyShape(\n                {\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMinY + cellSize * 1.5 - minorOffset), //\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMinY + cellSize * 1.5 - minorOffset)  //\n                },\n                false);\n\n            sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n\n            mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_MAX);\n\n            // all values are 1 (like the polygon) except from those on the edges\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = 1;\n                if (key.x == minI || key.x == maxI || key.y == minJ || key.y == maxJ) {\n                    expectedValue = -1;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n\n        SECTION(\"Two overlapping polygons input\", \"\") {\n\n            // left polygon\n            sourceMap.makePolyShape(\n                {\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMinY + cellSize * 1.5 - minorOffset),  //\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset),  //\n                    Point2f((vgaMinX + vgaMaxX) * 0.5 + minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset), //\n                    Point2f((vgaMinX + vgaMaxX) * 0.5 + minorOffset, vgaMinY + cellSize * 1.5 - minorOffset)  //\n                },\n                false);\n\n            // right polygon\n            sourceMap.makePolyShape(\n                {\n                    Point2f((vgaMinX + vgaMaxX) * 0.5 - minorOffset, vgaMinY + cellSize * 1.5 - minorOffset), //\n                    Point2f((vgaMinX + vgaMaxX) * 0.5 - minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset),  //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMinY + cellSize * 1.5 - minorOffset)   //\n                },\n                false);\n\n            sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n            sourceMap.getAttributeTable().getRow(AttributeKey(1)).setValue(sourceAttrColIdx, 2);\n\n            SECTION(\"Shared border max function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_MAX);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = 1;\n                    if (key.x == minI || key.x == maxI || key.y == minJ || key.y == maxJ) {\n                        // cells on the border\n                        expectedValue = -1;\n                    } else if (key.x > midI) {\n                        // cells on the right polygon\n                        expectedValue = 2;\n                    } else if (key.x == midI) {\n                        // cells on the shared border get the MAXIMUM value from the two polygons\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Shared border min function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_MIN);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = 1;\n                    if (key.x == minI || key.x == maxI || key.y == minJ || key.y == maxJ) {\n                        // cells on the border\n                        expectedValue = -1;\n                    } else if (key.x > midI) {\n                        // cells on the right polygon\n                        expectedValue = 2;\n                    } else if (key.x == midI) {\n                        // cells on the shared border get the MINIMUM value from the two polygons\n                        expectedValue = 1;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Shared border average function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_AVG);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = 1;\n                    if (key.x == minI || key.x == maxI || key.y == minJ || key.y == maxJ) {\n                        // cells on the border\n                        expectedValue = -1;\n                    } else if (key.x > midI) {\n                        // cells on the right polygon\n                        expectedValue = 2;\n                    } else if (key.x == midI) {\n                        // cells on the shared border get the AVERAGE value of the two polygons\n                        expectedValue = 1.5;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Shared border total function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_TOT);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = 1;\n                    if (key.x == minI || key.x == maxI || key.y == minJ || key.y == maxJ) {\n                        // cells on the border\n                        expectedValue = -1;\n                    } else if (key.x > midI) {\n                        // cells on the right polygon\n                        expectedValue = 2;\n                    } else if (key.x == midI) {\n                        // cells on the shared border get the TOTAL value of the two polygons\n                        expectedValue = 3;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n        }\n\n        SECTION(\"Single line input\", \"\") {\n\n            // vertical line\n            sourceMap.makeLineShape({\n                Point2f((vgaMinX + vgaMaxX) * 0.5 - minorOffset, vgaMinY + minorOffset), //\n                Point2f((vgaMinX + vgaMaxX) * 0.5 + minorOffset, vgaMaxY - minorOffset)  //\n            });\n\n            sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n\n            mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_MAX);\n\n            // all values are -1 except from those under the line (1)\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = -1;\n                if (key.x == midI) {\n                    expectedValue = 1;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n\n        SECTION(\"Crossing lines input\", \"\") {\n\n            // vertical line\n            sourceMap.makeLineShape({\n                Point2f((vgaMinX + vgaMaxX) * 0.5 - minorOffset, vgaMinY + minorOffset), //\n                Point2f((vgaMinX + vgaMaxX) * 0.5 + minorOffset, vgaMaxY - minorOffset)  //\n            });\n\n            // horizontal line\n            sourceMap.makeLineShape({\n                Point2f(vgaMinX + minorOffset, (vgaMinY + vgaMaxY) * 0.5 - minorOffset), //\n                Point2f(vgaMaxX - minorOffset, (vgaMinY + vgaMaxY) * 0.5 + minorOffset)  //\n            });\n\n            sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n            sourceMap.getAttributeTable().getRow(AttributeKey(1)).setValue(sourceAttrColIdx, 2);\n\n            SECTION(\"Crossing lines max function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_MAX);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if (key.x == midI && key.y == midJ) {\n                        // cells on line intersection get the MAXIMUM value of the two\n                        expectedValue = 2;\n                    } else if (key.x == midI) {\n                        // vertical line\n                        expectedValue = 1;\n                    } else if (key.y == midJ) {\n                        // horizontal line\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Crossing lines min function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_MIN);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if (key.x == midI && key.y == midJ) {\n                        // cells on line intersection get the MINIMUM value of the two\n                        expectedValue = 1;\n                    } else if (key.x == midI) {\n                        // vertical line\n                        expectedValue = 1;\n                    } else if (key.y == midJ) {\n                        // horizontal line\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Crossing lines average function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_AVG);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if (key.x == midI && key.y == midJ) {\n                        // cells on line intersection get the AVERAGE value of the two\n                        expectedValue = 1.5;\n                    } else if (key.x == midI) {\n                        // vertical line\n                        expectedValue = 1;\n                    } else if (key.y == midJ) {\n                        // horizontal line\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Crossing lines total function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_TOT);\n\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if (key.x == midI && key.y == midJ) {\n                        // cells on line intersection get the TOTAL value of the two\n                        expectedValue = 3;\n                    } else if (key.x == midI) {\n                        // vertical line\n                        expectedValue = 1;\n                    } else if (key.y == midJ) {\n                        // horizontal line\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n        }\n\n        SECTION(\"Single open polyline input\", \"\") {\n\n            // L shape\n            sourceMap.makePolyShape(\n                {\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMinY + cellSize * 1.5 - minorOffset), //\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset)  //\n                },\n                true);\n\n            sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n\n            mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_MAX);\n\n            // all values are -1 except from those under the line (1)\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = -1;\n                if (key.x == minI || key.y == maxJ) {\n                    expectedValue = 1;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n\n        SECTION(\"Crossing open polylines input\", \"\") {\n\n            // L shape\n            sourceMap.makePolyShape(\n                {\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMinY + cellSize * 1.5 - minorOffset), //\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset)  //\n                },\n                true);\n\n            // L shape rotated 180 degrees\n            sourceMap.makePolyShape(\n                {\n                    Point2f(vgaMinX + cellSize * 1.5 - minorOffset, vgaMinY + cellSize * 1.5 - minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMinY + cellSize * 1.5 - minorOffset), //\n                    Point2f(vgaMaxX - cellSize * 1.5 + minorOffset, vgaMaxY - cellSize * 1.5 + minorOffset)  //\n                },\n                true);\n\n            sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n            sourceMap.getAttributeTable().getRow(AttributeKey(1)).setValue(sourceAttrColIdx, 2);\n\n            SECTION(\"Crossing open polylines max function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_MAX);\n\n                // all values are -1 except from those under the line (1)\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if ((key.x == minI && key.y == minJ) || (key.x == maxI && key.y == maxJ)) {\n                        // cells on line intersection get the MAXIMUM value of the two\n                        expectedValue = 2;\n                    } else if (key.x == minI || key.y == maxJ) {\n                        // L shape\n                        expectedValue = 1;\n                    } else if (key.x == maxI || key.y == minJ) {\n                        // L shape rotated 180 degrees\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Crossing open polylines min function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_MIN);\n\n                // all values are -1 except from those under the line (1)\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if ((key.x == minI && key.y == minJ) || (key.x == maxI && key.y == maxJ)) {\n                        // cells on line intersection get the MINUMUM value of the two\n                        expectedValue = 1;\n                    } else if (key.x == minI || key.y == maxJ) {\n                        // L shape\n                        expectedValue = 1;\n                    } else if (key.x == maxI || key.y == minJ) {\n                        // L shape rotated 180 degrees\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Crossing open polylines average function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_AVG);\n\n                // all values are -1 except from those under the line (1)\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if ((key.x == minI && key.y == minJ) || (key.x == maxI && key.y == maxJ)) {\n                        // cells on line intersection get the AVERAGE value of the two\n                        expectedValue = 1.5;\n                    } else if (key.x == minI || key.y == maxJ) {\n                        // L shape\n                        expectedValue = 1;\n                    } else if (key.x == maxI || key.y == minJ) {\n                        // L shape rotated 180 degrees\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n\n            SECTION(\"Crossing open polylines total function\") {\n                mgraph->pushValuesToLayer(MetaGraph::VIEWDATA, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx,\n                                          vgaAttrColIdx, MetaGraph::PUSH_FUNC_TOT);\n\n                // all values are -1 except from those under the line (1)\n                for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                    PixelRef key(vgaRowIter->getKey().value);\n                    float expectedValue = -1;\n                    if ((key.x == minI && key.y == minJ) || (key.x == maxI && key.y == maxJ)) {\n                        // cells on line intersection get the TOTAL value of the two\n                        expectedValue = 3;\n                    } else if (key.x == minI || key.y == maxJ) {\n                        // L shape\n                        expectedValue = 1;\n                    } else if (key.x == maxI || key.y == minJ) {\n                        // L shape rotated 180 degrees\n                        expectedValue = 2;\n                    }\n                    REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n                }\n            }\n        }\n    }\n\n    SECTION(\"Axial map\") {\n        // the pushValues function takes the base shapemap so these sections are mainly to test\n        // sending ShapeGraphs and setting the source map type to MetaGraph::VIEWAXIAL\n\n        mgraph->addShapeGraph(\"Test Axial Map\", ShapeMap::AXIALMAP);\n        ShapeGraph &sourceMap = *mgraph->getShapeGraphs().back().get();\n\n        sourceMap.init(2, mgraph->getRegion());\n        sourceMap.initialiseAttributesAxial();\n\n        for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n            REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == -1);\n        }\n\n        // vertical line\n        sourceMap.makeLineShape({\n            Point2f((vgaMinX + vgaMaxX) * 0.5 - minorOffset, vgaMinY + minorOffset), //\n            Point2f((vgaMinX + vgaMaxX) * 0.5 + minorOffset, vgaMaxY - minorOffset)  //\n        });\n\n        // horizontal line\n        sourceMap.makeLineShape({\n            Point2f(vgaMinX + minorOffset, (vgaMinY + vgaMaxY) * 0.5 - minorOffset), //\n            Point2f(vgaMaxX - minorOffset, (vgaMinY + vgaMaxY) * 0.5 + minorOffset)  //\n        });\n\n        int sourceAttrColIdx = sourceMap.addAttribute(attributeName);\n\n        sourceMap.getAttributeTable().getRow(AttributeKey(0)).setValue(sourceAttrColIdx, 1);\n        sourceMap.getAttributeTable().getRow(AttributeKey(1)).setValue(sourceAttrColIdx, 2);\n\n        sourceMap.makeConnections();\n\n        REQUIRE(sourceMap.getAttributeTable().hasColumn(\"Connectivity\"));\n\n        SECTION(\"Crossing lines max function\") {\n            mgraph->pushValuesToLayer(MetaGraph::VIEWAXIAL, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_MAX);\n\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = -1;\n                if (key.x == midI && key.y == midJ) {\n                    // cells on line intersection get the MAXIMUM value of the two\n                    expectedValue = 2;\n                } else if (key.x == midI) {\n                    // vertical line\n                    expectedValue = 1;\n                } else if (key.y == midJ) {\n                    // horizontal line\n                    expectedValue = 2;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n\n        SECTION(\"Crossing lines min function\") {\n            mgraph->pushValuesToLayer(MetaGraph::VIEWAXIAL, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_MIN);\n\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = -1;\n                if (key.x == midI && key.y == midJ) {\n                    // cells on line intersection get the MINIMUM value of the two\n                    expectedValue = 1;\n                } else if (key.x == midI) {\n                    // vertical line\n                    expectedValue = 1;\n                } else if (key.y == midJ) {\n                    // horizontal line\n                    expectedValue = 2;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n\n        SECTION(\"Crossing lines average function\") {\n            mgraph->pushValuesToLayer(MetaGraph::VIEWAXIAL, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_AVG);\n\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = -1;\n                if (key.x == midI && key.y == midJ) {\n                    // cells on line intersection get the AVERAGE value of the two\n                    expectedValue = 1.5;\n                } else if (key.x == midI) {\n                    // vertical line\n                    expectedValue = 1;\n                } else if (key.y == midJ) {\n                    // horizontal line\n                    expectedValue = 2;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n\n        SECTION(\"Crossing lines total function\") {\n            mgraph->pushValuesToLayer(MetaGraph::VIEWAXIAL, 0, MetaGraph::VIEWVGA, 0, sourceAttrColIdx, vgaAttrColIdx,\n                                      MetaGraph::PUSH_FUNC_TOT);\n\n            for (auto vgaRowIter = vgaTable.begin(); vgaRowIter != vgaTable.end(); vgaRowIter++) {\n                PixelRef key(vgaRowIter->getKey().value);\n                float expectedValue = -1;\n                if (key.x == midI && key.y == midJ) {\n                    // cells on line intersection get the TOTAL value of the two\n                    expectedValue = 3;\n                } else if (key.x == midI) {\n                    // vertical line\n                    expectedValue = 1;\n                } else if (key.y == midJ) {\n                    // horizontal line\n                    expectedValue = 2;\n                }\n                REQUIRE(vgaRowIter->getRow().getValue(vgaAttrColIdx) == expectedValue);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "salaTest/testsalaprogram.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"../salalib/mapconverter.h\"\n#include \"catch.hpp\"\n#include \"salalib/salaprogram.h\"\n#include \"genlib/p2dpoly.h\"\n#include \"salalib/mgraph.h\"\n#include \"salalib/axialmap.h\"\n#include <sstream>\n\n// Most of these test cases are adapted from salalib/salascript-tests.txt\n// with some added for completeness\n\nTEST_CASE(\"Trivial scripts\") {\n\n    std::stringstream script;\n    SalaObj expected;\n\n    SECTION(\"comment\") {\n        script << \"# comment\\n\";\n    }\n\n    SECTION(\"single dimension lists\") {\n        script << \"x = [1,2]\\n\"\n               << \"x[1] = 10\\n\"\n               << \"x[1]\\n\";\n        expected = SalaObj(10);\n    }\n\n    SECTION(\"multiple dimension lists\") {\n        script << \"x = [[1,2],[3,4]]\\n\"\n               << \"x[0][1] = 10\\n\"\n               << \"x[0][1]\\n\";\n        expected = SalaObj(10);\n    }\n\n    SECTION(\"range direct access\") {\n        script << \"range(5,10)[2]\\n\";\n        expected = SalaObj(7);\n    }\n\n    SECTION(\"list return length\") {\n        script << \"x = [1,2,3]\\n\"\n               << \"len(x)\\n\";\n        expected = SalaObj(3);\n    }\n\n    SECTION(\"list return list\") {\n        script << \"x = [1,2,3]\\n\"\n               << \"x\\n\";\n        expected = SalaObj(SalaObj::Type::S_LIST, 3);\n        expected.list_at(0) = SalaObj(1);\n        expected.list_at(1) = SalaObj(2);\n        expected.list_at(2) = SalaObj(3);\n    }\n\n    SECTION(\"2D list return length\") {\n        script << \"x = [[1,2],[3,4]]\\n\"\n               << \"len(x)\\n\";\n        expected = SalaObj(2);\n    }\n\n    SECTION(\"2D list return list\") {\n        script << \"x = [[1,2],[3,4]]\\n\"\n               << \"x\\n\";\n        expected = SalaObj(SalaObj::Type::S_LIST, 2);\n        expected.list_at(0) = SalaObj(SalaObj::Type::S_LIST, 2);\n        expected.list_at(0).list_at(0) = SalaObj(1);\n        expected.list_at(0).list_at(1) = SalaObj(2);\n        expected.list_at(1) = SalaObj(SalaObj::Type::S_LIST, 2);\n        expected.list_at(1).list_at(0) = SalaObj(3);\n        expected.list_at(1).list_at(1) = SalaObj(4);\n    }\n\n    SECTION(\"Pythonesque curios: lists by reference\") {\n        script << \"x = [1,2,3,4]\\n\"\n               << \"y = x\\n\"\n               << \"y[3] = 40\\n\"\n               << \"x[3]\\n\";\n        expected = SalaObj(40);\n    }\n\n    SalaGrf graph;\n    SalaObj context = SalaObj(SalaObj::S_POINTMAPOBJ, graph);\n    SalaProgram program(context);\n    program.parse(script);\n    SalaObj result = program.evaluate();\n    REQUIRE(result == expected);\n}\n\nTEST_CASE(\"Trivial errors\") {\n\n    std::stringstream script;\n\n    SECTION(\"simple for with error: i should be uninitialised\") {\n        script << \"x = 0\\n\"\n               << \"for i in range(5,10):\\n\"\n               << \"    x = 1\\n\"\n               << \"x = x + i\\n\";\n    }\n\n    SalaGrf graph;\n    SalaObj context = SalaObj(SalaObj::S_POINTMAPOBJ, graph);\n    SalaProgram program(context);\n    program.parse(script);\n    REQUIRE_THROWS_WITH(program.evaluate(), \"\");\n\n\n}\n\nTEST_CASE(\"Variables from outer scope are accessible in inner scope\") {\n    std::stringstream script;\n    SalaObj expected;\n    SECTION(\"Access to global scope from within a for loop\") {\n        script << \"x = 5\\n\"\n               << \"for i in range(0,1):\\n\"\n               << \"    x = 100\\n\"\n               << \"x\";\n        expected = SalaObj(100);\n    }\n\n    SalaGrf graph;\n    SalaObj context = SalaObj(SalaObj::S_POINTMAPOBJ, graph);\n    SalaProgram program(context);\n    program.parse(script);\n    SalaObj result = program.evaluate();\n    REQUIRE(result.toInt() == expected.toInt());\n}\n\nTEST_CASE(\"Shapemap scripts\") {\n\n    const double EPSILON = 0.001;\n\n    Point2f line1Start(0,0);\n    Point2f line1End  (3,0);\n    Point2f line2Start(1,1);\n    Point2f line2End  (1,-1);\n    Point2f line3Start(2,1);\n    Point2f line3End  (2,-2);\n    Point2f line4Start(2,1);\n    Point2f line4End  (4,1);\n    Point2f line5Start(5,3);\n    Point2f line5End  (3,1);\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test SuperSpacePixel\"));\n\n    metaGraph->m_drawingFiles.push_back(SpacePixelFile(\"Test SpacePixelGroup\"));\n    metaGraph->m_drawingFiles.back().m_spacePixels.push_back(ShapeMap(\"Test ShapeMap\"));\n\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line1Start, line1End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line2Start, line2End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line3Start, line3End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line4Start, line4End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line5Start, line5End));\n\n    auto shapeGraph = MapConverter::convertDrawingToAxial(0, \"Test axial\", metaGraph->m_drawingFiles);\n\n\n    std::stringstream script;\n    std::vector<double> expectedColVals;\n\n    SECTION(\"pass ref to new column\") {\n            script << \"value(\\\"Ref Number\\\")\\n\";\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(1.0);\n            expectedColVals.push_back(2.0);\n            expectedColVals.push_back(3.0);\n            expectedColVals.push_back(4.0);\n    }\n\n    SECTION(\"if, function of a function on a range\") {\n            script << \"x = len(range(1,value(\\\"Ref Number\\\")))\\n\"\n                   << \"if x == 2:\\n\"\n                   << \"   return 5\\n\"\n                   << \"elif x < 1:\\n\"\n                   << \"   return 10\\n\"\n                   << \"x\\n\"\n                   << \"# first two objects should be set to 10, next to 5, and then ref number after that;\\n\";\n            expectedColVals.push_back(10.0);\n            expectedColVals.push_back(10.0);\n            expectedColVals.push_back(1.0);\n            expectedColVals.push_back(5.0);\n            expectedColVals.push_back(3.0);\n    }\n\n    SECTION(\"simple if\") {\n            script << \"if value(\\\"Ref Number\\\") < 2:\\n\"\n                   << \"    0\\n\"\n                   << \"elif value(\\\"Ref Number\\\") == 3:\\n\"\n                   << \"    5\\n\"\n                   << \"else\\n\"\n                   << \"    10\\n\";\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(10.0);\n            expectedColVals.push_back(5.0);\n            expectedColVals.push_back(10.0);\n    }\n\n    SECTION(\"various member functions tests\") {\n            script << \"this.value(\\\"Ref Number\\\")\\n\"\n                   << \"    len(range(1,this.value(\\\"Ref Number\\\")))\\n\"\n                   << \"elif value(\\\"Ref Number\\\") == 3:\\n\"\n                   << \"    range(1,this.value(\\\"Ref Number\\\")).length()\\n\";\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(1.0);\n            expectedColVals.push_back(2.0);\n            expectedColVals.push_back(3.0);\n    }\n\n    int newCol = shapeGraph->addAttribute(\"NewCol\");\n    SalaGrf graph;\n    graph.map.shape = shapeGraph.get();\n    SalaObj context = SalaObj(SalaObj::S_SHAPEMAPOBJ, graph);\n    SalaProgram program(context);\n    program.parse(script);\n    program.runupdate(newCol);\n\n    REQUIRE(shapeGraph->getAttributeTable().getNumRows() == expectedColVals.size());\n\n    auto iter = expectedColVals.begin();\n    auto &attributes = shapeGraph->getAttributeTable();\n    for (auto rowIter = attributes.begin(); rowIter != attributes.end(); rowIter++) {\n        REQUIRE(rowIter->getRow().getValue(newCol) == Approx(*iter).epsilon(EPSILON));\n        iter++;\n    }\n}\n\nTEST_CASE(\"Shapemap scripts with unexpected results\") {\n\n    const double EPSILON = 0.001;\n\n    Point2f line1Start(0,0);\n    Point2f line1End  (3,0);\n    Point2f line2Start(1,1);\n    Point2f line2End  (1,-1);\n    Point2f line3Start(2,1);\n    Point2f line3End  (2,-2);\n    Point2f line4Start(2,1);\n    Point2f line4End  (4,1);\n    Point2f line5Start(5,3);\n    Point2f line5End  (3,1);\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test SuperSpacePixel\"));\n\n    metaGraph->m_drawingFiles.push_back(SpacePixelFile(\"Test SpacePixelGroup\"));\n    metaGraph->m_drawingFiles.back().m_spacePixels.push_back(ShapeMap(\"Test ShapeMap\"));\n\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line1Start, line1End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line2Start, line2End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line3Start, line3End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line4Start, line4End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line5Start, line5End));\n\n    auto shapeGraph = MapConverter::convertDrawingToAxial(0, \"Test axial\", metaGraph->m_drawingFiles);\n\n\n    std::stringstream script;\n    std::vector<double> expectedColVals;\n\n    SECTION(\"for with else and 0 length ranges\") {\n            script << \"int x = 0\\n\"\n                   << \"for i in range(2,value(\\\"Ref Number\\\")):\\n\"\n                   << \"    x = x + i\\n\"\n                   << \"    x\\n\"\n                   << \"else:\\n\"\n                   << \"    0\\n\";\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(0.0);\n            expectedColVals.push_back(2.0);\n            expectedColVals.push_back(5.0);\n    }\n\n    SECTION(\"Total Depth Calculation\") {\n            script << \"total_depth = 0\\n\"\n                   << \"depth = 0\\n\"\n                   << \"pop_list = [this]\\n\"\n                   << \"push_list = []\\n\"\n                   << \"setmark(true)\\n\"\n                   << \"while len(pop_list):\\n\"\n                   << \"    total_depth = total_depth + depth\\n\"\n                   << \"    curs = pop_list.pop()\\n\"\n                   << \"    for i in curs.connections():\\n\"\n                   << \"        if i.mark() is none:\\n\"\n                   << \"            i.setmark(true)\\n\"\n                   << \"            push_list.append(i)\\n\"\n                   << \"    if len(pop_list) == 0:\\n\"\n                   << \"        depth = depth + 1\\n\"\n                   << \"        pop_list = push_list\\n\"\n                   << \"        push_list = []\\n\"\n                   << \"total_depth\\n\";\n            expectedColVals.push_back(7.0);\n            expectedColVals.push_back(10.0);\n            expectedColVals.push_back(6.0);\n            expectedColVals.push_back(7.0);\n            expectedColVals.push_back(10.0);\n    }\n\n    SECTION(\"Shortest Cycle\") {\n            script << \"push_list = []\\n\"\n                   << \"pop_list = []\\n\"\n                   << \"live_paths = []\\n\"\n                   << \"setmark([-1,0])\\n\"\n                   << \"depth = 1\\n\"\n                   << \"path_index = 0\\n\"\n                   << \"for i in connections():\\n\"\n                   << \"    pop_list.append([path_index,i])\\n\"\n                   << \"    live_paths.append(1)\\n\"\n                   << \"    i.setmark([path_index,depth])\\n\"\n                   << \"    path_index = path_index + 1\\n\"\n                   << \"if path_index < 2:\\n\"\n                   << \"    return -1 # no cycle possible\\n\"\n                   << \"live_path_count = path_index\\n\"\n                   << \"while len(pop_list) and live_path_count > 1:\\n\"\n                   << \"    curs = pop_list.pop()\\n\"\n                   << \"    path_index = curs[0]\\n\"\n                   << \"    this_node = curs[1]\\n\"\n                   << \"    live_paths[path_index] = live_paths[path_index] - 1\\n\"\n                   << \"    for i in this_node.connections():\\n\"\n                   << \"        if i.mark() is none:\\n\"\n                   << \"            i.setmark([path_index,depth+1])\\n\"\n                   << \"            push_list.append([path_index,i])\\n\"\n                   << \"            live_paths[path_index] = live_paths[path_index] + 1\\n\"\n                   << \"        elif i.mark()[0] != path_index and i.mark()[0] != -1:\\n\"\n                   << \"            # found a cycle!\\n\"\n                   << \"            return i.mark()[1] + this_node.mark()[1] + 1\\n\"\n                   << \"    if live_paths[path_index] == 0:\\n\"\n                   << \"        live_path_count = live_path_count - 1\\n\"\n                   << \"    if len(pop_list) == 0:\\n\"\n                   << \"        depth = depth + 1\\n\"\n                   << \"        pop_list = push_list\\n\"\n                   << \"        push_list = []\\n\"\n                   << \"-1 # no cycle found\\n\";\n            expectedColVals.push_back(-1.0);\n            expectedColVals.push_back(-1.0);\n            expectedColVals.push_back(-1.0);\n            expectedColVals.push_back(-1.0);\n            expectedColVals.push_back(-1.0);\n    }\n\n\n\n    int newCol = shapeGraph->addAttribute(\"NewCol\");\n    SalaGrf graph;\n    graph.map.shape = shapeGraph.get();\n    SalaObj context = SalaObj(SalaObj::S_SHAPEMAPOBJ, graph);\n    SalaProgram program(context);\n    program.parse(script);\n    program.runupdate(newCol);\n\n    REQUIRE(shapeGraph->getAttributeTable().getNumRows() == expectedColVals.size());\n\n    auto iter = expectedColVals.begin();\n    auto &attributes = shapeGraph->getAttributeTable();\n    for (auto rowIter = attributes.begin(); rowIter != attributes.end(); rowIter++) {\n        REQUIRE(rowIter->getRow().getValue(newCol) == Approx(*iter).epsilon(EPSILON));\n        iter++;\n    }\n}\n\nTEST_CASE(\"Performance tests\") {\n    //# For a graph with 100000 segments for cpu timing:\n    //x=value(\"Angular Connectivity\")*value(\"Angular Step Depth\")+value(\"Axial Line Ref\")+value(\"Connectivity\")/value(\"Segment Length\")^value(\"T1024 Choice R1000 metric\")\n    //y=value(\"T1024 Choice R3000 metric\")*value(\"T1024 Choice R4000 metric\")/value(\"T1024 Choice R5000 metric\")^value(\"T1024 Total Depth [Segment Length Wgt] R4000 metric\")\n    //y/x\n}\n"
  },
  {
    "path": "salaTest/testshapegraphs.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"../salalib/mapconverter.h\"\n#include \"../genlib/p2dpoly.h\"\n#include \"../salalib/mgraph.h\"\n#include \"../salalib/shapemap.h\"\n#include \"../salalib/axialmap.h\"\n#include \"catch.hpp\"\n#include <sstream>\n#include <iostream>\n\nTEST_CASE(\"Testing ShapeGraph::writeAxialConnections\"){\n\n    Point2f line1Start(0,0);\n    Point2f line1End  (3,0);\n    Point2f line2Start(1,1);\n    Point2f line2End  (1,-1);\n    Point2f line3Start(2,1);\n    Point2f line3End  (2,-2);\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n\n    metaGraph->m_drawingFiles.emplace_back(\"Test SpacePixelGroup\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Test ShapeMap\");\n\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line1Start, line1End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line2Start, line2End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line3Start, line3End));\n\n    auto shapegraph = MapConverter::convertDrawingToAxial(0, \"Test axial\", metaGraph->m_drawingFiles);\n\n    SECTION(\"writeAxialConnectionsAsDotGraph\") {\n        std::stringstream stream;\n        shapegraph->writeAxialConnectionsAsDotGraph(stream);\n\n        REQUIRE(stream.good());\n        char line[1000];\n        std::vector<std::string> lines;\n        while( !stream.eof())\n        {\n            stream.getline(line, 1000);\n            lines.push_back(line);\n        }\n        std::vector<std::string> expected{ \"strict graph {\", \"    0 -- 1\", \"    0 -- 2\",\n                                           \"    1 -- 0\", \"    2 -- 0\", \"}\", \"\" };\n        REQUIRE(lines == expected);\n    }\n    SECTION(\"writeAxialConnectionsAsPairsCSV\") {\n        std::stringstream stream;\n        shapegraph->writeAxialConnectionsAsPairsCSV(stream);\n\n        REQUIRE(stream.good());\n        char line[1000];\n        std::vector<std::string> lines;\n        while( !stream.eof())\n        {\n            stream.getline(line, 1000);\n            lines.push_back(line);\n        }\n        std::vector<std::string> expected{ \"refA,refB\", \"0,1\", \"0,2\", \"1,0\", \"2,0\" };\n        REQUIRE(lines == expected);\n    }\n}\nTEST_CASE(\"Testing ShapeGraph::writeSegmentConnections\")\n{\n    // As we are converting the drawing directly to segments\n    // the lines need to touch, not cross\n\n    Point2f line1Start(1,1);\n    Point2f line1End  (1,0);\n    Point2f line2Start(1,0);\n    Point2f line2End  (2,0);\n    Point2f line3Start(2,0);\n    Point2f line3End  (2,2);\n\n    std::unique_ptr<MetaGraph> metaGraph(new MetaGraph(\"Test MetaGraph\"));\n\n    metaGraph->m_drawingFiles.emplace_back(\"Test SpacePixelGroup\");\n    metaGraph->m_drawingFiles.back().m_spacePixels.emplace_back(\"Test ShapeMap\");\n\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line1Start, line1End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line2Start, line2End));\n    metaGraph->m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(line3Start, line3End));\n\n    auto shapegraph = MapConverter::convertDrawingToSegment(0, \"Test segment\", metaGraph->m_drawingFiles);\n\n    SECTION(\"writeSegmentConnectionsAsPairsCSV\") {\n        std::stringstream stream;\n        shapegraph->writeSegmentConnectionsAsPairsCSV(stream);\n\n        REQUIRE(stream.good());\n        char line[1000];\n        std::vector<std::string> lines;\n        while( !stream.eof())\n        {\n            stream.getline(line, 1000);\n            lines.push_back(line);\n        }\n        std::vector<std::string> expected{ \"refA,refB,ss_weight,for_back,dir\", \"0,1,1,0,1\", \"1,2,1,0,1\", \"1,0,1,1,-1\",\n                                           \"2,1,1,1,-1\" };\n        REQUIRE(lines == expected);\n    }\n}\n\n// While the linking functionality is placed in the ShapeMap,\n// (for example the variables m_links and m_unlinks) it can\n// only be used through ShapeGraph because it starts with\n// m_hasgraph = true. Ideally the linking functionality should\n// move to the ShapeGraph\n\nTEST_CASE(\"Testing ShapeMap::getAllLinkLines and ShapeMap::getAllUnlinkPoints()\")\n{\n    const float EPSILON = 0.001;\n    const double TOLERANCE_A = 1e-9;\n    Point2f line0Start (0.522, 0.424);\n    Point2f line0End   (0.709, 1.098);\n    Point2f line1Start (0.897, 1.123);\n    Point2f line1End   (1.122, 0.421);\n    Point2f line2Start (1.073, 0.386);\n    Point2f line2End   (1.269, 1.196);\n\n    std::unique_ptr<ShapeGraph> shapeGraph(new ShapeGraph(\"Test ShapeMap\"));\n\n    shapeGraph->makeLineShape(Line(line0Start, line0End));\n    shapeGraph->makeLineShape(Line(line1Start, line1End));\n    shapeGraph->makeLineShape(Line(line2Start, line2End));\n\n    shapeGraph->makeShapeConnections();\n\n    shapeGraph->linkShapes(0,1);\n    shapeGraph->unlinkShapes(1,2);\n\n    std::vector<SimpleLine> linkLines = shapeGraph->getAllLinkLines();\n\n    REQUIRE(linkLines.size() == 1);\n\n    REQUIRE(linkLines[0].start().x == Approx((line0Start.x + line0End.x)*0.5).epsilon(EPSILON));\n    REQUIRE(linkLines[0].start().y == Approx((line0Start.y + line0End.y)*0.5).epsilon(EPSILON));\n    REQUIRE(linkLines[0].end().x == Approx((line1Start.x + line1End.x)*0.5).epsilon(EPSILON));\n    REQUIRE(linkLines[0].end().y == Approx((line1Start.y + line1End.y)*0.5).epsilon(EPSILON));\n\n    std::vector<Point2f> unlinkPoints = shapeGraph->getAllUnlinkPoints();\n\n    REQUIRE(unlinkPoints.size() == 1);\n\n    Point2f intersection = intersection_point(Line(line1Start, line1End), Line(line2Start, line2End), TOLERANCE_A);\n\n    REQUIRE(unlinkPoints[0].x == Approx(intersection.x).epsilon(EPSILON));\n    REQUIRE(unlinkPoints[0].y == Approx(intersection.y).epsilon(EPSILON));\n}\n"
  },
  {
    "path": "salaTest/testshapemaps.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"../genlib/p2dpoly.h\"\n#include \"../salalib/mgraph.h\"\n#include \"../salalib/shapemap.h\"\n#include \"../salalib/axialmap.h\"\n#include \"catch.hpp\"\n#include <sstream>\n#include <iostream>\n\nTEST_CASE(\"Testing ShapeMap::getAllShapes variants\")\n{\n    const float EPSILON = 0.001;\n    Point2f line0Start(0,1);\n    Point2f line0End  (3,2);\n    Point2f line1Start(1,1);\n    Point2f line1End  (1,-1);\n\n    std::unique_ptr<ShapeMap> shapeMap(new ShapeMap(\"Test ShapeMap\"));\n\n    shapeMap->makeLineShape(Line(line0Start, line0End));\n    shapeMap->makeLineShape(Line(line1Start, line1End));\n\n    std::vector<Point2f> polyVertices;\n    polyVertices.push_back(Point2f(-1,-1));\n    polyVertices.push_back(Point2f( 2,-1));\n    polyVertices.push_back(Point2f( 0, 0));\n\n    shapeMap->makePolyShape(polyVertices, false, false);\n\n    SECTION(\"ShapeMap::getAllShapesAsLines\")\n    {\n        std::vector<SimpleLine> lines = shapeMap->getAllShapesAsLines();\n\n        REQUIRE(lines.size() == 5);\n\n        REQUIRE(lines[0].start().x == Approx(line0Start.x).epsilon(EPSILON));\n        REQUIRE(lines[0].start().y == Approx(line0Start.y).epsilon(EPSILON));\n        REQUIRE(lines[0].end().x == Approx(line0End.x).epsilon(EPSILON));\n        REQUIRE(lines[0].end().y == Approx(line0End.y).epsilon(EPSILON));\n\n        REQUIRE(lines[1].start().x == Approx(line1Start.x).epsilon(EPSILON));\n        REQUIRE(lines[1].start().y == Approx(line1Start.y).epsilon(EPSILON));\n        REQUIRE(lines[1].end().x == Approx(line1End.x).epsilon(EPSILON));\n        REQUIRE(lines[1].end().y == Approx(line1End.y).epsilon(EPSILON));\n\n        REQUIRE(lines[2].start().x == Approx(polyVertices[0].x).epsilon(EPSILON));\n        REQUIRE(lines[2].start().y == Approx(polyVertices[0].y).epsilon(EPSILON));\n        REQUIRE(lines[2].end().x == Approx(polyVertices[1].x).epsilon(EPSILON));\n        REQUIRE(lines[2].end().y == Approx(polyVertices[1].y).epsilon(EPSILON));\n\n        REQUIRE(lines[3].start().x == Approx(polyVertices[1].x).epsilon(EPSILON));\n        REQUIRE(lines[3].start().y == Approx(polyVertices[1].y).epsilon(EPSILON));\n        REQUIRE(lines[3].end().x == Approx(polyVertices[2].x).epsilon(EPSILON));\n        REQUIRE(lines[3].end().y == Approx(polyVertices[2].y).epsilon(EPSILON));\n\n        REQUIRE(lines[4].start().x == Approx(polyVertices[2].x).epsilon(EPSILON));\n        REQUIRE(lines[4].start().y == Approx(polyVertices[2].y).epsilon(EPSILON));\n        REQUIRE(lines[4].end().x == Approx(polyVertices[0].x).epsilon(EPSILON));\n        REQUIRE(lines[4].end().y == Approx(polyVertices[0].y).epsilon(EPSILON));\n    }\n    SECTION(\"ShapeMap::getAllLinesWithColour\")\n    {\n        shapeMap->overrideDisplayedAttribute(-2);\n        shapeMap->setDisplayedAttribute(-1); // displayed attribute is shape_ref\n\n        std::vector<std::pair<SimpleLine, PafColor>> colouredLines = shapeMap->getAllLinesWithColour();\n\n        REQUIRE(colouredLines.size() == 2);\n\n        REQUIRE(colouredLines[0].first.start().x == Approx(std::min(line0Start.x, line0End.x)).epsilon(EPSILON));\n        REQUIRE(colouredLines[0].first.start().y == Approx(std::min(line0Start.y, line0End.y)).epsilon(EPSILON));\n        REQUIRE(colouredLines[0].first.end().x == Approx(std::max(line0Start.x, line0End.x)).epsilon(EPSILON));\n        REQUIRE(colouredLines[0].first.end().y == Approx(std::max(line0Start.y, line0End.y)).epsilon(EPSILON));\n        REQUIRE(colouredLines[0].second.redf() == Approx(0.2f).epsilon(EPSILON));\n        REQUIRE(colouredLines[0].second.greenf() == Approx(0.2f).epsilon(EPSILON));\n        REQUIRE(colouredLines[0].second.bluef() == Approx(0.86667f).epsilon(EPSILON));\n\n        REQUIRE(colouredLines[1].first.start().x == Approx(line1Start.x).epsilon(EPSILON));\n        REQUIRE(colouredLines[1].first.start().y == Approx(line1Start.y).epsilon(EPSILON));\n        REQUIRE(colouredLines[1].first.end().x == Approx(line1End.x).epsilon(EPSILON));\n        REQUIRE(colouredLines[1].first.end().y == Approx(line1End.y).epsilon(EPSILON));\n        REQUIRE(colouredLines[1].second.redf() == Approx(0.13333f).epsilon(EPSILON));\n        REQUIRE(colouredLines[1].second.greenf() == Approx(0.86667f).epsilon(EPSILON));\n        REQUIRE(colouredLines[1].second.bluef() == Approx(0.53333f).epsilon(EPSILON));\n    }\n    SECTION(\"ShapeMap::getAllPolygonsWithColour\")\n    {\n        shapeMap->overrideDisplayedAttribute(-2);\n        shapeMap->setDisplayedAttribute(-1); // displayed attribute is shape_ref\n\n        std::vector<std::pair<std::vector<Point2f>, PafColor>> colouredPolygons = shapeMap->getAllPolygonsWithColour();\n\n        REQUIRE(colouredPolygons.size() == 1);\n\n        auto iter = colouredPolygons.begin();\n        const std::vector<Point2f> vertices = iter->first;\n        const PafColor colour = iter->second;\n\n        REQUIRE(vertices[0].x == Approx(polyVertices[0].x).epsilon(EPSILON));\n        REQUIRE(vertices[0].y == Approx(polyVertices[0].y).epsilon(EPSILON));\n        REQUIRE(vertices[1].x == Approx(polyVertices[1].x).epsilon(EPSILON));\n        REQUIRE(vertices[1].y == Approx(polyVertices[1].y).epsilon(EPSILON));\n        REQUIRE(vertices[2].x == Approx(polyVertices[2].x).epsilon(EPSILON));\n        REQUIRE(vertices[2].y == Approx(polyVertices[2].y).epsilon(EPSILON));\n        REQUIRE(colour.redf() == Approx(0.86667f).epsilon(EPSILON));\n        REQUIRE(colour.greenf() == Approx(0.2f).epsilon(EPSILON));\n        REQUIRE(colour.bluef() == Approx(0.2f).epsilon(EPSILON));\n    }\n}\n"
  },
  {
    "path": "salaTest/testshaperemove.cpp",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/mapconverter.h\"\n#include \"salalib/mgraph.h\"\n#include <iostream>\n#include <sstream>\n\nTEST_CASE(\"Testing deleting shapes from shapemaps\") {\n    std::unique_ptr<ShapeMap> shapeMap(new ShapeMap(\"Test ShapeMap\"));\n\n    // This is a hash (#) shape for simplicity\n    shapeMap->makeLineShape(Line(Point2f(0.0, 0.5), Point2f(1.5, 0.5)));\n    shapeMap->makeLineShape(Line(Point2f(0.5, 0.0), Point2f(0.5, 1.5)));\n    shapeMap->makeLineShape(Line(Point2f(0.0, 1.0), Point2f(1.5, 1.0)));\n    shapeMap->makeLineShape(Line(Point2f(1.0, 0.0), Point2f(1.0, 1.5)));\n\n    REQUIRE(shapeMap->getAllShapes().size() == 4);\n\n    SECTION(\"Delete from simple shapemap from the beginning\") {\n        int shapeCount = shapeMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            shapeMap->removeShape(shapeMap->getAllShapes().begin()->first, false);\n            REQUIRE(shapeMap->getAllShapes().size() == idx - 1);\n        }\n    }\n\n    SECTION(\"Delete from simple shapemap from the end\") {\n        int shapeCount = shapeMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            shapeMap->removeShape(shapeMap->getAllShapes().rbegin()->first, false);\n            REQUIRE(shapeMap->getAllShapes().size() == idx - 1);\n        }\n    }\n\n    SECTION(\"Delete from simple shapemap from the middle\") {\n        int shapeCount = shapeMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef =\n                depthmapX::getMapAtIndex(shapeMap->getAllShapes(), int(shapeMap->getAllShapes().size() / 2))->first;\n            shapeMap->removeShape(shapeRef, false);\n            REQUIRE(shapeMap->getAllShapes().size() == idx - 1);\n        }\n    }\n}\n\nTEST_CASE(\"Testing deleting shapes from axial maps\") {\n    std::unique_ptr<ShapeMap> shapeMap(new ShapeMap(\"Test ShapeMap\"));\n\n    // This is a hash (#) shape for simplicity\n    shapeMap->makeLineShape(Line(Point2f(0.0, 0.5), Point2f(1.5, 0.5)));\n    shapeMap->makeLineShape(Line(Point2f(0.5, 0.0), Point2f(0.5, 1.5)));\n    shapeMap->makeLineShape(Line(Point2f(0.0, 1.0), Point2f(1.5, 1.0)));\n    shapeMap->makeLineShape(Line(Point2f(1.0, 0.0), Point2f(1.0, 1.5)));\n\n    std::unique_ptr<ShapeGraph> axialMap =\n        MapConverter::convertDataToAxial(nullptr, \"Axial map\", *shapeMap.get(), false);\n\n    REQUIRE(axialMap->getAllShapes().size() == 4);\n    REQUIRE(axialMap->getConnections().size() == 4);\n\n    // creates this axial map:\n    //        1   3\n    //        |   |\n    //    0 - + - + -\n    //        |   |\n    //    2 - + - + -\n    //        |   |\n\n    // map of shaperef -> vector of shaperef (not indices)\n    std::map<int, std::vector<int>> axialConnections;\n    axialConnections[0] = {1, 3};\n    axialConnections[1] = {0, 2};\n    axialConnections[2] = {1, 3};\n    axialConnections[3] = {0, 2};\n\n    int axialConnectivityColIdx = axialMap->getAttributeTable().getColumnIndex(\"Connectivity\");\n    AttributeTable &axialTable = axialMap->getAttributeTable();\n\n    // check if shapes have connectivity attribute values that reflect the expected number of connections\n    for (const auto &shape : axialMap->getAllShapes()) {\n        REQUIRE(axialTable.getRow(AttributeKey(shape.first)).getValue(axialConnectivityColIdx) ==\n                axialConnections[shape.first].size());\n    }\n\n    // check if the shape connectors have the expected internal sizes and are connected to the expected\n    // other shapes\n    for (int i = 0; i < axialMap->getConnections().size(); i++) {\n        Connector connector = axialMap->getConnections()[i];\n        std::vector<int> expectedConnections = axialConnections[axialMap->getShapeRefFromIndex(i)->first];\n        REQUIRE(connector.count(Connector::CONN_ALL) == expectedConnections.size());\n        for (int otherShapeRef : expectedConnections) {\n            REQUIRE(std::find(connector.m_connections.begin(), connector.m_connections.end(), otherShapeRef) !=\n                    connector.m_connections.end());\n        }\n    }\n\n    SECTION(\"Delete from an axial map from the beginning\") {\n        std::map<int, int> connectivitiesAfterRemoval;\n\n        for (auto iter = axialMap->getAllShapes().begin(); iter != axialMap->getAllShapes().end(); iter++) {\n            connectivitiesAfterRemoval[iter->first] = axialConnections[iter->first].size();\n        }\n\n        int shapeCount = axialMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef = axialMap->getAllShapes().begin()->first;\n            axialMap->removeShape(shapeRef, false);\n            REQUIRE(axialMap->getAllShapes().size() == idx - 1);\n            REQUIRE(axialMap->getConnections().size() == idx - 1);\n\n            for (auto it = axialMap->getAllShapes().begin(); it != axialMap->getAllShapes().end(); it++) {\n                std::vector<int> connConnections = axialConnections[it->first];\n                if (std::find(connConnections.begin(), connConnections.end(), shapeRef) != connConnections.end()) {\n                    // if the other shape contains this one, then remove from its connectivity\n                    connectivitiesAfterRemoval[it->first] = connectivitiesAfterRemoval[it->first] - 1;\n                }\n\n                REQUIRE(axialTable.getRow(AttributeKey(it->first)).getValue(axialConnectivityColIdx) ==\n                        connectivitiesAfterRemoval[it->first]);\n            }\n        }\n    }\n\n    SECTION(\"Delete from an axial map from the end\") {\n        std::map<int, int> connectivitiesAfterRemoval;\n\n        for (auto iter = axialMap->getAllShapes().begin(); iter != axialMap->getAllShapes().end(); iter++) {\n            connectivitiesAfterRemoval[iter->first] = axialConnections[iter->first].size();\n        }\n\n        int shapeCount = axialMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef = axialMap->getAllShapes().rbegin()->first;\n            axialMap->removeShape(shapeRef, false);\n            REQUIRE(axialMap->getAllShapes().size() == idx - 1);\n            REQUIRE(axialMap->getConnections().size() == idx - 1);\n\n            for (auto it = axialMap->getAllShapes().begin(); it != axialMap->getAllShapes().end(); it++) {\n                std::vector<int> connConnections = axialConnections[it->first];\n                if (std::find(connConnections.begin(), connConnections.end(), shapeRef) != connConnections.end()) {\n                    // if the other shape contains this one, then remove from its connectivity\n                    connectivitiesAfterRemoval[it->first] = connectivitiesAfterRemoval[it->first] - 1;\n                }\n\n                REQUIRE(axialTable.getRow(AttributeKey(it->first)).getValue(axialConnectivityColIdx) ==\n                        connectivitiesAfterRemoval[it->first]);\n            }\n        }\n    }\n\n    SECTION(\"Delete from an axial map from the middle\") {\n        std::map<int, int> connectivitiesAfterRemoval;\n\n        for (auto iter = axialMap->getAllShapes().begin(); iter != axialMap->getAllShapes().end(); iter++) {\n            connectivitiesAfterRemoval[iter->first] = axialConnections[iter->first].size();\n        }\n\n        int shapeCount = axialMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef =\n                depthmapX::getMapAtIndex(axialMap->getAllShapes(), int(axialMap->getAllShapes().size() / 2))->first;\n            axialMap->removeShape(shapeRef, false);\n            REQUIRE(axialMap->getAllShapes().size() == idx - 1);\n            REQUIRE(axialMap->getConnections().size() == idx - 1);\n\n            for (auto it = axialMap->getAllShapes().begin(); it != axialMap->getAllShapes().end(); it++) {\n                std::vector<int> connConnections = axialConnections[it->first];\n                if (std::find(connConnections.begin(), connConnections.end(), shapeRef) != connConnections.end()) {\n                    // if the other shape contains this one, then remove from its connectivity\n                    connectivitiesAfterRemoval[it->first] = connectivitiesAfterRemoval[it->first] - 1;\n                }\n\n                REQUIRE(axialTable.getRow(AttributeKey(it->first)).getValue(axialConnectivityColIdx) ==\n                        connectivitiesAfterRemoval[it->first]);\n            }\n        }\n    }\n}\n\nTEST_CASE(\"Testing deleting shapes from segment maps\") {\n    std::unique_ptr<ShapeMap> shapeMap(new ShapeMap(\"Test ShapeMap\"));\n\n    // This is a hash (#) shape for simplicity\n    shapeMap->makeLineShape(Line(Point2f(0.0, 0.5), Point2f(1.5, 0.5)));\n    shapeMap->makeLineShape(Line(Point2f(0.5, 1.5), Point2f(0.5, 0.0)));\n    shapeMap->makeLineShape(Line(Point2f(0.0, 1.0), Point2f(1.5, 1.0)));\n    shapeMap->makeLineShape(Line(Point2f(1.0, 0.0), Point2f(1.0, 1.5)));\n\n    std::unique_ptr<ShapeGraph> axialMap =\n        MapConverter::convertDataToAxial(nullptr, \"Axial map\", *shapeMap.get(), false);\n\n    // creates this axial map:\n    //        1   3\n    //        |   |\n    //    0 - + - + -\n    //        |   |\n    //    2 - + - + -\n    //        |   |\n\n    std::unique_ptr<ShapeGraph> segmentMap =\n        MapConverter::convertAxialToSegment(nullptr, *axialMap.get(), \"Segment map\", true);\n\n    // axial lines have been split in three segments\n    //          |       |\n    //          5       11\n    //          |       |\n    //    - 6 - + - 7 - + - 8 -\n    //          |       |\n    //          4       10\n    //          |       |\n    //    - 0 - + - 1 - + - 2 -\n    //          |       |\n    //          3       9\n    //          |       |\n\n    REQUIRE(segmentMap->getAllShapes().size() == 12);\n    REQUIRE(segmentMap->getConnections().size() == 12);\n\n    std::map<int, std::vector<int>> segmentForConnections;\n    std::map<int, std::vector<int>> segmentBackConnections;\n    segmentForConnections[0] = {1, 3, 4};\n    segmentBackConnections[0] = {};\n    segmentForConnections[1] = {2, 9, 10};\n    segmentBackConnections[1] = {0, 3, 4};\n    segmentForConnections[2] = {};\n    segmentBackConnections[2] = {1, 9, 10};\n    segmentForConnections[3] = {0, 1, 4};\n    segmentBackConnections[3] = {};\n    segmentForConnections[4] = {5, 6, 7};\n    segmentBackConnections[4] = {0, 1, 3};\n    segmentForConnections[5] = {};\n    segmentBackConnections[5] = {4, 6, 7};\n    segmentForConnections[6] = {4, 5, 7};\n    segmentBackConnections[6] = {};\n    segmentForConnections[7] = {8, 10, 11};\n    segmentBackConnections[7] = {4, 5, 6};\n    segmentForConnections[8] = {};\n    segmentBackConnections[8] = {7, 10, 11};\n    segmentForConnections[9] = {1, 2, 10};\n    segmentBackConnections[9] = {};\n    segmentForConnections[10] = {7, 8, 11};\n    segmentBackConnections[10] = {1, 2, 9};\n    segmentForConnections[11] = {};\n    segmentBackConnections[11] = {7, 8, 10};\n\n    int segmentConnectivityColIdx = segmentMap->getAttributeTable().getColumnIndex(\"Connectivity\");\n    AttributeTable &segmentTable = segmentMap->getAttributeTable();\n\n    // check if shapes have connectivity attribute values that reflect the expected number of connections\n    for (auto iter = segmentMap->getAllShapes().begin(); iter != segmentMap->getAllShapes().end(); iter++) {\n        REQUIRE(segmentTable.getRow(AttributeKey(iter->first)).getValue(segmentConnectivityColIdx) ==\n                segmentForConnections[iter->first].size() + segmentBackConnections[iter->first].size());\n    }\n\n    // check if the shape connectors have the expected internal sizes and are connected to the expected\n    // other shapes\n    for (int i = 0; i < segmentMap->getConnections().size(); i++) {\n        Connector connector = segmentMap->getConnections()[i];\n        std::vector<int> expectedForConnections = segmentForConnections[segmentMap->getShapeRefFromIndex(i)->first];\n        std::vector<int> expectedBackConnections = segmentBackConnections[segmentMap->getShapeRefFromIndex(i)->first];\n        REQUIRE(connector.count(Connector::SEG_CONN_ALL) ==\n                expectedForConnections.size() + expectedBackConnections.size());\n        REQUIRE(connector.count(Connector::SEG_CONN_FW) == expectedForConnections.size());\n        REQUIRE(connector.count(Connector::SEG_CONN_BK) == expectedBackConnections.size());\n\n        for (int otherShapeRef : expectedForConnections) {\n            bool inForConnections =\n                std::find_if(connector.m_forward_segconns.begin(), connector.m_forward_segconns.end(),\n                             [&otherShapeRef](const std::pair<SegmentRef, int> &segmentRef) {\n                                 return segmentRef.first.ref == otherShapeRef;\n                             }) != connector.m_forward_segconns.end();\n            REQUIRE(inForConnections);\n        }\n        for (int otherShapeRef : expectedBackConnections) {\n            bool inBackConnections = std::find_if(connector.m_back_segconns.begin(), connector.m_back_segconns.end(),\n                                                  [&otherShapeRef](const std::pair<SegmentRef, int> &segmentRef) {\n                                                      return segmentRef.first.ref == otherShapeRef;\n                                                  }) != connector.m_back_segconns.end();\n            REQUIRE(inBackConnections);\n        }\n    }\n\n    SECTION(\"Delete from a segment map from the beginning\") {\n        std::map<int, int> connectivitiesAfterRemoval;\n\n        for (auto iter = segmentMap->getAllShapes().begin(); iter != segmentMap->getAllShapes().end(); iter++) {\n            connectivitiesAfterRemoval[iter->first] =\n                segmentForConnections[iter->first].size() + segmentBackConnections[iter->first].size();\n        }\n\n        int shapeCount = segmentMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef = segmentMap->getAllShapes().begin()->first;\n            segmentMap->removeShape(shapeRef, false);\n            REQUIRE(segmentMap->getAllShapes().size() == idx - 1);\n            REQUIRE(segmentMap->getConnections().size() == idx - 1);\n        }\n    }\n\n    SECTION(\"Delete from a segment map from the end\") {\n        std::map<int, int> connectivitiesAfterRemoval;\n\n        for (auto iter = segmentMap->getAllShapes().begin(); iter != segmentMap->getAllShapes().end(); iter++) {\n            connectivitiesAfterRemoval[iter->first] =\n                segmentForConnections[iter->first].size() + segmentBackConnections[iter->first].size();\n        }\n\n        int shapeCount = segmentMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef = segmentMap->getAllShapes().rbegin()->first;\n            segmentMap->removeShape(shapeRef, false);\n            REQUIRE(segmentMap->getAllShapes().size() == idx - 1);\n            REQUIRE(segmentMap->getConnections().size() == idx - 1);\n        }\n    }\n\n    SECTION(\"Delete from a segment map from the middle\") {\n        std::map<int, int> connectivitiesAfterRemoval;\n\n        for (auto iter = segmentMap->getAllShapes().begin(); iter != segmentMap->getAllShapes().end(); iter++) {\n            connectivitiesAfterRemoval[iter->first] =\n                segmentForConnections[iter->first].size() + segmentBackConnections[iter->first].size();\n        }\n\n        int shapeCount = segmentMap->getAllShapes().size();\n        for (size_t idx = shapeCount; idx > 0; idx--) {\n            int shapeRef =\n                depthmapX::getMapAtIndex(segmentMap->getAllShapes(), int(segmentMap->getAllShapes().size() / 2))\n                    ->first;\n            segmentMap->removeShape(shapeRef, false);\n            REQUIRE(segmentMap->getAllShapes().size() == idx - 1);\n            REQUIRE(segmentMap->getConnections().size() == idx - 1);\n        }\n    }\n}\n"
  },
  {
    "path": "salaTest/testsparksieve.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/sparksieve2.h\"\n#include <map>\n\n\nTEST_CASE(\"One block garbage\")\n{\n    Point2f centre(1,1);\n    sparkSieve2 sieve(centre);\n    std::vector<Line> lines;\n    // these lines get turned into \"blocks\" based by a tanify function based on q and the centre given\n    // above. Given q=4 and centre 1,1 this line will be from 0.625 to something bigger than 1\n    lines.push_back(Line(Point2f(0.5, 0.2), Point2f(0.5, 0.7)));\n    sieve.block(lines,4);\n    sieve.collectgarbage();\n    REQUIRE(sieve.m_gaps.size() == 1);\n    REQUIRE(sieve.m_gaps.begin()->start == 0);\n    REQUIRE(sieve.m_gaps.begin()->end == Approx(0.625));\n}\n\n\nTEST_CASE(\"Shift start and end\")\n{\n    Point2f centre(1,1);\n    sparkSieve2 sieve(centre);\n    std::vector<Line> lines;\n    // .625 -> > 1\n    lines.push_back(Line(Point2f(0.5, 0.2), Point2f(0.5, 0.7)));\n    // < 0 -> 0.55555557\n    lines.push_back(Line(Point2f(0.5,0.1),Point2f(1.1,0.9)));\n    sieve.block(lines,4);\n    sieve.collectgarbage();\n    REQUIRE(sieve.m_gaps.size() == 1);\n    REQUIRE(sieve.m_gaps.begin()->start == Approx(0.55555555555));\n    REQUIRE(sieve.m_gaps.begin()->end == Approx(0.625));\n}\n\nTEST_CASE(\"delete gap\")\n{\n    Point2f centre(1,1);\n    sparkSieve2 sieve(centre);\n    std::vector<Line> lines;\n    // < 0 -> > 1 the block covers the whole gap\n    lines.push_back(Line(Point2f(1.1, 0.2), Point2f(0.5, 0.7)));\n    sieve.block(lines,4);\n    sieve.collectgarbage();\n    REQUIRE(sieve.m_gaps.empty());\n}\n\nTEST_CASE(\"add gap\")\n{\n    Point2f centre(1,1);\n    sparkSieve2 sieve(centre);\n    std::vector<Line> lines;\n    // 0.55555 -> .625 the block splits the gap\n    lines.push_back(Line(Point2f(0.5, 0.2), Point2f(0.5, 0.1)));\n    //  0.71428571 -> > 1\n    lines.push_back(Line(Point2f(0.5,0.3), Point2f(0.5,0.7)));\n    sieve.block(lines,4);\n    sieve.collectgarbage();\n    REQUIRE(sieve.m_gaps.size() == 2);\n    auto iter = sieve.m_gaps.begin();\n    REQUIRE(iter->start == 0);\n    REQUIRE(iter->end == Approx(0.55555555555));\n    iter++;\n    REQUIRE(iter->start == Approx(0.625));\n    REQUIRE(iter->end == Approx( 0.71428571));\n}\n"
  },
  {
    "path": "salaTest/teststructsizes.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"catch.hpp\"\n#include \"salalib/axialmap.h\"\n#include \"salalib/axialpolygons.h\"\n\n/**\n * This seems a bit silly, but this is a list of structs that are serialised by just dumping the memory content\n * into a stream, so the size/layout of these must be the same across all platforms to ensure\n * reading writing of graph files.\n */\nTEST_CASE(\"Enforce struct sizes\")\n{\n    REQUIRE(sizeof(RadialKey) == 16);\n    REQUIRE(sizeof(RadialLine) == 64);\n    REQUIRE(sizeof(PolyConnector) == 56);\n    REQUIRE(sizeof(QtRegion) == 32);\n    REQUIRE(sizeof(Line) == 40);\n}\n"
  },
  {
    "path": "salalib/CMakeLists.txt",
    "content": "set(salalib salalib)\n\nset(salalib_SRCS\n    axialmap.cpp\n    connector.cpp\n    isovist.cpp\n    mgraph.cpp\n    ngraph.cpp\n    pointdata.cpp\n    salaprogram.cpp\n    shapemap.cpp\n    spacepix.cpp\n    sparksieve2.cpp\n    entityparsing.cpp\n    linkutils.cpp\n    gridproperties.cpp\n    attributetable.cpp\n    layermanagerimpl.cpp\n    attributetableview.cpp\n    geometrygenerators.cpp\n    point.cpp\n    pafcolor.cpp\n    spacepixfile.cpp\n    alllinemap.cpp\n    axialminimiser.cpp\n    axialpolygons.cpp\n    tidylines.cpp\n    mapconverter.cpp\n    importutils.cpp\n    attributetableindex.cpp\n    ianalysis.h)\n\nadd_compile_definitions(_DEPTHMAP SALALIB_LIBRARY)\n\nadd_library(${salalib} STATIC ${salalib_SRCS} ${vgamodules_SRCS} ${axialmodules_SRCS} ${segmmodules_SRCS} ${parsers_SRCS})\n\nadd_subdirectory(vgamodules)\nadd_subdirectory(axialmodules)\nadd_subdirectory(segmmodules)\nadd_subdirectory(parsers)\nadd_subdirectory(agents)\n\n\n\n"
  },
  {
    "path": "salalib/agents/CMakeLists.txt",
    "content": "target_sources(salalib\n    PUBLIC\n    \tagent.h \n    \tagentprogram.h \n    \tagentset.h \n    \tagentengine.h \n    \tagentga.h \n    \tagenthelpers.h\n    PRIVATE\n    \tagent.cpp \n    \tagentprogram.cpp \n    \tagentset.cpp \n    \tagentengine.cpp \n    \tagentga.cpp)\n\n"
  },
  {
    "path": "salalib/agents/agent.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"agent.h\"\n#include \"agenthelpers.h\"\n\nAgent::Agent(AgentProgram *program, PointMap *pointmap, int output_mode) {\n    m_program = program;\n    m_pointmap = pointmap;\n    m_output_mode = output_mode;\n    m_trail_num = -1;\n}\n\nvoid Agent::onInit(PixelRef node, int trail_num) {\n    m_node = node;\n    m_loc = m_pointmap->depixelate(m_node);\n    if (m_output_mode & OUTPUT_GATE_COUNTS) {\n        // see note about gates in Through vision analysis\n        m_gate = (m_pointmap->getPoint(node).filled())\n                     ? (int)m_pointmap->getAttributeTable().getRow(AttributeKey(m_node)).getValue(g_col_gate)\n                     : -1;\n    } else {\n        m_gate = -1;\n    }\n    m_gate_encountered = false;\n    m_step = 0;\n    m_stuck = false;\n    m_stopped = false;\n    m_frame = 0;\n    m_target_lock = false;\n    m_vector = Point2f(1, 0);\n\n    m_at_target = false;\n    m_at_destination = false;\n\n    m_trail_num = trail_num;\n\n    m_vector = onLook(true);\n\n    m_vector.normalise();\n\n    m_target_pix = NoPixel;\n}\n\nvoid Agent::onMove() {\n    m_at_target = false;\n    m_frame++;\n    if (m_program->m_destination_directed && dist(m_loc, m_destination) < 10.0) {\n        // reached final destination\n        onDestination();\n    } else if ((m_program->m_sel_type & AgentProgram::SEL_TARGETTED) &&\n               dist(m_loc, m_target) < m_pointmap->getSpacing()) {\n        // reached target (intermediate destination)\n        m_step = 0;\n        onTarget();\n        m_vector = onLook(false);\n    } else if (prandomr() < (1.0 / m_program->m_steps) && !m_target_lock) { // note, on average, will change 1 in steps\n        m_step = 0;\n        m_vector = onLook(false);\n        /*\n        if (m_program->m_destination_directed) {\n           Point2f vec2 = m_destination - m_loc;\n           vec2.normalise();\n           if (dot(vec2,m_vector) < 0.0) {\n              m_vector = onLook(false);\n           }\n        }\n        */\n    }\n    if (m_stuck) {\n        // oops...\n        return;\n    }\n    // now step...\n    PixelRef lastnode = m_node;\n    onStep();\n    if (m_node != lastnode && m_output_mode != OUTPUT_NOTHING) {\n        if (m_pointmap->getPoint(m_node).filled()) {\n            AttributeRow &row = m_pointmap->getAttributeTable().getRow(AttributeKey(m_node));\n            if (m_output_mode & OUTPUT_COUNTS) {\n                row.incrValue(g_col_total_counts);\n            }\n            if (m_output_mode & OUTPUT_GATE_COUNTS) {\n                int obj = (int)row.getValue(g_col_gate);\n                if (m_gate != obj) {\n                    m_gate = obj;\n                    if (m_gate != -1) {\n                        row.incrValue(g_col_gate_counts);\n                        // actually crossed into a new gate:\n                        m_gate_encountered = true;\n                    }\n                }\n            }\n        }\n    }\n    // done. happy hamster.\n}\nvoid Agent::onDestination() { m_at_destination = true; }\nvoid Agent::onTarget() {\n    m_occ_memory.a().clear();\n    m_at_target = true;\n}\n\n////////////////////////////////////////////////////////////////////\n\nvoid Agent::onStep() {\n    m_stopped = false;\n    m_step++;\n    //\n    Point2f nextloc = m_loc + (m_pointmap->getSpacing() * m_vector);\n    // note: false returns unconstrained pixel: goodStep must check it is in bounds using m_pointmap->includes\n    PixelRef nextnode = m_pointmap->pixelate(nextloc, false);\n    if (nextnode != m_node) {\n        // quick check location is okay...\n        if (goodStep(nextnode)) {\n            m_node = nextnode;\n            m_loc = nextloc;\n        } else {\n            // try other nearby nodes...\n            if (!diagonalStep()) {\n                m_stopped = true;\n            }\n        }\n    } else {\n        m_loc = nextloc;\n    }\n    if (!m_stopped && m_trail_num != -1) {\n        m_program->m_trails[m_trail_num].push_back(Event2f(m_loc, m_program->m_steps));\n    }\n}\nbool Agent::diagonalStep() {\n    Point2f vector1 = m_vector;\n    vector1.rotate(M_PI / 4.0);\n    Point2f nextloc1 = m_loc + (m_pointmap->getSpacing() * vector1);\n    // note: \"false\" does not constrain to bounds: must be checked using m_pointmap->includes before getPoint is used\n    PixelRef nextnode1 = m_pointmap->pixelate(nextloc1, false);\n\n    Point2f vector2 = m_vector;\n    vector2.rotate(-M_PI / 4.0);\n    Point2f nextloc2 = m_loc + (m_pointmap->getSpacing() * vector2);\n    // note: \"false\" does not constrain to bounds: must be checked using m_pointmap->includes before getPoint is used\n    int nextnode2 = m_pointmap->pixelate(nextloc2, false);\n\n    bool good = false;\n    if (pafrand() % 2 == 0) {\n        if (goodStep(nextnode1)) {\n            m_node = nextnode1;\n            m_loc = nextloc1;\n            good = true;\n        } else if (goodStep(nextnode2)) {\n            m_node = nextnode2;\n            m_loc = nextloc2;\n            good = true;\n        }\n    } else {\n        if (goodStep(nextnode2)) {\n            m_node = nextnode2;\n            m_loc = nextloc2;\n            good = true;\n        } else if (goodStep(nextnode1)) {\n            m_node = nextnode1;\n            m_loc = nextloc1;\n            good = true;\n        }\n    }\n    return good;\n}\nbool Agent::goodStep(PixelRef node) {\n    if (!m_pointmap->includes(node)) {\n        return false;\n    }\n    // n.b., you have to know how the nodes are labelled for this connectValue trick\n    PixelRef dir;\n    dir.x = node.x - m_node.x;\n    dir.y = node.y - m_node.y;\n    // now translate dir to correct CONNECT value\n    if (m_pointmap->getPoint(m_node).getGridConnections() & connectValue(dir)) {\n        return true;\n    }\n\n    return false;\n}\n\n//////////////////////////////////////////////////////////////////////\n\n// The various look algorithms\n\nPoint2f Agent::onLook(bool wholeisovist) {\n    Point2f dir;\n    if (m_program->m_sel_type & AgentProgram::SEL_GIBSONIAN) {\n        dir = onGibsonianLook(wholeisovist);\n    } else if ((m_program->m_sel_type & AgentProgram::SEL_OCCLUSION) == AgentProgram::SEL_OCCLUSION) {\n        dir = onOcclusionLook(wholeisovist, m_program->m_sel_type);\n    } else {\n        switch (m_program->m_sel_type) {\n        case AgentProgram::SEL_STANDARD:\n            dir = onStandardLook(wholeisovist);\n            break;\n        case AgentProgram::SEL_LOS:\n        case AgentProgram::SEL_LOS_OCC:\n            if (m_program->m_destination_directed) {\n                dir = onDirectedLoSLook(wholeisovist, m_program->m_sel_type);\n            } else {\n                dir = onLoSLook(wholeisovist, m_program->m_sel_type);\n            }\n            break;\n        case AgentProgram::SEL_OPTIC_FLOW2:\n            dir = onGibsonianLook2(wholeisovist);\n            break;\n        }\n    }\n    if ((m_program->m_sel_type & AgentProgram::SEL_GIBSONIAN) && !m_stuck) {\n        // remember what the view looked like here, facing our new direction:\n        calcLoS(binfromvec(dir), false);\n    }\n    if ((m_program->m_sel_type & AgentProgram::SEL_GIBSONIAN2) && !m_stuck) {\n        calcLoS2(binfromvec(dir), false);\n    }\n\n    return dir;\n}\n\nPoint2f Agent::onStandardLook(bool wholeisovist) {\n    int tarpixelate = -1;\n    int vbin = m_program->m_vbin;\n    if (wholeisovist || vbin == -1) {\n        vbin = 16;\n    }\n    int directionbin = 32 + binfromvec(m_vector) - vbin;\n    int choices = 0;\n    // reset for getting list, check in range:\n    vbin = vbin * 2 + 1;\n    if (vbin > 32) {\n        vbin = 32;\n    }\n    for (int i = 0; i < vbin; i++) {\n        choices += m_pointmap->getPoint(m_node).getNode().bincount((directionbin + i) % 32);\n    }\n    if (choices == 0) {\n        if (!wholeisovist) {\n            return onStandardLook(true);\n        } else {\n            m_stuck = true;\n            m_target = m_loc;\n            m_target_pix = m_node;\n            return Point2f(0, 0);\n        }\n    } else {\n        int chosen = pafrand() % choices;\n        Node &node = m_pointmap->getPoint(m_node).getNode();\n        for (; chosen >= node.bincount(directionbin % 32); directionbin++) {\n            chosen -= node.bincount(directionbin % 32);\n        }\n        Bin &bin = node.bin(directionbin % 32);\n        bin.first();\n        tarpixelate = bin.cursor();\n        for (; chosen > 0; chosen--) {\n            bin.next();\n            tarpixelate = bin.cursor();\n        }\n    }\n\n    m_target_pix = tarpixelate;\n    m_target = m_pointmap->depixelate(tarpixelate);\n\n    return (m_target - m_loc).normalise();\n}\n\n// TODO: Expose this functionality to the UIs\nPoint2f Agent::onWeightedLook(bool wholeisovist) {\n    if (wholeisovist) {\n        // use standard targetted look instead:\n        return onStandardLook(true);\n    }\n    int tarpixelate = -1;\n    int vbin = m_program->m_vbin;\n    if (vbin == -1) {\n        vbin = 16;\n    }\n    int aheadbin = binfromvec(m_vector);\n    int directionbin = 32 + binfromvec(m_vector) - vbin;\n    std::vector<wpair> weightmap;\n    double weight = 0.0;\n    // reset for getting list, check in range:\n    vbin = vbin * 2 + 1;\n    if (vbin > 32) {\n        vbin = 32;\n    }\n    for (int i = 0; i < vbin; i++) {\n        Bin &bin = m_pointmap->getPoint(m_node).getNode().bin((directionbin + i) % 32);\n        bin.first();\n\n        // Quick mod - TV\n#if defined(_MSC_VER)\n        int node = bin.is_tail() ? -1 : bin.cursor();\n#else\n        int node = bin.is_tail() ? -1 : bin.cursor().x;\n#endif\n        while (node != -1) {\n            weight += ((directionbin + i) % 32 == aheadbin) ? 5.0 : 1.0;\n            weightmap.push_back(wpair(weight, node));\n            bin.next();\n            // Quick mod - TV\n#if defined(_MSC_VER)\n            node = bin.is_tail() ? -1 : bin.cursor();\n#else\n            node = bin.is_tail() ? -1 : bin.cursor().x;\n#endif\n        }\n    }\n    if (weightmap.size() == 0) {\n        return onWeightedLook(true);\n    } else {\n        double chosen = prandomr() * weight;\n        for (size_t i = 0; i < weightmap.size(); i++) {\n            if (chosen < weightmap[i].weight) {\n                tarpixelate = weightmap[i].node;\n                break;\n            }\n        }\n    }\n\n    m_target_pix = tarpixelate;\n    m_target = m_pointmap->depixelate(tarpixelate);\n\n    return (m_target - m_loc).normalise();\n}\n\nPoint2f Agent::onOcclusionLook(bool wholeisovist, int looktype) {\n    if (AgentProgram::SEL_OCC_MEMORY) {\n        m_occ_memory.flip();\n        m_occ_memory.a().clear();\n    }\n\n    if (wholeisovist) {\n        // use standard targetted look instead:\n        return onStandardLook(true);\n    }\n    PixelRef tarpixelate = NoPixel;\n    int vbin = m_program->m_vbin;\n    if (vbin == -1) {\n        vbin = 16;\n    }\n    int directionbin = 32 + binfromvec(m_vector) - vbin;\n    // reset for getting list, check in range:\n    vbin = vbin * 2 + 1;\n    if (vbin > 32) {\n        vbin = 32;\n    }\n    if (looktype == AgentProgram::SEL_OCC_ALL) {\n        int choices = 0;\n        Node &node = m_pointmap->getPoint(m_node).getNode();\n        for (int i = 0; i < vbin; i++) {\n            if (node.m_occlusion_bins[(directionbin + i) % 32].size()) {\n                choices += node.m_occlusion_bins[(directionbin + i) % 32].size();\n            }\n        }\n        if (choices == 0) {\n            if (!wholeisovist) {\n                return onStandardLook(false);\n            } else {\n                m_stuck = true;\n                m_target_pix = m_node;\n                m_target = m_loc;\n                return Point2f(0, 0);\n            }\n        } else {\n            size_t chosen = pafrand() % choices;\n            for (; chosen >= node.m_occlusion_bins[directionbin % 32].size(); directionbin++) {\n                chosen -= node.m_occlusion_bins[directionbin % 32].size();\n            }\n            tarpixelate = node.m_occlusion_bins[directionbin % 32].at(chosen);\n        }\n    } else {\n        int subset = 1;\n        if (looktype == AgentProgram::SEL_OCC_BIN45) {\n            subset = 3;\n        } else if (looktype == AgentProgram::SEL_OCC_BIN60) {\n            subset = 5;\n        }\n        std::vector<wpair> weightmap;\n        double weight = 0.0;\n        Node &node = m_pointmap->getPoint(m_node).getNode();\n        for (int i = 0; i < vbin; i += subset) {\n            PixelRef nigpix;\n            double fardist = -1.0;\n            for (int k = 0; k < subset; k++) {\n                for (size_t j = 0; j < node.m_occlusion_bins[(directionbin + i + k) % 32].size(); j++) {\n                    PixelRef pix = node.m_occlusion_bins[(directionbin + i + k) % 32].at(j);\n                    if (dist(pix, m_node) > fardist) {\n                        fardist = dist(pix, m_node);\n                        nigpix = pix;\n                    }\n                }\n            }\n            if (fardist != -1.0) {\n                bool cont = true;\n                if (looktype == AgentProgram::SEL_OCC_MEMORY) {\n                    depthmapX::addIfNotExists(m_occ_memory.a(), nigpix);\n                    // the turn chance (pafrand() % 2) may have to be modified later...\n                    if (!m_at_target && std::find(m_occ_memory.b().begin(), m_occ_memory.b().end(), nigpix) !=\n                                            m_occ_memory.b().end()) {\n                        cont = false;\n                    }\n                }\n                if (cont) {\n                    switch (looktype) {\n                    case AgentProgram::SEL_OCC_WEIGHT_DIST:\n                        weight += fardist;\n                        break;\n                    case AgentProgram::SEL_OCC_WEIGHT_ANG:\n                        weight += (double(vbin - abs(i - vbin)));\n                        break;\n                    case AgentProgram::SEL_OCC_WEIGHT_DIST_ANG:\n                        weight += fardist * (double(vbin - abs(i - vbin)));\n                        break;\n                    default:\n                        weight += 1.0;\n                        break;\n                    }\n                    weightmap.push_back(wpair(weight, nigpix));\n                }\n            }\n        }\n        if (weightmap.size() == 0) {\n            if (!wholeisovist) {\n                return onStandardLook(false);\n            } else {\n                m_stuck = true;\n                m_target = m_loc;\n                return Point2f(0, 0);\n            }\n        } else {\n            double chosen = prandomr() * weight;\n            for (size_t i = 0; i < weightmap.size(); i++) {\n                if (chosen < weightmap[i].weight) {\n                    tarpixelate = weightmap[i].node;\n                    break;\n                }\n            }\n        }\n    }\n\n    m_target_pix = tarpixelate;\n    m_target = m_pointmap->depixelate(tarpixelate);\n\n    return (m_target - m_loc).normalise();\n}\n\n// note: LOS look uses similar weighted choice mechanism\n\nPoint2f Agent::onLoSLook(bool wholeisovist, int look_type) {\n    int bbin = -1;\n    if (m_program->m_destination_directed) {\n        Point2f vec2 = m_destination - m_loc;\n        vec2.normalise();\n        bbin = binfromvec(vec2);\n    }\n    int targetbin = -1;\n    int vbin = m_program->m_vbin;\n    if (wholeisovist || vbin == -1) {\n        vbin = 16;\n    }\n    int directionbin = 32 + binfromvec(m_vector) - vbin;\n    std::vector<wpair> weightmap;\n    double weight = 0.0;\n    // reset for getting list, check in range:\n    vbin = vbin * 2 + 1;\n    if (vbin > 32) {\n        vbin = 32;\n    }\n    for (int i = 0; i < vbin; i++) {\n        double los = (look_type == AgentProgram::SEL_LOS)\n                         ? m_pointmap->getPoint(m_node).getNode().bindistance((directionbin + i) % 32)\n                         : m_pointmap->getPoint(m_node).getNode().occdistance((directionbin + i) % 32);\n        if (m_program->m_los_sqrd) {\n            los *= los;\n        }\n        if (m_program->m_destination_directed) {\n            los *= 1.0 - double(binsbetween(((directionbin + i) % 32), bbin)) / 16.0;\n        }\n        weight += los;\n        weightmap.push_back(wpair(weight, (directionbin + i) % 32));\n    }\n    if (weight == 0.0) {\n        if (!wholeisovist) {\n            return onLoSLook(true, look_type);\n        } else {\n            // oops!\n            m_stuck = true;\n            return Point2f(0, 0);\n        }\n    } else {\n        double chosen = prandomr() * weight;\n        for (size_t i = 0; i < weightmap.size(); i++) {\n            if (chosen < weightmap[i].weight) {\n                targetbin = weightmap[i].node;\n                break;\n            }\n        }\n    }\n\n    float angle = (float)anglefrombin2(targetbin);\n\n    return Point2f(cosf(angle), sinf(angle));\n}\n\nPoint2f Agent::onDirectedLoSLook(bool wholeisovist, int look_type) {\n    Point2f vec2 = m_destination - m_loc;\n    vec2.normalise();\n    int targetbin = -1;\n    int vbin = m_program->m_vbin;\n    if (wholeisovist || vbin == -1) {\n        vbin = 16;\n    }\n    int directionbin = 32 + binfromvec(vec2) - vbin;\n    std::vector<wpair> weightmap;\n    double weight = 0.0;\n    // reset for getting list, check in range:\n    vbin = vbin * 2 + 1;\n    if (vbin > 32) {\n        vbin = 32;\n    }\n    for (int i = 0; i < vbin; i++) {\n        double los = (look_type == AgentProgram::SEL_LOS)\n                         ? m_pointmap->getPoint(m_node).getNode().bindistance((directionbin + i) % 32)\n                         : m_pointmap->getPoint(m_node).getNode().occdistance((directionbin + i) % 32);\n        if (m_program->m_los_sqrd) {\n            los *= los;\n        }\n        weight += los;\n        weightmap.push_back(wpair(weight, (directionbin + i) % 32));\n    }\n    if (weight == 0.0) {\n        if (!wholeisovist) {\n            return onLoSLook(true, look_type);\n        } else {\n            // oops!\n            m_stuck = true;\n            return Point2f(0, 0);\n        }\n    } else {\n        double chosen = prandomr() * weight;\n        for (size_t i = 0; i < weightmap.size(); i++) {\n            if (chosen < weightmap[i].weight) {\n                targetbin = weightmap[i].node;\n                break;\n            }\n        }\n    }\n\n    float angle = (float)anglefrombin2(targetbin);\n\n    return Point2f(cosf(angle), sinf(angle));\n}\n\n// Gibsonian agents record their last known information,\n// and act according to their rules:\n\nPoint2f Agent::onGibsonianLook(bool wholeisovist) {\n    // at start, go in any direction:\n    if (wholeisovist) {\n        return onLoSLook(true, AgentProgram::SEL_LOS);\n    }\n    //\n    calcLoS(binfromvec(m_vector), true);\n    // now, choose action according to type of agent:\n    int rule_choice = -1;\n    int dir = 0;\n    for (int k = 0; k < 4; k++) {\n        dir = onGibsonianRule(m_program->m_rule_order[k]);\n        if (dir != 0) {\n            rule_choice = m_program->m_rule_order[k];\n            break;\n        }\n    }\n\n    float angle = 0.0;\n\n    if (rule_choice != -1) {\n        angle = (float)anglefrombin2((binfromvec(m_vector) + (2 * rule_choice + 1) * dir + 32) % 32);\n    }\n\n    // if no rule selection made, carry on in current direction\n    return (rule_choice == -1) ? m_vector : Point2f(cosf(angle), sinf(angle));\n}\n\nint Agent::onGibsonianRule(int rule) {\n    int option = 0;\n    switch (m_program->m_sel_type) {\n    case AgentProgram::SEL_LENGTH:\n        // rule_threshold from 0 to 100m\n        if (m_curr_los[rule + 1] > m_program->m_rule_threshold[rule]) {\n            option = 0x01;\n        }\n        if (m_curr_los[rule + 5] > m_program->m_rule_threshold[rule]) {\n            option |= 0x10;\n        }\n        break;\n    case AgentProgram::SEL_OPTIC_FLOW:\n        // rule_threshold reflects from 0x (0) to 5x (100.0)\n        if ((m_curr_los[rule + 1] + 1) / (m_last_los[rule + 1] + 1) > m_program->m_rule_threshold[rule] / 20.0) {\n            option = 0x01;\n        }\n        if ((m_curr_los[rule + 5] + 1) / (m_last_los[rule + 5] + 1) > m_program->m_rule_threshold[rule] / 20.0) {\n            option |= 0x10;\n        }\n        break;\n    case AgentProgram::SEL_COMPARATIVE_LENGTH:\n        // rule_threshold reflects from 0x (0) to 10x (100.0)\n        if ((m_curr_los[rule + 1] + 1) / (m_curr_los[0] + 1) > m_program->m_rule_threshold[rule] / 10.0) {\n            option = 0x01;\n        }\n        if ((m_curr_los[rule + 5] + 1) / (m_curr_los[0] + 1) > m_program->m_rule_threshold[rule] / 10.0) {\n            option |= 0x10;\n        }\n        break;\n    case AgentProgram::SEL_COMPARATIVE_OPTIC_FLOW:\n        // rule_threshold reflects from 0x (0) to 10x (100.0)\n        if ((m_curr_los[rule + 1] * m_last_los[0] + 1) / (m_last_los[rule + 1] * m_curr_los[0] + 1) >\n            m_program->m_rule_threshold[rule] / 10.0) {\n            option = 0x01;\n        }\n        if ((m_curr_los[rule + 5] * m_last_los[0] + 1) / (m_last_los[rule + 5] * m_curr_los[0] + 1) >\n            m_program->m_rule_threshold[rule] / 10.0) {\n            option |= 0x10;\n        }\n        break;\n    }\n    int dir = 0;\n    if (option == 0x01 && m_program->m_rule_probability[0] > prandomr()) {\n        dir = -1;\n    } else if (option == 0x10 && m_program->m_rule_probability[0] > prandomr()) {\n        dir = +1;\n    } else if (option == 0x11 && m_program->m_rule_probability[0] > prandomr() * prandomr()) {\n        // note, use random * random event as there are two ways to do this\n        dir = (rand() % 2) ? -1 : +1;\n    }\n    return dir;\n}\n\nPoint2f Agent::onGibsonianLook2(bool wholeisovist) {\n    // at start, go in any direction:\n    if (wholeisovist) {\n        return onLoSLook(true, AgentProgram::SEL_LOS);\n    }\n    //\n    calcLoS2(binfromvec(m_vector), true);\n    int maxbin = 0;\n    /*\n    // first action: adjust to longest line of sight\n    if (m_curr_los[3] > m_curr_los[0]) {\n       maxbin = -m_program->m_vahead;\n       if (m_curr_los[4] > m_curr_los[0] && (pafrand() % 2)) {\n          maxbin = m_program->m_vahead;\n       }\n    }\n    else if (m_curr_los[4] > m_curr_los[0]) {\n       maxbin = m_program->m_vahead;\n    }\n    */\n    // second action, apply feeler rule:\n    char dir = 0x00;\n    if ((m_curr_los[1] - m_last_los[1]) / m_curr_los[1] > m_program->m_feeler_threshold) {\n        dir |= 0x01;\n    }\n    if ((m_curr_los[2] - m_last_los[2]) / m_curr_los[2] > m_program->m_feeler_threshold) {\n        dir |= 0x10;\n    }\n    if (dir == 0x01 && m_program->m_feeler_probability > prandomr()) {\n        maxbin = -m_program->m_vbin;\n    } else if (dir == 0x10 && m_program->m_feeler_probability > prandomr()) {\n        maxbin = m_program->m_vbin;\n    } else if (dir == 0x11 && m_program->m_feeler_probability > prandomr() * prandomr()) {\n        maxbin = (pafrand() % 2) ? m_program->m_vbin : -m_program->m_vbin;\n    }\n    // third action: detect heading for dead-end\n    if (maxbin == 0 && (m_curr_los[0] / m_pointmap->getSpacing() < m_program->m_ahead_threshold)) {\n        if (m_curr_los[1] >= m_curr_los[2]) {\n            maxbin = -m_program->m_vbin;\n        } else {\n            maxbin = m_program->m_vbin;\n        }\n    }\n\n    int bin = binfromvec(m_vector) + maxbin;\n    float angle = (float)anglefrombin2(bin);\n\n    return (maxbin == 0) ? m_vector : Point2f(cosf(angle), sinf(angle));\n}\n\nvoid Agent::calcLoS(int directionbin, bool curr) {\n    float *los;\n    if (curr) {\n        los = m_curr_los;\n    } else {\n        los = m_last_los;\n    }\n    Node &node = m_pointmap->getPoint(m_node).getNode();\n    // ahead\n    los[0] = node.bindistance(directionbin % 32);\n    // directions:\n    int count = 1;\n    for (int i = 1; i <= 7; i += 2) {\n        los[count] = node.bindistance((directionbin - i + 32) % 32);\n        count++;\n    }\n    for (int j = 1; j <= 7; j += 2) {\n        los[count] = node.bindistance((directionbin + j) % 32);\n        count++;\n    }\n}\n\nvoid Agent::calcLoS2(int directionbin, bool curr) {\n    float *los;\n    if (curr) {\n        los = m_curr_los;\n    } else {\n        los = m_last_los;\n    }\n    Node &node = m_pointmap->getPoint(m_node).getNode();\n    // ahead\n    los[0] = node.bindistance(directionbin % 32);\n    // directions:\n    los[1] = node.bindistance((directionbin - m_program->m_vbin + 32) % 32);\n    los[2] = node.bindistance((directionbin + m_program->m_vbin) % 32);\n    //\n    los[3] = node.bindistance((directionbin - m_program->m_vahead + 32) % 32);\n    los[4] = node.bindistance((directionbin + m_program->m_vahead) % 32);\n}\n"
  },
  {
    "path": "salalib/agents/agent.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"agentprogram.h\"\n\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\n#include \"genlib/p2dpoly.h\"\n#include \"genlib/pflipper.h\"\n\nclass Agent {\n  public:\n    enum { OUTPUT_NOTHING = 0x00, OUTPUT_COUNTS = 0x01, OUTPUT_GATE_COUNTS = 0x02, OUTPUT_TRAILS = 0x04 };\n\n  protected:\n    AgentProgram *m_program;\n    PointMap *m_pointmap;\n    //\n    PixelRef m_node;\n    int m_step;\n    int m_frame;\n    int m_gate;\n    bool m_stuck;\n    bool m_stopped;\n    bool m_target_lock;\n    bool m_gate_encountered;\n    bool m_at_target;\n    bool m_at_destination;\n    int m_output_mode;\n    Point2f m_loc;\n    Point2f m_target;\n    Point2f m_vector;\n    PixelRef m_target_pix;\n    // a long term goal:\n    Point2f m_destination;\n    //\n    // for recording trails:\n    int m_trail_num;\n    //\n    // for occlusion memory\n    pflipper<PixelRefVector> m_occ_memory;\n    //\n    // extra memory of last observed values for Gibsonian agents:\n    float m_last_los[9];\n    float m_curr_los[9];\n\n  public:\n    Agent() {\n        m_program = NULL;\n        m_pointmap = NULL;\n        m_output_mode = OUTPUT_NOTHING;\n    }\n    Agent(AgentProgram *program, PointMap *pointmap, int output_mode = OUTPUT_NOTHING);\n    void onInit(PixelRef node, int trail_num = -1);\n    void onClose();\n    Point2f onLook(bool wholeisovist);\n    Point2f onStandardLook(bool wholeisovist);\n    Point2f onWeightedLook(bool wholeisovist);\n    Point2f onOcclusionLook(bool wholeisovist, int looktype);\n    Point2f onLoSLook(bool wholeisovist, int look_type);\n    Point2f onDirectedLoSLook(bool wholeisovist, int look_type);\n    Point2f onGibsonianLook(bool wholeisovist);\n    Point2f onGibsonianLook2(bool wholeisovist);\n    int onGibsonianRule(int rule);\n    void calcLoS(int directionbin, bool curr);\n    void calcLoS2(int directionbin, bool curr);\n    void onMove();\n    void onTarget();\n    void onDestination();\n    void onStep();\n    bool diagonalStep();\n    bool goodStep(PixelRef node);\n    bool gateEncountered() { return m_gate_encountered; }\n    const Point2f &getLoc() const { return m_loc; }\n    //\n    bool atTarget() const { return m_at_target; }\n    bool atDestination() const { return m_at_destination; }\n    //\n    const Point2f &getLocation() const { return m_loc; }\n    const Point2f &getVector() const { return m_vector; }\n    const PixelRef getNode() const { return m_node; }\n    int getFrame() const { return m_frame; }\n    const PointMap &getPointMap() const { return *m_pointmap; }\n};\n\n// note the add 0.5 means angles from e.g., -1/32 to 1/32 are in bin 0\ninline int binfromvec(const Point2f &p) { return int(32.0 * (0.5 * p.angle() / M_PI) + 0.5); }\n\n// a random angle based on a bin direction\ninline double anglefrombin2(int here) { return (2.0 * M_PI) * ((double(here) - 0.5) / 32.0 + prandom() / 32.0); }\n\ninline int binsbetween(int bin1, int bin2) {\n    int b = abs(bin1 - bin2);\n    if (b > 16) {\n        b = 32 - b;\n    }\n    return b;\n}\n\n// weighting\nstruct wpair {\n    double weight;\n    int node;\n    wpair(double w = 0.0, int n = -1) {\n        weight = w;\n        node = n;\n    }\n};\n\n// convert an x / y difference to it's corresponding connection direction\ninline char connectValue(PixelRef dir) {\n    if (dir.y > 0) {\n        return (Point::CONNECT_NE << (1 - dir.x));\n    } else if (dir.y < 0) {\n        return (Point::CONNECT_SW << (dir.x + 1));\n    } else if (dir.x == 1) {\n        return (char)Point::CONNECT_E;\n    } else {\n        return (char)Point::CONNECT_W;\n    }\n}\n"
  },
  {
    "path": "salalib/agents/agentengine.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"agentengine.h\"\n#include \"agenthelpers.h\"\n\n// run one agent engine only\n\nAgentEngine::AgentEngine() {\n    m_timesteps = 5000;\n    m_gatelayer = -1;\n    m_record_trails = false;\n}\n\nvoid AgentEngine::run(Communicator *comm, PointMap *pointmap) {\n    for (auto &agentSet : agentSets) {\n        if (agentSet.m_sel_type == AgentProgram::SEL_LOS_OCC) {\n            pointmap->requireIsovistAnalysis();\n        }\n    }\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, m_timesteps);\n    }\n\n    AttributeTable &table = pointmap->getAttributeTable();\n    int displaycol = table.getOrInsertColumn(g_col_total_counts);\n\n    int output_mode = Agent::OUTPUT_COUNTS;\n    if (m_gatelayer != -1) {\n        output_mode |= Agent::OUTPUT_GATE_COUNTS;\n    }\n\n    int trail_num = -1;\n    if (m_record_trails) {\n        if (m_trail_count < 1) {\n            m_trail_count = 1;\n        }\n        for (auto& agentSet: agentSets) {\n            agentSet.m_trails = std::vector<std::vector<Event2f>>(m_trail_count);\n        }\n        trail_num = 0;\n    }\n\n    // remove any agents that are left from a previous run\n    for (auto &agentSet : agentSets) {\n        agentSet.agents.clear();\n    }\n\n    for (int i = 0; i < m_timesteps; i++) {\n        for (auto &agentSet : agentSets) {\n            int q = invcumpoisson(prandomr(), agentSet.m_release_rate);\n            int length = agentSet.agents.size();\n            int k;\n            for (k = 0; k < q; k++) {\n                agentSet.agents.push_back(Agent(&(agentSet), pointmap, output_mode));\n            }\n            for (k = 0; k < q; k++) {\n                agentSet.init(length + k, trail_num);\n                if (trail_num != -1) {\n                    trail_num++;\n                    // after trail count, stop recording:\n                    if (trail_num == m_trail_count) {\n                        trail_num = -1;\n                    }\n                }\n            }\n        }\n\n        for (auto &agentSet : agentSets) {\n            agentSet.move();\n        }\n\n        if (comm) {\n            if (qtimer(atime, 500)) {\n                if (comm->IsCancelled()) {\n                    throw Communicator::CancelledException();\n                }\n                comm->CommPostMessage(Communicator::CURRENT_RECORD, i);\n            }\n        }\n    }\n\n    pointmap->overrideDisplayedAttribute(-2);\n    pointmap->setDisplayedAttribute(displaycol);\n}\n\nvoid AgentEngine::insertTrailsInMap(ShapeMap& trailsMap) {\n    for (auto &agentSet : agentSets) {\n        // there is currently only one AgentSet. If at any point there are more then\n        // this could be amended to put the AgentSet id as a property of the trail\n        for (auto &trail : agentSet.m_trails) {\n            std::vector<Point2f> trailGeometry(trail.begin(), trail.end());\n            trailsMap.makePolyShape(trailGeometry, true, false);\n        }\n    }\n}\n"
  },
  {
    "path": "salalib/agents/agentengine.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"agentset.h\"\n\nclass AgentEngine {\n  public: // public for now for speed\n    std::vector<AgentSet> agentSets;\n    int m_gatelayer;\n    int m_timesteps;\n\n  public:\n    bool m_record_trails;\n    int m_trail_count = 50;\n\n  public:\n    AgentEngine();\n    void run(Communicator *comm, PointMap *pointmap);\n    void insertTrailsInMap(ShapeMap& trailsMap);\n};\n"
  },
  {
    "path": "salalib/agents/agentga.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"agentga.h\"\n\n#include \"genlib/pafmath.h\"\n\nint thisrun = 0;\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\nstatic int rankselect(int popsize) {\n    int num = int(prandom() * popsize * (popsize + 1) * 0.5);\n    for (int i = 0; i < popsize; i++) {\n        if (num < (popsize - i)) {\n            return i;\n        }\n        num -= (popsize - i);\n    }\n    return 0; // <- this shouldn't happen\n}\n\n// note: this is tested and right: higher fitness, lower rank (so population[0] is best)\nint progcompare(const void *a, const void *b) {\n    double test = (((AgentProgram *)a)->m_fitness - ((AgentProgram *)b)->m_fitness);\n    if (test < 0.0) {\n        return 1;\n    } else if (test > 0.0) {\n        return -1;\n    }\n    return 0;\n}\n\nAgentProgram *ProgramPopulation::makeChild() {\n    int a = rankselect(POPSIZE);\n    int b = rankselect(POPSIZE);\n    while (a == b)\n        b = rankselect(POPSIZE);\n    m_population[POPSIZE - 1] = crossover(m_population[a], m_population[b]);\n    m_population[POPSIZE - 1].mutate();\n\n    return &(m_population[POPSIZE - 1]);\n}\n\n// note: this is correct -- do not use &m_population!\nvoid ProgramPopulation::sort() { qsort(m_population, POPSIZE, sizeof(AgentProgram), progcompare); }\n"
  },
  {
    "path": "salalib/agents/agentga.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"agentprogram.h\"\n\nconst int POPSIZE = 500;\n// redo ASSAYs -- assaysize * assays (3 * 200 = 600 evaluations total)\n// then take mean fitness: due to large variation in fitnesses with\n// short assays such as this\nconst int ASSAYS = 3;\nconst int ASSAYSIZE = 25000;\nconst int GENERATIONS = 10000;\nconst int TIMESTEPS = 1600;\n\nstruct ProgramPopulation {\n  public:\n    AgentProgram m_population[POPSIZE];\n\n  public:\n    ProgramPopulation() {}\n    AgentProgram *makeChild();\n    void sort();\n};\n"
  },
  {
    "path": "salalib/agents/agenthelpers.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\nconst static std::string g_col_total_counts = \"Gate Counts\";\nconst static std::string g_col_gate_counts = \"__Internal_Gate_Counts\";\nconst static std::string g_col_gate = \"__Internal_Gate\";\n"
  },
  {
    "path": "salalib/agents/agentprogram.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"agentprogram.h\"\n\n#include \"genlib/pafmath.h\"\n#include \"genlib/stringutils.h\"\n\n#include <fstream>\n\nAgentProgram::AgentProgram() {\n    m_sel_type = SEL_LOS;\n    m_steps = 3;\n    m_vbin = 7;\n    m_destination_directed = false;\n    m_los_sqrd = false;\n}\n\nvoid AgentProgram::mutate() {\n    // do mutate rule order occassionally:\n    if (pafrand() % 20 == 0) {\n        // rule order relies on putting rules into slots:\n        for (int i = 0; i < 4; i++) {\n            m_rule_order[i] = -1;\n        }\n        for (int j = 0; j < 4; j++) {\n            int choice = pafrand() % (4 - j);\n            for (int k = 0; k < choice + 1; k++) {\n                if (m_rule_order[k] != -1) {\n                    choice++;\n                }\n            }\n            m_rule_order[choice] = j;\n        }\n    }\n    // mutate the rule threshold / probabilities\n    for (int i = 0; i < 4; i++) {\n        if (pafrand() % 20 == 0) { // 5% mutation rate\n            m_rule_threshold[i] = float(prandom() * 100.0);\n        }\n        if (pafrand() % 20 == 0) { // 5% mutation rate\n            m_rule_probability[i] = float(prandom());\n        }\n    }\n}\n\nAgentProgram crossover(const AgentProgram &prog_a, const AgentProgram &prog_b) {\n    AgentProgram child;\n\n    // either one rule priority order or the other (don't try to mix!)\n    if (pafrand() % 2) {\n        for (int i = 0; i < 4; i++) {\n            child.m_rule_order[i] = prog_a.m_rule_order[i];\n        }\n    } else {\n        for (int i = 0; i < 4; i++) {\n            child.m_rule_order[i] = prog_b.m_rule_order[i];\n        }\n    }\n    // for each rule, either one rule threshold / probability or the other:\n    for (int i = 0; i < 4; i++) {\n        if (pafrand() % 2) {\n            child.m_rule_threshold[i] = prog_a.m_rule_threshold[i];\n        } else {\n            child.m_rule_threshold[i] = prog_b.m_rule_threshold[i];\n        }\n        if (pafrand() % 2) {\n            child.m_rule_probability[i] = prog_a.m_rule_probability[i];\n        } else {\n            child.m_rule_probability[i] = prog_b.m_rule_probability[i];\n        }\n    }\n\n    return child;\n}\n\n// TODO: Expose this functionality to the UIs\nvoid AgentProgram::save(const std::string &filename) {\n    // standard ascii:\n    std::ofstream file(filename.c_str());\n\n    file << \"Destination selection: \";\n    switch (m_sel_type) {\n    case SEL_STANDARD:\n        file << \"Standard\" << std::endl;\n        break;\n    case SEL_LENGTH:\n        file << \"Gibsonian Length\" << std::endl;\n        break;\n    case SEL_OPTIC_FLOW:\n        file << \"Gibsonian Optic Flow\" << std::endl;\n        break;\n    case SEL_COMPARATIVE_LENGTH:\n        file << \"Gibsonian Comparative Length\" << std::endl;\n        break;\n    case SEL_COMPARATIVE_OPTIC_FLOW:\n        file << \"Gibsonian Comparative Optic Flow\" << std::endl;\n        break;\n    default:\n        file << \"Unknown\" << std::endl;\n    }\n\n    file << \"Steps: \" << m_steps << std::endl;\n    file << \"Bins: \" << ((m_vbin == -1) ? 32 : m_vbin * 2 + 1) << std::endl;\n    file << \"Rule order: \" << m_rule_order[0] << \" \" << m_rule_order[1] << \" \" << m_rule_order[2] << \" \"\n         << m_rule_order[3] << std::endl;\n\n    for (int i = 0; i < 4; i++) {\n        file << \"Rule \" << i << \" (Bin -\" << 1 + (i * 2) << \"/+\" << 1 + (i * 2) << \")\" << std::endl;\n        file << \"Threshold: \" << m_rule_threshold[i] << std::endl;\n        file << \"Turn Probability: \" << m_rule_probability[i] << std::endl;\n    }\n\n    file << \"Fitness: \" << m_fitness << std::endl;\n}\n\nbool AgentProgram::open(const std::string &filename) {\n    // standard ascii:\n    std::ifstream file(filename.c_str());\n\n    std::string line;\n    file >> line;\n    if (!line.empty()) {\n        dXstring::toLower(line);\n        if (line.substr(0, 22) != \"destination selection:\") {\n            return false;\n        } else {\n            std::string method = line.substr(22);\n            dXstring::ltrim(method);\n            if (!method.empty()) {\n                if (method == \"standard\") {\n                    m_sel_type = SEL_STANDARD;\n                } else if (method == \"gibsonian length\") {\n                    m_sel_type = SEL_LENGTH;\n                } else if (method == \"gibsonian optic flow\") {\n                    m_sel_type = SEL_OPTIC_FLOW;\n                } else if (method == \"gibsonian comparative length\") {\n                    m_sel_type = SEL_COMPARATIVE_LENGTH;\n                } else if (method == \"gibsonian comparative optic flow\") {\n                    m_sel_type = SEL_COMPARATIVE_OPTIC_FLOW;\n                }\n                file >> line;\n            } else {\n                return false;\n            }\n        }\n    } else {\n        return false;\n    }\n\n    bool foundsteps = false;\n    bool foundbins = false;\n\n    if (!line.empty()) {\n        dXstring::toLower(line);\n        if (line.substr(0, 6) == \"steps:\") {\n            std::string steps = line.substr(6);\n            dXstring::ltrim(steps);\n            m_steps = stoi(steps);\n            file >> line;\n            foundsteps = true;\n        }\n    } else {\n        return false;\n    }\n\n    if (!line.empty()) {\n        dXstring::toLower(line);\n        if (line.substr(0, 5) == \"bins:\") {\n            std::string bins = line.substr(6);\n            dXstring::ltrim(bins);\n            int binx = stoi(bins);\n            if (binx == 32) {\n                m_vbin = -1;\n            } else {\n                m_vbin = (atoi(bins.c_str()) - 1) / 2;\n            }\n            file >> line;\n            foundbins = true;\n        }\n    }\n\n    if (m_sel_type == SEL_STANDARD) {\n        if (foundbins && foundsteps) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    if (!line.empty()) {\n        dXstring::toLower(line);\n        if (line.substr(0, 11) == \"rule order:\") {\n            std::string ruleorder = line.substr(11);\n            dXstring::ltrim(ruleorder);\n            auto orders = dXstring::split(ruleorder, ' ');\n            if (orders.size() != 4) {\n                return false;\n            }\n            for (int i = 0; i < 4; i++) {\n                m_rule_order[i] = stoi(orders[i]);\n            }\n            file >> line;\n        } else {\n            return false;\n        }\n    } else {\n        return false;\n    }\n    for (int i = 0; i < 4; i++) {\n        if (!line.empty()) {\n            dXstring::toLower(line);\n            if (line.substr(0, 4) == \"rule\") {\n                file >> line;\n            }\n            dXstring::toLower(line);\n            if (line.substr(0, 10) == \"threshold:\") {\n                auto threshold = line.substr(10);\n                dXstring::ltrim(threshold);\n                m_rule_threshold[i] = stof(threshold);\n                file >> line;\n            } else {\n                return false;\n            }\n            dXstring::toLower(line);\n            if (line.substr(0, 17) == \"turn probability:\") {\n                auto prob = line.substr(17);\n                dXstring::ltrim(prob);\n                m_rule_probability[i] = stof(prob);\n                file >> line;\n            } else {\n                return false;\n            }\n        } else {\n            return false;\n        }\n    }\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/agents/agentprogram.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n\n#include <string>\n\nstruct AgentProgram {\n    // comparative is comparative with current heading\n    enum {\n        SEL_LOS = 0x0001,\n        SEL_LOS_OCC = 0x0002,\n        SEL_TARGETTED = 0x1000,\n        SEL_STANDARD = 0x1001,\n        SEL_WEIGHTED = 0x1002,\n        SEL_GIBSONIAN = 0x2000,\n        SEL_LENGTH = 0x2001,\n        SEL_OPTIC_FLOW = 0x2002,\n        SEL_COMPARATIVE_LENGTH = 0x2003,\n        SEL_COMPARATIVE_OPTIC_FLOW = 0x2004,\n        SEL_GIBSONIAN2 = 0x4000,\n        SEL_OPTIC_FLOW2 = 0x4001,\n        SEL_OCCLUSION = 0x9000,\n        SEL_OCC_ALL = 0x9001,\n        SEL_OCC_BIN45 = 0x9002,\n        SEL_OCC_BIN60 = 0x9003,\n        SEL_OCC_STANDARD = 0x9004,\n        SEL_OCC_WEIGHT_DIST = 0x9005,\n        SEL_OCC_WEIGHT_ANG = 0x9006,\n        SEL_OCC_WEIGHT_DIST_ANG = 0x9007,\n        SEL_OCC_MEMORY = 0x9008\n    };\n    int m_sel_type;\n    int m_steps;\n    int m_vbin;\n    // these three variables for evolved Gibsonian agents:\n    int m_rule_order[4];\n    float m_rule_threshold[4];\n    float m_rule_probability[4];\n    // these are for optic flow 2 agents\n    int m_vahead;               // how wide your ahead vision is\n    float m_ahead_threshold;    // will turn if neg flow greater than this threshold (set in range 1/100 to 1)\n    float m_feeler_threshold;   // will turn if flow greater than this threshold (set in range 1 to 5)\n    float m_feeler_probability; // turn with this much probability if a feeler triggers\n    //\n    // simple long range destinations:\n    bool m_destination_directed;\n    bool m_los_sqrd;\n    //\n    // if it is going to evolved, then have it remember its fitness:\n    double m_fitness;\n    //\n    AgentProgram();\n    //\n    // for evolution\n    void mutate();\n    friend AgentProgram crossover(const AgentProgram &prog_a, const AgentProgram &prog_b);\n    // to reload later:\n    void save(const std::string &filename);\n    bool open(const std::string &filename);\n    std::vector<std::vector<Event2f>> m_trails;\n};\n"
  },
  {
    "path": "salalib/agents/agentset.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"agentset.h\"\n\n#include \"salalib/pixelref.h\"\n\nAgentSet::AgentSet() {\n    m_release_rate = 0.1;\n    m_lifetime = 1000;\n}\n\nvoid AgentSet::init(int agent, int trail_num) {\n    if (m_release_locations.size()) {\n        int which = pafrand() % m_release_locations.size();\n        agents[agent].onInit(m_release_locations[which], trail_num);\n    } else {\n        const PointMap &map = agents[agent].getPointMap();\n        PixelRef pix;\n        do {\n            pix = map.pickPixel(prandom(m_release_locations_seed));\n        } while (!map.getPoint(pix).filled());\n        agents[agent].onInit(pix, trail_num);\n    }\n}\n\nvoid AgentSet::move() {\n    // go through backwards so remove does not affect later agents\n    for (auto rev_iter = agents.rbegin(); rev_iter != agents.rend(); ++rev_iter) {\n        rev_iter->onMove();\n        if (rev_iter->getFrame() >= m_lifetime) {\n            agents.erase(std::next(rev_iter).base());\n        }\n    }\n}\n"
  },
  {
    "path": "salalib/agents/agentset.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2019, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"agent.h\"\n#include \"agentprogram.h\"\n\nstruct AgentSet : public AgentProgram {\n    std::vector<Agent> agents;\n    std::vector<int> m_release_locations;\n    int m_release_locations_seed = 0;\n    double m_release_rate;\n    int m_lifetime;\n    AgentSet();\n    void move();\n    void init(int agent, int trail_num = -1);\n};\n"
  },
  {
    "path": "salalib/alllinemap.cpp",
    "content": "#include \"alllinemap.h\"\n#include \"salalib/axialminimiser.h\"\n#include \"salalib/tolerances.h\"\n#include \"genlib/exceptions.h\"\n#include <time.h>\n#include <iomanip>\n\nAllLineMap::AllLineMap(Communicator *comm,\n                       std::vector<SpacePixelFile> &drawingLayers,\n                       const Point2f& seed,\n                       const std::string& name):\n    ShapeGraph(name, ShapeMap::ALLLINEMAP)\n{\n   if (comm) {\n      comm->CommPostMessage( Communicator::NUM_STEPS, 3 );\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 1 );\n   }\n   // this has a nasty habit of crashing if reused...\n   // reset everything at the top level, including any existing all-line map:\n   m_polygons.clear();\n   m_poly_connections.clear();\n   m_radial_lines.clear();\n\n   // starting off... finding a polygon...\n   // for ease, I'm just going to make a construction line set from all the visible lines...\n\n   QtRegion region;\n\n   std::vector<Line> lines;\n\n   // add all visible layers to the set of polygon lines...\n   for (const auto& pixelGroup: drawingLayers) {\n      for (const auto& pixel: pixelGroup.m_spacePixels) {\n         if (pixel.isShown()) {\n            if (region.atZero()) {\n               region = pixel.getRegion();\n            }\n            else {\n               region = runion(region, pixel.getRegion());\n            }\n            std::vector<SimpleLine> newLines = pixel.getAllShapesAsLines();\n            for (const auto& line: newLines) {\n               lines.push_back(Line(line.start(), line.end()));\n            }\n         }\n      }\n   }\n\n   region.grow(1.30);\n   m_polygons.init(lines, region);\n   m_polygons.m_handled_list.clear();\n\n   // find a corner visible from the seed:\n   AxialVertexKey seedvertex = m_polygons.seedVertex( seed );\n\n   if (seedvertex == NoVertex) {\n      // oops... can't find a visible vertex\n       throw depthmapX::RuntimeException(\"No visible vertices found\");\n   }\n\n   // okay, we've got as far as finding a seed corner, now the real fun begins...\n   // test outwards from corner, add other corners to\n   // test set...\n   std::vector<Line> axiallines;\n   KeyVertices preaxialdata;\n   // also poly_connections used in fewest line axial map construction:\n   m_poly_connections.clear();\n   m_radial_lines.clear();\n\n   AxialVertex vertex = m_polygons.makeVertex(seedvertex, seed);\n   if (!vertex.m_initialised) {\n      // oops... can't init for some reason\n      throw depthmapX::RuntimeException(\"Failed to initialise axial vertices\");\n   }\n\n\n   time_t atime = 0;\n   int count = 0;\n   if (comm) {\n      qtimer( atime, 0 );\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 2 );\n      comm->CommPostMessage( Communicator::NUM_RECORDS, m_polygons.m_vertex_possibles.size() );\n   }\n\n   std::set<AxialVertex> openvertices;\n   openvertices.insert(vertex);\n   while (!openvertices.empty()) {\n      m_polygons.makeAxialLines(openvertices, axiallines, preaxialdata, m_poly_connections, m_radial_lines);\n      count++;\n      //\n      if (comm) {\n         if (qtimer( atime, 500 )) {\n            if (comm->IsCancelled()) {\n               throw Communicator::CancelledException();\n            }\n            comm->CommPostMessage( Communicator::CURRENT_RECORD, count );\n         }\n      }\n\n   }\n\n   if (comm) {\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 3 );\n      comm->CommPostMessage( Communicator::CURRENT_RECORD, 0 );\n   }\n\n   // cut out duplicates:\n   int removed = 0;  // for testing purposes\n   for (size_t j = 0; j < axiallines.size(); j++) {\n      for (size_t k = axiallines.size() - 1; k > j; k--) {\n         double maxdim = __max(region.width(),region.height());\n         if (approxeq(axiallines[j].start(), axiallines[k].start(), maxdim * TOLERANCE_B) && approxeq(axiallines[j].end(), axiallines[k].end(), maxdim * TOLERANCE_B)) {\n            for (int preaxiali: preaxialdata[k]) {\n                preaxialdata[j].insert(preaxiali);\n            }\n            preaxialdata.erase(preaxialdata.begin() + int(k));\n            axiallines.erase(axiallines.begin() + int(k));\n            removed++;\n         }\n      }\n   }\n\n   region.grow(0.99); // <- this paired with crop code below to prevent error\n   init(axiallines.size(), m_polygons.getRegion());  // used to be double density here\n   initialiseAttributesAxial();\n   for (size_t k = 0; k < axiallines.size(); k++) {\n      axiallines[k].crop(region); // <- should be cropped anyway, but causing an error\n      makeLineShape(axiallines[k]);\n   }\n\n   // n.b. make connections also initialises attributes\n   // -> don't know what this was for: alllinemap.sortBins(m_poly_connections);\n   makeConnections(preaxialdata);\n\n   setKeyVertexCount(m_polygons.m_vertex_possibles.size());\n}\n\nstd::tuple<std::unique_ptr<ShapeGraph>, std::unique_ptr<ShapeGraph>> AllLineMap::extractFewestLineMaps(Communicator *comm)\n{\n\n   if (comm) {\n      comm->CommPostMessage( Communicator::NUM_STEPS, 2 );\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 1 );\n   }\n\n   pafsrand((unsigned int)time(NULL));\n\n   // make one rld for each radial line...\n   std::map<RadialKey, std::set<int> > radialdivisions;\n   size_t i;\n   for (auto& radial_line: m_radial_lines) {\n      radialdivisions.insert(std::make_pair( (RadialKey) radial_line, std::set<int>() ));\n   }\n\n   // also, a list of radial lines cut by each axial line\n   std::map<int, std::set<int> > ax_radial_cuts;\n   std::map<int, std::set<int> > ax_seg_cuts;\n   for (auto shape: getAllShapes()) {\n      ax_radial_cuts.insert(std::make_pair(shape.first, std::set<int>()));\n      ax_seg_cuts.insert(std::make_pair(shape.first, std::set<int>()));\n   }\n\n   // make divisions -- this is the slow part and the comm updates\n   makeDivisions(m_poly_connections, m_radial_lines, radialdivisions, ax_radial_cuts, comm);\n\n   // the slow part is over, we're into the final straight... reset the current record flag:\n   if (comm) {\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 2 );\n      comm->CommPostMessage( Communicator::CURRENT_RECORD, 0 );\n   }\n\n   // a little further setting up is still required...\n   std::map<RadialKey,RadialSegment> radialsegs;\n\n   auto iter = m_radial_lines.begin();\n   if (iter != m_radial_lines.end()) {\n       // now make radial segments from the radial lines... (note, start at 1)\n       auto prevIter = m_radial_lines.begin();\n       ++iter;\n       for (;iter != m_radial_lines.end();) {\n          if (iter->vertex == prevIter->vertex && iter->ang != prevIter->ang) {\n                    radialsegs.insert(std::make_pair( (RadialKey)(*iter), (RadialSegment)(*prevIter)));\n          }\n          ++iter;\n          ++prevIter;\n       }\n   }\n\n   // and segment divisors from the axial lines...\n   // TODO: (CS) Restructure this to get rid of all those brittle parallel data structure\n   auto axIter = ax_radial_cuts.begin();\n   auto axSeg = ax_seg_cuts.begin();\n   for (i = 0; i < getAllShapes().size(); i++) {\n       auto axRadCutIter = axIter->second.begin();\n       if(axRadCutIter != axIter->second.end()) {\n          auto axRadCutIterPrev = axIter->second.begin();\n          ++axRadCutIter;\n          for (size_t j = 1; j < axIter->second.size(); ++j) {\n             // note similarity to loop above\n             RadialKey& rk_end = m_radial_lines[size_t(*axRadCutIter)];\n             RadialKey& rk_start = m_radial_lines[size_t(*axRadCutIterPrev)];\n             if (rk_start.vertex == rk_end.vertex) {\n                auto radialSegIter = radialsegs.find(rk_end);\n                if (radialSegIter != radialsegs.end() && rk_start == radialSegIter->second.radial_b) {\n                   radialSegIter->second.indices.insert(axIter->first);\n                   axSeg->second.insert(std::distance(radialsegs.begin(), radialSegIter));\n                }\n             }\n             ++axRadCutIter;\n             ++axRadCutIterPrev;\n          }\n      }\n      axIter++;\n      axSeg++;\n   }\n\n   // and a little more setting up: key vertex relationships\n   std::vector<std::vector<int> > keyvertexconns;\n   std::vector<int> keyvertexcounts(static_cast<size_t>(m_keyvertexcount), 0);\n   // this sets up a two step relationship: looks for the key vertices for all lines connected to you\n   for (size_t y = 0; y < m_connectors.size(); y++) {\n      keyvertexconns.push_back(std::vector<int>());\n      auto &conn = keyvertexconns.back();\n      Connector& axa = m_connectors[y];\n      for (size_t z = 0; z < axa.m_connections.size(); z++) {\n         std::set<int>& axb = m_keyvertices[axa.m_connections[z]];\n         for (int axbi: axb) {\n            auto res = std::lower_bound(conn.begin(), conn.end(), axbi);\n            if (res  == conn.end() || axbi < *res )\n            {\n                conn.insert(res, axbi);\n                keyvertexcounts[axbi] += 1;\n            }\n         }\n      }\n   }\n\n   // ok, after this fairly tedious set up, we are ready to go...\n   // note axradialcuts aren't required anymore...\n\n   AxialMinimiser minimiser(*this, ax_seg_cuts.size(), radialsegs.size());\n\n   std::vector<Line> lines_s, lines_m;\n\n   minimiser.removeSubsets(ax_seg_cuts, radialsegs, radialdivisions, m_radial_lines, keyvertexconns, keyvertexcounts);\n\n   // make new lines here (assumes line map has only lines)\n   int k = -1;\n   for (auto& shape: m_shapes) {\n      k++;\n      if (!minimiser.removed(k)) {\n         lines_s.push_back( shape.second.getLine() );\n      }\n   }\n\n   minimiser.fewestLongest(ax_seg_cuts, radialsegs, radialdivisions, m_radial_lines, keyvertexconns, keyvertexcounts);\n\n   // make new lines here (assumes line map has only lines\n   for (int k = 0; k < int(getAllShapes().size()); k++) {\n      if (!minimiser.removed(k)) {\n         lines_m.push_back( depthmapX::getMapAtIndex(getAllShapes(), k)->second.getLine() );\n      }\n   }\n\n   std::unique_ptr<ShapeGraph> fewestlinemap_subsets(new ShapeGraph(\"Fewest-Line Map (Subsets)\", ShapeMap::AXIALMAP));\n   fewestlinemap_subsets->clearAll();\n   fewestlinemap_subsets->init(int(lines_s.size()),m_polygons.getRegion());\n\n   fewestlinemap_subsets->initialiseAttributesAxial();\n   for (size_t k = 0; k < lines_s.size(); k++) {\n      fewestlinemap_subsets->makeLineShape(lines_s[k]);\n   }\n   fewestlinemap_subsets->makeConnections();\n\n\n   std::unique_ptr<ShapeGraph> fewestlinemap_minimal(new ShapeGraph(\"Fewest-Line Map (Minimal)\", ShapeMap::AXIALMAP));\n   fewestlinemap_minimal->clearAll();\n   fewestlinemap_minimal->init(int(lines_m.size()),m_polygons.getRegion()); // used to have a '2' for double pixel density\n\n   fewestlinemap_minimal->initialiseAttributesAxial();\n   for (size_t k = 0; k < lines_m.size(); k++) {\n      fewestlinemap_minimal->makeLineShape(lines_m[k]);\n   }\n   fewestlinemap_minimal->makeConnections();\n\n   return std::make_tuple(std::move(fewestlinemap_subsets), std::move(fewestlinemap_minimal));\n}\n\nvoid AllLineMap::makeDivisions(const std::vector<PolyConnector>& polyconnections, const std::vector<RadialLine> &radiallines,\n                               std::map<RadialKey,std::set<int> >& radialdivisions, std::map<int, std::set<int> > &axialdividers,\n                               Communicator *comm)\n{\n   time_t atime = 0;\n   if (comm) {\n      qtimer( atime, 0 );\n      comm->CommPostMessage( Communicator::NUM_RECORDS, polyconnections.size() );\n   }\n\n   for (size_t i = 0; i < polyconnections.size(); i++) {\n      PixelRefVector pixels = pixelateLine(polyconnections[i].line);\n      std::vector<size_t> testedshapes;\n      auto connIter = radialdivisions.find(polyconnections[i].key);\n      size_t connindex = std::distance(radialdivisions.begin(), connIter);\n      double tolerance = sqrt(TOLERANCE_A);// * polyconnections[i].line.length();\n      for (size_t j = 0; j < pixels.size(); j++) {\n         PixelRef pix = pixels[j];\n         auto& shapes = m_pixel_shapes(static_cast<size_t>(pix.y),\n                                       static_cast<size_t>(pix.x));\n         for (const ShapeRef& shape: shapes) {\n            auto iter = depthmapX::findBinary( testedshapes, shape.m_shape_ref );\n            if (iter != testedshapes.end()) {\n               continue;\n            }\n            testedshapes.insert(iter, int(shape.m_shape_ref));\n            const Line& line = m_shapes.find(shape.m_shape_ref)->second.getLine();\n            //\n            if (intersect_region(line, polyconnections[i].line, tolerance * line.length()) ) {\n               switch ( intersect_line_distinguish(line, polyconnections[i].line, tolerance * line.length()) ) {\n               case 0:\n                  break;\n               case 2:\n                  {\n                     size_t index = depthmapX::findIndexFromKey(axialdividers, (int) shape.m_shape_ref);\n                     if (index != shape.m_shape_ref) {\n                        throw 1; // for the code to work later this can't be true!\n                     }\n                     axialdividers[index].insert(connindex);\n                     connIter->second.insert(shape.m_shape_ref);\n                  }\n                  break;\n               case 1:\n                  {\n                     size_t index = depthmapX::findIndexFromKey(axialdividers, (int) shape.m_shape_ref);\n                     if (index != shape.m_shape_ref) {\n                        throw 1; // for the code to work later this can't be true!\n                     }\n                     //\n                     // this makes sure actually crosses between the line and the openspace properly\n                     if (radiallines[connindex].cuts(line)) {\n                        axialdividers[index].insert(connindex);\n                        connIter->second.insert(shape.m_shape_ref);\n                     }\n                  }\n                  break;\n               default:\n                  break;\n               }\n            }\n         }\n      }\n      if (comm) {\n         if (qtimer( atime, 500 )) {\n            if (comm->IsCancelled()) {\n               throw Communicator::CancelledException();\n            }\n            comm->CommPostMessage( Communicator::CURRENT_RECORD, i );\n         }\n      }\n   }\n}\n"
  },
  {
    "path": "salalib/alllinemap.h",
    "content": "#pragma once\n\n#include \"salalib/axialmap.h\"\n#include \"salalib/axialpolygons.h\"\n\nclass AllLineMap: public ShapeGraph\n{\npublic:\n    AllLineMap(Communicator *comm,\n               std::vector<SpacePixelFile> &drawingLayers,\n               const Point2f& seed,\n               const std::string& name = \"All-Line Map\");\n    AllLineMap(const std::string& name = \"All-Line Map\"):\n        ShapeGraph(name, ShapeMap::ALLLINEMAP) {}\n    AxialPolygons m_polygons;\n    std::vector<PolyConnector> m_poly_connections;\n    std::vector<RadialLine> m_radial_lines;\n    void setKeyVertexCount(int keyvertexcount) {\n        m_keyvertexcount = keyvertexcount;\n    }\n    std::tuple<std::unique_ptr<ShapeGraph>, std::unique_ptr<ShapeGraph>> extractFewestLineMaps(Communicator *comm);\n    void makeDivisions(const std::vector<PolyConnector>& polyconnections, const std::vector<RadialLine> &radiallines,\n                       std::map<RadialKey, std::set<int> > &radialdivisions, std::map<int, std::set<int> > &axialdividers,\n                       Communicator *comm);\n\n};\n"
  },
  {
    "path": "salalib/attributetable.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"attributetable.h\"\n#include \"displayparams.h\"\n#include <genlib/stringutils.h>\n#include <genlib/readwritehelpers.h>\n\n#include <sstream>\n#include <numeric>\n\nconst std::string &AttributeColumnImpl::getName() const\n{\n    return m_name;\n}\n\nbool AttributeColumnImpl::isLocked() const\n{\n    return m_locked;\n}\n\nvoid AttributeColumnImpl::setLock(bool lock)\n{\n    m_locked = lock;\n}\n\nbool AttributeColumnImpl::isHidden() const\n{\n    return m_hidden;\n}\n\nvoid AttributeColumnImpl::setHidden(bool hidden)\n{\n    m_hidden = hidden;\n}\n\nvoid AttributeColumnImpl::setFormula(std::string newFormula)\n{\n    m_formula = newFormula;\n}\n\nconst std::string &AttributeColumnImpl::getFormula() const\n{\n    return m_formula;\n}\n\nconst AttributeColumnStats &AttributeColumnImpl::getStats() const\n{\n    return m_stats;\n}\n\nvoid AttributeColumnImpl::updateStats(float val, float oldVal) const\n{\n    if (m_stats.total < 0)\n    {\n        m_stats.total = val;\n    }\n    else\n    {\n        m_stats.total += val;\n        m_stats.total -= oldVal;\n    }\n    if (val > m_stats.max)\n    {\n        m_stats.max = val;\n    }\n    if (m_stats.min < 0 || val < m_stats.min)\n    {\n        m_stats.min = val;\n    }\n}\n\nvoid AttributeColumnImpl::setName(const std::string &name)\n{\n    m_name = name;\n}\n\nsize_t AttributeColumnImpl::read(std::istream &stream)\n{\n    m_name = dXstring::readString(stream);\n    float val;\n    stream.read((char *)&val, sizeof(float));\n    m_stats.min = val;\n    stream.read((char *)&val, sizeof(float));\n    m_stats.max = val;\n    stream.read((char *)&m_stats.total, sizeof(double));\n    int physical_column;\n    stream.read((char *)&physical_column, sizeof(int)); // physical column is obsolete\n    stream.read((char *)&m_hidden, sizeof(bool));\n    stream.read((char *)&m_locked, sizeof(bool));\n\n    stream.read((char*)&m_displayParams,sizeof(DisplayParams));\n    m_formula = dXstring::readString(stream);\n    return physical_column;\n}\n\nvoid AttributeColumnImpl::write(std::ostream &stream, int physicalCol)\n{\n    dXstring::writeString(stream, m_name);\n    float min = (float)m_stats.min;\n    float max = (float)m_stats.max;\n    stream.write((char *)&min, sizeof(float));\n    stream.write((char *)&max, sizeof(float));\n    stream.write((char *)&m_stats.total, sizeof(m_stats.total));\n    stream.write((char *)&physicalCol, sizeof(int));\n    stream.write((char *)&m_hidden, sizeof(bool));\n    stream.write((char *)&m_locked, sizeof(bool));\n    stream.write((char *)&m_displayParams, sizeof(DisplayParams));\n    dXstring::writeString(stream, m_formula);\n\n}\n\n\n// AttributeRow implementation\nfloat AttributeRowImpl::getValue(const std::string &column) const\n{\n    return getValue(m_colManager.getColumnIndex(column));\n}\n\nfloat AttributeRowImpl::getValue(size_t index) const\n{\n    checkIndex(index);\n    return m_data[index];\n}\n\nfloat AttributeRowImpl::getNormalisedValue(size_t index) const\n{\n    checkIndex(index);\n    auto& colStats = m_colManager.getColumn(index).getStats();\n    if (colStats.max == colStats.min)\n    {\n        return 0.5f;\n    }\n    return  m_data[index] < 0 ? -1.0f : float((m_data[index] - colStats.min)/(colStats.max - colStats.min));\n}\n\nAttributeRow& AttributeRowImpl::setValue(const std::string &column, float value)\n{\n    return setValue(m_colManager.getColumnIndex(column), value);\n}\n\nAttributeRow& AttributeRowImpl::setValue(size_t index, float value)\n{\n    checkIndex(index);\n    float oldVal = m_data[index];\n    m_data[index] = value;\n    if (oldVal < 0.0f)\n    {\n        oldVal = 0.0f;\n    }\n    m_colManager.getColumn(index).updateStats(value, oldVal);\n    return *this;\n}\n\nAttributeRow& AttributeRowImpl::setSelection(bool selected)\n{\n    m_selected = selected;\n    return *this;\n}\n\nbool AttributeRowImpl::isSelected() const\n{\n    return m_selected;\n}\n\nvoid AttributeRowImpl::addColumn()\n{\n    m_data.push_back(-1);\n}\n\nvoid AttributeRowImpl::removeColumn(size_t index)\n{\n    checkIndex(index);\n    m_data.erase(m_data.begin() + index);\n}\n\nvoid AttributeRowImpl::read(std::istream &stream)\n{\n    stream.read((char *)&m_layerKey, sizeof(m_layerKey));\n    dXreadwrite::readIntoVector(stream, m_data);\n}\n\nvoid AttributeRowImpl::write(std::ostream &stream)\n{\n    stream.write((char *)&m_layerKey, sizeof(m_layerKey));\n    dXreadwrite::writeVector(stream, m_data);\n}\n\nvoid AttributeRowImpl::checkIndex(size_t index) const\n{\n    if( index >= m_data.size())\n    {\n        throw std::out_of_range(\"AttributeColumn index out of range\");\n    }\n}\n\n\n\nAttributeRow &AttributeRowImpl::incrValue(size_t index, float value)\n{\n    checkIndex(index);\n    float val = m_data[index];\n    if ( val < 0)\n    {\n        setValue(index, value);\n    }\n    else\n    {\n        setValue(index, val + value);\n    }\n    return *this;\n}\n\n\nAttributeRow &AttributeRowImpl::incrValue(const std::string &colName, float value)\n{\n    return incrValue(m_colManager.getColumnIndex(colName), value);\n}\n\nAttributeRow &AttributeTable::getRow(const AttributeKey &key)\n{\n    auto* row = getRowPtr(key);\n    if (row == 0)\n    {\n        throw std::out_of_range(\"Invalid row key\");\n    }\n    return *row;\n}\n\nconst AttributeRow& AttributeTable::getRow(const AttributeKey &key) const\n{\n    auto* row = getRowPtr(key);\n    if (row == 0)\n    {\n        throw std::out_of_range(\"Invalid row key\");\n    }\n    return *row;\n}\n\nAttributeRow *AttributeTable::getRowPtr(const AttributeKey &key)\n{\n    auto iter = m_rows.find(key);\n    if (iter == m_rows.end())\n    {\n        return 0;\n    }\n    return iter->second.get();\n}\n\nconst AttributeRow *AttributeTable::getRowPtr(const AttributeKey &key) const\n{\n    auto iter = m_rows.find(key);\n    if (iter == m_rows.end())\n    {\n        return 0;\n    }\n    return iter->second.get();\n}\n\nAttributeRow &AttributeTable::addRow(const AttributeKey &key)\n{\n    auto iter = m_rows.find(key);\n    if (iter != m_rows.end())\n    {\n        throw new std::invalid_argument(\"Duplicate key\");\n    }\n    auto res = m_rows.insert(std::make_pair(key, std::unique_ptr<AttributeRowImpl>(new AttributeRowImpl(*this))));\n    return *res.first->second;\n}\n\nvoid AttributeTable::removeRow(const AttributeKey &key)\n{\n    auto iter = m_rows.find(key);\n    if (iter == m_rows.end())\n    {\n        throw new std::invalid_argument(\"Row does not exist\");\n    }\n    m_rows.erase(iter);\n}\n\nAttributeColumn &AttributeTable::getColumn(size_t index)\n{\n    if(index == size_t(-1)) {\n        return m_keyColumn;\n    }\n    checkColumnIndex(index);\n    return m_columns[index];\n}\n\nsize_t AttributeTable::insertOrResetColumn(const std::string &columnName, const std::string &formula)\n{\n    auto iter = m_columnMapping.find(columnName);\n    if (iter == m_columnMapping.end())\n    {\n        return addColumnInternal(columnName, formula);\n    }\n\n    // it exists - we need to reset it\n    m_columns[iter->second].m_stats = AttributeColumnStats();\n    m_columns[iter->second].setLock(false);\n    for (auto& row : m_rows)\n    {\n        row.second->setValue(iter->second, -1.0f);\n    }\n    return iter->second;\n}\n\nsize_t AttributeTable::insertOrResetLockedColumn(const std::string &columnName, const std::string &formula)\n{\n    size_t index = insertOrResetColumn(columnName, formula);\n    m_columns[index].setLock(true);\n    return index;\n}\n\nsize_t AttributeTable::getOrInsertColumn(const std::string &columnName, const std::string &formula)\n{\n    auto iter = m_columnMapping.find(columnName);\n    if ( iter != m_columnMapping.end())\n    {\n        return iter->second;\n    }\n    return addColumnInternal(columnName, formula);\n}\n\nsize_t AttributeTable::getOrInsertLockedColumn(const std::string &columnName, const std::string &formula)\n{\n    size_t index = getOrInsertColumn(columnName, formula);\n    m_columns[index].setLock(true);\n    return index;\n}\n\nvoid AttributeTable::removeColumn(size_t colIndex)\n{\n    checkColumnIndex(colIndex);\n    const std::string& name = m_columns[colIndex].getName();\n    auto iter = m_columnMapping.find(name);\n    m_columnMapping.erase(iter);\n    for (auto& elem : m_columnMapping)\n    {\n        if (elem.second > colIndex)\n        {\n            elem.second--;\n        }\n    }\n    m_columns.erase(m_columns.begin()+colIndex);\n    for (auto& row : m_rows)\n    {\n        row.second->removeColumn(colIndex);\n    }\n}\n\nvoid AttributeTable::renameColumn(const std::string &oldName, const std::string &newName)\n{\n    auto iter = m_columnMapping.find(oldName);\n    if (iter == m_columnMapping.end())\n    {\n        throw std::out_of_range(\"Invalid column name\");\n    }\n\n    size_t colIndex = iter->second;\n    m_columns[colIndex].setName(newName);\n    m_columnMapping.erase(iter);\n    m_columnMapping[newName] = colIndex;\n\n}\n\nvoid AttributeTable::deselectAllRows()\n{\n    for (auto& row : m_rows)\n    {\n        row.second->setSelection(false);\n    }\n}\n\nvoid AttributeTable::setDisplayParamsForAllAttributes(const DisplayParams &params)\n{\n    for (auto& col: m_columns)\n    {\n        col.setDisplayParams(params);\n    }\n\n}\n\nvoid AttributeTable::read(std::istream &stream, LayerManager &layerManager)\n{\n    layerManager.read(stream);\n    int colcount;\n    stream.read((char *)&colcount, sizeof(colcount));\n    std::map<size_t, AttributeColumnImpl> tmp;\n    for (int j = 0; j < colcount; j++) {\n        AttributeColumnImpl col(\"\");\n        tmp[col.read(stream)] = col;\n    }\n\n    for (auto & c : tmp)\n    {\n        m_columnMapping[c.second.getName()] = m_columns.size();\n        m_columns.push_back(c.second);\n    }\n\n    int rowcount, rowkey;\n    stream.read((char *)&rowcount, sizeof(rowcount));\n    for (int i = 0; i < rowcount; i++) {\n        stream.read((char *)&rowkey, sizeof(rowkey));\n        auto row = std::unique_ptr<AttributeRowImpl>(new AttributeRowImpl(*this));\n        row->read(stream);\n        m_rows.insert(std::make_pair(AttributeKey(rowkey),std::move(row)));\n    }\n\n    // ref column display params\n    stream.read((char *)&m_displayParams,sizeof(DisplayParams));\n}\n\nvoid AttributeTable::write(std::ostream &stream, const LayerManager &layerManager)\n{\n    layerManager.write(stream);\n    int colCount = (int)m_columns.size();\n    stream.write((char *)&colCount, sizeof(int));\n\n    // TODO: For binary compatibility write the columns in alphabetical order\n    // but the physical columns in the order inserted\n\n    std::vector<size_t> indices(m_columns.size());\n    std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\n\n    std::sort(indices.begin(), indices.end(),\n        [&](size_t a, size_t b) {\n        return m_columns[a].getName() < m_columns[b].getName();\n    });\n\n    for (int idx: indices) {\n        m_columns[idx].write(stream, m_columnMapping[m_columns[idx].getName()]);\n    }\n\n    int rowcount = (int)m_rows.size();\n    stream.write((char *)&rowcount, sizeof(int));\n    for ( auto &kvp : m_rows)\n    {\n        kvp.first.write(stream);\n        kvp.second->write(stream);\n    }\n    stream.write((const char *)&m_displayParams, sizeof(DisplayParams));\n}\n\nvoid AttributeTable::clear() {\n    m_rows.clear();\n    m_columns.clear();\n    m_columnMapping.clear();\n}\n\nsize_t AttributeTable::getColumnIndex(const std::string &name) const\n{\n    auto iter = m_columnMapping.find(name);\n    if (iter == m_columnMapping.end())\n    {\n        std::stringstream message;\n        message << \"Unknown column name \" << name;\n        throw std::out_of_range(message.str());\n    }\n    return iter->second;\n\n}\n\n// TODO: Compatibility. Method to retreive a column's index\n// if the set of columns was sorted\nsize_t AttributeTable::getColumnSortedIndex(size_t index) const\n{\n    if(index == size_t(-1) || index == size_t(-2)) return index;\n    if(index >= m_columns.size()) return -1;\n\n    return std::distance(m_columnMapping.begin(), m_columnMapping.find(getColumnName(index)));\n}\n\n\nconst AttributeColumn &AttributeTable::getColumn(size_t index) const\n{\n    if(index == size_t(-1)) {\n        return m_keyColumn;\n    }\n    checkColumnIndex(index);\n    return m_columns[index];\n}\n\nconst std::string &AttributeTable::getColumnName(size_t index) const\n{\n    return getColumn(index).getName();\n}\n\nsize_t AttributeTable::getNumColumns() const\n{\n    return m_columns.size();\n}\n\nbool AttributeTable::hasColumn(const std::string &name) const\n{\n    auto iter = m_columnMapping.find(name);\n    return(iter != m_columnMapping.end());\n}\n\nvoid AttributeTable::checkColumnIndex(size_t index) const\n{\n    if (index >= m_columns.size())\n    {\n        throw std::out_of_range(\"ColumnIndex out of range\");\n    }\n}\n\nsize_t AttributeTable::addColumnInternal(const std::string &name, const std::string &formula)\n{\n    size_t colIndex = m_columns.size();\n    m_columns.push_back(AttributeColumnImpl(name, formula));\n    m_columnMapping[name] = colIndex;\n    for (auto& elem : m_rows)\n    {\n        elem.second->addColumn();\n    }\n    return colIndex;\n}\n"
  },
  {
    "path": "salalib/attributetable.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#pragma once\n#include \"layermanager.h\"\n#include <string>\n#include <map>\n#include <vector>\n#include <memory>\n#include <sstream>\n#include <iterator>\n#include <algorithm>\n#include <salalib/displayparams.h>\n#include <salalib/mgraph_consts.h>\n\n///\n/// Namespace to hold known attributes\n///\nnamespace AttributeName {\n    const char * const REF = \"Ref\";\n}\n\n///\n/// Interface to an attribute row\n///\nclass AttributeRow : public LayerAware\n{\npublic:\n    virtual float getValue(const std::string &column) const = 0;\n    virtual float getValue(size_t index) const = 0;\n    virtual float getNormalisedValue(size_t index) const = 0;\n    virtual AttributeRow& setValue(const std::string &column, float value ) = 0;\n    virtual AttributeRow& setValue(size_t index, float value) = 0;\n    virtual AttributeRow& incrValue(size_t index, float value = 1.0f) = 0;\n    virtual AttributeRow& incrValue(const std::string &colName, float value = 1.0f) = 0;\n    virtual AttributeRow& setSelection(bool selected) = 0;\n    virtual bool isSelected() const = 0;\n\n    virtual ~AttributeRow(){}\n};\n\n\n///\n/// Container for attribute column stats - really just POD to pass them around\n///\nstruct AttributeColumnStats\n{\n    AttributeColumnStats( double minimum, double maximum, double tot, double vTot, double vMin, double vMax ): min(minimum), max(maximum), total(tot), visibleTotal(vTot), visibleMin(vMin), visibleMax(vMax)\n    {}\n\n    AttributeColumnStats() : AttributeColumnStats(-1.0, -1.0, -1.0, -1.0, -1.0, -1.0)\n    {\n    }\n\n    double min;\n    double max;\n    double total;\n    double visibleTotal;\n    double visibleMin;\n    double visibleMax;\n};\n\n\n///\n/// Interface to an attribute column\n///\nclass AttributeColumn\n{\npublic:\n    virtual const std::string& getName() const  = 0;\n    virtual bool isLocked() const = 0;\n    virtual void setLock(bool lock) = 0;\n    virtual bool isHidden() const = 0;\n    virtual void setHidden(bool hidden) = 0;\n    virtual void setDisplayParams(const DisplayParams& params ) = 0;\n    virtual const DisplayParams& getDisplayParams() const = 0;\n\n    virtual const std::string& getFormula() const = 0;\n    virtual void setFormula(std::string newFormula) = 0;\n\n    virtual const AttributeColumnStats& getStats() const = 0;\n\n    // stats are mutable - we need to be able to update them all the time,\n    // even when not allowed to modify the column settings\n    virtual void updateStats(float val, float oldVal = 0.0f) const = 0;\n\n    virtual ~AttributeColumn(){}\n\n};\n\n\n///\n/// Interface to an Attribute Column Manager\n/// This handles the mapping from column name to index and actually storing the column implementations\n/// Implemented by AttributeTable\n///\nclass AttributeColumnManager\n{\npublic:\n    virtual size_t getNumColumns() const = 0;\n    virtual size_t getColumnIndex(const std::string& name) const = 0;\n    virtual const AttributeColumn& getColumn(size_t index) const = 0;\n    virtual const std::string& getColumnName(size_t index) const = 0;\n};\n\n\n\n// Implementation of AttributeColumn\n\nclass AttributeColumnImpl: public AttributeColumn, AttributeColumnStats\n{\n    // AttributeColumn interface\npublic:\n    AttributeColumnImpl(const std::string &name, const std::string &formula = std::string()) : m_name(name), m_locked(false), m_hidden(false), m_formula(formula)\n    {\n    }\n\n    AttributeColumnImpl() : m_locked(false), m_hidden(false)\n    {}\n    virtual const std::string &getName() const;\n    virtual bool isLocked() const;\n    virtual void setLock(bool lock);\n    virtual bool isHidden() const;\n    virtual void setHidden(bool hidden);\n    virtual const std::string &getFormula() const;\n    virtual void setFormula(std::string newFormula);\n    virtual const AttributeColumnStats& getStats() const;\n    virtual void setDisplayParams(const DisplayParams &params){ m_displayParams = params; }\n    virtual const DisplayParams &getDisplayParams() const{return m_displayParams;}\n\n    virtual void updateStats(float val, float oldVal = 0.0f) const;\n\npublic:\n    // stats are mutable - we need to be able to update them all the time,\n    // even when not allowed to modify the column settings\n    mutable AttributeColumnStats m_stats;\n\n    void setName(const std::string &name);\n    // returns the physical column for comaptibility with the old attribute table\n    size_t read(std::istream &stream);\n    void write(std::ostream& stream, int physicalCol);\n\nprivate:\n    std::string m_name;\n    bool m_locked;\n    bool m_hidden;\n    std::string m_formula;\n    DisplayParams m_displayParams;\n};\n\n// Implementation of AttributeColumn that actually links to the keys of the table\n\nclass KeyColumn : public AttributeColumnImpl\n{\npublic:\n    KeyColumn() : AttributeColumnImpl() { setName(AttributeName::REF); }\n};\n\n\n// Implementation of AttributeRow\nclass AttributeRowImpl : public AttributeRow\n{\npublic:\n    AttributeRowImpl(const AttributeColumnManager& colManager) : m_data(colManager.getNumColumns(), -1.0), m_colManager(colManager), m_selected(false)\n    {\n        m_layerKey = 1;\n    }\n\n    // AttributeRow interface\npublic:\n    virtual float getValue(const std::string &column) const;\n    virtual float getValue(size_t index) const;\n    virtual float getNormalisedValue(size_t index) const;\n    virtual AttributeRow& setValue(const std::string &column, float value);\n    virtual AttributeRow& setValue(size_t index, float value);\n    virtual AttributeRow& incrValue(const std::string &column, float value);\n    virtual AttributeRow& incrValue(size_t index, float value);\n    virtual AttributeRow& setSelection(bool selected);\n    virtual bool isSelected() const;\n\n    void addColumn();\n    void removeColumn(size_t index);\n\n    void read(std::istream &stream);\n    void write(std::ostream &stream);\n\nprivate:\n    std::vector<float> m_data;\n    const AttributeColumnManager& m_colManager;\n    bool m_selected;\n\n    void checkIndex(size_t index) const;\n\n};\n\n///\n/// \\brief Small struct to make an attribute key distinguishable from an int\n/// PixelRefs are serialised into an int (2 bytes x, 2 bytes y) for historic reason. This seems dangerous\n/// and confusing as these are by no means indices, but look the same to the compiler and the reader.\n/// This struct should disambiguate this...\n///\nstruct AttributeKey\n{\n    explicit AttributeKey(int val) : value(val)\n    {}\n    int value;\n\n    bool operator < (const AttributeKey& other ) const\n    {\n        return value < other.value;\n    }\n\n    void write(std::ostream &stream) const\n    {\n        stream.write((char *)&value, sizeof(int));\n    }\n\n    void read(std::istream &stream)\n    {\n        stream.read((char *)&value, sizeof(int));\n    }\n};\n\n///\n/// AttributeTable\n///\nclass AttributeTable : public AttributeColumnManager\n{\n    // AttributeTable \"interface\" - the actual table handling\npublic:\n    AttributeTable(){}\n    virtual ~AttributeTable(){}\n    AttributeTable(AttributeTable&&) = default;\n    AttributeTable& operator =(AttributeTable&&) = default;\n    AttributeTable(const AttributeTable& ) = delete;\n    AttributeTable& operator =(const AttributeTable&) = delete;\n\n    ///\n    /// \\brief Get a row reference\n    /// \\param key of the row\n    /// \\return reference to row, throws if key not found\n    ///\n    AttributeRow& getRow(const AttributeKey& key );\n\n    ///\n    /// \\brief Get a row const reference\n    /// \\param key of the row\n    /// \\return const reference to row, throws if key not found\n    ///\n    const AttributeRow& getRow(const AttributeKey& key) const;\n\n    ///\n    /// \\brief Get a row pointer\n    /// \\param key of the row\n    /// \\return pointer to row, null if key not found\n    ///\n    AttributeRow* getRowPtr(const AttributeKey& key);\n\n    ///\n    /// \\brief Get a row const pointer\n    /// \\param key of the row\n    /// \\return const pointer to row, null if key not found\n    ///\n    const AttributeRow* getRowPtr(const AttributeKey& key)const;\n    AttributeRow &addRow(const AttributeKey& key);\n    AttributeColumn& getColumn(size_t index);\n    size_t insertOrResetColumn(const std::string& columnName, const std::string &formula = std::string());\n    size_t insertOrResetLockedColumn(const std::string& columnName, const std::string &formula = std::string());\n    size_t getOrInsertColumn(const std::string& columnName, const std::string &formula = std::string());\n    size_t getOrInsertLockedColumn(const std::string& columnName, const std::string &formula = std::string());\n    void removeRow(const AttributeKey& key);\n    void removeColumn(size_t colIndex);\n    void renameColumn(const std::string& oldName, const std::string& newName);\n    size_t getNumRows() const { return m_rows.size(); }\n    void deselectAllRows();\n    const DisplayParams& getDisplayParams() const { return m_displayParams; }\n    void setDisplayParams(const DisplayParams& params){m_displayParams = params;}\n    void setDisplayParamsForAllAttributes(const DisplayParams& params);\n    void read(std::istream &stream, LayerManager &layerManager);\n    void write(std::ostream &stream, const LayerManager &layerManager);\n    void clear();\n    float getSelAvg(size_t columnIndex) {\n        float selTotal = 0;\n        int selNum = 0;\n        for(auto& pair: m_rows) {\n            if(pair.second->isSelected()) {\n                selTotal += pair.second->getValue(columnIndex);\n                selNum++;\n            }\n        }\n        if(selNum == 0) {\n            return(-1);\n        }\n        return(selTotal/selNum);\n    }\n\n// interface AttributeColumnManager\npublic:\n    virtual size_t getColumnIndex(const std::string& name) const;\n    virtual const AttributeColumn& getColumn(size_t index) const;\n    virtual const std::string& getColumnName(size_t index) const;\n    virtual size_t getNumColumns() const;\n    virtual bool hasColumn(const std::string &name) const;\n\n    // TODO: Compatibility. Very inefficient method to retreive a column's index\n    // if the set of columns was sorted\n    size_t getColumnSortedIndex(size_t index) const;\n\nprivate:\n    typedef std::map<AttributeKey, std::unique_ptr<AttributeRowImpl>> StorageType;\n    StorageType m_rows;\n    std::map<std::string, size_t> m_columnMapping;\n    std::vector<AttributeColumnImpl> m_columns;\n    KeyColumn m_keyColumn;\n    DisplayParams m_displayParams;\n\nprivate:\n    void checkColumnIndex(size_t index) const;\n    size_t addColumnInternal(const std::string &name, const std::string &formula);\n\n// warning - here be dragons!\n// This is the implementation of stl style iterators on attribute table, allowing efficient\n// iteration of rows without resorting to log(n) access via the map\n\n\npublic:\n    ///\n    /// \\brief The iterator_item class\n    /// The value of an iterator over the table - we want to hide the actual storage details and just\n    /// return references to rows and keys.\n    class iterator_item\n    {\n    public:\n        virtual const AttributeKey& getKey() const = 0;\n        virtual const AttributeRow& getRow() const = 0;\n        virtual AttributeRow& getRow() = 0;\n        virtual ~iterator_item(){}\n    };\nprivate:\n    // implementation of the iterator_item, templated on iterator type to allow const and non-const iterator\n    template <typename iterator_type>\n    class iterator_item_impl : public iterator_item\n    {\n    public:\n        iterator_item_impl( const iterator_type & iter) : m_iter(iter)\n        {}\n        template<typename other_type> iterator_item_impl(const iterator_item_impl<other_type>& other) : m_iter(other.m_iter)\n        {}\n\n        template<typename other_type> iterator_item_impl<iterator_type>& operator = (const iterator_item_impl<other_type>& other)\n        {\n            m_iter = other.m_iter;\n            return *this;\n        }\n\n\n        const AttributeKey& getKey() const\n        {\n            return m_iter->first;\n        }\n\n        const AttributeRow& getRow() const\n        {\n            return *m_iter->second;\n        }\n\n       AttributeRow& getRow()\n       {\n           return *m_iter->second;\n       }\n\n        void forward() const\n        {\n            ++m_iter;\n        }\n\n        void back() const\n        {\n            --m_iter;\n        }\n\n        template<typename other_type> bool operator == (const iterator_item_impl<other_type> &other) const\n        {\n            return m_iter == other.m_iter;\n        }\n    public:\n        mutable iterator_type m_iter;\n    };\n\n\n    // iterator implementation - templated on iterator type for const/non-const\n    template <typename iterator_type>\n    class const_iterator_impl : public std::iterator<std::bidirectional_iterator_tag, iterator_item>\n    {\n        template<typename other_type> friend class const_iterator_impl;\n    public:\n        const_iterator_impl( const iterator_type& iter) : m_item(iter)\n        {}\n        template<typename other_type> const_iterator_impl(const const_iterator_impl<other_type>& other) : m_item(other.m_item)\n        {}\n        template<typename other_type> const_iterator_impl& operator =(const const_iterator_impl<other_type> &other)\n        {\n            m_item = other.m_item;\n            return *this;\n        }\n\n        const_iterator_impl& operator++() {m_item.forward();return *this;}\n        const_iterator_impl operator++(int) {const_iterator_impl<iterator_type> tmp(*this); operator++(); return tmp;}\n        const_iterator_impl& operator--() {m_item.back();return *this;}\n        const_iterator_impl operator--(int) {const_iterator_impl<iterator_type> tmp(*this); operator--(); return tmp;}\n        template<typename other_type> bool operator==(const const_iterator_impl<other_type>& rhs) const {return m_item == rhs.m_item;}\n        template<typename other_type> bool operator!=(const const_iterator_impl<other_type>& rhs) const {return !(m_item==rhs.m_item);}\n        const iterator_item& operator*() const {return m_item;}\n        const iterator_item* operator->() const {return &m_item;}\n\n    protected:\n        iterator_item_impl<iterator_type> m_item;\n    };\n\npublic:\n    // const iterator is just a typedef on the impl\n    typedef const_iterator_impl<typename StorageType::const_iterator> const_iterator;\n\n    // non const iterator needs some extra methods\n    class iterator : public const_iterator_impl<typename StorageType::iterator>\n    {\n    public:\n        iterator(const typename StorageType::iterator& iter) : const_iterator_impl<typename StorageType::iterator>(iter)\n        {}\n        template<typename other_type> iterator(const const_iterator_impl<other_type>& other) : const_iterator_impl<StorageType::iterator>(other.item){\n           // m_item = other.m_item;\n        }\n        template<typename other_type> iterator& operator =(const const_iterator_impl<other_type> &other)\n        {\n            const_iterator_impl<typename StorageType::iterator>::m_item = other.m_item;\n            return *this;\n        }\n        iterator_item& operator*() {return const_iterator_impl<typename StorageType::iterator>::m_item;}\n        iterator_item* operator->() {return &(const_iterator_impl<typename StorageType::iterator>::m_item);}\n    };\n\n    // stl style iteration methods\n    const_iterator begin() const\n    {\n        return const_iterator(m_rows.begin());\n    }\n\n    iterator begin()\n    {\n        return iterator(m_rows.begin());\n    }\n\n    const_iterator end() const\n    {\n        return const_iterator(m_rows.end());\n    }\n\n    iterator end()\n    {\n        return iterator(m_rows.end());\n    }\n\n    iterator find(AttributeKey key)\n    {\n        return iterator(m_rows.find(key));\n    }\n\n    std::pair<const AttributeKey, std::unique_ptr<AttributeRowImpl>>& back()\n    {\n        return *m_rows.rbegin();\n    }\n};\n\n"
  },
  {
    "path": "salalib/attributetablehelpers.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include \"attributetable.h\"\n#include \"attributetableview.h\"\n#include \"pafcolor.h\"\n#include \"mgraph_consts.h\"\n\nnamespace dXreimpl{\n    inline void pushSelectionToLayer(AttributeTable &table, LayerManager& layerManager, const std::string &layerName)\n    {\n        size_t layerIndex = layerManager.addLayer(layerName);\n        LayerManager::KeyType layerKey = layerManager.getKey(layerIndex);\n        for (auto & item: table)\n        {\n            auto& row = item.getRow();\n            if (isObjectVisible(layerManager, row) && row.isSelected())\n            {\n                addLayerToObject(item.getRow(), layerKey);\n            }\n        }\n\n        layerManager.setLayerVisible(layerIndex);\n    }\n\n    inline PafColor getDisplayColor( const AttributeKey& key, const AttributeRow& row, const AttributeTableView& tableView, bool checkSelectionStatus = false)\n    {\n        if ( checkSelectionStatus && row.isSelected())\n        {\n            return PafColor(SALA_SELECTED_COLOR);\n        }\n\n        PafColor color;\n        return color.makeColor(tableView.getNormalisedValue(key, row), tableView.getDisplayParams());\n\n    }\n\n}\n\nstruct OrderedIntPair\n{\n   int a;\n   int b;\n   OrderedIntPair(int x = -1, int y = -1) {\n      a = (int) x < y ? x : y;\n      b = (int) x < y ? y : x;\n   }\n   // inlined at end of file\n   friend bool operator == (const OrderedIntPair& x, const OrderedIntPair& y);\n   friend bool operator != (const OrderedIntPair& x, const OrderedIntPair& y);\n   friend bool operator <  (const OrderedIntPair& x, const OrderedIntPair& y);\n   friend bool operator >  (const OrderedIntPair& x, const OrderedIntPair& y);\n};\n\n// note: these are made with a is always less than b\ninline bool operator == (const OrderedIntPair& x, const OrderedIntPair& y)\n{\n   return (x.a == y.a && x.b == y.b);\n}\ninline bool operator != (const OrderedIntPair& x, const OrderedIntPair& y)\n{\n   return (x.a != y.a || x.b != y.b);\n}\ninline bool operator < (const OrderedIntPair& x, const OrderedIntPair& y)\n{\n   return ( (x.a == y.a) ? x.b < y.b : x.a < y.a );\n}\ninline bool operator > (const OrderedIntPair& x, const OrderedIntPair& y)\n{\n   return ( (x.a == y.a) ? x.b > y.b : x.a > y.a );\n}\n"
  },
  {
    "path": "salalib/attributetableindex.cpp",
    "content": "// Copyright (C) 2018 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n#include \"salalib/attributetableindex.h\"\n\nstd::vector<ConstAttributeIndexItem> makeAttributeIndex(const AttributeTable &table, int colIndex)\n{\n    std::vector<ConstAttributeIndexItem> index;\n    size_t numRows = table.getNumRows();\n    if (numRows == 0)\n    {\n        return index;\n    }\n    index.reserve(numRows);\n    // perturb the values to be sorted by so same values will be in order of appearence in the map\n    size_t idx = 0;\n    if ( colIndex == -1 )\n    {\n        double perturbationFactor = 1e-9 / numRows;\n        for (auto& item: table)\n        {\n            double value = (double)item.getKey().value;\n            value += idx * perturbationFactor;\n\n            index.push_back(ConstAttributeIndexItem(item.getKey(), value, item.getRow()));\n            ++idx;\n        }\n    }\n    else if (colIndex >= 0 )\n    {\n        double perturbationFactor = table.getColumn(colIndex).getStats().max * 1e-9 / numRows;\n        for (auto & item : table)\n        {\n            double value = item.getRow().getValue(colIndex);\n            value += idx * perturbationFactor;\n\n            index.push_back(ConstAttributeIndexItem(item.getKey(), value, item.getRow()));\n            ++idx;\n        }\n    }\n    else\n    {\n        throw std::out_of_range(\"Column index out of range\");\n    }\n    std::sort(index.begin(), index.end());\n    return index;\n}\n\nstd::vector<AttributeIndexItem> makeAttributeIndex(AttributeTable &table, int colIndex)\n{\n    std::vector<AttributeIndexItem> index;\n    size_t numRows = table.getNumRows();\n    if (numRows == 0)\n    {\n        return index;\n    }\n    index.reserve(numRows);\n    // perturb the values to be sorted by so same values will be in order of appearence in the map\n    size_t idx = 0;\n    if ( colIndex == -1 )\n    {\n        double perturbationFactor = 1e-9 / numRows;\n        for (auto& item: table)\n        {\n            double value = (double)item.getKey().value;\n            value += idx * perturbationFactor;\n\n            index.push_back(AttributeIndexItem(item.getKey(), value, item.getRow()));\n            ++idx;\n        }\n    }\n    else if (colIndex >= 0 )\n    {\n        double perturbationFactor = table.getColumn(colIndex).getStats().max * 1e-9 / numRows;\n        for (auto & item : table)\n        {\n            double value = item.getRow().getValue(colIndex);\n            value += idx * perturbationFactor;\n\n            index.push_back(AttributeIndexItem(item.getKey(), value, item.getRow()));\n            ++idx;\n        }\n    }\n    else\n    {\n        throw std::out_of_range(\"Column index out of range\");\n    }\n    std::sort(index.begin(), index.end());\n    return index;\n}\n\nstd::pair<std::vector<AttributeIndexItem>::iterator, std::vector<AttributeIndexItem>::iterator>\ngetIndexItemsInValueRange(std::vector<AttributeIndexItem> &index, AttributeTable &table, float fromValue,\n                          float toValue) {\n    AttributeKey dummykey(-1);\n    AttributeRowImpl dummyrow(table);\n    return std::pair<std::vector<AttributeIndexItem>::iterator, std::vector<AttributeIndexItem>::iterator>(\n        std::lower_bound(index.begin(), index.end(), AttributeIndexItem(dummykey, fromValue, dummyrow)),\n        std::upper_bound(index.begin(), index.end(), AttributeIndexItem(dummykey, toValue, dummyrow)));\n}\n"
  },
  {
    "path": "salalib/attributetableindex.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include \"attributetable.h\"\n#include <algorithm>\n\nclass ConstAttributeIndexItem\n{\npublic:\n    ConstAttributeIndexItem(const AttributeKey &k, double v, const AttributeRow &r) : key(k), value(v), row(&r)\n    {}\n\n    ConstAttributeIndexItem(const ConstAttributeIndexItem& other) : key(other.key), value(other.value), row(other.row)\n    {}\n    ConstAttributeIndexItem &operator = (const ConstAttributeIndexItem& other)\n    {\n        if ( this == &other)\n        {\n            return *this;\n        }\n        key = other.key;\n        value = other.value;\n        row = other.row;\n        return *this;\n    }\n\n    AttributeKey key;\n    double value;\n    const AttributeRow *  row;\n};\n\nclass AttributeIndexItem : public ConstAttributeIndexItem\n{\npublic:\n    AttributeIndexItem( const AttributeKey &k, double v, AttributeRow &r) : ConstAttributeIndexItem(k,v,r), mutable_row(&r)\n    {}\n    AttributeIndexItem( const AttributeIndexItem &other) : ConstAttributeIndexItem(other), mutable_row(other.mutable_row)\n    {}\n    AttributeIndexItem &operator = (const AttributeIndexItem &other)\n    {\n        if ( this == &other)\n        {\n            return *this;\n        }\n        ConstAttributeIndexItem::operator =(other);\n        mutable_row = other.mutable_row;\n        return *this;\n    }\n\n    AttributeRow *mutable_row;\n};\n\ninline bool operator < (const ConstAttributeIndexItem &lhs, const ConstAttributeIndexItem &rhs)\n{\n    return lhs.value < rhs.value;\n}\n\nstd::vector<ConstAttributeIndexItem> makeAttributeIndex(const AttributeTable &table, int colIndex);\nstd::vector<AttributeIndexItem> makeAttributeIndex(AttributeTable &table, int colIndex);\nstd::pair<std::vector<AttributeIndexItem>::iterator, std::vector<AttributeIndexItem>::iterator>\ngetIndexItemsInValueRange(std::vector<AttributeIndexItem> &index, AttributeTable &table, float fromValue,\n                          float toValue);\n"
  },
  {
    "path": "salalib/attributetableview.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"attributetableview.h\"\n\nAttributeTableView::AttributeTableView(const AttributeTable &table) : m_table(table), m_displayColumn(-1)\n{}\n\nvoid AttributeTableView::setDisplayColIndex(int columnIndex){\n    if (columnIndex < -1)\n    {\n        m_displayColumn = -2;\n        m_index.clear();\n        return;\n    }\n    // recalculate the index even if it's the same column in case stuff has changed\n    m_index = makeAttributeIndex(m_table, columnIndex);\n    m_displayColumn = columnIndex;\n}\n\nfloat AttributeTableView::getNormalisedValue(const AttributeKey &key, const AttributeRow &row) const\n{\n    if ( m_displayColumn < 0)\n    {\n        auto endIter = m_table.end();\n        --endIter;\n        return (float)key.value /(float) endIter->getKey().value;\n    }\n    return row.getNormalisedValue(m_displayColumn);\n}\n\nconst DisplayParams &AttributeTableView::getDisplayParams() const\n{\n    if (m_displayColumn < 0)\n    {\n        return m_table.getDisplayParams();\n    }\n    return m_table.getColumn(m_displayColumn).getDisplayParams();\n}\n\nvoid AttributeTableHandle::setDisplayColIndex(int columnIndex){\n    if (columnIndex < -1)\n    {\n        m_mutableIndex.clear();\n    }\n    else\n    {\n        // recalculate the index even if it's the same column in case stuff has changed\n        m_mutableIndex = makeAttributeIndex(m_mutableTable, columnIndex);\n    }\n    AttributeTableView::setDisplayColIndex(columnIndex);\n}\nint AttributeTableHandle::findInIndex(const AttributeKey &key) {\n\n    auto iter = std::find_if(m_mutableIndex.begin(), m_mutableIndex.end(), index_item_key(key));\n    if (iter != m_mutableIndex.end()) {\n        return(std::distance(m_mutableIndex.begin(), iter));\n    }\n    return -1;\n}\n"
  },
  {
    "path": "salalib/attributetableview.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"attributetable.h\"\n#include \"attributetableindex.h\"\n\n#include <functional>\n\nclass AttributeTableView\n{\npublic:\n    AttributeTableView(const AttributeTable& table );\n\n    const AttributeTable &m_table;\n\n    // columnIndex < 0 -> not set\n    virtual void setDisplayColIndex(int columnIndex);\n    int getDisplayColIndex() const{ return m_displayColumn;}\n\n    float getNormalisedValue(const AttributeKey& key, const AttributeRow &row) const;\n    const DisplayParams& getDisplayParams() const;\n\n    typedef std::vector<ConstAttributeIndexItem> ConstIndex;\n    const ConstIndex& getConstTableIndex() const{return m_index;}\n\n    const AttributeColumn& getDisplayedColumn() const;\n\nprivate:\n    ConstIndex m_index;\n    int m_displayColumn;\n};\n\nclass AttributeTableHandle : public AttributeTableView\n{\npublic:\n    AttributeTableHandle(AttributeTable &table) : AttributeTableView(table), m_mutableTable(table){}\n    virtual ~AttributeTableHandle(){}\n    typedef std::vector<AttributeIndexItem> Index;\n    const Index& getTableIndex() const {return m_mutableIndex;}\n    virtual void setDisplayColIndex(int columnIndex);\n    int findInIndex(const AttributeKey &key);\nprivate:\n    AttributeTable& m_mutableTable;\n    Index m_mutableIndex;\n\n};\n\nstruct index_item_key : public std::function<bool(AttributeKey)> {\n    explicit index_item_key(const AttributeKey &baseline) : m_baseline(baseline) {}\n    bool operator() (const AttributeIndexItem &arg) { return arg.key.value == m_baseline.value; }\n    const AttributeKey& m_baseline;\n};\n"
  },
  {
    "path": "salalib/axialmap.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n#include \"salalib/axialmap.h\"\r\n#include \"salalib/alllinemap.h\"\r\n#include \"salalib/tolerances.h\"\r\n#include \"salalib/pointdata.h\"   // need the pointdata for the convert boundary graph to axial map routine\r\n#include \"salalib/ngraph.h\"      // ditto ngraph\r\n#include \"salalib/parsers/mapinfodata.h\"\r\n\r\n#include \"genlib/comm.h\"  // For communicator\r\n#include \"genlib/stringutils.h\"\r\n#include \"genlib/containerutils.h\"\r\n#include \"genlib/readwritehelpers.h\"\r\n#include \"genlib/pflipper.h\"\r\n\r\n#include <math.h>\r\n#include <float.h>\r\n#include <time.h>\r\n\r\n#ifndef _WIN32\r\n#define _finite finite\r\n#endif\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nShapeGraph::ShapeGraph(const std::string& name, int type) : ShapeMap(name,type)\r\n{\r\n   m_keyvertexcount = 0;\r\n   m_hasgraph = true;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid ShapeGraph::initialiseAttributesAxial()\r\n{\r\n    m_attributes->clear();\r\n    // note, expects these to be numbered 0, 1...\r\n    m_attributes->insertOrResetLockedColumn(\"Connectivity\");\r\n    m_attributes->insertOrResetLockedColumn(\"Line Length\");\r\n\r\n}\r\n\r\nvoid ShapeGraph::makeConnections(const KeyVertices &keyvertices)\r\n{\r\n   m_connectors.clear();\r\n   m_links.clear();\r\n   m_unlinks.clear();\r\n   m_keyvertices.clear();\r\n\r\n   // note, expects these to be numbered 0, 1...\r\n   int conn_col = m_attributes->getColumnIndex(\"Connectivity\");\r\n   int leng_col = m_attributes->getColumnIndex(\"Line Length\");\r\n\r\n   int i = -1;\r\n   for (auto shape: m_shapes) {\r\n      i++;\r\n      int key = shape.first;\r\n      AttributeRow &row =\r\n          m_attributes->getRow(AttributeKey(key));\r\n      // all indices should match...\r\n      m_connectors.push_back( Connector() );\r\n      m_connectors[i].m_connections = getLineConnections( key, TOLERANCE_B*__max(m_region.height(),m_region.width()));\r\n      row.setValue(conn_col, float(m_connectors[i].m_connections.size()) );\r\n      row.setValue(leng_col, float(shape.second.getLine().length()) );\r\n      if (keyvertices.size()) {\r\n         // note: depends on lines being recorded in same order as keyvertices...\r\n         m_keyvertices.push_back( keyvertices[i] );\r\n      }\r\n   }\r\n\r\n   m_displayed_attribute = -1; // <- override if it's already showing\r\n   setDisplayedAttribute(conn_col);\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeGraph::outputMifPolygons(std::ostream& miffile, std::ostream& midfile) const\r\n{\r\n   // take lines from lines layer and make into regions (using the axial polygons)\r\n   std::vector<Line> lines;\r\n   for (auto shape: m_shapes) {\r\n      lines.push_back(shape.second.getLine());\r\n   }\r\n   AxialPolygons polygons;\r\n   polygons.init(lines, m_region);\r\n\r\n   std::vector<std::vector<Point2f>> newpolygons;\r\n   polygons.makePolygons(newpolygons);\r\n\r\n   MapInfoData mapinfodata;\r\n   if (m_hasMapInfoData) {\r\n      mapinfodata.m_coordsys = m_mapinfodata.m_coordsys;\r\n      mapinfodata.m_bounds = m_mapinfodata.m_bounds;\r\n   }\r\n   mapinfodata.exportPolygons(miffile, midfile, newpolygons, m_region);\r\n\r\n   return true;\r\n}\r\n\r\nvoid ShapeGraph::outputNet(std::ostream& netfile) const\r\n{\r\n   double maxdim = __max(m_region.width(),m_region.height());\r\n   Point2f offset = Point2f((maxdim - m_region.width())/(2.0*maxdim),(maxdim - m_region.height())/(2.0*maxdim));\r\n   if (isSegmentMap()) {\r\n      netfile << \"*Vertices \" << m_shapes.size() * 2 << std::endl;\r\n      int i = -1;\r\n      for (auto shape: m_shapes) {\r\n         i++;\r\n         Line li = shape.second.getLine();\r\n         Point2f p1 = li.start();\r\n         Point2f p2 = li.end();\r\n         p1.x = offset.x + (p1.x - m_region.bottom_left.x) / maxdim;\r\n         p2.x = offset.x + (p2.x - m_region.bottom_left.x) / maxdim;\r\n         p1.y = 1.0 - (offset.y + (p1.y - m_region.bottom_left.y) / maxdim);\r\n         p2.y = 1.0 - (offset.y + (p2.y - m_region.bottom_left.y) / maxdim);\r\n         netfile << (i * 2 + 1) << \" \\\"\" << i << \"a\\\" \" << p1.x << \" \" << p1.y << std::endl;\r\n         netfile << (i * 2 + 2) << \" \\\"\" << i << \"b\\\" \" << p2.x << \" \" << p2.y << std::endl;\r\n      }\r\n      netfile << \"*Edges\" << std::endl;\r\n      for (size_t i = 0; i < m_shapes.size(); i++) {\r\n         netfile << (i * 2 + 1) << \" \" << (i * 2 + 2) << \" 2\" << std::endl;\r\n      }\r\n      netfile << \"*Arcs\" << std::endl;\r\n      // this makes an assumption about which is the \"start\" and which is the \"end\"\r\n      // it works for an automatically converted axial map, I'm not sure it works for others...\r\n      for (size_t j = 0; j < m_connectors.size(); j++) {\r\n         const Connector& conn = m_connectors[j];\r\n         for (auto& segconn: conn.m_forward_segconns) {\r\n            SegmentRef ref = segconn.first;\r\n            float weight = segconn.second;\r\n            netfile << (j * 2 + 1) << \" \" << (ref.ref * 2 + ((ref.dir == 1) ? 1 : 2)) << \" \" << weight << std::endl;\r\n         }\r\n         for (auto& segconn: conn.m_back_segconns) {\r\n            SegmentRef ref = segconn.first;\r\n            float weight = segconn.second;\r\n            netfile << (j * 2 + 2) << \" \" << (ref.ref * 2 + ((ref.dir == 1) ? 1 : 2)) << \" \" << weight << std::endl;\r\n         }\r\n      }\r\n   }\r\n   else {\r\n      netfile << \"*Vertices \" << m_shapes.size() << std::endl;\r\n      int i = -1;\r\n      for (auto shape: m_shapes) {\r\n         i++;\r\n         Point2f p = shape.second.getCentroid();\r\n         p.x = offset.x + (p.x - m_region.bottom_left.x) / maxdim;\r\n         p.y = 1.0 - (offset.y + (p.y - m_region.bottom_left.y) / maxdim);\r\n         netfile << (i + 1) << \" \\\"\" << i << \"\\\" \" << p.x << \" \" << p.y << std::endl;\r\n      }\r\n      netfile << \"*Edges\" << std::endl;\r\n      for (size_t j = 0; j < m_connectors.size(); j++) {\r\n         const Connector& conn = m_connectors[j];\r\n         for (size_t k = 0; k < conn.m_connections.size(); k++) {\r\n            size_t to = conn.m_connections[k];\r\n            if (j < to) {\r\n               netfile << (j+1) << \" \" << (to + 1) << \" 1\" << std::endl;\r\n            }\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\nbool ShapeGraph::read(std::istream &stream)\r\n{\r\n   m_attributes->clear();\r\n   m_connectors.clear();\r\n   m_map_type = ShapeMap::EMPTYMAP;\r\n\r\n   // note that keyvertexcount and keyvertices are different things! (length keyvertices not the same as keyvertexcount!)\r\n   stream.read((char *)&m_keyvertexcount,sizeof(m_keyvertexcount));\r\n   int size;\r\n   stream.read((char *)&size,sizeof(size));\r\n   for (int i = 0; i < size; i++) {\r\n      std::vector<int> tempVec;\r\n      dXreadwrite::readIntoVector(stream, tempVec);\r\n      m_keyvertices.push_back(std::set<int>(tempVec.begin(), tempVec.end()));\r\n   }\r\n   // now base class read:\r\n   ShapeMap::read(stream);\r\n\r\n   return true;\r\n}\r\n\r\nbool ShapeGraph::readold( std::istream& stream)\r\n{\r\n   // read in from old base class\r\n   SpacePixel linemap;\r\n   linemap.read(stream);\r\n   const std::map<int,LineTest>& lines = linemap.getAllLines();\r\n\r\n   m_name = linemap.getName();\r\n\r\n   // now copy to new base class:\r\n   init(lines.size(),linemap.getRegion());\r\n   for (auto line: lines) {\r\n      makeLineShape(line.second.line);\r\n   }\r\n   // n.b., we now have to reclear attributes!\r\n   m_attributes->clear();\r\n\r\n   // continue old read:\r\n   int pushmap = -1;\r\n\r\n   char segmentmapc = stream.get();\r\n   if (segmentmapc == '1') {\r\n      m_map_type = ShapeMap::SEGMENTMAP;\r\n   }\r\n   else {\r\n      m_map_type = ShapeMap::AXIALMAP;\r\n   }\r\n\r\n   char gatemapc = stream.get();\r\n   if (gatemapc == '1') {\r\n      m_map_type = ShapeMap::DATAMAP;\r\n   }\r\n   stream.read((char *)&pushmap,sizeof(pushmap));\r\n\r\n\r\n   int displayed_attribute;  // n.b., temp variable necessary to force recalc below\r\n   stream.read((char *)&displayed_attribute,sizeof(displayed_attribute));\r\n\r\n   m_attributes->read(stream, m_layers);\r\n   int size;\r\n   stream.read((char *)&size,sizeof(size));\r\n   for (int j = 0; j < size; j++) {\r\n      m_keyvertices.push_back(std::set<int>());    // <- these were stored with the connector\r\n      int key;\r\n      stream.read((char *)&key,sizeof(key)); // <- key deprecated\r\n      m_connectors.push_back(Connector());\r\n      m_connectors[size_t(j)].read(stream);\r\n   }\r\n   stream.read((char *)&m_keyvertexcount,sizeof(m_keyvertexcount));\r\n\r\n\r\n   dXreadwrite::readIntoVector(stream,m_links);\r\n   dXreadwrite::readIntoVector(stream,m_unlinks);\r\n\r\n   char x = stream.get();\r\n   if (x == 'm') {\r\n      m_mapinfodata = MapInfoData();\r\n      m_mapinfodata.read(stream);\r\n      m_hasMapInfoData = true;\r\n   }\r\n\r\n\r\n   // now, as soon as loaded, must recalculate our screen display:\r\n   // note m_displayed_attribute should be -2 in order to force recalc...\r\n   m_displayed_attribute = -2;\r\n   setDisplayedAttribute(displayed_attribute);\r\n\r\n   return true;\r\n}\r\n\r\nbool ShapeGraph::write( std::ofstream& stream )\r\n{\r\n   // note keyvertexcount and keyvertices are different things!  (length keyvertices not the same as keyvertexcount!)\r\n   stream.write((char *)&m_keyvertexcount,sizeof(m_keyvertexcount));\r\n   int size = m_keyvertices.size();\r\n   stream.write((char *)&size,sizeof(size));\r\n   for (size_t i = 0; i < m_keyvertices.size(); i++) {\r\n      dXreadwrite::writeVector(stream, std::vector<int>( m_keyvertices[i].begin(), m_keyvertices[i].end() ));\r\n   }\r\n\r\n   // now simply run base class write:\r\n   ShapeMap::write(stream);\r\n\r\n   return true;\r\n}\r\n\r\nvoid ShapeGraph::writeAxialConnectionsAsDotGraph(std::ostream &stream)\r\n{\r\n    const std::vector<Connector>& connectors = ShapeMap::getConnections();\r\n\r\n    stream << \"strict graph {\" << std::endl;\r\n\r\n    stream.precision(12);\r\n\r\n    for (size_t i = 0; i < connectors.size(); i++) {\r\n        const std::vector<int>& connections = connectors[i].m_connections;\r\n        for (int connection: connections) {\r\n            stream << \"    \" << i << \" -- \" << connection << std::endl;\r\n        }\r\n    }\r\n    stream << \"}\" << std::endl;\r\n}\r\n\r\nvoid ShapeGraph::writeLinksUnlinksAsPairsCSV(std::ostream &stream, char delimiter) {\r\n    stream.precision(12);\r\n\r\n    stream << \"refA\" << delimiter << \"refB\" << delimiter << \"link\" << std::endl;\r\n\r\n    for (auto &link : m_links) {\r\n        stream << depthmapX::getMapAtIndex(m_shapes, link.a)->first << delimiter\r\n               << depthmapX::getMapAtIndex(m_shapes, link.b)->first << delimiter << \"1\" << std::endl;\r\n    }\r\n\r\n    for (auto &unlink : m_unlinks) {\r\n        stream << depthmapX::getMapAtIndex(m_shapes, unlink.a)->first << delimiter\r\n               << depthmapX::getMapAtIndex(m_shapes, unlink.b)->first << delimiter << \"0\" << std::endl;\r\n    }\r\n}\r\n\r\nvoid ShapeGraph::writeAxialConnectionsAsPairsCSV(std::ostream &stream)\r\n{\r\n    const std::vector<Connector>& connectors = ShapeMap::getConnections();\r\n\r\n    stream.precision(12);\r\n\r\n    stream << \"refA,refB\" << std::endl;\r\n\r\n    for (size_t i = 0; i < connectors.size(); i++) {\r\n        auto& connections = connectors[i].m_connections;\r\n        if (i != 0) stream << std::endl;\r\n        for (auto iter = connections.begin(); iter != connections.end(); ++iter) {\r\n            if (iter != connections.begin()) stream << std::endl;\r\n            stream << i << \",\" << *iter;\r\n        }\r\n    }\r\n}\r\n\r\nvoid ShapeGraph::writeSegmentConnectionsAsPairsCSV(std::ostream &stream)\r\n{\r\n    const std::vector<Connector>& connectors = ShapeMap::getConnections();\r\n\r\n    stream.precision(12);\r\n\r\n    stream << \"refA,refB,ss_weight,for_back,dir\";\r\n\r\n    // directed links\r\n    for (size_t i = 0; i < connectors.size(); i++) {\r\n        for (auto& segconn: connectors[i].m_forward_segconns) {\r\n            stream << std::endl;\r\n            stream << i << \",\" << segconn.first.ref\r\n                   << \",\" << segconn.second\r\n                   << \",\" << 0 // forward\r\n                   << \",\" << int(segconn.first.dir);\r\n        }\r\n\r\n        for (auto& segconn: connectors[i].m_back_segconns) {\r\n            stream << std::endl;\r\n            stream << i << \",\" << segconn.first.ref\r\n                   << \",\" << segconn.second\r\n                   << \",\" << 1 // back\r\n                   << \",\" << int(segconn.first.dir);\r\n        }\r\n    }\r\n}\r\n\r\nvoid ShapeGraph::unlinkAtPoint(const Point2f& unlinkPoint) {\r\n    std::vector<Point2f> closepoints;\r\n    std::vector<std::pair<int, int>> intersections;\r\n    PixelRef pix = pixelate(unlinkPoint);\r\n    std::vector<ShapeRef>& pix_shapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n    auto iter = pix_shapes.begin();\r\n    for (; iter != pix_shapes.end(); ++iter) {\r\n       for (auto jter = iter; jter != pix_shapes.end(); ++jter) {\r\n          auto aIter = m_shapes.find(int(iter->m_shape_ref));\r\n          auto bIter = m_shapes.find(int(jter->m_shape_ref));\r\n          int a = int(std::distance(m_shapes.begin(), aIter));\r\n          int b = int(std::distance(m_shapes.begin(), bIter));\r\n          auto& connections = m_connectors[size_t(a)].m_connections;\r\n          if (aIter != m_shapes.end() && bIter != m_shapes.end()\r\n                  && aIter->second.isLine() && bIter->second.isLine()\r\n                  && std::find(connections.begin(), connections.end(), b) != connections.end()) {\r\n             closepoints.push_back( intersection_point(aIter->second.getLine(), bIter->second.getLine(), TOLERANCE_A) );\r\n             intersections.push_back( std::pair<int, int>(a,b) );\r\n          }\r\n       }\r\n    }\r\n    double mindist = -1.0;\r\n    int minpair = -1;\r\n    int j = 0;\r\n    for (auto& closepoint: closepoints) {\r\n       if (minpair == -1 || dist(unlinkPoint,closepoint) < mindist) {\r\n          mindist = dist(unlinkPoint,closepoint);\r\n          minpair = j;\r\n       }\r\n       j++;\r\n    }\r\n    if (minpair != -1) {\r\n       auto& intersection = intersections[size_t(minpair)];\r\n       unlinkShapes(intersection.first, intersection.second, false);\r\n    }\r\n    else {\r\n       std::cerr << \"eek!\";\r\n    }\r\n}\r\n////////////////////////////////////////////////////////////////////////////\r\n\r\n// this unlink options was originally excised on the version 7 recode\r\n// however, it is *very specific* to axial maps, and so have been reincluded here\r\n\r\nvoid ShapeGraph::unlinkFromShapeMap(const ShapeMap& shapemap)\r\n{\r\n   // used to make a shape map from every axial intersection,\r\n\r\n   // find lines in rough vincinity of unlink point, and check for the closest\r\n   // pair to unlink:\r\n\r\n   const std::map<int,SalaShape>& polygons = shapemap.getAllShapes();\r\n   for (auto polygon: polygons) {\r\n      // just use the points:\r\n      if (polygon.second.isPoint()) {\r\n         unlinkAtPoint(polygon.second.getPoint());\r\n      }\r\n   }\r\n\r\n   // reset displayed attribute if it happens to be \"Connectivity\":\r\n   int conn_col = m_attributes->getColumnIndex(\"Connectivity\");\r\n   if (getDisplayedAttribute() == conn_col) {\r\n      invalidateDisplayedAttribute();\r\n      setDisplayedAttribute(conn_col);  // <- reflect changes to connectivity counts\r\n   }\r\n}\r\n\r\n\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Two ways to make a segment map\r\n\r\n// Method 1: direct linkage of endpoints where they touch\r\n\r\nvoid ShapeGraph::makeNewSegMap(Communicator *comm) {\r\n    // now make a connection set from the ends of lines:\r\n    struct LineConnector {\r\n        const Line &m_line;\r\n        Connector &m_connector;\r\n        int m_index;\r\n        LineConnector(const Line &line, Connector &connector, int index)\r\n            : m_line(line), m_connector(connector), m_index(index) {}\r\n    };\r\n\r\n    std::vector<Connector> connectionset;\r\n    for (auto &shape : m_shapes) {\r\n        if (shape.second.isLine()) {\r\n            connectionset.emplace_back();\r\n        }\r\n    }\r\n    std::map<size_t, LineConnector> lineConnectors;\r\n    auto connectionIter = connectionset.begin();\r\n    int connectionIdx = 0;\r\n    for (auto &shape : m_shapes) {\r\n        if (shape.second.isLine()) {\r\n            lineConnectors.insert(std::make_pair(\r\n                shape.first, LineConnector(shape.second.getLine(), *connectionIter, connectionIdx)));\r\n            connectionIter++;\r\n            connectionIdx++;\r\n        }\r\n    }\r\n\r\n    time_t atime = 0;\r\n    if (comm) {\r\n        qtimer(atime, 0);\r\n        comm->CommPostMessage(Communicator::NUM_RECORDS, lineConnectors.size());\r\n    }\r\n\r\n    double maxdim = __max(m_region.width(), m_region.height());\r\n\r\n    int count = 0;\r\n    for (auto &lineConnector_a : lineConnectors) {\r\n        Connector &connectionset_a = lineConnector_a.second.m_connector;\r\n        const Line &line_a = lineConnector_a.second.m_line;\r\n        int idx_a = lineConnector_a.second.m_index;\r\n        // n.b., vector() is based on t_start and t_end, so we must use t_start and t_end here and throughout\r\n        PixelRef pix1 = pixelate(line_a.t_start());\r\n        std::vector<ShapeRef> &shapes1 = m_pixel_shapes(static_cast<size_t>(pix1.y), static_cast<size_t>(pix1.x));\r\n        for (auto &shape : shapes1) {\r\n            auto lineConnector_b = lineConnectors.find(shape.m_shape_ref);\r\n            if (lineConnector_b != lineConnectors.end() && idx_a < lineConnector_b->second.m_index) {\r\n\r\n                Connector &connectionset_b = lineConnector_b->second.m_connector;\r\n                const Line &line_b = lineConnector_b->second.m_line;\r\n                int idx_b = lineConnector_b->second.m_index;\r\n\r\n                Point2f alpha = line_a.vector();\r\n                Point2f beta = line_b.vector();\r\n                alpha.normalise();\r\n                beta.normalise();\r\n                if (approxeq(line_a.t_start(), line_b.t_start(), (maxdim * TOLERANCE_B))) {\r\n                    float x = float(2.0 * acos(__min(__max(-dot(alpha, beta), -1.0), 1.0)) / M_PI);\r\n                    depthmapX::addIfNotExists(connectionset_a.m_back_segconns, SegmentRef(1, idx_b), x);\r\n                    depthmapX::addIfNotExists(connectionset_b.m_back_segconns, SegmentRef(1, idx_a), x);\r\n                }\r\n                if (approxeq(line_a.t_start(), line_b.t_end(), (maxdim * TOLERANCE_B))) {\r\n                    float x = float(2.0 * acos(__min(__max(-dot(alpha, -beta), -1.0), 1.0)) / M_PI);\r\n                    depthmapX::addIfNotExists(connectionset_a.m_back_segconns, SegmentRef(-1, idx_b), x);\r\n                    depthmapX::addIfNotExists(connectionset_b.m_forward_segconns, SegmentRef(1, idx_a), x);\r\n                }\r\n            }\r\n        }\r\n\r\n        PixelRef pix2 = pixelate(line_a.t_end());\r\n        std::vector<ShapeRef> &shapes2 = m_pixel_shapes(static_cast<size_t>(pix2.y), static_cast<size_t>(pix2.x));\r\n        for (auto &shape : shapes2) {\r\n            auto lineConnector_b = lineConnectors.find(shape.m_shape_ref);\r\n            if (lineConnector_b != lineConnectors.end() && idx_a < lineConnector_b->second.m_index) {\r\n\r\n                Connector &connectionset_b = lineConnector_b->second.m_connector;\r\n                const Line &line_b = lineConnector_b->second.m_line;\r\n                int idx_b = lineConnector_b->second.m_index;\r\n\r\n                Point2f alpha = line_a.vector();\r\n                Point2f beta = line_b.vector();\r\n\r\n                alpha.normalise();\r\n                beta.normalise();\r\n                if (approxeq(line_a.t_end(), line_b.t_start(), (maxdim * TOLERANCE_B))) {\r\n                    float x = float(2.0 * acos(__min(__max(-dot(-alpha, beta), -1.0), 1.0)) / M_PI);\r\n                    depthmapX::addIfNotExists(connectionset_a.m_forward_segconns, SegmentRef(1, idx_b), x);\r\n                    depthmapX::addIfNotExists(connectionset_b.m_back_segconns, SegmentRef(-1, idx_a), x);\r\n                }\r\n                if (approxeq(line_a.t_end(), line_b.t_end(), (maxdim * TOLERANCE_B))) {\r\n                    float x = float(2.0 * acos(__min(__max(-dot(-alpha, -beta), -1.0), 1.0)) / M_PI);\r\n                    depthmapX::addIfNotExists(connectionset_a.m_forward_segconns, SegmentRef(-1, idx_b), x);\r\n                    depthmapX::addIfNotExists(connectionset_b.m_forward_segconns, SegmentRef(-1, idx_a), x);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (comm) {\r\n            if (qtimer(atime, 500)) {\r\n                if (comm->IsCancelled()) {\r\n                    throw Communicator::CancelledException();\r\n                }\r\n                comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\r\n            }\r\n        }\r\n        count++;\r\n    }\r\n\r\n    // initialise attributes now separated from making the connections\r\n    makeSegmentConnections(connectionset);\r\n}\r\n\r\n// Method 2: Making a segment map (in two stages)\r\n\r\n// One: take the original axial map and split it up\r\n// (note: you need to start from an axial map,\r\n//  but the map could have been created from a road-centre-line\r\n//  graph or equivalent -- reason is that you might want to\r\n//  preserve unlinks in your angular mapping)\r\n\r\n// A \"linetest\" is used in order to use the test component to\r\n// identify the original axial line this line segment is\r\n// associated with\r\n\r\nvoid ShapeGraph::makeSegmentMap(std::vector<Line>& lines, std::vector<Connector>& connectors, double stubremoval)\r\n{\r\n   // the first (key) pair is the line / line intersection, second is the pair of associated segments for the first line\r\n   std::map<OrderedIntPair, std::pair<int, int>> segmentlist;\r\n\r\n   // this code relies on the polygon order being the same as the connections\r\n\r\n   auto iter = m_shapes.begin();\r\n   for (size_t i = 0; i < m_connectors.size(); i++) {\r\n      auto shape = iter->second;\r\n      int axialRef = iter->first;\r\n      iter++;\r\n      if (!shape.isLine()) {\r\n         continue;\r\n      }\r\n      const Line& line = shape.getLine();\r\n      std::vector<std::pair<double,int> > breaks; // this is a vector instead of a map because the\r\n                                                  // original code allowed for duplicate keys\r\n      int axis = line.width() >= line.height() ? XAXIS : YAXIS;\r\n      // we need the breaks ordered from start to end of the line\r\n      // this is automatic for XAXIS, but on YAXIS, need to know\r\n      // if the line is ascending or decending\r\n      int parity = (axis == XAXIS) ? 1 : line.sign();\r\n\r\n      auto& connections = m_connectors[i].m_connections;\r\n      for (size_t j = 0; j < connections.size(); j++) {\r\n         // find the intersection point and add...\r\n         // note: more than one break at the same place allowed\r\n         auto shapeJ = depthmapX::getMapAtIndex(m_shapes, connections[j])->second;\r\n         if (static_cast<int>(i) != connections[j] && shapeJ.isLine()) {\r\n            breaks.push_back(std::make_pair(parity * line.intersection_point( shapeJ.getLine(), axis, TOLERANCE_A ),\r\n                                         connections[j]));\r\n         }\r\n      }\r\n      std::sort(breaks.begin(), breaks.end());\r\n      // okay, now we have a list from one end of the other of lines this line connects with\r\n      Point2f lastpoint = line.start();\r\n      int seg_a = -1, seg_b = -1;\r\n      double neardist;\r\n      // TOLERANCE_C is introduced as of 01.08.2008 although it is a fix to a bug first\r\n      // found in July 2006.  It has been set \"high\" deliberately (1e-6 = a millionth of the line height / width)\r\n      // in order to catch small errors made by operators or floating point errors in other systems\r\n      // when drawing, for example, three axial lines intersecting\r\n      if  (stubremoval == 0.0) {\r\n         // if 0, convert to tolerance\r\n         stubremoval = TOLERANCE_C;\r\n      }\r\n      neardist = (axis == XAXIS) ? (line.width() * stubremoval) : (line.height() * stubremoval);\r\n      double overlapdist = (axis == XAXIS) ? (line.width() * TOLERANCE_C) : (line.height() * TOLERANCE_C);\r\n      //\r\n      for (auto breaksIter = breaks.begin(); breaksIter != breaks.end();) {\r\n         std::vector<int> keylist;\r\n         if (seg_a == -1) {\r\n            Point2f thispoint = line.point_on_line(parity * breaksIter->first,axis);\r\n            if (fabs(parity * breaksIter->first - line.start()[axis]) < neardist) {\r\n               seg_a = -1;\r\n               lastpoint = thispoint;\r\n            }\r\n            else  {\r\n               Line segment_a(line.start(),thispoint);\r\n               lines.push_back(segment_a);\r\n               connectors.push_back(Connector(axialRef));\r\n               seg_a = lines.size() - 1;\r\n            }\r\n            lastpoint = thispoint;\r\n         }\r\n         //\r\n         double here = parity * breaksIter->first;\r\n         while (breaksIter != breaks.end() && fabs(parity * breaksIter->first - here) < overlapdist) {\r\n            keylist.push_back(breaksIter->second);\r\n            ++breaksIter;\r\n         }\r\n         //\r\n         if (breaksIter == breaks.end() && fabs(line.end()[axis] - parity * breaks.rbegin()->first) < neardist) {\r\n            seg_b = -1;\r\n         }\r\n         else {\r\n            Point2f thispoint;\r\n            if (breaksIter != breaks.end()) {\r\n               thispoint = line.point_on_line(parity * breaksIter->first,axis);\r\n            }\r\n            else {\r\n               thispoint = line.end();\r\n            }\r\n            Line segment_b(lastpoint,thispoint);\r\n            lines.push_back(segment_b);\r\n            connectors.push_back(Connector(axialRef));\r\n            seg_b = lines.size() - 1;\r\n            //\r\n            lastpoint = thispoint;\r\n         }\r\n         //\r\n         for (size_t j = 0; j < keylist.size(); j++) {\r\n         //\r\n            if (keylist[j] < (int)i) {\r\n               // other line already segmented, look up in segment list,\r\n               // and join segments together nicely\r\n               auto segIter = segmentlist.find(OrderedIntPair(keylist[j],i));\r\n               if (segIter != segmentlist.end()) {   // <- if it isn't -1 something has gone badly wrong!\r\n                  int seg_1 = segIter->second.first;\r\n                  int seg_2 = segIter->second.second;\r\n                  if (seg_a != -1) {\r\n                     if (seg_1 != -1) {\r\n                        Point2f alpha = lines[size_t(seg_a)].start() - lines[size_t(seg_a)].end();\r\n                        Point2f beta  = lines[size_t(seg_1)].start() - lines[size_t(seg_1)].end();\r\n                        alpha.normalise();\r\n                        beta.normalise();\r\n                        float x = float(2.0 * acos(__min(__max(-dot(alpha,beta),-1.0),1.0)) / M_PI);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_a)].m_forward_segconns, SegmentRef(-1,seg_1), x);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_1)].m_forward_segconns, SegmentRef(-1,seg_a), x);\r\n                     }\r\n                     if (seg_2 != -1) {\r\n                        Point2f alpha = lines[size_t(seg_a)].start() - lines[size_t(seg_a)].end();\r\n                        Point2f beta  = lines[size_t(seg_2)].end() - lines[size_t(seg_2)].start();\r\n                        alpha.normalise();\r\n                        beta.normalise();\r\n                        float x = float(2.0 * acos(__min(__max(-dot(alpha,beta),-1.0),1.0)) / M_PI);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_a)].m_forward_segconns, SegmentRef(1,seg_2), x);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_2)].m_back_segconns, SegmentRef(-1,seg_a), x);\r\n                     }\r\n                  }\r\n                  if (seg_b != -1) {\r\n                     if (seg_1 != -1) {\r\n                        Point2f alpha = lines[size_t(seg_b)].end() - lines[size_t(seg_b)].start();\r\n                        Point2f beta  = lines[size_t(seg_1)].start() - lines[size_t(seg_1)].end();\r\n                        alpha.normalise();\r\n                        beta.normalise();\r\n                        float x = float(2.0 * acos(__min(__max(-dot(alpha,beta),-1.0),1.0)) / M_PI);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_b)].m_back_segconns, SegmentRef(-1,seg_1), x);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_1)].m_forward_segconns, SegmentRef(1,seg_b), x);\r\n                     }\r\n                     if (seg_2 != -1) {\r\n                        Point2f alpha = lines[size_t(seg_b)].end() - lines[size_t(seg_b)].start();\r\n                        Point2f beta  = lines[size_t(seg_2)].end() - lines[size_t(seg_2)].start();\r\n                        alpha.normalise();\r\n                        beta.normalise();\r\n                        float x = float(2.0 * acos(__min(__max(-dot(alpha,beta),-1.0),1.0)) / M_PI);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_b)].m_back_segconns, SegmentRef(1,seg_2), x);\r\n                        depthmapX::addIfNotExists(connectors[size_t(seg_2)].m_back_segconns, SegmentRef(1,seg_b), x);\r\n                     }\r\n                  }\r\n               }\r\n            }\r\n            else {\r\n               // other line still to be segmented, add ourselves to segment list\r\n               // to be added later\r\n               segmentlist.insert(std::make_pair( OrderedIntPair(i,keylist[j]), std::pair<int, int>(seg_a,seg_b) ));\r\n            }\r\n         }\r\n         if (seg_a != -1 && seg_b != -1) {\r\n            depthmapX::addIfNotExists(connectors[size_t(seg_a)].m_forward_segconns, SegmentRef(1,seg_b), 0.0f);\r\n            depthmapX::addIfNotExists(connectors[size_t(seg_b)].m_back_segconns, SegmentRef(-1,seg_a), 0.0f);\r\n         }\r\n         seg_a = seg_b;\r\n      }\r\n   }\r\n}\r\n\r\nvoid ShapeGraph::initialiseAttributesSegment()\r\n{\r\n    m_attributes->clear();\r\n\r\n    // note, expects these in alphabetical order to preserve numbering:\r\n    m_attributes->insertOrResetLockedColumn(\"Axial Line Ref\");\r\n    m_attributes->insertOrResetLockedColumn(\"Segment Length\");\r\n}\r\n\r\n// now segments and connections are listed separately...\r\n// put them together in a new map\r\n\r\nvoid ShapeGraph::makeSegmentConnections(std::vector<Connector>& connectionset)\r\n{\r\n   m_connectors.clear();\r\n\r\n   // note, expects these in alphabetical order to preserve numbering:\r\n   int w_conn_col = m_attributes->getOrInsertColumn(\"Angular Connectivity\");\r\n   int uw_conn_col = m_attributes->getOrInsertLockedColumn(\"Connectivity\");\r\n\r\n   int ref_col = m_attributes->getColumnIndex(\"Axial Line Ref\");\r\n   int leng_col = m_attributes->getColumnIndex(\"Segment Length\");\r\n\r\n   int i = -1;\r\n   for (auto shape: m_shapes) {\r\n       i++;\r\n       Connector& connector = connectionset[size_t(i)];\r\n      AttributeRow& row = m_attributes->getRow(AttributeKey(shape.first));\r\n\r\n      row.setValue(ref_col, float(connector.m_segment_axialref));\r\n      row.setValue(leng_col, float(shape.second.getLine().length()));\r\n\r\n      // all indices should match... (including lineset/connectionset versus m_shapes)\r\n      m_connectors.push_back( connector );\r\n      float total_weight = 0.0f;\r\n      for (auto iter = connector.m_forward_segconns.begin(); iter != connector.m_forward_segconns.end(); ++iter) {\r\n         total_weight += iter->second;\r\n      }\r\n      for (auto iter = connector.m_back_segconns.begin(); iter != connector.m_back_segconns.end(); ++iter) {\r\n         total_weight += iter->second;\r\n      }\r\n      row.setValue(w_conn_col, float(total_weight));\r\n      row.setValue(uw_conn_col, float(connector.m_forward_segconns.size() + connector.m_back_segconns.size()));\r\n\r\n      // free up connectionset as we go along:\r\n      connectionset[size_t(i)] = Connector();\r\n   }\r\n\r\n   m_displayed_attribute = -2; // <- override if it's already showing\r\n   setDisplayedAttribute(uw_conn_col);\r\n}\r\n\r\n// this pushes axial map values to a segment map\r\n// the segment map is 'this', the axial map is passed:\r\n\r\nvoid ShapeGraph::pushAxialValues(ShapeGraph& axialmap)\r\n{\r\n   if (!m_attributes->hasColumn(\"Axial Line Ref\")) {\r\n      // this should never happen\r\n      // AT: I am converting this to throw an error\r\n      throw depthmapX::RuntimeException(\"Axial line ref does not exist\");\r\n   }\r\n\r\n   std::vector<int> colindices;\r\n   for (size_t i = 0; i < axialmap.m_attributes->getNumColumns(); i++) {\r\n      std::string colname = std::string(\"Axial \") + axialmap.m_attributes->getColumnName(i);\r\n      colindices.push_back(m_attributes->getOrInsertColumn(colname));\r\n   }\r\n   for (auto iter = m_attributes->begin(); iter != m_attributes->end(); iter++) {\r\n      int axialref = (int) iter->getRow().getValue(\"Axial Line Ref\");\r\n      // P.K: The original code here got the index of the row, but the column\r\n      // \"Axial Line Ref\" should actually contain keys, not indices\r\n      AttributeRow& row = axialmap.m_attributes->getRow(AttributeKey(axialref));\r\n      for (size_t k = 0; k < axialmap.m_attributes->getNumColumns(); k++) {\r\n         float val = row.getValue(k);\r\n         // need to look up the column index:\r\n         iter->getRow().setValue(colindices[k],val);\r\n      }\r\n   }\r\n}\r\n"
  },
  {
    "path": "salalib/axialmap.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#pragma once\r\n\r\n#include \"salalib/spacepixfile.h\"\r\n#include \"salalib/spacepix.h\"\r\n#include \"salalib/connector.h\"\r\n\r\nstruct AxialVertex;\r\nstruct AxialVertexKey;\r\nstruct RadialLine;\r\nstruct PolyConnector;\r\n\r\n// used during angular analysis\r\nstruct AnalysisInfo\r\n{\r\n   // lists used for multiple radius analysis\r\n   bool leaf;\r\n   bool choicecovered;\r\n   SegmentRef previous;\r\n   int depth;\r\n   double choice;            \r\n   double weighted_choice;\r\n   double weighted_choice2; //EFEF\r\n   AnalysisInfo() {\r\n      choicecovered = false; leaf = true; previous = SegmentRef(); depth = 0; choice = 0.0; weighted_choice = 0.0; weighted_choice2 = 0.0; \r\n   }\r\n   void clearLine() {\r\n      choicecovered = false; leaf = true; previous = SegmentRef(); depth = 0; // choice values are cummulative and not cleared\r\n   }\r\n};\r\n\r\nclass MapInfoData;\r\n\r\ntypedef std::vector<std::set<int>> KeyVertices;\r\n\r\nclass ShapeGraph : public ShapeMap\r\n{\r\n   friend class AxialMinimiser;\r\n   friend class MapInfoData;\r\nprotected:\r\n   KeyVertices m_keyvertices;       // but still need to return keyvertices here\r\n   int m_keyvertexcount;\r\nprotected:\r\npublic:\r\n   bool outputMifPolygons(std::ostream& miffile, std::ostream& midfile) const;\r\n   void outputNet(std::ostream& netfile) const;\r\npublic:\r\n   ShapeGraph(const std::string& name = \"<axial map>\", int type = ShapeMap::AXIALMAP);\r\n   virtual ~ShapeGraph() {;}\r\n   void initialiseAttributesAxial();\r\n   void makeConnections(const KeyVertices &keyvertices = KeyVertices());\r\n   bool stepdepth(Communicator *comm = NULL);\r\n   // lineset and connectionset are filled in by segment map\r\n   void makeNewSegMap(Communicator *comm);\r\n   void makeSegmentMap(std::vector<Line> &lines, std::vector<Connector> &connectors, double stubremoval);\r\n   void initialiseAttributesSegment();\r\n   void makeSegmentConnections(std::vector<Connector> &connectionset);\r\n   void pushAxialValues(ShapeGraph& axialmap);\r\n   //\r\n   virtual bool read(std::istream& stream);\r\n   bool readold(std::istream& stream);\r\n   virtual bool write(std::ofstream& stream);\r\n   void writeAxialConnectionsAsDotGraph(std::ostream &stream);\r\n   void writeAxialConnectionsAsPairsCSV(std::ostream &stream);\r\n   void writeSegmentConnectionsAsPairsCSV(std::ostream &stream);\r\n   void writeLinksUnlinksAsPairsCSV(std::ostream &stream, char delimiter = ',');\r\n   void unlinkAtPoint(const Point2f& unlinkPoint);\r\n   void unlinkFromShapeMap(const ShapeMap& shapemap);\r\n};\r\n"
  },
  {
    "path": "salalib/axialminimiser.cpp",
    "content": "#include \"salalib/axialminimiser.h\"\n#include \"salalib/tolerances.h\"\n\nstatic int compareValueTriplet(const void *p1, const void *p2)\n{\n   ValueTriplet *vp1 = (ValueTriplet *) p1;\n   ValueTriplet *vp2 = (ValueTriplet *) p2;\n   return (vp1->value1 > vp2->value1 ? 1 : vp1->value1 < vp2->value1 ? -1 :\n          (vp1->value2 > vp2->value2 ? 1 : vp1->value2 < vp2->value2 ? -1 : 0));\n}\n\nAxialMinimiser::AxialMinimiser(const AllLineMap& alllinemap, int no_of_axsegcuts, int no_of_radialsegs)\n{\n   m_alllinemap = (AllLineMap *) &alllinemap;\n\n   m_vps = new ValueTriplet[no_of_axsegcuts];\n   m_removed = new bool [no_of_axsegcuts];\n   m_affected = new bool [no_of_axsegcuts];\n   m_vital = new bool [no_of_axsegcuts];\n   m_radialsegcounts = new int [no_of_radialsegs];\n}\n\nAxialMinimiser::~AxialMinimiser()\n{\n   delete [] m_vital;\n   delete [] m_affected;\n   delete [] m_radialsegcounts;\n   delete [] m_vps;\n   delete [] m_removed;\n}\n\n// Alan and Bill's algo...\n\nvoid AxialMinimiser::removeSubsets(std::map<int, std::set<int> >& axsegcuts, std::map<RadialKey,RadialSegment>& radialsegs,\n                                   std::map<RadialKey, std::set<int> > &rlds,  std::vector<RadialLine> &radial_lines,\n                                   std::vector<std::vector<int> >& keyvertexconns, std::vector<int>& keyvertexcounts)\n{\n   bool removedflag = true;\n\n   m_axialconns = m_alllinemap->m_connectors;\n\n   for (size_t x = 0; x < radialsegs.size(); x++) {\n      m_radialsegcounts[x] = 0;\n   }\n   int y = -1;\n   for (auto axSegCut: axsegcuts) {\n      y++;\n      for (int cut: axSegCut.second) {\n         m_radialsegcounts[cut] += 1;\n      }\n      m_removed[y] = false;\n      m_vital[y] = false;\n      m_affected[y] = true;\n      m_vps[y].index = y;\n      double length = m_axialconns[y].m_connections.size();\n      m_vps[y].value1 = (int) length;\n      length = depthmapX::getMapAtIndex(m_alllinemap->m_shapes, y)->second.getLine().length();\n      m_vps[y].value2 = (float) length;\n   }\n\n   // sort according to number of connections then length\n   qsort(m_vps,m_axialconns.size(),sizeof(ValueTriplet),compareValueTriplet);\n\n   while (removedflag) {\n\n      removedflag = false;\n      for (size_t i = 0; i < m_axialconns.size(); i++) {\n         int ii = m_vps[i].index;\n         if (m_removed[ii] || !m_affected[ii] || m_vital[ii]) {\n            continue;\n         }\n         // vital connections code (uses original unaltered connections)\n         {\n            bool vitalconn = false;\n            for (size_t j = 0; j < keyvertexconns[ii].size(); j++) {\n               // first check to see if removing this line will cause elimination of a vital connection\n               if (keyvertexcounts[keyvertexconns[ii][j]] <= 1) {\n                  // connect vital... just go on to the next one:\n                  vitalconn = true;\n                  break;\n               }\n            }\n            if (vitalconn) {\n               m_vital[ii] = true;\n               continue;\n            }\n         }\n         //\n         Connector& axa = m_axialconns[ii];\n         m_affected[ii] = false;\n         bool subset = false;\n         for (size_t j = 0; j < axa.m_connections.size(); j++) {\n            int indextob = axa.m_connections[j];\n            if (indextob == ii || m_removed[indextob]) { // <- removed[indextob] should never happen as it should have been removed below\n               continue;\n            }\n            Connector& axb = m_axialconns[indextob];\n            if (axa.m_connections.size() <= axb.m_connections.size()) {\n               // change to 10.08, coconnecting is 1 -> connection to other line is implicitly handled\n               int coconnecting = 1;\n               // first check it's a connection subset\n               // note that changes in 10.08 mean that lines no longer connect to themselves\n               // this means that the subset 1 connects {2,3} and 2 connects {1,3} are equivalent\n               for (size_t axai = 0, axbi = 0; axai < axa.m_connections.size() && axbi < axb.m_connections.size(); axai++, axbi++) {\n                  // extra 10.08 -> step over connection to b\n                  if (axa.m_connections[axai] == indextob) {\n                     axai++;\n                  }\n                  // extra 10.08 add axb.m_connections[axbi] == ii -> step over connection to a\n                  while (axbi < axb.m_connections.size() && (axb.m_connections[axbi] == ii || axa.m_connections[axai] > axb.m_connections[axbi])) {\n                     axbi++;\n                  }\n                  if (axbi >= axb.m_connections.size()) {\n                     break;\n                  }\n                  else if (axa.m_connections[axai] == axb.m_connections[axbi]) {\n                     coconnecting++;\n                  }\n                  else if (axa.m_connections[axai] < axb.m_connections[axbi]) {\n                     break;\n                  }\n               }\n               if (coconnecting >= (int)axa.m_connections.size()) {\n                  subset = true;\n                  break;\n               }\n            }\n         }\n         if (subset) {\n            size_t removeindex = ii;\n            // now check removing it won't break any topological loops\n            bool presumedvital = false;\n            auto& axSegCut = depthmapX::getMapAtIndex(axsegcuts, removeindex)->second;\n            for (int cut: axSegCut) {\n               if (m_radialsegcounts[cut] <= 1) {\n                  presumedvital = true;\n                  break;\n               }\n            }\n            if (presumedvital) {\n               presumedvital = checkVital(removeindex,axSegCut,radialsegs,rlds,radial_lines);\n            }\n            if (presumedvital) {\n               m_vital[removeindex] = true;\n            }\n            // if not, remove it...\n            if (!m_vital[removeindex]) {\n               m_removed[removeindex] = true;\n               auto& affectedconnections = m_axialconns[removeindex].m_connections;\n               for (auto affectedconnection: affectedconnections) {\n                  if (!m_removed[affectedconnection]) {\n                     auto& connections = m_axialconns[affectedconnection].m_connections;\n                     depthmapX::findAndErase(connections, int(removeindex));\n                     m_affected[affectedconnection] = true;\n                  }\n               }\n               removedflag = true;\n               for (int cut: axSegCut) {\n                  m_radialsegcounts[cut] -= 1;\n               }\n               // vital connections\n               for (size_t k = 0; k < keyvertexconns[removeindex].size(); k++) {\n                  keyvertexcounts[keyvertexconns[removeindex][k]] -= 1;\n               }\n            }\n         }\n      }\n   }\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n\n// My algo... v. simple... fewest longest\n\nvoid AxialMinimiser::fewestLongest(std::map<int, std::set<int> > &axsegcuts, std::map<RadialKey,RadialSegment>& radialsegs,\n                                   std::map<RadialKey, std::set<int> > &rlds, std::vector<RadialLine> &radial_lines,\n                                   std::vector<std::vector<int> > &keyvertexconns, std::vector<int>& keyvertexcounts)\n{\n   //m_axialconns = m_alllinemap->m_connectors;\n   int livecount = 0;\n\n   for (size_t y = 0; y < m_axialconns.size(); y++) {\n      if (!m_removed[y] && !m_vital[y]) {\n         m_vps[livecount].index = (int) y;\n         m_vps[livecount].value1 = (int) m_axialconns[y].m_connections.size();\n         m_vps[livecount].value2 = (float) depthmapX::getMapAtIndex(m_alllinemap->m_shapes, y)->second.getLine().length();\n         livecount++;\n      }\n   }\n\n   qsort(m_vps,livecount,sizeof(ValueTriplet),compareValueTriplet);\n\n   for (int i = 0; i < livecount; i++) {\n\n      int j = m_vps[i].index;\n      // vital connections code (uses original unaltered connections)\n      bool vitalconn = false;\n      size_t k;\n      for (k = 0; k < keyvertexconns[j].size(); k++) {\n         // first check to see if removing this line will cause elimination of a vital connection\n         if (keyvertexcounts[keyvertexconns[j][k]] <= 1) {\n            // connect vital... just go on to the next one:\n            vitalconn = true;\n            break;\n         }\n      }\n      if (vitalconn) {\n         continue;\n      }\n      //\n      bool presumedvital = false;\n      auto &axSegCut = depthmapX::getMapAtIndex(axsegcuts, j)->second;\n      for (int cut: axSegCut) {\n         if (m_radialsegcounts[cut] <= 1) {\n            presumedvital = true;\n            break;\n         }\n      }\n      if (presumedvital) {\n         presumedvital = checkVital(j,axSegCut,radialsegs,rlds,radial_lines);\n      }\n      if (!presumedvital) {\n         // don't let anything this is connected to go down to zero connections\n         auto& affectedconnections = m_axialconns[j].m_connections;\n         for (auto affectedconnection: affectedconnections) {\n            if (!m_removed[affectedconnection]) {\n               auto& connections = m_axialconns[size_t(affectedconnection)].m_connections;\n               if (connections.size() <= 2) { // <- note number of connections includes itself... so you and one other\n                  presumedvital = true;\n                  break;\n               }\n            }\n         }\n      }\n      if (!presumedvital) {\n         m_removed[j] = true;\n         auto& affectedconnections = m_axialconns[size_t(j)].m_connections;\n         for (auto affectedconnection: affectedconnections) {\n            if (!m_removed[affectedconnection]) {\n               auto& connections = m_axialconns[size_t(affectedconnection)].m_connections;\n               depthmapX::findAndErase(connections, int(j));\n               m_affected[affectedconnection] = true;\n            }\n         }\n         for (auto cut: axSegCut) {\n            m_radialsegcounts[cut] -= 1;\n         }\n         // vital connections\n         for (size_t k = 0; k < keyvertexconns[j].size(); k++) {\n            keyvertexcounts[keyvertexconns[j][k]] -= 1;\n         }\n      }\n   }\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n\nbool AxialMinimiser::checkVital(int checkindex, std::set<int> &axSegCut, std::map<RadialKey,RadialSegment>& radialsegs,\n                                std::map<RadialKey, std::set<int> > &rlds, std::vector<RadialLine>& radial_lines)\n{\n   std::map<int,SalaShape>& axiallines = m_alllinemap->m_shapes;\n\n   bool presumedvital = true;\n   int nonvitalcount = 0, vitalsegs = 0;\n   // again, this time more rigourously... check any connected pairs don't cover the link...\n   for (int cut: axSegCut) {\n      if (m_radialsegcounts[cut] <= 1) {\n         bool nonvitalseg = false;\n         vitalsegs++;\n         auto radialSegIter = depthmapX::getMapAtIndex(radialsegs, cut);\n         const RadialKey& key = radialSegIter->first;\n         RadialSegment& seg = radialSegIter->second;\n         std::set<int>& divisorsa = rlds.find(key)->second;\n         std::set<int>& divisorsb = rlds.find(seg.radial_b)->second;\n         auto iterKey = std::find(radial_lines.begin(), radial_lines.end(), key);\n         if(iterKey == radial_lines.end()) {\n             throw depthmapX::RuntimeException(\"Radial key not found in radial lines\");\n         }\n         const RadialLine& rlinea = *iterKey;\n\n         auto iterSegB = std::find(radial_lines.begin(), radial_lines.end(), seg.radial_b);\n         if(iterSegB == radial_lines.end()) {\n             throw depthmapX::RuntimeException(\"Radial key not found in radial lines\");\n         }\n         const RadialLine& rlineb = *iterSegB;\n         for (int diva: divisorsa) {\n            if (diva == checkindex || m_removed[diva]) {\n               continue;\n            }\n            for (int divb: divisorsb) {\n               if (divb == checkindex || m_removed[divb]) {\n                  continue;\n               }\n               auto& connections = m_axialconns[size_t(diva)].m_connections;\n               if (std::find(connections.begin(), connections.end(), divb) != connections.end()) {\n                  // as a further challenge, they must link within in the zone of interest, not on the far side of it... arg!\n                  Point2f p = intersection_point(axiallines[diva].getLine(),axiallines[divb].getLine(),TOLERANCE_A);\n                  if (p.insegment(rlinea.keyvertex,rlinea.openspace,rlineb.openspace,TOLERANCE_A)) {\n                     nonvitalseg = true;\n                  }\n               }\n            }\n         }\n         if (nonvitalseg) {\n            nonvitalcount++;\n         }\n      }\n   }\n   if (nonvitalcount == vitalsegs) {\n      presumedvital = false;\n   }\n   return presumedvital;\n}\n"
  },
  {
    "path": "salalib/axialminimiser.h",
    "content": "#pragma once\n\n#include \"salalib/alllinemap.h\"\n\nstruct ValueTriplet\n{\n   int value1;\n   float value2;\n   int index;\n};\n\nclass AxialMinimiser\n{\nprotected:\n   AllLineMap *m_alllinemap;\n   //\n   ValueTriplet *m_vps;\n   bool *m_removed;\n   bool *m_affected;\n   bool *m_vital;\n   int *m_radialsegcounts;\n   int *m_keyvertexcounts;\n   std::vector<Connector> m_axialconns; // <- uses a copy of axial lines as it will remove connections\npublic:\n   AxialMinimiser(const AllLineMap& alllinemap, int no_of_axsegcuts, int no_of_radialsegs);\n   ~AxialMinimiser();\n   void removeSubsets(std::map<int, std::set<int> > &axsegcuts, std::map<RadialKey,RadialSegment>& radialsegs,\n                      std::map<RadialKey, std::set<int> >& rlds, std::vector<RadialLine> &radial_lines,\n                      std::vector<std::vector<int> > &keyvertexconns, std::vector<int>& keyvertexcounts);\n   void fewestLongest(std::map<int,std::set<int> >& axsegcuts, std::map<RadialKey,RadialSegment>& radialsegs,\n                      std::map<RadialKey, std::set<int> > &rlds, std::vector<RadialLine>& radial_lines,\n                      std::vector<std::vector<int> >& keyvertexconns, std::vector<int>& keyvertexcounts);\n   // advanced topological testing:\n   bool checkVital(int checkindex, std::set<int> &axSegCut, std::map<RadialKey,RadialSegment>& radialsegs,\n                   std::map<RadialKey, std::set<int> > &rlds, std::vector<RadialLine> &radial_lines);\n   //\n   bool removed(int i) const\n   { return m_removed[i]; }\n};\n"
  },
  {
    "path": "salalib/axialmodules/CMakeLists.txt",
    "content": "target_sources(salalib\n    PRIVATE\n        axialintegration.cpp\n        axialstepdepth.cpp\n    PUBLIC\n        axialintegration.h\n        axialstepdepth.h)\n"
  },
  {
    "path": "salalib/axialmodules/axialintegration.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/axialmodules/axialintegration.h\"\n\n#include \"genlib/pflipper.h\"\n#include \"genlib/stringutils.h\"\n\nbool AxialIntegration::run(Communicator *comm, ShapeGraph &map, bool simple_version) {\n    // note, from 10.0, Depthmap no longer includes *self* connections on axial lines\n    // self connections are stripped out on loading graph files, as well as no longer made\n\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getShapeCount());\n    }\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // note: radius must be sorted lowest to highest, but if -1 occurs (\"radius n\") it needs to be last...\n    // ...to ensure no mess ups, we'll re-sort here:\n    bool radius_n = false;\n    std::vector<int> radii;\n    for (double radius : m_radius_set) {\n        if (radius < 0) {\n            radius_n = true;\n        } else {\n            radii.push_back(static_cast<int>(radius));\n        }\n    }\n    if (radius_n) {\n        radii.push_back(-1);\n    }\n\n    // retrieve weighted col data, as this may well be overwritten in the new analysis:\n    std::vector<double> weights;\n    std::string weighting_col_text;\n    if (m_weighted_measure_col != -1) {\n        weighting_col_text = attributes.getColumnName(m_weighted_measure_col);\n        for (size_t i = 0; i < map.getShapeCount(); i++) {\n            weights.push_back(map.getAttributeRowFromShapeIndex(i).getValue(m_weighted_measure_col));\n        }\n    }\n\n    // first enter the required attribute columns:\n    for (int radius : radii) {\n        std::string radius_text;\n        if (radius != -1) {\n            radius_text = dXstring::formatString(radius, \" R%d\");\n        }\n        if (m_choice) {\n            std::string choice_col_text = std::string(\"Choice\") + radius_text;\n            attributes.insertOrResetColumn(choice_col_text.c_str());\n            std::string n_choice_col_text = std::string(\"Choice [Norm]\") + radius_text;\n            attributes.insertOrResetColumn(n_choice_col_text.c_str());\n            if (m_weighted_measure_col != -1) {\n                std::string w_choice_col_text = std::string(\"Choice [\") + weighting_col_text + \" Wgt]\" + radius_text;\n                attributes.insertOrResetColumn(w_choice_col_text.c_str());\n                std::string nw_choice_col_text =\n                    std::string(\"Choice [\") + weighting_col_text + \" Wgt][Norm]\" + radius_text;\n                attributes.insertOrResetColumn(nw_choice_col_text.c_str());\n            }\n        }\n\n        if (!simple_version) {\n            std::string entropy_col_text = std::string(\"Entropy\") + radius_text;\n            attributes.insertOrResetColumn(entropy_col_text.c_str());\n        }\n\n        std::string integ_dv_col_text = std::string(\"Integration [HH]\") + radius_text;\n        attributes.insertOrResetColumn(integ_dv_col_text.c_str());\n\n        if (!simple_version) {\n            std::string integ_pv_col_text = std::string(\"Integration [P-value]\") + radius_text;\n            attributes.insertOrResetColumn(integ_pv_col_text.c_str());\n            std::string integ_tk_col_text = std::string(\"Integration [Tekl]\") + radius_text;\n            attributes.insertOrResetColumn(integ_tk_col_text.c_str());\n            std::string intensity_col_text = std::string(\"Intensity\") + radius_text;\n            attributes.insertOrResetColumn(intensity_col_text.c_str());\n            std::string harmonic_col_text = std::string(\"Harmonic Mean Depth\") + radius_text;\n            attributes.insertOrResetColumn(harmonic_col_text.c_str());\n        }\n\n        std::string depth_col_text = std::string(\"Mean Depth\") + radius_text;\n        attributes.insertOrResetColumn(depth_col_text.c_str());\n        std::string count_col_text = std::string(\"Node Count\") + radius_text;\n        attributes.insertOrResetColumn(count_col_text.c_str());\n\n        if (!simple_version) {\n            std::string rel_entropy_col_text = std::string(\"Relativised Entropy\") + radius_text;\n            attributes.insertOrResetColumn(rel_entropy_col_text);\n        }\n\n        if (m_weighted_measure_col != -1) {\n            std::string w_md_col_text = std::string(\"Mean Depth [\") + weighting_col_text + \" Wgt]\" + radius_text;\n            attributes.insertOrResetColumn(w_md_col_text.c_str());\n            std::string total_weight_text = std::string(\"Total \") + weighting_col_text + radius_text;\n            attributes.insertOrResetColumn(total_weight_text.c_str());\n        }\n        if (m_fulloutput) {\n            if (!simple_version) {\n                std::string penn_norm_text = std::string(\"RA [Penn]\") + radius_text;\n                attributes.insertOrResetColumn(penn_norm_text);\n            }\n            std::string ra_col_text = std::string(\"RA\") + radius_text;\n            attributes.insertOrResetColumn(ra_col_text.c_str());\n\n            if (!simple_version) {\n                std::string rra_col_text = std::string(\"RRA\") + radius_text;\n                attributes.insertOrResetColumn(rra_col_text.c_str());\n            }\n\n            std::string td_col_text = std::string(\"Total Depth\") + radius_text;\n            attributes.insertOrResetColumn(td_col_text.c_str());\n        }\n        //\n    }\n    if (m_local) {\n        if (!simple_version) {\n            attributes.insertOrResetColumn(\"Control\");\n            attributes.insertOrResetColumn(\"Controllability\");\n        }\n    }\n    // then look up all the columns... eek:\n    std::vector<int> choice_col, n_choice_col, w_choice_col, nw_choice_col, entropy_col, integ_dv_col, integ_pv_col,\n        integ_tk_col, intensity_col, depth_col, count_col, rel_entropy_col, penn_norm_col, w_depth_col,\n        total_weight_col, ra_col, rra_col, td_col, harmonic_col;\n    for (int radius : radii) {\n        std::string radius_text;\n        if (radius != -1) {\n            radius_text = std::string(\" R\") + dXstring::formatString(int(radius), \"%d\");\n        }\n        if (m_choice) {\n            std::string choice_col_text = std::string(\"Choice\") + radius_text;\n            choice_col.push_back(attributes.getColumnIndex(choice_col_text.c_str()));\n            std::string n_choice_col_text = std::string(\"Choice [Norm]\") + radius_text;\n            n_choice_col.push_back(attributes.getColumnIndex(n_choice_col_text.c_str()));\n            if (m_weighted_measure_col != -1) {\n                std::string w_choice_col_text = std::string(\"Choice [\") + weighting_col_text + \" Wgt]\" + radius_text;\n                w_choice_col.push_back(attributes.getColumnIndex(w_choice_col_text.c_str()));\n                std::string nw_choice_col_text =\n                    std::string(\"Choice [\") + weighting_col_text + \" Wgt][Norm]\" + radius_text;\n                nw_choice_col.push_back(attributes.getColumnIndex(nw_choice_col_text.c_str()));\n            }\n        }\n        if (!simple_version) {\n            std::string entropy_col_text = std::string(\"Entropy\") + radius_text;\n            entropy_col.push_back(attributes.getColumnIndex(entropy_col_text.c_str()));\n        }\n\n        std::string integ_dv_col_text = std::string(\"Integration [HH]\") + radius_text;\n        integ_dv_col.push_back(attributes.getColumnIndex(integ_dv_col_text.c_str()));\n\n        if (!simple_version) {\n            std::string integ_pv_col_text = std::string(\"Integration [P-value]\") + radius_text;\n            integ_pv_col.push_back(attributes.getColumnIndex(integ_pv_col_text.c_str()));\n            std::string integ_tk_col_text = std::string(\"Integration [Tekl]\") + radius_text;\n            integ_tk_col.push_back(attributes.getColumnIndex(integ_tk_col_text.c_str()));\n            std::string intensity_col_text = std::string(\"Intensity\") + radius_text;\n            intensity_col.push_back(attributes.getColumnIndex(intensity_col_text.c_str()));\n            std::string harmonic_col_text = std::string(\"Harmonic Mean Depth\") + radius_text;\n            harmonic_col.push_back(attributes.getColumnIndex(harmonic_col_text.c_str()));\n        }\n\n        std::string depth_col_text = std::string(\"Mean Depth\") + radius_text;\n        depth_col.push_back(attributes.getColumnIndex(depth_col_text.c_str()));\n        std::string count_col_text = std::string(\"Node Count\") + radius_text;\n        count_col.push_back(attributes.getColumnIndex(count_col_text.c_str()));\n\n        if (!simple_version) {\n            std::string rel_entropy_col_text = std::string(\"Relativised Entropy\") + radius_text;\n            rel_entropy_col.push_back(attributes.getColumnIndex(rel_entropy_col_text.c_str()));\n        }\n\n        if (m_weighted_measure_col != -1) {\n            std::string w_md_col_text = std::string(\"Mean Depth [\") + weighting_col_text + \" Wgt]\" + radius_text;\n            w_depth_col.push_back(attributes.getColumnIndex(w_md_col_text.c_str()));\n            std::string total_weight_col_text = std::string(\"Total \") + weighting_col_text + radius_text;\n            total_weight_col.push_back(attributes.getColumnIndex(total_weight_col_text.c_str()));\n        }\n        if (m_fulloutput) {\n            std::string ra_col_text = std::string(\"RA\") + radius_text;\n            ra_col.push_back(attributes.getColumnIndex(ra_col_text.c_str()));\n\n            if (!simple_version) {\n                std::string penn_norm_text = std::string(\"RA [Penn]\") + radius_text;\n                penn_norm_col.push_back(attributes.getColumnIndex(penn_norm_text));\n                std::string rra_col_text = std::string(\"RRA\") + radius_text;\n                rra_col.push_back(attributes.getColumnIndex(rra_col_text.c_str()));\n            }\n\n            std::string td_col_text = std::string(\"Total Depth\") + radius_text;\n            td_col.push_back(attributes.getColumnIndex(td_col_text.c_str()));\n        }\n    }\n    int control_col = -1, controllability_col = -1;\n    if (m_local) {\n        if (!simple_version) {\n            control_col = attributes.getColumnIndex(\"Control\");\n            controllability_col = attributes.getColumnIndex(\"Controllability\");\n        }\n    }\n\n    // for choice\n    AnalysisInfo **audittrail;\n    if (m_choice) {\n        audittrail = new AnalysisInfo *[map.getShapeCount()];\n        for (size_t i = 0; i < map.getShapeCount(); i++) {\n            audittrail[i] = new AnalysisInfo[radii.size()];\n        }\n    }\n\n    // n.b., for this operation we assume continuous line referencing from zero (this is silly?)\n    // has already failed due to this!  when intro hand drawn fewest line (where user may have deleted)\n    // it's going to get worse...\n\n    bool *covered = new bool[map.getShapeCount()];\n\n    size_t i = -1;\n    for (auto & iter : attributes) {\n        i++;\n        AttributeRow &row = iter.getRow();\n        for (size_t j = 0; j < map.getShapeCount(); j++) {\n            covered[j] = false;\n        }\n        if (m_choice) {\n            for (size_t k = 0; k < map.getShapeCount(); k++) {\n                audittrail[k][0].previous.ref = -1; // note, 0th member used as radius doesn't matter\n                // note, choice columns are not cleared, but cummulative over all shortest path pairs\n            }\n        }\n\n        if (m_local) {\n            double control = 0.0;\n            const std::vector<int> &connections = map.getConnections()[i].m_connections;\n            std::vector<int> totalneighbourhood;\n            for (int connection : connections) {\n                // n.b., as of Depthmap 10.0, connections[j] and i cannot coexist\n                // if (connections[j] != i) {\n                depthmapX::addIfNotExists(totalneighbourhood, connection);\n                int retro_size = 0;\n                auto &retconnectors = map.getConnections()[size_t(connection)].m_connections;\n                for (auto retconnector : retconnectors) {\n                    retro_size++;\n                    depthmapX::addIfNotExists(totalneighbourhood, retconnector);\n                }\n                control += 1.0 / double(retro_size);\n                //}\n            }\n\n            if (!simple_version) {\n                if (connections.size() > 0) {\n                    row.setValue(control_col, float(control));\n                    row.setValue(controllability_col,\n                                 float(double(connections.size()) / double(totalneighbourhood.size() - 1)));\n                } else {\n                    row.setValue(control_col, -1);\n                    row.setValue(controllability_col, -1);\n                }\n            }\n        }\n\n        std::vector<int> depthcounts;\n        depthcounts.push_back(0);\n\n        pflipper<std::vector<std::pair<int, int>>> foundlist;\n        foundlist.a().push_back(std::pair<int, int>(i, -1));\n        covered[i] = true;\n        int total_depth = 0, depth = 1, node_count = 1, pos = -1, previous = -1; // node_count includes this 1\n        double weight = 0.0, rootweight = 0.0, total_weight = 0.0, w_total_depth = 0.0;\n        if (m_weighted_measure_col != -1) {\n            rootweight = weights[i];\n            // include this line in total weights (as per nodecount)\n            total_weight += rootweight;\n        }\n        int index = -1;\n        int r = 0;\n        for (int radius : radii) {\n            while (foundlist.a().size()) {\n                if (!m_choice) {\n                    index = foundlist.a().back().first;\n                } else {\n                    pos = pafrand() % foundlist.a().size();\n                    index = foundlist.a().at(pos).first;\n                    previous = foundlist.a().at(pos).second;\n                    audittrail[index][0].previous.ref =\n                        previous; // note 0th member used here: can be used individually different radius previous\n                }\n                Connector &line = map.getConnections()[index];\n                for (size_t k = 0; k < line.m_connections.size(); k++) {\n                    if (!covered[line.m_connections[k]]) {\n                        covered[line.m_connections[k]] = true;\n                        foundlist.b().push_back(std::pair<int, int>(line.m_connections[k], index));\n                        if (m_weighted_measure_col != -1) {\n                            // the weight is taken from the discovered node:\n                            weight = weights[line.m_connections[k]];\n                            total_weight += weight;\n                            w_total_depth += depth * weight;\n                        }\n                        if (m_choice && previous != -1) {\n                            // both directional paths are now recorded for choice\n                            // (coincidentally fixes choice problem which was completely wrong)\n                            size_t here = index;   // note: start counting from index as actually looking ahead here\n                            while (here != i) { // not i means not the current root for the path\n                                audittrail[here][r].choice += 1;\n                                audittrail[here][r].weighted_choice += weight * rootweight;\n                                here =\n                                    audittrail[here][0].previous.ref; // <- note, just using 0th position: radius for\n                                                                      // the previous doesn't matter in this analysis\n                            }\n                            if (m_weighted_measure_col != -1) {\n                                // in weighted choice, root node and current node receive values:\n                                audittrail[i][r].weighted_choice += (weight * rootweight) * 0.5;\n                                audittrail[line.m_connections[k]][r].weighted_choice += (weight * rootweight) * 0.5;\n                            }\n                        }\n                        total_depth += depth;\n                        node_count++;\n                        depthcounts.back() += 1;\n                    }\n                }\n                if (!m_choice)\n                    foundlist.a().pop_back();\n                else\n                    foundlist.a().erase(foundlist.a().begin() + pos);\n                if (!foundlist.a().size()) {\n                    foundlist.flip();\n                    depth++;\n                    depthcounts.push_back(0);\n                    if (radius != -1 && depth > radius) {\n                        break;\n                    }\n                }\n            }\n            // set the attributes for this node:\n            row.setValue(count_col[r], float(node_count));\n            if (m_weighted_measure_col != -1) {\n                row.setValue(total_weight_col[r], float(total_weight));\n            }\n            // node count > 1 to avoid divide by zero (was > 2)\n            if (node_count > 1) {\n                // note -- node_count includes this one -- mean depth as per p.108 Social Logic of Space\n                double mean_depth = double(total_depth) / double(node_count - 1);\n                row.setValue(depth_col[r], float(mean_depth));\n                if (m_weighted_measure_col != -1) {\n                    // weighted mean depth:\n                    row.setValue(w_depth_col[r], float(w_total_depth / total_weight));\n                }\n                // total nodes > 2 to avoid divide by 0 (was > 3)\n                if (node_count > 2 && mean_depth > 1.0) {\n                    double ra = 2.0 * (mean_depth - 1.0) / double(node_count - 2);\n                    // d-value / p-value from Depthmap 4 manual, note: node_count includes this one\n                    double rra_d = ra / dvalue(node_count);\n                    double rra_p = ra / dvalue(node_count);\n                    double integ_tk = teklinteg(node_count, total_depth);\n                    row.setValue(integ_dv_col[r], float(1.0 / rra_d));\n\n                    if (!simple_version) {\n                        row.setValue(integ_pv_col[r], float(1.0 / rra_p));\n                        if (total_depth - node_count + 1 > 1) {\n                            row.setValue(integ_tk_col[r], float(integ_tk));\n                        } else {\n                            row.setValue(integ_tk_col[r], -1.0f);\n                        }\n                    }\n\n                    if (m_fulloutput) {\n                        row.setValue(ra_col[r], float(ra));\n\n                        if (!simple_version) {\n                            row.setValue(rra_col[r], float(rra_d));\n                        }\n                        row.setValue(td_col[r], float(total_depth));\n\n                        if (!simple_version) {\n                            // alan's palm-tree normalisation: palmtree\n                            double dmin = node_count - 1;\n                            double dmax = palmtree(node_count, depth - 1);\n                            if (dmax != dmin) {\n                                row.setValue(penn_norm_col[r], float((dmax - total_depth) / (dmax - dmin)));\n                            }\n                        }\n                    }\n                } else {\n                    row.setValue(integ_dv_col[r], -1.0f);\n\n                    if (!simple_version) {\n                        row.setValue(integ_pv_col[r], -1.0f);\n                        row.setValue(integ_tk_col[r], -1.0f);\n                    }\n                    if (m_fulloutput) {\n                        row.setValue(ra_col[r], -1.0f);\n\n                        if (!simple_version) {\n                            row.setValue(rra_col[r], -1.0f);\n                        }\n\n                        row.setValue(td_col[r], -1.0f);\n\n                        if (!simple_version) {\n                            row.setValue(penn_norm_col[r], -1.0f);\n                        }\n                    }\n                }\n\n                if (!simple_version) {\n                    double entropy = 0.0, intensity = 0.0, rel_entropy = 0.0, factorial = 1.0, harmonic = 0.0;\n                    for (size_t k = 0; k < depthcounts.size(); k++) {\n                        if (depthcounts[k] != 0) {\n                            // some debate over whether or not this should be node count - 1\n                            // (i.e., including or not including the node itself)\n                            double prob = double(depthcounts[k]) / double(node_count);\n                            entropy -= prob * log2(prob);\n                            // Formula from Turner 2001, \"Depthmap\"\n                            factorial *= double(k + 1);\n                            double q = (pow(mean_depth, double(k)) / double(factorial)) * exp(-mean_depth);\n                            rel_entropy += (double)prob * log2(prob / q);\n                            //\n                            harmonic += 1.0 / double(depthcounts[k]);\n                        }\n                    }\n                    harmonic = double(depthcounts.size()) / harmonic;\n                    if (total_depth > node_count) {\n                        intensity = node_count * entropy / (total_depth - node_count);\n                    } else {\n                        intensity = -1;\n                    }\n                    row.setValue(entropy_col[r], float(entropy));\n                    row.setValue(rel_entropy_col[r], float(rel_entropy));\n                    row.setValue(intensity_col[r], float(intensity));\n                    row.setValue(harmonic_col[r], float(harmonic));\n                }\n            } else {\n                row.setValue(depth_col[r], -1.0f);\n                row.setValue(integ_dv_col[r], -1.0f);\n\n                if (!simple_version) {\n                    row.setValue(integ_pv_col[r], -1.0f);\n                    row.setValue(integ_tk_col[r], -1.0f);\n                    row.setValue(entropy_col[r], -1.0f);\n                    row.setValue(rel_entropy_col[r], -1.0f);\n                    row.setValue(harmonic_col[r], -1.0f);\n                }\n            }\n            ++r;\n        }\n        //\n        if (comm) {\n            if (qtimer(atime, 500)) {\n                if (comm->IsCancelled()) {\n                    delete[] covered;\n                    throw Communicator::CancelledException();\n                }\n                comm->CommPostMessage(Communicator::CURRENT_RECORD, i);\n            }\n        }\n    }\n    delete[] covered;\n    if (m_choice) {\n        i = -1;\n        for (auto & iter: attributes) {\n            i++;\n            AttributeRow &row = iter.getRow();\n            double total_choice = 0.0, w_total_choice = 0.0;\n            for (size_t r = 0; r < radii.size(); r++) {\n                total_choice += audittrail[i][r].choice;\n                w_total_choice += audittrail[i][r].weighted_choice;\n                // n.b., normalise choice according to (n-1)(n-2)/2 (maximum possible through routes)\n                double node_count = row.getValue(count_col[r]);\n                double total_weight = 0;\n                if (m_weighted_measure_col != -1) {\n                    total_weight = row.getValue(total_weight_col[r]);\n                }\n                if (node_count > 2) {\n                    row.setValue(choice_col[r], float(total_choice));\n                    row.setValue(n_choice_col[r], float(2.0 * total_choice / ((node_count - 1) * (node_count - 2))));\n                    if (m_weighted_measure_col != -1) {\n                        row.setValue(w_choice_col[r], float(w_total_choice));\n                        row.setValue(nw_choice_col[r], float(2.0 * w_total_choice / (total_weight * total_weight)));\n                    }\n                } else {\n                    row.setValue(choice_col[r], -1);\n                    row.setValue(n_choice_col[r], -1);\n                    if (m_weighted_measure_col != -1) {\n                        row.setValue(w_choice_col[r], -1);\n                        row.setValue(nw_choice_col[r], -1);\n                    }\n                }\n            }\n        }\n        for (size_t i = 0; i < map.getShapeCount(); i++) {\n            delete[] audittrail[i];\n        }\n        delete[] audittrail;\n    }\n\n    map.setDisplayedAttribute(-1); // <- override if it's already showing\n    map.setDisplayedAttribute(integ_dv_col.back());\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/axialmodules/axialintegration.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/iaxial.h\"\n\nclass AxialIntegration : IAxial {\n  private:\n    std::set<double> m_radius_set;\n    int m_weighted_measure_col;\n    bool m_choice;\n    bool m_fulloutput;\n    bool m_local;\n\n  public:\n    std::string getAnalysisName() const override { return \"Angular Analysis\"; }\n    bool run(Communicator *, ShapeGraph &map, bool) override;\n    AxialIntegration(std::set<double> radius_set, int weighted_measure_col, bool choice, bool fulloutput, bool local)\n        : m_radius_set(radius_set), m_weighted_measure_col(weighted_measure_col), m_choice(choice),\n          m_fulloutput(fulloutput), m_local(local) {}\n};\n"
  },
  {
    "path": "salalib/axialmodules/axialstepdepth.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/axialmodules/axialstepdepth.h\"\n\n#include \"genlib/pflipper.h\"\n#include \"genlib/stringutils.h\"\n\nbool AxialStepDepth::run(Communicator *, ShapeGraph &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    std::string stepdepth_col_text = std::string(\"Step Depth\");\n    int stepdepth_col = attributes.insertOrResetColumn(stepdepth_col_text.c_str());\n\n    bool *covered = new bool [map.getConnections().size()];\n    for (size_t i = 0; i < map.getConnections().size(); i++) {\n       covered[i] = false;\n    }\n    pflipper<std::vector<int> > foundlist;\n    for(auto& lineindex: map.getSelSet()) {\n       foundlist.a().push_back(lineindex);\n       covered[lineindex] = true;\n       map.getAttributeRowFromShapeIndex(lineindex).setValue(stepdepth_col,0.0f);\n    }\n    int depth = 1;\n    while (foundlist.a().size()) {\n       Connector& line = map.getConnections()[foundlist.a().back()];\n       for (size_t k = 0; k < line.m_connections.size(); k++) {\n          if (!covered[line.m_connections[k]]) {\n             covered[line.m_connections[k]] = true;\n             foundlist.b().push_back(line.m_connections[k]);\n             map.getAttributeRowFromShapeIndex(line.m_connections[k]).setValue(stepdepth_col,float(depth));\n          }\n       }\n       foundlist.a().pop_back();\n       if (!foundlist.a().size()) {\n          foundlist.flip();\n          depth++;\n       }\n    }\n    delete [] covered;\n\n    map.setDisplayedAttribute(-1); // <- override if it's already showing\n    map.setDisplayedAttribute(stepdepth_col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/axialmodules/axialstepdepth.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/iaxial.h\"\n\nclass AxialStepDepth : IAxial\n{\npublic:\n    std::string getAnalysisName() const override {\n        return \"Angular Analysis\";\n    }\n    bool run(Communicator *comm, ShapeGraph &map, bool simple_version) override;\n};\n"
  },
  {
    "path": "salalib/axialpolygons.cpp",
    "content": "#include \"salalib/axialpolygons.h\"\n#include \"salalib/tidylines.h\"\n#include \"salalib/tolerances.h\"\n\n#include \"genlib/containerutils.h\"\n\nAxialVertex AxialPolygons::makeVertex(const AxialVertexKey& vertexkey, const Point2f& openspace)\n{\n   auto vertPossIter = depthmapX::getMapAtIndex(m_vertex_possibles, vertexkey.m_ref_key);\n   AxialVertex av(vertexkey, vertPossIter->first, openspace);\n\n   // n.b., at this point, vertex key m_a and m_b are unfixed\n   std::vector<Point2f>& pointlist = vertPossIter->second;\n   if (pointlist.size() < 2) {\n      return av;\n   }\n\n   Point2f o = av.m_point - av.m_openspace;\n\n   // using an anglemap means that there are now no anti-clockwise vertices...\n   // TODO: (CS) Double as key is problematic - books have been written about double equality...\n   std::map<double,int> anglemap;\n   for (size_t i = 0; i < pointlist.size(); ++i) {\n      anglemap.insert(std::make_pair( angle(openspace,av.m_point, pointlist[i]), i ));\n   }\n\n   av.m_ref_a = anglemap.begin()->second;\n   // TODO: is this supposed to be av.m_ref_b?\n   av.m_ref_a = anglemap.rbegin()->second;\n   Point2f a = av.m_point - pointlist[size_t(anglemap.begin()->second)];\n   Point2f b = pointlist[size_t(anglemap.rbegin()->second)] - av.m_point;\n   av.m_a = a;\n   av.m_b = b;\n   a.normalise();\n   b.normalise();\n\n   double oa = det(o,a);\n   double ob = det(o,b);\n   double ab = det(a,b);\n\n   // can't handle these cases\n   if (fabs(oa) < TOLERANCE_A || fabs(ob) < TOLERANCE_A || fabs(ab) < TOLERANCE_A) {\n      // although note that if ab == 0 and you've already checked intersection, it can't be convex\n      return av;\n   }\n\n   // ADDED 4-Nov-04 -- In order to stop too many lines being generated, don't include\n   // points that do not change surface direction:  -- notice: will create problems with circles\n   if (fabs(dot(a,b)) > 0.999) {\n      return av;\n   }\n\n\n   if (sgn(oa) == sgn(ob)) {\n      // headon collision\n      if (sgn(oa) == 1) {\n         if (sgn(ab) == 1) {\n            // convex clockwise\n            av.m_convex = true;\n            av.m_clockwise = true;\n            av.m_axial = true;\n         }\n         else {\n            // n.b., these are turned away for axial formation\n            // concave clockwise\n            av.m_convex = false;\n            av.m_clockwise = true;\n            av.m_axial = false;\n         }\n      }\n   }\n   else {\n      // glancing blow\n      // concave clockwise\n      av.m_convex = false;\n      av.m_clockwise = true;\n      av.m_axial = true;\n   }\n\n   av.m_initialised = true;\n\n   return av;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid AxialPolygons::clear()\n{\n   // clear any existing data\n   m_vertex_possibles.clear();\n   m_vertex_polys.clear();\n   m_handled_list.clear();\n   m_pixel_polys.reset(0,0);\n}\n\nvoid AxialPolygons::init(std::vector<Line>& lines, const QtRegion& region)\n{\n   // init pixelbase members\n   m_region = region;\n\n   // now tidy\n   TidyLines tidier;\n   tidier.tidy(lines, m_region);\n\n   // for easier debugging, the axial code is reused to make segments\n   ShapeGraph firstpass;\n   firstpass.init(lines.size(),m_region); // used to be double density\n   firstpass.initialiseAttributesAxial();\n   size_t i;\n   for (i = 0; i < lines.size(); i++) {\n      firstpass.makeLineShape(lines[i]);\n   }\n   firstpass.makeConnections();\n\n   lines.clear();\n   std::vector<Connector> connectionset;\n\n   // interesting... 1.0 may or may not work as intended\n   firstpass.makeSegmentMap(lines, connectionset, 1.0);\n\n   // now we have a set of lines and a set of connections...\n   // ...for the second pass, a bit of retro fitting to my original code is\n   // required\n   makeVertexPossibles(lines, connectionset);\n\n   initLines(lines.size(), m_region.bottom_left, m_region.top_right, 2);\n   // need to init before making pixel polys...\n   makePixelPolys();\n   // now also add lines\n   for (auto& vertexPoss: m_vertex_possibles) {\n      for (auto poss: vertexPoss.second) {\n         addLine(Line(vertexPoss.first,poss));\n      }\n   }\n   sortPixelLines();\n}\n\nvoid AxialPolygons::makeVertexPossibles(const std::vector<Line>& lines, const std::vector<Connector>& connectionset)\n{\n   m_vertex_possibles.clear();\n   m_vertex_polys.clear();\n\n   size_t i = 0;\n\n   // TODO: (CS) these should be vectors, not raw pointers.\n   depthmapX::RowMatrix<int> found(2, lines.size());\n   for (i = 0; i < lines.size(); i++) {\n      found(0, i) = -1;\n      found(1, i) = -1;\n   }\n   std::vector<Point2f> pointlookup;\n   // three pass operation: (1) stack the lines\n   for (i = 0; i < lines.size(); i++) {\n      if (found(0, i) == -1) {\n         pointlookup.push_back(lines[i].start());\n         m_vertex_possibles.insert(std::make_pair(pointlookup.back(),std::vector<Point2f>()));\n         m_vertex_polys.push_back(-1); // <- n.b., dummy entry for now, maintain with vertex possibles\n         found(0, i) = static_cast<int>(pointlookup.size() - 1);\n         for (auto& segconn: connectionset[i].m_back_segconns) {\n            int forwback = (segconn.first.dir == 1) ? 0 : 1;\n            found(static_cast<size_t>(forwback), static_cast<size_t>(segconn.first.ref)) = found(0, i);\n         }\n      }\n      if (found(1, i) == -1) {\n         pointlookup.push_back(lines[i].end());\n         m_vertex_possibles.insert(std::make_pair(pointlookup.back(),std::vector<Point2f>()));\n         m_vertex_polys.push_back(-1); // <- n.b., dummy entry for now, maintain with vertex possibles\n         found(1, i) = static_cast<int>(pointlookup.size() - 1);\n         for (auto& segconn: connectionset[i].m_forward_segconns) {\n            int forwback = (segconn.first.dir == 1) ? 0 : 1;\n            found(static_cast<size_t>(forwback), static_cast<size_t>(segconn.first.ref)) = found(1, i);\n         }\n      }\n   }\n   // three pass operation: (2) connect up vertex possibles\n   for (i = 0; i < lines.size(); i++) {\n      if (found(0, i) == -1 || found(1, i) == -1) {\n         // TODO: (CS) What are these integers being thrown?!\n         throw 1;\n      }\n      auto index0 = m_vertex_possibles.find(pointlookup[size_t(found(0, i))]);\n      auto index1 = m_vertex_possibles.find(pointlookup[size_t(found(1, i))]);\n      if (index0 == m_vertex_possibles.end() || index1 == m_vertex_possibles.end()) {\n         // TODO: (CS) What are these integers being thrown?!\n         throw 2;\n      }\n\n      index0->second.push_back(pointlookup[size_t(found(1, i))]);\n      index1->second.push_back(pointlookup[size_t(found(0, i))]);\n   }\n   for(auto& possible: m_vertex_possibles) {\n       sort( possible.second.begin(), possible.second.end() );\n       possible.second.erase( unique( possible.second.begin(), possible.second.end() ), possible.second.end() );\n   }\n\n   // three pass operation: (3) create vertex poly entries\n   int current_poly = -1;\n   for (i = 0; i < m_vertex_possibles.size(); i++) {\n      if (m_vertex_polys[i] == -1) {\n         current_poly++;\n         std::vector<int> addlist;\n         addlist.push_back(int(i));\n         while (addlist.size()) {\n            m_vertex_polys[size_t(addlist.back())] = current_poly;\n            std::vector<Point2f>& connections = depthmapX::getMapAtIndex(m_vertex_possibles, addlist.back())->second;\n            addlist.pop_back();\n            for (size_t j = 0; j < connections.size(); j++) {\n               int index = depthmapX::findIndexFromKey(m_vertex_possibles, connections[j]);\n               if (index == -1) {\n                  throw 3;\n               }\n               if (m_vertex_polys[size_t(index)] == -1) {\n                  addlist.push_back(index);\n               }\n            }\n         }\n      }\n   }\n}\n\nvoid AxialPolygons::makePixelPolys()\n{\n   // record all of this onto the pixel polygons\n\n   m_pixel_polys = depthmapX::ColumnMatrix<std::vector<int>>(m_rows, m_cols);\n   // now register the vertices in each pixel...\n   int j = -1;\n   for (auto vertPoss: m_vertex_possibles) {\n      j++;\n      PixelRef pix = pixelate(vertPoss.first);\n      m_pixel_polys(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x)).push_back(j);\n   }\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\n// almost identical to original!\n\nAxialVertexKey AxialPolygons::seedVertex(const Point2f& seed)\n{\n   AxialVertexKey seedvertex = NoVertex;\n   PixelRef seedref = pixelate(seed);\n   bool foundvertex = false;\n   // for spiralling outwards to find a vertex:\n   int dir = PixelRef::HORIZONTAL;\n   int sidelength = 1;\n   int runlength = 0;\n   int allboundaries = 0;\n\n   while (!foundvertex) {\n      for (int vertexref: m_pixel_polys(static_cast<size_t>(seedref.y), static_cast<size_t>(seedref.x))) {\n         const Point2f& trialpoint = depthmapX::getMapAtIndex(m_vertex_possibles, vertexref)->first;\n         if (!intersect_exclude(Line(seed,trialpoint))) {\n            // yay... ...but wait... we need to see if it's a proper polygon vertex first...\n            seedvertex = vertexref;\n            foundvertex = true;\n         }\n      }\n      if (!foundvertex) {\n         seedref = seedref.move(dir);\n         // spiral outwards:\n         if (++runlength == sidelength) {\n            switch (dir) {\n            case PixelRef::HORIZONTAL:\n               dir = PixelRef::VERTICAL; runlength = 0;\n               break;\n            case PixelRef::VERTICAL:\n               dir = PixelRef::NEGHORIZONTAL; runlength = 0; sidelength++;\n               break;\n            case PixelRef::NEGHORIZONTAL:\n               dir = PixelRef::NEGVERTICAL; runlength = 0;\n               break;\n            case PixelRef::NEGVERTICAL:\n               dir = PixelRef::HORIZONTAL; runlength = 0; sidelength++;\n               break;\n            }\n         }\n         // check to make sure not off edge of system:\n         if (seedref.x < 0) {\n            allboundaries |= 0x01; seedref.x = 0;\n         }\n         if (seedref.y < 0) {\n            allboundaries |= 0x02; seedref.y = 0;\n         }\n         if (seedref.x >= static_cast<short>(m_cols)) {\n            allboundaries |= 0x04; seedref.x = m_cols - 1;\n         }\n         if (seedref.y >= static_cast<short>(m_rows)) {\n            allboundaries |= 0x08; seedref.y = m_rows - 1;\n         }\n         if (allboundaries == 0x0f) {\n            return NoVertex;\n         }\n      }\n   }\n   return seedvertex;\n}\n\n// adds any axial lines from this point to the list of lines, adds any unhandled visible vertices it finds to the openvertices list\n// axial lines themselves are added to the lines list - the axial line is only there to record the key vertices that comprise the line\nvoid AxialPolygons::makeAxialLines(std::set<AxialVertex>& openvertices, std::vector<Line>& lines,\n                                   KeyVertices& keyvertices, std::vector<PolyConnector>& poly_connections,\n                                   std::vector<RadialLine>& radial_lines)\n{\n   auto it = openvertices.rbegin();\n   AxialVertex vertex = *it;\n   openvertices.erase(std::next(it).base());\n\n   m_handled_list.insert(vertex);\n\n   int i = -1;\n   for (auto vertPoss: m_vertex_possibles) {\n      i++;\n      if (i == vertex.m_ref_key) {\n         continue;\n      }\n      bool possible = false, stubpossible = false;\n      Point2f p = vertPoss.first - vertex.m_point;\n      if (vertex.m_convex) {\n         if (det(vertex.m_a,p) > 0 && det(vertex.m_b,p) > 0) {\n            possible = true;\n         }\n      }\n      else {\n         // left of b and right of a or left of a and right of b\n         if (det(p,vertex.m_a) * det(p,vertex.m_b) < 0) {\n            possible = true;\n         }\n         else if (det(p,vertex.m_a) < TOLERANCE_A && det(p,vertex.m_b) < TOLERANCE_A) {\n            stubpossible = true;\n         }\n      }\n      if (possible || stubpossible) {\n         Line line(vertPoss.first,vertex.m_point);\n         if (!intersect_exclude(line)) {\n            AxialVertex next_vertex = makeVertex(AxialVertexKey(i),vertex.m_point);\n            if (next_vertex.m_initialised && std::find(m_handled_list.begin(), m_handled_list.end(), next_vertex) == m_handled_list.end()) {\n               openvertices.insert(next_vertex); // <- note, add ignores duplicate adds (each vertex tends to be added multiple times before this vertex is handled itself)\n               bool shortline_segend = false;\n               Line shortline = line;\n               if (!vertex.m_convex && possible) {\n                  Line ext(line.t_end(), line.t_end() + (line.t_end() - line.t_start()));\n                  ext.ray(1, m_region);\n                  cutLine(ext, 1);\n                  line = Line(line.t_start(), ext.t_end());\n                  // for radial line segend calc:\n                  if (det(-p,vertex.m_b) < 0) {\n                     shortline_segend = true;\n                  }\n               }\n               if (m_vertex_polys[vertex.m_ref_key] != m_vertex_polys[next_vertex.m_ref_key]) { // must be on separate polygons\n                  // radial line(s) (for new point)\n                  RadialLine radialshort(next_vertex, shortline_segend, vertex.m_point,next_vertex.m_point,next_vertex.m_point+next_vertex.m_b);\n                  poly_connections.push_back( PolyConnector(shortline, (RadialKey)radialshort) );\n                  radial_lines.push_back(radialshort);\n                  if (!vertex.m_convex && possible) {\n                     Line longline = Line(vertPoss.first,line.t_end());\n                     RadialLine radiallong(radialshort);\n                     radiallong.segend = shortline_segend ? 0 : 1;\n                     poly_connections.push_back( PolyConnector(longline, (RadialKey)radiallong) );\n                     radial_lines.push_back(radiallong);\n                  }\n               }\n               shortline_segend = false;\n               if (!next_vertex.m_convex && next_vertex.m_axial) {\n                  Line ext(line.t_start() - (line.t_end() - line.t_start()), line.t_start());\n                  ext.ray(0, m_region);\n                  cutLine(ext, 0);\n                  line = Line(ext.t_start(), line.t_end());\n                  // for radial line segend calc:\n                  if (det(p,next_vertex.m_b) < 0) {\n                     shortline_segend = true;\n                  }\n               }\n               if (m_vertex_polys[vertex.m_ref_key] != m_vertex_polys[next_vertex.m_ref_key]) { // must be on separate polygons\n                  // radial line(s) (for original point)\n                  RadialLine radialshort(vertex, shortline_segend, next_vertex.m_point,vertex.m_point,vertex.m_point+vertex.m_b);\n                  poly_connections.push_back( PolyConnector(shortline, (RadialKey)radialshort) );\n                  radial_lines.push_back(radialshort);\n                  if (!next_vertex.m_convex && next_vertex.m_axial) {\n                     Line longline = Line(line.t_start(),vertex.m_point);\n                     RadialLine radiallong(radialshort);\n                     radiallong.segend = shortline_segend ? 0 : 1;\n                     poly_connections.push_back( PolyConnector(longline, (RadialKey)radiallong) );\n                     radial_lines.push_back(radiallong);\n                  }\n               }\n               if (possible && next_vertex.m_axial) {\n                  // axial line\n                  lines.push_back(line);\n                  keyvertices.push_back(std::set<int>());\n                  if (vertex.m_convex) {\n                     keyvertices.back().insert(vertex.m_ref_key);\n                  }\n                  if (next_vertex.m_convex) {\n                     keyvertices.back().insert(next_vertex.m_ref_key);\n                  }\n               }\n            }\n         }\n      }\n   }\n   std::sort( radial_lines.begin(), radial_lines.end() );\n   radial_lines.erase( std::unique( radial_lines.begin(), radial_lines.end() ), radial_lines.end() );\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n\n// not really used as yet, a feature to make all the polygons from the vertex\n// possibles list\n\nvoid AxialPolygons::makePolygons(std::vector<std::vector<Point2f>>& polygons)\n{\n   std::vector<std::vector<int> > handled_list;\n   for (size_t j = 0; j < m_vertex_possibles.size(); j++) {\n      handled_list.push_back(std::vector<int>());\n   }\n\n   int i = -1;\n   for (auto vertPoss: m_vertex_possibles) {\n      i++;\n      std::vector<int>& currList = handled_list[size_t(i)];\n      if (vertPoss.second.size() == 1) {\n         continue;\n      }\n      for (size_t j = 0; j < vertPoss.second.size(); j++) {\n         if (std::find(currList.begin(), currList.end(), j) != currList.end()) {\n            continue;\n         }\n         currList.push_back(int(j));\n         const Point2f& key = vertPoss.first;\n         std::vector<Point2f> polygon;\n         polygon.push_back(key);\n         Point2f curr = vertPoss.second.at(j);\n         Point2f last = key;\n         bool good = true;\n         while (curr != key) {\n            auto vertPossIter = m_vertex_possibles.find(curr);\n            polygon.push_back(curr);\n            // hunt down left most\n            int winner = -1, wayback = -1;\n            double minangle = 2 * M_PI;\n            for (size_t k = 0; k < vertPossIter->second.size(); k++) {\n               Point2f next = vertPossIter->second.at(k);\n               if (last != next) {\n                  double thisangle = angle(last,curr,next);\n                  if (thisangle < minangle) {\n                     // check not going to a dead end:\n                     if (m_vertex_possibles.find(vertPossIter->second.at(k))->second.size() > 1) {\n                        minangle = thisangle;\n                        winner = k;\n                     }\n                  }\n               }\n               else {\n                  wayback = k;\n               }\n            }\n            if (winner == -1) {\n               // this happens when you follow a false trail -- go back the way you came!\n               winner = wayback;\n            }\n            handled_list[std::distance(m_vertex_possibles.begin(), vertPossIter)].push_back(winner);\n            last = curr;\n            curr = vertPossIter->second.at(winner);\n         }\n         if (good) {\n            polygons.push_back(polygon);\n         }\n         good = true;\n      }\n   }\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n\nbool RadialLine::cuts(const Line& l) const\n{\n   if (fabs(det(l.end() - keyvertex,l.end() - l.start())) < TOLERANCE_A) {\n      // point on line, check that openspace and next vertex are on opposite sides of the line\n      Point2f x = l.end() - keyvertex;\n      Point2f y = nextvertex - keyvertex;\n      Point2f z = openspace - keyvertex;\n      x.normalise();\n      y.normalise();\n      z.normalise();\n      if (sgn(det(x, y)) == sgn(det(x, z)) && fabs(det(x, z)) > TOLERANCE_A) {\n         return false;\n      }\n   }\n   // keyvertex not on line... the line's been cut:\n   return true;\n}\n"
  },
  {
    "path": "salalib/axialpolygons.h",
    "content": "#pragma once\n\n#include \"salalib/spacepix.h\"\n#include \"salalib/axialmap.h\"\n#include \"salalib/connector.h\"\n\n#include \"genlib/simplematrix.h\"\n#include \"genlib/p2dpoly.h\"\n\nstruct AxialVertexKey\n{\n   int m_ref_key;\n   short m_ref_a;\n   short m_ref_b;\n   AxialVertexKey(int ref = -1, short a = -1, short b = -1)\n   { m_ref_key = ref; m_ref_a = a; m_ref_b = b; }\n   friend bool operator == (const AxialVertexKey& a, const AxialVertexKey& b);\n   friend bool operator != (const AxialVertexKey& a, const AxialVertexKey& b);\n   friend bool operator > (const AxialVertexKey& a, const AxialVertexKey& b);\n   friend bool operator < (const AxialVertexKey& a, const AxialVertexKey& b);\n};\ninline bool operator == (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key == b.m_ref_key && a.m_ref_a == b.m_ref_a && a.m_ref_b == b.m_ref_b); }\ninline bool operator != (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key != b.m_ref_key || a.m_ref_a != b.m_ref_a || a.m_ref_b != b.m_ref_b); }\ninline bool operator > (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key > b.m_ref_key || (a.m_ref_key == b.m_ref_key && (a.m_ref_a > b.m_ref_a || (a.m_ref_a == b.m_ref_a && a.m_ref_b > b.m_ref_b)))); }\ninline bool operator < (const AxialVertexKey& a, const AxialVertexKey& b)\n{ return (a.m_ref_key < b.m_ref_key || (a.m_ref_key == b.m_ref_key && (a.m_ref_a < b.m_ref_a || (a.m_ref_a == b.m_ref_a && a.m_ref_b < b.m_ref_b)))); }\n\nconst AxialVertexKey NoVertex(-1,-1,-1);\n\nstruct AxialVertex : public AxialVertexKey\n{\n   Point2f m_point;\n   Point2f m_openspace;\n   Point2f m_a;\n   Point2f m_b;\n   bool m_clockwise;\n   bool m_convex;\n   bool m_initialised;\n   bool m_axial;\n   AxialVertex(const AxialVertexKey& vertex_key = NoVertex, const Point2f& point = Point2f(), const Point2f& openspace = Point2f()) : AxialVertexKey(vertex_key)\n   { m_point = point; m_openspace = openspace; m_initialised = false; m_axial = false; }\n};\n\nstruct RadialKey {\n   AxialVertexKey vertex;\n   float ang;\n   bool segend;\n   // padding the remaining three bytes behind the bool - don't use int : 24 as this will grab the next 4 byte block\n   char pad1 : 8;\n   short pad2 : 16;\n\n   RadialKey(const AxialVertexKey& v = NoVertex, float a = -1.0f, bool se = false) : pad1(0), pad2(0)\n   { vertex = v; ang = a; segend = se; }\n   RadialKey(const RadialKey& rk) : pad1(0), pad2(0)\n   { vertex = rk.vertex; ang = rk.ang; segend = rk.segend; }\n};\ninline bool operator < (const RadialKey& a, const RadialKey& b)\n{ return a.vertex < b.vertex || (a.vertex == b.vertex && (a.ang < b.ang || (a.ang == b.ang && a.segend < b.segend))); }\ninline bool operator > (const RadialKey& a, const RadialKey& b)\n{ return a.vertex > b.vertex || (a.vertex == b.vertex && (a.ang > b.ang || (a.ang == b.ang && a.segend > b.segend))); }\ninline bool operator == (const RadialKey& a, const RadialKey& b)\n{ return a.vertex == b.vertex && a.ang == b.ang && a.segend == b.segend; }\n\nstruct RadialLine : public RadialKey\n{\n   Point2f openspace;\n   Point2f keyvertex;\n   Point2f nextvertex;\n   RadialLine(const RadialKey& rk = RadialKey()) : RadialKey(rk) {;}\n   RadialLine(const AxialVertexKey& v, bool se, const Point2f& o, const Point2f& k, const Point2f& n)\n   { vertex = v; ang = (float) angle(o,k,n); segend = se; openspace = o; keyvertex = k; nextvertex = n; }\n   RadialLine(const RadialLine& rl) : RadialKey(rl)\n   { openspace = rl.openspace; keyvertex = rl.keyvertex; nextvertex = rl.nextvertex; }\n   bool cuts(const Line& l) const;\n};\n\nstruct RadialSegment\n{\n   std::set<int> indices;\n   RadialKey radial_b;\n\n   RadialSegment(RadialKey& rb)\n   { radial_b = rb; }\n   RadialSegment(const RadialKey& rb)\n   { radial_b = rb; }\n   RadialSegment()\n   { radial_b = RadialKey(); }\n\n};\n\nstruct PolyConnector {\n   Line line;\n   RadialKey key;\n   PolyConnector(const Line& l = Line(), const RadialKey& k = RadialKey())\n   { line = l; key = k; }\n};\n\n\nclass AxialPolygons : public SpacePixel\n{\n   friend class ShapeGraphs;\nprotected:\n   std::vector<int> m_vertex_polys;\n   depthmapX::ColumnMatrix<std::vector<int> > m_pixel_polys;\npublic:\n   AxialPolygons(): m_pixel_polys(0,0) {}\n   std::set<AxialVertex> m_handled_list;\n   std::map<Point2f, std::vector<Point2f>> m_vertex_possibles;\n\n   void clear();\n   void init(std::vector<Line> &lines, const QtRegion& region);\n   void makeVertexPossibles(const std::vector<Line> &lines, const std::vector<Connector> &connectionset);\n   void makePixelPolys();\n   //\n   AxialVertex makeVertex(const AxialVertexKey& vertexkey, const Point2f& openspace);\n   // find a polygon corner visible from seed:\n   AxialVertexKey seedVertex(const Point2f& seed);\n   // make axial lines from corner vertices, visible from openspace\n   void makeAxialLines(std::set<AxialVertex> &openvertices, std::vector<Line>& lines,\n                       KeyVertices &keyvertices, std::vector<PolyConnector>& poly_connections,\n                       std::vector<RadialLine> &radial_lines);\n   // extra: make all the polygons possible from the set of m_vertex_possibles\n   void makePolygons(std::vector<std::vector<Point2f> > &polygons);\n};\n"
  },
  {
    "path": "salalib/connector.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include \"salalib/connector.h\"\r\n\r\n#include \"genlib/containerutils.h\"\r\n#include \"genlib/readwritehelpers.h\"\r\n#include \"genlib/comm.h\" // for communicator\r\n\r\n#include <math.h>\r\n#include <float.h>\r\n#include <time.h>\r\n\r\nbool Connector::read( std::istream& stream)\r\n{\r\n   m_connections.clear();\r\n   m_forward_segconns.clear();\r\n   m_back_segconns.clear();\r\n\r\n   // n.b., must set displayed attribute as soon as loaded...\r\n   dXreadwrite::readIntoVector(stream, m_connections);\r\n\r\n   stream.read((char *)&m_segment_axialref, sizeof(m_segment_axialref));\r\n\r\n   dXreadwrite::readIntoMap(stream, m_forward_segconns);\r\n   dXreadwrite::readIntoMap(stream, m_back_segconns);\r\n\r\n   return true;\r\n}\r\n\r\nbool Connector::write( std::ofstream& stream )\r\n{\r\n   // n.b., must set displayed attribute as soon as loaded...\r\n   dXreadwrite::writeVector(stream, m_connections);\r\n   stream.write((char *)&m_segment_axialref, sizeof(m_segment_axialref));\r\n\r\n   dXreadwrite::writeMap(stream, m_forward_segconns);\r\n   dXreadwrite::writeMap(stream, m_back_segconns);\r\n\r\n   return true;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// Cursor extras\r\n\r\nint Connector::count(int mode) const\r\n{\r\n   int c = 0;\r\n   switch (mode) {\r\n   case CONN_ALL:\r\n      c = m_connections.size();\r\n      break;\r\n   case SEG_CONN_ALL:\r\n      c = m_back_segconns.size() + m_forward_segconns.size();\r\n      break;\r\n   case SEG_CONN_FW:\r\n      c = m_forward_segconns.size();\r\n      break;\r\n   case SEG_CONN_BK:\r\n      c = m_back_segconns.size();\r\n      break;\r\n   }\r\n   return c;\r\n}\r\nint Connector::getConnectedRef(int cursor, int mode) const\r\n{\r\n   int cur = -1;\r\n   if (cursor != -1) {\r\n      switch (mode) {\r\n      case CONN_ALL:\r\n         if (cursor < int(m_connections.size())) {\r\n            cur = m_connections[size_t(cursor)];\r\n         }\r\n         break;\r\n      case SEG_CONN_ALL:\r\n         if (cursor < int(m_back_segconns.size())) {\r\n            cur = depthmapX::getMapAtIndex(m_back_segconns, cursor)->first.ref;\r\n         }\r\n         else if (size_t(cursor) - m_back_segconns.size() < m_forward_segconns.size()) {\r\n            cur = depthmapX::getMapAtIndex(m_forward_segconns, cursor - int(m_back_segconns.size()))->first.ref;\r\n         }\r\n         break;\r\n      case SEG_CONN_FW:\r\n         if (cursor < int(m_forward_segconns.size())) {\r\n            cur = depthmapX::getMapAtIndex(m_forward_segconns, cursor)->first.ref;\r\n         }\r\n         break;\r\n      case SEG_CONN_BK:\r\n         if (cursor < int(m_back_segconns.size())) {\r\n            cur = depthmapX::getMapAtIndex(m_back_segconns, cursor)->first.ref;\r\n         }\r\n         break;\r\n      }\r\n   }\r\n   return cur;\r\n}\r\nint Connector::direction(int cursor, int mode) const\r\n{\r\n   int direction = 0;\r\n   if (cursor != -1) {\r\n      switch (mode) {\r\n      case SEG_CONN_ALL:\r\n         if (cursor < (int)m_back_segconns.size()) {\r\n            direction = depthmapX::getMapAtIndex(m_back_segconns, cursor)->first.dir;\r\n         }\r\n         else if (size_t(cursor) - m_back_segconns.size() < m_forward_segconns.size()) {\r\n            direction = depthmapX::getMapAtIndex(m_forward_segconns, cursor - int(m_back_segconns.size()))->first.dir;\r\n         }\r\n         break;\r\n      case SEG_CONN_FW:\r\n         direction = depthmapX::getMapAtIndex(m_forward_segconns, cursor)->first.dir;\r\n         break;\r\n      case SEG_CONN_BK:\r\n         direction = depthmapX::getMapAtIndex(m_back_segconns, cursor)->first.dir;\r\n         break;\r\n      }\r\n   }\r\n   return direction;\r\n}\r\nfloat Connector::weight(int cursor, int mode) const\r\n{\r\n   float weight = 0.0f;\r\n   if (cursor != -1) {\r\n      switch (mode) {\r\n      case SEG_CONN_ALL:\r\n         if (cursor < int(m_back_segconns.size())) {\r\n            weight = depthmapX::getMapAtIndex(m_back_segconns, cursor)->second;\r\n         }\r\n         else if (size_t(cursor) - m_back_segconns.size() < m_forward_segconns.size()) {\r\n            weight = depthmapX::getMapAtIndex(m_forward_segconns, cursor - int(m_back_segconns.size()))->second;\r\n         }\r\n         break;\r\n      case SEG_CONN_FW:\r\n         weight = depthmapX::getMapAtIndex(m_forward_segconns, cursor)->second;\r\n         break;\r\n      case SEG_CONN_BK:\r\n         weight = depthmapX::getMapAtIndex(m_back_segconns, cursor)->second;\r\n         break;\r\n      }\r\n   }\r\n   return weight;\r\n}\r\n"
  },
  {
    "path": "salalib/connector.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#pragma once\r\n\r\n#include <istream>\r\n#include <ostream>\r\n#include <vector>\r\n#include <map>\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n// Additional for segment analysis\r\n\r\nstruct SegmentRef\r\n{\r\n   char dir;\r\n   // padding the remaining three bytes behind the char\r\n   char pad1 : 8;\r\n   short pad2 : 16;\r\n   int ref;\r\n   SegmentRef(char d = 0, int r = -1): pad1(0), pad2(0)\r\n   { dir = d; ref = r; }\r\n};\r\n// note, the dir is only a direction indicator, the ref should always be unique\r\ninline bool  operator < (SegmentRef a, SegmentRef b) { return a.ref < b.ref; }\r\ninline bool operator > (SegmentRef a, SegmentRef b)  { return a.ref > b.ref; }\r\ninline bool operator == (SegmentRef a, SegmentRef b) { return a.ref == b.ref; }\r\ninline bool operator != (SegmentRef a, SegmentRef b) { return a.ref != b.ref; }\r\n\r\n// used during angular analysis\r\nstruct SegmentData : public SegmentRef\r\n{\r\n   SegmentRef previous;\r\n   int segdepth;\r\n   float metricdepth;\r\n   unsigned int coverage;\r\n   SegmentData(char d = 0, int r = -1, SegmentRef p = SegmentRef(), int sd = 0, float md = 0.0f, unsigned int cv = 0xffffffff)\r\n   { dir = d; ref = r; previous = p; segdepth = sd; metricdepth = md; coverage = cv; }\r\n   SegmentData(SegmentRef ref, SegmentRef p = SegmentRef(), int sd = 0, float md = 0.0f, unsigned int cv = 0xffffffff) : SegmentRef(ref)\r\n   { previous = p; segdepth = sd; metricdepth = md; coverage = cv; }\r\n   friend bool operator < (SegmentData a, SegmentData b);\r\n   friend bool operator > (SegmentData a, SegmentData b);\r\n   friend bool operator == (SegmentData a, SegmentData b);\r\n   friend bool operator != (SegmentData a, SegmentData b);\r\n};\r\n// note, these are stored in reverse metric depth order (i.e., metric shorter paths are taken off the end of the list first)\r\ninline bool operator < (SegmentData a, SegmentData b)  { return a.metricdepth > b.metricdepth; }\r\ninline bool operator > (SegmentData a, SegmentData b)  { return a.metricdepth < b.metricdepth; }\r\ninline bool operator == (SegmentData a, SegmentData b) { return a.metricdepth == b.metricdepth; }\r\ninline bool operator != (SegmentData a, SegmentData b) { return a.metricdepth != b.metricdepth; }\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\n// Main connector class for segments, convex spaces or axial lines\r\n\r\nstruct Connector\r\n{\r\n   //  if this is a segment, this is the key for the axial line:\r\n   int m_segment_axialref;\r\n   // use one or other of these\r\n   std::vector<int> m_connections;\r\n   //\r\n   std::map<SegmentRef, float> m_back_segconns;\r\n   std::map<SegmentRef, float> m_forward_segconns;\r\n   //\r\n   Connector(int axialref = -1)\r\n   { m_segment_axialref = axialref; }\r\n   void clear()\r\n   { m_connections.clear(); m_back_segconns.clear(); m_forward_segconns.clear(); }\r\n   //\r\n   bool read(std::istream &stream);\r\n   bool write( std::ofstream& stream );\r\n   //\r\n   // Cursor extras\r\n   enum { CONN_ALL, SEG_CONN_ALL, SEG_CONN_FW, SEG_CONN_BK };\r\n\r\n   // PK: These functions have been stripped of state and left\r\n   // here for salaprogram which seems to be the only place they\r\n   // are used. salaprogram seems to also be the only place where\r\n   // the last two modes (SEG_CONN_FW, SEG_CONN_BK) are used\r\n   int count(int mode = CONN_ALL) const;\r\n   int getConnectedRef(int cursor, int mode = CONN_ALL) const;\r\n   int direction(int cursor, int mode = SEG_CONN_ALL) const;\r\n   float weight(int cursor, int mode = SEG_CONN_ALL) const;\r\n};\r\n"
  },
  {
    "path": "salalib/displayparams.h",
    "content": "#pragma once\n\nstruct DisplayParams\n{\n   enum { AXMANESQUE = 0, GREYSCALE = 1, MONOCHROME = 2, DEPTHMAPCLASSIC = 3, PURPLEORANGE = 4, BLUERED = 5, HUEONLYAXMANESQUE = 6 };\n   float blue;\n   float red;\n   int colorscale;\n   DisplayParams()\n   { blue = 0.0f; red = 1.0f; colorscale = 0; }\n};\n"
  },
  {
    "path": "salalib/entityparsing.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"entityparsing.h\"\n#include <exception>\n#include <cstdlib>\n#include <sstream>\n\n#include \"genlib/stringutils.h\"\n\nnamespace EntityParsing {\n\n    std::vector<Line> parseLines(std::istream& stream, char delimiter = '\\t') {\n\n        std::vector<Line> lines;\n\n        std::string inputline;\n        std::getline(stream, inputline);\n\n        std::vector<std::string> strings = dXstring::split(inputline, delimiter);\n\n        if (strings.size() < 4)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain x1, y1, x2 and y2)\");\n        }\n\n        size_t i;\n        for (i = 0; i < strings.size(); i++)\n        {\n           if (!strings[i].empty())\n           {\n               std::transform(strings[i].begin(), strings[i].end(), strings[i].begin(), ::tolower);\n               //strings[i].ltrim('\\\"');\n               //strings[i].rtrim('\\\"');\n           }\n        }\n\n        int x1col = -1, y1col = -1, x2col = -1, y2col = -1;\n        for (i = 0; i < strings.size(); i++) {\n            if (strings[i] == \"x1\")\n            {\n                x1col = i;\n            }\n            else if (strings[i] == \"x2\")\n            {\n                x2col = i;\n            }\n            else if (strings[i] == \"y1\")\n            {\n                y1col = i;\n            }\n            else if (strings[i] == \"y2\")\n            {\n                y2col = i;\n            }\n        }\n\n        if(x1col == -1 || y1col == -1 || x2col == -1 || y2col == -1)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain x1, y1, x2 and y2)\");\n        }\n\n        Point2f p1, p2;\n\n        while (!stream.eof()) {\n            std::getline(stream, inputline);\n            if (!inputline.empty()) {\n                strings = dXstring::split(inputline, delimiter);\n                if (!strings.size())\n                {\n                    continue;\n                }\n                if (strings.size() < 4)\n                {\n                    std::stringstream message;\n                    message << \"Error parsing line: \" << inputline << std::flush;\n                    throw EntityParseException(message.str().c_str());\n                }\n                for (i = 0; i < strings.size(); i++)\n                {\n                    if (static_cast<int>(i) == x1col)\n                    {\n                        p1.x = std::atof(strings[i].c_str());\n                    }\n                    else if (static_cast<int>(i) == y1col)\n                    {\n                        p1.y = std::atof(strings[i].c_str());\n                    }\n                    else if (static_cast<int>(i) == x2col)\n                    {\n                        p2.x = std::atof(strings[i].c_str());\n                    }\n                    else if (static_cast<int>(i) == y2col)\n                    {\n                        p2.y = std::atof(strings[i].c_str());\n                    }\n                }\n                lines.push_back(Line(p1,p2));\n            }\n        }\n        return lines;\n    }\n\n    std::vector<Point2f> parsePoints(std::istream& stream, char delimiter = '\\t') {\n\n        std::vector<Point2f> points;\n\n        std::string inputline;\n        std::getline(stream, inputline);\n\n        std::vector<std::string> strings = dXstring::split(inputline, delimiter);\n\n        if (strings.size() < 2)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain x and y)\");\n        }\n\n        size_t i;\n        for (i = 0; i < strings.size(); i++)\n        {\n           if (!strings[i].empty())\n           {\n               std::transform(strings[i].begin(), strings[i].end(), strings[i].begin(), ::tolower);\n               //strings[i].ltrim('\\\"');\n               //strings[i].rtrim('\\\"');\n           }\n        }\n\n        int xcol = -1, ycol = -1;\n        for (i = 0; i < strings.size(); i++) {\n            if (strings[i] == \"x\")\n            {\n                xcol = i;\n            }\n            else if (strings[i] == \"y\")\n            {\n                ycol = i;\n            }\n        }\n\n        if(xcol == -1 || ycol == -1)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain x and y)\");\n        }\n\n        Point2f p;\n\n        while (!stream.eof()) {\n            std::getline(stream, inputline);\n            if (!inputline.empty()) {\n                strings = dXstring::split(inputline, delimiter);\n                if (!strings.size())\n                {\n                    continue;\n                }\n                if (strings.size() < 2)\n                {\n                    std::stringstream message;\n                    message << \"Error parsing line: \" << inputline << std::flush;\n                    throw EntityParseException(message.str().c_str());\n                }\n                for (i = 0; i < strings.size(); i++)\n                {\n                    if (static_cast<int>(i) == xcol)\n                    {\n                        p.x = std::atof(strings[i].c_str());\n                    }\n                    else if (static_cast<int>(i) == ycol)\n                    {\n                        p.y = std::atof(strings[i].c_str());\n                    }\n                }\n                points.push_back(p);\n            }\n        }\n        return points;\n    }\n\n    Point2f parsePoint(const std::string &point, char delimiter)\n    {\n        std::vector<std::string> strings = dXstring::split(point, delimiter);\n\n        if (strings.size() != 2)\n        {\n            std::stringstream message;\n            message << \"Badly formatted point data, should be <number>\" << delimiter << \"<number>, was \" << point << std::flush;\n             throw EntityParseException(message.str());\n        }\n        return Point2f(atof(strings[0].c_str()), atof(strings[1].c_str()));\n    }\n\n    std::vector<IsovistDefinition> parseIsovists(std::istream &stream, char delimiter)\n    {\n        std::vector<IsovistDefinition> isovists;\n\n        std::string inputline;\n        std::getline(stream, inputline);\n\n        std::vector<std::string> strings = dXstring::split(inputline, delimiter);\n\n        if (strings.size() < 2)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain x, y, can also have angle and viewangle for partial isovists)\");\n        }\n\n        size_t i;\n        for (i = 0; i < strings.size(); i++)\n        {\n           if (!strings[i].empty())\n           {\n               std::transform(strings[i].begin(), strings[i].end(), strings[i].begin(), ::tolower);\n           }\n        }\n\n        int xcol = -1, ycol = -1, anglecol = -1, viewcol = -1;\n        for (i = 0; i < strings.size(); i++) {\n            if (strings[i] == \"x\")\n            {\n                xcol = i;\n            }\n            else if (strings[i] == \"y\")\n            {\n                ycol = i;\n            }\n            else if (strings[i] == \"angle\")\n            {\n                anglecol = i;\n            }\n            else if (strings[i] == \"viewangle\")\n            {\n                viewcol = i;\n            }\n        }\n\n        if(xcol == -1 || ycol == -1 )\n        {\n            throw EntityParseException(\"Badly formatted header (should contain x and y, might also have angle and viewangle for partial isovists)\");\n        }\n\n\n        bool partialIsovists =  anglecol != -1 && viewcol != -1;\n        int maxCol = std::max({xcol, ycol, anglecol, viewcol});\n        while ( !stream.eof())\n        {\n            std::getline(stream, inputline);\n            if (!inputline.empty())\n            {\n                strings = dXstring::split(inputline, delimiter);\n                if (!strings.size())\n                {\n                    continue;\n                }\n                if (static_cast<int>(strings.size()) <= maxCol)\n                {\n                    std::stringstream message;\n                    message << \"Error parsing line: \" << inputline << std::flush;\n                    throw EntityParseException(message.str().c_str());\n                }\n\n                double x = std::atof(strings[xcol].c_str());\n                double y = std::atof(strings[ycol].c_str());\n\n                if (partialIsovists)\n                {\n                    double angle = std::atof(strings[anglecol].c_str()) / 180.0 * M_PI;\n                    double viewAngle = std::atof(strings[viewcol].c_str())/180.0 * M_PI;\n                    isovists.push_back(IsovistDefinition(x,y,angle,viewAngle));\n                }\n                else\n                {\n                    isovists.push_back(IsovistDefinition(x,y));\n                }\n            }\n        }\n        return isovists;\n    }\n\n    IsovistDefinition parseIsovist(const std::string &isovist)\n    {\n        auto parts = dXstring::split(isovist, ',');\n        if (parts.size() == 2)\n        {\n            return IsovistDefinition(std::atof(parts[0].c_str()), std::atof(parts[1].c_str()));\n        }\n        else if (parts.size() == 4)\n        {\n            double angle = std::atof(parts[2].c_str()) / 180.0 * M_PI;\n            double viewAngle = std::atof(parts[3].c_str())/180.0 * M_PI;\n            return IsovistDefinition(std::atof(parts[0].c_str()), std::atof(parts[1].c_str()), angle, viewAngle);\n        }\n        std::stringstream message;\n        message << \"Failed to parse '\" << isovist << \"' to an isovist definition\";\n        throw EntityParseException(message.str());\n    }\n\n    std::vector<std::pair<int, int> > parseRefPairs(std::istream& stream, char delimiter = '\\t') {\n\n        std::vector<std::pair<int, int> > pairs;\n\n        std::string inputline;\n        std::getline(stream, inputline);\n\n        std::vector<std::string> strings = dXstring::split(inputline, delimiter);\n\n        if (strings.size() < 2)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain reffrom and refto)\");\n        }\n\n        size_t i;\n        for (i = 0; i < strings.size(); i++)\n        {\n           if (!strings[i].empty())\n           {\n               std::transform(strings[i].begin(), strings[i].end(), strings[i].begin(), ::tolower);\n               //strings[i].ltrim('\\\"');\n               //strings[i].rtrim('\\\"');\n           }\n        }\n\n        int fromcol = -1, tocol = -1;\n        for (i = 0; i < strings.size(); i++) {\n            if (strings[i] == \"reffrom\")\n            {\n                fromcol = int(i);\n            }\n            else if (strings[i] == \"refto\")\n            {\n                tocol = int(i);\n            }\n        }\n\n        if(fromcol == -1 || tocol == -1)\n        {\n            throw EntityParseException(\"Badly formatted header (should contain reffrom and refto)\");\n        }\n\n\n        while (!stream.eof()) {\n            std::getline(stream, inputline);\n            if (!inputline.empty()) {\n                strings = dXstring::split(inputline, delimiter);\n                if (!strings.size())\n                {\n                    continue;\n                }\n                if (strings.size() < 2)\n                {\n                    std::stringstream message;\n                    message << \"Error parsing line: \" << inputline << std::flush;\n                    throw EntityParseException(message.str().c_str());\n                }\n                int from = -1, to = -1;\n                for (i = 0; i < strings.size(); i++)\n                {\n                    if (i == size_t(fromcol))\n                    {\n                        from = std::atoi(strings[i].c_str());\n                    }\n                    else if (i == size_t(tocol))\n                    {\n                        to = std::atoi(strings[i].c_str());\n                    }\n                }\n                pairs.push_back(std::make_pair(from, to));\n            }\n        }\n        return pairs;\n    }\n\n\n}\n"
  },
  {
    "path": "salalib/entityparsing.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef ENTITYPARSING_H\n#define ENTITYPARSING_H\n\n#include \"genlib/p2dpoly.h\"\n#include \"genlib/exceptions.h\"\n#include \"isovistdef.h\"\n#include <vector>\n#include <iostream>\n#include <string>\n\nnamespace EntityParsing {\n\n    class EntityParseException : public depthmapX::BaseException\n    {\n    public:\n        EntityParseException(std::string message) : depthmapX::BaseException(message)\n        {}\n    };\n\n    std::vector<std::string> split(const std::string &s, char delim);\n    std::vector<Line> parseLines(std::istream& stream, char delimiter);\n    std::vector<Point2f> parsePoints(std::istream& stream, char delimiter);\n    Point2f parsePoint(const std::string &point, char delimiter = ',');\n    std::vector<IsovistDefinition> parseIsovists(std::istream &stream, char delimiter);\n    IsovistDefinition parseIsovist(const std::string &isovist);\n    std::vector<std::pair<int, int> > parseRefPairs(std::istream& stream, char delimiter);\n}\n\n#endif // ENTITYPARSING_H\n"
  },
  {
    "path": "salalib/fileproperties.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef __FILEPROPERTIES_H__\r\n#define __FILEPROPERTIES_H__\r\n\r\n#include \"genlib/stringutils.h\"\r\nclass FileProperties\r\n{\r\nprotected:\r\n   std::string m_create_person;\r\n   std::string m_create_organization;\r\n   std::string m_create_date;\r\n   std::string m_create_program;\r\n   std::string m_title;\r\n   std::string m_location;\r\n   std::string m_description;\r\npublic:\r\n   FileProperties() {;}\r\n   virtual ~FileProperties() {;}\r\n   //\r\n   void setProperties(const std::string& person, const std::string& organization, const std::string& date, const std::string& program)\r\n   { m_create_person = person; m_create_organization = organization; m_create_date = date; m_create_program = program; }\r\n   void setTitle(const std::string& title)\r\n   { m_title = title; }\r\n   void setLocation(const std::string& location)\r\n   { m_location = location; }\r\n   void setDescription(const std::string& description)\r\n   { m_description = description; }\r\n   //\r\n   const std::string& getPerson() const\r\n   { return m_create_person; }\r\n   const std::string& getOrganization() const\r\n   { return m_create_organization; }\r\n   const std::string& getDate() const\r\n   { return m_create_date; }\r\n   const std::string& getProgram() const\r\n   { return m_create_program; }\r\n   const std::string& getTitle() const\r\n   { return m_title; }\r\n   const std::string& getLocation() const\r\n   { return m_location; }\r\n   const std::string& getDescription() const\r\n   { return m_description; }\r\n   //\r\n   bool read(std::istream &stream);\r\n   bool write(std::ostream& stream);\r\n};\r\n\r\ninline bool FileProperties::read(std::istream& stream)\r\n{\r\n   m_create_person=dXstring::readString(stream);\r\n   m_create_organization=dXstring::readString(stream);\r\n   m_create_date=dXstring::readString(stream);\r\n   m_create_program=dXstring::readString(stream);\r\n   m_title=dXstring::readString(stream);\r\n   m_location=dXstring::readString(stream);\r\n   m_description=dXstring::readString(stream);\r\n\r\n   return true;\r\n}\r\n\r\ninline bool FileProperties::write(std::ostream& stream)\r\n{\r\n   dXstring::writeString(stream, m_create_person);\r\n   dXstring::writeString(stream, m_create_organization);\r\n   dXstring::writeString(stream, m_create_date);\r\n   dXstring::writeString(stream, m_create_program);\r\n   dXstring::writeString(stream, m_title);\r\n   dXstring::writeString(stream, m_location);\r\n   dXstring::writeString(stream, m_description);\r\n\r\n   return true;\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "salalib/geometrygenerators.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"geometrygenerators.h\"\n\nstd::vector<Point2f> GeometryGenerators::generateDiskTriangles(int sides, float radius, Point2f position) {\n    std::vector<Point2f> diskTriangles;\n    for(int i = 0; i < sides; i++) {\n        diskTriangles.push_back(Point2f(position.x, position.y));\n        diskTriangles.push_back(Point2f(position.x + radius*sin(2*M_PI*(i+1)/sides), position.y + radius*cos(2*M_PI*(i+1)/sides)));\n        diskTriangles.push_back(Point2f(position.x + radius*sin(2*M_PI*i/sides), position.y + radius*cos(2*M_PI*i/sides)));\n    }\n    return diskTriangles;\n}\n\nstd::vector<Point2f> GeometryGenerators::generateMultipleDiskTriangles(int sides, float radius, std::vector<Point2f> positions) {\n    std::vector<Point2f> diskTriangles = generateDiskTriangles(sides , radius);\n\n    std::vector<Point2f> mulitpleDiskTriangles;\n\n    std::vector<Point2f>::const_iterator iter = positions.begin(), end =\n    positions.end();\n    for ( ; iter != end; ++iter )\n    {\n        Point2f position = *iter;\n        std::vector<Point2f>::const_iterator iterDiskVertices = diskTriangles.begin(), endDiskPoints =\n        diskTriangles.end();\n        for ( ; iterDiskVertices != endDiskPoints; ++iterDiskVertices )\n        {\n            Point2f vertex = *iterDiskVertices;\n            mulitpleDiskTriangles.push_back(Point2f(position.x + vertex.x,position.y + vertex.y));\n        }\n    }\n    return mulitpleDiskTriangles;\n}\n\nstd::vector<SimpleLine> GeometryGenerators::generateCircleLines(int sides, float radius, Point2f position) {\n    std::vector<SimpleLine> cirleLines;\n    for(int i = 0; i < sides; i++) {\n        cirleLines.push_back(SimpleLine(\n                    Point2f(position.x + radius*sin(2*M_PI*(i+1)/sides), position.y + radius*cos(2*M_PI*(i+1)/sides)),\n                    Point2f(position.x + radius*sin(2*M_PI*i/sides), position.y + radius*cos(2*M_PI*i/sides))\n                    ));\n    }\n    return cirleLines;\n}\n\nstd::vector<SimpleLine> GeometryGenerators::generateMultipleCircleLines(int sides, float radius, std::vector<Point2f> positions) {\n    std::vector<SimpleLine> circleLines = generateCircleLines(sides , radius);\n\n    std::vector<SimpleLine> mulitpleCircleLines;\n\n    std::vector<Point2f>::const_iterator iter = positions.begin(), end =\n    positions.end();\n    for ( ; iter != end; ++iter )\n    {\n        Point2f position = *iter;\n        std::vector<SimpleLine>::const_iterator iterCircleLines = circleLines.begin(), endCircleLines =\n        circleLines.end();\n        for ( ; iterCircleLines != endCircleLines; ++iterCircleLines )\n        {\n            SimpleLine line = *iterCircleLines;\n            mulitpleCircleLines.push_back(SimpleLine(\n                                                Point2f(position.x + line.start().x, position.y + line.start().y),\n                                                Point2f(position.x + line.end().x, position.y + line.end().y)\n                                                ));\n        }\n    }\n    return mulitpleCircleLines;\n}\n"
  },
  {
    "path": "salalib/geometrygenerators.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n\nclass GeometryGenerators\n{\npublic:\n    static std::vector<Point2f> generateDiskTriangles(int sides, float radius, Point2f position = Point2f(0,0));\n    static std::vector<Point2f> generateMultipleDiskTriangles(int sides, float radius, std::vector<Point2f> positions);\n\n    static std::vector<SimpleLine> generateCircleLines(int sides, float radius, Point2f position = Point2f(0,0));\n    static std::vector<SimpleLine> generateMultipleCircleLines(int sides, float radius, std::vector<Point2f> positions);\n};\n"
  },
  {
    "path": "salalib/gridproperties.cpp",
    "content": "#include \"gridproperties.h\"\n#include <math.h>\n\nGridProperties::GridProperties(double maxDimension)\n{\n    int maxexponent = (int) floor(log10(maxDimension)) - 1;\n    int minexponent = maxexponent - 2;\n    int mantissa = (int) floor(maxDimension / pow(10.0,double(maxexponent+1)));\n\n    m_default = (double) mantissa * pow(10.0, double(maxexponent - 1));\n    m_max = (double) 2 * mantissa * pow(10.0, double(maxexponent));\n    m_min = (double) mantissa * pow(10.0, double(minexponent));\n}\n"
  },
  {
    "path": "salalib/gridproperties.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\nclass GridProperties\n{\npublic:\n    GridProperties(double maxDimension);\n    double getMin() const{return m_min;}\n    double getMax() const{return m_max;}\n    double getDefault() const{return m_default;}\nprivate:\n    double m_max;\n    double m_min;\n    double m_default;\n\n};\n\n"
  },
  {
    "path": "salalib/ianalysis.h",
    "content": "// Copyright (C) 2020 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/mgraph.h\"\n#include \"salalib/pointdata.h\"\n\n#include \"genlib/comm.h\"\n\nclass IAnalysis {\n  public:\n    virtual std::string getAnalysisName() const = 0;\n    virtual bool run(Communicator *comm) = 0;\n    virtual ~IAnalysis() {}\n};\n"
  },
  {
    "path": "salalib/iaxial.h",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n// Interface to handle different kinds of Axial analysis\n\n#include \"salalib/axialmap.h\"\n\n#include \"genlib/comm.h\"\n\n#include <string>\n\nclass IAxial\n{\npublic:\n    virtual std::string getAnalysisName() const = 0;\n    virtual bool run(Communicator *comm, ShapeGraph &map, bool simple_version) = 0;\n    virtual ~IAxial(){}\n};\n"
  },
  {
    "path": "salalib/importtypedefs.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n#include <map>\n\nnamespace depthmapX {\n    typedef std::vector<std::string> ColumnData;\n    typedef std::map<std::string, ColumnData> Table;\n\n    class Polyline : public QtRegion\n    {\n    public:\n        std::vector<Point2f> m_vertices;\n        bool m_closed = false;\n        Polyline(std::vector<Point2f> vertices, bool closed) : m_vertices(vertices), m_closed(closed) {\n        }\n    };\n\n    enum ImportType {\n        DRAWINGMAP, DATAMAP\n    };\n\n    enum ImportFileType {\n        CSV, TSV, DXF\n    };\n}\n"
  },
  {
    "path": "salalib/importutils.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"importutils.h\"\n\n#include \"genlib/stringutils.h\"\n\n#include <sstream>\n\nnamespace depthmapX {\n\n    const int DXFCIRCLERES = 36;\n\n    bool importFile(MetaGraph &mgraph, std::istream &stream, Communicator *communicator, std::string name,\n                    ImportType mapType, ImportFileType fileType) {\n\n        // This function is still too fiddly but at least it shows the common interface for\n        // drawing and data maps and how different file types may be parsed to be imported\n        // into them\n\n        int state = MetaGraph::NONE;\n        int viewClass = MetaGraph::NONE;\n\n        switch (mapType) {\n        case DRAWINGMAP: {\n            state = MetaGraph::LINEDATA;\n            viewClass = MetaGraph::SHOWSHAPETOP;\n            break;\n        }\n        case DATAMAP: {\n            state = MetaGraph::DATAMAPS;\n            viewClass = MetaGraph::SHOWSHAPETOP;\n            break;\n        }\n        }\n\n        int oldstate = mgraph.getState();\n        mgraph.setState(oldstate & ~state);\n\n        // Currently the drawing shapemaps are understood as two-level trees (file -> layers)\n        // while the data shapemaps are flat. Therefore, for the moment, when we load dxfs as\n        // drawing shapemaps then we let the filename be the parent and the layers the children.\n        // For text files (csv, tsv) we create an artificial parent with the relevant name\n        // Drawing shapemaps also carry region data that needs to be initialised and their parents\n        // updated when they are created.\n        // Ideally datamaps and drawingmaps should be more similar.\n\n        if (mapType == DRAWINGMAP) {\n            mgraph.m_drawingFiles.emplace_back(name);\n        }\n\n        bool parsed = false;\n\n        switch (fileType) {\n        case CSV: {\n            ShapeMap &shapeMap = mgraph.createNewShapeMap(mapType, name);\n            int newMapIdx = mgraph.getMapRef(mgraph.getDataMaps(), shapeMap.getName());\n            parsed = importTxt(shapeMap, stream, ',');\n\n            if (!parsed) {\n                mgraph.deleteShapeMap(mapType, shapeMap);\n                break;\n            }\n            if (mapType == DRAWINGMAP) {\n                mgraph.updateParentRegions(shapeMap);\n            } else if (mapType == DATAMAP) {\n                mgraph.setDisplayedDataMapRef(newMapIdx);\n            }\n            break;\n        }\n        case TSV: {\n            ShapeMap &shapeMap = mgraph.createNewShapeMap(mapType, name);\n            int newMapIdx = mgraph.getMapRef(mgraph.getDataMaps(), shapeMap.getName());\n            parsed = importTxt(shapeMap, stream, '\\t');\n\n            if (!parsed) {\n                mgraph.deleteShapeMap(mapType, shapeMap);\n                break;\n            }\n            if (mapType == DRAWINGMAP) {\n                mgraph.updateParentRegions(shapeMap);\n            } else if (mapType == DATAMAP) {\n                mgraph.setDisplayedDataMapRef(newMapIdx);\n            }\n            break;\n        }\n        case DXF: {\n\n            DxfParser dp;\n\n            if (communicator) {\n                dp = DxfParser(communicator);\n\n                try {\n                    stream >> dp;\n                } catch (Communicator::CancelledException) {\n                    return 0;\n                } catch (std::logic_error &) {\n                    return -1;\n                }\n\n                if (communicator->IsCancelled()) {\n                    return 0;\n                }\n            } else {\n                dp.open(stream);\n            }\n\n            for (auto &layer : dp.getLayers()) {\n\n                const DxfLayer &dxfLayer = layer.second;\n\n                if (dxfLayer.empty()) {\n                    continue;\n                }\n\n                ShapeMap &shapeMap = mgraph.createNewShapeMap(mapType, layer.first);\n                parsed = importDxfLayer(dxfLayer, shapeMap);\n\n                if (!parsed) {\n                    mgraph.deleteShapeMap(mapType, shapeMap);\n                    break;\n                }\n                if (mapType == DRAWINGMAP) {\n                    mgraph.updateParentRegions(shapeMap);\n                }\n            }\n            break;\n        }\n        }\n\n        if (parsed) {\n            mgraph.setState(mgraph.getState() | state);\n            mgraph.setViewClass(viewClass);\n            return true;\n        } else {\n            mgraph.setState(oldstate);\n            return false;\n        }\n    }\n\n    bool importTxt(ShapeMap &shapeMap, std::istream &stream, char delimiter = '\\t') {\n        Table table = csvToTable(stream, delimiter);\n        std::vector<std::string> columns;\n        int xcol = -1, ycol = -1, x1col = -1, y1col = -1, x2col = -1, y2col = -1, refcol = -1;\n        for (auto const &column : table) {\n            if (column.first == \"x\" || column.first == \"easting\")\n                xcol = columns.size();\n            else if (column.first == \"y\" || column.first == \"northing\")\n                ycol = columns.size();\n            else if (column.first == \"x1\")\n                x1col = columns.size();\n            else if (column.first == \"x2\")\n                x2col = columns.size();\n            else if (column.first == \"y1\")\n                y1col = columns.size();\n            else if (column.first == \"y2\")\n                y2col = columns.size();\n            else if (column.first == \"Ref\")\n                refcol = columns.size();\n            columns.push_back(column.first);\n        }\n\n        if (xcol != -1 && ycol != -1 && refcol != -1) {\n            std::map<int, Point2f> points =\n                extractPointsWithRefs(table[columns[xcol]], table[columns[ycol]], table[columns[refcol]]);\n            table.erase(table.find(columns[xcol]));\n            table.erase(table.find(columns[ycol]));\n            table.erase(table.find(columns[refcol]));\n\n            QtRegion region;\n\n            for (auto &point : points) {\n                if (region.atZero()) {\n                    region = point.second;\n                } else {\n                    region = runion(region, point.second);\n                }\n            }\n\n            shapeMap.init(points.size(), region);\n            shapeMap.importPointsWithRefs(points, table);\n\n        } else if (xcol != -1 && ycol != -1) {\n            std::vector<Point2f> points = extractPoints(table[columns[xcol]], table[columns[ycol]]);\n            table.erase(table.find(columns[xcol]));\n            table.erase(table.find(columns[ycol]));\n\n            QtRegion region;\n\n            for (auto &point : points) {\n                if (region.atZero()) {\n                    region = point;\n                } else {\n                    region = runion(region, point);\n                }\n            }\n\n            shapeMap.init(points.size(), region);\n            shapeMap.importPoints(points, table);\n\n        } else if (x1col != -1 && y1col != -1 && x2col != -1 && y2col != -1 && refcol != -1) {\n            std::map<int, Line> lines =\n                extractLinesWithRef(table[columns[x1col]], table[columns[y1col]], table[columns[x2col]],\n                                    table[columns[y2col]], table[columns[refcol]]);\n            table.erase(table.find(columns[x1col]));\n            table.erase(table.find(columns[y1col]));\n            table.erase(table.find(columns[x2col]));\n            table.erase(table.find(columns[y2col]));\n            table.erase(table.find(columns[refcol]));\n\n            QtRegion region;\n\n            for (auto &line : lines) {\n                if (region.atZero()) {\n                    region = line.second;\n                } else {\n                    region = runion(region, line.second);\n                }\n            }\n\n            shapeMap.init(lines.size(), region);\n            shapeMap.importLinesWithRefs(lines, table);\n        } else if (x1col != -1 && y1col != -1 && x2col != -1 && y2col != -1) {\n            std::vector<Line> lines = extractLines(table[columns[x1col]], table[columns[y1col]], table[columns[x2col]],\n                                                   table[columns[y2col]]);\n            table.erase(table.find(columns[x1col]));\n            table.erase(table.find(columns[y1col]));\n            table.erase(table.find(columns[x2col]));\n            table.erase(table.find(columns[y2col]));\n\n            QtRegion region;\n\n            for (auto &line : lines) {\n                if (region.atZero()) {\n                    region = line;\n                } else {\n                    region = runion(region, line);\n                }\n            }\n\n            shapeMap.init(lines.size(), region);\n            shapeMap.importLines(lines, table);\n        }\n        return true;\n    }\n\n    Table csvToTable(std::istream &stream, char delimiter = '\\t') {\n\n        Table table;\n        std::vector<std::string> columns;\n\n        std::string inputline;\n        std::getline(stream, inputline);\n\n        // check for a matching delimited header line...\n        auto strings = dXstring::split(inputline, delimiter);\n        if (strings.size() < 2) {\n            // throw exception\n            return table;\n        }\n\n        for (auto &columnName : strings) {\n            if (!columnName.empty()) {\n                dXstring::ltrim(columnName, '\\\"');\n                dXstring::rtrim(columnName, '\\\"');\n            }\n            table.insert(std::make_pair(columnName, std::vector<std::string>()));\n            columns.push_back(columnName);\n        }\n\n        while (!stream.eof()) {\n            std::getline(stream, inputline);\n            if (!inputline.empty()) {\n                auto strings = dXstring::split(inputline, delimiter);\n                if (strings.size() != columns.size()) {\n                    std::stringstream message;\n                    message << \"Cells in line \" << inputline << \"not the same number as the columns\" << std::flush;\n                    throw RuntimeException(message.str().c_str());\n                }\n                if (!strings.size()) {\n                    continue;\n                }\n                for (size_t i = 0; i < strings.size(); i++) {\n                    table[columns[i]].push_back(strings[i]);\n                }\n            }\n        }\n        return table;\n    }\n\n    std::vector<Line> extractLines(ColumnData &x1col, ColumnData &y1col, ColumnData &x2col, ColumnData &y2col) {\n        std::vector<Line> lines;\n        for (size_t i = 0; i < x1col.size(); i++) {\n            double x1 = stod(x1col[i]);\n            double y1 = stod(y1col[i]);\n            double x2 = stod(x2col[i]);\n            double y2 = stod(y2col[i]);\n            lines.push_back(Line(Point2f(x1, y1), Point2f(x2, y2)));\n        }\n        return lines;\n    }\n\n    std::map<int, Line> extractLinesWithRef(ColumnData &x1col, ColumnData &y1col, ColumnData &x2col, ColumnData &y2col,\n                                            ColumnData &refcol) {\n        std::map<int, Line> lines;\n        for (size_t i = 0; i < x1col.size(); i++) {\n            double x1 = stod(x1col[i]);\n            double y1 = stod(y1col[i]);\n            double x2 = stod(x2col[i]);\n            double y2 = stod(y2col[i]);\n            int ref = stoi(refcol[i]);\n            lines.insert(std::make_pair(ref, Line(Point2f(x1, y1), Point2f(x2, y2))));\n        }\n        return lines;\n    }\n    std::vector<Point2f> extractPoints(ColumnData &x, ColumnData &y) {\n        std::vector<Point2f> points;\n        for (size_t i = 0; i < x.size(); i++) {\n            points.push_back(Point2f(stod(x[i]), stod(y[i])));\n        }\n        return points;\n    }\n    std::map<int, Point2f> extractPointsWithRefs(ColumnData &x, ColumnData &y, ColumnData &ref) {\n        std::map<int, Point2f> points;\n        for (size_t i = 0; i < x.size(); i++) {\n            points.insert(std::make_pair(stoi(ref[i]), Point2f(stod(x[i]), stod(y[i]))));\n        }\n        return points;\n    }\n\n    bool importDxfLayer(const DxfLayer &dxfLayer, ShapeMap &shapeMap) {\n        std::vector<Point2f> points;\n        std::vector<Line> lines;\n        std::vector<Polyline> polylines;\n\n        for (size_t jp = 0; jp < dxfLayer.numPoints(); jp++) {\n            const DxfVertex &dxf_point = dxfLayer.getPoint(jp);\n            points.push_back(Point2f(dxf_point.x, dxf_point.y));\n        }\n\n        for (size_t j = 0; j < dxfLayer.numLines(); j++) {\n            const DxfLine &dxf_line = dxfLayer.getLine(j);\n            Line line = Line(Point2f(dxf_line.getStart().x, dxf_line.getStart().y),\n                             Point2f(dxf_line.getEnd().x, dxf_line.getEnd().y));\n            lines.push_back(line);\n        }\n\n        for (size_t k = 0; k < dxfLayer.numPolyLines(); k++) {\n            const DxfPolyLine &poly = dxfLayer.getPolyLine(k);\n            std::vector<Point2f> vertices;\n            for (size_t m = 0; m < poly.numVertices(); m++) {\n                DxfVertex v = poly.getVertex(m);\n                vertices.push_back(Point2f(v.x, v.y));\n            }\n            polylines.push_back(\n                depthmapX::Polyline(vertices, (poly.getAttributes() & DxfPolyLine::CLOSED) == DxfPolyLine::CLOSED));\n        }\n\n        for (size_t l = 0; l < dxfLayer.numSplines(); l++) {\n            const DxfSpline &poly = dxfLayer.getSpline(l);\n            std::vector<Point2f> vertices;\n            for (size_t m = 0; m < poly.numVertices(); m++) {\n                DxfVertex v = poly.getVertex(m);\n                vertices.push_back(Point2f(v.x, v.y));\n            }\n            polylines.push_back(\n                depthmapX::Polyline(vertices, (poly.getAttributes() & DxfPolyLine::CLOSED) == DxfPolyLine::CLOSED));\n        }\n\n        for (size_t n = 0; n < dxfLayer.numArcs(); n++) {\n            const DxfArc &circ = dxfLayer.getArc(n);\n            std::vector<Point2f> vertices;\n            size_t segments = circ.numSegments(DXFCIRCLERES);\n            if (segments > 1) {\n                for (size_t m = 0; m <= segments; m++) {\n                    DxfVertex v = circ.getVertex(m, segments);\n                    vertices.push_back(Point2f(v.x, v.y));\n                }\n            }\n            polylines.push_back(depthmapX::Polyline(vertices, false));\n        }\n\n        for (size_t n = 0; n < dxfLayer.numEllipses(); n++) {\n            const DxfEllipse &ellipse = dxfLayer.getEllipse(n);\n            std::vector<Point2f> vertices;\n            size_t segments = ellipse.numSegments(DXFCIRCLERES);\n            if (segments > 1) {\n                for (size_t m = 0; m <= segments; m++) {\n                    DxfVertex v = ellipse.getVertex(m, segments);\n                    vertices.push_back(Point2f(v.x, v.y));\n                }\n            }\n            polylines.push_back(depthmapX::Polyline(vertices, false));\n        }\n\n        for (size_t nc = 0; nc < dxfLayer.numCircles(); nc++) {\n            const DxfCircle &circ = dxfLayer.getCircle(nc);\n            std::vector<Point2f> vertices;\n            for (int m = 0; m < DXFCIRCLERES; m++) {\n                DxfVertex v = circ.getVertex(m, DXFCIRCLERES);\n                vertices.push_back(Point2f(v.x, v.y));\n            }\n            polylines.push_back(depthmapX::Polyline(vertices, true));\n        }\n        DxfVertex layerMin = dxfLayer.getExtMin();\n        DxfVertex layerMax = dxfLayer.getExtMax();\n\n        QtRegion region = QtRegion(Point2f(layerMin.x, layerMin.y), Point2f(layerMax.x, layerMax.y));\n\n        shapeMap.init(points.size() + lines.size() + polylines.size(), region);\n        // parameters could be passed in the Table here such as the layer/block/colour/linetype etc.\n        shapeMap.importPoints(points, Table());\n        shapeMap.importLines(lines, Table());\n        shapeMap.importPolylines(polylines, Table());\n        return true;\n    }\n\n    bool importAttributes(AttributeTable &attributes, std::istream &stream, char delimiter = '\\t') {\n        Table table = csvToTable(stream, delimiter);\n        std::vector<std::string> outColumns;\n        int refcol = -1;\n        for (auto const &column : table) {\n            if (column.first == \"Ref\")\n                refcol = outColumns.size();\n            else\n                outColumns.push_back(column.first);\n        }\n        if(table.size() == 0) {\n            throw RuntimeException(\"No usable data found in file\");\n        }\n        if(refcol == -1) {\n            throw RuntimeException(\"The \\\"Ref\\\" column is reqired\");\n        }\n        if(outColumns.size() < 1) {\n            throw RuntimeException(\"No data found to join\");\n        }\n        std::vector<AttributeRow*> inRows;\n        for(const auto& refInFile: table[\"Ref\"]) {\n            int ref = std::stoi(refInFile);\n            auto iter = attributes.find(AttributeKey(ref));\n            if(iter == attributes.end()) {\n                std::stringstream message;\n                message << \"Key \" << ref << \"not found in attribute table\" << std::flush;\n                throw RuntimeException(message.str().c_str());\n            }\n            inRows.push_back(&(iter->getRow()));\n        }\n\n        // Up until this point we have not touched the attribute table\n        // so no need for corrective measures yet\n\n        for(const std::string& column: outColumns) {\n            int colIdx = attributes.insertOrResetColumn(column);\n            auto outRowIter = table[column].begin();\n            for(auto inRowIter = inRows.begin(); inRowIter != inRows.end(); inRowIter++, outRowIter++) {\n                (*inRowIter)->setValue(colIdx, std::stof(*outRowIter));\n            }\n        }\n        return true;\n    }\n} // namespace depthmapX\n"
  },
  {
    "path": "salalib/importutils.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/importtypedefs.h\"\n#include \"salalib/mgraph.h\"\n#include \"salalib/parsers/dxfp.h\"\n#include <map>\n#include <vector>\n\nnamespace depthmapX {\n    bool importFile(MetaGraph &mgraph, std::istream &stream, Communicator *communicator, std::string name,\n                    ImportType mapType, ImportFileType fileType);\n    bool importTxt(ShapeMap &shapeMap, std::istream &stream, char delimiter);\n    depthmapX::Table csvToTable(std::istream &stream, char delimiter);\n    std::vector<Line> extractLines(ColumnData &x1col, ColumnData &y1col, ColumnData &x2col, ColumnData &y2col);\n    std::map<int, Line> extractLinesWithRef(ColumnData &x1col, ColumnData &y1col, ColumnData &x2col, ColumnData &y2col,\n                                            ColumnData &refcol);\n    std::vector<Point2f> extractPoints(ColumnData &x, ColumnData &y);\n    std::map<int, Point2f> extractPointsWithRefs(ColumnData &x, ColumnData &y, ColumnData &ref);\n    bool importDxfLayer(const DxfLayer &dxfLayer, ShapeMap &shapeMap);\n    bool importAttributes(AttributeTable &attributes, std::istream &stream, char delimiter);\n} // namespace depthmapX\n"
  },
  {
    "path": "salalib/isegment.h",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n// Interface to handle different kinds of VGA analysis\n\n#include \"salalib/axialmap.h\"\n#include \"salalib/options.h\"\n\n#include \"genlib/comm.h\"\n\n#include <string>\n\nclass ISegment\n{\npublic:\n    virtual std::string getAnalysisName() const = 0;\n    virtual bool run(Communicator *comm, ShapeGraph &map, bool simple_version) = 0;\n    virtual ~ISegment(){}\n\n    // Axial map helper: convert a radius for angular analysis\n\n    static std::string makeFloatRadiusText(double radius)\n    {\n       std::string radius_text;\n       if (radius > 100.0) {\n          radius_text = dXstring::formatString(radius,\"%.f\");\n       }\n       else if (radius < 0.1) {\n          radius_text = dXstring::formatString(radius,\"%.4f\");\n       }\n       else {\n          radius_text = dXstring::formatString(radius,\"%.2f\");\n       }\n       return radius_text;\n    }\n\n    static std::string makeRadiusText(int radius_type, double radius)\n    {\n       std::string radius_text;\n       if (radius != -1) {\n          if (radius_type == Options::RADIUS_STEPS) {\n             radius_text = std::string(\" R\") + dXstring::formatString(int(radius),\"%d\") + \" step\";\n          }\n          else if (radius_type == Options::RADIUS_METRIC) {\n             radius_text = std::string(\" R\") + makeFloatRadiusText(radius) + \" metric\";\n          }\n          else { // radius angular\n             radius_text = std::string(\" R\") + makeFloatRadiusText(radius);\n          }\n       }\n       return radius_text;\n    }\n};\n"
  },
  {
    "path": "salalib/isovist.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#include \"salalib/isovist.h\"\r\n\r\n#include <math.h>\r\n#include <float.h>\r\n#include <time.h>\r\n\r\n///////////////////////////////////////////////////////////////////////\r\n\r\n// Interestingly, apparently ray tracing is faster using voxel techniques than octrees etc:\r\n// Akira Fujimotot, Takayuki Tanaka, and Kansei Iwata. ARTS: Accelerated ray-tracing system.  IEEE Computer Graphics and Applications, 6(4):16--26, April 1986\r\n \r\n// This uses BSP trees, and appears to be superfast once the tree is built\r\n\r\nvoid Isovist::makeit(BSPNode *root, const Point2f& p, const QtRegion& region, double startangle, double endangle)\r\n{\r\n   // region is used to give an idea of scale, so isovists can be linked when there is floating point error\r\n   double tolerance = std::max(region.width(),region.height()) * 1e-9;\r\n\r\n   m_centre = p;\r\n   m_blocks.clear();\r\n   m_gaps.clear();\r\n\r\n   // still doesn't work when need centre point, but this will work for 180 degree isovists\r\n   bool complete = false;\r\n\r\n   if (startangle == endangle || (startangle == 0.0 && endangle == 2.0 * M_PI)) {\r\n      startangle = 0.0;\r\n      endangle = 2.0 * M_PI;\r\n      complete = true;\r\n   }\r\n\r\n   bool parity = false;\r\n\r\n   if (startangle > endangle) {\r\n      m_gaps.insert(IsoSeg(0.0,endangle));\r\n      m_gaps.insert(IsoSeg(startangle,2.0*M_PI));\r\n   }\r\n   else {\r\n      parity = true;\r\n      m_gaps.insert(IsoSeg(startangle,endangle));\r\n   }\r\n\r\n   make(root);\r\n\r\n   // now it is constructed, make the isovist polygon:\r\n   m_poly.clear();\r\n   m_perimeter = 0.0;\r\n   m_occluded_perimeter = 0.0;\r\n   m_occlusion_points.clear();\r\n\r\n   bool markedcentre = false;\r\n   auto prev = m_blocks.begin();\r\n   auto curr = m_blocks.begin();\r\n   for (;curr != m_blocks.end(); ++curr){\r\n      if (!complete && !markedcentre && !parity && curr->startangle == startangle) {\r\n         // centre\r\n         m_poly.push_back(p);\r\n         // perimeter! occlusivity!\r\n         markedcentre = true;\r\n      }\r\n      if (curr != m_blocks.begin() && !approxeq(prev->endpoint, curr->startpoint, tolerance)) {\r\n         m_poly.push_back(curr->startpoint);\r\n         // record perimeter information:\r\n         double occluded = dist(prev->endpoint,curr->startpoint);\r\n         m_perimeter += occluded;\r\n         m_occluded_perimeter += occluded;\r\n         // record the near *point* for use in agent analysis\r\n         // (as the point will not move between isovists, so can record *which* occlusion this is, and spot novel ones)\r\n         if (dist(prev->endpoint,m_centre) < dist(curr->startpoint,m_centre)) {\r\n            m_occlusion_points.push_back(PointDist(prev->endpoint,occluded));\r\n         }\r\n         else {\r\n            m_occlusion_points.push_back(PointDist(curr->startpoint,occluded));\r\n         }\r\n      }\r\n      m_poly.push_back(curr->endpoint);\r\n      m_perimeter += dist(curr->startpoint,curr->endpoint);\r\n      prev = curr;\r\n   }\r\n   // for some reason to do with ordering, if parity is true, the centre point must be last not first\r\n   if (!complete && parity) {\r\n      // centre\r\n      m_poly.push_back(p);\r\n      // perimeter! occlusivity!\r\n   }\r\n   if (m_blocks.size() && !approxeq(m_blocks.rbegin()->endpoint, m_blocks.begin()->startpoint, tolerance)) {\r\n      m_poly.push_back(m_blocks.begin()->startpoint);\r\n      // record perimeter information:\r\n      double occluded = dist(m_blocks.rbegin()->endpoint,m_blocks.begin()->startpoint);\r\n      m_perimeter += occluded;\r\n      m_occluded_perimeter += occluded;\r\n      // record the near *point* for use in agent analysis\r\n      // (as the point will not move between isovists, so can record *which* occlusion this is, and spot novel ones)\r\n      if (occluded > 1.5) {\r\n         if (dist(m_blocks.rbegin()->endpoint,m_centre) < dist(m_blocks.begin()->startpoint,m_centre)) {\r\n            m_occlusion_points.push_back(PointDist(m_blocks.rbegin()->endpoint,occluded));\r\n         }\r\n         else {\r\n            m_occlusion_points.push_back(PointDist(m_blocks.begin()->startpoint,occluded));\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\nint Isovist::getClosestLine(BSPNode *root, const Point2f& p)\r\n{\r\n   m_centre = p;\r\n   m_blocks.clear();\r\n   m_gaps.clear();\r\n\r\n   m_gaps.insert(IsoSeg(0.0,2.0*M_PI));\r\n\r\n   make(root);\r\n\r\n   int mintag = -1;\r\n   double mindist = 0.0;\r\n\r\n   for (auto& block: m_blocks) {\r\n      Line l(block.startpoint, block.endpoint);\r\n      if (mintag == -1 || dist(p,l) < mindist) {\r\n         mindist = dist(p,l);\r\n         mintag = block.tag;\r\n      }\r\n   }\r\n\r\n   return mintag;\r\n}\r\n\r\nvoid Isovist::make(BSPNode *here)\r\n{\r\n   if (m_gaps.size()) {\r\n      int which = here->classify(m_centre);\r\n      if (which == BSPNode::BSPLEFT) {\r\n         if (here->m_left.get())\r\n            make(here->m_left.get());\r\n         drawnode(here->getLine(),here->getTag());\r\n         if (here->m_right)\r\n            make(here->m_right.get());\r\n      }\r\n      else {\r\n         if (here->m_right.get())\r\n            make(here->m_right.get());\r\n         drawnode(here->getLine(),here->getTag());\r\n         if (here->m_left)\r\n            make(here->m_left.get());\r\n      }\r\n   }\r\n}\r\n\r\nvoid Isovist::drawnode(const Line& li, int tag)\r\n{\r\n   Point2f p1 = li.start() - m_centre;\r\n   p1.normalise();\r\n   double angle1 = p1.angle();\r\n   Point2f p2 = li.end() - m_centre;\r\n   p2.normalise();\r\n   double angle2 = p2.angle();\r\n   if (angle2 > angle1) {\r\n      if (angle2 - angle1 >= M_PI) {\r\n         // 0 to angle1 and angle2 to 2 pi\r\n         addBlock(li,tag,0.0,angle1);\r\n         addBlock(li,tag,angle2,2.0*M_PI);\r\n      }\r\n      else {\r\n         // angle1 to angle2\r\n         addBlock(li,tag,angle1,angle2);\r\n      }\r\n   }\r\n   else {\r\n      if (angle1 - angle2 >= M_PI) {\r\n         // 0 to angle2 and angle1 to 2 pi\r\n         addBlock(li,tag,0.0,angle2);\r\n         addBlock(li,tag,angle1,2.0*M_PI);\r\n      }\r\n      else {\r\n         // angle2 to angle1\r\n         addBlock(li,tag,angle2,angle1);\r\n      }\r\n   }\r\n   //\r\n   for (auto it = m_gaps.begin(); it != m_gaps.end(); ) {\r\n       if (it->tagdelete) {\r\n           it = m_gaps.erase(it);\r\n       }\r\n       else {\r\n           ++it;\r\n       }\r\n   }\r\n}\r\n\r\nvoid Isovist::addBlock(const Line& li, int tag, double startangle, double endangle)\r\n{\r\n   auto gap = m_gaps.begin();\r\n   bool finished = false;\r\n\r\n   while (!finished) {\r\n      while (gap != m_gaps.end() && gap->endangle < startangle) {\r\n         gap++;\r\n      }\r\n      if (gap != m_gaps.end() && gap->startangle < endangle + 1e-9) {\r\n         double a,b;\r\n         if (gap->startangle > startangle - 1e-9) {\r\n            a = gap->startangle;\r\n            if (gap->endangle < endangle + 1e-9) {\r\n               b = gap->endangle;\r\n               gap->tagdelete = true;\r\n            }\r\n            else {\r\n               b = endangle;\r\n               IsoSeg isoseg = *gap;\r\n               isoseg.startangle = endangle;\r\n               auto hint = gap;\r\n               hint++;\r\n               m_gaps.erase(gap);\r\n               gap = m_gaps.insert(hint, isoseg);\r\n            }\r\n         }\r\n         else {\r\n            a = startangle;\r\n            if (gap->endangle < endangle + 1e-9) {\r\n               b = gap->endangle;\r\n               IsoSeg isoseg = *gap;\r\n               isoseg.endangle = startangle;\r\n               auto hint = gap;\r\n               hint++;\r\n               m_gaps.erase(gap);\r\n               gap = m_gaps.insert(hint, isoseg);\r\n            }\r\n            else {\r\n               b = endangle;\r\n               m_gaps.insert(IsoSeg(endangle, gap->endangle, gap->quadrant));\r\n               IsoSeg isoseg = *gap;\r\n               isoseg.endangle = startangle;\r\n               auto hint = gap;\r\n               hint++;\r\n               m_gaps.erase(gap);\r\n               gap = m_gaps.insert(hint, isoseg);\r\n               gap++; // advance past gap just added\r\n            }\r\n         }\r\n         Point2f pa = intersection_point(li,Line(m_centre,m_centre+pointfromangle(a)));\r\n         Point2f pb = intersection_point(li,Line(m_centre,m_centre+pointfromangle(b)));\r\n         m_blocks.insert(IsoSeg(a,b,pa,pb,tag));\r\n      }\r\n      else {\r\n         finished = true;\r\n      }\r\n      if(gap == m_gaps.end()) break;\r\n      gap++;\r\n   }\r\n}\r\n\r\nvoid Isovist::setData(AttributeTable& table, AttributeRow& row, bool simple_version)\r\n{\r\n   // the area / centre of gravity calculation is a duplicate of the SalaPolygon version,\r\n   // included here for general information about the isovist\r\n   double area = 0.0;\r\n   Point2f centroid = Point2f(0,0);\r\n   for (size_t i = 0; i < m_poly.size(); i++) {\r\n      Point2f& p1 = m_poly.at(i);\r\n      Point2f& p2 = m_poly.at((i+1)%m_poly.size());\r\n      double a_i = (p1.x * p2.y - p2.x * p1.y) / 2.0;\r\n      area += a_i ;\r\n      a_i /= 6.0;\r\n      centroid.x += (p1.x+p2.x) * a_i;\r\n      centroid.y += (p1.y+p2.y) * a_i;\r\n      double dpoint = dist(m_centre,p1);\r\n      double dline = dist(m_centre,Line(p1,p2));\r\n      if (i != 0) {\r\n         // This is not minimum radial -- it's the distance to the closest corner!\r\n         if (dline < m_min_radial) {\r\n            m_min_radial = dline;\r\n            dist(m_centre,Line(p1,p2));\r\n         }\r\n         if (dpoint > m_max_radial) {\r\n            m_max_radial = dpoint;\r\n         }\r\n      }\r\n      else {\r\n         m_max_radial = dpoint;\r\n         m_min_radial = dline;\r\n      }\r\n   }\r\n   centroid.scale(2.0/fabs(area));\r\n\r\n   Point2f driftvec = centroid - m_centre;\r\n   double driftmag = driftvec.length();\r\n   driftvec.normalise();\r\n   double driftang = driftvec.angle();\r\n   //\r\n   int col = table.getOrInsertColumn(\"Isovist Area\");\r\n   row.setValue(col, float(area));\r\n\r\n\r\n   if(!simple_version) {\r\n       col = table.getOrInsertColumn(\"Isovist Compactness\");\r\n       row.setValue(col, float(4.0 * M_PI * area / (m_perimeter*m_perimeter)));\r\n\r\n       col = table.getOrInsertColumn(\"Isovist Drift Angle\");\r\n       row.setValue(col, float(180.0*driftang/M_PI));\r\n\r\n       col = table.getOrInsertColumn(\"Isovist Drift Magnitude\");\r\n       row.setValue(col, float(driftmag));\r\n\r\n       col = table.getOrInsertColumn(\"Isovist Min Radial\");\r\n       row.setValue(col, float(m_min_radial));\r\n\r\n       col = table.getOrInsertColumn(\"Isovist Max Radial\");\r\n       row.setValue(col, float(m_max_radial));\r\n\r\n       col = table.getOrInsertColumn(\"Isovist Occlusivity\");\r\n       row.setValue(col, float(m_occluded_perimeter));\r\n\r\n       col = table.getOrInsertColumn(\"Isovist Perimeter\");\r\n       row.setValue(col, float(m_perimeter));\r\n   }\r\n\r\n}\r\n"
  },
  {
    "path": "salalib/isovist.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// isovist.h\r\n\r\n#pragma once\r\n\r\n#include \"salalib/attributetable.h\"\r\n\r\n#include \"genlib/bsptree.h\"\r\n#include <set>\r\n\r\n// this is very much like sparksieve:\r\n\r\nstruct IsoSeg\r\n{\r\n   mutable bool tagdelete;\r\n   double startangle;\r\n   double endangle;\r\n   Point2f startpoint;\r\n   Point2f endpoint;\r\n   char quadrant;\r\n   int tag;\r\n   IsoSeg(double start = 0.0, double end = 0.0, char q = 0, int t = -1) \r\n   { startangle = start; endangle = end; tagdelete = false; quadrant = q; tag = t; }\r\n   IsoSeg(double start, double end, const Point2f& pstart, Point2f& pend, int t = -1) \r\n   { startangle = start; endangle = end; startpoint = pstart; endpoint = pend; tagdelete = false; tag = t; }\r\n   friend bool operator == (const IsoSeg& b1, const IsoSeg& b2);\r\n   friend bool operator > (const IsoSeg& b1, const IsoSeg& b2);\r\n   friend bool operator < (const IsoSeg& b1, const IsoSeg& b2);\r\n};\r\ninline bool operator == (const IsoSeg& b1, const IsoSeg& b2)\r\n{ return (b1.startangle == b2.startangle && b1.endangle == b2.endangle); }\r\ninline bool operator > (const IsoSeg& b1, const IsoSeg& b2)\r\n{ return b1.startangle == b2.startangle ? b1.endangle > b2.endangle : b1.startangle > b2.startangle; }\r\ninline bool operator < (const IsoSeg& b1, const IsoSeg& b2)\r\n{ return b1.startangle == b2.startangle ? b1.endangle < b2.endangle : b1.startangle < b2.startangle; }\r\n\r\nclass AttributeTable;\r\n\r\nstruct PointDist {\r\n   Point2f m_point;\r\n   double m_dist;\r\n   PointDist(const Point2f& p = Point2f(), double d = 0.0)\r\n   { m_point = p; m_dist = d; }\r\n};\r\n\r\nclass Isovist\r\n{\r\nprotected:\r\n   Point2f m_centre;\r\n   std::set<IsoSeg> m_blocks;\r\n   std::set<IsoSeg> m_gaps;\r\n   std::vector<Point2f> m_poly;\r\n   std::vector<PointDist> m_occlusion_points;\r\n   double m_perimeter;\r\n   double m_occluded_perimeter;\r\n   double m_max_radial;\r\n   double m_min_radial;\r\npublic:\r\n   Isovist() {;}\r\n   const std::vector<Point2f>& getPolygon() const { return m_poly; }\r\n   const std::vector<PointDist>& getOcclusionPoints() const { return m_occlusion_points; }\r\n   const Point2f& getCentre() const { return m_centre; }\r\n   //\r\n   void makeit(BSPNode *root, const Point2f& p, const QtRegion& region, double startangle = 0.0, double endangle = 0.0);\r\n   void make(BSPNode *here);\r\n   void drawnode(const Line& li, int tag);\r\n   void addBlock(const Line& li, int tag, double startangle, double endangle);\r\n   void setData(AttributeTable &table, AttributeRow &row, bool simple_version);\r\n   //\r\n   int getClosestLine(BSPNode *root, const Point2f& p);\r\n};\r\n"
  },
  {
    "path": "salalib/isovistdef.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n\nclass IsovistDefinition\n{\npublic:\n    IsovistDefinition( double x, double y, double angle, double viewAngle ) : mLocation(x, y), mAngle(angle), mViewAngle(viewAngle)\n    {\n        if ( viewAngle >= 2 * M_PI)\n        {\n            mAngle = 0.0;\n            mViewAngle = 0.0;\n        }\n    }\n\n    IsovistDefinition(double x, double y) : mLocation(x,y), mAngle(0), mViewAngle(0)\n    {}\n\n    const Point2f &getLocation() const { return mLocation;}\n    double getAngle() const { return mAngle; }\n    double getViewAngle() const { return mViewAngle; }\n    double getLeftAngle() const {\n        double leftAngle = mAngle - 0.5 * mViewAngle;\n        if (leftAngle < 0 )\n        {\n            leftAngle += 2 * M_PI;\n        }\n        return leftAngle;\n    }\n\n    double getRightAngle() const{\n        double rightAngle = mAngle + 0.5 * mViewAngle;\n        if (rightAngle > 2 * M_PI)\n        {\n            rightAngle -= 2 * M_PI;\n        }\n        return rightAngle;\n    }\n\nprivate:\n    Point2f mLocation;\n    double mAngle;\n    double mViewAngle;\n};\n"
  },
  {
    "path": "salalib/ivga.h",
    "content": "// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n// Interface to handle different kinds of VGA analysis\n\n#include \"salalib/mgraph.h\"\n#include \"salalib/pointdata.h\"\n\n#include \"genlib/comm.h\"\n\n#include <string>\n\nclass IVGA {\n  public:\n    virtual std::string getAnalysisName() const = 0;\n    virtual bool run(Communicator *comm, PointMap &map, bool simple_version) = 0;\n    virtual ~IVGA() {}\n};\n"
  },
  {
    "path": "salalib/layermanager.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include <string>\n#include <genlib/exceptions.h>\n#include <iostream>\n\n\nclass LayerManager\n{\npublic:\n    typedef int64_t KeyType;\n    virtual size_t addLayer(const std::string &layerName) = 0;\n    virtual const std::string& getLayerName(size_t index) const = 0;\n    virtual size_t getLayerIndex(const std::string &layerName) const = 0;\n    virtual void setLayerVisible( size_t layerIndex, bool visible = true ) = 0;\n    virtual bool isLayerVisible( size_t layerIndex ) const = 0;\n    virtual size_t getNumLayers() const = 0;\n\n    virtual KeyType getKey(size_t layerIndex) const = 0;\n    virtual bool isVisible( const KeyType &key ) const = 0;\n\n    virtual void read(std::istream& stream) = 0;\n    virtual void write(std::ostream& stream) const = 0;\n\n    virtual ~LayerManager(){}\n\npublic:\n    class OutOfLayersException : depthmapX::BaseException\n    {\n    public:\n        OutOfLayersException()\n        {}\n        OutOfLayersException(const std::string &message) : depthmapX::BaseException(message.c_str())\n        {\n        }\n    };\n\n    class DuplicateKeyException : depthmapX::BaseException\n    {\n    public:\n        DuplicateKeyException()\n        {}\n        DuplicateKeyException(const std::string &message) : depthmapX::BaseException(message.c_str())\n        {\n        }\n    };\n\n};\n\nclass LayerAware\n{\npublic:\n    virtual void setLayerKey( const LayerManager::KeyType & key)\n    {\n        m_layerKey = key;\n    }\n\n    virtual const LayerManager::KeyType& getLayerKey() const\n    {\n        return m_layerKey;\n    }\n\n    virtual ~LayerAware(){}\n\nprotected:\n    LayerManager::KeyType m_layerKey;\n};\n\n\ninline bool isObjectVisible(const LayerManager& manager, const LayerAware& object )\n{\n    return manager.isVisible(object.getLayerKey());\n}\n\ninline void addLayerToObject(LayerAware& object, const LayerManager::KeyType& layerKey)\n{\n    object.setLayerKey(object.getLayerKey() | layerKey);\n}\n"
  },
  {
    "path": "salalib/layermanagerimpl.cpp",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"layermanagerimpl.h\"\n#include <genlib/stringutils.h>\n\nLayerManagerImpl::LayerManagerImpl() : m_visibleLayers(1)\n{\n    m_layers.push_back(\"Everything\");\n    m_layerLookup[\"Everything\"] = 0;\n}\n\nsize_t LayerManagerImpl::addLayer(const std::string &layerName)\n{\n    size_t newLayerIndex = m_layers.size();\n    if (newLayerIndex > 63)\n    {\n        throw OutOfLayersException();\n    }\n    auto result = m_layerLookup.insert(std::make_pair(layerName, newLayerIndex));\n    if (!result.second)\n    {\n        throw DuplicateKeyException(std::string(\"Trying to insert duplicate key: \") + layerName);\n    }\n    m_layers.push_back(layerName);\n    return newLayerIndex;\n}\n\nconst std::string& LayerManagerImpl::getLayerName(size_t index) const\n{\n    checkIndex(index);\n    return m_layers[index];\n}\n\nsize_t LayerManagerImpl::getLayerIndex(const std::string &layerName) const\n{\n    auto iter = m_layerLookup.find(layerName);\n    if ( iter == m_layerLookup.end())\n    {\n        throw std::out_of_range(\"Unknown layer name\");\n    }\n    return iter->second;\n}\n\nvoid LayerManagerImpl::setLayerVisible(size_t layerIndex, bool visible)\n{\n    checkIndex(layerIndex);\n    if (layerIndex == 0)\n    {\n        // this it the everything layer - if switching on just show everything, else switch everything off\n        m_visibleLayers = visible ? 1 : 0;\n        return;\n    }\n    int64_t layerValue = ((KeyType)1) << layerIndex;\n\n    // if visible, switch on this layer and switch everything layer off, else just switch off this layer\n    if (visible)\n    {\n        m_visibleLayers = (m_visibleLayers | layerValue) & (~0x1);\n    }\n    else\n    {\n        m_visibleLayers &= (~layerValue);\n    }\n}\n\nbool LayerManagerImpl::isLayerVisible(size_t layerIndex) const\n{\n    checkIndex(layerIndex);\n    return isVisible(getKey(layerIndex));\n}\n\nbool LayerManagerImpl::isVisible(const KeyType &key) const\n{\n    return (m_visibleLayers & key) != 0;\n}\n\nvoid LayerManagerImpl::read(std::istream &stream)\n{\n    m_layerLookup.clear();\n    m_layers.clear();\n    KeyType dummy;\n    stream.read((char *)&dummy, sizeof(dummy));\n    stream.read((char *)&m_visibleLayers, sizeof(m_visibleLayers));\n    int count;\n    stream.read((char *)&count, sizeof(int));\n    for( int i = 0; i < count; ++i)\n    {\n        stream.read((char *)&dummy, sizeof(dummy));\n        m_layers.push_back(dXstring::readString(stream));\n        m_layerLookup[m_layers.back()] = i;\n    }\n}\n\nvoid LayerManagerImpl::write(std::ostream &stream) const\n{\n    //    KeyType availableLayers = 0;\n    //    for (size_t i = m_layers.size(); i < 64; ++i)\n    //    {\n    //        availableLayers |= ((KeyType)1) << i;\n    //    }\n\n    // TODO: (PK) While the above seems to me like the sane solution and potentially\n    // what the intention was in the original implementation, the one in the old\n    // attributes table seems to be messed up because of its starting value.\n    // Therefore, for temporary binary compatibility at least until the new\n    // attributes table is in place the original solution is used here as found\n    // in AttributeTable::selectionToLayer():\n\n    int64_t availableLayers = 0xffffffff << (32 + 0xfffffffe);\n    // should have been:\n    // int64_t availableLayers = (int64_t(0xffffffff) << 32) + 0xfffffffe;\n\n    for (size_t i = 1; i < 64 & i < m_layers.size(); ++i) {\n        int loc = 1;\n        while (loc < 64 && ((availableLayers>>loc) & 0x1) == 0) {\n           loc++;\n        }\n        if (loc == 64) {\n           // too many layers -- maximum 64\n           throw OutOfLayersException();\n        }\n        int64_t newlayer = 0x1 << loc;\n        // now layer has been found, eliminate from available layers\n        // and add a lookup for the name\n        availableLayers = (availableLayers & (~newlayer));\n    }\n\n\n    stream.write((const char *)&availableLayers, sizeof(KeyType));\n    stream.write((const char *)&m_visibleLayers, sizeof(KeyType));\n    int size_as_int = (int)m_layers.size();\n    stream.write((const char *)&size_as_int, sizeof(int));\n\n    availableLayers = 0xffffffff << (32 + 0xfffffffe);\n    int64_t newlayer = 0x1;\n    stream.write((const char *)&newlayer, sizeof(KeyType));\n    dXstring::writeString(stream, m_layers[0]);\n    for ( size_t i = 1; i < m_layers.size(); ++i)\n    {\n        // again keeping binary comatibility\n//        KeyType key = ((KeyType)1) << i;\n//        stream.write((const char *)&key, sizeof(KeyType));\n//        dXstring::writeString(stream,m_layers[i]);\n\n        int loc = 1;\n        while (loc < 64 && ((availableLayers>>loc) & 0x1) == 0) {\n           loc++;\n        }\n        if (loc == 64) {\n           // too many layers -- maximum 64\n           throw OutOfLayersException();\n        }\n        newlayer = 0x1 << loc;\n        stream.write((const char *)&newlayer, sizeof(KeyType));\n        dXstring::writeString(stream, m_layers[i]);\n    }\n}\n\n\nLayerManager::KeyType LayerManagerImpl::getKey(size_t layerIndex) const\n{\n    return ((int64_t)1) << layerIndex;\n}\n\nvoid LayerManagerImpl::checkIndex(size_t index) const\n{\n    if(index >= m_layers.size())\n    {\n        throw std::out_of_range(\"Invalid layer index\");\n    }\n}\n\n"
  },
  {
    "path": "salalib/layermanagerimpl.h",
    "content": "// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n#include \"layermanager.h\"\n#include <map>\n#include <vector>\n\nclass LayerManagerImpl : public LayerManager\n{\n\n\n    // LayerManager interface\npublic:\n    LayerManagerImpl();\n    virtual size_t addLayer(const std::string &layerName);\n    virtual const std::string& getLayerName(size_t index) const;\n    virtual size_t getLayerIndex(const std::string &layerName) const;\n    virtual void setLayerVisible(size_t layerIndex, bool visible);\n    virtual bool isLayerVisible(size_t layerIndex) const;\n    virtual size_t getNumLayers() const {return m_layers.size();}\n\n    virtual KeyType getKey(size_t layerIndex) const;\n    virtual bool isVisible(const KeyType &key) const;\n\n    virtual void read(std::istream& stream);\n    virtual void write(std::ostream& stream ) const;\n\nprivate:\n    void checkIndex(size_t index) const;\n\nprivate:\n    int64_t m_visibleLayers;\n    std::vector<std::string> m_layers;\n    std::map<std::string, size_t> m_layerLookup;\n\n\n};\n\n"
  },
  {
    "path": "salalib/linkutils.cpp",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"linkutils.h\"\n#include <sstream>\n\nnamespace depthmapX {\n    std::vector<PixelRefPair> pixelateMergeLines(const std::vector<Line>& mergeLines, PointMap& currentMap)\n    {\n        std::vector<PixelRefPair> mergePixelPairs;\n\n        std::vector<Line>::const_iterator iter = mergeLines.begin(), end =\n        mergeLines.end();\n        for ( ; iter != end; ++iter )\n        {\n            const Line & mergeLine = *iter;\n            const PixelRef & a = currentMap.pixelate(mergeLine.start(), false);\n            const PixelRef & b = currentMap.pixelate(mergeLine.end(), false);\n\n            mergePixelPairs.push_back(PixelRefPair(a, b));\n        }\n        return mergePixelPairs;\n    }\n\n    void mergePixelPairs(const std::vector<PixelRefPair>& links, PointMap& currentMap) {\n\n        // check if any link pixel already exists on the map\n        std::vector<PixelRefPair>::const_iterator iter = links.begin(), end =\n        links.end();\n        for ( ; iter != end; ++iter )\n        {\n            const PixelRefPair link = *iter;\n\n            // check in limits:\n            if (!currentMap.includes(link.a) || !currentMap.getPoint(link.a).filled()\n                    || !currentMap.includes(link.b) || !currentMap.getPoint(link.b).filled())\n            {\n                std::stringstream message;\n                message << \"Line ends not both on painted analysis space (index: \"\n                        << (iter - links.begin() + 1)\n                        << \")\" << std::flush;\n                throw depthmapX::InvalidLinkException(message.str().c_str());\n            }\n\n            // check if we were given coordinates that fall on a previously\n            // merged cell, in which case the newest given will replace the\n            // oldest and effectively delete the whole link\n            if(currentMap.isPixelMerged(link.a)\n                    || currentMap.isPixelMerged(link.b))\n            {\n                // one of the cells is already on the map\n                std::stringstream message;\n                message << \"Link pixel found that is already linked on the map (index: \"\n                        << (iter - links.begin() + 1)\n                        << \")\"\n                        << std::flush;\n                throw depthmapX::InvalidLinkException(message.str().c_str());\n            }\n\n            // also check if given links have overlapping pixels:\n            std::vector<PixelRefPair>::const_iterator prevIter = links.begin();\n            for ( ; prevIter != iter; ++prevIter )\n            {\n                const PixelRefPair prevLink = *prevIter;\n\n                // PixelRefPair internal == operator only checks a with a and b with b\n                // but we also need to check the inverse\n                if(link.a == prevLink.a\n                        || link.b == prevLink.b\n                        || link.a == prevLink.b\n                        || link.b == prevLink.a)\n                {\n                    // one of the cells has already been seen.\n                    std::stringstream message;\n                    message << \"Overlapping link found (index: \"\n                            << (iter - links.begin() + 1)\n                            << \")\" << std::flush;\n                    throw depthmapX::InvalidLinkException(message.str().c_str());\n                }\n            }\n        }\n        std::for_each(links.begin(), links.end(),\n                      [&](const PixelRefPair &pair)->void{ currentMap.mergePixels(pair.a,pair.b); });\n    }\n\n    void unmergePixelPairs(const std::vector<PixelRefPair>& links, PointMap& currentMap) {\n\n        // check if any link pixel exists on the map\n        std::vector<PixelRefPair>::const_iterator iter = links.begin(), end =\n        links.end();\n        for ( ; iter != end; ++iter )\n        {\n            const PixelRefPair link = *iter;\n\n            // check in limits:\n            if (!currentMap.includes(link.a) || !currentMap.getPoint(link.a).filled()\n                    || !currentMap.includes(link.b) || !currentMap.getPoint(link.b).filled())\n            {\n                std::stringstream message;\n                message << \"Line ends not both on painted analysis space (index: \"\n                        << (iter - links.begin() + 1)\n                        << \")\" << std::flush;\n                throw depthmapX::InvalidLinkException(message.str().c_str());\n            }\n\n            // check if we were given coordinates that fall on a previously\n            // merged cell, in which case the newest given will replace the\n            // oldest and effectively delete the whole link\n            // check if the two pixels are actually merged to each other\n            if(!currentMap.isPixelMerged(link.a)\n                    || !currentMap.isPixelMerged(link.b))\n            {\n                // one of the cells is already on the map\n                std::stringstream message;\n                message << \"Link pixel pair found that is not linked on the map (index: \"\n                        << (iter - links.begin() + 1)\n                        << \")\"\n                        << std::flush;\n                throw depthmapX::InvalidLinkException(message.str().c_str());\n            }\n\n            // also check if given links have overlapping pixels:\n            std::vector<PixelRefPair>::const_iterator prevIter = links.begin();\n            for ( ; prevIter != iter; ++prevIter )\n            {\n                const PixelRefPair prevLink = *prevIter;\n\n                // PixelRefPair internal == operator only checks a with a and b with b\n                // but we also need to check the inverse\n                if(link.a == prevLink.a\n                        || link.b == prevLink.b\n                        || link.a == prevLink.b\n                        || link.b == prevLink.a)\n                {\n                    // one of the cells has already been seen.\n                    std::stringstream message;\n                    message << \"Overlapping link found (index: \"\n                            << (iter - links.begin() + 1)\n                            << \")\" << std::flush;\n                    throw depthmapX::InvalidLinkException(message.str().c_str());\n                }\n            }\n        }\n        std::for_each(links.begin(), links.end(),\n                      [&](const PixelRefPair &pair)->void{ currentMap.unmergePixel(pair.a); });\n    }\n\n    std::vector<SimpleLine> getMergedPixelsAsLines(PointMap& currentMap)\n    {\n        std::vector<SimpleLine> mergedPixelsAsLines;\n        std::vector<std::pair<PixelRef, PixelRef>> mergedPixelPairs = currentMap.getMergedPixelPairs();\n\n        std::vector<std::pair<PixelRef, PixelRef>>::const_iterator iter = mergedPixelPairs.begin(), end =\n        mergedPixelPairs.end();\n        for ( ; iter != end; ++iter )\n        {\n            std::pair<PixelRef, PixelRef> pixelPair = *iter;\n            mergedPixelsAsLines.push_back(SimpleLine(\n                                              currentMap.depixelate(pixelPair.first),\n                                              currentMap.depixelate(pixelPair.second)\n                                              ));\n        }\n        return mergedPixelsAsLines;\n    }\n}\n"
  },
  {
    "path": "salalib/linkutils.h",
    "content": "// Copyright (C) 2017 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"mgraph.h\"\n#include \"genlib/exceptions.h\"\n#include <vector>\n\nnamespace depthmapX {\n\n    class InvalidLinkException : public depthmapX::BaseException\n    {\n    public:\n        InvalidLinkException(std::string message) : depthmapX::BaseException(message)\n        {}\n    };\n    std::vector<PixelRefPair> pixelateMergeLines(const std::vector<Line>& mergeLines, PointMap& currentMap);\n    void mergePixelPairs(const std::vector<PixelRefPair> &links, PointMap& currentMap);\n    void unmergePixelPairs(const std::vector<PixelRefPair> &links, PointMap& currentMap);\n    std::vector<SimpleLine> getMergedPixelsAsLines(PointMap& currentMap);\n}\n"
  },
  {
    "path": "salalib/mapconverter.cpp",
    "content": "#include \"salalib/mapconverter.h\"\n#include \"salalib/tidylines.h\"\n\n#include \"genlib/exceptions.h\"\n\n#include <numeric>\n\n// convert line layers to an axial map\n\nstd::unique_ptr<ShapeGraph> MapConverter::convertDrawingToAxial(Communicator *comm, const std::string& name,\n                                                                const std::vector<SpacePixelFile> &drawingFiles)\n{\n    if (comm) {\n        comm->CommPostMessage( Communicator::NUM_STEPS, 2 );\n        comm->CommPostMessage( Communicator::CURRENT_STEP, 1 );\n    }\n\n    QtRegion region;\n    std::map<int, std::pair<Line, int>> lines;  // map required for tidy lines, otherwise acts like vector\n    // this is used to say which layer it originated from\n\n    bool recordlayer = false;\n\n    // add all visible layers to the set of polygon lines...\n    int count = 0;\n    for (const auto& pixelGroup: drawingFiles) {\n        int j = 0;\n        for (const auto& pixel: pixelGroup.m_spacePixels) {\n            if (pixel.isShown()) {\n                if (region.atZero()) {\n                    region = pixel.getRegion();\n                }\n                else {\n                    region = runion(region, pixel.getRegion());\n                }\n                std::vector<SimpleLine> newLines = pixel.getAllShapesAsLines();\n                for (const auto& line: newLines) {\n                    lines.insert(std::make_pair(count, std::make_pair(Line(line.start(), line.end()), j)));\n                    count ++;\n                }\n                pixel.setShow(false);\n            }\n            if (j > 0) {\n                recordlayer = true;\n            }\n            j++;\n        }\n    }\n    if (count == 0) {\n        // TODO: write a better error message\n        throw depthmapX::RuntimeException(\"Failed to convert lines\");\n    }\n\n    // quick tidy removes very short and duplicate lines, but does not merge overlapping lines\n    TidyLines tidier;\n    tidier.quicktidy(lines, region);\n    if (lines.size() == 0) {\n        throw depthmapX::RuntimeException(\"No lines found after removing short and duplicates\");\n    }\n\n    if (comm) {\n        comm->CommPostMessage( Communicator::CURRENT_STEP, 2 );\n    }\n\n    // create map layer...\n    // we can stop here for all line axial map!\n    std::unique_ptr<ShapeGraph> usermap(new ShapeGraph(name,ShapeMap::AXIALMAP));\n\n    usermap->init(int(lines.size()),region);        // used to be double density\n    std::map<int, float> layerAttributes;\n    usermap->initialiseAttributesAxial();\n    int layerCol = -1;\n    if (recordlayer)   {\n        layerCol = usermap->getAttributeTable().getOrInsertColumn(\"Drawing Layer\");\n    }\n    for (auto & line: lines) {\n        if (recordlayer)\n        {\n            layerAttributes[layerCol] = float(line.second.second);\n        }\n        usermap->makeLineShape(line.second.first, false, false, layerAttributes );\n    }\n\n    usermap->makeConnections();\n\n    return usermap;\n}\n\n// create axial map directly from data maps\n// note that actually should be able to merge this code with the line layers, now both use similar code\n\nstd::unique_ptr<ShapeGraph> MapConverter::convertDataToAxial(Communicator *comm, const std::string& name,\n                                                             ShapeMap& shapemap, bool copydata)\n{\n   if (comm) {\n      comm->CommPostMessage( Communicator::NUM_STEPS, 2 );\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 1 );\n   }\n\n   // add all visible layers to the set of polygon lines...\n\n   std::map<int, std::pair<Line, int>> lines;\n\n   //m_region = shapemap.getRegion();\n   QtRegion region = shapemap.getRegion();\n\n   // add all visible layers to the set of polygon lines...\n\n   int count = 0;\n   for (auto shape: shapemap.getAllShapes()) {\n      int key = shape.first;\n\n      std::vector<Line> shapeLines = shape.second.getAsLines();\n      for(Line line: shapeLines) {\n         lines.insert(std::make_pair(count, std::make_pair(line, key)));\n         count++;\n      }\n   }\n   if (lines.size() == 0) {\n       throw depthmapX::RuntimeException(\"No lines found in data map\");\n   }\n\n   // quick tidy removes very short and duplicate lines, but does not merge overlapping lines\n   TidyLines tidier;\n   tidier.quicktidy(lines, region);\n   if (lines.size() == 0) {\n       throw depthmapX::RuntimeException(\"No lines found after removing short and duplicates\");\n   }\n\n   if (comm) {\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 2 );\n   }\n\n   // create map layer...\n   // we can stop here for all line axial map!\n   std::unique_ptr<ShapeGraph> usermap(new ShapeGraph(name,ShapeMap::AXIALMAP));\n\n   usermap->init(int(lines.size()),region);  // used to be double density\n   usermap->initialiseAttributesAxial();\n\n   usermap->getAttributeTable().insertOrResetColumn(\"Data Map Ref\");\n\n   std::map<int, float> extraAttr;\n   std::map<int, int> inOutColumns;\n   if (copydata)   {\n       AttributeTable& input = shapemap.getAttributeTable();\n       AttributeTable& output = usermap->getAttributeTable();\n\n       // TODO: Compatibility. The columns are sorted in the old implementation so\n       // they are also passed sorted in the conversion:\n\n       std::vector<size_t> indices(input.getNumColumns());\n       std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\n\n       std::sort(indices.begin(), indices.end(),\n           [&](size_t a, size_t b) {\n           return input.getColumnName(a) < input.getColumnName(b);\n       });\n\n       std::vector<std::string> newColumns;\n       for (size_t i = 0; i < indices.size(); i++) {\n          int idx = indices[i];\n          std::string colname = input.getColumnName(idx);\n          for (size_t k = 1; output.hasColumn(colname); k++){\n             colname = dXstring::formatString(int(k), input.getColumnName(idx) + \" %d\");\n          }\n          newColumns.push_back(colname);\n          output.insertOrResetColumn(colname);\n       }\n       for (size_t i = 0; i < indices.size(); i++) {\n          inOutColumns[indices[i]] = output.getOrInsertColumn(newColumns[i]);\n       }\n   }\n\n   int dataMapShapeRefCol = usermap->getAttributeTable().getOrInsertColumn(\"Data Map Ref\");\n\n    AttributeTable& input = shapemap.getAttributeTable();\n    for (auto& line: lines) {\n        if (copydata){\n            auto& row = input.getRow(AttributeKey(line.second.second));\n            for (auto inOutColumn: inOutColumns){\n                extraAttr[inOutColumn.second] = row.getValue(inOutColumn.first);\n            }\n        }\n        extraAttr[dataMapShapeRefCol] = line.second.second;\n        usermap->makeLineShape(line.second.first, false, false, extraAttr);\n    }\n\n   // n.b. make connections also initialises attributes\n\n   usermap->makeConnections();\n\n   // if we are inheriting from a mapinfo map, pass on the coordsys and bounds:\n   if (shapemap.hasMapInfoData()) {\n      usermap->copyMapInfoBaseData(shapemap);\n   }\n\n   return usermap;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\n// yet more conversions, this time polygons to shape elements\n\nstd::unique_ptr<ShapeGraph> MapConverter::convertDrawingToConvex(Communicator *, const std::string& name,\n                                                                 const std::vector<SpacePixelFile> &drawingFiles)\n{\n   std::unique_ptr<ShapeGraph> usermap(new ShapeGraph(name,ShapeMap::CONVEXMAP));\n   int conn_col = usermap->getAttributeTable().insertOrResetLockedColumn(\"Connectivity\");\n\n   size_t count = 0;\n\n   for (const auto& pixelGroup: drawingFiles) {\n      for (const auto& pixel: pixelGroup.m_spacePixels) {\n         if (pixel.isShown()) {\n             auto refShapes = pixel.getAllShapes();\n             for (const auto& refShape: refShapes) {\n               const SalaShape& shape = refShape.second;\n               if (shape.isPolygon()) {\n                  int newShapeRef = usermap->makeShape(shape);\n                  usermap->getConnections().push_back( Connector() );\n                  usermap->getAttributeTable().getRow(AttributeKey(newShapeRef)).setValue(conn_col,0);\n                  count++;\n               }\n            }\n         }\n      }\n   }\n   if (count == 0) {\n       throw depthmapX::RuntimeException(\"No polygons found in drawing\");\n   }\n\n   for (const auto& pixelGroup: drawingFiles) {\n      for (const auto& pixel: pixelGroup.m_spacePixels) {\n         pixel.setShow(false);\n      }\n   }\n\n   return usermap;\n}\n\nstd::unique_ptr<ShapeGraph> MapConverter::convertDataToConvex(Communicator *, const std::string& name,\n                                                              ShapeMap& shapemap, bool copydata)\n{\n   std::unique_ptr<ShapeGraph> usermap(new ShapeGraph(name,ShapeMap::CONVEXMAP));\n   int conn_col = usermap->getAttributeTable().insertOrResetLockedColumn(\"Connectivity\");\n\n   std::vector<int> lookup;\n   auto refShapes = shapemap.getAllShapes();\n   std::map<int,float> extraAttr;\n   std::vector<int> attrCols;\n   AttributeTable& input = shapemap.getAttributeTable();\n   if (copydata) {\n      AttributeTable& output = usermap->getAttributeTable();\n      for (size_t i = 0; i < input.getNumColumns(); i++) {\n         std::string colname = input.getColumnName(i);\n         for (int k = 1; static_cast<int>(output.getColumnIndex(colname)) != -1; k++){\n            colname = dXstring::formatString(k,input.getColumnName(i) + \" %d\");\n         }\n         attrCols.push_back(output.insertOrResetColumn(colname));\n      }\n   }\n\n   for (auto refShape: refShapes) {\n      if ( copydata ){\n          for ( size_t i = 0; i < input.getNumColumns(); ++i ){\n              extraAttr[attrCols[size_t(i)]] = input.getRow(AttributeKey(refShape.first)).getValue(i);\n          }\n      }\n      SalaShape& shape = refShape.second;\n      if (shape.isPolygon()) {\n         int n = usermap->makeShape(shape, -1, extraAttr);\n         usermap->getConnections().push_back( Connector() );\n         usermap->getAttributeTable().getRow(AttributeKey(n)).setValue(conn_col,0);\n      }\n   }\n   if (usermap->getShapeCount() == 0) {\n       throw depthmapX::RuntimeException(\"No polygons found in data map\");\n   }\n\n   return usermap;\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\n// create segment map directly from line layers\n\nstd::unique_ptr<ShapeGraph> MapConverter::convertDrawingToSegment(Communicator *comm, const std::string& name,\n                                                                  const std::vector<SpacePixelFile> &drawingFiles)\n{\n   if (comm) {\n      comm->CommPostMessage( Communicator::NUM_STEPS, 2 );\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 1 );\n   }\n\n   // second number in internal pair is used to say which layer it originated from\n   std::map<int, std::pair<Line, int>> lines;\n\n   bool recordlayer = false;\n\n   QtRegion region;\n\n   // add all visible layers to the set of polygon lines...\n   int count = 0;\n   for (const auto& pixelGroup: drawingFiles) {\n       int j = 0;\n      for (const auto& pixel: pixelGroup.m_spacePixels) {\n         if (pixel.isShown()) {\n            if (region.atZero()) {\n               region = pixel.getRegion();\n            }\n            else {\n               region = runion(region, pixel.getRegion());\n            }\n            std::vector<SimpleLine> newLines = pixel.getAllShapesAsLines();\n            for (const auto& line: newLines) {\n               lines.insert(std::make_pair(count, std::make_pair(Line(line.start(), line.end()), j)));\n               count++;\n            }\n            pixel.setShow(false);\n         }\n         if (j > 0) {\n            recordlayer = true;\n         }\n         j++;\n      }\n   }\n   if (count == 0) {\n       throw depthmapX::RuntimeException(\"No lines found in drawing\");\n   }\n\n   // quick tidy removes very short and duplicate lines, but does not merge overlapping lines\n   TidyLines tidier;\n   tidier.quicktidy(lines, region);\n   if (lines.size() == 0) {\n       throw depthmapX::RuntimeException(\"No lines found after removing short and duplicates\");\n   }\n\n   if (comm) {\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 2 );\n   }\n\n   // create map layer...\n   // we can stop here for all line axial map!\n   std::unique_ptr<ShapeGraph> usermap(new ShapeGraph(name,ShapeMap::SEGMENTMAP));\n\n   usermap->init(int(lines.size()),region);\n   std::map<int, float> layerAttributes;\n   usermap->initialiseAttributesSegment();\n   int layerCol = -1;\n   if (recordlayer)   {\n       layerCol = usermap->getAttributeTable().insertOrResetColumn(\"Drawing Layer\");\n   }\n   for (auto & line: lines) {\n      if (recordlayer)\n      {\n          layerAttributes[layerCol] = float(line.second.second);\n      }\n      usermap->makeLineShape(line.second.first, false, false, layerAttributes);\n   }\n\n   // make it!\n   usermap->makeNewSegMap(comm);\n\n   return usermap;\n}\n\n// create segment map directly from data maps (ultimately, this will replace the line layers version)\n\nstd::unique_ptr<ShapeGraph> MapConverter::convertDataToSegment(Communicator *comm, const std::string& name,\n                                                               ShapeMap& shapemap, bool copydata)\n{\n   if (comm) {\n      comm->CommPostMessage( Communicator::NUM_STEPS, 2 );\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 1 );\n   }\n\n   std::map<int, std::pair<Line, int>> lines;\n\n   // no longer requires m_region\n   //m_region = shapemap.getRegion();\n   QtRegion region = shapemap.getRegion();\n\n   // add all visible layers to the set of polygon lines...\n\n   int count = 0;\n   for (auto shape: shapemap.getAllShapes()) {\n      int key = shape.first;\n      std::vector<Line> shapeLines = shape.second.getAsLines();\n      for(Line line: shapeLines) {\n         lines.insert(std::make_pair(count, std::make_pair(line, key)));\n         count++;\n      }\n   }\n   if (lines.size() == 0) {\n       throw depthmapX::RuntimeException(\"No lines found in data map\");\n   }\n\n   // quick tidy removes very short and duplicate lines, but does not merge overlapping lines\n   TidyLines tidier;\n   tidier.quicktidy(lines, region);\n\n   if (lines.size() == 0) {\n       throw depthmapX::RuntimeException(\"No lines found after removing short and duplicates\");\n   }\n\n   if (comm) {\n      comm->CommPostMessage( Communicator::CURRENT_STEP, 2 );\n   }\n\n   // create map layer...\n   // note, I may need to reuse this:\n   std::unique_ptr<ShapeGraph> usermap(new ShapeGraph(name,ShapeMap::SEGMENTMAP));\n\n   // if we are inheriting from a mapinfo map, pass on the coordsys and bounds:\n   if (shapemap.hasMapInfoData()) {\n      usermap->copyMapInfoBaseData(shapemap);\n   }\n\n   usermap->init(int(lines.size()),region);\n   usermap->initialiseAttributesSegment();\n\n   usermap->getAttributeTable().insertOrResetColumn(\"Data Map Ref\");\n\n   std::map<int, float> extraAttr;\n   std::map<int, int> inOutColumns;\n   if (copydata)   {\n       AttributeTable& input = shapemap.getAttributeTable();\n       AttributeTable& output = usermap->getAttributeTable();\n\n       // TODO: Compatibility. The columns are sorted in the old implementation so\n       // they are also passed sorted in the conversion:\n\n       std::vector<size_t> indices(input.getNumColumns());\n       std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\n\n       std::sort(indices.begin(), indices.end(),\n           [&](size_t a, size_t b) {\n           return input.getColumnName(a) < input.getColumnName(b);\n       });\n\n       std::vector<std::string> newColumns;\n       for (size_t i = 0; i < indices.size(); i++) {\n          int idx = indices[i];\n          std::string colname = input.getColumnName(idx);\n          for (size_t k = 1; output.hasColumn(colname); k++){\n             colname = dXstring::formatString(int(k), input.getColumnName(idx) + \" %d\");\n          }\n          newColumns.push_back(colname);\n          output.insertOrResetColumn(colname);\n       }\n       for (size_t i = 0; i < indices.size(); i++) {\n          inOutColumns[indices[i]] = output.getOrInsertColumn(newColumns[i]);\n       }\n   }\n\n   int dataMapShapeRefCol = usermap->getAttributeTable().getOrInsertColumn(\"Data Map Ref\");\n\n    AttributeTable& input = shapemap.getAttributeTable();\n    for (auto& line: lines) {\n        if (copydata){\n            auto& row = input.getRow(AttributeKey(line.second.second));\n            for (auto inOutColumn: inOutColumns){\n                extraAttr[inOutColumn.second] = row.getValue(inOutColumn.first);\n            }\n        }\n        extraAttr[dataMapShapeRefCol] = line.second.second;\n        usermap->makeLineShape(line.second.first, false, false, extraAttr);\n    }\n\n   // start to be a little bit more efficient about memory now we are hitting the limits\n   // from time to time:\n   if (!copydata) {\n      lines.clear();\n   }\n\n   // make it!\n   usermap->makeNewSegMap(comm);\n\n   return usermap;\n}\n\n// stubremoval is fraction of overhanging line length before axial \"stub\" is removed\nstd::unique_ptr<ShapeGraph> MapConverter::convertAxialToSegment(Communicator *, ShapeGraph& axialMap,\n                                                                const std::string& name, bool keeporiginal,\n                                                                bool copydata, double stubremoval)\n{\n    std::vector<Line> lines;\n    std::vector<Connector> connectionset;\n\n    axialMap.makeSegmentMap(lines, connectionset, stubremoval);\n\n    // destroy unnecessary parts of axial map as quickly as possible in order not to overload memory\n    if (!keeporiginal) {\n       axialMap.getAllShapes().clear();\n       axialMap.getConnections().clear();\n    }\n\n    // create map layer...\n    std::unique_ptr<ShapeGraph> segmap(new ShapeGraph(name,ShapeMap::SEGMENTMAP));\n\n    segmap->init(int(lines.size()),axialMap.getRegion());\n    segmap->initialiseAttributesSegment();\n\n    for (size_t k = 0; k < lines.size(); k++) {\n      segmap->makeLineShape(lines[k]);\n    }\n\n    // clear data as soon as we do not need it:\n    lines.clear();\n\n    // if we are inheriting from a mapinfo map, pass on the coordsys and bounds:\n    if (axialMap.hasMapInfoData()) {\n        segmap->copyMapInfoBaseData(axialMap);\n    }\n\n\n    segmap->makeSegmentConnections(connectionset);\n\n    if (copydata) {\n      segmap->pushAxialValues(axialMap);\n    }\n    // destroy unnecessary parts of axial map as quickly as possible in order not to overload memory\n    if (!keeporiginal) {\n      axialMap.getAttributeTable().clear();\n    }\n\n    return segmap;\n}\n"
  },
  {
    "path": "salalib/mapconverter.h",
    "content": "#pragma once\n\n#include \"salalib/axialmap.h\"\n#include \"salalib/shapemap.h\"\n#include \"salalib/spacepixfile.h\"\n#include \"genlib/comm.h\"\n\nnamespace MapConverter {\n\nstd::unique_ptr<ShapeGraph> convertDrawingToAxial(Communicator *comm, const std::string& name,\n                                                  const std::vector<SpacePixelFile> &drawingFiles);\nstd::unique_ptr<ShapeGraph> convertDataToAxial(Communicator *comm, const std::string& name,\n                                               ShapeMap& shapemap, bool copydata = false);\nstd::unique_ptr<ShapeGraph> convertDrawingToConvex(Communicator *, const std::string& name,\n                                                   const std::vector<SpacePixelFile> &drawingFiles);\nstd::unique_ptr<ShapeGraph> convertDataToConvex(Communicator *, const std::string& name,\n                                                ShapeMap& shapemap, bool copydata = false);\nstd::unique_ptr<ShapeGraph> convertDrawingToSegment(Communicator *comm, const std::string& name,\n                                                    const std::vector<SpacePixelFile> &drawingFiles);\nstd::unique_ptr<ShapeGraph> convertDataToSegment(Communicator *comm, const std::string& name,\n                                                 ShapeMap& shapemap, bool copydata = false);\nstd::unique_ptr<ShapeGraph> convertAxialToSegment(Communicator *, ShapeGraph& axialMap,\n                                                  const std::string& name, bool keeporiginal = true,\n                                                  bool pushvalues = false, double stubremoval = 0.0);\n\n}\n"
  },
  {
    "path": "salalib/mgraph.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// The meta graph \r\n\r\n#include \"salalib/alllinemap.h\"\r\n#include \"salalib/mapconverter.h\"\r\n#include \"salalib/isovist.h\"\r\n#include \"salalib/mgraph.h\"\r\n\r\n#include \"salalib/importutils.h\"\r\n#include \"salalib/parsers/ntfp.h\"\r\n#include \"salalib/parsers/tigerp.h\"\r\n#include \"salalib/parsers/dxfp.h\"\r\n\r\n#include \"salalib/segmmodules/segmangular.h\"\r\n#include \"salalib/segmmodules/segmtulip.h\"\r\n#include \"salalib/segmmodules/segmtulipdepth.h\"\r\n#include \"salalib/segmmodules/segmmetric.h\"\r\n#include \"salalib/segmmodules/segmmetricpd.h\"\r\n#include \"salalib/segmmodules/segmtopological.h\"\r\n#include \"salalib/segmmodules/segmtopologicalpd.h\"\r\n#include \"salalib/axialmodules/axialintegration.h\"\r\n#include \"salalib/axialmodules/axialstepdepth.h\"\r\n#include \"salalib/vgamodules/vgaisovist.h\"\r\n#include \"salalib/vgamodules/vgavisualglobal.h\"\r\n#include \"salalib/vgamodules/vgavisualglobaldepth.h\"\r\n#include \"salalib/vgamodules/vgavisuallocal.h\"\r\n#include \"salalib/vgamodules/vgametric.h\"\r\n#include \"salalib/vgamodules/vgametricdepth.h\"\r\n#include \"salalib/vgamodules/vgaangular.h\"\r\n#include \"salalib/vgamodules/vgaangulardepth.h\"\r\n#include \"salalib/vgamodules/vgathroughvision.h\"\r\n#include \"salalib/agents/agenthelpers.h\"\r\n\r\n#include \"mgraph440/mgraph.h\"\r\n\r\n#include \"genlib/pafmath.h\"\r\n#include \"genlib/p2dpoly.h\"\r\n#include \"genlib/comm.h\"\r\n\r\n#include \"math.h\"\r\n#include \"time.h\"\r\n\r\n#include <sstream>\r\n#include <tuple>\r\n\r\n\r\nMetaGraph::MetaGraph(std::string name)\r\n{ \r\n   m_name = name;\r\n   m_state = 0; \r\n   m_view_class = VIEWNONE;\r\n   m_file_version = -1; // <- if unsaved, file version is -1\r\n\r\n   // whether or not showing text / grid saved with file:\r\n   m_showtext = false;\r\n   m_showgrid = false;\r\n\r\n   // bsp tree for making isovists:\r\n   m_bsp_tree = false;\r\n   m_bsp_root = NULL;\r\n}\r\n\r\nMetaGraph::~MetaGraph()\r\n{\r\n   if (m_bsp_root) {\r\n      delete m_bsp_root;\r\n      m_bsp_root = NULL;\r\n   }\r\n   m_bsp_tree = false;\r\n}\r\n\r\nQtRegion MetaGraph::getBoundingBox() const\r\n{\r\n   QtRegion bounds = m_region;\r\n   if (bounds.atZero() && ((getState() & MetaGraph::SHAPEGRAPHS) == MetaGraph::SHAPEGRAPHS)) {\r\n      bounds = getDisplayedShapeGraph().getRegion();\r\n   }\r\n   if (bounds.atZero() && ((getState() & MetaGraph::DATAMAPS) == MetaGraph::DATAMAPS)) {\r\n      bounds = getDisplayedDataMap().getRegion();\r\n   }\r\n   return bounds;\r\n}\r\n\r\nbool MetaGraph::setViewClass(int command)\r\n{\r\n   if (command < 0x10) {\r\n      throw (\"Use with a show command, not a view class type\");\r\n   }\r\n   if ((command & (SHOWHIDEVGA | SHOWVGATOP)) && (~m_state & POINTMAPS)) \r\n      return false; \r\n   if ((command & (SHOWHIDEAXIAL | SHOWAXIALTOP)) && (~m_state & SHAPEGRAPHS)) \r\n      return false; \r\n   if ((command & (SHOWHIDESHAPE | SHOWSHAPETOP)) && (~m_state & DATAMAPS)) \r\n      return false; \r\n   switch (command) {\r\n   case SHOWHIDEVGA:\r\n      if (m_view_class & (VIEWVGA | VIEWBACKVGA)) {\r\n         m_view_class &= ~(VIEWVGA | VIEWBACKVGA);\r\n         if (m_view_class & VIEWBACKAXIAL) {\r\n            m_view_class ^= (VIEWAXIAL | VIEWBACKAXIAL);\r\n         }\r\n         else if (m_view_class & VIEWBACKDATA) {\r\n            m_view_class ^= (VIEWDATA | VIEWBACKDATA);\r\n         }\r\n      }\r\n      else if (m_view_class & (VIEWAXIAL | VIEWDATA)) {\r\n         m_view_class &= ~(VIEWBACKAXIAL | VIEWBACKDATA);\r\n         m_view_class |= VIEWBACKVGA;\r\n      }\r\n      else {\r\n         m_view_class |= VIEWVGA;\r\n      }\r\n      break;\r\n   case SHOWHIDEAXIAL:\r\n      if (m_view_class & (VIEWAXIAL | VIEWBACKAXIAL)) {\r\n         m_view_class &= ~(VIEWAXIAL | VIEWBACKAXIAL);\r\n         if (m_view_class & VIEWBACKVGA) {\r\n            m_view_class ^= (VIEWVGA | VIEWBACKVGA);\r\n         }\r\n         else if (m_view_class & VIEWBACKDATA) {\r\n            m_view_class ^= (VIEWDATA | VIEWBACKDATA);\r\n         }\r\n      }\r\n      else if (m_view_class & (VIEWVGA | VIEWDATA)) {\r\n         m_view_class &= ~(VIEWBACKVGA | VIEWBACKDATA);\r\n         m_view_class |= VIEWBACKAXIAL;\r\n      }\r\n      else {\r\n         m_view_class |= VIEWAXIAL;\r\n      }\r\n      break;\r\n   case SHOWHIDESHAPE:\r\n      if (m_view_class & (VIEWDATA | VIEWBACKDATA)) {\r\n         m_view_class &= ~(VIEWDATA | VIEWBACKDATA);\r\n         if (m_view_class & VIEWBACKVGA) {\r\n            m_view_class ^= (VIEWVGA | VIEWBACKVGA);\r\n         }\r\n         else if (m_view_class & VIEWBACKAXIAL) {\r\n            m_view_class ^= (VIEWAXIAL | VIEWBACKAXIAL);\r\n         }\r\n      }\r\n      else if (m_view_class & (VIEWVGA | VIEWAXIAL)) {\r\n         m_view_class &= ~(VIEWBACKVGA | VIEWBACKAXIAL);\r\n         m_view_class |= VIEWBACKDATA;\r\n      }\r\n      else {\r\n         m_view_class |= VIEWDATA;\r\n      }\r\n      break;\r\n   case SHOWVGATOP:\r\n      if (m_view_class & VIEWAXIAL) {\r\n         m_view_class = VIEWBACKAXIAL | VIEWVGA;\r\n      }\r\n      else if (m_view_class & VIEWDATA) {\r\n         m_view_class = VIEWBACKDATA | VIEWVGA;\r\n      }\r\n      else {\r\n         m_view_class = VIEWVGA | (m_view_class & (VIEWBACKAXIAL | VIEWBACKDATA));\r\n      }\r\n      break;\r\n   case SHOWAXIALTOP:\r\n      if (m_view_class & VIEWVGA) {\r\n         m_view_class = VIEWBACKVGA | VIEWAXIAL;\r\n      }\r\n      else if (m_view_class & VIEWDATA) {\r\n         m_view_class = VIEWBACKDATA | VIEWAXIAL;\r\n      }\r\n      else {\r\n         m_view_class = VIEWAXIAL | (m_view_class & (VIEWBACKVGA | VIEWBACKDATA));\r\n      }\r\n      break;\r\n   case SHOWSHAPETOP:\r\n      if (m_view_class & VIEWVGA) {\r\n         m_view_class = VIEWBACKVGA | VIEWDATA;\r\n      }\r\n      else if (m_view_class & VIEWAXIAL) {\r\n         m_view_class = VIEWBACKAXIAL | VIEWDATA;\r\n      }\r\n      else {\r\n         m_view_class = VIEWDATA | (m_view_class & (VIEWBACKVGA | VIEWBACKAXIAL));\r\n      }\r\n      break;\r\n   }\r\n   return true;\r\n}\r\n\r\ndouble MetaGraph::getLocationValue(const Point2f& point)\r\n{\r\n   // this varies according to whether axial or vga information is displayed on top\r\n   double val = -2;\r\n\r\n   if (viewingProcessedPoints()) {\r\n      val = getDisplayedPointMap().getLocationValue(point);\r\n   }\r\n   else if (viewingProcessedLines()) {\r\n      val = getDisplayedShapeGraph().getLocationValue(point);\r\n   }\r\n   else if (viewingProcessedShapes()) {\r\n      val = getDisplayedDataMap().getLocationValue(point);\r\n   }\r\n\r\n   return val;\r\n}\r\n\r\nbool MetaGraph::setGrid( double spacing, const Point2f& offset )\r\n{\r\n   m_state &= ~POINTMAPS;\r\n\r\n   getDisplayedPointMap().setGrid( spacing, offset );\r\n\r\n   m_state |= POINTMAPS;\r\n\r\n   // just reassert that we should be viewing this (since set grid is essentially a \"new point map\")\r\n   setViewClass(SHOWVGATOP);\r\n\r\n   return true;\r\n}\r\n\r\n// AV TV // semifilled\r\nbool MetaGraph::makePoints( const Point2f& p, int fill_type , Communicator *communicator )\r\n{\r\n//   m_state &= ~POINTS;\r\n\r\n   try {\r\n      getDisplayedPointMap().makePoints( p, fill_type, communicator );\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n\r\n      // By this stage points almost certainly exist,\r\n      // To avoid problems, just say points exist:\r\n      m_state |= POINTMAPS;\r\n      \r\n      return false;\r\n   }\r\n\r\n//   m_state |= POINTS;\r\n\r\n   return true;\r\n}\r\n\r\nbool MetaGraph::clearPoints()\r\n{\r\n   bool b_return = getDisplayedPointMap().clearPoints();\r\n   return b_return;\r\n}\r\n\r\nbool MetaGraph::makeGraph( Communicator *communicator, int algorithm, double maxdist )\r\n{\r\n   // this is essentially a version tag, and remains for historical reasons:\r\n   m_state |= ANGULARGRAPH;\r\n\r\n   bool graphMade = false;\r\n   \r\n   try {\r\n      // algorithm is now used for boundary graph option (as a simple boolean)\r\n      graphMade = getDisplayedPointMap().sparkGraph2(communicator, (algorithm != 0), maxdist);\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      graphMade = false;\r\n   }\r\n\r\n   if (graphMade) {\r\n      setViewClass(SHOWVGATOP);\r\n   }\r\n\r\n   return graphMade;\r\n}\r\n\r\nbool MetaGraph::unmakeGraph(bool removeLinks)\r\n{\r\n   bool graphUnmade = getDisplayedPointMap().unmake(removeLinks);\r\n\r\n   if (graphUnmade) {\r\n      setViewClass(SHOWVGATOP);\r\n   }\r\n\r\n   return graphUnmade;\r\n}\r\n\r\nbool MetaGraph::analyseGraph( Communicator *communicator, Options options , bool simple_version )   // <- options copied to keep thread safe\r\n{\r\n   bool analysisCompleted = false;\r\n\r\n   if (options.point_depth_selection) {\r\n      if (m_view_class & VIEWVGA && !getDisplayedPointMap().isSelected()) {\r\n         return false;\r\n      }\r\n      else if (m_view_class & VIEWAXIAL && !getDisplayedShapeGraph().hasSelectedElements()) {\r\n         return false;\r\n      }\r\n   }\r\n\r\n   try {\r\n      analysisCompleted = true;\r\n      if (options.point_depth_selection == 1) {\r\n         if (m_view_class & VIEWVGA) {\r\n             analysisCompleted = VGAVisualGlobalDepth().run(communicator, getDisplayedPointMap(), false);\r\n         }\r\n         else if (m_view_class & VIEWAXIAL) {\r\n            if (!getDisplayedShapeGraph().isSegmentMap()) {\r\n                analysisCompleted = AxialStepDepth().run(communicator, getDisplayedShapeGraph(), false);\r\n            }\r\n            else {\r\n                analysisCompleted = SegmentTulipDepth().run(communicator, getDisplayedShapeGraph(), false);\r\n            }\r\n         }\r\n         // REPLACES:\r\n         // Graph::calculate_point_depth_matrix( communicator );\r\n      }\r\n      else if (options.point_depth_selection == 2) {\r\n         if (m_view_class & VIEWVGA) {\r\n             analysisCompleted = VGAMetricDepth().run(communicator, getDisplayedPointMap(), false);\r\n         }\r\n         else if (m_view_class & VIEWAXIAL && getDisplayedShapeGraph().isSegmentMap()) {\r\n             analysisCompleted = SegmentMetricPD().run(communicator, getDisplayedShapeGraph(), false);\r\n         }\r\n      }\r\n      else if (options.point_depth_selection == 3) {\r\n          analysisCompleted = VGAAngularDepth().run(communicator, getDisplayedPointMap(), false);\r\n      }\r\n      else if (options.point_depth_selection == 4) {\r\n         if (m_view_class & VIEWVGA) {\r\n            getDisplayedPointMap().binDisplay( communicator );\r\n         }\r\n         else if (m_view_class & VIEWAXIAL && getDisplayedShapeGraph().isSegmentMap()) {\r\n             analysisCompleted = SegmentTopologicalPD().run(communicator, getDisplayedShapeGraph(), false);\r\n         }\r\n      }\r\n      else if (options.output_type == Options::OUTPUT_ISOVIST) {\r\n         analysisCompleted = VGAIsovist().run(communicator, getDisplayedPointMap(), simple_version);\r\n      }\r\n      else if (options.output_type == Options::OUTPUT_VISUAL) {\r\n          bool localResult = true;\r\n          bool globalResult = true;\r\n          if (options.local) {\r\n              localResult = VGAVisualLocal(options.gates_only).run(communicator, getDisplayedPointMap(), simple_version);\r\n          }\r\n          if (options.global) {\r\n              globalResult = VGAVisualGlobal(options.radius, options.gates_only).run(communicator, getDisplayedPointMap(), simple_version);\r\n          }\r\n          analysisCompleted = globalResult & localResult;\r\n      }\r\n      else if (options.output_type == Options::OUTPUT_METRIC) {\r\n          analysisCompleted = VGAMetric(options.radius, options.gates_only).run(communicator, getDisplayedPointMap(), simple_version);\r\n      }\r\n      else if (options.output_type == Options::OUTPUT_ANGULAR) {\r\n          analysisCompleted = VGAAngular(options.radius, options.gates_only).run(communicator, getDisplayedPointMap(), simple_version);\r\n      }\r\n      else if (options.output_type == Options::OUTPUT_THRU_VISION) {\r\n          analysisCompleted = VGAThroughVision().run(communicator, getDisplayedPointMap(), simple_version);\r\n      }\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////\r\n\r\nbool MetaGraph::isEditableMap()\r\n{\r\n   if (m_view_class & VIEWAXIAL) {\r\n      return getDisplayedShapeGraph().isEditable();\r\n   }\r\n   else if (m_view_class & VIEWDATA) {\r\n      return getDisplayedDataMap().isEditable();\r\n   }\r\n   // still to do: allow editing of drawing layers\r\n   return false;\r\n}\r\n\r\nShapeMap& MetaGraph::getEditableMap()\r\n{\r\n   ShapeMap *map = NULL;\r\n   if (m_view_class & VIEWAXIAL) {\r\n      map = &(getDisplayedShapeGraph());\r\n   }\r\n   else if (m_view_class & VIEWDATA) {\r\n      map = &(getDisplayedDataMap());\r\n   }\r\n   else {\r\n      // still to do: allow editing of drawing layers\r\n   }\r\n   if (map == NULL || !map->isEditable()) {\r\n      throw 0;\r\n   }\r\n   return *map;\r\n}\r\n\r\nbool MetaGraph::makeShape(const Line& line)\r\n{\r\n   if (!isEditableMap()) {\r\n      return false;\r\n   }\r\n   ShapeMap& map = getEditableMap();\r\n   return (map.makeLineShape(line,true) != -1);\r\n}\r\n\r\nint MetaGraph::polyBegin(const Line& line)\r\n{\r\n   if (!isEditableMap()) {\r\n      return -1;\r\n   }\r\n   ShapeMap& map = getEditableMap();\r\n   return map.polyBegin(line);\r\n}\r\n\r\nbool MetaGraph::polyAppend(int shape_ref, const Point2f& point)\r\n{\r\n   if (!isEditableMap()) {\r\n      return false;\r\n   }\r\n   ShapeMap& map = getEditableMap();\r\n   return map.polyAppend(shape_ref, point);\r\n}\r\n\r\nbool MetaGraph::polyClose(int shape_ref)\r\n{\r\n   if (!isEditableMap()) {\r\n      return false;\r\n   }\r\n   ShapeMap& map = getEditableMap();\r\n   return map.polyClose(shape_ref);\r\n}\r\n\r\nbool MetaGraph::polyCancel(int shape_ref)\r\n{\r\n   if (!isEditableMap()) {\r\n      return false;\r\n   }\r\n   ShapeMap& map = getEditableMap();\r\n   return map.polyCancel(shape_ref);\r\n}\r\n\r\nbool MetaGraph::moveSelShape(const Line& line)\r\n{\r\n   bool shapeMoved = false;\r\n   if (m_view_class & VIEWAXIAL) {\r\n      ShapeGraph& map = getDisplayedShapeGraph();\r\n      if (!map.isEditable()) {\r\n         return false;\r\n      }\r\n      if (map.getSelCount() > 1) {\r\n         return false;\r\n      }\r\n      int rowid = *map.getSelSet().begin();\r\n      shapeMoved = map.moveShape(rowid,line);\r\n      if (shapeMoved) {\r\n         map.clearSel();\r\n      }\r\n   }\r\n   else if (m_view_class & VIEWDATA) {\r\n      ShapeMap& map = getDisplayedDataMap();\r\n      if (!map.isEditable()) {\r\n         return false;\r\n      }\r\n      if (map.getSelCount() > 1) {\r\n         return false;\r\n      }\r\n      int rowid = *map.getSelSet().begin();\r\n      shapeMoved = map.moveShape(rowid, line);\r\n      if (shapeMoved) {\r\n         map.clearSel();\r\n      }\r\n   }\r\n   return shapeMoved;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////\r\n\r\n// returns 0: fail, 1: made isovist, 2: made isovist and added new shapemap layer\r\nint MetaGraph::makeIsovist(Communicator *communicator, const Point2f& p, double startangle, double endangle, bool simple_version)\r\n{\r\n   int isovistMade = 0;\r\n   // first make isovist\r\n   Isovist iso;\r\n\r\n   if (makeBSPtree(communicator)) {\r\n      m_view_class &= ~VIEWDATA;\r\n      isovistMade = 1;\r\n      iso.makeit(m_bsp_root, p, m_region, startangle, endangle);\r\n      int shapelayer = getMapRef(m_dataMaps, \"Isovists\");\r\n      if (shapelayer == -1) {\r\n         m_dataMaps.emplace_back(\"Isovists\",ShapeMap::DATAMAP);\r\n         setDisplayedDataMapRef(m_dataMaps.size() - 1);\r\n         shapelayer = m_dataMaps.size() - 1;\r\n         m_state |= DATAMAPS;\r\n         isovistMade = 2;\r\n      }\r\n      ShapeMap& map = m_dataMaps[shapelayer];\r\n      // false: closed polygon, true: isovist\r\n      int polyref = map.makePolyShape(iso.getPolygon(),false);  \r\n      map.getAllShapes()[polyref].setCentroid(p);\r\n      map.overrideDisplayedAttribute(-2);\r\n      map.setDisplayedAttribute(-1);\r\n      setViewClass(SHOWSHAPETOP);\r\n      AttributeTable& table = map.getAttributeTable();\r\n      AttributeRow& row = table.getRow(AttributeKey(polyref));\r\n      iso.setData(table,row, simple_version);\r\n   }\r\n   return isovistMade;\r\n}\r\n\r\nstatic std::pair<double,double> startendangle( Point2f vec, double fov)\r\n{\r\n   std::pair<double,double> angles;\r\n   // n.b. you must normalise this before getting the angle!\r\n   vec.normalise();\r\n   angles.first = vec.angle() - fov / 2.0;\r\n   angles.second = vec.angle() + fov / 2.0;\r\n   if (angles.first < 0.0) \r\n      angles.first += 2.0 * M_PI;\r\n   if (angles.second > 2.0 * M_PI)\r\n      angles.second -= 2.0 * M_PI;\r\n   return angles;\r\n}\r\n\r\n// returns 0: fail, 1: made isovist, 2: made isovist and added new shapemap layer\r\nint MetaGraph::makeIsovistPath(Communicator *communicator, double fov, bool simple_version)\r\n{\r\n   int pathMade = 0;\r\n\r\n   // must be showing a suitable map -- that is, one which may have polylines or lines\r\n   ShapeMap *map = NULL, *isovists = NULL;\r\n   int isovistmapref = -1;\r\n   int viewclass = getViewClass() & VIEWFRONT;\r\n   if (viewclass == VIEWAXIAL) {\r\n      map = &getDisplayedShapeGraph();\r\n   }\r\n   else if (viewclass == VIEWDATA) {\r\n      map = &getDisplayedDataMap();\r\n   }\r\n   else {\r\n      return 0;\r\n   }\r\n\r\n   // must have a selection: the selected shapes will form the set from which to create the isovist paths\r\n   if (!map->hasSelectedElements()) {\r\n      return 0;\r\n   }\r\n\r\n   bool first = true;\r\n   if (makeBSPtree(communicator)) {\r\n      std::set<int> selset = map->getSelSet();\r\n      std::map<int,SalaShape>& shapes = map->getAllShapes();\r\n      for (auto& shapeRef: selset) {\r\n         const SalaShape& path = shapes.at(shapeRef);\r\n         if (path.isLine() || path.isPolyLine()) {\r\n            if (first) {\r\n               pathMade = 1;\r\n               isovistmapref = getMapRef(m_dataMaps, \"Isovists\");\r\n               if (isovistmapref == -1) {\r\n                  m_dataMaps.emplace_back(\"Isovists\",ShapeMap::DATAMAP);\r\n                  isovistmapref = m_dataMaps.size() - 1;\r\n                  setDisplayedDataMapRef(isovistmapref);\r\n                  pathMade = 2;\r\n               }\r\n               isovists = &(m_dataMaps[isovistmapref]);\r\n               first = false;\r\n            }\r\n            // now make an isovist:\r\n            Isovist iso;\r\n            // \r\n            std::pair<double,double> angles;\r\n            angles.first = 0.0;\r\n            angles.second = 0.0;\r\n            //\r\n            if (path.isLine()) {\r\n               Point2f start = path.getLine().t_start();\r\n               Point2f vec = path.getLine().vector();\r\n               if (fov < 2.0 * M_PI) {\r\n                  angles = startendangle(vec, fov);\r\n               }\r\n               iso.makeit(m_bsp_root, start, m_region, angles.first, angles.second);\r\n               int polyref = isovists->makePolyShape(iso.getPolygon(),false);  \r\n               isovists->getAllShapes()[polyref].setCentroid(start);\r\n               AttributeTable& table = isovists->getAttributeTable();\r\n               AttributeRow& row = table.getRow(AttributeKey(polyref));\r\n               iso.setData(table,row, simple_version);\r\n            }\r\n            else {\r\n               for (size_t i = 0; i < path.m_points.size() - 1; i++) {\r\n                  Line li = Line(path.m_points[i],path.m_points[i+1]);\r\n                  Point2f start = li.t_start();\r\n                  Point2f vec = li.vector();\r\n                  if (fov < 2.0 * M_PI) {\r\n                     angles = startendangle(vec, fov);\r\n                  }\r\n                  iso.makeit(m_bsp_root, start, m_region, angles.first, angles.second);\r\n                  int polyref = isovists->makePolyShape(iso.getPolygon(),false);  \r\n                  isovists->getAllShapes().find(polyref)->second.setCentroid(start);\r\n                  AttributeTable& table = isovists->getAttributeTable();\r\n                  AttributeRow& row = table.getRow(AttributeKey(polyref));\r\n                  iso.setData(table,row, simple_version);\r\n               }\r\n            }\r\n         }\r\n      }\r\n      if (isovists) {\r\n         isovists->overrideDisplayedAttribute(-2);\r\n         isovists->setDisplayedAttribute(-1);\r\n         setDisplayedDataMapRef(isovistmapref);\r\n      }\r\n   }\r\n   return pathMade;\r\n}\r\n\r\n// this version uses your own isovist (and assumes no communicator required for BSP tree\r\nbool MetaGraph::makeIsovist(const Point2f& p, Isovist& iso)\r\n{\r\n   if (makeBSPtree()) {\r\n      iso.makeit(m_bsp_root, p, m_region);\r\n      return true;\r\n   }\r\n   return false;\r\n}\r\n\r\nbool MetaGraph::makeBSPtree(Communicator *communicator)\r\n{\r\n   if (m_bsp_tree) {\r\n      return true;\r\n   }\r\n\r\n   std::vector<TaggedLine> partitionlines;\r\n   for (const auto& pixelGroup: m_drawingFiles) {\r\n      for (const auto& pixel: pixelGroup.m_spacePixels) {\r\n         // chooses the first editable layer it can find:\r\n         if (pixel.isShown()) {\r\n             auto refShapes = pixel.getAllShapes();\r\n             int k = -1;\r\n             for (const auto& refShape: refShapes) {\r\n                 k++;\r\n                 std::vector<Line> newLines = refShape.second.getAsLines();\r\n                 // I'm not sure what the tagging was meant for any more,\r\n                 // tagging at the moment tags the *polygon* it was original attached to\r\n                 // must check it is not a zero length line:\r\n                 for(const Line& line: newLines) {\r\n                     if(line.length() > 0.0) {\r\n                         partitionlines.push_back(TaggedLine(line,k));\r\n                     }\r\n                 }\r\n            }\r\n         }\r\n      }\r\n   }\r\n\r\n   if (partitionlines.size()) {\r\n      //\r\n      // Now we'll try the BSP tree:\r\n      //\r\n      if (m_bsp_root) {\r\n         delete m_bsp_root;\r\n         m_bsp_root = NULL;\r\n      }\r\n      m_bsp_root = new BSPNode();\r\n\r\n      time_t atime = 0;\r\n      if (communicator) {\r\n          communicator->CommPostMessage( Communicator::NUM_RECORDS, partitionlines.size() );\r\n          qtimer( atime, 0 );\r\n      }\r\n\r\n      try {\r\n         BSPTree::make(communicator,atime,partitionlines,m_bsp_root);\r\n         m_bsp_tree = true;\r\n      } \r\n      catch (Communicator::CancelledException) {\r\n         m_bsp_tree = false;\r\n         // probably best to delete the half made bastard of a tree:\r\n         delete m_bsp_root;\r\n         m_bsp_root = NULL;\r\n      }\r\n   }\r\n\r\n   partitionlines.clear();\r\n\r\n   return m_bsp_tree;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////\r\n\r\nint MetaGraph::addShapeGraph(std::unique_ptr<ShapeGraph>& shapeGraph) {\r\n    m_shapeGraphs.push_back(std::move(shapeGraph));\r\n    int mapref= int(m_shapeGraphs.size() - 1);\r\n    setDisplayedShapeGraphRef(mapref);\r\n    m_state |= SHAPEGRAPHS;\r\n    setViewClass(SHOWAXIALTOP);\r\n    return mapref;\r\n}\r\n\r\nint MetaGraph::addShapeGraph(const std::string& name, int type)\r\n{\r\n    std::unique_ptr<ShapeGraph> shapeGraph(new ShapeGraph(name, type));\r\n    int mapref = addShapeGraph(shapeGraph);\r\n    // add a couple of default columns:\r\n    AttributeTable& table = m_shapeGraphs[size_t(mapref)]->getAttributeTable();\r\n    int connIdx = table.insertOrResetLockedColumn(\"Connectivity\");\r\n    if ((type & ShapeMap::LINEMAP) != 0) {\r\n        table.insertOrResetLockedColumn(\"Line Length\");\r\n    }\r\n    m_shapeGraphs[mapref]->setDisplayedAttribute(connIdx);\r\n    return mapref;\r\n}\r\nint MetaGraph::addShapeMap(const std::string& name)\r\n{\r\n   m_dataMaps.emplace_back(name,ShapeMap::DATAMAP);\r\n   m_state |= DATAMAPS;\r\n   setViewClass(SHOWSHAPETOP);\r\n   return m_dataMaps.size() - 1;\r\n}\r\nvoid MetaGraph::removeDisplayedMap()\r\n{\r\n   int ref = getDisplayedMapRef();\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      removePointMap(ref);\r\n      if (m_pointMaps.empty()) {\r\n         setViewClass(SHOWHIDEVGA);\r\n         m_state &= ~POINTMAPS;\r\n      }\r\n      break;\r\n   case VIEWAXIAL:\r\n      removeShapeGraph(ref);\r\n      if (m_shapeGraphs.empty()) {\r\n         setViewClass(SHOWHIDEAXIAL);\r\n         m_state &= ~SHAPEGRAPHS;\r\n      }\r\n      break;\r\n   case VIEWDATA:\r\n      removeDataMap(ref);\r\n      if (m_dataMaps.empty()) {\r\n         setViewClass(SHOWHIDESHAPE);\r\n         m_state &= ~DATAMAPS;\r\n      }\r\n      break;\r\n   }\r\n}\r\n\r\n\r\n//////////////////////////////////////////////////////////////////\r\n\r\n\r\nbool MetaGraph::convertDrawingToAxial(Communicator *comm, std::string layer_name)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~SHAPEGRAPHS;\r\n\r\n   bool converted = true;\r\n   \r\n   try {\r\n      auto shapeGraph = MapConverter::convertDrawingToAxial( comm, layer_name, m_drawingFiles );\r\n      int mapref = addShapeGraph(shapeGraph);\r\n      setDisplayedShapeGraphRef(mapref);\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\nbool MetaGraph::convertDataToAxial(Communicator *comm, std::string layer_name, bool keeporiginal, bool pushvalues)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~SHAPEGRAPHS;\r\n\r\n   bool converted = true;\r\n   \r\n   try {\r\n       auto shapeGraph = MapConverter::convertDataToAxial( comm, layer_name, getDisplayedDataMap(), pushvalues );\r\n       addShapeGraph(shapeGraph);\r\n\r\n       m_shapeGraphs.back()->overrideDisplayedAttribute(-2); // <- override if it's already showing\r\n       m_shapeGraphs.back()->setDisplayedAttribute(\r\n                   m_shapeGraphs.back()->getAttributeTable().getColumnIndex(\"Connectivity\") );\r\n\r\n       setDisplayedShapeGraphRef(int(m_shapeGraphs.size() - 1));\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      if (!keeporiginal) {\r\n         removeDataMap( getDisplayedDataMapRef() );\r\n         if (m_dataMaps.empty()) {\r\n            setViewClass(SHOWHIDESHAPE);\r\n            m_state &= ~DATAMAPS;\r\n         }\r\n      }\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\n// typeflag: -1 convert drawing to convex, 0 or 1, convert data to convex (1 is pushvalues)\r\nbool MetaGraph::convertToConvex(Communicator *comm, std::string layer_name, bool keeporiginal, int shapeMapType, bool copydata)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~SHAPEGRAPHS; // and convex maps...\r\n\r\n   bool converted = false;\r\n   \r\n   try {\r\n      int mapref = -1;\r\n      if (shapeMapType == ShapeMap::DRAWINGMAP) {\r\n          auto shapeGraph = MapConverter::convertDrawingToConvex( comm, layer_name, m_drawingFiles );\r\n          mapref = addShapeGraph(shapeGraph);\r\n      }\r\n      else if (shapeMapType == ShapeMap::DATAMAP) {\r\n          auto shapeGraph = MapConverter::convertDataToConvex( comm, layer_name, getDisplayedDataMap(), copydata );\r\n          mapref = addShapeGraph(shapeGraph);\r\n      }\r\n\r\n      m_shapeGraphs.back()->overrideDisplayedAttribute( -2 ); // <- override if it's already showing\r\n      m_shapeGraphs.back()->setDisplayedAttribute( -1 );\r\n      setDisplayedShapeGraphRef(int(m_shapeGraphs.size() - 1));\r\n\r\n      if (mapref != -1) {\r\n         converted = true;\r\n      }\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      if (shapeMapType != ShapeMap::DRAWINGMAP && !keeporiginal) {\r\n         removeDataMap( getDisplayedDataMapRef() );\r\n         if (m_dataMaps.empty()) {\r\n            setViewClass(SHOWHIDESHAPE);\r\n            m_state &= ~DATAMAPS;\r\n         }\r\n      }\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\nbool MetaGraph::convertDrawingToSegment(Communicator *comm, std::string layer_name)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~SHAPEGRAPHS;\r\n\r\n   bool converted = true;\r\n   \r\n   try {\r\n       auto shapeGraph = MapConverter::convertDrawingToSegment( comm, layer_name, m_drawingFiles );\r\n       addShapeGraph(shapeGraph);\r\n\r\n       setDisplayedShapeGraphRef(int(m_shapeGraphs.size() - 1));\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\nbool MetaGraph::convertDataToSegment(Communicator *comm, std::string layer_name, bool keeporiginal, bool pushvalues)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~SHAPEGRAPHS;\r\n\r\n   bool converted = true;\r\n   \r\n   try {\r\n       auto shapeGraph = MapConverter::convertDataToSegment( comm, layer_name, getDisplayedDataMap(), pushvalues );\r\n       addShapeGraph(shapeGraph);\r\n\r\n       m_shapeGraphs.back()->overrideDisplayedAttribute( -2 ); // <- override if it's already showing\r\n       m_shapeGraphs.back()->setDisplayedAttribute( -1 );\r\n       setDisplayedShapeGraphRef(int(m_shapeGraphs.size() - 1));\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      if (!keeporiginal) {\r\n         removeDataMap( getDisplayedDataMapRef() );\r\n         if (m_dataMaps.empty()) {\r\n            setViewClass(SHOWHIDESHAPE);\r\n            m_state &= ~DATAMAPS;\r\n         }\r\n      }\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\n// note: type flag says whether this is graph to data map or drawing to data map\r\n\r\nbool MetaGraph::convertToData(Communicator *, std::string layer_name, bool keeporiginal, int shapeMapType, bool copydata)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~DATAMAPS;\r\n\r\n   bool converted = false;\r\n   \r\n   try {\r\n      // This should be much easier than before,\r\n      // simply move the shapes from the drawing layer\r\n      // note however that more than one layer might be combined:\r\n      // create map layer...\r\n      m_dataMaps.emplace_back(layer_name,ShapeMap::DATAMAP);\r\n      int destmapref = m_dataMaps.size() - 1;\r\n      ShapeMap& destmap = m_dataMaps.back();\r\n      AttributeTable& table = destmap.getAttributeTable();\r\n      int count = 0;\r\n      //\r\n      // drawing to data\r\n      if (shapeMapType == ShapeMap::DRAWINGMAP) {\r\n         int layercol = destmap.addAttribute(\"Drawing Layer\");\r\n         // add all visible layers to the set of map:\r\n         for (const auto& pixelGroup: m_drawingFiles) {\r\n            int j = 0;\r\n            for (const auto& pixel: pixelGroup.m_spacePixels) {\r\n               if (pixel.isShown()) {\r\n                  auto refShapes = pixel.getAllShapes();\r\n                  for (const auto& refShape: refShapes) {\r\n                     int key = destmap.makeShape(refShape.second);\r\n                     table.getRow(AttributeKey(key)).setValue(layercol,float(j+1));\r\n                     count++;\r\n                  }\r\n                  pixel.setShow(false);\r\n               }\r\n               j++;\r\n            }\r\n         }\r\n      }\r\n      // convex, axial or segment graph to data (similar)\r\n      else {\r\n         ShapeGraph& sourcemap = getDisplayedShapeGraph();\r\n         count = sourcemap.getShapeCount();\r\n         // take viewed graph and push all geometry to it (since it is *all* geometry, pushing is easy)\r\n         int copyflag = copydata ? (ShapeMap::COPY_GEOMETRY | ShapeMap::COPY_ATTRIBUTES) : (ShapeMap::COPY_GEOMETRY);\r\n         destmap.copy(sourcemap, copyflag);\r\n      }\r\n      //\r\n      if (count == 0) {\r\n         // if no objects converted then a crash is caused, so remove it:\r\n         removeDataMap(destmapref);\r\n         converted = false;\r\n      }\r\n      else {\r\n         // we can stop here! -- remember to set up display:\r\n         setDisplayedDataMapRef(destmapref);\r\n         destmap.invalidateDisplayedAttribute();\r\n         destmap.setDisplayedAttribute(-1);\r\n         converted = true;\r\n      }\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      if (shapeMapType != ShapeMap::DRAWINGMAP && !keeporiginal) {\r\n         removeShapeGraph( getDisplayedShapeGraphRef() );\r\n         if (m_shapeGraphs.empty()) {\r\n            setViewClass(SHOWHIDEAXIAL);\r\n            m_state &= ~SHAPEGRAPHS;\r\n         }\r\n      }\r\n      m_state |= DATAMAPS;\r\n      setViewClass(SHOWSHAPETOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\nbool MetaGraph::convertToDrawing(Communicator *, std::string layer_name, bool fromDisplayedDataMap)\r\n{\r\n   bool converted = false;\r\n\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~LINEDATA;\r\n\r\n   try {\r\n      const ShapeMap *sourcemap;\r\n      if (fromDisplayedDataMap) {\r\n         sourcemap = &(getDisplayedDataMap());\r\n      }\r\n      else {\r\n         sourcemap = &(getDisplayedShapeGraph());\r\n      }\r\n      //\r\n      if (sourcemap->getShapeCount() != 0) {\r\n         // this is very simple: create a new drawing layer, and add the data...\r\n         auto group = m_drawingFiles.begin();\r\n         for (; group != m_drawingFiles.end(); ++group) {\r\n            if (group->getName() == \"Converted Maps\") {\r\n               break;\r\n            }\r\n         }\r\n         if (group == m_drawingFiles.end()) {\r\n            m_drawingFiles.emplace_back(std::string(\"Converted Maps\"));\r\n            group = std::prev(m_drawingFiles.end());\r\n         }\r\n         group->m_spacePixels.emplace_back(layer_name);\r\n         group->m_spacePixels.back().copy(*sourcemap, ShapeMap::COPY_GEOMETRY);\r\n         //\r\n         // dummy set still required:\r\n         group->m_spacePixels.back().invalidateDisplayedAttribute();\r\n         group->m_spacePixels.back().setDisplayedAttribute(-1);\r\n         //      \r\n         // three levels of merge region:\r\n         if (group->m_spacePixels.size() == 1) {\r\n            group->m_region = group->m_spacePixels.back().getRegion();\r\n         }\r\n         else {\r\n            group->m_region = runion(group->m_region, group->m_spacePixels.back().getRegion());\r\n         }\r\n         if (m_drawingFiles.size() == 1) {\r\n            m_region = group->m_region;\r\n         }\r\n         else {\r\n            m_region = runion(m_region, group->m_region);\r\n         }\r\n         //\r\n         converted = true;\r\n      }\r\n      converted = true;\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      m_state |= LINEDATA;\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\nbool MetaGraph::convertAxialToSegment(Communicator *comm, std::string layer_name, bool keeporiginal, bool pushvalues, double stubremoval)\r\n{\r\n   int oldstate = m_state;\r\n\r\n   m_state &= ~SHAPEGRAPHS;\r\n\r\n   bool converted = true;\r\n\r\n   int orig_ref = getDisplayedShapeGraphRef();\r\n\r\n   try {\r\n       if (orig_ref == -1) {\r\n          return false;\r\n       }\r\n\r\n       auto shapeGraph = MapConverter::convertAxialToSegment(comm, getDisplayedShapeGraph(),\r\n                                                             layer_name, keeporiginal,\r\n                                                             pushvalues, stubremoval);\r\n       addShapeGraph(shapeGraph);\r\n\r\n       m_shapeGraphs.back()->overrideDisplayedAttribute(-2); // <- override if it's already showing\r\n       m_shapeGraphs.back()->setDisplayedAttribute(\r\n                   m_shapeGraphs.back()->getAttributeTable().getColumnIndex(\"Connectivity\") );\r\n\r\n       setDisplayedShapeGraphRef(int(m_shapeGraphs.size() - 1));\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      converted = false;\r\n   }\r\n\r\n   m_state |= oldstate;\r\n\r\n   if (converted) {\r\n      if (!keeporiginal) {\r\n         removeShapeGraph(orig_ref);\r\n      }\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return converted;\r\n}\r\n\r\nint MetaGraph::loadMifMap(Communicator *comm, std::istream& miffile, std::istream& midfile)\r\n{\r\n   int oldstate = m_state;\r\n   m_state &= ~DATAMAPS;\r\n\r\n   int mapLoaded = -1;\r\n   \r\n   try {\r\n      // create map layer...\r\n      m_dataMaps.emplace_back(comm->GetMBInfileName(),ShapeMap::DATAMAP);\r\n      int mifmapref = m_dataMaps.size() - 1;\r\n      ShapeMap& mifmap = m_dataMaps.back();\r\n      mapLoaded = mifmap.loadMifMap(miffile, midfile);\r\n      if (mapLoaded == MINFO_OK || mapLoaded == MINFO_MULTIPLE) { // multiple is just a warning\r\n          // display an attribute:\r\n         mifmap.overrideDisplayedAttribute(-2);\r\n         mifmap.setDisplayedAttribute(-1);\r\n         setDisplayedDataMapRef(mifmapref);\r\n      }\r\n      else { // error: undo!\r\n         removeDataMap(mifmapref);\r\n      }\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      mapLoaded = -1;\r\n   }\r\n\r\n   m_state = oldstate;\r\n\r\n   if (mapLoaded == MINFO_OK || mapLoaded == MINFO_MULTIPLE) { // MINFO_MULTIPLE is simply a warning\r\n      m_state |= DATAMAPS;\r\n      setViewClass(SHOWSHAPETOP);\r\n   }\r\n\r\n   return mapLoaded;\r\n}  \r\n\r\nbool MetaGraph::makeAllLineMap( Communicator *communicator, const Point2f& seed )\r\n{\r\n   int oldstate = m_state;\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload)\r\n   m_view_class &= ~VIEWAXIAL;   // Also clear the view_class flag\r\n\r\n   bool mapMade = true;\r\n\r\n   try {\r\n       // this is an index to look up the all line map, used by UI to determine if can make fewest line map\r\n       // note: it is not saved for historical reasons\r\n       if (m_all_line_map != -1) {\r\n          removeShapeGraph(m_all_line_map);\r\n          m_all_line_map = -1;\r\n       }\r\n\r\n      m_shapeGraphs.push_back(std::unique_ptr<AllLineMap>(new AllLineMap(communicator, m_drawingFiles, seed)));\r\n\r\n      m_all_line_map = int(m_shapeGraphs.size() - 1);\r\n      setDisplayedShapeGraphRef(m_all_line_map);\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      mapMade = false;\r\n   }\r\n\r\n   m_state = oldstate;\r\n\r\n   if (mapMade) {\r\n      m_state |= SHAPEGRAPHS;\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return mapMade;\r\n}\r\n\r\n\r\nbool MetaGraph::makeFewestLineMap( Communicator *communicator, int replace )\r\n{\r\n   int oldstate= m_state;\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload) \r\n\r\n   bool mapMade = true;\r\n\r\n   try {\r\n       // no all line map\r\n       if (m_all_line_map == -1) {\r\n          return false;\r\n       }\r\n\r\n       AllLineMap* alllinemap = dynamic_cast<AllLineMap*>(m_shapeGraphs[size_t(m_all_line_map)].get());\r\n\r\n       if(alllinemap == nullptr) {\r\n           throw depthmapX::RuntimeException(\"Failed to cast from ShapeGraph to AllLineMap\");\r\n       }\r\n\r\n       // waiting for C++17...\r\n       std::unique_ptr<ShapeGraph> fewestlinemap_subsets, fewestlinemap_minimal;\r\n       std::tie(fewestlinemap_subsets, fewestlinemap_minimal) = alllinemap->extractFewestLineMaps(communicator);\r\n\r\n       if (replace != 0) {\r\n           int index = -1;\r\n\r\n           for(size_t i = 0; i < m_shapeGraphs.size(); i++) {\r\n               if(m_shapeGraphs[i]->getName() == \"Fewest-Line Map (Subsets)\" ||\r\n                       m_shapeGraphs[i]->getName() == \"Fewest Line Map (Subsets)\") {\r\n                   index = int(i);\r\n               }\r\n           }\r\n\r\n           if(index != -1) {\r\n               removeShapeGraph(index);\r\n           }\r\n\r\n           for(size_t i = 0; i < m_shapeGraphs.size(); i++) {\r\n               if(m_shapeGraphs[i]->getName() == \"Fewest-Line Map (Subsets)\" ||\r\n                         m_shapeGraphs[i]->getName() == \"Fewest Line Map (Subsets)\") {\r\n                   index = int(i);\r\n               }\r\n           }\r\n\r\n           if(index != -1) {\r\n               removeShapeGraph(index);\r\n           }\r\n       }\r\n       addShapeGraph(fewestlinemap_subsets);\r\n       addShapeGraph(fewestlinemap_minimal);\r\n\r\n       setDisplayedShapeGraphRef(int(m_shapeGraphs.size() - 2));\r\n\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      mapMade = false;\r\n   }\r\n\r\n   m_state = oldstate;\r\n\r\n   if (mapMade) {\r\n      m_state |= SHAPEGRAPHS;   // note: should originally have at least one axial map\r\n      setViewClass(SHOWAXIALTOP);\r\n   }\r\n\r\n   return mapMade;\r\n}\r\n\r\nbool MetaGraph::analyseAxial( Communicator *communicator, Options options, bool ) // options copied to keep thread safe\r\n{\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload) \r\n\r\n   bool analysisCompleted = false;\r\n\r\n   try {\r\n       analysisCompleted = AxialIntegration(options.radius_set, options.weighted_measure_col, options.choice, options.fulloutput,\r\n                        options.local)\r\n           .run(communicator, getDisplayedShapeGraph(), false);\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   m_state |= SHAPEGRAPHS;\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\nbool MetaGraph::analyseSegmentsTulip( Communicator *communicator, Options options ) // <- options copied to keep thread safe\r\n{\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload)\r\n\r\n   bool analysisCompleted = false;\r\n\r\n   try {\r\n       analysisCompleted = SegmentTulip(options.radius_set, options.sel_only, options.tulip_bins, options.weighted_measure_col,\r\n                    options.radius_type, options.choice)\r\n           .run(communicator, getDisplayedShapeGraph(), false);\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   m_state |= SHAPEGRAPHS;\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\nbool MetaGraph::analyseSegmentsAngular( Communicator *communicator, Options options ) // <- options copied to keep thread safe\r\n{\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload)\r\n\r\n   bool analysisCompleted = false;\r\n\r\n   try {\r\n       analysisCompleted = SegmentAngular(options.radius_set).run(communicator, getDisplayedShapeGraph(), false);\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   m_state |= SHAPEGRAPHS;\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\nbool MetaGraph::analyseTopoMetMultipleRadii( Communicator *communicator, Options options ) // <- options copied to keep thread safe\r\n{\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload)\r\n\r\n   bool analysisCompleted = true;\r\n\r\n   try {\r\n      // note: \"output_type\" reused for analysis type (either 0 = topological or 1 = metric)\r\n      for(size_t r = 0; r < options.radius_set.size(); r++) {\r\n          if(options.output_type == 0) {\r\n              if(!SegmentTopological(options.radius, options.sel_only).run(communicator, getDisplayedShapeGraph(), false))\r\n                  analysisCompleted = false;\r\n          } else {\r\n              if(!SegmentMetric(options.radius, options.sel_only).run(communicator, getDisplayedShapeGraph(), false))\r\n                  analysisCompleted = false;\r\n          }\r\n      }\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   m_state |= SHAPEGRAPHS;\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\nbool MetaGraph::analyseTopoMet( Communicator *communicator, Options options ) // <- options copied to keep thread safe\r\n{\r\n   m_state &= ~SHAPEGRAPHS;      // Clear axial map data flag (stops accidental redraw during reload) \r\n\r\n   bool analysisCompleted = false;\r\n\r\n   try {\r\n      // note: \"output_type\" reused for analysis type (either 0 = topological or 1 = metric)\r\n       if(options.output_type == 0) {\r\n           analysisCompleted = SegmentTopological(options.radius, options.sel_only).run(communicator, getDisplayedShapeGraph(), false);\r\n       } else {\r\n           analysisCompleted = SegmentMetric(options.radius, options.sel_only).run(communicator, getDisplayedShapeGraph(), false);\r\n       }\r\n   } \r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   m_state |= SHAPEGRAPHS;\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\nint MetaGraph::loadLineData( Communicator *communicator, int load_type )\r\n{\r\n    if (load_type & DXF) {\r\n       // separate the stream and the communicator, allowing non-file streams read\r\n       return depthmapX::importFile(*this, communicator->getInFileStream(), communicator, communicator->GetMBInfileName(), depthmapX::ImportType::DRAWINGMAP, depthmapX::ImportFileType::DXF);\r\n    }\r\n\r\n   m_state &= ~LINEDATA;      // Clear line data flag (stops accidental redraw during reload) \r\n\r\n   // if bsp tree exists \r\n   if (m_bsp_root) {\r\n      delete m_bsp_root;\r\n      m_bsp_root = NULL;\r\n   }\r\n   m_bsp_tree = false;\r\n\r\n   if (load_type & REPLACE) {\r\n      m_drawingFiles.clear();\r\n   }\r\n\r\n   m_drawingFiles.emplace_back(communicator->GetMBInfileName());\r\n\r\n   if (load_type & CAT) {\r\n      // separate the stream and the communicator, allowing non-file streams read\r\n      int error = loadCat(communicator->getInFileStream(), communicator);\r\n      if (error != 1) {\r\n         return error;\r\n      }\r\n   }\r\n   else if (load_type & RT1) {\r\n      // separate the stream and the communicator, allowing non-file streams read\r\n      int error = loadRT1(communicator->GetFileSet(), communicator);\r\n      if (error != 1) {\r\n         return error;\r\n      }\r\n   }\r\n   else if (load_type & NTF) {\r\n   \r\n      NtfMap map;\r\n\r\n      try {\r\n         map.open(communicator->GetFileSet(), communicator);\r\n      }\r\n      catch (Communicator::CancelledException) {\r\n         m_drawingFiles.pop_back();\r\n         return 0;\r\n      }\r\n      catch (std::invalid_argument&) {\r\n         m_drawingFiles.pop_back();\r\n         return -1;\r\n      }\r\n      catch (std::out_of_range&) {\r\n         m_drawingFiles.pop_back();\r\n         return -1;\r\n      }\r\n\r\n      if (communicator->IsCancelled()) {\r\n         m_drawingFiles.pop_back();\r\n         return 0;\r\n      }\r\n\r\n      m_drawingFiles.back().m_region = map.getRegion();;\r\n\r\n      for (auto layer: map.layers) {\r\n\r\n         m_drawingFiles.back().m_spacePixels.emplace_back(layer.getName());\r\n         m_drawingFiles.back().m_spacePixels.back().init(layer.getLineCount(), map.getRegion());\r\n\r\n         for (auto geometry: layer.geometries) {\r\n            for (auto& line: geometry.lines) {\r\n               m_drawingFiles.back().m_spacePixels.back().makeLineShape( line );\r\n            }\r\n         }\r\n\r\n         // TODO: Investigate why setDisplayedAttribute needs to be set to -2 first\r\n         m_drawingFiles.back().m_spacePixels.back().setDisplayedAttribute(-2);\r\n         m_drawingFiles.back().m_spacePixels.back().setDisplayedAttribute(-1);\r\n      }\r\n   }\r\n\r\n   if (m_drawingFiles.size() == 1) {\r\n      m_region = m_drawingFiles.back().m_region;\r\n   }\r\n   else {\r\n      m_region = runion(m_region, m_drawingFiles.back().m_region);\r\n   }\r\n\r\n   m_state |= LINEDATA;\r\n\r\n   return 1;\r\n}\r\n\r\n// From: Alasdair Turner (2004) - Depthmap 4: a researcher's handbook (p. 6):\r\n// [..] CAT, which stands for Chiron and Alasdair Transfer Format [..]\r\n\r\nvoid MetaGraph::writeMapShapesAsCat(ShapeMap& map, std::ostream &stream) {\r\n    stream << \"CAT\" << std::endl;\r\n    for (auto refShape: map.getAllShapes()) {\r\n        SalaShape& shape = refShape.second;\r\n        if(shape.isPolyLine() || shape.isPolygon()) {\r\n            stream << \"Begin \" << (shape.isPolyLine() ? \"Polyline\" : \"Polygon\") << std::endl;\r\n            for (Point2f p: shape.m_points) {\r\n                stream << p.x << \" \" << p.y << std::endl;\r\n            }\r\n            stream << \"End \" << (shape.isPolyLine() ? \"Polyline\" : \"Polygon\") << std::endl;\r\n        } else if(shape.isLine()) {\r\n            stream << \"Begin Polyline\" << std::endl;\r\n            stream << shape.getLine().ax() << \" \" << shape.getLine().ay() << std::endl;\r\n            stream << shape.getLine().bx() << \" \" << shape.getLine().by() << std::endl;\r\n            stream << \"End Polyline\" << std::endl;\r\n        }\r\n    }\r\n}\r\n\r\nint MetaGraph::loadCat( std::istream& stream, Communicator *communicator )\r\n{\r\n   if (communicator) {\r\n      long size = communicator->GetInfileSize();\r\n      communicator->CommPostMessage( Communicator::NUM_RECORDS, size );\r\n   }\r\n\r\n   time_t atime = 0;\r\n   \r\n   qtimer( atime, 0 );\r\n\r\n   long size = 0; \r\n   int numlines = 0;\r\n   int parsing = 0;\r\n   bool first = true;\r\n\r\n   Point2f current_point, min_point, max_point;\r\n\r\n   while (!stream.eof()) {\r\n\r\n      std::string inputline;\r\n      stream >> inputline;\r\n      if (inputline.length() > 1 && inputline[0] != '#') {\r\n         if (!parsing) {\r\n            if (dXstring::toLower(inputline) == \"begin polygon\") {\r\n               parsing = 1;\r\n            }\r\n            else if (dXstring::toLower(inputline) == \"begin polyline\") {\r\n               parsing = 2;\r\n            }\r\n         }\r\n         else if (dXstring::toLower(inputline).substr(0,3) == \"end\") {\r\n            parsing = 0;\r\n         }\r\n         else {\r\n            auto tokens = dXstring::split(inputline, ' ', true);\r\n            current_point.x = stod(tokens[0]);\r\n            current_point.y = stod(tokens[1]);\r\n            numlines++;\r\n            if (first) {\r\n               min_point = current_point;\r\n               max_point = current_point;\r\n               first = false;\r\n            }\r\n            else {\r\n               if (current_point.x < min_point.x) {\r\n                  min_point.x = current_point.x;\r\n               }\r\n               if (current_point.y < min_point.y) {\r\n                  min_point.y = current_point.y;\r\n               }\r\n               if (current_point.x > max_point.x) {\r\n                  max_point.x = current_point.x;\r\n               }\r\n               if (current_point.y > max_point.y) {\r\n                  max_point.y = current_point.y;\r\n               }\r\n            }\r\n         }\r\n      }\r\n   }\r\n   m_drawingFiles.back().m_region = QtRegion(min_point, max_point);\r\n   m_drawingFiles.back().m_spacePixels.emplace_back();\r\n   m_drawingFiles.back().m_spacePixels.back().init( numlines, QtRegion(min_point, max_point) );\r\n\r\n   // in MSVC 6, ios::eof remains set and it needs to be cleared.\r\n   // in MSVC 8 it's even worse: it won't even seekg until eof flag has been cleared\r\n   stream.clear();\r\n   stream.seekg(0, std::ios::beg);\r\n\r\n   parsing = 0;\r\n   first = true;\r\n   std::vector<Point2f> points;\r\n\r\n   while (!stream.eof()) {\r\n\r\n      std::string inputline;\r\n      stream >> inputline;\r\n\r\n      if (inputline.length() > 1 && inputline[0] != '#') {\r\n         if (!parsing) {\r\n            if (dXstring::toLower(inputline) == \"begin polygon\") {\r\n               parsing = 1;\r\n               first = true;\r\n            }\r\n            else if (dXstring::toLower(inputline) == \"begin polyline\") {\r\n               parsing = 2;\r\n               first = true;\r\n            }\r\n         }\r\n         else if (dXstring::toLower(inputline).substr(0,3) == \"end\") {\r\n            if (points.size() > 2) {\r\n               if (parsing == 1) { // polygon\r\n                  m_drawingFiles.back().m_spacePixels.back().makePolyShape(points, false);\r\n               }\r\n               else { // polyline\r\n                  m_drawingFiles.back().m_spacePixels.back().makePolyShape(points, true);\r\n               }\r\n            }\r\n            else if (points.size() == 2) {\r\n               m_drawingFiles.back().m_spacePixels.back().makeLineShape(Line(points[0],points[1]));\r\n            }\r\n            points.clear();\r\n            parsing = 0;\r\n         }\r\n         else {\r\n             auto tokens = dXstring::split(inputline, ' ', true);\r\n            current_point.x = stod(tokens[0]);\r\n            current_point.y = stod(tokens[1]);\r\n            points.push_back(current_point);\r\n         }\r\n      }\r\n\r\n      size += inputline.length() + 1;\r\n\r\n      if (communicator) {\r\n         if (qtimer( atime, 500 )) {\r\n            if (communicator->IsCancelled()) {\r\n               throw Communicator::CancelledException();\r\n            }\r\n            communicator->CommPostMessage( Communicator::CURRENT_RECORD, size );\r\n         }\r\n      }\r\n   }\r\n\r\n   m_drawingFiles.back().m_spacePixels.back().setDisplayedAttribute(-2);\r\n   m_drawingFiles.back().m_spacePixels.back().setDisplayedAttribute(-1);\r\n\r\n   return 1;\r\n}\r\n\r\nint MetaGraph::loadRT1(const std::vector<std::string>& fileset, Communicator *communicator)\r\n{\r\n   TigerMap map;\r\n\r\n   try {\r\n      map.parse( fileset, communicator );\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      m_drawingFiles.pop_back();\r\n      return 0;\r\n   }\r\n   catch (std::invalid_argument&) {\r\n      m_drawingFiles.pop_back();\r\n      return -1;\r\n   }\r\n   catch (std::out_of_range&) {\r\n      m_drawingFiles.pop_back();\r\n      return -1;\r\n   }\r\n\r\n   if (communicator->IsCancelled()) {\r\n      m_drawingFiles.pop_back();\r\n      return 0;\r\n   }\r\n\r\n   m_drawingFiles.back().m_region = QtRegion(map.getBottomLeft(), map.getTopRight());\r\n\r\n   // for each category\r\n   for (auto val: map.m_categories) {\r\n      ShapeMap shapeMap = ShapeMap(val.first);\r\n      shapeMap.init(val.second.chains.size(), map.getRegion() );\r\n\r\n      // for each chains in category:\r\n      for (size_t j = 0; j < val.second.chains.size(); j++) {\r\n         // for each node pair in each category\r\n         for (size_t k = 0; k < val.second.chains[j].lines.size(); k++) {\r\n            shapeMap.makeLineShape( val.second.chains[j].lines[k] );\r\n         }\r\n      }\r\n\r\n      shapeMap.setDisplayedAttribute(-2);\r\n      shapeMap.setDisplayedAttribute(-1);\r\n      m_drawingFiles.back().m_spacePixels.emplace_back(std::move(shapeMap));\r\n   \r\n   }\r\n\r\n   return 1;\r\n}\r\n\r\nShapeMap &MetaGraph::createNewShapeMap(depthmapX::ImportType mapType, std::string name) {\r\n\r\n    if (mapType == depthmapX::ImportType::DATAMAP) {\r\n        m_dataMaps.emplace_back(name, ShapeMap::DATAMAP);\r\n        m_dataMaps.back().setDisplayedAttribute(0);\r\n        return m_dataMaps.back();\r\n    }\r\n    // depthmapX::ImportType::DRAWINGMAP\r\n    m_drawingFiles.back().m_spacePixels.emplace_back(name);\r\n    return m_drawingFiles.back().m_spacePixels.back();\r\n}\r\n\r\nvoid MetaGraph::deleteShapeMap(depthmapX::ImportType mapType, ShapeMap &shapeMap) {\r\n\r\n    switch(mapType) {\r\n        case depthmapX::ImportType::DRAWINGMAP: {\r\n            // go through the files to find if the layer is in one of them\r\n            // if it is, remove it and if the remaining file is empty then\r\n            // remove that too\r\n            auto pixelGroup = m_drawingFiles.begin();\r\n            for (; pixelGroup != m_drawingFiles.begin(); ++pixelGroup) {\r\n                auto mapToRemove = pixelGroup->m_spacePixels.end();\r\n                auto pixel = pixelGroup->m_spacePixels.begin();\r\n                for (; pixel != pixelGroup->m_spacePixels.end(); ++pixel) {\r\n                    if(&(*pixel) == &shapeMap) {\r\n                        mapToRemove = pixel;\r\n                        break;\r\n                    }\r\n                }\r\n                if(mapToRemove != pixelGroup->m_spacePixels.end()) {\r\n                    pixelGroup->m_spacePixels.erase(mapToRemove);\r\n                    if(pixelGroup->m_spacePixels.size() == 0) {\r\n                        m_drawingFiles.erase(pixelGroup);\r\n                    }\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        case depthmapX::ImportType::DATAMAP: {\r\n            for(size_t i = 0; i < m_dataMaps.size(); i++) {\r\n                if(&m_dataMaps[i] == &shapeMap) {\r\n                    m_dataMaps.erase(m_dataMaps.begin() + i);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid MetaGraph::updateParentRegions(ShapeMap &shapeMap) {\r\n    if(m_drawingFiles.back().m_region.atZero()) {\r\n        m_drawingFiles.back().m_region = shapeMap.getRegion();\r\n    } else {\r\n        m_drawingFiles.back().m_region = runion(m_drawingFiles.back().m_region, shapeMap.getRegion());\r\n    }\r\n    if(m_region.atZero()) {\r\n        m_region = m_drawingFiles.back().m_region;\r\n    } else {\r\n        m_region = runion(m_region, m_drawingFiles.back().m_region);\r\n    }\r\n}\r\n\r\n// the tidy(ish) version: still needs to be at top level and switch between layers\r\n\r\nbool MetaGraph::pushValuesToLayer(int desttype, int destlayer, int push_func, bool count_col)\r\n{\r\n   int sourcetype = m_view_class;\r\n   int sourcelayer = getDisplayedMapRef();\r\n   int col_in = getDisplayedAttribute(); \r\n   // no col_out specified\r\n   int col_out = -2;\r\n\r\n   // temporarily turn off everything to prevent redraw during sensitive time:\r\n   int oldstate = m_state;\r\n   m_state &= ~(DATAMAPS | AXIALLINES | POINTMAPS);\r\n\r\n   bool valuesPushed = pushValuesToLayer(sourcetype, sourcelayer, desttype, destlayer, col_in,\r\n                                         col_out, push_func, count_col);\r\n\r\n   m_state = oldstate;\r\n\r\n   return valuesPushed;\r\n}\r\n\r\n// helper\r\n\r\nvoid pushValue(double& val, int& count, double thisval, int push_func)\r\n{\r\n   if (thisval != -1) {\r\n      switch (push_func) {\r\n      case MetaGraph::PUSH_FUNC_MAX:\r\n         if (val == -1 || thisval > val)\r\n            val = thisval;\r\n         break;\r\n      case MetaGraph::PUSH_FUNC_MIN:\r\n         if (val == -1 || thisval < val)\r\n            val = thisval;\r\n         break;\r\n      case MetaGraph::PUSH_FUNC_AVG:\r\n      case MetaGraph::PUSH_FUNC_TOT:\r\n         if (val == -1.0) \r\n            val = thisval;\r\n         else \r\n            val += thisval;\r\n         break;\r\n      }\r\n      count++;\r\n   }\r\n}\r\n\r\n// the full ubercontrol version:\r\n\r\nbool MetaGraph::pushValuesToLayer(int sourcetype, int sourcelayer, int desttype, int destlayer, int col_in, int col_out, int push_func, bool count_col)\r\n{\r\n   AttributeTable& table_in = getAttributeTable(sourcetype, sourcelayer);\r\n   AttributeTable& table_out = getAttributeTable(desttype, destlayer);\r\n\r\n   if (col_out == -2) {\r\n      std::string name = table_in.getColumnName(col_in);\r\n      if ((table_out.hasColumn(name) && table_out.getColumn(table_out.getColumnIndex(name)).isLocked()) || name == \"Object Count\") {\r\n         name = std::string(\"Copied \") + name;\r\n      }\r\n      col_out = table_out.insertOrResetColumn(name);\r\n   }\r\n\r\n   int col_count = -1;\r\n   if (count_col) {\r\n      col_count = table_out.insertOrResetColumn(\"Object Count\");\r\n      if (col_count <= col_out) {\r\n         col_out++;\r\n      }\r\n   }\r\n\r\n   if (desttype == VIEWVGA && ((sourcetype & VIEWDATA) || (sourcetype & VIEWAXIAL))) {\r\n\r\n       // pushing from a shapemap (data/axial/segment/convex) requires a combination of\r\n       // finding points (VGA) in polygons (convex and data maps with polygons) and points\r\n       // that are on lines (axial, segment and data maps with lines). Thus, in this case\r\n       // a composite approach is implemented, which takes both options from the other parts\r\n       // of this conditional.\r\n\r\n       struct ValueCountRow {\r\n           double m_value = -1;\r\n           int m_count = 0;\r\n           AttributeRow &m_row;\r\n           ValueCountRow(AttributeRow &row) : m_row(row) {}\r\n       };\r\n\r\n       // prepare a temporary value table to store counts and values\r\n       std::map<AttributeKey, ValueCountRow> valCounts;\r\n\r\n       for (auto &row : table_out) {\r\n           valCounts.insert(std::make_pair(row.getKey(), ValueCountRow(row.getRow()))); // count set to zero for all\r\n       }\r\n\r\n       ShapeMap &sourceMap = sourcetype & VIEWDATA ? m_dataMaps[sourcelayer] : *m_shapeGraphs[sourcelayer].get();\r\n       PointMap &vgaMap = m_pointMaps[destlayer];\r\n\r\n       // first collect the lines by pixelating them using the vga map\r\n       std::map<int, SalaShape> &shapeMap = sourceMap.getAllShapes();\r\n       for (auto &shape : shapeMap) {\r\n           float thisval = table_in.getRow(AttributeKey(shape.first)).getValue(col_in);\r\n           if (shape.second.isLine()) {\r\n               PixelRefVector linePixels = vgaMap.pixelateLine(shape.second.getLine());\r\n               for (const PixelRef &pix : linePixels) {\r\n                   if (!vgaMap.getPoint(pix).filled())\r\n                       continue;\r\n                   auto valCount = valCounts.find(AttributeKey(pix));\r\n                   if(valCount != valCounts.end()) {\r\n                       pushValue(valCount->second.m_value, valCount->second.m_count, thisval, push_func);\r\n                   }\r\n               }\r\n           } else if (shape.second.isPolyLine()) {\r\n               std::set<PixelRef> polylinePixels;\r\n               for (size_t i = 1; i < shape.second.m_points.size(); i++) {\r\n                   Line li(shape.second.m_points[i - 1], shape.second.m_points[i]);\r\n                   PixelRefVector linePixels = vgaMap.pixelateLine(li);\r\n                   polylinePixels.insert(linePixels.begin(), linePixels.end());\r\n               }\r\n               for (const PixelRef &pix : polylinePixels) {\r\n                   if (!vgaMap.getPoint(pix).filled())\r\n                       continue;\r\n                   auto valCount = valCounts.find(AttributeKey(pix));\r\n                   if(valCount != valCounts.end()) {\r\n                       pushValue(valCount->second.m_value, valCount->second.m_count, thisval, push_func);\r\n                   }\r\n               }\r\n           }\r\n       }\r\n\r\n       // then collect the polygons and push to vga map\r\n       for (auto &valCount : valCounts) {\r\n           int key_out = valCount.first.value;\r\n           double &val = valCount.second.m_value;\r\n           int &count = valCount.second.m_count;\r\n           AttributeRow &row = valCount.second.m_row;\r\n           std::vector<int> gatelist;\r\n           if (!isObjectVisible(vgaMap.m_layers, row)) {\r\n               continue;\r\n           }\r\n           gatelist = sourceMap.pointInPolyList(vgaMap.getPoint(key_out).m_location);\r\n           for (int gate : gatelist) {\r\n               AttributeRow &row_in = sourceMap.getAttributeRowFromShapeIndex(gate);\r\n\r\n               if (isObjectVisible(sourceMap.getLayers(), row_in)) {\r\n                   double thisval = row_in.getValue(col_in);\r\n                   pushValue(val, count, thisval, push_func);\r\n               }\r\n           }\r\n           if (push_func == PUSH_FUNC_AVG && val != -1.0) {\r\n               val /= double(count);\r\n           }\r\n           row.setValue(col_out, float(val));\r\n           if (count_col) {\r\n               row.setValue(col_count, float(count));\r\n           }\r\n       }\r\n   } else if (sourcetype & VIEWDATA) {\r\n\r\n      for (auto iter_out = table_out.begin(); iter_out != table_out.end(); iter_out++) {\r\n         int key_out = iter_out->getKey().value;\r\n         std::vector<int> gatelist;\r\n         if (desttype == VIEWAXIAL) {\r\n             if (!isObjectVisible(m_shapeGraphs[destlayer]->getLayers(), iter_out->getRow())) {\r\n                continue;\r\n             }\r\n            auto shapeMap = m_shapeGraphs[destlayer]->getAllShapes();\r\n            gatelist = m_dataMaps[sourcelayer].shapeInPolyList(shapeMap[key_out]);\r\n         }\r\n         else if (desttype == VIEWDATA) {\r\n            if (sourcelayer == destlayer) {\r\n               // error: pushing to same map\r\n               return false;\r\n            }\r\n            if (!isObjectVisible(m_dataMaps[destlayer].getLayers(), iter_out->getRow())) {\r\n               continue;\r\n            }\r\n            auto dataMap = m_dataMaps[destlayer].getAllShapes();\r\n            gatelist = m_dataMaps[sourcelayer].shapeInPolyList(dataMap[key_out]);\r\n         }\r\n         double val = -1.0;\r\n         int count = 0;\r\n         for (int gate: gatelist) {\r\n             AttributeRow &row_in =\r\n                 m_dataMaps[sourcelayer].getAttributeRowFromShapeIndex(gate);\r\n\r\n            if (isObjectVisible(m_dataMaps[sourcelayer].getLayers(), row_in)) {\r\n                double thisval = gate;\r\n                if(col_in != -1) thisval = row_in.getValue(col_in);\r\n               pushValue(val,count,thisval,push_func);\r\n            }\r\n         }\r\n         if (push_func == PUSH_FUNC_AVG && val != -1.0) {\r\n            val /= double(count);\r\n         }\r\n         iter_out->getRow().setValue(col_out,float(val));\r\n         if (count_col) {\r\n            iter_out->getRow().setValue(col_count,float(count));\r\n         }\r\n      }\r\n   }\r\n   else {\r\n      // prepare a temporary value table to store counts and values\r\n      std::vector<double> vals(table_out.getNumRows());\r\n      std::vector<int> counts(table_out.getNumRows());\r\n\r\n      for (size_t i = 0; i < table_out.getNumRows(); i++) {\r\n         counts[i] = 0; // count set to zero for all\r\n         vals[i] = -1;\r\n      }\r\n\r\n      if (sourcetype & VIEWVGA) {\r\n         for (auto iter_in = table_in.begin(); iter_in != table_in.end(); iter_in++) {\r\n            int pix_in = iter_in->getKey().value;\r\n            if (!isObjectVisible(m_pointMaps[sourcelayer].getLayers(), iter_in->getRow())) {\r\n               continue;\r\n            }\r\n            std::vector<int> gatelist;\r\n            if (desttype == VIEWDATA) {\r\n                gatelist = m_dataMaps[size_t(destlayer)].pointInPolyList(m_pointMaps[size_t(sourcelayer)].getPoint(pix_in).m_location);\r\n                double thisval = iter_in->getKey().value;\r\n                if(col_in != -1) thisval = iter_in->getRow().getValue(col_in);\r\n                for (int gate: gatelist) {\r\n                    AttributeRow &row_out =\r\n                        m_dataMaps[destlayer].getAttributeRowFromShapeIndex(gate);\r\n                   if (isObjectVisible(m_dataMaps[destlayer].getLayers(), row_out)) {\r\n                      double& val = vals[gate];\r\n                      int& count = counts[gate];\r\n                      pushValue(val,count,thisval,push_func);\r\n                   }\r\n                }\r\n            } else if (desttype == VIEWAXIAL) {\r\n               // note, \"axial\" could be convex map, and hence this would be a valid operation\r\n               gatelist = m_shapeGraphs[size_t(destlayer)]->pointInPolyList(m_pointMaps[size_t(sourcelayer)].getPoint(pix_in).m_location);\r\n               double thisval = iter_in->getKey().value;\r\n               if(col_in != -1) thisval = iter_in->getRow().getValue(col_in);\r\n               for (int gate: gatelist) {\r\n                   int key_out = m_shapeGraphs[destlayer]->getShapeRefFromIndex(gate)->first;\r\n                   AttributeRow &row_out =\r\n                       table_out.getRow(AttributeKey(key_out));\r\n                  if (isObjectVisible(m_shapeGraphs[destlayer]->getLayers(), row_out)) {\r\n                     double& val = vals[gate];\r\n                     int& count = counts[gate];\r\n                     pushValue(val,count,thisval,push_func);\r\n                  }\r\n               }\r\n            }\r\n         }\r\n      }\r\n      else if (sourcetype & VIEWAXIAL) {\r\n         // note, in the spirit of mapping fewer objects in the gate list, it is *usually* best to \r\n         // perform axial -> gate map in this direction\r\n         for (auto iter_in = table_in.begin(); iter_in != table_in.end(); iter_in++) {\r\n            int key_in = iter_in->getKey().value;\r\n            if (!isObjectVisible(m_shapeGraphs[size_t(sourcelayer)]->getLayers(),iter_in->getRow())) {\r\n               continue;\r\n            }\r\n            std::vector<int> gatelist;\r\n            if (desttype == VIEWDATA) {\r\n               auto dataMap = m_shapeGraphs[size_t(sourcelayer)]->getAllShapes();\r\n               gatelist = m_dataMaps[size_t(destlayer)].shapeInPolyList(dataMap[key_in]);\r\n               double thisval = iter_in->getKey().value;\r\n               if(col_in != -1) thisval = iter_in->getRow().getValue(col_in);\r\n               for (int gate: gatelist) {\r\n                   int key_out = m_dataMaps[destlayer].getShapeRefFromIndex(gate)->first;\r\n                   AttributeRow &row_out =\r\n                       table_out.getRow(AttributeKey(key_out));\r\n                   if (isObjectVisible(m_dataMaps[size_t(destlayer)].getLayers(), row_out)) {\r\n                     double& val = vals[gate];\r\n                     int& count = counts[gate];\r\n                     pushValue(val,count,thisval,push_func);\r\n                  }\r\n               }\r\n            }\r\n            else if (desttype == VIEWAXIAL) {\r\n               auto shapeMap = m_shapeGraphs[size_t(sourcelayer)]->getAllShapes();\r\n               gatelist = m_shapeGraphs[size_t(destlayer)]->shapeInPolyList(shapeMap[key_in]);\r\n               double thisval = iter_in->getKey().value;\r\n               if(col_in != -1) thisval = iter_in->getRow().getValue(col_in);\r\n               for (int gate: gatelist) {\r\n                   int key_out = m_shapeGraphs[destlayer]->getShapeRefFromIndex(gate)->first;\r\n                   AttributeRow &row_out =  table_out.getRow(AttributeKey(key_out));\r\n                   if (isObjectVisible(m_shapeGraphs[destlayer]->getLayers(), row_out)) {\r\n                     double& val = vals[gate];\r\n                     int& count = counts[gate];\r\n                     pushValue(val,count,thisval,push_func);\r\n                  }\r\n               }\r\n            }\r\n         }\r\n      }\r\n      int i = -1;\r\n      for (auto iter = table_out.begin(); iter != table_out.end(); iter++) {\r\n          i++;\r\n\r\n         if (!isObjectVisible(m_shapeGraphs[destlayer]->getLayers(), iter->getRow())) {\r\n            continue;\r\n         }\r\n         if (push_func == PUSH_FUNC_AVG && vals[i] != -1.0) {\r\n            vals[i] /= double(counts[i]);\r\n         }\r\n         iter->getRow().setValue(col_out,float(vals[i]));\r\n         if (count_col) {\r\n            iter->getRow().setValue(col_count,float(counts[i]));\r\n         }\r\n      }\r\n   }\r\n\r\n   // display new data in the relevant layer\r\n   if (desttype == VIEWVGA) {\r\n      m_pointMaps[destlayer].overrideDisplayedAttribute(-2);\r\n      m_pointMaps[destlayer].setDisplayedAttribute(col_out);\r\n   }\r\n   else if (desttype == VIEWAXIAL) {\r\n      m_shapeGraphs[destlayer]->overrideDisplayedAttribute(-2);\r\n      m_shapeGraphs[destlayer]->setDisplayedAttribute(col_out);\r\n   }\r\n   else if (desttype == VIEWDATA) {\r\n      m_dataMaps[destlayer].overrideDisplayedAttribute(-2);\r\n      m_dataMaps[destlayer].setDisplayedAttribute(col_out);\r\n   }\r\n\r\n\r\n   return true;\r\n}\r\n\r\n// Agent functionality: some of it still kept here with the metagraph\r\n// (to allow push value to layer and back again)\r\n\r\nvoid MetaGraph::runAgentEngine(Communicator *comm)\r\n{\r\n   AttributeTable& table = getDisplayedPointMap().getAttributeTable();\r\n\r\n   if (m_agent_engine.m_gatelayer != -1) {\r\n      // switch the reference numbers from the gates layer to the vga layer\r\n      int colgates = table.insertOrResetColumn(g_col_gate);\r\n      pushValuesToLayer(VIEWDATA,m_agent_engine.m_gatelayer,\r\n                        VIEWVGA,getDisplayedPointMapRef(),\r\n                        -1,colgates,PUSH_FUNC_TOT);\r\n      table.insertOrResetColumn(g_col_gate_counts);\r\n   }\r\n\r\n\r\n   m_agent_engine.run(comm, &(getDisplayedPointMap()) );\r\n\r\n   if(m_agent_engine.m_record_trails) {\r\n       std::string mapName = \"Agent Trails\";\r\n       int count = 1;\r\n       while(std::find_if(std::begin(m_dataMaps), std::end(m_dataMaps),\r\n                          [&] (ShapeMap const& m) {return m.getName() == mapName; }) != m_dataMaps.end()) {\r\n           mapName = \"Agent Trails \" + std::to_string(count);\r\n           count++;\r\n       }\r\n       m_dataMaps.emplace_back(mapName);\r\n       m_agent_engine.insertTrailsInMap(m_dataMaps.back());\r\n\r\n       m_state |= DATAMAPS;\r\n   }\r\n\r\n   if (m_agent_engine.m_gatelayer != -1) {\r\n      // switch column counts from vga layer to gates layer...\r\n      int colcounts = table.getColumnIndex(g_col_gate_counts);\r\n      AttributeTable& tableout = m_dataMaps[m_agent_engine.m_gatelayer].getAttributeTable();\r\n      int targetcol = tableout.insertOrResetColumn(\"Agent Counts\");\r\n      pushValuesToLayer(VIEWVGA,getDisplayedPointMapRef(),\r\n                        VIEWDATA,m_agent_engine.m_gatelayer,\r\n                        colcounts,targetcol,PUSH_FUNC_TOT);\r\n      // and delete the temporary columns:\r\n      table.removeColumn(colcounts);\r\n      int colgates = table.getColumnIndex(g_col_gate);\r\n      table.removeColumn(colgates);\r\n   }\r\n}\r\n\r\n// Thru vision\r\n// TODO: Undocumented functionality\r\nbool MetaGraph::analyseThruVision(Communicator *comm, int gatelayer)\r\n{\r\n   bool analysisCompleted = false;\r\n\r\n   AttributeTable& table = getDisplayedPointMap().getAttributeTable();\r\n\r\n   // always have temporary gate counting layers -- makes it easier to code\r\n   int colgates = table.insertOrResetColumn(g_col_gate);\r\n   int colcounts = table.insertOrResetColumn(g_col_gate_counts);\r\n\r\n   if (gatelayer != -1) {\r\n      // switch the reference numbers from the gates layer to the vga layer\r\n      pushValuesToLayer(VIEWDATA,gatelayer,\r\n                        VIEWVGA,getDisplayedPointMapRef(),\r\n                        -1,colgates,PUSH_FUNC_TOT);\r\n   }\r\n\r\n   try {\r\n       analysisCompleted = VGAThroughVision().run(comm, getDisplayedPointMap(), false);\r\n   }\r\n   catch (Communicator::CancelledException) {\r\n      analysisCompleted = false;\r\n   }\r\n\r\n   // note after the analysis, the column order might have changed... retrieve:\r\n   colgates = table.getColumnIndex(g_col_gate);\r\n   colcounts = table.getColumnIndex(g_col_gate_counts);\r\n\r\n   if (analysisCompleted && gatelayer != -1) {\r\n      AttributeTable& tableout = m_dataMaps[gatelayer].getAttributeTable();\r\n      int targetcol = tableout.insertOrResetColumn(\"Thru Vision Counts\");\r\n      pushValuesToLayer(VIEWVGA,getDisplayedPointMapRef(),\r\n                        VIEWDATA,gatelayer,\r\n                        colcounts,targetcol,PUSH_FUNC_TOT);\r\n   }\r\n\r\n   // and always delete the temporary columns:\r\n   table.removeColumn(colcounts);\r\n   table.removeColumn(colgates);\r\n\r\n   return analysisCompleted;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\nint MetaGraph::getDisplayedMapRef() const\r\n{\r\n   int ref = -1;\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      ref = getDisplayedPointMapRef();\r\n      break;\r\n   case VIEWAXIAL:\r\n      ref = getDisplayedShapeGraphRef();\r\n      break;\r\n   case VIEWDATA:\r\n      ref = getDisplayedDataMapRef();\r\n      break;\r\n   }\r\n   return ref;\r\n}\r\n\r\n// I'd like to use this more often so that several classes other than data maps and shape graphs \r\n// can be used in the future\r\n\r\nint MetaGraph::getDisplayedMapType()\r\n{\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      return ShapeMap::POINTMAP;\r\n   case VIEWAXIAL:\r\n      return getDisplayedShapeGraph().getMapType();\r\n   case VIEWDATA:\r\n      return getDisplayedDataMap().getMapType();\r\n   }\r\n   return ShapeMap::EMPTYMAP;\r\n}\r\n\r\nAttributeTable& MetaGraph::getDisplayedMapAttributes()\r\n{\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      return getDisplayedPointMap().getAttributeTable();\r\n   case VIEWAXIAL:\r\n      return getDisplayedShapeGraph().getAttributeTable();\r\n   case VIEWDATA:\r\n      return getDisplayedDataMap().getAttributeTable();\r\n   }\r\n   throw depthmapX::RuntimeException(\"No map displayed to get attribute table from\");\r\n}\r\n\r\nbool MetaGraph::hasVisibleDrawingLayers() {\r\n    if(!m_drawingFiles.empty()) {\r\n        for (const auto& pixelGroup: m_drawingFiles) {\r\n           for (const auto& pixel: pixelGroup.m_spacePixels) {\r\n              if (pixel.isShown()) return true;\r\n           }\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\n// note: 0 is not at all editable, 1 is editable off and 2 is editable on\r\nint MetaGraph::isEditable() const\r\n{\r\n   int editable = 0;\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      if (getDisplayedPointMap().isProcessed()) {\r\n         editable = NOT_EDITABLE;\r\n      }\r\n      else {\r\n         editable = EDITABLE_ON;\r\n      }\r\n      break;\r\n   case VIEWAXIAL:\r\n      {\r\n         int type = getDisplayedShapeGraph().getMapType();\r\n         if (type != ShapeMap::SEGMENTMAP && type != ShapeMap::ALLLINEMAP) {\r\n            editable = getDisplayedShapeGraph().isEditable() ? EDITABLE_ON : EDITABLE_OFF;\r\n         }\r\n         else {\r\n            editable = NOT_EDITABLE;\r\n         }\r\n      }\r\n      break;\r\n   case VIEWDATA:\r\n      editable = getDisplayedDataMap().isEditable() ? EDITABLE_ON : EDITABLE_OFF;\r\n      break;\r\n   }\r\n   return editable;\r\n}\r\n\r\nbool MetaGraph::canUndo() const\r\n{\r\n   bool canundo = false;\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      canundo = getDisplayedPointMap().canUndo();\r\n      break;\r\n   case VIEWAXIAL:\r\n      canundo = getDisplayedShapeGraph().canUndo();\r\n      break;\r\n   case VIEWDATA:\r\n      canundo = getDisplayedDataMap().canUndo();\r\n      break;\r\n   }\r\n   return canundo;\r\n}\r\n\r\nvoid MetaGraph::undo()\r\n{\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      getDisplayedPointMap().undoPoints();\r\n      break;\r\n   case VIEWAXIAL:\r\n      getDisplayedShapeGraph().undo();\r\n      break;\r\n   case VIEWDATA:\r\n      getDisplayedDataMap().undo();\r\n      break;\r\n   }\r\n}\r\n\r\n// Moving to global ways of doing things:\r\n\r\nint MetaGraph::addAttribute(const std::string& name)\r\n{\r\n   int col;\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      col = getDisplayedPointMap().addAttribute(name);\r\n      break;\r\n   case VIEWAXIAL:\r\n      col = getDisplayedShapeGraph().addAttribute(name);\r\n      break;\r\n   case VIEWDATA:\r\n      col = getDisplayedDataMap().addAttribute(name);\r\n      break;\r\n   }\r\n   return col;\r\n}\r\n\r\nvoid MetaGraph::removeAttribute(int col)\r\n{\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      getDisplayedPointMap().removeAttribute(col);\r\n      break;\r\n   case VIEWAXIAL:\r\n      getDisplayedShapeGraph().removeAttribute(col);\r\n      break;\r\n   case VIEWDATA:\r\n      getDisplayedDataMap().removeAttribute(col);\r\n      break;\r\n   }\r\n}\r\n\r\nbool MetaGraph::isAttributeLocked(int col)\r\n{\r\n   return getAttributeTable(m_view_class).getColumn(col).isLocked();\r\n}\r\n\r\nint MetaGraph::getDisplayedAttribute() const\r\n{\r\n   int col = -1;\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      col = getDisplayedPointMap().getDisplayedAttribute();\r\n      break;\r\n   case VIEWAXIAL:\r\n      col = getDisplayedShapeGraph().getDisplayedAttribute();\r\n      break;\r\n   case VIEWDATA:\r\n      col = getDisplayedDataMap().getDisplayedAttribute();\r\n      break;\r\n   }\r\n   return col;\r\n}\r\n\r\n// this is coming from the front end, so force override:\r\nvoid MetaGraph::setDisplayedAttribute(int col)\r\n{\r\n   switch (m_view_class & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      getDisplayedPointMap().overrideDisplayedAttribute(-2);\r\n      getDisplayedPointMap().setDisplayedAttribute(col);\r\n      break;\r\n   case VIEWAXIAL:\r\n      getDisplayedShapeGraph().overrideDisplayedAttribute(-2);\r\n      getDisplayedShapeGraph().setDisplayedAttribute(col);\r\n      break;\r\n   case VIEWDATA:\r\n      getDisplayedDataMap().overrideDisplayedAttribute(-2);\r\n      getDisplayedDataMap().setDisplayedAttribute(col);\r\n      break;\r\n   }\r\n}\r\n\r\n// const and non-const versions:\r\n\r\nAttributeTable& MetaGraph::getAttributeTable(int type, int layer)\r\n{\r\n   AttributeTable *tab = NULL;\r\n   if (type == -1) {\r\n      type = m_view_class;\r\n   }\r\n   switch (type & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      tab = (layer == -1) ? &(getDisplayedPointMap().getAttributeTable()) : &(m_pointMaps[layer].getAttributeTable());\r\n      break;\r\n   case VIEWAXIAL:\r\n      tab = (layer == -1) ? &(getDisplayedShapeGraph().getAttributeTable()) : &(m_shapeGraphs[layer]->getAttributeTable());\r\n      break;\r\n   case VIEWDATA:\r\n      tab = (layer == -1) ? &(getDisplayedDataMap().getAttributeTable()) : &(m_dataMaps[layer].getAttributeTable());\r\n      break;\r\n   }\r\n   return *tab;\r\n}\r\n\r\nconst AttributeTable& MetaGraph::getAttributeTable(int type, int layer) const\r\n{\r\n   const AttributeTable *tab = NULL;\r\n   if (type == -1) {\r\n      type = m_view_class & VIEWFRONT;\r\n   }\r\n   switch (type) {\r\n   case VIEWVGA:\r\n      tab = layer == -1 ? &(getDisplayedPointMap().getAttributeTable()) : &(m_pointMaps[layer].getAttributeTable());\r\n      break;\r\n   case VIEWAXIAL:\r\n      tab = layer == -1 ? &(getDisplayedShapeGraph().getAttributeTable()) : &(m_shapeGraphs[layer]->getAttributeTable());\r\n      break;\r\n   case VIEWDATA:\r\n      tab = layer == -1 ? &(getDisplayedDataMap().getAttributeTable()) : &(m_dataMaps[layer].getAttributeTable());\r\n      break;\r\n   }\r\n   return *tab;\r\n}\r\n\r\nLayerManagerImpl &MetaGraph::getLayers(int type, int layer) {\r\n    LayerManagerImpl *tab = NULL;\r\n    if (type == -1) {\r\n        type = m_view_class;\r\n    }\r\n    switch (type & VIEWFRONT) {\r\n    case VIEWVGA:\r\n        tab = (layer == -1) ? &(getDisplayedPointMap().getLayers()) : &(m_pointMaps[layer].getLayers());\r\n        break;\r\n    case VIEWAXIAL:\r\n        tab = (layer == -1) ? &(getDisplayedShapeGraph().getLayers()) : &(m_shapeGraphs[layer]->getLayers());\r\n        break;\r\n    case VIEWDATA:\r\n        tab = (layer == -1) ? &(getDisplayedDataMap().getLayers()) : &(m_dataMaps[layer].getLayers());\r\n        break;\r\n    }\r\n    return *tab;\r\n}\r\n\r\nconst LayerManagerImpl &MetaGraph::getLayers(int type, int layer) const {\r\n    const LayerManagerImpl *tab = NULL;\r\n    if (type == -1) {\r\n        type = m_view_class & VIEWFRONT;\r\n    }\r\n    switch (type) {\r\n    case VIEWVGA:\r\n        tab = layer == -1 ? &(getDisplayedPointMap().getLayers()) : &(m_pointMaps[layer].getLayers());\r\n        break;\r\n    case VIEWAXIAL:\r\n        tab = layer == -1 ? &(getDisplayedShapeGraph().getLayers()) : &(m_shapeGraphs[layer]->getLayers());\r\n        break;\r\n    case VIEWDATA:\r\n        tab = layer == -1 ? &(getDisplayedDataMap().getLayers()) : &(m_dataMaps[layer].getLayers());\r\n        break;\r\n    }\r\n    return *tab;\r\n}\r\n\r\nAttributeTableHandle& MetaGraph::getAttributeTableHandle(int type, int layer)\r\n{\r\n   AttributeTableHandle *tab = NULL;\r\n   if (type == -1) {\r\n      type = m_view_class;\r\n   }\r\n   switch (type & VIEWFRONT) {\r\n   case VIEWVGA:\r\n      tab = (layer == -1) ? &(getDisplayedPointMap().getAttributeTableHandle()) : &(m_pointMaps[layer].getAttributeTableHandle());\r\n      break;\r\n   case VIEWAXIAL:\r\n      tab = (layer == -1) ? &(getDisplayedShapeGraph().getAttributeTableHandle()) : &(m_shapeGraphs[layer]->getAttributeTableHandle());\r\n      break;\r\n   case VIEWDATA:\r\n      tab = (layer == -1) ? &(getDisplayedDataMap().getAttributeTableHandle()) : &(m_dataMaps[layer].getAttributeTableHandle());\r\n      break;\r\n   }\r\n   return *tab;\r\n}\r\n\r\nconst AttributeTableHandle& MetaGraph::getAttributeTableHandle(int type, int layer) const\r\n{\r\n   const AttributeTableHandle *tab = NULL;\r\n   if (type == -1) {\r\n      type = m_view_class & VIEWFRONT;\r\n   }\r\n   switch (type) {\r\n   case VIEWVGA:\r\n      tab = layer == -1 ? &(getDisplayedPointMap().getAttributeTableHandle()) : &(m_pointMaps[layer].getAttributeTableHandle());\r\n      break;\r\n   case VIEWAXIAL:\r\n      tab = layer == -1 ? &(getDisplayedShapeGraph().getAttributeTableHandle()) : &(m_shapeGraphs[layer]->getAttributeTableHandle());\r\n      break;\r\n   case VIEWDATA:\r\n      tab = layer == -1 ? &(getDisplayedDataMap().getAttributeTableHandle()) : &(m_dataMaps[layer].getAttributeTableHandle());\r\n      break;\r\n   }\r\n   return *tab;\r\n}\r\n\r\nint MetaGraph::readFromFile( const std::string& filename )\r\n{\r\n\r\n    if (filename.empty()) {\r\n       return NOT_A_GRAPH;\r\n    }\r\n\r\n #ifdef _WIN32\r\n    std::ifstream stream( filename.c_str(), std::ios::binary | std::ios::in );\r\n #else\r\n    std::ifstream stream( filename.c_str(), std::ios::in );\r\n #endif\r\n    int result = readFromStream(stream, filename);\r\n    stream.close();\r\n    return result;\r\n}\r\n\r\nint MetaGraph::readFromStream( std::istream &stream, const std::string& filename )\r\n{\r\n   m_state = 0;   // <- clear the state out\r\n\r\n   // clear BSP tree if it exists:\r\n   if (m_bsp_root) {\r\n      delete m_bsp_root;\r\n      m_bsp_root = NULL;\r\n   }\r\n   m_bsp_tree = false;\r\n\r\n   char header[3];\r\n   stream.read( header, 3 );\r\n   if (stream.fail() || header[0] != 'g' || header[1] != 'r' || header[2] != 'f') {\r\n      return NOT_A_GRAPH;\r\n   }\r\n   int version;\r\n   stream.read( (char *) &version, sizeof( version ) );\r\n   m_file_version = version;  // <- recorded for easy debugging\r\n   if (version > METAGRAPH_VERSION) {\r\n      return NEWER_VERSION;\r\n   }\r\n   if (version < METAGRAPH_VERSION) {\r\n       std::unique_ptr<mgraph440::MetaGraph> mgraph(new mgraph440::MetaGraph);\r\n       auto result = mgraph->read(filename);\r\n       if ( result != mgraph440::MetaGraph::OK)\r\n       {\r\n           return DAMAGED_FILE;\r\n       }\r\n       std::stringstream tempstream;\r\n       mgraph->writeToStream(tempstream, METAGRAPH_VERSION, 0);\r\n\r\n       return readFromStream(tempstream, filename);\r\n   }\r\n\r\n   // have to use temporary state here as redraw attempt may come too early:\r\n   int temp_state = 0;\r\n   int temp_view_class = 0;\r\n   stream.read( (char *) &temp_state, sizeof( temp_state ) );\r\n   stream.read( (char *) &temp_view_class, sizeof(temp_view_class) );\r\n   stream.read( (char *) &m_showgrid, sizeof(m_showgrid) );\r\n   stream.read( (char *) &m_showtext, sizeof(m_showtext) );\r\n\r\n   // type codes: x --- properties\r\n   //             v --- virtual graph (from versions below 70)\r\n   //             n --- ngraph format\r\n   //             l --- layer data\r\n   //             p --- point data\r\n   //             d --- data summary layers\r\n\r\n   char type;\r\n   stream.read( &type, 1 );\r\n   if (type == 'd') {\r\n       // contains deprecated datalayers. Read through mgraph440 which will\r\n       // convert them into shapemaps\r\n       std::unique_ptr<mgraph440::MetaGraph> mgraph(new mgraph440::MetaGraph);\r\n       auto result = mgraph->read(filename);\r\n       if ( result != mgraph440::MetaGraph::OK)\r\n       {\r\n           return DAMAGED_FILE;\r\n       }\r\n       std::stringstream tempstream;\r\n       mgraph->writeToStream(tempstream, METAGRAPH_VERSION, 0);\r\n\r\n       return readFromStream(tempstream, filename);\r\n   }\r\n   if (type == 'x') {\r\n      FileProperties::read(stream);\r\n      if (stream.eof()) {\r\n         // erk... this shouldn't happen\r\n         return DAMAGED_FILE;\r\n      }\r\n      else if (!stream.eof()) {\r\n         stream.read( &type, 1 );\r\n      }\r\n   }\r\n   else {\r\n      FileProperties::setProperties(\"<unknown>\",\"<unknown>\",\"<unknown>\",\"<unknown>\");\r\n   }\r\n   if (stream.eof()) {\r\n       // file is still ok, just empty\r\n       return OK;\r\n   }\r\n   if (type == 'v') {\r\n\r\n      skipVirtualMem(stream);\r\n\r\n      // and set our filename:\r\n      // Graph::m_nodes.setFilename( filename );\r\n\r\n      // and tell everyone it's been archived\r\n      // temp_state |= GRAPHARCHIVED;\r\n\r\n      if (stream.eof()) {\r\n         // erk... this shouldn't happen\r\n         return DAMAGED_FILE;\r\n      }\r\n      else if (!stream.eof()) {\r\n         stream.read( &type, 1 );\r\n      }\r\n   }\r\n   if (type == 'l') {\r\n      m_name = dXstring::readString(stream);\r\n      stream.read( (char *) &m_region, sizeof(m_region) );\r\n      int count;\r\n      stream.read( (char *) &count, sizeof(count) );\r\n      for (int i = 0; i < count; i++) {\r\n          m_drawingFiles.emplace_back();\r\n          m_drawingFiles.back().read(stream);\r\n      }\r\n\r\n      if (m_name.empty()) {\r\n          m_name = \"<unknown>\";\r\n      }\r\n      temp_state |= LINEDATA;\r\n      if (!stream.eof()) {\r\n         stream.read( &type, 1 );\r\n      }\r\n      if (!stream.eof() && !stream.good()) {\r\n         // erk... this shouldn't happen\r\n         return DAMAGED_FILE;\r\n      }\r\n   }\r\n   if (type == 'p') {\r\n      readPointMaps( stream );\r\n      temp_state |= POINTMAPS;\r\n      if (!stream.eof()) {\r\n         stream.read( &type, 1 );         \r\n      }\r\n   }\r\n   if (type == 'g') {\r\n      // record on state of actual point map:\r\n      m_pointMaps.back().m_processed = true;\r\n\r\n      if (!stream.eof()) {\r\n         stream.read( &type, 1 );         \r\n      }\r\n   }\r\n   if (type == 'a') {\r\n      temp_state |= ANGULARGRAPH;\r\n      if (!stream.eof()) {\r\n         stream.read( &type, 1 );\r\n      }\r\n   }\r\n   if (type == 'x') {\r\n      readShapeGraphs(stream);\r\n      temp_state |= SHAPEGRAPHS;\r\n      if (!stream.eof()) {\r\n         stream.read( &type, 1 );         \r\n      }\r\n   }\r\n   if (type == 's') {\r\n      readDataMaps(stream);\r\n      temp_state |= DATAMAPS;\r\n      if (!stream.eof()) {\r\n         stream.read( &type, 1 );         \r\n      }\r\n   }\r\n   m_state = temp_state;\r\n   m_view_class = temp_view_class;\r\n\r\n   return OK;\r\n}\r\n\r\nint MetaGraph::write( const std::string& filename, int version, bool currentlayer )\r\n{\r\n   std::ofstream stream;\r\n\r\n   int oldstate = m_state;\r\n   m_state = 0;   // <- temporarily clear out state, avoids any potential read / write errors\r\n\r\n   char type;\r\n\r\n   // As of MetaGraph version 70 the disk caching has been removed\r\n   stream.open( filename.c_str(), std::ios::binary | std::ios::out | std::ios::trunc );\r\n   if (stream.fail()) {\r\n      if (stream.rdbuf()->is_open()) {\r\n         stream.close();\r\n      }\r\n      m_state = oldstate;\r\n      return DISK_ERROR;  \r\n   }\r\n   stream.write(\"grf\", 3);\r\n   m_file_version = version; // <- note, the file may now have an updated file version\r\n   stream.write( (char *) &version, sizeof(version) );\r\n   if (currentlayer) {\r\n      int tempstate, tempclass;\r\n      if (m_view_class & VIEWVGA) {\r\n         tempstate = POINTMAPS;\r\n         tempclass = VIEWVGA;\r\n      }\r\n      else if (m_view_class & MetaGraph::VIEWAXIAL) {\r\n         tempstate = SHAPEGRAPHS;\r\n         tempclass = VIEWAXIAL;\r\n      }\r\n      else if (m_view_class & MetaGraph::VIEWDATA) {\r\n         tempstate = DATAMAPS;\r\n         tempclass = VIEWDATA;\r\n      }\r\n      stream.write( (char *) &tempstate, sizeof(tempstate) );\r\n      stream.write( (char *) &tempclass, sizeof(tempclass) );\r\n   }\r\n   else {\r\n      stream.write( (char *) &oldstate, sizeof(oldstate) );\r\n      stream.write( (char *) &m_view_class, sizeof(m_view_class) );\r\n   }\r\n   stream.write( (char *) &m_showgrid, sizeof(m_showgrid) );\r\n   stream.write( (char *) &m_showtext, sizeof(m_showtext) );\r\n\r\n   type = 'x';\r\n   stream.write(&type, 1);\r\n   FileProperties::write(stream);\r\n\r\n   if (currentlayer) {\r\n      if (m_view_class & MetaGraph::VIEWVGA) {\r\n         type = 'p';\r\n         stream.write(&type, 1);\r\n         writePointMaps( stream, true );\r\n      }\r\n      else if (m_view_class & MetaGraph::VIEWAXIAL) {\r\n         type = 'x';\r\n         stream.write(&type, 1);\r\n         writeShapeGraphs( stream, true );\r\n      }\r\n      else if (m_view_class & MetaGraph::VIEWDATA) {\r\n         type = 's';\r\n         stream.write(&type, 1);\r\n         writeDataMaps( stream, true );\r\n      }\r\n   }\r\n   else {\r\n      if (oldstate & LINEDATA) {\r\n         type = 'l';\r\n         stream.write(&type, 1);\r\n         dXstring::writeString(stream, m_name);\r\n         stream.write( (char *) &m_region, sizeof(m_region) );\r\n\r\n         // Quick mod - TV\r\n         int count = m_drawingFiles.size();\r\n         stream.write( (char *) &count, sizeof(count) );\r\n         for (auto& spacePixel: m_drawingFiles) {\r\n            spacePixel.write(stream);\r\n         }\r\n      }\r\n      if (oldstate & POINTMAPS) {\r\n         type = 'p';\r\n         stream.write(&type, 1);\r\n         writePointMaps( stream );\r\n      }\r\n      if (oldstate & SHAPEGRAPHS) {\r\n         type = 'x';\r\n         stream.write(&type, 1);\r\n         writeShapeGraphs( stream );\r\n      }\r\n      if (oldstate & DATAMAPS) {\r\n         type = 's';\r\n         stream.write(&type, 1);\r\n         writeDataMaps( stream );\r\n      }\r\n   }\r\n\r\n   stream.close();\r\n\r\n   m_state = oldstate;\r\n   return OK;\r\n}\r\n\r\n\r\nstd::streampos MetaGraph::skipVirtualMem(std::istream& stream)\r\n{\r\n   // it's graph virtual memory: skip it\r\n   int nodes = -1;\r\n   stream.read( (char *) &nodes, sizeof(nodes) );\r\n\r\n   nodes *= 2;\r\n\r\n   for (int i = 0; i < nodes; i++) {\r\n      int connections;\r\n      stream.read( (char *) &connections, sizeof(connections) );\r\n      stream.seekg( stream.tellg() + std::streamoff(connections * sizeof(connections)) );\r\n   }\r\n   return (stream.tellg());\r\n}\r\n\r\nstd::vector<SimpleLine> MetaGraph::getVisibleDrawingLines() {\r\n\r\n    std::vector<SimpleLine> lines;\r\n\r\n    for (const auto& pixelGroup: m_drawingFiles) {\r\n       for (const auto& pixel: pixelGroup.m_spacePixels) {\r\n            if (pixel.isShown()) {\r\n                const std::vector<SimpleLine> &newLines = pixel.getAllShapesAsLines();\r\n                lines.insert(std::end(lines), std::begin(newLines), std::end(newLines));\r\n            }\r\n        }\r\n    }\r\n    return lines;\r\n}\r\n\r\nint MetaGraph::addNewPointMap(const std::string& name)\r\n{\r\n   std::string myname = name;\r\n   int counter = 1;\r\n   bool duplicate = true;\r\n   while (duplicate) {\r\n      duplicate = false;\r\n      for (auto& pointMap: m_pointMaps) {\r\n         if (pointMap.getName() == myname) {\r\n            duplicate = true;\r\n            myname = dXstring::formatString(counter++,name + \" %d\");\r\n            break;\r\n         }\r\n      }\r\n   }\r\n   m_pointMaps.push_back(PointMap(m_region, m_drawingFiles, myname));\r\n   m_displayed_pointmap = m_pointMaps.size() - 1;\r\n   return m_pointMaps.size() - 1;\r\n}\r\n\r\nbool MetaGraph::readPointMaps(std::istream& stream)\r\n{\r\n   stream.read((char *) &m_displayed_pointmap, sizeof(m_displayed_pointmap));\r\n   int count;\r\n   stream.read((char *) &count, sizeof(count));\r\n   for (int i = 0; i < count; i++) {\r\n      m_pointMaps.push_back(PointMap(m_region, m_drawingFiles));\r\n      m_pointMaps.back().read( stream );\r\n   }\r\n   return true;\r\n}\r\n\r\nbool MetaGraph::writePointMaps(std::ofstream& stream, bool displayedmaponly)\r\n{\r\n   if (!displayedmaponly) {\r\n      stream.write((char *) &m_displayed_pointmap, sizeof(m_displayed_pointmap));\r\n      int count = m_pointMaps.size();\r\n      stream.write((char *) &count, sizeof(count));\r\n      for (auto& pointmap: m_pointMaps) {\r\n         pointmap.write( stream );\r\n      }\r\n   }\r\n   else {\r\n      int dummy;\r\n      // displayed map is 0:\r\n      dummy = 0;\r\n      stream.write((char *) &dummy, sizeof(dummy));\r\n      // count is 1\r\n      dummy = 1;\r\n      stream.write((char *) &dummy, sizeof(dummy));\r\n      //\r\n      m_pointMaps[m_displayed_pointmap].write(stream);\r\n   }\r\n   return true;\r\n}\r\n\r\nbool MetaGraph::readDataMaps(std::istream& stream )\r\n{\r\n    m_dataMaps.clear(); // empty existing data\r\n    // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n    unsigned int displayed_map;\r\n    stream.read((char *)&displayed_map,sizeof(displayed_map));\r\n    m_displayed_datamap = size_t(displayed_map);\r\n    // read maps\r\n    // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n    unsigned int count = 0;\r\n    stream.read((char *) &count, sizeof(count));\r\n\r\n    for (size_t j = 0; j < size_t(count); j++) {\r\n        m_dataMaps.emplace_back();\r\n        m_dataMaps.back().read(stream);\r\n    }\r\n    return true;\r\n}\r\n\r\nbool MetaGraph::writeDataMaps( std::ofstream& stream, bool displayedmaponly )\r\n{\r\n   if (!displayedmaponly) {\r\n      // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n      unsigned int displayed_map = (unsigned int)(m_displayed_datamap);\r\n      stream.write((char *)&displayed_map,sizeof(displayed_map));\r\n      // write maps\r\n      // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n      unsigned int count = (unsigned int) m_dataMaps.size();\r\n      stream.write((char *) &count, sizeof(count));\r\n      for (size_t j = 0; j < count; j++) {\r\n         m_dataMaps[j].write(stream);\r\n      }\r\n   }\r\n   else {\r\n      unsigned int dummy;\r\n      // displayed map is 0\r\n      dummy = 0;\r\n      stream.write((char *)&dummy,sizeof(dummy));\r\n      // count is 1\r\n      dummy = 1;\r\n      stream.write((char *)&dummy,sizeof(dummy));\r\n      // write map:\r\n      m_dataMaps[m_displayed_datamap].write(stream);\r\n   }\r\n   return true;\r\n}\r\n\r\n\r\nbool MetaGraph::readShapeGraphs(std::istream& stream)\r\n{\r\n    m_shapeGraphs.clear(); // empty existing data\r\n    // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n    unsigned int displayed_map;\r\n    stream.read((char *)&displayed_map,sizeof(displayed_map));\r\n    setDisplayedShapeGraphRef(int(displayed_map));\r\n    // read maps\r\n    // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n    unsigned int count = 0;\r\n    stream.read((char *) &count, sizeof(count));\r\n\r\n    for (size_t j = 0; j < size_t(count); j++) {\r\n        m_shapeGraphs.push_back(std::unique_ptr<ShapeGraph>(new ShapeGraph()));\r\n\r\n        // P.K. Hairy solution given that we don't know the type/name of the shapegraph\r\n        // before we actually read it: mark the beginning of the shapegraph in the stream\r\n        // and if it's found to be an AllLineMap then just roll the stream back and read\r\n        // from the mark again\r\n\r\n        long mark = stream.tellg();\r\n        m_shapeGraphs.back()->read(stream);\r\n        std::string name = m_shapeGraphs.back()->getName();\r\n\r\n        if(name == \"All-Line Map\" ||\r\n                name == \"All Line Map\") {\r\n            m_shapeGraphs.pop_back();\r\n            m_shapeGraphs.push_back(std::unique_ptr<AllLineMap>(new AllLineMap()));\r\n            stream.seekg(mark);\r\n            m_shapeGraphs.back()->read(stream);\r\n        }\r\n    }\r\n\r\n    // P.K: ideally this should be read together with the\r\n    // all-line map, but the way the graph file is structured\r\n    // this is not possible\r\n    // TODO: Fix on next graph file update\r\n\r\n    bool foundAllLineMap = false;\r\n    for(size_t i = 0; i < m_shapeGraphs.size(); i++) {\r\n        ShapeGraph* shapeGraph = m_shapeGraphs[i].get();\r\n        if(shapeGraph->getName() == \"All-Line Map\" ||\r\n                shapeGraph->getName() == \"All Line Map\") {\r\n            foundAllLineMap = true;\r\n            AllLineMap* alllinemap = dynamic_cast<AllLineMap *>(shapeGraph);\r\n            if(alllinemap == nullptr) {\r\n                throw depthmapX::RuntimeException(\"Failed to cast from ShapeGraph to AllLineMap\");\r\n            }\r\n            // these are additional essentially for all line axial maps\r\n            // should probably be kept *with* the all line axial map...\r\n            alllinemap->m_poly_connections.clear();\r\n            dXreadwrite::readIntoVector(stream, alllinemap->m_poly_connections);\r\n            alllinemap->m_radial_lines.clear();\r\n            dXreadwrite::readIntoVector(stream, alllinemap->m_radial_lines);\r\n\r\n            // this is an index to look up the all line map, used by UI to determine if can make fewest line map\r\n            // note: it is not saved for historical reasons\r\n            // will get confused by more than one all line map\r\n            m_all_line_map = int(i);\r\n\r\n            // there is currently only one:\r\n            break;\r\n        }\r\n    }\r\n    if(!foundAllLineMap) {\r\n        // P.K. This is just a dummy read to cover cases where there is no All-Line Map\r\n        // The below is taken from pmemvec<T>::read\r\n\r\n        // READ / WRITE USES 32-bit LENGTHS (number of elements)\r\n        // n.b., do not change this to size_t as it will cause 32-bit to 64-bit conversion problems\r\n        unsigned int length;\r\n        stream.read( (char *) &length, sizeof(unsigned int) );\r\n        stream.read( (char *) &length, sizeof(unsigned int) );\r\n    }\r\n    return true;\r\n}\r\n\r\nbool MetaGraph::writeShapeGraphs( std::ofstream& stream, bool displayedmaponly )\r\n{\r\n    if (!displayedmaponly) {\r\n        // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n        unsigned int displayed_map = (unsigned int)(getDisplayedShapeGraphRef());\r\n        stream.write((char *)&displayed_map,sizeof(displayed_map));\r\n        // write maps\r\n        // n.b. -- do not change to size_t as will cause 32-bit to 64-bit conversion problems\r\n        unsigned int count = (unsigned int) m_shapeGraphs.size();\r\n        stream.write((char *) &count, sizeof(count));\r\n        for (size_t j = 0; j < count; j++) {\r\n            m_shapeGraphs[j]->write(stream);\r\n        }\r\n    }\r\n    else {\r\n        unsigned int dummy;\r\n        // displayed map is 0\r\n        dummy = 0;\r\n        stream.write((char *)&dummy,sizeof(dummy));\r\n        // count is 1\r\n        dummy = 1;\r\n        stream.write((char *)&dummy,sizeof(dummy));\r\n        // write map:\r\n        m_shapeGraphs[getDisplayedShapeGraphRef()]->write(stream);\r\n    }\r\n\r\n    if(m_all_line_map == -1) {\r\n        std::vector<PolyConnector> temp_poly_connections;\r\n        std::vector<RadialLine> temp_radial_lines;\r\n\r\n        dXreadwrite::writeVector(stream, temp_poly_connections);\r\n        dXreadwrite::writeVector(stream, temp_radial_lines);\r\n    } else {\r\n        AllLineMap* alllinemap = dynamic_cast<AllLineMap *>(m_shapeGraphs[size_t(m_all_line_map)].get());\r\n\r\n        if(alllinemap == nullptr) {\r\n            throw depthmapX::RuntimeException(\"Failed to cast from ShapeGraph to AllLineMap\");\r\n        }\r\n\r\n        dXreadwrite::writeVector(stream, alllinemap->m_poly_connections);\r\n        dXreadwrite::writeVector(stream, alllinemap->m_radial_lines);\r\n    }\r\n    return true;\r\n}\r\n\r\nvoid MetaGraph::makeViewportShapes( const QtRegion& viewport ) const\r\n{\r\n   m_current_layer = -1;\r\n   size_t i = m_drawingFiles.size() - 1;\r\n   for (auto iter = m_drawingFiles.rbegin(); iter != m_drawingFiles.rend(); iter++) {\r\n      if (iter->isShown()) {\r\n         m_current_layer = (int) i;\r\n         iter->makeViewportShapes( (viewport.atZero() ? m_region : viewport) );\r\n      }\r\n      i--;\r\n   }\r\n}\r\n\r\nbool MetaGraph::findNextShape(bool& nextlayer) const\r\n{\r\n   if (m_current_layer == -1)\r\n      return false;\r\n   while (!m_drawingFiles[m_current_layer].findNextShape(nextlayer)) {\r\n      while (++m_current_layer < (int)m_drawingFiles.size() && !m_drawingFiles[m_current_layer].isShown());\r\n      if (m_current_layer == static_cast<int>(m_drawingFiles.size())) {\r\n         m_current_layer = -1;\r\n         return false;\r\n      }\r\n   }\r\n   return true;\r\n}\r\n"
  },
  {
    "path": "salalib/mgraph.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#pragma once\r\n\r\n// Interface: the meta graph loads and holds all sorts of arbitrary data...\r\n\r\n#include \"salalib/mgraph_consts.h\"\r\n#include \"salalib/displayparams.h\"\r\n#include \"salalib/fileproperties.h\"\r\n#include \"salalib/importtypedefs.h\"\r\n\r\n// still call paftl:\r\n#include \"salalib/connector.h\"\r\n#include \"salalib/spacepix.h\"\r\n#include \"salalib/agents/agentengine.h\" // for agent engine interface\r\n\r\n// still need paftl:\r\n#include \"salalib/shapemap.h\"\r\n#include \"salalib/pointdata.h\"\r\n#include \"salalib/axialmap.h\"\r\n\r\n\r\n#include \"genlib/p2dpoly.h\"\r\n\r\n#include <mutex>\r\n#include <vector>\r\n#include <memory>\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\nclass Communicator;\r\n\r\n// A meta graph is precisely what it says it is\r\n\r\nclass MetaGraph : public FileProperties\r\n{\r\nprivate:\r\n    QtRegion m_region;  // easier public for now\r\n    std::string m_name;\r\npublic:\r\n   std::vector<SpacePixelFile> m_drawingFiles;\r\n   const QtRegion& getRegion() { return m_region; }\r\n   void setRegion(Point2f& bottomLeft, Point2f& topRight)\r\n      { m_region.bottom_left = bottomLeft; m_region.top_right = topRight; }\r\n   bool isShown() const\r\n      { for (size_t i = 0; i < m_drawingFiles.size(); i++) if (m_drawingFiles[i].isShown()) return true; return false; }\r\n\r\n   // TODO: drawing state functions/fields that should be eventually removed\r\n   void makeViewportShapes( const QtRegion& viewport ) const;\r\n   bool findNextShape(bool& nextlayer) const;\r\n   const SalaShape& getNextShape() const\r\n      { return m_drawingFiles[m_current_layer].getNextShape(); }\r\n   mutable int m_current_layer;\r\n\r\n   enum { ADD = 0x0001, REPLACE = 0x0002, CAT = 0x0010, DXF = 0x0020, NTF = 0x0040, RT1 = 0x0080, GML = 0x0100 };\r\n   enum { NONE = 0x0000, POINTMAPS = 0x0002, LINEDATA = 0x0004,\r\n          ANGULARGRAPH = 0x0010, DATAMAPS = 0x0020, AXIALLINES = 0x0040, SHAPEGRAPHS = 0x0100,\r\n          BUGGY = 0x8000 };\r\n   enum { NOT_EDITABLE = 0, EDITABLE_OFF = 1, EDITABLE_ON = 2 };\r\nprotected:\r\n   int m_file_version;\r\n   int m_state;\r\npublic:\r\n   // some display options now set at file level\r\n   bool m_showgrid;\r\n   bool m_showtext;\r\n   //\r\npublic:\r\n   std::vector<ShapeMap> m_dataMaps;\r\n\r\n   std::vector<std::unique_ptr<ShapeGraph>> m_shapeGraphs;\r\n   int m_displayed_shapegraph = -1;\r\n\r\npublic:\r\n   MetaGraph(std::string name = \"\");\r\n   ~MetaGraph();\r\n   //\r\n   int getVersion()\r\n   {\r\n      // note, if unsaved, m_file_version is -1\r\n      return m_file_version;\r\n   }\r\n\r\n\r\n   std::vector<PointMap>& getPointMaps()\r\n   { return m_pointMaps; }\r\n   PointMap& getDisplayedPointMap()\r\n   { return m_pointMaps[m_displayed_pointmap]; }\r\n   const PointMap& getDisplayedPointMap() const\r\n   { return m_pointMaps[m_displayed_pointmap]; }\r\n   void setDisplayedPointMapRef(int i)\r\n   { m_displayed_pointmap = i; }\r\n   int getDisplayedPointMapRef() const\r\n   { return m_displayed_pointmap; }\r\n   void redoPointMapBlockLines()   // (flags blockedlines, but also flags that you need to rebuild a bsp tree if you have one)\r\n   { for (auto& pointMap: m_pointMaps) { pointMap.m_blockedlines = false; } }\r\n   int addNewPointMap(const std::string& name = std::string(\"VGA Map\"));\r\n\r\nprivate:\r\n   std::vector<PointMap> m_pointMaps;\r\n   int m_displayed_pointmap = -1;\r\n\r\n   // helpful to know this for creating fewest line maps, although has to be reread at input\r\n   int m_all_line_map = -1;\r\n\r\n   void removePointMap(int i)\r\n   {\r\n       if (m_displayed_pointmap >= i) m_displayed_pointmap--;\r\n       if(m_displayed_pointmap < 0) m_displayed_pointmap = 0;\r\n       m_pointMaps.erase(m_pointMaps.begin() + i);\r\n   }\r\n\r\n   bool readPointMaps(std::istream &stream);\r\n   bool writePointMaps(std::ofstream& stream, bool displayedmaponly = false );\r\n\r\n   std::recursive_mutex mLock;\r\npublic:\r\n    std::unique_lock<std::recursive_mutex> getLock(){\r\n       return std::unique_lock<std::recursive_mutex>(mLock);\r\n   }\r\n\r\n    std::unique_lock<std::recursive_mutex> getLockDeferred(){\r\n        return std::unique_lock<std::recursive_mutex>(mLock, std::defer_lock_t());\r\n    }\r\n\r\n   int getState() const\r\n      { return m_state; }\r\n   // use with caution: only very rarely needed outside MetaGraph itself\r\n   void setState(int state)\r\n      { m_state = state; }\r\n\r\n   int loadLineData( Communicator *communicator, int load_type );\r\n   void writeMapShapesAsCat(ShapeMap& map, std::ostream &stream);\r\n   int loadCat( std::istream& stream, Communicator *communicator );\r\n   int loadRT1(const std::vector<std::string>& fileset, Communicator *communicator);\r\n   ShapeMap &createNewShapeMap(depthmapX::ImportType mapType, std::string name);\r\n   void deleteShapeMap(depthmapX::ImportType mapType, ShapeMap &shapeMap);\r\n   void updateParentRegions(ShapeMap &shapeMap);\r\n   bool clearPoints();\r\n   bool setGrid( double spacing, const Point2f& offset = Point2f() );                 // override of PointMap\r\n   bool makePoints( const Point2f& p, int semifilled, Communicator *communicator = NULL);  // override of PointMap\r\n   bool makeGraph( Communicator *communicator, int algorithm, double maxdist );\r\n   bool unmakeGraph(bool removeLinks);\r\n   bool analyseGraph(Communicator *communicator, Options options , bool simple_version); // <- options copied to keep thread safe\r\n   //\r\n   // helpers for editing maps\r\n   bool isEditableMap();\r\n   ShapeMap& getEditableMap();\r\n   // currently only making / moving lines, but should be able to extend this to polys fairly easily:\r\n   bool makeShape(const Line& line);\r\n   bool moveSelShape(const Line& line);\r\n   // onto polys as well:\r\n   int polyBegin(const Line& line);\r\n   bool polyAppend(int shape_ref, const Point2f& point);\r\n   bool polyClose(int shape_ref);\r\n   bool polyCancel(int shape_ref);\r\n   //\r\n   int addShapeGraph(std::unique_ptr<ShapeGraph>& shapeGraph);\r\n   int addShapeGraph(const std::string& name, int type);\r\n   int addShapeMap(const std::string& name);\r\n   void removeDisplayedMap();\r\n   //\r\n   // various map conversions\r\n   bool convertDrawingToAxial(Communicator *comm, std::string layer_name);  // n.b., name copied for thread safety\r\n   bool convertDataToAxial(Communicator *comm, std::string layer_name, bool keeporiginal, bool pushvalues);\r\n   bool convertDrawingToSegment(Communicator *comm, std::string layer_name);\r\n   bool convertDataToSegment(Communicator *comm, std::string layer_name, bool keeporiginal, bool pushvalues);\r\n   bool convertToData(Communicator *, std::string layer_name, bool keeporiginal, int shapeMapType, bool copydata);\r\n   bool convertToDrawing(Communicator *, std::string layer_name, bool fromDisplayedDataMap);\r\n   bool convertToConvex(Communicator *comm, std::string layer_name, bool keeporiginal, int shapeMapType, bool copydata);\r\n   bool convertAxialToSegment(Communicator *comm, std::string layer_name, bool keeporiginal, bool pushvalues, double stubremoval);\r\n   int loadMifMap(Communicator *comm, std::istream& miffile, std::istream& midfile);\r\n   bool makeAllLineMap( Communicator *communicator, const Point2f& seed );\r\n   bool makeFewestLineMap( Communicator *communicator, int replace );\r\n   bool analyseAxial(Communicator *communicator, Options options, bool); // <- options copied to keep thread safe\r\n   bool analyseSegmentsTulip( Communicator *communicator, Options options ); // <- options copied to keep thread safe\r\n   bool analyseSegmentsAngular( Communicator *communicator, Options options ); // <- options copied to keep thread safe\r\n   bool analyseTopoMetMultipleRadii( Communicator *communicator, Options options ); // <- options copied to keep thread safe\r\n   bool analyseTopoMet( Communicator *communicator, Options options ); // <- options copied to keep thread safe\r\n   //\r\n   bool hasAllLineMap()\r\n   { return m_all_line_map != -1; }\r\n   bool hasFewestLineMaps() {\r\n       for(const auto& shapeGraph: m_shapeGraphs) {\r\n           if(shapeGraph->getName() == \"Fewest-Line Map (Subsets)\" ||\r\n              shapeGraph->getName() == \"Fewest Line Map (Subsets)\" ||\r\n              shapeGraph->getName() == \"Fewest-Line Map (Minimal)\" ||\r\n              shapeGraph->getName() == \"Fewest Line Map (Minimal)\") {\r\n               return true;\r\n           }\r\n       }\r\n       return false;\r\n   }\r\n   enum { PUSH_FUNC_MAX = 0, PUSH_FUNC_MIN = 1, PUSH_FUNC_AVG = 2, PUSH_FUNC_TOT = 3};\r\n   bool pushValuesToLayer(int desttype, int destlayer, int push_func, bool count_col = false);\r\n   bool pushValuesToLayer(int sourcetype, int sourcelayer, int desttype, int destlayer, int col_in, int col_out, int push_func, bool count_col = false);\r\n   //\r\n   int getDisplayedMapRef() const;\r\n   //\r\n   // NB -- returns 0 (not editable), 1 (editable off) or 2 (editable on)\r\n   int isEditable() const;\r\n   bool canUndo() const;\r\n   void undo();\r\n\r\n   size_t m_displayed_datamap = -1;\r\n   ShapeMap& getDisplayedDataMap()\r\n   { return m_dataMaps[m_displayed_datamap]; }\r\n   const ShapeMap& getDisplayedDataMap() const\r\n   { return m_dataMaps[m_displayed_datamap]; }\r\n   size_t getDisplayedDataMapRef() const\r\n   { return m_displayed_datamap; }\r\n\r\n   void removeDataMap(size_t i)\r\n   { if (m_displayed_datamap >= i && i > 0) m_displayed_datamap--; m_dataMaps.erase(m_dataMaps.begin() + i); }\r\n\r\n   void setDisplayedDataMapRef(size_t map)\r\n   {\r\n      if (static_cast<int>(m_displayed_datamap) != -1 && m_displayed_datamap != map)\r\n         m_dataMaps[m_displayed_datamap].clearSel();\r\n      m_displayed_datamap = map;\r\n   }\r\n\r\n   template <class T>\r\n   size_t getMapRef(std::vector<T>& maps, const std::string& name) const\r\n   {\r\n      // note, only finds first map with this name\r\n      for (size_t i = 0; i < maps.size(); i++) {\r\n         if (maps[i].getName() == name)\r\n            return i;\r\n      }\r\n      return -1;\r\n   }\r\n\r\n   std::vector<std::unique_ptr<ShapeGraph> >& getShapeGraphs()\r\n   { return m_shapeGraphs; }\r\n   ShapeGraph& getDisplayedShapeGraph()\r\n   { return *m_shapeGraphs[m_displayed_shapegraph].get(); }\r\n   const ShapeGraph& getDisplayedShapeGraph() const\r\n   { return *m_shapeGraphs[m_displayed_shapegraph].get(); }\r\n   void setDisplayedShapeGraphRef(int map)\r\n   {\r\n       if (m_displayed_shapegraph != -1 && m_displayed_shapegraph != map)\r\n          m_shapeGraphs[size_t(m_displayed_shapegraph)]->clearSel();\r\n       m_displayed_shapegraph = map;\r\n   }\r\n   int getDisplayedShapeGraphRef() const\r\n   { return m_displayed_shapegraph; }\r\n\r\n   void removeShapeGraph(int i)\r\n   {\r\n       if (m_displayed_shapegraph >= i) m_displayed_shapegraph--;\r\n       if(m_displayed_shapegraph < 0) m_displayed_shapegraph = 0;\r\n       m_shapeGraphs.erase(m_shapeGraphs.begin() + i);\r\n   }\r\n\r\n   bool readShapeGraphs(std::istream &stream);\r\n   bool writeShapeGraphs(std::ofstream& stream, bool displayedmaponly = false );\r\n\r\n   std::vector<ShapeMap>& getDataMaps()\r\n   { return m_dataMaps; }\r\n\r\n   bool readDataMaps(std::istream &stream);\r\n   bool writeDataMaps(std::ofstream& stream, bool displayedmaponly = false );\r\n\r\n   //\r\n   int getDisplayedMapType();\r\n   AttributeTable& getDisplayedMapAttributes();\r\n   bool hasVisibleDrawingLayers();\r\n   QtRegion getBoundingBox() const;\r\n   //\r\n   int getDisplayedAttribute() const;\r\n   void setDisplayedAttribute(int col);\r\n   int addAttribute(const std::string& name);\r\n   void removeAttribute(int col);\r\n   bool isAttributeLocked(int col);\r\n   AttributeTable& getAttributeTable(int type = -1, int layer = -1);\r\n   const AttributeTable& getAttributeTable(int type = -1, int layer = -1) const;\r\n   LayerManagerImpl& getLayers(int type = -1, int layer = -1);\r\n   const LayerManagerImpl& getLayers(int type = -1, int layer = -1) const;\r\n   AttributeTableHandle& getAttributeTableHandle(int type = -1, int layer = -1);\r\n   const AttributeTableHandle& getAttributeTableHandle(int type = -1, int layer = -1) const;\r\n\r\n   int getLineFileCount() const\r\n      { return (int) m_drawingFiles.size(); }\r\n\r\n   // Quick mod - TV\r\n   const std::string& getLineFileName(int file) const\r\n      { return m_drawingFiles[file].getName(); }\r\n   int getLineLayerCount(int file) const\r\n      { return (int) m_drawingFiles[file].m_spacePixels.size(); }\r\n\r\n   ShapeMap& getLineLayer(int file, int layer)\r\n      { return m_drawingFiles[file].m_spacePixels[layer]; }\r\n   const ShapeMap& getLineLayer(int file, int layer) const\r\n      { return m_drawingFiles[file].m_spacePixels[layer]; }\r\n   //\r\n   // Some error handling -- the idea is that you catch the error in MetaGraph,\r\n   // return a generic error code and then get your front end to interrogate the \r\n   // last error (pretty much as per standard Unix etc).\r\n   // May have problems with multithreading.\r\npublic:\r\n   class Error \r\n   {\r\n   protected:\r\n      std::string error;\r\n   public:\r\n      Error(const std::string& err = std::string()) { error = err; }\r\n   };\r\nprotected:\r\n   Error m_last_error;\r\npublic:\r\n   Error& getLastError()\r\n   { return m_last_error; }\r\n   // for drawing either axial analysis or VGA\r\nprotected:\r\n   int m_view_class;\r\npublic:\r\n   enum { SHOWHIDEVGA = 0x0100, SHOWVGATOP = 0x0200, SHOWHIDEAXIAL = 0x0400, SHOWAXIALTOP = 0x0800, SHOWHIDESHAPE = 0x1000, SHOWSHAPETOP = 0x2000 };\r\n   enum { VIEWNONE = 0x00, VIEWVGA = 0x01, VIEWBACKVGA = 0x02, VIEWAXIAL = 0x04, VIEWBACKAXIAL = 0x08,\r\n          VIEWDATA = 0x20, VIEWBACKDATA = 0x40, VIEWFRONT = 0x25 };\r\n   //\r\n   int getViewClass()\r\n   { return m_view_class; }\r\n   // These functions make specifying conditions to do things much easier:\r\n   bool viewingNone()\r\n   { return (m_view_class == VIEWNONE); }\r\n   bool viewingProcessed()\r\n   { return ((m_view_class & (VIEWAXIAL | VIEWDATA)) || (m_view_class & VIEWVGA && getDisplayedPointMap().isProcessed())); }\r\n   bool viewingShapes()\r\n   { return (m_view_class & (VIEWAXIAL | VIEWDATA)) != 0; }\r\n   bool viewingProcessedLines()\r\n   { return ((m_view_class & VIEWAXIAL) == VIEWAXIAL); } \r\n   bool viewingProcessedShapes()\r\n   { return ((m_view_class & VIEWDATA) == VIEWDATA); } \r\n   bool viewingProcessedPoints()\r\n   { return ((m_view_class & VIEWVGA) && getDisplayedPointMap().isProcessed()); }\r\n   bool viewingUnprocessedPoints()\r\n   { return ((m_view_class & VIEWVGA) && !getDisplayedPointMap().isProcessed()); }\r\n   //\r\n   bool setViewClass(int command);\r\n   //\r\n   double getLocationValue(const Point2f& point);\r\n   //\r\npublic:\r\n   // these are dependent on what the view class is:\r\n   bool isSelected()                              // does a selection exist\r\n   {  if (m_view_class & VIEWVGA) \r\n         return getDisplayedPointMap().isSelected();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return getDisplayedShapeGraph().hasSelectedElements();\r\n      else if (m_view_class & VIEWDATA) \r\n         return getDisplayedDataMap().hasSelectedElements();\r\n      else \r\n         return false;\r\n   }\r\n   bool setCurSel( QtRegion& r, bool add = false )  // set current selection\r\n   {  if (m_view_class & VIEWAXIAL) \r\n         return getDisplayedShapeGraph().setCurSel(r, add);\r\n      else if (m_view_class & VIEWDATA)\r\n         return getDisplayedDataMap().setCurSel( r, add );\r\n      else if (m_view_class & VIEWVGA)\r\n         return getDisplayedPointMap().setCurSel( r, add );\r\n      else if (m_state & POINTMAPS && !getDisplayedPointMap().isProcessed()) // this is a default select application\r\n         return getDisplayedPointMap().setCurSel( r, add );\r\n      else if (m_state & DATAMAPS) // I'm not sure why this is a possibility, but it appears you might have state & DATAMAPS without VIEWDATA...\r\n         return getDisplayedDataMap().setCurSel( r, add );\r\n      else \r\n         return false;\r\n   }\r\n   bool clearSel()\r\n   {\r\n      // really needs a separate clearSel for the datalayers... at the moment this is handled in PointMap\r\n      if (m_view_class & VIEWVGA)\r\n         return getDisplayedPointMap().clearSel();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return getDisplayedShapeGraph().clearSel();\r\n      else if (m_view_class & VIEWDATA) \r\n         return getDisplayedDataMap().clearSel();\r\n      else\r\n         return false;\r\n   }\r\n   int getSelCount()\r\n   {\r\n      if (m_view_class & VIEWVGA)\r\n         return getDisplayedPointMap().getSelCount();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return (int) getDisplayedShapeGraph().getSelCount();\r\n      else if (m_view_class & VIEWDATA) \r\n         return (int) getDisplayedDataMap().getSelCount();\r\n      else\r\n         return 0;\r\n   }\r\n   float getSelAvg()\r\n   {\r\n      if (m_view_class & VIEWVGA)\r\n         return (float)getDisplayedPointMap().getDisplayedSelectedAvg();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return (float)getDisplayedShapeGraph().getDisplayedSelectedAvg();\r\n      else if (m_view_class & VIEWDATA) \r\n         return (float)getDisplayedDataMap().getDisplayedSelectedAvg();\r\n      else\r\n         return -1.0f;\r\n   }\r\n   QtRegion getSelBounds()\r\n   {\r\n      if (m_view_class & VIEWVGA)\r\n         return getDisplayedPointMap().getSelBounds();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return getDisplayedShapeGraph().getSelBounds();\r\n      else if (m_view_class & VIEWDATA) \r\n         return getDisplayedDataMap().getSelBounds();\r\n      else\r\n         return QtRegion();\r\n   }\r\n   // setSelSet expects a set of ref ids:\r\n   void setSelSet(const std::vector<int>& selset, bool add = false)\r\n   { if (m_view_class & VIEWVGA && m_state & POINTMAPS)\r\n         getDisplayedPointMap().setCurSel(selset,add);\r\n      else if (m_view_class & VIEWAXIAL) \r\n         getDisplayedShapeGraph().setCurSel(selset,add);\r\n      else // if (m_view_class & VIEWDATA) \r\n         getDisplayedDataMap().setCurSel(selset,add); }\r\n   std::set<int>& getSelSet()\r\n   {  if (m_view_class & VIEWVGA && m_state & POINTMAPS)\r\n         return getDisplayedPointMap().getSelSet();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return getDisplayedShapeGraph().getSelSet();\r\n      else // if (m_view_class & VIEWDATA) \r\n         return getDisplayedDataMap().getSelSet(); }\r\n   const std::set<int>& getSelSet() const\r\n   {  if (m_view_class & VIEWVGA && m_state & POINTMAPS)\r\n         return getDisplayedPointMap().getSelSet();\r\n      else if (m_view_class & VIEWAXIAL) \r\n         return getDisplayedShapeGraph().getSelSet();\r\n      else // if (m_view_class & VIEWDATA) \r\n         return getDisplayedDataMap().getSelSet(); }\r\n//\r\npublic:\r\n   // no longer supported\r\n   //int addLineDynamic(const Line& l);\r\n   //bool removeLineDynamic(LineKey linekey);\r\n   //\r\n   // Agent engine interface:\r\nprotected:\r\n   AgentEngine m_agent_engine;\r\npublic:\r\n   AgentEngine& getAgentEngine()\r\n   { return m_agent_engine; }\r\n   void runAgentEngine(Communicator *comm);\r\n   //\r\npublic:\r\n   // thru vision\r\n   bool analyseThruVision(Communicator *comm = NULL, int gatelayer = -1);\r\n   // BSP tree for making isovists\r\nprotected:\r\n   BSPNode *m_bsp_root;\r\n   bool m_bsp_tree;\r\npublic:\r\n   bool makeBSPtree(Communicator *communicator = NULL);\r\n   void resetBSPtree() { m_bsp_tree = false; }\r\n   // returns 0: fail, 1: made isovist, 2: made isovist and added new shapemap layer\r\n   int makeIsovist(Communicator *communicator, const Point2f& p, double startangle = 0, double endangle = 0, bool simple_version = true);\r\n   // returns 0: fail, 1: made isovist, 2: made isovist and added new shapemap layer\r\n   int makeIsovistPath(Communicator *communicator, double fov_angle = 2.0 * M_PI, bool simple_version = true);\r\n   bool makeIsovist(const Point2f& p, Isovist& iso);\r\nprotected:\r\n   // properties\r\npublic:\r\n   // a few read-write returns:\r\n   enum { OK, WARN_BUGGY_VERSION, WARN_CONVERTED, NOT_A_GRAPH, DAMAGED_FILE, DISK_ERROR, NEWER_VERSION, DEPRECATED_VERSION };\r\n   // likely to use communicator if too slow...\r\n   int readFromFile( const std::string& filename );\r\n   int readFromStream( std::istream &stream, const std::string& filename );\r\n   int write( const std::string& filename, int version, bool currentlayer = false);\r\n   //\r\n   std::vector<SimpleLine> getVisibleDrawingLines();\r\nprotected:\r\n   std::streampos skipVirtualMem(std::istream &stream);\r\n};\r\n"
  },
  {
    "path": "salalib/mgraph_consts.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n// Human readable(ish) metagraph version changes\n\nconst int VERSION_ALWAYS_RECORD_BINDISTANCES    = 440;\n\n// Current metagraph version\nconst int METAGRAPH_VERSION = VERSION_ALWAYS_RECORD_BINDISTANCES;\n\n///////////////////////////////////////////////////////////////////////////////\n\nconst unsigned int SALA_SELECTED_COLOR = 0x00FFFF77;\nconst unsigned int SALA_HIGHLIGHTED_COLOR = 0x0077FFFF;\n\n///////////////////////////////////////////////////////////////////////////////\n\n// Parse errors for MapInfo:\n\nenum { MINFO_OK, MINFO_HEADER, MINFO_TABLE, MINFO_MIFPARSE, MINFO_OBJROWS, MINFO_MULTIPLE };\n\n///////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "salalib/ngraph.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// ngraph.cpp\r\n\r\n#include <salalib/mgraph.h>\r\n#include <salalib/spacepix.h>\r\n#include <salalib/pointdata.h>\r\n#include <salalib/ngraph.h>\r\n#include \"genlib/containerutils.h\"\r\n\r\nvoid Node::make(const PixelRef pix, PixelRefVector *bins, float *bin_far_dists, int q_octants)\r\n{\r\n   m_pixel = pix;\r\n\r\n   for (int i = 0; i < 32; i++) {\r\n\r\n      if (q_octants != 0x00FF) {\r\n         // now, an octant filter has been used... note that the exact q-octants that\r\n         // will have been processed rely on adjacenies in the q_octants...\r\n         if (!(q_octants & processoctant(i))) {\r\n            continue;\r\n         }\r\n      }\r\n\r\n      m_bins[i].m_distance = bin_far_dists[i];\r\n\r\n      if (i == 4 || i == 20) {\r\n         m_bins[i].make(bins[i], PixelRef::POSDIAGONAL);\r\n      }\r\n      else if (i == 12 || i == 28) {\r\n         m_bins[i].make(bins[i], PixelRef::NEGDIAGONAL);\r\n      }\r\n      else if ((i > 4 && i < 12) || (i > 20 && i < 28)) {\r\n         m_bins[i].make(bins[i], PixelRef::VERTICAL);\r\n      }\r\n      else {\r\n         m_bins[i].make(bins[i], PixelRef::HORIZONTAL);\r\n      }\r\n      // Now clear the bin!\r\n      bins[i].clear();\r\n   }\r\n}\r\n\r\nvoid Node::extractUnseen(PixelRefVector& pixels, PointMap *pointdata)\r\n{\r\n   for (int i = 0; i < 32; i++) {\r\n         m_bins[i].extractUnseen(pixels, pointdata, (1 << i));\r\n   }\r\n}\r\n\r\nvoid Node::extractMetric(std::set<MetricTriple>& pixels, PointMap *pointdata, const MetricTriple& curs)\r\n{\r\n   //if (dist == 0.0f || concaveConnected()) { // increases effiency but is too inaccurate\r\n   //if (dist == 0.0f || !fullyConnected()) { // increases effiency but can miss lines\r\n   if (curs.dist == 0.0f || pointdata->getPoint(curs.pixel).blocked() || pointdata->blockedAdjacent(curs.pixel)) { \r\n      for (int i = 0; i < 32; i++) {\r\n         m_bins[i].extractMetric(pixels, pointdata, curs);\r\n      }\r\n   }\r\n}\r\n\r\n// based on extract metric\r\n\r\nvoid Node::extractAngular(std::set<AngularTriple>& pixels, PointMap *pointdata, const AngularTriple& curs)\r\n{\r\n   if (curs.angle == 0.0f || pointdata->getPoint(curs.pixel).blocked() || pointdata->blockedAdjacent(curs.pixel)) {\r\n      for (int i = 0; i < 32; i++) {\r\n         m_bins[i].extractAngular(pixels, pointdata, curs);\r\n      }\r\n   }\r\n}\r\n\r\nbool Node::concaveConnected()\r\n{\r\n   // not quite correct -- sometimes at corners you 'see through' the very first connection\r\n   // but a useful approximation: to be concave connected, you need less than 3 in a row somewhere:\r\n   unsigned int test = 0;\r\n   // note wraps around\r\n   test |= (m_bins[0].count())  ? 0 : 0x101; \r\n   test |= (m_bins[4].count())  ? 0 : 0x202;\r\n   test |= (m_bins[8].count())  ? 0 : 0x404; \r\n   test |= (m_bins[12].count()) ? 0 : 0x808;\r\n   test |= (m_bins[16].count()) ? 0 : 0x010;\r\n   test |= (m_bins[20].count()) ? 0 : 0x020;\r\n   test |= (m_bins[24].count()) ? 0 : 0x040;\r\n   test |= (m_bins[28].count()) ? 0 : 0x080;\r\n   if (test != 0) {\r\n      for (int i = 0; i < 8; i++) {\r\n         if (((~test) & 1) && (test & 4) && ((~test) & 12)) { // less than 3 in a row test\r\n            return true;\r\n         }\r\n         test >>= 1;\r\n      }\r\n   }\r\n   return false;\r\n}\r\n\r\nbool Node::fullyConnected()\r\n{\r\n   // not quite correct -- sometimes at corners you 'see through' the very first connection\r\n   return (m_bins[0].count() && m_bins[4].count() && m_bins[8].count() &&\r\n           m_bins[12].count() && m_bins[16].count() && m_bins[20].count() &&\r\n           m_bins[24].count() && m_bins[28].count());\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool Node::containsPoint(const PixelRef pixel) const\r\n{\r\n   bool found = false;\r\n   int start, end;\r\n\r\n   // This should really calculate which bin it ought to be in, but for now,\r\n   // we'll reduce by quadrant:\r\n   if (pixel.x > m_pixel.x) {\r\n      if (pixel.y >= m_pixel.y) {\r\n         start = 0; end = 7;\r\n      }\r\n      else {\r\n         start = 25; end = 31;\r\n      }\r\n   }\r\n   else {\r\n      if (pixel.y > m_pixel.y) {\r\n         start = 8; end = 15;\r\n      }\r\n      else {\r\n         start = 16; end = 24;\r\n      }\r\n   }\r\n   for (int i = start; i <= end; i++) {\r\n      if (m_bins[i].containsPoint(pixel)) {\r\n         found = true;\r\n         break;\r\n      }\r\n   }\r\n   return found;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid Node::first() const\r\n{\r\n   m_curbin = 0;\r\n   do {\r\n      m_bins[m_curbin].first();\r\n   } while (m_bins[m_curbin].is_tail() && ++m_curbin < 32);\r\n}\r\n\r\nvoid Node::next() const\r\n{\r\n   m_bins[m_curbin].next();\r\n   while (m_bins[m_curbin].is_tail() && ++m_curbin < 32) {\r\n      m_bins[m_curbin].first();\r\n   }\r\n}\r\n\r\nbool Node::is_tail() const\r\n{\r\n   return m_curbin == 32;\r\n}\r\n\r\nPixelRef Node::cursor() const\r\n{\r\n   return m_bins[m_curbin].cursor();\r\n}\r\n\r\nvoid Node::contents(PixelRefVector& hood) const\r\n{\r\n   first();\r\n   while (!is_tail()) {\r\n      depthmapX::addIfNotExists(hood, cursor());\r\n      next();\r\n   }\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////\r\n\r\nstd::istream& Node::read(std::istream& stream)\r\n{\r\n   int i;\r\n   for (i = 0; i < 32; i++) {\r\n      m_bins[i].read(stream);\r\n   }\r\n\r\n   for (i = 0; i < 32; i++) {\r\n      dXreadwrite::readIntoVector(stream, m_occlusion_bins[i]);\r\n   }\r\n\r\n   return stream;\r\n}\r\n\r\nstd::ostream& Node::write(std::ostream& stream)\r\n{\r\n   int i;\r\n   for (i = 0; i < 32; i++) {\r\n      m_bins[i].write(stream);\r\n   }\r\n\r\n   for (i = 0; i < 32; i++) {\r\n      dXreadwrite::writeVector(stream, m_occlusion_bins[i]);\r\n   }\r\n   return stream;\r\n}\r\n\r\nstd::ostream& operator << (std::ostream& stream, const Node& node)\r\n{\r\n   for (int i = 0; i < 32; i++) {\r\n      if (node.m_bins[i].count()) {\r\n         stream << \"    \" << node.m_bins[i] << std::endl;\r\n      }\r\n   }\r\n   return stream;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid Bin::make(const PixelRefVector& pixels, char dir)\r\n{\r\n   m_pixel_vecs.clear();\r\n   m_node_count = 0;\r\n\r\n   if (pixels.size()) {\r\n\r\n      m_dir = dir;\r\n\r\n      if (m_dir & PixelRef::DIAGONAL) {\r\n   \r\n         PixelVec cur( pixels[0], pixels[0] );\r\n\r\n         // Special, the diagonal should be pixels directly along the diagonal\r\n         // Both posdiagonal and negdiagonal are positive in the x direction\r\n         // Note that it is ordered anyway, so no need for anything too fancy:\r\n         if (pixels.back().x < cur.start().x) {\r\n            cur.m_start = pixels.back();\r\n         }\r\n         if (pixels.back().x > cur.end().x) {\r\n            cur.m_end = pixels.back();\r\n         }\r\n\r\n         m_pixel_vecs.push_back(cur);\r\n         m_node_count = pixels.size();\r\n      }\r\n      else {\r\n         // Reorder the pixels:\r\n         if (m_dir == PixelRef::HORIZONTAL) {\r\n            std::set<PixelRefH> pixels_h;\r\n            for (size_t i = 0; i < pixels.size(); i++) {\r\n               pixels_h.insert(PixelRefH(pixels[i]));\r\n            }\r\n            // this looks like a simple bubble sort\r\n            auto curr = pixels_h.begin();\r\n            m_pixel_vecs.push_back(PixelVec(*curr, *curr));\r\n            ++curr;\r\n            auto prev = pixels_h.begin();\r\n            for (;curr != pixels_h.end(); ++curr) {\r\n               if (prev->y != curr->y || prev->x + 1 != curr->x) {\r\n                  m_pixel_vecs.back().m_end = *prev;\r\n                  m_pixel_vecs.push_back(PixelVec(*curr, *curr));\r\n               }\r\n               prev = curr;\r\n            }\r\n            m_pixel_vecs.back().m_end = *pixels_h.rbegin();\r\n         }\r\n         if (m_dir == PixelRef::VERTICAL) {\r\n            std::set<PixelRefV> pixels_v;\r\n            for (size_t i = 0; i < pixels.size(); i++) {\r\n               pixels_v.insert(PixelRefV(pixels[i]));\r\n            }\r\n            // this looks like a simple bubble sort\r\n            auto curr = pixels_v.begin();\r\n            m_pixel_vecs.push_back(PixelVec(*curr, *curr));\r\n            ++curr;\r\n            auto prev = pixels_v.begin();\r\n            for (;curr != pixels_v.end(); ++curr) {\r\n               if (prev->x != curr->x || prev->y + 1 != curr->y) {\r\n                  m_pixel_vecs.back().m_end = *prev;\r\n                  m_pixel_vecs.push_back(PixelVec(*curr, *curr));\r\n               }\r\n               prev = curr;\r\n            }\r\n            m_pixel_vecs.back().m_end = *pixels_v.rbegin();\r\n         }\r\n\r\n         m_node_count = pixels.size();\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid Bin::extractUnseen(PixelRefVector& pixels, PointMap *pointdata, int binmark)\r\n{\r\n   for (auto pixVec: m_pixel_vecs) {\r\n      for (PixelRef pix = pixVec.start(); pix.col(m_dir) <= pixVec.end().col(m_dir); ) {\r\n         Point& pt = pointdata->getPoint(pix);\r\n         if (pointdata->getPoint(pix).m_misc == 0) {\r\n            pixels.push_back(pix);\r\n            pointdata->getPoint(pix).m_misc |= binmark;\r\n         }\r\n         // 10.2.02 revised --- diagonal was breaking this as it was extent in diagonal or horizontal\r\n         if (!(m_dir & PixelRef::DIAGONAL)) {\r\n            if (pt.m_extent.col(m_dir) >= pixVec.end().col(m_dir))\r\n               break;\r\n            pt.m_extent.col(m_dir) = pixVec.end().col(m_dir);\r\n         }\r\n         pix.move(m_dir);\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid Bin::extractMetric(std::set<MetricTriple>& pixels, PointMap *pointdata, const MetricTriple& curs)\r\n{\r\n   for (auto pixVec: m_pixel_vecs) {\r\n      for (PixelRef pix = pixVec.start(); pix.col(m_dir) <= pixVec.end().col(m_dir); ) {\r\n         Point& pt = pointdata->getPoint(pix);\r\n         if (pt.m_misc == 0 && \r\n            (pt.m_dist == -1.0 || (curs.dist + dist(pix,curs.pixel) < pt.m_dist))) {\r\n            pt.m_dist = curs.dist + (float) dist(pix,curs.pixel);\r\n            // n.b. dmap v4.06r now sets angle in range 0 to 4 (1 = 90 degrees)\r\n            pt.m_cumangle = pointdata->getPoint(curs.pixel).m_cumangle + (curs.lastpixel == NoPixel ? 0.0f : (float) (angle(pix,curs.pixel,curs.lastpixel) / (M_PI * 0.5)));\r\n            pixels.insert(MetricTriple(pt.m_dist, pix, curs.pixel));\r\n         }\r\n         pix.move(m_dir);\r\n      }\r\n   }\r\n}\r\n\r\n// based on metric\r\n\r\nvoid Bin::extractAngular(std::set<AngularTriple>& pixels, PointMap *pointdata, const AngularTriple& curs)\r\n{\r\n   for (auto pixVec: m_pixel_vecs) {\r\n      for (PixelRef pix = pixVec.start(); pix.col(m_dir) <= pixVec.end().col(m_dir); ) {\r\n         Point& pt = pointdata->getPoint(pix);\r\n         if (pt.m_misc == 0) {\r\n            // n.b. dmap v4.06r now sets angle in range 0 to 4 (1 = 90 degrees)\r\n            float ang = (curs.lastpixel == NoPixel) ? 0.0f : (float) (angle(pix,curs.pixel,curs.lastpixel) / (M_PI * 0.5));\r\n            if (pt.m_cumangle == -1.0 || curs.angle + ang < pt.m_cumangle) {\r\n               pt.m_cumangle = pointdata->getPoint(curs.pixel).m_cumangle + ang;\r\n               pixels.insert(AngularTriple(pt.m_cumangle, pix, curs.pixel));\r\n            }\r\n         }\r\n         pix.move(m_dir);\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool Bin::containsPoint(const PixelRef p) const\r\n{\r\n   for (auto pixVec: m_pixel_vecs) {\r\n      if (m_dir & PixelRef::DIAGONAL) {\r\n         // note abs is only allowed if you have pre-checked you are in the right quadrant!\r\n         if (p.x >= pixVec.start().x && p.x <= pixVec.end().x &&\r\n             abs(p.y - pixVec.start().y) == p.x - pixVec.start().x) {\r\n            return true;\r\n         }\r\n      }\r\n      else {\r\n         if (p.row(m_dir) == pixVec.start().row(m_dir) &&\r\n             p.col(m_dir) >= pixVec.start().col(m_dir) &&\r\n             p.col(m_dir) <= pixVec.end().col(m_dir)) {\r\n            return true;\r\n         }\r\n      }\r\n   }\r\n   return false;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid Bin::first() const\r\n{\r\n   m_curvec = 0;\r\n   if (!m_pixel_vecs.empty())\r\n      m_curpix = m_pixel_vecs[m_curvec].m_start;\r\n}\r\n\r\nvoid Bin::next() const\r\n{\r\n   if (m_curpix.move(m_dir).col(m_dir) > m_pixel_vecs[m_curvec].end().col(m_dir)) {\r\n      m_curvec++;\r\n      if (m_curvec < static_cast<int>(m_pixel_vecs.size()))\r\n         m_curpix = m_pixel_vecs[m_curvec].m_start;\r\n   }\r\n}\r\n\r\nbool Bin::is_tail() const\r\n{\r\n   return m_curvec >= static_cast<int>(m_pixel_vecs.size());\r\n}\r\n\r\nPixelRef Bin::cursor() const\r\n{\r\n   return (int) m_curpix;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nstd::istream& Bin::read(std::istream& stream)\r\n{\r\n   stream.read( (char *) &m_dir, sizeof(m_dir) );\r\n   stream.read( (char *) &m_node_count, sizeof(m_node_count) );\r\n\r\n   stream.read( (char *) &m_distance, sizeof(m_distance) );\r\n   stream.read( (char *) &m_occ_distance, sizeof(m_occ_distance) );\r\n\r\n   if (m_node_count) {\r\n      if (m_dir & PixelRef::DIAGONAL) {\r\n         m_pixel_vecs = std::vector<PixelVec>(1);\r\n         m_pixel_vecs[0].read(stream, m_dir);\r\n      }\r\n      else {\r\n         unsigned short length;\r\n         stream.read( (char *) &length, sizeof(length) );\r\n         m_pixel_vecs = std::vector<PixelVec>(length);\r\n         m_pixel_vecs[0].read(stream, m_dir);\r\n         for (int i = 1; i < length; i++) {\r\n            m_pixel_vecs[i].read(stream, m_dir,m_pixel_vecs[i-1]);\r\n         }\r\n      }\r\n   }\r\n\r\n   return stream;\r\n}\r\n\r\nstd::ostream& Bin::write(std::ostream& stream)\r\n{\r\n   stream.write( (char *) &m_dir, sizeof(m_dir) );\r\n   stream.write( (char *) &m_node_count, sizeof(m_node_count) );\r\n\r\n   stream.write( (char *) &m_distance, sizeof(m_distance) );\r\n   stream.write( (char *) &m_occ_distance, sizeof(m_occ_distance) );\r\n\r\n   if (m_node_count) {\r\n\r\n      if (m_dir & PixelRef::DIAGONAL) {\r\n         m_pixel_vecs[0].write(stream,m_dir);\r\n      }\r\n      else {\r\n         // TODO: Remove this limitation in the next version of the .graph format\r\n         unsigned short length = m_pixel_vecs.size();\r\n         stream.write( (char *) &length, sizeof(length) );\r\n         m_pixel_vecs[0].write(stream,m_dir);\r\n         for (int i = 1; i < length; i++) {\r\n            m_pixel_vecs[i].write(stream,m_dir,m_pixel_vecs[i-1]);\r\n         }\r\n      }\r\n   }\r\n\r\n   return stream;\r\n}\r\n\r\nstd::ostream& operator << (std::ostream& stream, const Bin& bin)\r\n{\r\n   int c = 0;\r\n   for (auto pixVec: bin.m_pixel_vecs) {\r\n      for (PixelRef p = pixVec.m_start;\r\n           p.col(bin.m_dir) <= pixVec.end().col(bin.m_dir); p.move(bin.m_dir)) {\r\n         if (++c % 10 == 0) {\r\n            stream << \"\\n    \";\r\n         }\r\n         stream << p << \",\";\r\n      }\r\n   }\r\n   return stream;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////\r\n\r\nstd::istream& PixelVec::read(std::istream& stream, const char dir)\r\n{\r\n   unsigned short runlength;\r\n   stream.read((char *) &m_start, sizeof(m_start));\r\n   stream.read((char *) &runlength, sizeof(runlength));\r\n   switch (dir) {\r\n      case PixelRef::POSDIAGONAL:\r\n         m_end.x = m_start.x + runlength;\r\n         m_end.y = m_start.y + runlength;\r\n         break;\r\n      case PixelRef::NEGDIAGONAL:\r\n         m_end.x = m_start.x + runlength;\r\n         m_end.y = m_start.y - runlength;\r\n         break;\r\n      case PixelRef::HORIZONTAL:\r\n         m_end.x = m_start.x + runlength;\r\n         m_end.y = m_start.y;\r\n         break;\r\n      case PixelRef::VERTICAL:\r\n         m_end.x = m_start.x;\r\n         m_end.y = m_start.y + runlength;\r\n         break;\r\n   }\r\n   return stream;\r\n}\r\n\r\nstd::ostream& PixelVec::write(std::ostream& stream, const char dir)\r\n{\r\n   stream.write((char *) &m_start, sizeof(m_start));\r\n   unsigned short runlength;\r\n   switch (dir) {\r\n      case PixelRef::HORIZONTAL:\r\n      case PixelRef::POSDIAGONAL:\r\n      case PixelRef::NEGDIAGONAL:\r\n         runlength = m_end.x - m_start.x;\r\n         break;\r\n      case PixelRef::VERTICAL:\r\n         runlength = m_end.y - m_start.y;\r\n         break;\r\n   }\r\n   stream.write((char *) &runlength, sizeof(runlength));\r\n\r\n   return stream;\r\n}\r\n\r\nstruct ShiftLength {\r\n   unsigned short shift : 4;\r\n   unsigned short runlength : 12;\r\n};\r\n\r\nstd::istream& PixelVec::read(std::istream& stream, const char dir, const PixelVec& context)\r\n{\r\n   short primary;\r\n   ShiftLength shiftlength;\r\n   stream.read((char *) &primary, sizeof(primary));\r\n   stream.read((char *) &shiftlength, sizeof(shiftlength));\r\n   switch (dir) {\r\n      case PixelRef::HORIZONTAL:\r\n         m_start.x = primary;\r\n         m_start.y = context.m_start.y + shiftlength.shift;\r\n         m_end.x = m_start.x + shiftlength.runlength;\r\n         m_end.y = m_start.y;\r\n         break;\r\n      case PixelRef::VERTICAL:\r\n         m_start.x = context.m_start.x + shiftlength.shift;\r\n         m_start.y = primary;\r\n         m_end.x = m_start.x;\r\n         m_end.y = m_start.y + shiftlength.runlength;\r\n         break;\r\n   }\r\n\r\n   return stream;\r\n}\r\n   \r\nstd::ostream& PixelVec::write(std::ostream& stream, const char dir, const PixelVec& context)\r\n{\r\n   ShiftLength shiftlength;\r\n   switch (dir) {\r\n      case PixelRef::HORIZONTAL:\r\n         stream.write((char *) &(m_start.x), sizeof(m_start.x));\r\n         shiftlength.runlength = m_end.x - m_start.x;\r\n         shiftlength.shift = m_start.y - context.m_start.y;\r\n         break;\r\n      case PixelRef::VERTICAL:\r\n         stream.write((char *) &(m_start.y), sizeof(m_start.y));\r\n         shiftlength.runlength = m_end.y - m_start.y;\r\n         shiftlength.shift = m_start.x - context.m_start.x;\r\n         break;\r\n   }\r\n   stream.write((char *) &shiftlength, sizeof(shiftlength));\r\n\r\n   return stream;\r\n}\r\n"
  },
  {
    "path": "salalib/ngraph.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n// ngraph.h\r\n\r\n#pragma once\r\n\r\n#include \"salalib/pixelref.h\"\r\n\r\n#include <set>\r\n\r\nclass PointMap;\r\nstruct MetricPair;\r\nstruct MetricTriple;\r\nstruct AngularTriple;\r\n\r\nstruct PixelVec\r\n{\r\n   PixelRef m_start;\r\n   PixelRef m_end;\r\n   PixelVec(const PixelRef start = NoPixel, const PixelRef end = NoPixel) \r\n   { m_start = (int) start; m_end = (int) end; };\r\n   PixelRef start() const\r\n   { return m_start; }\r\n   PixelRef end() const\r\n   { return m_end; }\r\n   //\r\n   std::istream &read(std::istream &stream, const char dir);\r\n   std::istream &read(std::istream &stream, const char dir, const PixelVec& context);\r\n   std::ostream &write(std::ostream &stream, const char dir);\r\n   std::ostream &write(std::ostream &stream, const char dir, const PixelVec& context);\r\n};\r\n\r\nclass Bin\r\n{\r\n   friend class Node;\r\nprotected:\r\n   unsigned short m_node_count;\r\n   float m_distance;\r\n   float m_occ_distance;\r\npublic:\r\n   char m_dir;\r\n   std::vector<PixelVec> m_pixel_vecs;\r\n   Bin()\r\n   { m_dir = PixelRef::NODIR; m_node_count = 0; m_distance = 0.0f; m_occ_distance = 0.0f; }\r\n   //\r\n   void make(const PixelRefVector& pixels, char m_dir);\r\n   void extractUnseen(PixelRefVector& pixels, PointMap *pointdata, int binmark);\r\n   void extractMetric(std::set<MetricTriple> &pixels, PointMap *pointdata, const MetricTriple& curs);\r\n   void extractAngular(std::set<AngularTriple> &pixels, PointMap *pointdata, const AngularTriple& curs);\r\n   //\r\n   int count() const \r\n   { return m_node_count; }\r\n   float distance() const\r\n   { return m_distance; }\r\n   float occdistance() const\r\n   { return m_occ_distance; }\r\n   //\r\n   void setOccDistance(float d)\r\n   { m_occ_distance = d; }\r\n   //\r\n   bool containsPoint(const PixelRef p) const;\r\n   //\r\n   // Iterator\r\nprotected:\r\n   // Conversion back to old fashioned schema:\r\n   mutable int m_curvec;\r\n   mutable PixelRef m_curpix;\r\npublic:\r\n   void first() const;\r\n   void next() const;\r\n   bool is_tail() const;\r\n   PixelRef cursor() const;\r\n   //\r\n   std::istream &read(std::istream &stream);\r\n   std::ostream &write(std::ostream &stream);\r\n   //\r\n   friend std::ostream& operator << (std::ostream& stream, const Bin& bin);\r\n};\r\n\r\nclass Node\r\n{\r\nprotected:\r\n   PixelRef m_pixel;\r\n   Bin m_bins[32];\r\npublic:\r\n   // testing some agent stuff:\r\n   std::vector<PixelRef> m_occlusion_bins[32];\r\npublic:\r\n   // Note: this function clears the bins as it goes\r\n   void make(const PixelRef pix, PixelRefVector *bins, float *bin_far_dists, int q_octants);\r\n   void extractUnseen(PixelRefVector& pixels, PointMap *pointdata);\r\n   void extractMetric(std::set<MetricTriple> &pixels, PointMap *pointdata, const MetricTriple& curs);\r\n   void extractAngular(std::set<AngularTriple> &pixels, PointMap *pointdata, const AngularTriple& curs);\r\n   bool concaveConnected();\r\n   bool fullyConnected();\r\n   //\r\n   void setPixel(const PixelRef& pixel)\r\n   { m_pixel = pixel; }\r\n   //\r\n   const Bin& bin(int i) const\r\n   { return m_bins[i]; }\r\n   Bin& bin(int i)\r\n   { return m_bins[i]; }\r\n   //\r\n   int count()\r\n   { int c = 0; for (int i = 0; i < 32; i++) c += m_bins[i].count(); return c; }\r\n   int bincount(int i)\r\n   { return m_bins[i].count(); }\r\n   float bindistance(int i) \r\n   { return m_bins[i].distance(); }\r\n   void setbindistances(float bin_dists[32])\r\n   { for (int i = 0; i < 32; i++) m_bins[i].m_distance = bin_dists[i]; }\r\n   float occdistance(int i)\r\n   { return m_bins[i].occdistance(); }\r\n   //\r\n   bool containsPoint(const PixelRef p) const;\r\n   //\r\n   //\r\n   // Iterator:\r\nprotected:\r\n   // Conversion back to old fashioned schema:\r\n   mutable int m_curbin;\r\npublic:\r\n   void contents(PixelRefVector& hood) const;\r\n   void first() const;\r\n   void next() const;\r\n   bool is_tail() const;\r\n   PixelRef cursor() const;\r\n   //\r\n   std::istream &read(std::istream &stream);\r\n   std::ostream &write(std::ostream &stream);\r\n   //\r\n   friend std::ostream& operator << (std::ostream& stream, const Node& node);\r\n};\r\n\r\n// Two little helpers:\r\n\r\nclass PixelRefH : public PixelRef\r\n{\r\npublic:\r\n   PixelRefH() : PixelRef()\r\n   {;}\r\n   PixelRefH(const PixelRef& p) : PixelRef(p)\r\n   {;}\r\n   friend bool operator > (const PixelRefH& a, const PixelRefH& b);\r\n   friend bool operator < (const PixelRefH& a, const PixelRefH& b);\r\n};\r\ninline bool operator > (const PixelRefH& a, const PixelRefH& b)\r\n{\r\n   return (a.y > b.y || (a.y == b.y && a.x > b.x));\r\n}\r\ninline bool operator < (const PixelRefH& a, const PixelRefH& b)\r\n{\r\n   return (a.y < b.y || (a.y == b.y && a.x < b.x));\r\n}\r\nclass PixelRefV : public PixelRef\r\n{\r\npublic:\r\n   PixelRefV() : PixelRef()\r\n   {;}\r\n   PixelRefV(const PixelRef& p) : PixelRef(p)\r\n   {;}\r\n   friend bool operator > (const PixelRefV& a, const PixelRefV& b);\r\n   friend bool operator < (const PixelRefV& a, const PixelRefV& b);\r\n};\r\ninline bool operator > (const PixelRefV& a, const PixelRefV& b)\r\n{\r\n   return (a.x > b.x || (a.x == b.x && a.y > b.y));\r\n}\r\ninline bool operator < (const PixelRefV& a, const PixelRefV& b)\r\n{\r\n   return (a.x < b.x || (a.x == b.x && a.y < b.y));\r\n}\r\n"
  },
  {
    "path": "salalib/options.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include <set>\n#include <string>\n\n// Options for mean depth calculations\nstruct Options\n{\n   enum output_t { OUTPUT_ISOVIST, OUTPUT_VISUAL, OUTPUT_METRIC, OUTPUT_ANGULAR, OUTPUT_THRU_VISION, OUTPUT_CLIQUE_GRAPH,\n      OUTPUT_KERNEL_GRAPH, OUTPUT_MATRIX_REDUCTION };\n   // Output type, see above\n   int output_type;\n   // Options for the summary type:\n   int local;\n   int global;\n   int cliques;\n   //\n   bool choice;\n   // include measures that can be derived: RA, RRA and total depth\n   bool fulloutput;\n   //\n   enum { RADIUS_STEPS, RADIUS_METRIC, RADIUS_ANGULAR };\n   int radius_type;\n   double radius; // <- n.b. for metric integ radius is floating point\n   // radius has to go up to a list (phase out radius as is)\n   std::set<double> radius_set;\n   //\n   int point_depth_selection;\n   int tulip_bins;\n   bool process_in_memory;\n   bool sel_only;\n   bool gates_only;\n   // for pushing to a gates layer\n   int gatelayer;\n   // a column to weight measures by:\n   int weighted_measure_col;\n   int weighted_measure_col2;  //EFEF\n    int routeweight_col;\t\t\t//EFEF\n   std::string output_file; // To save an output graph (for example)\n   // default values\n   Options()\n   { local = 0; global = 1; cliques = 0;\n     choice = false; fulloutput = false; point_depth_selection = 0;\n     tulip_bins = 1024;\n     radius = -1; radius_type = 0;\n     output_type = OUTPUT_ISOVIST; process_in_memory = false; gates_only = false; sel_only = false;\n     gatelayer = -1;\n     weighted_measure_col = -1;}\n};\n"
  },
  {
    "path": "salalib/pafcolor.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#include <math.h>\r\n#include <float.h> // _finite support\r\n\r\n#include <salalib/pafcolor.h>  // <- sala actually includes vertex.h for us\r\n\r\nstatic unsigned int g_nicecolor[] = { \r\n   0x003333DD, // 0 blue\r\n   0x003388DD, // 1\r\n   0x0022CCDD, // 2\r\n   0x0022CCBB, // 3\r\n   0x0022DD88, // 4\r\n   0x0088DD22, // 5\r\n   0x00BBCC22, // 6\r\n   0x00DDCC22, // 7\r\n   0x00DD8833, // 8\r\n   0x00DD3333, // 9 red\r\n};\r\n\r\n// Test a range designed to try to keep consistent saturation and brightness of g_nicecolor, and only move hue\r\nstatic unsigned int g_nicecolorhsb[] = {\r\n   0x003333DD, // 0 blue\r\n   0x003377DD, // 1\r\n   0x0033BBDD, // 2\r\n   0x0033DDBB, // 3\r\n   0x0033DD55, // 4\r\n   0x0055DD33, // 5\r\n   0x00BBDD33, // 6\r\n   0x00DDBB33, // 7\r\n   0x00DD7733, // 8\r\n   0x00DD3333, // 9 red\r\n};\r\n\r\nstatic unsigned int g_greyscale[] = { \r\n   0x00000000, // 0 black\r\n   0x00444444, // 1\r\n   0x00777777, // 2\r\n   0x00AAAAAA, // 3\r\n   0x00CCCCCC, // 4\r\n   0x00EEEEEE, // 5\r\n   0x00FFFFFF, // 6 white\r\n};\r\n\r\nstatic unsigned int g_bluered[] = {\r\n   0x004575B4, // 0 blue\r\n   0x0091BFDB, \r\n   0x00E0F3F8, \r\n   0x00FFFFBF, \r\n   0x00FEE090, \r\n   0x00FC8D59, \r\n   0x00D73027  // 6 red \r\n};\r\n\r\nstatic unsigned int g_purpleorange[] = {\r\n   0x00542788, // 0 purple\r\n   0x00998EC3, // 1\r\n   0x00D8DAEB, // 2\r\n   0x00F7F7F7, // 3\r\n   0x00FEE0B6, // 4\r\n   0x00F1A340, // 5\r\n   0x00B35806  // 6 orange\r\n};\r\n\r\n// htmlByte converts a normalised number to an HTML safe byte\r\n\r\nunsigned char htmlByte(double colorByte)\r\n{\r\n   // Quick mod - TV\r\n#if defined(_MSC_VER)   \r\n   return (unsigned char((colorByte + 0.0333) * 15.0) * 0x11);\r\n#else\r\n   return ((unsigned char)((colorByte + 0.0333) * 15.0) * 0x11);\r\n#endif   \r\n}\r\n\r\nPafColor& PafColor::makeColor(double field, DisplayParams dp)\r\n{\r\n   // Quick mod - TV\r\n   if (field == -1.0 || std::isnan(field)) {\r\n      // -1.0 is (currently) a nan value, set alpha channel to 0 (transparent)\r\n      switch (dp.colorscale) {\r\n         case DisplayParams::MONOCHROME:\r\n         case DisplayParams::GREYSCALE:\r\n            m_color = 0x00000000;   // <- monochrome and greyscale, simply hide\r\n            break;\r\n         default:\r\n            // if in colour, then show greyed out:\r\n            m_color = 0x007f7f7f;   // <- grey retained for visibility on certain values\r\n            break;\r\n      }\r\n      return *this;\r\n   }\r\n   if (dp.blue > dp.red) {\r\n      field = 1.0 - field;\r\n      dp.blue = 1.0f - dp.blue;\r\n      dp.red = 1.0f - dp.red;\r\n   }\r\n   if (dp.colorscale == DisplayParams::DEPTHMAPCLASSIC) {\r\n      makeDepthmapClassic(field, dp.blue, dp.red);\r\n   }\r\n   else {\r\n      field = (field - dp.blue) / (dp.red - dp.blue);\r\n      // Quick mod - TV\r\n      if (std::isnan(field)) {\r\n         field = 0.5;\r\n      }\r\n      if (field > 1.0) {\r\n         field = 1.0;\r\n      }\r\n      else if (field < 0.0) {\r\n         field = 0.0;\r\n      }\r\n      switch(dp.colorscale) {\r\n      case DisplayParams::AXMANESQUE:\r\n         makeAxmanesque(field);\r\n         break;\r\n      case DisplayParams::HUEONLYAXMANESQUE:\r\n         makeHueOnlyAxmanesque(field);\r\n         break;\r\n      case DisplayParams::PURPLEORANGE:\r\n         makePurpleOrange(field);\r\n         break;\r\n      case DisplayParams::BLUERED:\r\n         makeBlueRed(field);\r\n         break;\r\n      case DisplayParams::GREYSCALE:\r\n      case DisplayParams::MONOCHROME:\r\n         makeGreyScale(field);\r\n         break;\r\n      }\r\n   }\r\n   return *this;\r\n}\r\n\r\n// this makes an Axman-like colour range\r\n\r\nPafColor& PafColor::makeAxmanesque( double field )\r\n{\r\n   m_color = 0xff000000 | g_nicecolor[int((field - 1e-9) * 10.0)];\r\n   return *this;\r\n}\r\n\r\nPafColor& PafColor::makeHueOnlyAxmanesque( double field )\r\n{\r\n   m_color = 0xff000000 | g_nicecolorhsb[int((field - 1e-9) * 10.0)];\r\n   return *this;\r\n}\r\n\r\n// this makes a purple-orange scheme that is red-green colour-blind safe\r\n\r\nPafColor& PafColor::makePurpleOrange( double field )\r\n{\r\n   m_color = 0xff000000 | g_purpleorange[int((field - 1e-9) * 7.0)];\r\n   return *this;\r\n}\r\n\r\n// this makes a blue-red scheme that is red-green colour-blind safe\r\n\r\nPafColor& PafColor::makeBlueRed( double field )\r\n{\r\n   m_color = 0xff000000 | g_bluered[int((field - 1e-9) * 7.0)];\r\n   return *this;\r\n}\r\n\r\n// this makes a greyscale colour range\r\n\r\nPafColor& PafColor::makeGreyScale( double field )\r\n{\r\n   m_color = 0xff000000 | g_greyscale[int((field - 1e-9) * 7.0)];\r\n   return *this;\r\n}\r\n\r\n// note, makeDepthmapClassic converts to a safe HTML colour\r\n\r\nPafColor& PafColor::makeDepthmapClassic( double field, double blue, double red )\r\n{\r\n   m_color = 0xff000000; // set alpha to 255, solid colour\r\n   double green = blue + (red-blue) / 10.0;\r\n   // NB previously included colour muting: the 1.0 was originally 0.9 to mute the colours slightly\r\n   if (field >= 0.0 && field < blue) {\r\n      setr(htmlByte(0.5 * (blue - field)/blue * 1.0));\r\n      // Quick mod - TV\r\n#if defined(_MSC_VER)\r\n      setb(unsigned char(0xFF));\r\n#else\r\n      setb((unsigned char)(0xFF));\r\n#endif\r\n   }\r\n   else if (field >= blue && field < (green+blue)/2.0) {\r\n      // Quick mod - TV\r\n#if defined(_MSC_VER)      \r\n      setb(unsigned char(0xFF));\r\n#else\r\n      setb((unsigned char)(0xFF));\r\n#endif      \r\n      setg(htmlByte((2.0*(field - blue)/(green-blue)) * 1.0));\r\n   }\r\n   else if (field >= (green+blue)/2.0 && field < green) {\r\n      setb(htmlByte((2.0*(green - field)/(green-blue)) * 1.0));\r\n      // Quick mod - TV\r\n#if defined(_MSC_VER)\r\n      setg(unsigned char(0xFF));\r\n#else\r\n      setg((unsigned char)(0xFF));\r\n#endif      \r\n   }\r\n   else if (field >= green && field < (green+red)/2.0 ) {\r\n      // Quick mod - TV\r\n#if defined(_MSC_VER)      \r\n      setg(unsigned char(0xFF));\r\n#else\r\n      setg((unsigned char)(0xFF));\r\n#endif      \r\n      setr(htmlByte((2.0*(field - green)/(red-green)) * 1.0));\r\n   }\r\n   else if (field >= (green+red)/2.0 && field < red) {\r\n      setg(htmlByte((2.0*(red - field)/(red-green)) * 1.0));\r\n      // Quick mod - TV\r\n#if defined(_MSC_VER)      \r\n      setr(unsigned char(0xFF));\r\n#else\r\n      setr((unsigned char)(0xFF));\r\n#endif      \r\n   }\r\n   else if (field >= red) {\r\n      // Quick mod - TV\r\n#if defined(_MSC_VER)      \r\n      setr(unsigned char(0xFF));\r\n#else\r\n      setr((unsigned char)(0xFF));\r\n#endif      \r\n      setb(htmlByte(0.5 * (field - red)/(1.0 - red) * 1.0));\r\n   }\r\n   return *this;\r\n}\r\n"
  },
  {
    "path": "salalib/pafcolor.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/displayparams.h\"\n#include \"genlib/p2dpoly.h\"\n\n// For my colour scheme... some parameters to pass, and my own colour class\n\n// Converts everything to safe HTML colours\n\nstruct PafColor\n{\n   unsigned int m_color;\n   unsigned char redb() const\n   { return (unsigned char) (m_color >> 16); }\n   unsigned char greenb() const\n   { return (unsigned char) (m_color >> 8); }\n   unsigned char blueb() const\n   { return (unsigned char) (m_color);  }\n   unsigned char alphab() const\n   { return (unsigned char) (m_color >> 24); }\n   // Quick mod - TV\n   void setr(unsigned char r)\n   { m_color &= 0xff00ffff; m_color |= (((unsigned int)r) << 16);}\n   // Quick mod - TV\n   void setg(unsigned char g)\n   { m_color &= 0xffff00ff; m_color |= (((unsigned int)g) << 8);}\n   // Quick mod - TV\n   void setb(unsigned char b)\n   { m_color &= 0xffffff00; m_color |= ((unsigned int)b);}\n   float redf() const\n   { return float(redb()) / 255.0f; }\n   float greenf() const\n   { return float(greenb()) / 255.0f; }\n   float bluef() const\n   { return float(blueb()) / 255.0f; }\n   PafColor()\n   { m_color = 0x00000000; }\n   PafColor(unsigned int rgb) // color in 0x00rrggbb format\n   { m_color = 0xff000000 | rgb; }\n   PafColor( double r, double g, double b, double a = 1.0 )\n   {\n      m_color = 0x00000000 |\n      (((unsigned char) (a * 255.0)) << 24) |\n      (((unsigned char) (r * 255.0)) << 16) |\n      (((unsigned char) (g * 255.0)) << 8) |\n      (((unsigned char) (b * 255.0)));\n   }\n\n   PafColor( const Point2f& vec, double a = 1.0 )\n   {\n       m_color = 0x00000000 |\n      (((unsigned char) (a * 255.0)) << 24) |\n      (((unsigned char) (dot(vec,Point2f(1.0, 0.0)) * 255.0)) << 16) |\n      (((unsigned char) (dot(vec,Point2f(-0.5,0.86602540378443864676372317075294)) * 255.0)) << 8) |\n      (((unsigned char) (dot(vec,Point2f(-0.5,-0.86602540378443864676372317075294)) * 255.0)));\n   }\n\n   operator unsigned int ()\n      { return m_color & 0x00ffffff; }\n   friend bool operator == (const PafColor& a, const PafColor& b);\n   friend bool operator != (const PafColor& a, const PafColor& b);\n   PafColor& makeAxmanesque( double field);\n   PafColor& makeHueOnlyAxmanesque( double field);\n   PafColor& makePurpleOrange( double field );\n   PafColor& makeBlueRed( double field );\n   PafColor& makeGreyScale( double field );\n   PafColor& makeMonochrome( double field );\n   PafColor& makeDepthmapClassic( double field, double blue, double red );\n   PafColor& makeColor(double field, DisplayParams dp);  // <- note, make copy to play around with\n};\ninline bool operator == (const PafColor& a, const PafColor& b)\n{\n   return (a.m_color == b.m_color);\n}\ninline bool operator != (const PafColor& a, const PafColor& b)\n{\n   return (a.m_color != b.m_color);\n}\n"
  },
  {
    "path": "salalib/parsers/CMakeLists.txt",
    "content": "target_sources(salalib\n    PRIVATE\n        ntfp.cpp\n        dxfp.cpp\n        mapinfodata.cpp\n        tigerp.cpp\n    PUBLIC\n        dxfp.h\n        ntfp.h\n        mapinfodata.h\n        tigerp.h)\n"
  },
  {
    "path": "salalib/parsers/dxfp.cpp",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// parser class\r\n#include \"dxfp.h\"\r\n\r\n#include \"genlib/comm.h\"  // for communicator\r\n#include \"genlib/stringutils.h\"\r\n\r\n#include <iostream>\r\n#include <fstream>\r\n#include <algorithm>\r\n#include <string>\r\n\r\nstatic int counter = 0;\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nbool operator > (const DxfTableRow& a, const DxfTableRow& b)  // for hash table\r\n{\r\n   return a.m_name > b.m_name;\r\n}\r\n\r\nbool operator < (const DxfTableRow& a, const DxfTableRow& b)  // for hash table\r\n{\r\n   return a.m_name < b.m_name;\r\n}\r\n\r\nbool operator == (const DxfTableRow& a, const DxfTableRow& b) // for hash table\r\n{\r\n   return a.m_name == b.m_name;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfParser::DxfParser(Communicator *comm /* = NULL */)\r\n{\r\n   m_communicator = comm;\r\n   m_size = 0;\r\n   m_time = 0;\r\n}\r\n\r\nconst DxfVertex& DxfParser::getExtMin() const\r\n{\r\n   return m_region.getExtMin();\r\n}\r\n\r\nconst DxfVertex& DxfParser::getExtMax() const\r\n{\r\n   return m_region.getExtMax();\r\n}\r\n\r\nDxfLayer *DxfParser::getLayer( const std::string& layer_name ) // const <- removed as m_layers may be changed if DXF is poor\r\n{\r\n   std::map<std::string, DxfLayer>::iterator layerIter = m_layers.find(layer_name);\r\n   if (layerIter == m_layers.end()) {\r\n      m_layers.insert( std::pair<std::string, DxfLayer> (layer_name, DxfLayer(layer_name)));\r\n      return &(m_layers.find(layer_name)->second);\r\n   }\r\n   return &(layerIter->second);\r\n}\r\n\r\nDxfLineType *DxfParser::getLineType( const std::string& line_type_name )  // const <- removed as m_layers may be changed if DXF is poor\r\n{\r\n   static DxfLineType line_type;\r\n\r\n   line_type.m_name = line_type_name;\r\n\r\n   std::map<std::string, DxfLineType>::iterator lineTypeIter = m_line_types.find(line_type_name);\r\n   if (lineTypeIter == m_line_types.end()) {\r\n      m_line_types.insert( std::pair<std::string, DxfLineType> (line_type_name, line_type));\r\n      return &(m_line_types.find(line_type_name)->second);\r\n   }\r\n   return &(lineTypeIter->second);\r\n}\r\n\r\nsize_t DxfParser::numLayers() const\r\n{\r\n   return m_layers.size();\r\n}\r\n\r\nsize_t DxfParser::numLineTypes() const\r\n{\r\n   return m_line_types.size();\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nstd::istream& operator >> (std::istream& stream, DxfParser& dxfp)\r\n{\r\n   if (dxfp.m_communicator)\r\n   {\r\n      long size = static_cast<long>(dxfp.m_communicator->GetInfileSize());\r\n      dxfp.m_communicator->CommPostMessage( Communicator::NUM_RECORDS, size );\r\n\r\n      qtimer( dxfp.m_time, 0 );\r\n   }\r\n\r\n   return dxfp.open( stream );\r\n}\r\n\r\nstd::istream& DxfParser::open( std::istream& stream )\r\n{\r\n   DxfToken token;\r\n   int section = UNIDENTIFIED;\r\n\r\n   while (!stream.eof() && section != _EOF) {\r\n      switch (section)\r\n      {\r\n         case ZEROTOKEN:\r\n            if (token.data == \"SECTION\") {\r\n               // find out the section\r\n               stream >> token;\r\n               m_size += token.size;\r\n               //\r\n               if (token.code != 2) {\r\n                  // oops...\r\n                  section = UNIDENTIFIED;\r\n               }\r\n               else if (token.data == \"HEADER\") {\r\n                  section = HEADER;\r\n               }\r\n               else if (token.data == \"TABLES\") {\r\n                  section = TABLES;\r\n               }\r\n               else if (token.data == \"BLOCKS\") {\r\n                  section = BLOCKS;\r\n               }\r\n               else if (token.data == \"ENTITIES\") {\r\n                  section = ENTITIES;\r\n               }\r\n               else {\r\n                  section = UNIDENTIFIED;\r\n               }\r\n            }\r\n            else if (token.data == \"EOF\") {\r\n               section = _EOF;\r\n            }\r\n            else {\r\n               section = UNIDENTIFIED;\r\n            }\r\n            break;\r\n         case HEADER:\r\n            openHeader( stream );\r\n            section = UNIDENTIFIED;\r\n            break;\r\n         case TABLES:\r\n            openTables( stream );\r\n            section = UNIDENTIFIED;\r\n            break;\r\n         case BLOCKS:\r\n            openBlocks( stream );\r\n            section = UNIDENTIFIED;\r\n            break;\r\n         case ENTITIES:\r\n            openEntities( stream, token ); // I'm adding the token here as before the function was unsafe, but I'm not sure reuse of this token is a good idea AT 29-APR-11\r\n            section = UNIDENTIFIED;\r\n            break;\r\n         default:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0) {\r\n               section = ZEROTOKEN;\r\n            }\r\n            break;\r\n      }\r\n      if (m_communicator)\r\n      {\r\n         counter++;\r\n         if (qtimer( m_time, 500 )) {\r\n            if (m_communicator->IsCancelled()) {\r\n               throw Communicator::CancelledException();\r\n            }\r\n            m_communicator->CommPostMessage( Communicator::CURRENT_RECORD, static_cast<long>(m_size) );\r\n         }\r\n      }\r\n   }\r\n\r\n   // Get overall bounding box from layers:\r\n   for ( const auto& layer : m_layers  )\r\n   {\r\n      if (!layer.second.empty()) {\r\n         m_region.merge( layer.second );\r\n      }\r\n   }\r\n   return stream;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid DxfParser::openHeader( std::istream& stream )\r\n{\r\n   DxfToken token;\r\n   int subsection = UNIDENTIFIED;\r\n\r\n   DxfVertex vertex;\r\n\r\n   while (!stream.eof() && subsection != ENDSEC) {\r\n      switch (subsection) {\r\n         case ZEROTOKEN:\r\n            if (token.data == \"ENDSEC\") {\r\n               subsection = ENDSEC;\r\n            }\r\n            /*\r\n            // EXTMIN and EXTMAX are deprecated: Now calculate ourselves instead...\r\n            // although now my blocks reading is done properly, should be okay!\r\n            else if (token.data == \"$EXTMIN\") {\r\n               subsection = EXTMIN;\r\n            }\r\n            else if (token.data == \"$EXTMAX\") {\r\n               subsection = EXTMAX;\r\n            }\r\n            */\r\n            else {\r\n               subsection = UNIDENTIFIED;\r\n            }\r\n            break;\r\n            /*\r\n            // EXTMIN and EXTMAX are deprecated: Now calculate ourselves instead...\r\n            // although now my blocks reading is done properly, should be okay!\r\n         case EXTMIN:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( vertex.parse(token, this) ) {\r\n               m_extmin = vertex;\r\n               vertex.clear(); // reuse\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case EXTMAX:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( vertex.parse(token, this) ) {\r\n               m_extmax = vertex;\r\n               vertex.clear(); // reuse\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n            */\r\n         default:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0 || token.code == 9 ) {   // 9 is used as a '0' in the header\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid DxfParser::openTables( std::istream& stream )\r\n{\r\n   DxfToken token;\r\n   int subsection = UNIDENTIFIED;\r\n\r\n   DxfLayer    layer;\r\n   DxfLineType line_type;\r\n\r\n   while (!stream.eof() && subsection != ENDSEC) {\r\n      switch (subsection) {\r\n         case ZEROTOKEN:\r\n            if (token.data == \"TABLE\") {\r\n               // find out the table type\r\n               stream >> token;\r\n               m_size += token.size;\r\n               //\r\n               if (token.code != 2) {\r\n                  // oops...\r\n                  subsection = UNIDENTIFIED;\r\n               }\r\n               else if (token.data == \"LTYPE\") {\r\n                  subsection = LTYPE_TABLE;\r\n               }\r\n               else if (token.data == \"LAYER\") {\r\n                  subsection = LAYER_TABLE;\r\n               }\r\n               else {\r\n                  subsection = UNIDENTIFIED;\r\n               }\r\n            }\r\n            else if (token.data == \"ENDSEC\") {\r\n               subsection = ENDSEC;\r\n            }\r\n            else {\r\n               subsection = UNIDENTIFIED;\r\n            }\r\n            break;\r\n         case LTYPE_TABLE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0) {\r\n               if (token.data == \"LTYPE\") {\r\n                  subsection = LTYPE_ROW;\r\n               }\r\n               else if (token.data == \"ENDTAB\") {\r\n                  subsection = ZEROTOKEN;\r\n               }\r\n            }\r\n            break;\r\n         case LTYPE_ROW:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( line_type.parse( token, this ) ) {\r\n               m_line_types.insert( std::pair<std::string, DxfLineType>(line_type.m_name, line_type) );\r\n               if (token.data == \"ENDTAB\") {\r\n                  subsection = ZEROTOKEN;\r\n               }\r\n            }\r\n            break;\r\n         case LAYER_TABLE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0) {\r\n               if (token.data == \"LAYER\") {\r\n                  subsection = LAYER_ROW;\r\n               }\r\n               else if (token.data == \"ENDTAB\") {\r\n                  subsection = ZEROTOKEN;\r\n               }\r\n            }\r\n            break;\r\n         case LAYER_ROW:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( layer.parse( token, this ) ) {\r\n//               m_layers.add( layer );\r\n               if (token.data == \"ENDTAB\") {\r\n                  subsection = ZEROTOKEN;\r\n               }\r\n            }\r\n            break;\r\n         default:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0 ) {\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid DxfParser::openBlocks( std::istream& stream )\r\n{\r\n   DxfToken token;\r\n   int subsection = UNIDENTIFIED;\r\n\r\n   DxfBlock block;\r\n\r\n   while (!stream.eof() && subsection != ENDSEC) {\r\n      switch (subsection) {\r\n         case ZEROTOKEN:\r\n            if (token.data == \"BLOCK\") {\r\n               subsection = BLOCK;\r\n            }\r\n            else if (token.data == \"ENDSEC\") {\r\n               subsection = ENDSEC;\r\n            }\r\n            else {\r\n               subsection = UNIDENTIFIED;\r\n            }\r\n            break;\r\n         case BLOCK:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( block.parse( token, this ) ) {\r\n               m_blocks.insert( std::pair<std::string, DxfBlock> (block.m_name, block) );\r\n               if (token.data == \"ENDBLK\") {\r\n                  subsection = ZEROTOKEN;\r\n               }\r\n               else {\r\n                  // this drills down to the data for the block:\r\n                  openEntities(stream, token, &(m_blocks[block.m_name]) );\r\n                  // only if the block ends should we move up:\r\n                  if (token.data == \"ENDBLK\") {\r\n                     subsection = ZEROTOKEN;\r\n                  }\r\n               }\r\n            }\r\n            break;\r\n         default:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0 ) {\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n      }\r\n      if (m_communicator)\r\n      {\r\n         counter++;\r\n         if (qtimer( m_time, 500 )) {\r\n            if (m_communicator->IsCancelled()) {\r\n               throw Communicator::CancelledException();\r\n            }\r\n            m_communicator->CommPostMessage( Communicator::CURRENT_RECORD, static_cast<long>(m_size) );\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid DxfParser::openEntities( std::istream& stream, DxfToken& token, DxfBlock *block )\r\n{\r\n   int subsection = UNIDENTIFIED;\r\n   if (token.code == 0) {\r\n      // a block must always pass it's first token:\r\n      subsection = ZEROTOKEN;\r\n   }\r\n\r\n   DxfVertex       point;\r\n   DxfLine        line;\r\n   DxfPolyLine    poly_line;\r\n   DxfLwPolyLine  lw_poly_line;\r\n   DxfArc         arc;\r\n   DxfEllipse     ellipse;\r\n   DxfCircle      circle;\r\n   DxfSpline      spline;\r\n   DxfInsert      insert;\r\n\r\n   std::string layer_name;\r\n   std::string line_type_name;\r\n\r\n   while (!stream.eof() && subsection != ENDSEC) {\r\n      switch (subsection) {\r\n         case ZEROTOKEN:\r\n            if (token.data == \"POINT\") {\r\n               subsection = POINT;\r\n            }\r\n            else if (token.data == \"LINE\") {\r\n               subsection = LINE;\r\n            }\r\n            else if (token.data == \"POLYLINE\") {\r\n               subsection = POLYLINE;\r\n            }\r\n            else if (token.data == \"LWPOLYLINE\") {\r\n               subsection = LWPOLYLINE;\r\n            }\r\n            else if (token.data == \"ARC\") {\r\n               subsection = ARC;\r\n            }\r\n            else if (token.data == \"ELLIPSE\") {\r\n               subsection = ELLIPSE;\r\n            }\r\n            else if (token.data == \"CIRCLE\") {\r\n               subsection = CIRCLE;\r\n            }\r\n            else if (token.data == \"SPLINE\") {\r\n               subsection = SPLINE;\r\n            }\r\n            else if (token.data == \"INSERT\") {\r\n               subsection = INSERT;\r\n            }\r\n            else if (token.data == \"ENDSEC\" || token.data == \"ENDBLK\") {\r\n               subsection = ENDSEC;\r\n            }\r\n            else {\r\n               subsection = UNIDENTIFIED;\r\n            }\r\n            break;\r\n         case POINT:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( point.parse( token, this ) ) {\r\n               DxfLayer *layer = block;\r\n               if (layer == NULL) {\r\n                  layer = point.m_p_layer;\r\n               }\r\n               layer->m_points.push_back( point );\r\n               layer->merge(point); // <- merge bounding box\r\n               layer->m_total_point_count += 1;\r\n               point.clear();\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case LINE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( line.parse( token, this ) ) {\r\n               if (line.m_start != line.m_end) {\r\n                  DxfLayer *layer = block;\r\n                  if (layer == NULL) {\r\n                     layer = line.m_p_layer;\r\n                  }\r\n                  layer->m_lines.push_back( line );\r\n                  layer->merge(line); // <- merge bounding box\r\n                  layer->m_total_line_count += 1;\r\n               }\r\n               line.clear();\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case POLYLINE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( poly_line.parse( token, this ) ) {\r\n               if (poly_line.m_vertex_count > 0) {\r\n                  DxfLayer *layer = block;\r\n                  if (layer == NULL) {\r\n                     layer = poly_line.m_p_layer;\r\n                  }\r\n                  layer->m_poly_lines.push_back( poly_line );\r\n                  size_t line_count = (poly_line.getAttributes() & DxfPolyLine::CLOSED) ?\r\n                     poly_line.numVertices() - 2 : poly_line.numVertices() - 1;\r\n                  layer->merge(poly_line); // <- merge bounding box\r\n                  layer->m_total_line_count += line_count;\r\n                  poly_line.clear(); // (Now reuse)\r\n               }\r\n               poly_line.clear(); // (Now reuse)\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case LWPOLYLINE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( lw_poly_line.parse( token, this ) ) {\r\n               if (lw_poly_line.m_vertex_count > 0) {\r\n                  DxfLayer *layer = block;\r\n                  if (layer == NULL) {\r\n                     layer = lw_poly_line.m_p_layer;\r\n                  }\r\n                  layer->m_poly_lines.push_back( lw_poly_line );\r\n                  size_t line_count = (lw_poly_line.getAttributes() & DxfPolyLine::CLOSED) ?\r\n                     lw_poly_line.numVertices() - 2 : lw_poly_line.numVertices() - 1;\r\n                  layer->merge(lw_poly_line); // <- merge bounding box\r\n                  layer->m_total_line_count += line_count;\r\n               }\r\n               lw_poly_line.clear(); // (Now reuse)\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case ARC:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( arc.parse( token, this ) ) {\r\n               DxfLayer *layer = block;\r\n               if (layer == NULL) {\r\n                  layer = arc.m_p_layer;\r\n               }\r\n               layer->m_arcs.push_back( arc );\r\n               layer->merge(arc);\r\n               arc.clear(); // (Now reuse)\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n          case ELLIPSE:\r\n             stream >> token;\r\n             m_size += token.size;\r\n             if ( ellipse.parse( token, this ) ) {\r\n                DxfLayer *layer = block;\r\n                if (layer == NULL) {\r\n                   layer = ellipse.m_p_layer;\r\n                }\r\n                layer->m_ellipses.push_back( ellipse );\r\n                layer->merge(ellipse);\r\n                ellipse.clear(); // (Now reuse)\r\n                subsection = ZEROTOKEN;\r\n             }\r\n             break;\r\n         case CIRCLE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( circle.parse( token, this ) ) {\r\n               DxfLayer *layer = block;\r\n               if (layer == NULL) {\r\n                  layer = circle.m_p_layer;\r\n               }\r\n               layer->m_circles.push_back( circle );\r\n               layer->merge(circle);\r\n               circle.clear(); // (Now reuse)\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case SPLINE:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( spline.parse( token, this ) ) {\r\n               if (spline.numVertices() > 0) {\r\n                  DxfLayer *layer = block;\r\n                  if (layer == NULL) {\r\n                     layer = spline.m_p_layer;\r\n                  }\r\n                  layer->m_splines.push_back( spline );\r\n                  size_t line_count = (spline.getAttributes() & DxfSpline::CLOSED) ?\r\n                    spline.numVertices() - 2 : spline.numVertices() - 1;\r\n                  layer->merge(spline);\r\n                  layer->m_total_line_count += line_count;\r\n                  spline.clear(); // (Now reuse)\r\n               }\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         case INSERT:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if ( insert.parse( token, this ) ) {\r\n               if ( insert.m_blockName.length() ) {\r\n                  DxfLayer *layer = block;\r\n                  if (layer == NULL) {\r\n                     layer = insert.m_p_layer;\r\n                     // we are in the entities section, unwind all the blocks\r\n                     layer->insert( insert, this );\r\n                  } else {\r\n                     // we are within a block, hold on until we load all of them\r\n                     // before we can unwind them into the entities section\r\n                     layer->m_inserts.push_back( insert );\r\n                  }\r\n               }\r\n               insert.clear();\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n         default:\r\n            stream >> token;\r\n            m_size += token.size;\r\n            if (token.code == 0 ) {\r\n               subsection = ZEROTOKEN;\r\n            }\r\n            break;\r\n      }\r\n      if (m_communicator)\r\n      {\r\n         counter++;\r\n         if (qtimer( m_time, 500 )) {\r\n            if (m_communicator->IsCancelled()) {\r\n               throw Communicator::CancelledException();\r\n            }\r\n            m_communicator->CommPostMessage( Communicator::CURRENT_RECORD, static_cast<long>(m_size) );\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Individual parsing of the types\r\n\r\nDxfTableRow::DxfTableRow(const std::string& name)\r\n{\r\n   m_name = name;\r\n}\r\n\r\nbool DxfTableRow::parse( const DxfToken& token, DxfParser * )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 2:\r\n         m_name = token.data;\r\n         break;\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         break;\r\n   }\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfEntity::DxfEntity(int tag)\r\n{\r\n   m_tag = tag;\r\n}\r\n\r\nvoid DxfEntity::clear()\r\n{\r\n   m_tag = -1;\r\n}\r\n\r\nbool DxfEntity::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 5:\r\n         m_tag = std::stoi(std::string(\"0x\") + token.data);   // tag is in hex\r\n         break;\r\n      case 6:\r\n         m_p_line_type = parser->getLineType( token.data );\r\n         break;\r\n      case 8:\r\n         m_p_layer = parser->getLayer( token.data );\r\n         break;\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         break;\r\n   }\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfVertex::DxfVertex(int tag) : DxfEntity( tag )\r\n{\r\n   x = 0.0;\r\n   y = 0.0;\r\n   z = 0.0;\r\n}\r\n\r\nvoid DxfVertex::clear()\r\n{\r\n   x = 0.0;\r\n   y = 0.0;\r\n   z = 0.0;\r\n\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool operator == (const DxfVertex& a, const DxfVertex& b)\r\n{\r\n   return (a.x == b.x && a.y == b.y && a.z == b.z);\r\n}\r\n\r\nbool operator != (const DxfVertex& a, const DxfVertex& b)\r\n{\r\n   return (a.x != b.x || a.y != b.y || a.z != b.z);\r\n}\r\n\r\nbool DxfVertex::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 10:\r\n         x = std::stod(token.data);\r\n         break;\r\n      case 20:\r\n         y = std::stod(token.data);\r\n         break;\r\n      case 30:\r\n         z = std::stod(token.data);\r\n         break;\r\n      case 0: case 9:   // 0 is standard vertex, 9 is for header section variables\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         parsed = DxfEntity::parse( token, parser ); // base class parse\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfLine::DxfLine(int tag) : DxfEntity( tag )\r\n{\r\n}\r\n\r\nvoid DxfLine::clear()\r\n{\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfLine::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 10:\r\n         m_start.x = std::stod(token.data);\r\n         break;\r\n      case 20:\r\n         m_start.y = std::stod(token.data);\r\n         break;\r\n      case 30:\r\n         m_start.z = std::stod(token.data);\r\n         break;\r\n      case 11:\r\n         m_end.x = std::stod(token.data);\r\n         break;\r\n      case 21:\r\n         m_end.y = std::stod(token.data);\r\n         break;\r\n      case 31:\r\n         m_end.z = std::stod(token.data);\r\n         break;\r\n      case 0:\r\n         add(m_start);  // <- add to region\r\n         add(m_end);    // <- add to region\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         parsed = DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfPolyLine::DxfPolyLine(int tag) : DxfEntity( tag )\r\n{\r\n   clear();\r\n}\r\n\r\nvoid DxfPolyLine::clear()\r\n{\r\n   m_vertex_count = 0;\r\n   m_vertices.clear();\r\n   m_attributes = 0;\r\n\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfPolyLine::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   static DxfVertex vertex;\r\n\r\n   if (m_vertex_count) {\r\n      if ( vertex.parse( token, parser ) ) {\r\n         add(vertex); // <- add to region\r\n         if (m_min.x == 0) {\r\n            std::cerr << \"problem\" << std::endl;\r\n         }\r\n         m_vertices.push_back( vertex );\r\n         if ( token.data == \"VERTEX\" ) {  // Another vertex...\r\n            m_vertex_count++;\r\n         }\r\n         else {   // Should be a SEQEND\r\n            parsed = true;\r\n         }\r\n      }\r\n   }\r\n   else {   // parse the polyline header...\r\n      switch (token.code) {\r\n         case 0:\r\n            if (token.data == \"VERTEX\") {\r\n               m_vertex_count++;\r\n            }\r\n            else {\r\n               parsed = true;\r\n            }\r\n            break;\r\n         case 70:\r\n            m_attributes = std::stoi(token.data);\r\n         default:\r\n            DxfEntity::parse( token, parser ); // base class parse\r\n            break;\r\n      }\r\n   }\r\n   return parsed;\r\n}\r\n\r\nsize_t DxfPolyLine::numVertices() const\r\n{\r\n   return m_vertices.size();\r\n}\r\n\r\nconst DxfVertex& DxfPolyLine::getVertex(int i) const\r\n{\r\n   return m_vertices[i];\r\n}\r\n\r\nint DxfPolyLine::getAttributes() const\r\n{\r\n   return m_attributes;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfLwPolyLine::DxfLwPolyLine(int tag) : DxfPolyLine( tag )\r\n{\r\n   clear();\r\n}\r\n\r\nvoid DxfLwPolyLine::clear()\r\n{\r\n   m_expected_vertex_count = 0;\r\n\r\n   DxfPolyLine::clear();\r\n}\r\n\r\nbool DxfLwPolyLine::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   static DxfVertex vertex;\r\n\r\n   switch (token.code) {\r\n      case 0:\r\n         // push final vertex\r\n         if (m_vertex_count) {\r\n            add(vertex); // <- add vertex to region\r\n            m_vertices.push_back( vertex );\r\n         }\r\n         parsed = true;\r\n         break;\r\n      case 10:\r\n         if (m_vertex_count) {\r\n            // push last vertex\r\n            add(vertex); // <- add vertex to region\r\n            m_vertices.push_back( vertex );\r\n         }\r\n         m_vertex_count++;\r\n         vertex.clear();\r\n         vertex.parse( token, parser );\r\n         break;\r\n      case 20:\r\n      case 30:\r\n         // continue last vertex:\r\n         vertex.parse( token, parser );\r\n         break;\r\n      case 70:\r\n         m_attributes = std::stoi(token.data);\r\n      case 90:\r\n         m_expected_vertex_count = std::stoi(token.data);\r\n      default:\r\n         DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfArc::DxfArc(int tag) : DxfEntity( tag )\r\n{\r\n}\r\n\r\nvoid DxfArc::clear()\r\n{\r\n   m_start = 0.0;\r\n   m_end = 0.0;\r\n\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfArc::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 10:\r\n         m_centre.x = std::stod(token.data);\r\n         break;\r\n      case 20:\r\n         m_centre.y = std::stod(token.data);\r\n         break;\r\n      case 30:\r\n         m_centre.z = std::stod(token.data);\r\n         break;\r\n      case 40:\r\n         m_radius = std::stod(token.data);\r\n         break;\r\n      case 50:\r\n         m_start = std::stod(token.data);\r\n         break;\r\n      case 51:\r\n         m_end = std::stod(token.data);\r\n         break;\r\n      case 0:\r\n         {\r\n            // just loop round if m_start is bigger than m_end\r\n            if (m_start > m_end) {\r\n               m_end += 360;\r\n            }\r\n            // technically should check for arc limits for tighter bounding box,\r\n            // but easier to give circular bounding box\r\n            DxfVertex bounds;\r\n            bounds.x = m_centre.x - m_radius;\r\n            bounds.y = m_centre.y - m_radius;\r\n            bounds.z = m_centre.z;\r\n            add(bounds);  // <- add to region\r\n            bounds.x = m_centre.x + m_radius;\r\n            bounds.y = m_centre.y + m_radius;\r\n            bounds.z = m_centre.z;\r\n            add(bounds);  // <- add to region\r\n            parsed = true;\r\n         }\r\n         break;\r\n      default:\r\n         parsed = DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\nint DxfArc::numSegments(int segments) const\r\n{\r\n   return ((m_start == m_end) ? segments : (int(m_end - m_start) * segments / 360));\r\n}\r\n\r\nDxfVertex DxfArc::getVertex(int i, int segments) const\r\n{\r\n   DxfVertex v = m_centre;\r\n   double range = 2.0 * DXF_PI;\r\n   if(m_start != m_end) range = (m_end - m_start) * DXF_PI / 180.0;\r\n   double ang = range * double(i)/double(segments);\r\n   if (m_start != m_end) {\r\n      ang += 2.0 * DXF_PI * (m_start / 360.0);\r\n   }\r\n   // ARCS go anticlockwise from (1 0)\r\n   v.x = m_centre.x + m_radius * cos(ang);\r\n   v.y = m_centre.y + m_radius * sin(ang);\r\n   v.z = m_centre.z;\r\n   return v;\r\n}\r\n\r\nvoid DxfArc::reflect(double x, double y)\r\n{\r\n   if (x < 0) {\r\n      m_start = 180 - m_start;\r\n      m_end = 180 - m_end;\r\n   }\r\n   if (y < 0) {\r\n      m_start = 360 - m_start;\r\n      m_end = 360 - m_end;\r\n   }\r\n   while (m_start < 0) {\r\n      m_start += 360;\r\n   }\r\n   while (m_end < 0) {\r\n      m_end += 360;\r\n   }\r\n   if (x * y < 0) {\r\n      double temp;\r\n      temp = m_start;\r\n      m_start = m_end;\r\n      m_end = temp;\r\n   }\r\n}\r\n\r\n\r\nDxfEllipse::DxfEllipse(int tag) : DxfEntity( tag )\r\n{\r\n}\r\n\r\nvoid DxfEllipse::clear()\r\n{\r\n   m_start = 0.0;\r\n   m_end = 0.0;\r\n\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfEllipse::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 10:\r\n         m_centre.x = std::stod(token.data);\r\n         break;\r\n      case 20:\r\n         m_centre.y = std::stod(token.data);\r\n         break;\r\n      case 30:\r\n         m_centre.z = std::stod(token.data);\r\n         break;\r\n      case 11:\r\n         m_majorAxisEndPoint.x = std::stod(token.data);\r\n         break;\r\n      case 21:\r\n         m_majorAxisEndPoint.y = std::stod(token.data);\r\n         break;\r\n      case 31:\r\n         m_majorAxisEndPoint.z = std::stod(token.data);\r\n         break;\r\n      case 210:\r\n         m_extrusionDirection.x = std::stod(token.data);\r\n         break;\r\n      case 220:\r\n         m_extrusionDirection.y = std::stod(token.data);\r\n         break;\r\n      case 230:\r\n         m_extrusionDirection.z = std::stod(token.data);\r\n         break;\r\n      case 40:\r\n         m_minorMajorAxisRatio = std::stod(token.data);\r\n         break;\r\n      case 41:\r\n         m_start = std::stod(token.data);\r\n         break;\r\n      case 42:\r\n         m_end = std::stod(token.data);\r\n         break;\r\n      case 0:\r\n         {\r\n            // just loop round if m_start is bigger than m_end\r\n            if (m_start > m_end) {\r\n               m_end += 360;\r\n            }\r\n            // technically should check for ellipse limits for tighter bounding box,\r\n            // but easier to give circular bounding box\r\n            DxfVertex bounds;\r\n            double xdiff = fabs(m_majorAxisEndPoint.x);\r\n            double ydiff = fabs(m_majorAxisEndPoint.y);\r\n            bounds.x = m_centre.x - xdiff;\r\n            bounds.y = m_centre.y - ydiff;\r\n            bounds.z = m_centre.z;\r\n            add(bounds);  // <- add to region\r\n            bounds.x = m_centre.x + xdiff;\r\n            bounds.y = m_centre.y + ydiff;\r\n            bounds.z = m_centre.z;\r\n            add(bounds);  // <- add to region\r\n            parsed = true;\r\n         }\r\n         break;\r\n      default:\r\n         parsed = DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\nint DxfEllipse::numSegments(int segments) const\r\n{\r\n   return ((m_start == m_end) ? segments : (int(m_end - m_start) * segments / (2 * DXF_PI)));\r\n}\r\n\r\nDxfVertex DxfEllipse::getVertex(int i, int segments) const\r\n{\r\n   DxfVertex v = m_centre;\r\n   double range = 2.0 * DXF_PI;\r\n   if(m_start != m_end) range = (m_end - m_start);\r\n   double ang = m_start + range * double(i)/double(segments);\r\n\r\n   double c = cos(ang);\r\n   double s = sin(ang);\r\n\r\n   double reverse = 1;\r\n   if(m_extrusionDirection.z < 0) reverse = -1;\r\n\r\n   double xnew = c * m_majorAxisEndPoint.x -\r\n           m_minorMajorAxisRatio * s * m_majorAxisEndPoint.y;\r\n   double ynew = c * m_majorAxisEndPoint.y +\r\n           reverse * m_minorMajorAxisRatio * s * m_majorAxisEndPoint.x;\r\n\r\n   v.x = m_centre.x + xnew;\r\n   v.y = m_centre.y + ynew;\r\n   v.z = m_centre.z;\r\n   return v;\r\n}\r\n\r\nvoid DxfEllipse::reflect(double x, double y)\r\n{\r\n   if (x < 0) {\r\n      m_start = 180 - m_start;\r\n      m_end = 180 - m_end;\r\n   }\r\n   if (y < 0) {\r\n      m_start = 360 - m_start;\r\n      m_end = 360 - m_end;\r\n   }\r\n   while (m_start < 0) {\r\n      m_start += 360;\r\n   }\r\n   while (m_end < 0) {\r\n      m_end += 360;\r\n   }\r\n   if (x * y < 0) {\r\n      double temp;\r\n      temp = m_start;\r\n      m_start = m_end;\r\n      m_end = temp;\r\n   }\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\nDxfCircle::DxfCircle(int tag) : DxfEntity( tag )\r\n{\r\n}\r\n\r\nvoid DxfCircle::clear()\r\n{\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfCircle::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 10:\r\n         m_centre.x = std::stod(token.data);\r\n         break;\r\n      case 20:\r\n         m_centre.y = std::stod(token.data);\r\n         break;\r\n      case 30:\r\n         m_centre.z = std::stod(token.data);\r\n         break;\r\n      case 40:\r\n         m_radius = std::stod(token.data);\r\n         break;\r\n      case 0:\r\n         {\r\n            DxfVertex bounds;\r\n            bounds.x = m_centre.x - m_radius;\r\n            bounds.y = m_centre.y - m_radius;\r\n            bounds.z = m_centre.z;\r\n            add(bounds);  // <- add to region\r\n            bounds.x = m_centre.x + m_radius;\r\n            bounds.y = m_centre.y + m_radius;\r\n            bounds.z = m_centre.z;\r\n            add(bounds);  // <- add to region\r\n            parsed = true;\r\n         }\r\n         break;\r\n      default:\r\n         parsed = DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\nDxfVertex DxfCircle::getVertex(int i, int segments) const\r\n{\r\n   DxfVertex v = m_centre;\r\n   double ang = 2.0 * DXF_PI * double(i)/double(segments);\r\n   // CIRCLES go anticlockwise from (1 0)\r\n   v.x = m_centre.x + m_radius * cos(ang);\r\n   v.y = m_centre.y + m_radius * sin(ang);\r\n   v.z = m_centre.z;\r\n   return v;\r\n}\r\n\r\nvoid DxfCircle::reflect(double , double )\r\n{\r\n   // reflect has no effect on a circle\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////\r\n\r\n// Spline\r\n// n.b. currently just linear interpolation between control points -\r\n// not good, but whatever method will have to make some sort of approximation at some point\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfSpline::DxfSpline(int tag) : DxfEntity( tag )\r\n{\r\n   clear();\r\n}\r\n\r\nvoid DxfSpline::clear()\r\n{\r\n   m_xyz = 0;\r\n   m_ctrl_pt_count = 0;\r\n   m_knot_count = 0;\r\n   m_ctrl_pts.clear();\r\n   m_knots.clear();\r\n   m_attributes = 0;\r\n\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfSpline::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   static DxfVertex vertex;\r\n\r\n   switch (token.code) {\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      case 70:\r\n         m_attributes = std::stoi(token.data);\r\n         break;\r\n      case 72:\r\n         m_knot_count = std::stoi(token.data);\r\n         break;\r\n      case 73:\r\n         m_ctrl_pt_count = std::stoi(token.data);\r\n         break;\r\n      case 40:\r\n         m_knots.push_back( std::stod(token.data) );\r\n      case 10:\r\n         vertex.x = std::stod(token.data);\r\n         m_xyz |= 0x0001;\r\n         break;\r\n      case 20:\r\n         vertex.y = std::stod(token.data);\r\n         m_xyz |= 0x0010;\r\n         break;\r\n      case 30:\r\n         vertex.z = std::stod(token.data);\r\n         m_xyz |= 0x0100;\r\n         break;\r\n      default:\r\n         DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n\r\n   if (m_xyz == 0x0111) {\r\n      add(vertex); // <- add vertex to region\r\n      m_ctrl_pts.push_back( vertex );\r\n      m_xyz = 0;\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\n// Note: return control points not actual points!\r\n\r\nsize_t DxfSpline::numVertices() const\r\n{\r\n   return m_ctrl_pts.size();\r\n}\r\n\r\nconst DxfVertex& DxfSpline::getVertex(size_t i) const\r\n{\r\n   return m_ctrl_pts[i];\r\n}\r\n\r\nint DxfSpline::getAttributes() const\r\n{\r\n   return m_attributes;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// note: inserts are flattened on way through\r\n\r\nDxfInsert::DxfInsert(int tag) : DxfEntity( tag )\r\n{\r\n   clear();\r\n}\r\n\r\nvoid DxfInsert::clear()\r\n{\r\n   m_blockName = \"\";\r\n   m_translation.clear();\r\n   m_scale.clear();\r\n\r\n   // actually default scale is 1,1,1\r\n   m_scale.x = 1.0;\r\n   m_scale.y = 1.0;\r\n   m_scale.z = 1.0;\r\n\r\n   m_rotation = 0.0;\r\n\r\n   DxfRegion::clear();\r\n   DxfEntity::clear();\r\n}\r\n\r\nbool DxfInsert::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      case 2:\r\n         m_blockName = token.data;\r\n         break;\r\n      case 10:\r\n         m_translation.x = std::stod(token.data);\r\n         break;\r\n      case 20:\r\n         m_translation.y = std::stod(token.data);\r\n         break;\r\n      case 30:\r\n         m_translation.z = std::stod(token.data);\r\n         break;\r\n      case 41:\r\n         m_scale.x = std::stod(token.data);\r\n         break;\r\n      case 42:\r\n         m_scale.y = std::stod(token.data);\r\n         break;\r\n      case 43:\r\n         m_scale.z = std::stod(token.data);\r\n         break;\r\n      case 50:\r\n         m_rotation = std::stod(token.data);\r\n         break;\r\n      default:\r\n         DxfEntity::parse( token, parser ); // base class parse\r\n         break;\r\n   }\r\n\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfLineType::DxfLineType(const std::string& name) : DxfTableRow( name )\r\n{\r\n}\r\n\r\nbool DxfLineType::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         parsed = DxfTableRow::parse( token, parser ); // base class parse\r\n   }\r\n   return parsed;\r\n}\r\n\r\nDxfVertex& DxfLine::getStart() const\r\n{\r\n   return (DxfVertex&) m_start;\r\n}\r\n\r\nDxfVertex& DxfLine::getEnd() const\r\n{\r\n   return (DxfVertex&) m_end;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfLayer::DxfLayer(const std::string& name) : DxfTableRow( name )\r\n{\r\n   m_total_line_count = 0;\r\n}\r\n\r\nbool DxfLayer::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         parsed = DxfTableRow::parse( token, parser ); // base class parse\r\n   }\r\n   return parsed;\r\n}\r\n\r\nconst DxfVertex& DxfLayer::getPoint( int i ) const\r\n{\r\n   return m_points[i];\r\n}\r\n\r\nconst DxfLine& DxfLayer::getLine( int i ) const\r\n{\r\n   return m_lines[i];\r\n}\r\n\r\nconst DxfPolyLine& DxfLayer::getPolyLine( int i ) const\r\n{\r\n   return m_poly_lines[i];\r\n}\r\n\r\nconst DxfArc& DxfLayer::getArc( int i ) const\r\n{\r\n   return m_arcs[i];\r\n}\r\n\r\nconst DxfEllipse& DxfLayer::getEllipse( int i ) const\r\n{\r\n   return m_ellipses[i];\r\n}\r\n\r\nconst DxfCircle& DxfLayer::getCircle( int i ) const\r\n{\r\n   return m_circles[i];\r\n}\r\n\r\nconst DxfSpline& DxfLayer::getSpline( int i ) const\r\n{\r\n   return m_splines[i];\r\n}\r\n\r\nsize_t DxfLayer::numPoints() const\r\n{\r\n   return m_points.size();\r\n}\r\n\r\nsize_t  DxfLayer::numLines() const\r\n{\r\n   return m_lines.size();\r\n}\r\n\r\nsize_t DxfLayer::numPolyLines() const\r\n{\r\n   return m_poly_lines.size();\r\n}\r\n\r\nsize_t DxfLayer::numArcs() const\r\n{\r\n   return m_arcs.size();\r\n}\r\n\r\nsize_t DxfLayer::numEllipses() const\r\n{\r\n   return m_ellipses.size();\r\n}\r\n\r\nsize_t DxfLayer::numCircles() const\r\n{\r\n   return m_circles.size();\r\n}\r\n\r\nsize_t DxfLayer::numSplines() const\r\n{\r\n   return m_splines.size();\r\n}\r\n\r\nvoid DxfLayer::insert(DxfInsert& insert, DxfParser *parser)\r\n{\r\n   size_t i;\r\n\r\n   // munge in insert...\r\n   bool scale = (insert.m_scale.x != 1.0 || insert.m_scale.y != 1.0 || insert.m_scale.z != 1.0);\r\n   bool rotate = (insert.m_rotation != 0.0 && insert.m_rotation < 359.9999999);\r\n   if (insert.m_rotation < 0) {\r\n     insert.m_rotation += 360;\r\n   }\r\n\r\n   // lookup in blocks table\r\n   if (!parser->m_blocks.count(insert.m_blockName)) {\r\n       // throw exception\r\n   }\r\n   DxfBlock &block = parser->m_blocks[insert.m_blockName];\r\n\r\n   // unwind deeper inserts\r\n   for(i = 0; i < block.m_inserts.size(); i++) {\r\n       block.insert( block.m_inserts[i], parser);\r\n   }\r\n   // delete inserts at this level to avoid re-inserting them\r\n   // if the block is re-inserted\r\n   block.m_inserts.clear();\r\n\r\n   for (i = 0; i < block.m_lines.size(); i++) {\r\n      m_lines.push_back(block.m_lines[i]);\r\n      // rotate, translate, scale each line as specified in the insert\r\n      if (scale)\r\n         m_lines.back().scale(block.m_base_point,insert.m_scale);\r\n      if (rotate)\r\n         m_lines.back().rotate(block.m_base_point,insert.m_rotation);\r\n      m_lines.back().translate(insert.m_translation);\r\n      merge(m_lines.back()); // <- merge bounding box\r\n   }\r\n   for (i = 0; i < block.m_poly_lines.size(); i++) {\r\n      m_poly_lines.push_back(block.m_poly_lines[i]);\r\n      // rotate, translate, scale each line as specified in the insert\r\n      if (scale)\r\n         m_poly_lines.back().scale(block.m_base_point,insert.m_scale);\r\n      if (rotate)\r\n         m_poly_lines.back().rotate(block.m_base_point,insert.m_rotation);\r\n      m_poly_lines.back().translate(insert.m_translation);\r\n      merge(m_poly_lines.back()); // <- merge bounding box\r\n   }\r\n   for (i = 0; i < block.m_arcs.size(); i++) {\r\n      m_arcs.push_back(block.m_arcs[i]);\r\n      // rotate, translate, scale each line as specified in the insert\r\n      if (scale)\r\n         m_arcs.back().scale(block.m_base_point,insert.m_scale);\r\n      if (rotate)\r\n         m_arcs.back().rotate(block.m_base_point,insert.m_rotation);\r\n      m_arcs.back().translate(insert.m_translation);\r\n      merge(m_arcs.back()); // <- merge bounding box\r\n   }\r\n   for (i = 0; i < block.m_ellipses.size(); i++) {\r\n      m_ellipses.push_back(block.m_ellipses[i]);\r\n      // rotate, translate, scale each line as specified in the insert\r\n      if (scale)\r\n         m_ellipses.back().scale(block.m_base_point,insert.m_scale);\r\n      if (rotate)\r\n         m_ellipses.back().rotate(block.m_base_point,insert.m_rotation);\r\n      m_ellipses.back().translate(insert.m_translation);\r\n      merge(m_ellipses.back()); // <- merge bounding box\r\n   }\r\n   for (i = 0; i < block.m_circles.size(); i++) {\r\n      m_circles.push_back(block.m_circles[i]);\r\n      // rotate, translate, scale each line as specified in the insert\r\n      if (scale)\r\n         m_circles.back().scale(block.m_base_point,insert.m_scale);\r\n      // n.b., rotate does nothing with circles\r\n      if (rotate)\r\n         m_circles.back().rotate(block.m_base_point,insert.m_rotation);\r\n      m_circles.back().translate(insert.m_translation);\r\n      merge(m_circles.back()); // <- merge bounding box\r\n   }\r\n   for (i = 0; i < block.m_splines.size(); i++) {\r\n      m_splines.push_back(block.m_splines[i]);\r\n      // rotate, translate, scale each line as specified in the insert\r\n      if (scale)\r\n         m_splines.back().scale(block.m_base_point,insert.m_scale);\r\n      if (rotate)\r\n         m_splines.back().rotate(block.m_base_point,insert.m_rotation);\r\n      m_splines.back().translate(insert.m_translation);\r\n      merge(m_splines.back()); // <- merge bounding box\r\n   }\r\n\r\n   m_total_line_count += block.m_total_line_count;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfBlock::DxfBlock(const std::string& name) : DxfLayer( name )\r\n{\r\n}\r\n\r\nbool DxfBlock::parse( const DxfToken& token, DxfParser *parser )\r\n{\r\n   bool parsed = false;\r\n\r\n   switch (token.code) {\r\n      case 0:\r\n         parsed = true;\r\n         break;\r\n      default:\r\n         parsed = DxfLayer::parse( token, parser ); // base class parse\r\n   }\r\n   return parsed;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nDxfToken::DxfToken()\r\n{\r\n   size = 0;\r\n   code = -1;\r\n}\r\n\r\nstd::istream& operator >> (std::istream& stream, DxfToken& token)\r\n{\r\n    std::string codeInputLine;\r\n    std::getline(stream,codeInputLine);\r\n    token.code = std::stoi(codeInputLine);\r\n    std::string dataInputLine;\r\n    std::getline(stream,dataInputLine);\r\n    dXstring::ltrim(dataInputLine,'\\r');\r\n    dXstring::ltrim(dataInputLine,'\\n');\r\n    dXstring::rtrim(dataInputLine,'\\r');\r\n    dXstring::rtrim(dataInputLine,'\\n');\r\n    token.data = dataInputLine;\r\n    token.size = codeInputLine.length() + token.data.length() + 2;   // might be missing a few end line characters --- never mind\r\n    return stream;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n"
  },
  {
    "path": "salalib/parsers/dxfp.h",
    "content": "// genlib - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// DXF parser header file\r\n\r\n#pragma once\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// DXF parser reads in DXF files\r\n// So far very simple:\r\n// The parser reads in vertices, lines and polylines, and stores them in the\r\n// defined layers.  It also reads in any line types defined.\r\n\r\n#include <math.h>\r\n#include <map>\r\n#include <vector>\r\n\r\nclass DxfToken;\r\n\r\nclass DxfTableRow;\r\nclass DxfEntity;\r\n\r\nclass DxfVertex;\r\nclass DxfLine;\r\nclass DxfPolyLine;\r\nclass DxfArc;\r\nclass DxfCircle;\r\nclass DxfSpline;\r\n\r\nclass DxfInsert;\r\n\r\nclass DxfLineType;\r\nclass DxfLayer;\r\nclass DxfBlock;\r\n\r\nclass DxfParser;\r\n\r\n#include <fstream>\r\n\r\nconst double DXF_PI = 3.1415926535897932384626433832795;\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Tokens read from file\r\n\r\nclass DxfToken {\r\npublic:\r\n   int code;\r\n   size_t size;\r\n   std::string data;\r\n   //\r\n   DxfToken();\r\n   friend std::istream& operator >> (std::istream& stream, DxfToken& token);\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Table (row) base classes\r\n\r\nclass DxfTableRow\r\n{\r\n   friend class DxfParser;\r\nprotected:\r\n   std::string m_name;\r\npublic:\r\n   DxfTableRow( const std::string& name = \"\" );\r\n   const std::string& getName() const\r\n      { return m_name; }\r\n   virtual ~DxfTableRow(){}\r\nprotected:\r\n   virtual bool parse( const DxfToken& token, DxfParser *Parser );\r\npublic:\r\n   // for hash table storage\r\n   friend bool operator > (const DxfTableRow&, const DxfTableRow& );\r\n   friend bool operator < (const DxfTableRow&, const DxfTableRow& );\r\n   friend bool operator == (const DxfTableRow&, const DxfTableRow& );\r\n};\r\n\r\n// Entity base class\r\n\r\nclass DxfEntity\r\n{\r\n   friend class DxfParser;\r\nprotected:\r\n   // Reference data\r\n   int m_tag;\r\n   DxfLineType *m_p_line_type;\r\n   DxfLayer *m_p_layer;\r\npublic:\r\n   DxfEntity( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   virtual ~DxfEntity(){}\r\nprotected:\r\n   virtual bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n// Three very simple 'entities'...\r\n\r\n// Vertex\r\n\r\nclass DxfVertex : public DxfEntity\r\n{\r\n   friend class DxfParser;\r\n   friend class DxfLine;\r\n   friend class DxfPolyLine;\r\n   friend class DxfLwPolyLine;\r\npublic:\r\n   double x;\r\n   double y;\r\n   double z;\r\npublic:\r\n   DxfVertex( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   // some simple manipulation\r\n   // note, all ops are 2d...\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { x = (x - base_vertex.x) * scale.x + base_vertex.x;\r\n     y = (y - base_vertex.y) * scale.y + base_vertex.y; }\r\n   // note, rotation is 2d op, angle in degrees, ccw\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   { DxfVertex reg; double ang = (2.0 * DXF_PI * angle / 360.0);\r\n     reg.x = (x - base_vertex.x) * cos(ang) - (y - base_vertex.y) * sin(ang);\r\n     reg.y = (y - base_vertex.y) * cos(ang) + (x - base_vertex.x) * sin(ang);\r\n     x = reg.x + base_vertex.x; y = reg.y + base_vertex.y; }\r\n   void translate(const DxfVertex& translation)\r\n   { x += translation.x;\r\n     y += translation.y; }\r\n   //\r\n   friend bool operator == (const DxfVertex& a, const DxfVertex& b);\r\n   friend bool operator != (const DxfVertex& a, const DxfVertex& b);\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Helper: a bounding box region (only 2D at present)\r\n\r\nclass DxfRegion {\r\nprotected:\r\n   bool m_first;\r\n   DxfVertex m_min;\r\n   DxfVertex m_max;\r\npublic:\r\n   DxfRegion()\r\n      { m_first = true; }\r\n   void add(const DxfVertex& v)\r\n   {\r\n      if (m_first) {\r\n         m_min = v; m_max = v;\r\n         m_first = false;\r\n      }\r\n      if (v.x < m_min.x)\r\n         m_min.x = v.x;\r\n      if (v.x > m_max.x)\r\n         m_max.x = v.x;\r\n      if (v.y < m_min.y)\r\n         m_min.y = v.y;\r\n      if (v.y > m_max.y)\r\n         m_max.y = v.y;\r\n   }\r\n   void merge(const DxfVertex& point)\r\n      { add(point); }\r\n   void merge(const DxfRegion& region)\r\n      { add(region.m_min); add(region.m_max); }\r\n   const DxfVertex& getExtMin() const\r\n      { return m_min; }\r\n   const DxfVertex& getExtMax() const\r\n      { return m_max; }\r\n   void clear()\r\n      { m_first = true; }\r\n   bool empty() const\r\n      { return m_first; }\r\n   //\r\n   // some simple manipulations\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { m_min.scale(base_vertex, scale); m_max.scale(base_vertex, scale); }\r\n   // rotate tricky...\r\n   void rotate(const DxfVertex&, double)\r\n   { ; }\r\n   void translate(const DxfVertex& translation)\r\n   { m_min.translate(translation); m_max.translate(translation); }\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Line\r\n\r\nclass DxfLine : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\nprotected:\r\n   DxfVertex m_start;\r\n   DxfVertex m_end;\r\npublic:\r\n   DxfLine( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   //\r\n   DxfVertex& getStart() const;\r\n   DxfVertex& getEnd() const;\r\n   //\r\n   // some basic manipulation\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { m_start.scale(base_vertex, scale); m_end.scale(base_vertex, scale);\r\n     DxfRegion::scale(base_vertex, scale); }\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   { m_start.rotate(base_vertex, angle); m_end.rotate(base_vertex, angle);\r\n     DxfRegion::rotate(base_vertex, angle); }\r\n   void translate(const DxfVertex& translation)\r\n   { m_start.translate(translation); m_end.translate(translation);\r\n     DxfRegion::translate(translation); }\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n// PolyLine\r\n\r\nclass DxfPolyLine : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\npublic:\r\n   enum { CLOSED = 1 }; // CLOSED = closed polygon\r\nprotected:\r\n   int m_attributes;\r\n   int m_vertex_count;\r\n   std::vector<DxfVertex> m_vertices;\r\npublic:\r\n   DxfPolyLine( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   //\r\n   size_t numVertices() const;\r\n   const DxfVertex& getVertex(int i) const;\r\n   int getAttributes() const;\r\n   const DxfRegion& getBoundingBox();\r\n   //\r\n   // some basic manipulation\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { for (int i = 0; i < m_vertex_count; i++)\r\n        m_vertices[i].scale(base_vertex, scale);\r\n     DxfRegion::scale(base_vertex, scale); }\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   { for (int i = 0; i < m_vertex_count; i++)\r\n        m_vertices[i].rotate(base_vertex, angle);\r\n     DxfRegion::rotate(base_vertex, angle); }\r\n   void translate(const DxfVertex& translation)\r\n   { for (int i = 0; i < m_vertex_count; i++)\r\n        m_vertices[i].translate(translation);\r\n     DxfRegion::translate(translation); }\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n// LwPolyLine --- just inherit from DxfPolyLine\r\n\r\nclass DxfLwPolyLine : public DxfPolyLine\r\n{\r\n   friend class DxfParser;\r\n   //\r\nprotected:\r\n   int m_expected_vertex_count;\r\npublic:\r\n   DxfLwPolyLine( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Arcs and Cicles\r\n\r\nclass DxfArc : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\n   DxfVertex m_centre;\r\n   double m_radius;\r\n   mutable double m_start;\r\n   double m_end;\r\npublic:\r\n   DxfArc( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   // getVertex splits into number of segments\r\n   int numSegments(int segments) const;\r\n   DxfVertex getVertex(int i, int segments) const;\r\n   const DxfVertex& getCentre() const\r\n   { return m_centre; }\r\n   const double& getRadius() const\r\n   { return m_radius; }\r\n   int getAttributes() const;\r\n   const DxfRegion& getBoundingBox();\r\n   //\r\n   // some basic manipulation\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { m_centre.scale(base_vertex, scale); m_radius *= (fabs(scale.x) + fabs(scale.y)) / 2.0;\r\n     // this is rather tricky to do, need to think more than just reflect around 0,0,0\r\n     if (m_start != m_end && (scale.x < 0 || scale.y < 0)) {\r\n        reflect(scale.x, scale.y);\r\n     }\r\n     DxfRegion::scale(base_vertex, scale);\r\n   }\r\n   void reflect(double x, double y);\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   { m_centre.rotate(base_vertex, angle);\r\n     // this is rather tricky to do, need to think more than just rotate around 0,0,0\r\n     if (m_start != m_end) {\r\n        m_start += angle; m_end += angle;\r\n     }\r\n     DxfRegion::rotate(base_vertex, angle);\r\n   }\r\n   void translate(const DxfVertex& translation)\r\n   { m_centre.translate(translation);\r\n     DxfRegion::translate(translation); }\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n\r\nclass DxfEllipse : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\n   DxfVertex m_centre;\r\n   DxfVertex m_majorAxisEndPoint;\r\n   DxfVertex m_extrusionDirection;\r\n   double m_minorMajorAxisRatio;\r\n   mutable double m_start;\r\n   double m_end;\r\npublic:\r\n   DxfEllipse( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   // getVertex splits into number of segments\r\n   int numSegments(int segments) const;\r\n   DxfVertex getVertex(int i, int segments) const;\r\n   const DxfVertex& getCentre() const\r\n   { return m_centre; }\r\n   const double& getMinorMajorAxisRatio() const\r\n   { return m_minorMajorAxisRatio; }\r\n   int getAttributes() const;\r\n   const DxfRegion& getBoundingBox();\r\n   //\r\n   // some basic manipulation\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { m_centre.scale(base_vertex, scale);\r\n\r\n       m_majorAxisEndPoint.x *= scale.x;\r\n       m_majorAxisEndPoint.y *= scale.y;\r\n\r\n     // this is rather tricky to do, need to think more than just reflect around 0,0,0\r\n     if (m_start != m_end && (scale.x < 0 || scale.y < 0)) {\r\n        reflect(scale.x, scale.y);\r\n     }\r\n     DxfRegion::scale(base_vertex, scale);\r\n   }\r\n   void reflect(double x, double y);\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   { m_centre.rotate(base_vertex, angle);\r\n     // this is rather tricky to do, need to think more than just rotate around 0,0,0\r\n     if (m_start != m_end) {\r\n        m_start += angle; m_end += angle;\r\n     }\r\n     DxfRegion::rotate(base_vertex, angle);\r\n   }\r\n   void translate(const DxfVertex& translation)\r\n   { m_centre.translate(translation);\r\n     DxfRegion::translate(translation); }\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\nclass DxfCircle : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\n   DxfVertex m_centre;\r\n   double m_radius;\r\npublic:\r\n   DxfCircle( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   DxfVertex getVertex(int i, int segments) const;\r\n   const DxfVertex& getCentre() const\r\n   { return m_centre; }\r\n   const double& getRadius() const\r\n   { return m_radius; }\r\n   int getAttributes() const;\r\n   const DxfRegion& getBoundingBox();\r\n   //\r\n   // some basic manipulation\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { m_centre.scale(base_vertex, scale); m_radius *= (fabs(scale.x) + fabs(scale.y)) / 2.0;\r\n     DxfRegion::scale(base_vertex, scale);\r\n   }\r\n   void reflect(double x, double y);\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   {\r\n      DxfRegion::rotate(base_vertex, angle);\r\n   }\r\n   void translate(const DxfVertex& translation)\r\n   { m_centre.translate(translation);\r\n     DxfRegion::translate(translation); }\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Spline\r\n// n.b. currently just linear interpolation between control points -\r\n// not good, but whatever method will have to make some sort of approximation at some point\r\n\r\nclass DxfSpline : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\npublic:\r\n   enum { CLOSED = 1 }; // CLOSED = closed spline\r\nprotected:\r\n   int m_xyz;\r\n   int m_attributes;\r\n   int m_ctrl_pt_count;\r\n   int m_knot_count;\r\n   std::vector<DxfVertex> m_ctrl_pts;\r\n   std::vector<double> m_knots;\r\npublic:\r\n   DxfSpline( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   //\r\n   size_t numVertices() const;\r\n   const DxfVertex& getVertex(size_t i) const;\r\n   int getAttributes() const;\r\n   //\r\n   // some basic manipulation\r\n   void scale(const DxfVertex& base_vertex, const DxfVertex& scale)\r\n   { for (int i = 0; i < m_ctrl_pt_count; i++)\r\n        m_ctrl_pts[i].scale(base_vertex, scale);\r\n     DxfRegion::scale(base_vertex, scale); }\r\n   void rotate(const DxfVertex& base_vertex, double angle)\r\n   { for (int i = 0; i < m_ctrl_pt_count; i++)\r\n        m_ctrl_pts[i].rotate(base_vertex, angle);\r\n     DxfRegion::rotate(base_vertex, angle); }\r\n   void translate(const DxfVertex& translation)\r\n   { for (int i = 0; i < m_ctrl_pt_count; i++)\r\n        m_ctrl_pts[i].translate(translation);\r\n     DxfRegion::translate(translation); }\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Inserts... these are flattened at parse-time and not retained in layers\r\n\r\nclass DxfInsert : public DxfEntity, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\n   friend class DxfLayer;\r\nprotected:\r\n   std::string m_blockName;\r\n   DxfVertex m_translation;\r\n   DxfVertex m_scale;\r\n   double m_rotation;\r\npublic:\r\n   DxfInsert( int tag = -1 );\r\n   void clear();  // for reuse when parsing\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\n// Two very simple 'table' entries:\r\n\r\n// Line types\r\n\r\nclass DxfLineType : public DxfTableRow\r\n{\r\n   friend class DxfParser;\r\npublic:\r\n   DxfLineType( const std::string& name = \"\" );\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n// Layers\r\n\r\nclass DxfLayer : public DxfTableRow, public DxfRegion\r\n{\r\n   friend class DxfParser;\r\nprotected:\r\n   // Originally was going to be clever, but it's far easier to have a list for each type:\r\n   std::vector<DxfVertex>   m_points;\r\n   std::vector<DxfLine>     m_lines;\r\n   std::vector<DxfPolyLine> m_poly_lines;\r\n   std::vector<DxfArc>      m_arcs;\r\n   std::vector<DxfEllipse>  m_ellipses;\r\n   std::vector<DxfCircle>   m_circles;\r\n   std::vector<DxfSpline>   m_splines;\r\n   std::vector<DxfInsert>   m_inserts;\r\n   size_t                   m_total_point_count = 0;\r\n   size_t                   m_total_line_count = 0;\r\npublic:\r\n   DxfLayer( const std::string& name = \"\" );\r\n   //\r\n   const DxfVertex& getPoint( int i ) const;\r\n   const DxfLine& getLine( int i ) const;\r\n   const DxfPolyLine& getPolyLine( int i ) const;\r\n   const DxfArc& getArc( int i ) const;\r\n   const DxfEllipse& getEllipse( int i ) const;\r\n   const DxfCircle& getCircle( int i ) const;\r\n   const DxfSpline& getSpline( int i ) const;\r\n   //\r\n   size_t numPoints() const;\r\n   size_t numLines() const;\r\n   size_t numPolyLines() const;\r\n   size_t numArcs() const;\r\n   size_t numEllipses() const;\r\n   size_t numCircles() const;\r\n   size_t numSplines() const;\r\n   //\r\n   size_t numTotalPoints() const\r\n      { return m_total_point_count; }\r\n   size_t numTotalLines() const\r\n      { return m_total_line_count; }\r\n   //\r\n   // this merges an insert (so the insert remains flattened)\r\n   void insert(DxfInsert& insert, DxfParser *parser);\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\nclass DxfBlock : public DxfLayer\r\n{\r\n   friend class DxfParser;\r\n   friend class DxfLayer;\r\nprotected:\r\n   DxfVertex m_base_point;\r\npublic:\r\n   DxfBlock( const std::string& name = \"\" );\r\n   //\r\nprotected:\r\n   bool parse( const DxfToken& token, DxfParser *parser );\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nclass Communicator;\r\n\r\nclass DxfParser {\r\n   friend class DxfInsert;\r\n   friend class DxfLayer;\r\npublic:\r\n   enum token_t { UNIDENTIFIED = -2, ZEROTOKEN = -1 };\r\n   enum section_t { HEADER, CLASSES, TABLES, BLOCKS, ENTITIES, OBJECTS, _EOF };\r\n   enum subsection_t { EXTMIN, EXTMAX,\r\n                       LTYPE_TABLE, LTYPE_ROW, LAYER_TABLE, LAYER_ROW, BLOCK,\r\n                       POINT, LINE, POLYLINE, LWPOLYLINE, ARC, ELLIPSE, CIRCLE, SPLINE, INSERT, VERTEX,\r\n                       ENDSEC };\r\nprotected:\r\n   time_t            m_time;\r\nprotected:\r\n   DxfRegion              m_region;\r\n   std::map<std::string, DxfLayer>     m_layers;\r\n   std::map<std::string, DxfBlock>     m_blocks;\r\n   std::map<std::string, DxfLineType>  m_line_types;\r\n   //\r\n   size_t m_size;\r\n   Communicator *m_communicator;\r\npublic:\r\n   DxfParser(Communicator *comm = NULL);\r\n   //\r\n   std::istream& open( std::istream& stream );\r\n   //\r\n   void openHeader( std::istream& stream );\r\n   void openTables( std::istream& stream );\r\n   void openBlocks( std::istream& stream );\r\n   void openEntities( std::istream& stream, DxfToken& token, DxfBlock *block = NULL ); // cannot have a default token: it's a reference.  Removed default to DxfToken() AT 29.04.11\r\n   //\r\n   const DxfVertex& getExtMin() const;\r\n   const DxfVertex& getExtMax() const;\r\n   DxfLayer *getLayer( const std::string& layer_name ); // const; <- removed as will have to add layer when DXF hasn't declared one\r\n   DxfLineType *getLineType( const std::string& line_type_name ); // const;\r\n   //\r\n   size_t numLayers() const;\r\n   size_t numLineTypes() const;\r\n   //\r\n   friend std::istream& operator >> (std::istream& stream, DxfParser& dxfp);\r\n\r\n   std::map<std::string, DxfLayer> getLayers() { return m_layers; }\r\n};\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n"
  },
  {
    "path": "salalib/parsers/mapinfodata.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n#include \"mapinfodata.h\"\r\n#include \"salalib/mgraph.h\"\r\n#include \"salalib/shapemap.h\"\r\n#include \"salalib/axialmap.h\"\r\n\r\n#include <numeric>\r\n\r\nint MapInfoData::import(std::istream& miffile, std::istream& midfile, ShapeMap& map)\r\n{\r\n   int mapLoaded = MINFO_OK;\r\n\r\n   // read the header...\r\n   if (!readheader(miffile)) {\r\n      return MINFO_HEADER;\r\n   }\r\n\r\n   std::vector<std::string> columnheads;\r\n\r\n   AttributeTable& attributes = map.getAttributeTable();\r\n\r\n   // read mif table\r\n   if (!readcolumnheaders(miffile, columnheads)) {\r\n      return MINFO_TABLE;\r\n   }\r\n\r\n   // set up a list of readable columns from the headers:\r\n   // \r\n   std::vector<std::string> colnames;\r\n   std::vector<size_t> readable, colindexes;\r\n   for (size_t i = 0; i < columnheads.size(); i++) {\r\n      dXstring::ltrim(columnheads[i]);\r\n      auto tokens = dXstring::split(columnheads[i], ' ',true);\r\n      if (dXstring::beginsWith<std::string>(tokens[1],\"Integer\")\r\n              || dXstring::beginsWith<std::string>(tokens[1],\"Smallint\")\r\n              || dXstring::beginsWith<std::string>(tokens[1],\"Decimal\")\r\n              || dXstring::beginsWith<std::string>(tokens[1],\"Float\"))\r\n      {\r\n         colnames.push_back(tokens[0]);\r\n         attributes.insertOrResetColumn(colnames.back());\r\n         readable.push_back(i);\r\n      }\r\n   }\r\n\r\n   for (std::string colname: colnames) {\r\n      colindexes.push_back(attributes.getColumnIndex(colname));\r\n   }\r\n\r\n   std::string textline;\r\n   std::vector<std::vector<Point2f>> pointsets;\r\n   std::vector<size_t> duplicates;\r\n   std::vector<int> types;\r\n\r\n   try {\r\n   // now read line data into the axial map   \r\n   while (!miffile.eof()) {\r\n      dXstring::safeGetline(miffile, textline);\r\n      dXstring::ltrim(textline);\r\n      dXstring::toLower(textline);\r\n      if (textline.empty()) {\r\n         continue;\r\n      }\r\n      if (dXstring::beginsWith<std::string>(textline,\"point\")) {\r\n         auto tokens = dXstring::split(textline,' ',true);\r\n         pointsets.push_back(std::vector<Point2f>());\r\n         types.push_back(SalaShape::SHAPE_POINT);\r\n         pointsets.back().push_back(Point2f(stod(tokens[1]),stod(tokens[2])));\r\n      }\r\n      if (dXstring::beginsWith<std::string>(textline,\"line\")) {\r\n         auto tokens = dXstring::split(textline,' ',true);\r\n         pointsets.push_back(std::vector<Point2f>());\r\n         types.push_back(SalaShape::SHAPE_LINE);\r\n         pointsets.back().push_back(Point2f(stod(tokens[1]),stod(tokens[2])));\r\n         pointsets.back().push_back(Point2f(stod(tokens[3]),stod(tokens[4])));\r\n      }\r\n      else if (dXstring::beginsWith<std::string>(textline,\"pline\") || dXstring::beginsWith<std::string>(textline,\"region\")) {\r\n         int type = dXstring::beginsWith<std::string>(textline,\"pline\") ? SalaShape::SHAPE_POLY : (SalaShape::SHAPE_POLY | SalaShape::SHAPE_CLOSED);\r\n         // note: polylines, even multiple lines, are condensed into a single line\r\n         auto tokens = dXstring::split(textline,' ',true);\r\n         int multiple = 1;\r\n         if (tokens.size() > 1) {\r\n            if (tokens[1] == \"multiple\") {\r\n               multiple = stoi(tokens[2]);\r\n            }\r\n            else if (type & SalaShape::SHAPE_CLOSED) {\r\n               multiple = stoi(tokens[1]);\r\n            }\r\n            // if for some reason c_int fails:\r\n            if (multiple == 0) {\r\n               multiple = 1;\r\n            }\r\n         }\r\n         for (int i = 0; i < multiple; i++) {\r\n            int count = -1;\r\n            if ((type & SalaShape::SHAPE_CLOSED) != SalaShape::SHAPE_CLOSED && tokens.size() == 2) {\r\n               // token 2 can apparently be used for count in pline rather than a newline being used...\r\n               count = stoi(tokens[1]);\r\n            }\r\n            else {\r\n               dXstring::safeGetline(miffile, textline);\r\n               dXstring::ltrim(textline);\r\n               count = stoi(textline);\r\n            }\r\n            pointsets.push_back(std::vector<Point2f>());\r\n            types.push_back(type);\r\n            for (int j = 0; j < count; j++) {\r\n               dXstring::safeGetline(miffile, textline);\r\n               dXstring::ltrim(textline);\r\n               auto tokens = dXstring::split(textline,' ',true);\r\n               pointsets.back().push_back(Point2f(stod(tokens[0]),stod(tokens[1])));\r\n            }\r\n            if (i != 0) {\r\n               // warn about extraneous pline data\r\n               mapLoaded = MINFO_MULTIPLE;\r\n               duplicates.push_back(pointsets.size() - 1);\r\n            }\r\n         }\r\n      }\r\n   }\r\n   }\r\n   // TODO: Use the proper exception\r\n   catch (std::exception) {\r\n      // unhandled parsing exceptions return read error:\r\n      return MINFO_MIFPARSE;\r\n   }\r\n\r\n   size_t nextduplicate = 0;\r\n   AttributeRow *lastrow;\r\n\r\n   QtRegion region(pointsets[0][0],pointsets[0][0]);\r\n   for (size_t i = 0; i < pointsets.size(); i++) {\r\n      for (size_t j = 0; j < pointsets[i].size(); j++) {\r\n         region.encompass(pointsets[i][j]);\r\n      }\r\n   }\r\n\r\n   try {\r\n     // switch lines into our format\r\n     map.init(pointsets.size(),region);\r\n     for (size_t i = 0; i < pointsets.size(); i++) {\r\n         bool open = false;\r\n         if ((types[i] & SalaShape::SHAPE_CLOSED) == 0) {\r\n            open = true;\r\n         }\r\n         map.makePolyShape(pointsets[i],open);\r\n         AttributeRow &row = *attributes.back().second;\r\n         //\r\n         // table data entries:\r\n         if (nextduplicate < duplicates.size() && duplicates[nextduplicate] == i) {\r\n            // duplicate last row:\r\n            for (int colindex: colindexes) {\r\n               row.setValue(colindex, lastrow->getValue(colindex));\r\n            }\r\n            nextduplicate++;\r\n         }\r\n         else {\r\n            // read next row:\r\n            std::string line;\r\n            while (!midfile.eof() && line.empty()) {\r\n               dXstring::safeGetline(midfile, line);\r\n            }\r\n            if (line.empty()) {\r\n               return MINFO_OBJROWS;\r\n            }\r\n            bool instring = false;\r\n            size_t here = 0, first = 0, reading = 0, nextreadable = 0;\r\n            while (nextreadable < readable.size()) {\r\n               char next = line[here];\r\n               if (next == '\\\"') {\r\n                  instring = !instring;\r\n               }\r\n               here++;\r\n               if ((!instring && next == m_delimiter) || here >= line.length()) {\r\n                  int length = (here < line.length()) ? here-first-1 : here-first;\r\n                  std::string field = line.substr(first,length);\r\n                  first = here;\r\n                  if (length == 1 && field[0] == m_delimiter) {\r\n                     // field is empty\r\n                     row.setValue(colindexes[nextreadable], -1);\r\n                     nextreadable++; // go to next column\r\n                  } else if (reading == readable[nextreadable]) {\r\n                     float val = -1;\r\n                     if(!field.empty()) {\r\n                         val = stof(field);\r\n                     }\r\n                     row.setValue(colindexes[nextreadable],val);\r\n                     nextreadable++; // go to next column\r\n                  }\r\n                  reading++;\r\n               }\r\n            }\r\n         }\r\n         lastrow = &row;\r\n      }\r\n   }\r\n   // TODO: use a proper exception\r\n   catch (std::exception) {\r\n      // unhandled parsing exceptions return read error:\r\n      return MINFO_TABLE;\r\n   }\r\n\r\n   return mapLoaded;\r\n}\r\n/*\r\nbool MapInfoData::exportFile(std::ostream& miffile, std::ostream& midfile, const ShapeGraph& map)\r\n{\r\n   // if bounds has not been filled in, fill it in\r\n   if (m_bounds.empty()) {\r\n      char bounds[256];\r\n      sprintf(bounds,\"Bounds (%10f, %10f) (%10f, %10f)\", map.m_region.bottom_left.x, \r\n                                                         map.m_region.bottom_left.y,\r\n                                                         map.m_region.top_right.x,\r\n                                                         map.m_region.top_right.y);\r\n      m_bounds = bounds;\r\n   }\r\n\r\n   // write the header...\r\n   writeheader(miffile);\r\n\r\n   // write the mif table\r\n   writetable(miffile,midfile,map.m_attributes);\r\n\r\n   miffile.precision(16);\r\n\r\n   for (int i = 0; i < map.m_lines.size(); i++) {\r\n      miffile << \"Line \" << map.m_lines[i].line.start().x << \" \" \r\n                         << map.m_lines[i].line.start().y << \" \" \r\n                         << map.m_lines[i].line.end().x << \" \" \r\n                         << map.m_lines[i].line.end().y << std::endl;\r\n      miffile << \"    Pen (1,2,0)\" << std::endl;\r\n   }\r\n\r\n   return true;\r\n}\r\n*/\r\nbool MapInfoData::exportFile(std::ostream& miffile, std::ostream& midfile, const PointMap& points)\r\n{\r\n   // if bounds has not been filled in, fill it in\r\n   if (m_bounds.empty()) {\r\n      char bounds[256];\r\n      sprintf(bounds,\"Bounds (%10f, %10f) (%10f, %10f)\", points.m_region.bottom_left.x, \r\n                                                         points.m_region.bottom_left.y,\r\n                                                         points.m_region.top_right.x,\r\n                                                         points.m_region.top_right.y);\r\n      m_bounds = bounds;\r\n   }\r\n\r\n   // write the header...\r\n   writeheader(miffile);\r\n      \r\n   // write the mif table\r\n   writetable(miffile, midfile, points.getAttributeTable(), points.m_layers);\r\n\r\n   miffile.precision(16);\r\n\r\n   for (auto iter = points.getAttributeTable().begin(); iter != points.getAttributeTable().end(); iter++) {\r\n      PixelRef pix = iter->getKey().value;\r\n      Point2f p = points.depixelate(pix);\r\n      miffile << \"Point \" << p.x << \" \" << p.y << std::endl;\r\n      miffile << \"    Symbol (32,0,10)\" << std::endl;\r\n   }\r\n\r\n   return true;\r\n}\r\n\r\nbool MapInfoData::exportFile(std::ostream& miffile, std::ostream& midfile, const ShapeMap& map)\r\n{\r\n   // if bounds has not been filled in, fill it in\r\n   if (m_bounds.empty()) {\r\n      char bounds[256];\r\n      sprintf(bounds,\"Bounds (%10f, %10f) (%10f, %10f)\", map.getRegion().bottom_left.x,\r\n                                                         map.getRegion().bottom_left.y,\r\n                                                         map.getRegion().top_right.x,\r\n                                                         map.getRegion().top_right.y);\r\n      m_bounds = bounds;\r\n   }\r\n\r\n   miffile.precision(8);\r\n   midfile.precision(8);\r\n\r\n   // write the header...\r\n   writeheader(miffile);\r\n\r\n   // write the mid table\r\n   writetable(miffile, midfile, *map.m_attributes, map.m_layers);\r\n\r\n   miffile.precision(16);\r\n   midfile.precision(16);\r\n\r\n   for (auto shape: map.m_shapes) {\r\n      // note, attributes must align for this:\r\n      if (isObjectVisible(map.m_layers, map.getAttributeTable().getRow(AttributeKey(shape.first)))) {\r\n         const SalaShape& poly = shape.second;\r\n         if (poly.isPoint()) {\r\n            miffile << \"POINT \" << poly.getPoint().x << \" \" << poly.getPoint().y << std::endl;\r\n            miffile << \"    SYMBOL (32,0,10)\" << std::endl;\r\n         }\r\n         else if (poly.isLine()) {\r\n            miffile << \"LINE \" << poly.getLine().start().x << \" \" \r\n                               << poly.getLine().start().y << \" \" \r\n                               << poly.getLine().end().x << \" \" \r\n                               << poly.getLine().end().y << std::endl;\r\n            miffile << \"    PEN (1,2,0)\" << std::endl;\r\n         }\r\n         else if (poly.isPolyLine()) {\r\n            miffile << \"PLINE\" << std::endl;\r\n            miffile << \"  \" << poly.m_points.size() << std::endl;\r\n            for (auto& point: poly.m_points) {\r\n               miffile << point.x << \" \" << point.y << std::endl;\r\n            }\r\n            miffile << \"    PEN (1,2,0)\" << std::endl;\r\n         }\r\n         else if (poly.isPolygon()) {\r\n            miffile << \"REGION  1\" << std::endl;\r\n            miffile << \"  \" << poly.m_points.size() + 1 << std::endl;\r\n            for (auto& point: poly.m_points) {\r\n               miffile << point.x << \" \" << point.y << std::endl;\r\n            }\r\n            miffile << poly.m_points[0].x << \" \" << poly.m_points[0].y << std::endl;\r\n            miffile << \"    PEN (1,2,0)\" << std::endl;\r\n            miffile << \"    BRUSH (2,16777215,16777215)\" << std::endl;\r\n            miffile << \"    CENTER \" << poly.getCentroid().x << \" \" << poly.getCentroid().y << std::endl;\r\n         }\r\n      }\r\n   }\r\n\r\n   return true;\r\n}\r\n\r\nbool MapInfoData::exportPolygons(std::ostream& miffile, std::ostream& midfile, const std::vector<std::vector<Point2f>>& polygons, const QtRegion& region)\r\n{\r\n   // if bounds has not been filled in, fill it in\r\n   if (m_bounds.empty()) {\r\n      char bounds[256];\r\n      sprintf(bounds,\"Bounds (%10f, %10f) (%10f, %10f)\", region.bottom_left.x, \r\n                                                         region.bottom_left.y,\r\n                                                         region.top_right.x,\r\n                                                         region.top_right.y);\r\n      m_bounds = bounds;\r\n   }\r\n\r\n   // write the header...\r\n   writeheader(miffile);\r\n\r\n   // dummy attributes table:\r\n   AttributeTable attributes;\r\n   for (size_t i = 0; i < polygons.size(); i++) {\r\n      attributes.addRow(AttributeKey(i));\r\n   }\r\n\r\n   // dummy layers:\r\n   LayerManagerImpl layers;\r\n\r\n   // write the mid table\r\n   writetable(miffile, midfile, attributes, layers);\r\n\r\n   miffile.precision(16);\r\n   for (auto& polygon: polygons) {\r\n      Point2f centre;\r\n      miffile << \"QtRegion  1\" << std::endl;\r\n      miffile << \"  \" << polygon.size() + 1 << std::endl;\r\n      for (auto& point: polygon) {\r\n         centre += point;\r\n         miffile << point.x << \" \" << point.y << std::endl;\r\n      }\r\n      miffile << polygon[0].x << \" \" << polygon[0].y << std::endl;\r\n      miffile << \"    Pen (1,2,0)\" << std::endl;\r\n      miffile << \"    Brush (2,16777215,16777215)\" << std::endl;\r\n      centre /= polygon.size();\r\n      miffile << \"    Center \" << centre.x << \" \" << centre.y << std::endl;\r\n   }\r\n\r\n   return true;\r\n}\r\n\r\n\r\n///////////////////////////////////////////////////////////////////////\r\n\r\nMapInfoData::MapInfoData()\r\n{\r\n   m_version = \"Version 300\";\r\n   m_charset = \"Charset \\\"WindowsLatin1\\\"\";\r\n   m_delimiter = ',';\r\n   m_index = \"Index 1\";\r\n   m_coordsys = \"CoordSys NonEarth Units \\\"m\\\" \";\r\n   // note: m_bounds is filled in later\r\n}\r\n\r\nbool MapInfoData::readheader(std::istream& miffile)\r\n{\r\n   std::string line;\r\n\r\n   dXstring::safeGetline(miffile, m_version);\r\n   dXstring::safeGetline(miffile, m_charset);\r\n   dXstring::makeInitCaps(m_charset);\r\n   // this should read \"Charset...\" but some files have delimiter straight away...\r\n   if (dXstring::beginsWith<std::string>(m_charset,\"Delimiter\")) {\r\n      line = m_charset;\r\n      m_charset = \"Charset \\\"WindowsLatin1\\\"\";\r\n   }\r\n   else {\r\n      dXstring::safeGetline(miffile, line);\r\n   }\r\n   size_t index = line.find_first_of(\"\\\"\");\r\n   if (index == std::string::npos) {\r\n      return false;\r\n   }\r\n   m_delimiter = line[index+1];\r\n   dXstring::safeGetline(miffile, line);\r\n   dXstring::makeInitCaps(line);\r\n   while (dXstring::beginsWith<std::string>(line,\"Index\") || dXstring::beginsWith<std::string>(line,\"Unique\")) {\r\n      m_index = line;\r\n      dXstring::safeGetline(miffile, line);\r\n   }\r\n\r\n   dXstring::ltrim(line);\r\n   dXstring::makeInitCaps(line);\r\n   if (dXstring::beginsWith<std::string>(line,\"Coordsys\")) {\r\n      line[5] = 'S'; // set back to CoordSys\r\n      // coordsys and bounds together in one line\r\n      auto boundIndex = line.find(\"Bounds\");\r\n      if(boundIndex != std::string::npos) {\r\n          m_coordsys = line.substr(0,boundIndex);\r\n          m_bounds = line.substr(boundIndex);\r\n      } else {\r\n          m_coordsys = line;\r\n          m_bounds = \"\";\r\n      }\r\n   }\r\n   else {\r\n      return false;\r\n   }\r\n\r\n   return true;\r\n}\r\n\r\nbool MapInfoData::readcolumnheaders(std::istream& miffile, std::vector<std::string>& columnheads)\r\n{\r\n   std::string line;\r\n\r\n   dXstring::safeGetline(miffile, line);\r\n   dXstring::makeInitCaps(line);\r\n   auto bits = dXstring::split(line, ' ');\r\n\r\n   if (line.find(\"Columns\") == std::string::npos || bits.size() < 2 )\r\n   {\r\n      return false;\r\n   }\r\n   int cols = stoi(bits[1]);\r\n\r\n   for (int i = 0; i < cols; i++) {\r\n      dXstring::safeGetline(miffile, line);\r\n      dXstring::makeInitCaps(line);\r\n      columnheads.push_back(line);\r\n   }\r\n\r\n   dXstring::safeGetline(miffile, line);\r\n   dXstring::makeInitCaps(line);\r\n   if (line != \"Data\") {\r\n      return false;\r\n   }\r\n\r\n   return true;\r\n}\r\n\r\nvoid MapInfoData::writeheader(std::ostream& miffile)\r\n{\r\n   miffile << m_version << std::endl;\r\n   miffile << m_charset << std::endl;\r\n   miffile << \"Delimiter \\\"\" << m_delimiter << \"\\\"\" << std::endl;\r\n   miffile << m_index << std::endl;\r\n   miffile << m_coordsys;\r\n   miffile << m_bounds << std::endl;\r\n}\r\n\r\n// note: stopped using m_table and m_columnheads as of VERSION_MAPINFO_SHAPES\r\n// simply hack up the table now for own purposes\r\n\r\nvoid MapInfoData::writetable(std::ostream& miffile, std::ostream& midfile, const AttributeTable& attributes, const LayerManagerImpl layers)\r\n{\r\n   miffile << \"Columns \" << attributes.getNumColumns() + 1 << std::endl;\r\n   /*\r\n   miffile << \"Columns \" << m_columnheads.size() + 1 + attributes.getColumnCount() << std::endl;\r\n\r\n   for (int i = 0; i < m_columnheads.size(); i++) {\r\n      miffile << m_columnheads[i] << std::endl;\r\n   }\r\n   */\r\n   miffile << \"  Depthmap_Ref Integer\" << std::endl;\r\n\r\n   // TODO: For compatibility write the columns in alphabetical order\r\n   // but the physical columns in the order inserted\r\n\r\n   std::vector<size_t> indices(attributes.getNumColumns());\r\n   std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\r\n\r\n   std::sort(indices.begin(), indices.end(),\r\n       [&](size_t a, size_t b) {\r\n       return attributes.getColumnName(a) < attributes.getColumnName(b);\r\n   });\r\n\r\n   for (int idx: indices) {\r\n      std::string colname = attributes.getColumnName(idx);\r\n      miffile << \"  \";\r\n      bool lastalpha = false;\r\n      for (size_t i = 0; i < colname.length(); i++) {\r\n         // get rid of any character that's not alphanumeric:\r\n         if (isalnum(colname[i])) {\r\n            miffile << colname[i];\r\n            lastalpha = true;\r\n         }\r\n         else if (lastalpha) {\r\n            miffile << \"_\";\r\n            lastalpha = false;\r\n         }\r\n      }\r\n      miffile << \" Float\" << std::endl;\r\n   }\r\n\r\n   miffile << \"Data\" << std::endl << std::endl;\r\n\r\n   for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\r\n       int rowKey = iter->getKey().value;\r\n      /*\r\n      if (k < m_table.size()) {\r\n         midfile << m_table[k] << m_delimiter;\r\n      }\r\n      */\r\n      if (isObjectVisible(layers, iter->getRow())) {\r\n         midfile << rowKey;\r\n         for (int idx: indices) {\r\n             midfile << m_delimiter << iter->getRow().getValue(idx);\r\n         }\r\n         midfile << std::endl;\r\n      }\r\n   }\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n\r\nstd::istream& MapInfoData::read(std::istream& stream)\r\n{\r\n   m_version = dXstring::readString(stream);\r\n   m_charset = dXstring::readString(stream);\r\n   m_delimiter = stream.get();\r\n   m_index = dXstring::readString(stream);\r\n   m_coordsys = dXstring::readString(stream);\r\n   m_bounds = dXstring::readString(stream);\r\n   \r\n   return stream;\r\n}\r\n\r\nstd::ostream& MapInfoData::write(std::ostream& stream)\r\n{\r\n   dXstring::writeString(stream, m_version);\r\n   dXstring::writeString(stream, m_charset);\r\n   stream.put(m_delimiter);\r\n   dXstring::writeString(stream, m_index);\r\n   dXstring::writeString(stream, m_coordsys);\r\n   dXstring::writeString(stream, m_bounds);\r\n   /*\r\n   // No longer used as of VERSION_MAPINFO_SHAPES\r\n   int columns = m_columnheads.size();\r\n   int rows = m_table.size();\r\n   stream.write((char *)&columns, sizeof(columns));\r\n   for (int i = 0; i < m_columnheads.size(); i++) {\r\n      m_columnheads[i].write(stream);\r\n   }\r\n   stream.write((char *)&rows, sizeof(rows));\r\n   for (int j = 0; j < m_table.size(); j++) {\r\n      m_table[j].write(stream);\r\n   }\r\n   */\r\n   return stream;\r\n}\r\n"
  },
  {
    "path": "salalib/parsers/mapinfodata.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#pragma once\r\n\r\n#include \"salalib/attributetable.h\"\r\n#include \"salalib/layermanagerimpl.h\"\r\n\r\n#include \"genlib/p2dpoly.h\"\r\n\r\n#include <istream>\r\n#include <ostream>\r\n#include <string>\r\n\r\n// imported and exported data\r\n// note: this is very basic and designed for axial line import / export only\r\n\r\n// MapInfoData is stored with axial map data\r\n\r\nclass ShapeMap;\r\nclass PointMap;\r\nclass AttributeTable;\r\n\r\nclass MapInfoData\r\n{\r\nfriend class ShapeGraph;\r\nfriend class ShapeGraphs;\r\nfriend class ShapeMap;\r\n   //\r\nprotected:\r\n   std::string m_version;\r\n   std::string m_charset;\r\n   char m_delimiter;\r\n   std::string m_index;\r\n   std::string m_coordsys;\r\n   std::string m_bounds;\r\n   //\r\n   // no longer use columnheads and table\r\n   // -- where possible, added directly to the data\r\n   // pvecstring m_columnheads; // <- original mapinfo column headers\r\n   // pvecstring m_table;       // <- original mapinfo table (stored as a flat text file!)\r\n   //\r\npublic:\r\n   MapInfoData();\r\n   // \r\n   int import(std::istream& miffile, std::istream& midfile, ShapeMap& map);\r\n   //bool exportFile(ostream& miffile, ostream& midfile, const ShapeGraph& map);   // n.b., deprecated: use shapemap instead\r\n   bool exportFile(std::ostream& miffile, std::ostream& midfile, const PointMap& points);\r\n   bool exportFile(std::ostream& miffile, std::ostream& midfile, const ShapeMap& map);\r\n   bool exportPolygons(std::ostream& miffile, std::ostream& midfile, const std::vector<std::vector<Point2f> > &polygons, const QtRegion& region);\r\n   //\r\n   bool readheader(std::istream& miffile);\r\n   bool readcolumnheaders(std::istream& miffile, std::vector<std::string>& columnheads);\r\n   void writeheader(std::ostream& miffile);\r\n   void writetable(std::ostream& miffile, std::ostream& midfile, const AttributeTable& attributes, const LayerManagerImpl layers);\r\n   //\r\n   std::istream& read(std::istream& stream);\r\n   std::ostream& write(std::ostream& stream);\r\n};\r\n"
  },
  {
    "path": "salalib/parsers/ntfp.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2018 Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n// Quick OS land-line NTF parser\r\n\r\n\r\n#include \"ntfp.h\"\r\n\r\n#include \"genlib/p2dpoly.h\"\r\n#include \"genlib/comm.h\" // for communicator\r\n#include \"genlib/stringutils.h\"\r\n#include \"genlib/containerutils.h\"\r\n\r\n#include <iostream>\r\n#include <fstream>\r\n#include <sstream>\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nint NtfPoint::parse(const std::string& token, bool secondhalf /* = false */)\r\n{\r\n   if (secondhalf) {\r\n      std::string second = token.substr(0,m_chars);\r\n      b = stoi(second);\r\n      if (m_chars == 5) {\r\n         b *= 100;\r\n      }\r\n      return 2;\r\n   }\r\n   else if ((int)token.length() < m_chars * 2) {\r\n      if ((int)token.length() < m_chars) {\r\n         return 0;\r\n      }\r\n      std::string first = token.substr(0,m_chars);\r\n      a = stoi(first);\r\n      if (m_chars == 5) {\r\n         a *= 100;\r\n      }\r\n      return 1;\r\n   }\r\n   else {\r\n      std::string first = token.substr(0,m_chars);\r\n      std::string second = token.substr(m_chars,m_chars);\r\n      a = stoi(first);\r\n      b = stoi(second);\r\n      if (m_chars == 5) {\r\n         a *= 100;\r\n         b *= 100;\r\n      }\r\n   }\r\n   return 2;\r\n}\r\n\r\nvoid NtfMap::fitBounds(const Line& li)\r\n{\r\n   if (m_region.atZero()) {\r\n      m_region = li;\r\n   }\r\n   else {\r\n      m_region = runion(m_region,li);\r\n   }\r\n}\r\n\r\nvoid NtfMap::addGeom(size_t layerIdx, NtfGeometry& geom)\r\n{ \r\n   m_line_count += geom.lines.size();\r\n   layers[layerIdx].m_line_count += geom.lines.size();\r\n   layers[layerIdx].geometries.push_back( geom );\r\n   for (size_t i = 0; i < geom.lines.size(); i++) {\r\n      fitBounds(geom.lines[i]);\r\n   }\r\n   geom.lines.clear();\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////\r\n\r\nLine NtfMap::makeLine(const NtfPoint& a, const NtfPoint& b)\r\n{\r\n   // In future requires offset\r\n   return Line(\r\n      Point2f(double(m_offset.a)+double(a.a)/100.0,double(m_offset.b)+double(a.b)/100.0),\r\n      Point2f(double(m_offset.a)+double(b.a)/100.0,double(m_offset.b)+double(b.b)/100.0)\r\n   );\r\n}\r\n\r\nvoid NtfMap::open(const std::vector<std::string>& fileset, Communicator *comm)\r\n{\r\n   time_t time = 0;\r\n   qtimer( time, 0 );\r\n\r\n   std::vector<int> featcodes;\r\n/*\r\n   m_bottom_left.a =  2147483647;   // 2^31 - 1\r\n   m_bottom_left.b =  2147483647;\r\n   m_top_right.a   = -2147483647;\r\n   m_top_right.b   = -2147483647;\r\n*/\r\n   m_line_count = 0;\r\n   layers.clear();\r\n\r\n   for (size_t i = 0; i < fileset.size(); i++) {\r\n\r\n      std::ifstream stream(fileset[i].c_str());\r\n\r\n      int filetype = NTF_UNKNOWN;\r\n\r\n      while (!stream.eof() && filetype == NTF_UNKNOWN) {\r\n        std::string line;\r\n        dXstring::safeGetline(stream, line);\r\n         if (line.length() > 2) {\r\n            if (dXstring::beginsWith<std::string>(line, \"02\")) {\r\n               std::transform(line.begin(), line.end(), line.begin(), ::tolower);\r\n               if (dXstring::beginsWith<std::string>(line, \"02land-line\")) {\r\n                  filetype = NTF_LANDLINE;\r\n               }\r\n               else if (dXstring::beginsWith<std::string>(line, \"02meridian\")) {\r\n                  filetype = NTF_MERIDIAN;\r\n               }\r\n            }\r\n         }\r\n      }\r\n\r\n      int precision = 10;\r\n\r\n      if (filetype == NTF_UNKNOWN) {\r\n         // not recognised -- really ought to throw error\r\n         stream.close();\r\n         continue;\r\n      }\r\n      else if (filetype == NTF_LANDLINE) {\r\n         precision = 6;\r\n      }\r\n      else if (filetype == NTF_MERIDIAN) {\r\n         precision = 5;\r\n      }\r\n\r\n      NtfGeometry geom;\r\n      NtfPoint lastpoint(precision), currpoint(precision);\r\n      int parsing = 0;\r\n      std::vector<int>::iterator currpos;\r\n      int currtoken = 0;\r\n      std::vector<std::string> tokens;\r\n\r\n      while (!stream.eof())\r\n      {\r\n         std::string line;\r\n         dXstring::safeGetline(stream, line);\r\n\r\n         if (line.length()) {\r\n            if (parsing == 0 && dXstring::beginsWith<std::string>(line, \"07\")) {\r\n               // Grab the easting and northing offset\r\n               std::string easting = line.substr(46,10);\r\n               std::string northing =line.substr(56,10);\r\n               m_offset.a = stoi(easting);\r\n               m_offset.b = stoi(northing);\r\n            }\r\n            if (parsing == 0 && dXstring::beginsWith<std::string>(line, \"05\")) {\r\n               // Grab the feature codes\r\n               // Example without continuation:\r\n               // 050001                              Building outline\\0%\r\n               // Example with continuation:\r\n               // 050001                              Building ou1%\r\n               // tline\\0%\r\n               std::stringstream fullLine;\r\n               fullLine << line;\r\n               while(line.substr(line.length()-2,2) == \"1%\") {\r\n                   // the last line had 1% so remove it\r\n                   fullLine.seekp(-2, std::ios_base::end);\r\n                   dXstring::safeGetline(stream, line);\r\n                   fullLine << line;\r\n               }\r\n               line = fullLine.str();\r\n               line = line.substr(0, line.length()-3);\r\n               std::string code = line.substr(2,4);\r\n               std::string name = line.substr(36);\r\n               if (depthmapX::addIfNotExists(featcodes, stoi(code)))\r\n                  layers.push_back( NtfLayer(name) );\r\n            }\r\n            if (parsing == 0 && dXstring::beginsWith<std::string>(line, \"23\")) {\r\n               geom.lines.clear();\r\n               // In Landline, check to see if it's a code we recognise:\r\n               if (filetype == NTF_LANDLINE) {\r\n                  std::string featcodestr = line.substr(16,4);\r\n                  auto pos = std::find(featcodes.begin(), featcodes.end(), stoi(featcodestr) );\r\n                  if (pos != featcodes.end()) {\r\n                     layers[size_t(std::distance(featcodes.begin(), pos))].geometries.push_back( NtfGeometry() );\r\n                     parsing = 1;\r\n                     currpos = pos;\r\n                  }\r\n               }\r\n               else if (filetype == NTF_MERIDIAN) {\r\n                  // In Meridian, irritatingly the feature code *follows* the geometry,\r\n                  // just have to read in\r\n                  parsing = 1;\r\n               }\r\n            }\r\n            else if (parsing == 1) {\r\n               if (dXstring::beginsWith<std::string>(line, \"21\")) {\r\n                  tokens.clear();\r\n                  // Some line data:\r\n                  // read to end, and possibly leave hanging:\r\n                  tokens = dXstring::split(line, ' ',true);\r\n                  tokens[0] = tokens[0].substr(13);\r\n                  lastpoint.parse(tokens[0]);\r\n                  currtoken = 1;\r\n                  parsing = 3;\r\n               }\r\n            }\r\n            else if (parsing > 1) {\r\n               if (dXstring::beginsWith<std::string>(line, \"00\")) {\r\n                  tokens = dXstring::split(line, ' ',true);\r\n                  tokens[0] = tokens[0].substr(2);\r\n                  currtoken = 0;\r\n               }\r\n               else if (dXstring::beginsWith<std::string>(line, \"14\") && filetype == NTF_MERIDIAN) {\r\n                  // Meridian record for this line:\r\n                  // finish up and add if featcode is recognised\r\n                  // (goodness knows how we are supposed to know in advance what sort of feature we are given)\r\n                  if (line.length() > 25 && line.substr(23,2) == \"FC\") { \r\n                     std::string featcodestr = line.substr(25,4);\r\n                     auto pos = std::find(featcodes.begin(), featcodes.end(), stoi(featcodestr) );\r\n                     if (pos != featcodes.end()) {\r\n                        addGeom(static_cast<size_t>(std::distance(featcodes.begin(), pos)), geom);\r\n                     }\r\n                  }\r\n                  parsing = 0;\r\n               }\r\n            }\r\n            if (parsing > 1) {\r\n               if (parsing == 2) {  // hanging half point:\r\n                  currpoint.parse(tokens[0], true);\r\n                  Line li = makeLine(lastpoint, currpoint);\r\n                  geom.lines.push_back(li);\r\n                  lastpoint = currpoint;\r\n                  currtoken = 1;\r\n               }\r\n               for (size_t i = currtoken; i < tokens.size(); i++) {\r\n                  int numbersparsed = currpoint.parse(tokens[i]);\r\n                  if (numbersparsed == 2) {\r\n                     Line li = makeLine(lastpoint, currpoint);\r\n                     geom.lines.push_back(li);\r\n                     lastpoint = currpoint;\r\n                  }\r\n                  else if (numbersparsed == 1) {\r\n                     parsing = 2; // hanging half point\r\n                  }\r\n                  else {\r\n                     parsing = 3;\r\n                  }\r\n               }\r\n               if (tokens.back()[tokens.back().length()-2] == '0') { // 0 here indicates no continuation\r\n                  if (filetype == NTF_LANDLINE) {\r\n                     addGeom(static_cast<size_t>(std::distance(featcodes.begin(), currpos)),geom);\r\n                     parsing = 0;\r\n                  }\r\n               }\r\n            }\r\n         }\r\n         if (comm)\r\n         {\r\n            if (qtimer( time, 500 )) {\r\n               if (comm->IsCancelled()) {\r\n                  throw Communicator::CancelledException();\r\n               }\r\n            }\r\n         }\r\n      }\r\n   }\r\n}\r\n"
  },
  {
    "path": "salalib/parsers/ntfp.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2018 Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#pragma once\r\n\r\n#include \"genlib/p2dpoly.h\"\r\n\r\nstruct NtfPoint {\r\n   int m_chars;\r\n   int a;\r\n   int b;\r\n   NtfPoint(int chars = 10)  // apparently 10 is NTF default\r\n   { m_chars = chars; }\r\n   int parse(const std::string& token, bool secondhalf = false);\r\n};\r\n\r\nclass NtfGeometry\r\n{\r\npublic:\r\n   std::vector<Line> lines;\r\n   NtfGeometry() {;}\r\n};\r\n\r\nclass NtfLayer {\r\n   friend class NtfMap;\r\nprotected:\r\n   std::string m_name;\r\n   int m_line_count;\r\npublic:\r\n   int pad1 : 32;\r\n   std::vector<NtfGeometry> geometries;\r\n   NtfLayer(const std::string& name = std::string())\r\n      { m_name = name; m_line_count = 0; }\r\n   int getLineCount()\r\n      { return m_line_count; }\r\n   std::string getName()\r\n      { return m_name; }\r\n};\r\n\r\nclass NtfMap\r\n{\r\npublic:\r\n   std::vector<NtfLayer> layers;\r\n   enum {NTF_UNKNOWN, NTF_LANDLINE, NTF_MERIDIAN};\r\nprotected:\r\n   NtfPoint m_offset;      // note: in metres\r\n   QtRegion m_region;        // made in metres, although points are in cm\r\n   int m_line_count;\r\npublic:\r\n   NtfMap() {;}\r\n   Line makeLine(const NtfPoint& a, const NtfPoint& b);\r\n   \r\n   void open(const std::vector<std::string> &fileset, Communicator *comm);\r\n   const QtRegion& getRegion() const\r\n   { return m_region; }\r\n   int getLineCount() const\r\n   { return m_line_count; }\r\nprotected:\r\n   void fitBounds(const Line& li);\r\n   void addGeom(size_t layerIdx, NtfGeometry& geom);\r\n};\r\n"
  },
  {
    "path": "salalib/parsers/tigerp.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2018, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n// Quick Tiger line parser (type 1 records)\r\n\r\n#include \"salalib/parsers/tigerp.h\"\r\n#include \"genlib/comm.h\"\r\n#include <iostream>\r\n#include <fstream>\r\n\r\n\r\n// at some point will need to extend to parsing record type 2 (chains) as well as record type 1 (node to node)\r\n\r\n// Thank you US Census Bureau -- this is a great easy flat file format:\r\n\r\nvoid TigerMap::parse(const std::vector<std::string>& fileset, Communicator *comm)\r\n{\r\n\r\n   time_t atime = 0;\r\n\r\n   qtimer( atime, 0 );\r\n     \r\n   for (size_t i = 0; i < fileset.size(); i++) {\r\n      std::ifstream stream(fileset[i].c_str());\r\n      while (!stream.eof())\r\n      {\r\n         std::string line;\r\n         std::getline(stream, line);\r\n\r\n         if (line.length()) {\r\n            // grab major code:\r\n            std::string code = line.substr(55,2);\r\n            if (code[0] == 'A' || code[0] == 'B') {\r\n               auto iter = m_categories.insert(std::make_pair(code,TigerCategory())).first;\r\n               int long1 = stoi(line.substr(190,10));\r\n               int lat1  = stoi(line.substr(200,9));\r\n               int long2 = stoi(line.substr(209,10));\r\n               int lat2  = stoi(line.substr(219,9));\r\n               Point2f p1(double(long1)/1e6,double(lat1)/1e6);\r\n               Point2f p2(double(long2)/1e6,double(lat2)/1e6);\r\n               Line li(p1,p2);\r\n               iter->second.chains.push_back(TigerChain());\r\n               iter->second.chains.back().lines.push_back(li);\r\n               if (!m_init) {\r\n                  m_region = li;\r\n                  m_init = true;\r\n               }\r\n               else {\r\n                  m_region = runion(m_region,li);\r\n               }\r\n            }\r\n         }\r\n         if (comm)\r\n         {\r\n            if (qtimer( atime, 500 )) {\r\n               if (comm->IsCancelled()) {\r\n                  throw Communicator::CancelledException();\r\n               }\r\n            }\r\n         }\r\n      }\r\n   }\r\n}\r\n"
  },
  {
    "path": "salalib/parsers/tigerp.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2018, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n#pragma once\r\n\r\n#include \"genlib/p2dpoly.h\"\r\n#include <vector>\r\n#include <map>\r\n\r\n// look up is the tiger (major) line category:\r\n// string is A1, A2, A3 (road types) or B1, B2 (railroad types)\r\n// C,D etc are not currently parsed, but given the nice file format \r\n// (thank you US Census Bureau!) they can easily be added\r\n\r\nclass TigerChain\r\n{\r\npublic:\r\n   std::vector<Line> lines;\r\n   TigerChain() {;}\r\n};\r\n\r\nclass TigerCategory\r\n{\r\npublic:\r\n   std::vector<TigerChain> chains;\r\n   TigerCategory() {;}\r\n};\r\n\r\nclass TigerMap\r\n{\r\nprotected:\r\n   QtRegion m_region;\r\n   bool m_init;\r\npublic:\r\n   std::map<std::string,TigerCategory> m_categories;\r\n   TigerMap() { m_init = false;}\r\n\r\n   void parse(const std::vector<std::string> &fileset, Communicator *communicator);\r\n\r\n   Point2f getBottomLeft()\r\n   { return m_region.bottom_left; }\r\n   Point2f getTopRight()\r\n   { return m_region.top_right; }\r\n   QtRegion getRegion()\r\n   { return m_region; }\r\n};\r\n"
  },
  {
    "path": "salalib/pixelref.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include <vector>\n\nclass PixelRef\n{\npublic:\n   short x;\n   short y;\n   PixelRef( short ax = -1, short ay = -1 )\n      { x = ax; y = ay; }\n   PixelRef( int i )\n      { x = short(i >> 16); y = short(i & 0xffff); }\n   bool empty()\n      { return x == -1 && y == -1; }\n   PixelRef up() const\n      { return PixelRef(x, y + 1); }\n   PixelRef left() const\n      { return PixelRef(x - 1, y); }\n   PixelRef right() const\n      { return PixelRef(x + 1, y); }\n   PixelRef down() const\n      { return PixelRef(x, y - 1); }\n   short& operator [] (int i)\n      { return (i == XAXIS) ? x : y; }\n   bool within( const PixelRef bl, const PixelRef tr ) const\n      { return (x >= bl.x && x <= tr.x && y >= bl.y && y <= tr.y); }\n   bool encloses( PixelRef testpoint ) const\n      { return (testpoint.x >= 0 && testpoint.x < x && testpoint.y >= 0 && testpoint.y < y);}\n   // directions for the ngraph:\n   enum {NODIR = 0x00, HORIZONTAL = 0x01, VERTICAL = 0x02, POSDIAGONAL = 0x04, NEGDIAGONAL = 0x08, DIAGONAL = 0x0c, NEGHORIZONTAL = 0x10, NEGVERTICAL = 0x20};\n   short& row(char dir)\n      { return (dir & VERTICAL) ? x : y; }\n   short& col(char dir)\n      { return (dir & VERTICAL) ? y : x; }\n   const short& row(char dir) const\n      { return (dir & VERTICAL) ? x : y; }\n   const short& col(char dir) const\n      { return (dir & VERTICAL) ? y : x; }\n   PixelRef& move(char dir)\n      { switch (dir)\n        {\n           case POSDIAGONAL: x++; y++; break;\n           case NEGDIAGONAL: x++; y--; break;\n           case HORIZONTAL: x++; break;\n           case VERTICAL: y++; break;\n           case NEGHORIZONTAL: x--; break;\n           case NEGVERTICAL: y--; break;\n        }\n        return *this; }\n   bool isodd() const\n   { return x % 2 == 1 && y % 2 == 1; }\n   bool iseven() const\n   { return x % 2 == 0 && y % 2 == 0; }\n   friend bool operator == (const PixelRef a, const PixelRef b);\n   friend bool operator != (const PixelRef a, const PixelRef b);\n   friend bool operator < (const PixelRef a, const PixelRef b);\n   friend bool operator > (const PixelRef a, const PixelRef b);\n   friend PixelRef operator + (const PixelRef a, const PixelRef b);\n   friend PixelRef operator - (const PixelRef a, const PixelRef b);\n   friend PixelRef operator / (const PixelRef a, const int factor);\n   friend double dist(const PixelRef a, const PixelRef b);\n   friend double angle(const PixelRef a, const PixelRef b, const PixelRef c);\n   operator int() const\n   { return ((int(x) << 16) + (int(y) & 0xffff)); }\n};\n\nconst PixelRef NoPixel( -1, -1 );\n\ninline bool operator == (const PixelRef a, const PixelRef b)\n{\n   return (a.x == b.x) && (a.y == b.y);\n}\ninline bool operator != (const PixelRef a, const PixelRef b)\n{\n   return (a.x != b.x) || (a.y != b.y);\n}\ninline bool operator < (const PixelRef a, const PixelRef b)\n{\n   return (a.x < b.x) || (a.x == b.x && a.y < b.y);\n}\ninline bool operator > (const PixelRef a, const PixelRef b)\n{\n   return (a.x > b.x) || (a.x == b.x && a.y > b.y);\n}\ninline PixelRef operator + (const PixelRef a, const PixelRef b)\n{\n   return PixelRef(a.x + b.x, a.y + b.y);\n}\ninline PixelRef operator - (const PixelRef a, const PixelRef b)\n{\n   return PixelRef(a.x - b.x, a.y - b.y);\n}\ninline PixelRef operator / (const PixelRef a, const int factor)\n{\n   return PixelRef(a.x / factor, a.y / factor);\n}\n\ninline double dist(const PixelRef a, const PixelRef b)\n{\n   return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));\n}\n\ninline double angle(const PixelRef a, const PixelRef b, const PixelRef c)\n{\n   if (c == NoPixel) {\n      return 0.0;\n   }\n   else {\n      // n.b. 1e-12 required for floating point error\n      return acos( double((a.x - b.x) * (b.x - c.x) + (a.y - b.y) * (b.y - c.y)) /\n                   (sqrt(sqr(a.x - b.x) + sqr(a.y - b.y)) * sqrt(sqr(b.x - c.x) + sqr(b.y - c.y)) + 1e-12) );\n   }\n}\n\n// Now sizeof(PixelRef) == sizeof(int) better stored directly:\ntypedef std::vector<PixelRef> PixelRefVector;\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nstruct PixelRefPair\n{\n   PixelRef a;\n   PixelRef b;\n   PixelRefPair(const PixelRef x = NoPixel, const PixelRef y = NoPixel)\n   {\n      a =  x < y ? x : y;\n      b =  x < y ? y : x;\n   }\n   friend bool operator == (const PixelRefPair& x, const PixelRefPair& y);\n   friend bool operator != (const PixelRefPair& x, const PixelRefPair& y);\n   friend bool operator <  (const PixelRefPair& x, const PixelRefPair& y);\n   friend bool operator >  (const PixelRefPair& x, const PixelRefPair& y);\n\n};\n\n// note: these are made with a is always less than b\ninline bool operator == (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return (x.a == y.a && x.b == y.b);\n}\ninline bool operator != (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return (x.a != y.a || x.b != y.b);\n}\ninline bool operator < (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return ( (x.a == y.a) ? x.b < y.b : x.a < y.a );\n}\ninline bool operator > (const PixelRefPair& x, const PixelRefPair& y)\n{\n   return ( (x.a == y.a) ? x.b > y.b : x.a > y.a );\n}\n\nstruct hashPixelRef {\n  size_t operator()(const PixelRef &pixelRef) const{\n    return std::hash<int>()(int(pixelRef));\n  }\n};\n"
  },
  {
    "path": "salalib/point.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/point.h\"\n#include \"salalib/ngraph.h\"\n\nfloat Point::getBinDistance(int i)\n{\n   return m_node->bindistance(i);\n}\n\nstd::istream& Point::read(std::istream& stream)\n{\n   stream.read( (char *) &m_state, sizeof(m_state) );\n   // block is the same size as m_noderef used to be for ease of replacement:\n   // (note block NO LONGER used!)\n   stream.read( (char *) &m_block, sizeof(m_block) );\n\n   int dummy = 0;\n   stream.read( reinterpret_cast<char *>(&dummy), sizeof(dummy) );\n\n   stream.read( (char *) &m_grid_connections, sizeof(m_grid_connections) );\n\n\n   stream.read( (char *) &m_merge, sizeof(m_merge) );\n   bool ngraph;\n   stream.read( (char *) &ngraph, sizeof(ngraph) );\n   if (ngraph) {\n       m_node = std::unique_ptr<Node>(new Node());\n       m_node->read(stream);\n   }\n\n   stream.read((char *) &m_location, sizeof(m_location));\n\n   return stream;\n}\n\nstd::ostream &Point::write(std::ostream& stream)\n{\n   stream.write( (char *) &m_state, sizeof(m_state) );\n   // block is the same size as m_noderef used to be for ease of replacement:\n   // note block is no longer used at all\n   stream.write( (char *) &m_block, sizeof(m_block) );\n   int dummy = 0;\n   stream.write( (char *) &dummy, sizeof(dummy) );\n   stream.write( (char *) &m_grid_connections, sizeof(m_grid_connections) );\n   stream.write( (char *) &m_merge, sizeof(m_merge) );\n   bool ngraph;\n   if (m_node) {\n      ngraph = true;\n      stream.write( (char *) &ngraph, sizeof(ngraph) );\n      m_node->write(stream);\n   }\n   else {\n      ngraph = false;\n      stream.write( (char *) &ngraph, sizeof(ngraph) );\n   }\n   stream.write((char *) &m_location, sizeof(m_location));\n   return stream;\n}\n"
  },
  {
    "path": "salalib/point.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"genlib/p2dpoly.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/ngraph.h\"\n#include <map>\n#include <memory>\n\nclass Point {\n   friend class Bin;\n   friend class PointMap;\n   friend class MetaGraph; // <- for file conversion routines\n   friend class PafAgent;\n   friend class PafWalker;\npublic:\n   enum { EMPTY = 0x0001, FILLED = 0x0002,\n          BLOCKED = 0x0004, CONTEXTFILLED = 0x0008, // PARTBLOCKED = 0x0008 deprecated\n          SELECTED = 0x0010, EDGE = 0x0020, MERGED = 0x0040,  // PINNED = 0x0020 deprecated\n          AGENTFILLED = 0x0080, AGENTFADE = 0x0100, AGENTA = 0x0200, AGENTB = 0x0400, AGENTC = 0x0800,\n          UPDATELINEADDED = 0x1000, UPDATELINEREMOVED = 0x2000, HIGHLIGHT = 0x4000,\n          AUGMENTED = 0x8000 // AV TV\n        };\n   // note the order of these connections is important and used elsewhere:\n   enum { CONNECT_E = 0x01, CONNECT_NE = 0x02, CONNECT_N = 0x04, CONNECT_NW = 0x08,\n          CONNECT_W = 0x10, CONNECT_SW = 0x20, CONNECT_S = 0x40, CONNECT_SE = 0x80 };\n\n   // TODO: These intermediary variables are only used for storing arbitrary data during the\n   // analysis. They should be made into local variables and removed from this class\n   int m_misc;              // <- undocounter / point seen register / agent reference number, etc\n   float m_dist;            // used to speed up metric analysis\n   float m_cumangle;        // cummulative angle -- used in metric analysis and angular analysis\n   PixelRef m_extent;       // used to speed up graph analysis (not sure whether or not it breaks it!)\n\nprotected:\n   int m_block;   // not used, unlikely to be used, but kept for time being\n   int m_state;\n   char m_grid_connections; // this is a standard set of grid connections, with bits set for E,NE,N,NW,W,SW,S,SE\n   std::unique_ptr<Node> m_node;            // graph links\n   Point2f m_location;      // note: this is large, but it helps allow loading of non-standard grid points,\n                            // whilst allowing them to be displayed as a visibility graph, also speeds up time to\n                            // display\n   float m_color;           // although display color for the point now introduced\n   PixelRef m_merge;        // to merge with another point\n   // hmm... this is for my 3rd attempt at a quick line intersect algo:\n   // every line that goes through the gridsquare -- memory intensive I know, but what can you do:\n   // accuracy is imperative here!  Calculated pre-fillpoints / pre-makegraph, and (importantly) it works.\n   std::vector<Line> m_lines;\n   int m_processflag;\npublic:\n   Point()\n      { m_state = EMPTY; m_block = 0; m_misc = 0; m_grid_connections = 0; m_node = nullptr; m_processflag = 0; m_merge = NoPixel; m_user_data = NULL; }\n   Point& operator = (const Point& p)\n   {\n       m_block = p.m_block;\n       m_state = p.m_state;\n       m_misc = p.m_misc;\n       m_grid_connections = p.m_grid_connections;\n       m_node = p.m_node ? std::unique_ptr<Node>(new Node(*p.m_node)) : nullptr;\n       m_location = p.m_location;\n       m_color = p.m_color;\n       m_merge = p.m_merge;\n       m_color = p.m_color;\n       m_extent = p.m_extent;\n       m_dist = p.m_dist;\n       m_cumangle = p.m_cumangle;\n       m_lines = p.m_lines;\n       m_processflag = p.m_processflag;\n       return *this;\n   }\n   Point(const Point& p)\n   {\n       m_block = p.m_block;\n       m_state = p.m_state;\n       m_misc = p.m_misc;\n       m_grid_connections = p.m_grid_connections;\n       m_node = p.m_node ? std::unique_ptr<Node>(new Node(*p.m_node)) : nullptr;\n       m_location = p.m_location;\n       m_color = p.m_color;\n       m_merge = p.m_merge;\n       m_color = p.m_color;\n       m_extent = p.m_extent;\n       m_dist = p.m_dist;\n       m_cumangle = p.m_cumangle;\n       m_lines = p.m_lines;\n       m_processflag = p.m_processflag;\n   }\n   //\n   bool empty() const\n      { return (m_state & EMPTY) == EMPTY; }\n   bool filled() const\n      { return (m_state & FILLED) == FILLED; }\n   bool blocked() const\n      { return (m_state & BLOCKED) == BLOCKED; }\n   bool contextfilled() const\n      { return (m_state & CONTEXTFILLED) == CONTEXTFILLED; }\n   bool edge() const\n      { return (m_state & EDGE) == EDGE; }\n   bool selected() const\n      { return (m_state & SELECTED) == SELECTED; }\n   //\n   // Augmented Vis\n   bool augmented() const\n      { return (m_state & AUGMENTED) == AUGMENTED; }\n   //\n   void set( int state, int undocounter = 0)\n   {\n      m_state = state | (m_state & Point::BLOCKED);   // careful not to clear the blocked flag\n      m_misc = undocounter;\n   }\n   void setBlock(bool blocked = true)\n   {\n      if (blocked)\n         m_state |= Point::BLOCKED;\n      else\n         m_state &= ~Point::BLOCKED;\n   }\n   void setEdge()\n   {\n      m_state |= Point::EDGE;\n   }\n   // old blocking code\n   //void addBlock( int block )\n   //   { m_block |= block; }\n   //void setBlock( int block )\n   //   { m_block = block; }\n   //int getBlock() const\n   //   { return m_block & 0x0000FFFF; }\n   //void addPartBlock( int block )\n   //   { m_block |= (block << 16); }\n   //int getPartBlock() const\n   //   { return (m_block & 0xFFFF0000) >> 16; }\n   //int getAllBlock() const\n   //   { return m_block | (m_block >> 16); }\n   //int fillBlocked() const\n   //   { return m_block & 0x06600660; }\n   int getState()\n      { return m_state; }\n   int getMisc()  // used as: undocounter, in graph construction, and an agent reference, as well as for making axial maps\n      { return m_misc; }\n   void setMisc(int misc)\n      { m_misc = misc; }\n   // note -- set merge pixel should be done only through merge pixels\n   PixelRef getMergePixel() {\n      return m_merge;\n   }\n   Node& getNode()\n      { return *m_node; }\n   bool hasNode()\n      { return m_node != nullptr; }\n   char getGridConnections() const\n      { return m_grid_connections; }\n   float getBinDistance(int i);\n   const Point2f &getLocation() const {\n       return m_location;\n   }\npublic:\n   std::istream &read(std::istream &stream);\n   std::ostream& write(std::ostream &stream);\n   //\nprotected:\n   // for user processing, set their own data on the point:\n   void *m_user_data;\npublic:\n   void *getUserData()\n   { return m_user_data; }\n   void setUserData(void *user_data)\n   { m_user_data = user_data; }\n};\n"
  },
  {
    "path": "salalib/pointdata.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// Point data\r\n\r\n\r\n#include \"salalib/pointdata.h\"\r\n#include \"salalib/parsers/mapinfodata.h\" // for mapinfo interface\r\n#include \"salalib/vgamodules/vgavisuallocal.h\"\r\n#include \"salalib/vgamodules/vgavisualglobal.h\"\r\n#include \"salalib/isovist.h\"\r\n#include \"salalib/mgraph.h\" // Metagraphs are used...\r\n#include \"salalib/ngraph.h\"\r\n#include \"salalib/attributetable.h\"\r\n#include \"salalib/attributetablehelpers.h\"\r\n\r\n#include \"genlib/comm.h\"  // for communicator\r\n#include \"genlib/stringutils.h\"\r\n#include \"genlib/containerutils.h\"\r\n\r\n#include <math.h>\r\n#include <unordered_set>\r\n#include <numeric>\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\nPointMap::PointMap(const QtRegion& parentRegion, const std::vector<SpacePixelFile>& drawingFiles, const std::string& name):\r\n    m_parentRegion(&parentRegion), m_drawingFiles(&drawingFiles), m_points(0,0),\r\n    m_attributes(new AttributeTable()), m_attribHandle(new AttributeTableHandle(*m_attributes))\r\n{\r\n   m_name = name;\r\n\r\n   m_cols = 0;\r\n   m_rows = 0;\r\n   m_filled_point_count = 0;\r\n\r\n   m_spacing = 0.0;\r\n\r\n   m_initialised = false;\r\n   m_blockedlines = false;\r\n   m_processed = false;\r\n   m_boundarygraph = false;\r\n\r\n   m_selection = NO_SELECTION;\r\n   m_pinned_selection = false;\r\n   m_undocounter = 0;\r\n\r\n   // screen\r\n   m_viewing_deprecated = -1;\r\n   m_draw_step = 1;\r\n\r\n   s_bl = NoPixel;\r\n   s_tr = NoPixel;\r\n   curmergeline = -1;\r\n\r\n   // -2 follows axial map convention, where -1 is the reference number\r\n   m_displayed_attribute = -2;\r\n}\r\n\r\nvoid PointMap::copy(const PointMap& other)\r\n{\r\n   m_name = other.getName();\r\n   m_region = other.getRegion();\r\n\r\n   m_cols = other.getCols();\r\n   m_rows = other.getRows();\r\n   m_filled_point_count = other.getFilledPointCount();\r\n\r\n   m_spacing = other.getSpacing();\r\n\r\n   m_initialised = other.m_initialised;\r\n   m_blockedlines = other.m_blockedlines;\r\n   m_processed = other.m_processed;\r\n   m_boundarygraph = other.m_boundarygraph;\r\n\r\n   m_selection = other.m_selection;\r\n   m_pinned_selection = other.m_pinned_selection;\r\n   m_undocounter = other.m_undocounter;\r\n\r\n   // screen\r\n   m_viewing_deprecated = other.m_viewing_deprecated;\r\n   m_draw_step = other.m_draw_step;\r\n\r\n   s_bl = other.s_bl;\r\n   s_tr = other.s_tr;\r\n   curmergeline = other.curmergeline;\r\n   m_offset = other.m_offset;\r\n   m_bottom_left = other.m_bottom_left;\r\n\r\n   // -2 follows axial map convention, where -1 is the reference number\r\n   m_displayed_attribute = other.m_displayed_attribute;\r\n}\r\n\r\nvoid PointMap::communicate( time_t& atime, Communicator *comm, int record )\r\n{\r\n   if (comm) {\r\n      if (qtimer( atime, 500 )) {\r\n         if (comm->IsCancelled()) {\r\n            throw Communicator::CancelledException();\r\n         }\r\n         comm->CommPostMessage( Communicator::CURRENT_RECORD, record);\r\n      }         \r\n   }\r\n}\r\n\r\nbool PointMap::setGrid(double spacing, const Point2f& offset)\r\n{\r\n   m_spacing = spacing;\r\n   // note, the internal offset is the offset from the bottom left\r\n   double xoffset = fmod(m_parentRegion->bottom_left.x + offset.x,m_spacing);\r\n   double yoffset = fmod(m_parentRegion->bottom_left.y + offset.y,m_spacing);\r\n   if (xoffset < m_spacing / 2.0)\r\n      xoffset += m_spacing;\r\n   if (xoffset > m_spacing / 2.0)\r\n      xoffset -= m_spacing;\r\n   if (yoffset < m_spacing / 2.0)\r\n      yoffset += m_spacing;\r\n   if (yoffset > m_spacing / 2.0)\r\n      yoffset -= m_spacing;\r\n\r\n   m_offset = Point2f(-xoffset, -yoffset);\r\n\r\n   if (m_points.size() != 0) {\r\n      m_filled_point_count = 0;\r\n   }\r\n   m_undocounter = 0;  // <- reset the undo counter... sorry... once you've done this you can't undo\r\n\r\n   // A grid at the required spacing:\r\n   m_cols = (int) floor((xoffset + m_parentRegion->width()) / m_spacing + 0.5) + 1;\r\n   m_rows = (int) floor((yoffset + m_parentRegion->height()) / m_spacing + 0.5) + 1;\r\n\r\n   m_bottom_left = Point2f(m_parentRegion->bottom_left.x + m_offset.x,\r\n                           m_parentRegion->bottom_left.y + m_offset.y);\r\n\r\n   m_region = QtRegion(\r\n      Point2f(m_bottom_left.x-m_spacing/2.0, m_bottom_left.y-m_spacing/2.0), \r\n      Point2f(m_bottom_left.x+double(m_cols-1)*m_spacing + m_spacing/2.0,\r\n              m_bottom_left.y+double(m_rows-1)*m_spacing + m_spacing/2.0) );\r\n\r\n   m_points = depthmapX::ColumnMatrix<Point>(m_rows, m_cols);\r\n   for (size_t j = 0; j < m_cols; j++) {\r\n      for (size_t k = 0; k < m_rows; k++) {\r\n         m_points(k,j).m_location = depixelate(PixelRef(static_cast<short>(j),static_cast<short>(k)));\r\n      }\r\n   }\r\n\r\n   m_initialised = true;\r\n   m_blockedlines = false;\r\n   m_processed = false;\r\n   m_boundarygraph = false;\r\n\r\n   m_merge_lines.clear();\r\n\r\n   return true;\r\n}\r\n\r\nbool PointMap::clearPoints()\r\n{\r\n   if (!m_filled_point_count) {\r\n      return false;\r\n   }\r\n\r\n   // This function is a bit messy... \r\n   // each is a slight variation (saves a little time when there's a single selection as opposed to a compound selection\r\n   // someday clean up\r\n\r\n   m_undocounter++;\r\n   if (m_selection == NO_SELECTION) {\r\n      for(auto& point: m_points) {\r\n         if(point.filled()) {\r\n             point.set( Point::EMPTY, m_undocounter );\r\n         }\r\n      }\r\n      m_filled_point_count = 0;\r\n      m_merge_lines.clear();\r\n   }\r\n   else if (m_selection & SINGLE_SELECTION) {\r\n      m_undocounter++;\r\n      for (int i = s_bl.x; i <= s_tr.x; i++) {\r\n         for (int j = s_bl.y; j <= s_tr.y; j++) {\r\n            Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n            if (pnt.m_state & (Point::SELECTED | Point::FILLED)) {\r\n               pnt.set( Point::EMPTY, m_undocounter );\r\n               if (!pnt.m_merge.empty()) {\r\n                  PixelRef p = pnt.m_merge;\r\n                  depthmapX::findAndErase(m_merge_lines, PixelRefPair(PixelRef(i,j),p));\r\n                  getPoint(p).m_merge = NoPixel;\r\n                  getPoint(p).m_state &= ~Point::MERGED;\r\n               }\r\n               m_filled_point_count--;\r\n            }\r\n         }\r\n      }\r\n   }\r\n   else { // COMPOUND_SELECTION (note, need to test bitwise now)\r\n      for (size_t i = 0; i < m_cols; i++) {\r\n         for (size_t j = 0; j < m_rows; j++) {\r\n            Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n            if (pnt.m_state & (Point::SELECTED | Point::FILLED)) {\r\n               pnt.set( Point::EMPTY, m_undocounter );\r\n               if (!pnt.m_merge.empty()) {\r\n                  PixelRef p = pnt.m_merge;\r\n                  depthmapX::findAndErase(m_merge_lines, PixelRefPair(PixelRef(i,j),p));\r\n                  getPoint(p).m_merge = NoPixel;\r\n                  getPoint(p).m_state &= ~Point::MERGED;\r\n               }\r\n               m_filled_point_count--;\r\n            }\r\n         }\r\n      }\r\n   }\r\n\r\n   m_selection_set.clear();\r\n   m_selection = NO_SELECTION;\r\n\r\n   return true;\r\n}\r\n\r\nbool PointMap::undoPoints()\r\n{\r\n   if (!m_undocounter) {\r\n      return false;\r\n   }\r\n   for (auto& p: m_points) {\r\n        if ( p.m_misc == m_undocounter) {\r\n            if (p.m_state & Point::FILLED) {\r\n                p.m_state &= ~Point::FILLED;\r\n                p.m_state |= Point::EMPTY;\r\n                p.m_misc = 0; // probably shouldn't set to 0 (can't undo)  Eventually will implement 'redo' counter as well\r\n                m_filled_point_count--;\r\n            }\r\n            else if (p.m_state & Point::EMPTY) {\r\n                p.m_state |= Point::FILLED;\r\n                p.m_state &= ~Point::EMPTY;\r\n                p.m_misc = 0; // probably shouldn't set to 0 (can't undo)  Eventually will implement 'redo' counter as well\r\n                m_filled_point_count++;\r\n            }\r\n        }\r\n   }\r\n   m_undocounter--;  // reduce undo counter\r\n\r\n   return true;\r\n}\r\n\r\n// constrain is used to constrain to existing rows / cols \r\n// (not quite the same as constraining to bounding box due to spacing offsets)\r\nPixelRef PointMap::pixelate( const Point2f& p, bool constrain, int scalefactor ) const\r\n{\r\n   PixelRef ref;\r\n \r\n   double spacing = m_spacing / double(scalefactor);\r\n   ref.x = int(floor( (p.x - m_bottom_left.x + (m_spacing / 2.0)) / spacing ));\r\n   ref.y = int(floor( (p.y - m_bottom_left.y + (m_spacing / 2.0)) / spacing ));\r\n\r\n   if (constrain) {\r\n      if (ref.x < 0) \r\n         ref.x = 0;\r\n      else if (ref.x >= static_cast<short>(m_cols * scalefactor))\r\n         ref.x = (m_cols * scalefactor) - 1;\r\n      if (ref.y < 0) \r\n         ref.y = 0;\r\n      else if (ref.y >= static_cast<short>(m_rows * scalefactor))\r\n         ref.y = (m_rows * scalefactor) - 1;\r\n   }\r\n\r\n   return ref;\r\n}\r\n\r\nvoid PointMap::fillLine(const Line& li)\r\n{\r\n   PixelRefVector pixels = pixelateLine( li, 1 );\r\n   for (size_t j = 0; j < pixels.size(); j++) {\r\n      if (getPoint(pixels[j]).empty()) {\r\n         getPoint(pixels[j]).set( Point::FILLED, m_undocounter );\r\n         m_filled_point_count++;\r\n      }\r\n   }\r\n}\r\n\r\nbool PointMap::blockLines()\r\n{\r\n   if (!m_initialised || m_points.size() == 0) {\r\n      return false;\r\n   }\r\n   if (m_blockedlines) {\r\n      return true;\r\n   }\r\n   // just ensure lines don't exist to start off with (e.g., if someone's been playing with the visible layers)\r\n   unblockLines();\r\n\r\n   // This used to use a packed Linekey (file, layer, line), but\r\n   // would require a key with (file, layer, shaperef, seg) when used with shaperef,\r\n   // so just switched to an integer key:\r\n\r\n   for (const auto& pixelGroup: *m_drawingFiles) {\r\n      for (const auto& pixel: pixelGroup.m_spacePixels) {\r\n         // chooses the first editable layer it can find:\r\n         if (pixel.isShown()) {\r\n             std::vector<SimpleLine> newLines = pixel.getAllShapesAsLines();\r\n             for (const auto& line: newLines) {\r\n                blockLine(Line(line.start(), line.end()));\r\n             }\r\n         }\r\n      }\r\n   }\r\n\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n         PixelRef curs = PixelRef( i, j );\r\n         Point& pt = getPoint( curs );\r\n         QtRegion viewport = regionate( curs, 1e-10 );\r\n         std::vector<Line>::iterator iter = pt.m_lines.begin(), end = pt.m_lines.end();\r\n         for(; iter != end; ) {\r\n             if (!iter->crop( viewport )) {\r\n                 // the pixelation is fairly rough to make sure that no point is missed: this just\r\n                 // clears up if any point has been added in error:\r\n                 iter = pt.m_lines.erase(iter);\r\n                 end = pt.m_lines.end();\r\n             } else {\r\n                 ++iter;\r\n             }\r\n         }\r\n      }\r\n   }\r\n\r\n   m_blockedlines = true;\r\n\r\n   return true;\r\n}\r\n\r\nvoid PointMap::blockLine(const Line& li)\r\n{\r\n   std::vector<PixelRef> pixels = pixelateLineTouching(li,1e-10);\r\n   // touching is generally better for ensuring lines pixelated completely, \r\n   // although it may catch extra points...\r\n   for (size_t n = 0; n < pixels.size(); n++)\r\n   {\r\n      getPoint(pixels[n]).m_lines.push_back(li);\r\n      getPoint(pixels[n]).setBlock(true);\r\n   }\r\n}\r\n\r\nvoid PointMap::unblockLines(bool clearblockedflag)\r\n{\r\n   // just ensure lines don't exist to start off with (e.g., if someone's been playing with the visible layers)\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n         PixelRef curs = PixelRef(i,j);\r\n         getPoint(curs).m_lines.clear();\r\n         if (clearblockedflag) {\r\n            getPoint(curs).setBlock(false);\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\n// still used through pencil tool\r\n\r\nbool PointMap::fillPoint(const Point2f& p, bool add)\r\n{\r\n   // \"false\" is do not constrain to bounding box, includes() must be used before getPoint\r\n   PixelRef pix = pixelate(p,false);\r\n   if (!includes(pix)) {\r\n      return false;\r\n   }\r\n   Point& pt = getPoint(pix);\r\n   if (add && !pt.filled()) {\r\n      m_filled_point_count++;\r\n      pt.set( Point::FILLED, ++m_undocounter );\r\n   }\r\n   else if (!add && (pt.m_state & Point::FILLED)) {\r\n      m_filled_point_count--;\r\n      pt.set( Point::EMPTY, ++m_undocounter );\r\n      if (pt.m_merge != NoPixel) {\r\n          unmergePixel(pix);\r\n      }\r\n   }\r\n   return true;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// NB --- I've returned to original\r\n\r\n//AV TV // semifilled\r\nbool PointMap::makePoints(const Point2f& seed, int fill_type, Communicator *comm)\r\n{\r\n   if (!m_initialised || m_points.size() == 0) {\r\n      return false;\r\n   }\r\n   if (comm) {\r\n      comm->CommPostMessage( Communicator::NUM_RECORDS, (m_rows * m_cols));\r\n   }\r\n   \r\n   // Snap to existing grid\r\n   // \"false\" is does not constrain: must use includes() before getPoint\r\n   PixelRef seedref = pixelate( seed, false );\r\n\r\n   if (!includes(seedref) || getPoint(seedref).filled()) {\r\n      return false;\r\n   }\r\n\r\n   // check if seed point is actually visible from the centre of the cell\r\n   std::vector<Line>& linesTouching = getPoint(seedref).m_lines;\r\n   for(auto line: linesTouching) {\r\n       if(intersect_line_no_touch(line, Line(seed, getPoint(seedref).m_location))) {\r\n           return false;\r\n       }\r\n   }\r\n\r\n   if (!m_blockedlines) {\r\n      blockLines();\r\n   }\r\n\r\n   m_undocounter++; // undo counter increased ready for fill...\r\n\r\n   // AV TV\r\n   //int filltype = fill_type ? Point::FILLED | Point::CONTEXTFILLED : Point::FILLED;\r\n   int filltype;\r\n   if( fill_type == 0 ) // FULLFILL\r\n       filltype = Point::FILLED;\r\n   else if( fill_type == 1 ) // SEMIFILL\r\n       filltype = Point::FILLED | Point::CONTEXTFILLED;\r\n   else // AUGMENT\r\n       filltype = Point::AUGMENTED;\r\n\r\n   getPoint(seedref).set( filltype, m_undocounter );\r\n   m_filled_point_count++;\r\n\r\n   // Now... start making lines:\r\n   pflipper<PixelRefVector> surface;\r\n\r\n   surface.a().push_back( seedref );\r\n\r\n   int added = 0;\r\n\r\n   time_t atime = 0;\r\n   qtimer( atime, 0 );\r\n\r\n   while (surface.a().size() > 0) {\r\n      PixelRef& currpix = surface.a().back();\r\n      int result = 0;\r\n      result |= expand( currpix, currpix.up(), surface.b(), filltype );\r\n      result |= expand( currpix, currpix.down(), surface.b(), filltype );\r\n      result |= expand( currpix, currpix.left(), surface.b(), filltype );\r\n      result |= expand( currpix, currpix.right(), surface.b(), filltype );\r\n      result |= expand( currpix, currpix.up().left(), surface.b(), filltype );\r\n      result |= expand( currpix, currpix.up().right(),  surface.b(), filltype );\r\n      result |= expand( currpix, currpix.down().left(), surface.b(), filltype );\r\n      result |= expand( currpix, currpix.down().right(), surface.b(), filltype );\r\n      // if there is a block, mark the currpix as an edge\r\n      if ((result & 4) || getPoint(currpix).blocked()) {\r\n         getPoint(currpix).setEdge();\r\n      }\r\n      //\r\n      surface.a().pop_back();\r\n      if (surface.a().size() == 0) {\r\n         surface.flip();\r\n      }\r\n      added++;\r\n      communicate( atime, comm, added );\r\n   }\r\n\r\n   return true;\r\n}\r\n\r\nint PointMap::expand( const PixelRef p1, const PixelRef p2, PixelRefVector& list, int filltype)\r\n{\r\n   if (p2.x < 0 || p2.x >= static_cast<short>(m_cols) || p2.y < 0 || p2.y >= static_cast<short>(m_rows)) {\r\n      // 1 = off edge\r\n      return 1;\r\n   }\r\n   if (getPoint(p2).getState() & Point::FILLED) {\r\n      // 2 = already filled\r\n      return 2;\r\n   }\r\n   Line l(depixelate(p1),depixelate(p2));\r\n   for (auto& line: getPoint(p1).m_lines)\r\n   {\r\n      if (intersect_region(l, line, m_spacing * 1e-10) && intersect_line(l, line, m_spacing * 1e-10)) {\r\n         // 4 = blocked\r\n         return 4;\r\n      }\r\n   }\r\n   for (auto& line: getPoint(p2).m_lines)\r\n   {\r\n      if (intersect_region(l, line, m_spacing * 1e-10) && intersect_line(l, line, m_spacing * 1e-10)) {\r\n         // 4 = blocked\r\n         return 4;\r\n      }\r\n   }\r\n   getPoint(p2).set( filltype, m_undocounter );\r\n   m_filled_point_count++;\r\n   list.push_back( p2 ); \r\n\r\n   // 8 = success\r\n   return 8;\r\n}\r\n\r\n\r\nvoid PointMap::outputPoints(std::ostream& stream, char delim)\r\n{\r\n   stream << \"Ref\" << delim << \"x\" << delim << \"y\" << std::endl;\r\n   stream.precision(12);\r\n\r\n   int count = 0;\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n\r\n         PixelRef curs = PixelRef( i, j );\r\n\r\n         if ( getPoint(curs).filled() ) {\r\n\r\n            Point2f p = depixelate(curs);\r\n            stream << curs << delim << p.x << delim << p.y << std::endl;\r\n            count++;\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\nvoid PointMap::outputMergeLines(std::ostream& stream, char delim)\r\n{\r\n   stream << \"x1\" << delim << \"y1\" << delim << \"x2\" << delim << \"y2\" << std::endl;\r\n\r\n   stream.precision(12);\r\n   for (size_t i = 0; i < m_merge_lines.size(); i++) {\r\n\r\n      Line li(depixelate(m_merge_lines[i].a),depixelate(m_merge_lines[i].b));\r\n\r\n      stream << li.start().x << delim << li.start().y << delim\r\n             << li.end().x << delim << li.end().y << std::endl;\r\n   }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid PointMap::outputSummary(std::ostream& myout, char delimiter)\r\n{\r\n   myout << \"Ref\" << delimiter << \"x\" << delimiter << \"y\";\r\n\r\n   // TODO: For compatibility write the columns in alphabetical order\r\n   // but the physical columns in the order inserted\r\n\r\n   std::vector<size_t> indices(m_attributes->getNumColumns());\r\n   std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\r\n\r\n   std::sort(indices.begin(), indices.end(),\r\n       [&](size_t a, size_t b) {\r\n       return m_attributes->getColumnName(a) < m_attributes->getColumnName(b);\r\n   });\r\n   for (int idx: indices) {\r\n       myout << delimiter << m_attributes->getColumnName(idx);\r\n   }\r\n\r\n   myout << std::endl;\r\n   myout.precision(8);\r\n\r\n   for (auto iter = m_attributes->begin(); iter != m_attributes->end(); iter++) {\r\n       PixelRef pix = iter->getKey().value;\r\n      if (isObjectVisible(m_layers, iter->getRow())) {\r\n         myout << pix << delimiter;\r\n         Point2f p = depixelate(pix);\r\n         myout << p.x << delimiter << p.y;\r\n         for (int idx: indices) {\r\n             myout << delimiter << iter->getRow().getValue(idx);\r\n         }\r\n         myout << std::endl;\r\n      }\r\n   }\r\n}\r\n\r\nvoid PointMap::outputMif( std::ostream& miffile, std::ostream& midfile )\r\n{\r\n   MapInfoData mapinfodata;\r\n   mapinfodata.exportFile(miffile, midfile, *this);\r\n}\r\n\r\nvoid PointMap::outputNet(std::ostream& netfile)\r\n{\r\n   // this is a bid of a faff, as we first have to get the point locations, \r\n   // then the connections from a lookup table... ickity ick ick...\r\n   std::map<PixelRef,PixelRefVector> graph;\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n         Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n         if (pnt.filled() && pnt.m_node) {\r\n            PixelRef pix(i,j);\r\n            PixelRefVector connections;\r\n            pnt.m_node->contents(connections);\r\n            graph.insert(std::make_pair(pix,connections));\r\n         }\r\n      }\r\n   }\r\n   netfile << \"*Vertices \" << graph.size() << std::endl;\r\n   double maxdim = __max(m_region.width(),m_region.height());\r\n   Point2f offset = Point2f((maxdim - m_region.width())/(2.0*maxdim),(maxdim - m_region.height())/(2.0*maxdim));\r\n   size_t j = 0;\r\n   for (auto& iter: graph) {\r\n      auto graphKey = iter.first;\r\n      Point2f p = depixelate(graphKey);\r\n      p.x = offset.x + (p.x - m_region.bottom_left.x) / maxdim;\r\n      p.y = 1.0 - (offset.y + (p.y - m_region.bottom_left.y) / maxdim);\r\n      netfile << (j+1) << \" \\\"\" << graphKey << \"\\\" \" << p.x << \" \" << p.y << std::endl;\r\n      j++;\r\n   }\r\n   netfile << \"*Edges\" << std::endl;\r\n   size_t k = 0;\r\n   for (auto& iter: graph) {\r\n      PixelRefVector& list = iter.second;\r\n      for (size_t m = 0; m < list.size(); m++) {\r\n         size_t n = depthmapX::findIndexFromKey(graph, list[m]);\r\n         if (static_cast<int>(n) != -1 && k < n) {\r\n            netfile << (k+1) << \" \" << (n+1) << \" 1\" << std::endl;\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\nvoid PointMap::outputConnections(std::ostream& myout)\r\n{\r\n   myout << \"#graph v1.0\" << std::endl;\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n         Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n         if (pnt.filled() && pnt.m_node) {\r\n            PixelRef pix(i,j);\r\n            Point2f p = depixelate(pix);\r\n            myout << \"node {\\n\" \r\n                  << \"  ref    \" << pix << \"\\n\" \r\n                  << \"  origin \" << p.x << \" \" << p.y << \" \" << 0.0 << \"\\n\"\r\n                  << \"  connections [\" << std::endl;\r\n            myout << *(pnt.m_node);\r\n            myout << \"  ]\\n}\" << std::endl;\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\nvoid PointMap::outputConnectionsAsCSV(std::ostream& myout, std::string delim)\r\n{\r\n    myout << \"RefFrom\" << delim << \"RefTo\";\r\n    std::unordered_set<PixelRef, hashPixelRef> seenPix;\r\n    for (size_t i = 0; i < m_cols; i++)\r\n    {\r\n        for (size_t j = 0; j < m_rows; j++)\r\n        {\r\n            Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n            if (pnt.filled() && pnt.m_node)\r\n            {\r\n                PixelRef pix(i,j);\r\n                seenPix.insert(pix);\r\n                PixelRefVector hood;\r\n                pnt.m_node->contents(hood);\r\n                for(PixelRef &p: hood)\r\n                {\r\n                    if(!(std::find(seenPix.begin(), seenPix.end(), p) != seenPix.end()) && getPoint(p).filled())\r\n                    {\r\n                        myout << std::endl << pix << delim << p;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid PointMap::outputLinksAsCSV(std::ostream& myout, std::string delim)\r\n{\r\n    myout << \"RefFrom\" << delim << \"RefTo\";\r\n    std::unordered_set<PixelRef, hashPixelRef> seenPix;\r\n    for (size_t i = 0; i < m_cols; i++)\r\n    {\r\n        for (size_t j = 0; j < m_rows; j++)\r\n        {\r\n            Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n            if (pnt.filled() && pnt.m_node)\r\n            {\r\n                PixelRef mergePixelRef = pnt.getMergePixel();\r\n                if(mergePixelRef != NoPixel) {\r\n                    PixelRef pix(i,j);\r\n                    if(seenPix.insert(pix).second)\r\n                    {\r\n                        seenPix.insert(mergePixelRef);\r\n                        myout << std::endl << pix << delim << mergePixelRef;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid PointMap::outputBinSummaries(std::ostream& myout)\r\n{\r\n   myout << \"cols \" << m_cols << \" rows \" << m_rows << std::endl;\r\n\r\n   myout << \"x\\ty\";\r\n   for (int i = 0; i < 32; i++) {\r\n      myout << \"\\tbin\" << i;\r\n   }\r\n   myout << std::endl;\r\n\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n\r\n         Point p = getPoint(PixelRef(i, j));\r\n\r\n         myout << i << \"\\t\" << j;\r\n\r\n         if (!p.filled()) {\r\n            for (int k = 0; k < 32; k++) {\r\n               myout << \"\\t\" << 0;\r\n            }\r\n         }\r\n         else {\r\n            for (int k = 0; k < 32; k++) {\r\n               myout << \"\\t\" << p.m_node->bin(k).count();\r\n            }\r\n         }\r\n\r\n         myout << std::endl;\r\n      }\r\n   }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// Attribute Stuff \r\n\r\nvoid PointMap::setDisplayedAttribute(int col)\r\n{\r\n   if (m_displayed_attribute == col) {\r\n      return;\r\n   }\r\n   else {\r\n      m_displayed_attribute = col;\r\n   }\r\n\r\n   m_attribHandle->setDisplayColIndex(m_displayed_attribute);\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// Screen stuff \r\n\r\nvoid PointMap::setScreenPixel( double unit )\r\n{\r\n   if (unit / m_spacing > 1) {\r\n      m_draw_step = int(unit / m_spacing);\r\n   }\r\n   else {\r\n      m_draw_step = 1;\r\n   }\r\n}\r\n\r\nvoid PointMap::makeViewportPoints( const QtRegion& viewport ) const\r\n{\r\n   // n.b., relies on \"constrain\" being set to true\r\n   bl = pixelate( viewport.bottom_left, true );\r\n   cur = bl;   // cursor for points\r\n   cur.x -= 1; // findNext expects to find cur.x in the -1 position\r\n   rc  = bl;   // cursor for grid lines\r\n   prc  = bl;  // cursor for point centre grid lines\r\n   prc.x -= 1;\r\n   prc.y -= 1;\r\n   // n.b., relies on \"constrain\" being set to true\r\n   tr = pixelate( viewport.top_right, true );\r\n   curmergeline = -1;\r\n\r\n   m_finished = false;\r\n}\r\n\r\nbool PointMap::findNextPoint() const\r\n{\r\n   if (m_finished) {\r\n      return false;\r\n   }\r\n   do  {\r\n      cur.x += m_draw_step;\r\n      if (cur.x > tr.x) {\r\n         cur.x = bl.x;\r\n         cur.y += m_draw_step;\r\n         if (cur.y > tr.y) {\r\n            cur = tr; // safety first --- this will at least return something\r\n            m_finished = true;\r\n            return false;\r\n         }\r\n      }\r\n   } while ( !getPoint(cur).filled() && !getPoint(cur).blocked() );\r\n   return true;\r\n}\r\n\r\nbool PointMap::findNextRow() const\r\n{\r\n   rc.y += 1;\r\n   if (rc.y > tr.y) return false;\r\n   return true;\r\n}\r\nLine PointMap::getNextRow() const\r\n{\r\n   Point2f offset( m_spacing / 2.0, m_spacing / 2.0 );\r\n   return Line( depixelate( PixelRef(bl.x, rc.y)) - offset, depixelate( PixelRef(tr.x+1, rc.y)) - offset );\r\n}\r\nbool PointMap::findNextPointRow() const\r\n{\r\n   prc.y += 1;\r\n   if (prc.y > tr.y) return false;\r\n   return true;\r\n}\r\nLine PointMap::getNextPointRow() const\r\n{\r\n   Point2f offset( m_spacing / 2.0, 0 );\r\n   return Line( depixelate( PixelRef(bl.x, prc.y)) - offset, depixelate( PixelRef(tr.x+1, prc.y)) - offset );\r\n}\r\nbool PointMap::findNextCol() const\r\n{\r\n   rc.x += 1;\r\n   if (rc.x > tr.x)  return false;\r\n   return true;\r\n}\r\nLine PointMap::getNextCol() const\r\n{\r\n   Point2f offset( m_spacing / 2.0, m_spacing / 2.0 );\r\n   return Line( depixelate( PixelRef(rc.x, bl.y) ) - offset, depixelate( PixelRef(rc.x, tr.y+1) ) - offset );\r\n}\r\nbool PointMap::findNextPointCol() const\r\n{\r\n   prc.x += 1;\r\n   if (prc.x > tr.x)  return false;\r\n   return true;\r\n}\r\nLine PointMap::getNextPointCol() const\r\n{\r\n   Point2f offset( 0.0, m_spacing / 2.0 );\r\n   return Line( depixelate( PixelRef(prc.x, bl.y) ) - offset, depixelate( PixelRef(prc.x, tr.y+1) ) - offset );\r\n}\r\n\r\nbool PointMap::findNextMergeLine() const\r\n{\r\n   if (curmergeline < (int)m_merge_lines.size()) {\r\n      curmergeline++;\r\n   }\r\n   return (curmergeline < (int)m_merge_lines.size());\r\n}\r\n\r\nLine PointMap::getNextMergeLine() const\r\n{\r\n   if (curmergeline < (int)m_merge_lines.size()) {\r\n      return Line(depixelate(m_merge_lines[curmergeline].a), \r\n                  depixelate(m_merge_lines[curmergeline].b));\r\n   }\r\n   return Line();\r\n}\r\n\r\nbool PointMap::getPointSelected() const\r\n{\r\n   int state = pointState( cur );\r\n   if (state & Point::SELECTED) {\r\n      return true;\r\n   }\r\n   return false;\r\n}\r\n\r\nPafColor PointMap::getPointColor(PixelRef pixelRef) const\r\n{\r\n   PafColor color;\r\n   int state = pointState( pixelRef );\r\n   if (state & Point::HIGHLIGHT) {\r\n      return PafColor( SALA_HIGHLIGHTED_COLOR ); \r\n   }\r\n   else if (state & Point::SELECTED) {\r\n      return PafColor( SALA_SELECTED_COLOR );\r\n   }\r\n   else {\r\n      if (state & Point::FILLED) {\r\n         if (m_processed) {\r\n            return dXreimpl::getDisplayColor(AttributeKey(pixelRef),\r\n                                             m_attributes->getRow(AttributeKey(pixelRef)),\r\n                                             *m_attribHandle.get(),\r\n                                             true);\r\n         }\r\n         else if (state & Point::EDGE) {\r\n            return PafColor( 0x0077BB77 );\r\n         }\r\n         else if (state & Point::CONTEXTFILLED) {\r\n            return PafColor( 0x007777BB );\r\n         }\r\n         else {\r\n            return PafColor( 0x00777777 );\r\n         }\r\n      }\r\n      else {\r\n         return PafColor();\r\n      }\r\n   }\r\n   return PafColor();   // <- note alpha channel set to transparent - will not be drawn\r\n}\r\n\r\nPafColor PointMap::getCurrentPointColor() const\r\n{\r\n    return getPointColor( cur );\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// Selection stuff\r\n\r\n// eventually we will use returned info to draw the selected point quickly\r\n\r\nbool PointMap::clearSel()\r\n{\r\n   if (m_selection == NO_SELECTION) {\r\n      return false;\r\n   }\r\n   for (auto& sel: m_selection_set) {\r\n      getPoint(sel).m_state &= ~Point::SELECTED;\r\n   }\r\n   m_selection_set.clear();\r\n   m_selection = NO_SELECTION;\r\n   m_attributes->deselectAllRows();\r\n   return true;\r\n}\r\n\r\nbool PointMap::setCurSel(QtRegion &r, bool add )\r\n{\r\n   if (m_selection == NO_SELECTION) {\r\n      add = false;\r\n   }\r\n   else if (!add) {\r\n      // Since we started using point locations in the sel set this is a lot easier!\r\n      clearSel();\r\n   }\r\n\r\n   // n.b., assumes constrain set to true (for if you start the selection off the grid)\r\n   s_bl = pixelate(r.bottom_left, true);\r\n   s_tr = pixelate(r.top_right, true);\r\n\r\n   if (!add) {\r\n      m_sel_bounds = r;\r\n   }\r\n   else {\r\n      m_sel_bounds = runion(m_sel_bounds, r);\r\n   }\r\n\r\n   int mask = 0;\r\n   mask |= Point::FILLED;\r\n\r\n   for (int i = s_bl.x; i <= s_tr.x; i++) {\r\n      for (int j = s_bl.y; j <= s_tr.y; j++) {\r\n         Point& pnt = m_points(static_cast<size_t>(j), static_cast<size_t>(i));\r\n         if ((pnt.m_state & mask) && (~pnt.m_state & Point::SELECTED)) {\r\n            pnt.m_state |= Point::SELECTED;\r\n            m_selection_set.insert( PixelRef(i,j) );\r\n            if (add) {\r\n               m_selection &= ~SINGLE_SELECTION;\r\n               m_selection |= COMPOUND_SELECTION;\r\n            }\r\n            else {\r\n               m_selection |= SINGLE_SELECTION;\r\n            }\r\n            if (pnt.m_node) {\r\n               m_attributes->getRow(AttributeKey(PixelRef(i,j))).setSelection(true);\r\n            }\r\n         }\r\n      }\r\n   }\r\n\r\n   // Set the region to our actual region:\r\n   r = QtRegion( depixelate(s_bl), depixelate(s_tr) );\r\n\r\n   return true;\r\n}\r\n\r\nbool PointMap::setCurSel(const std::vector<int>& selset, bool add)\r\n{\r\n   // note: override cursel, can only be used with analysed pointdata:\r\n   if (!add) {\r\n      clearSel();\r\n   }\r\n   m_selection = COMPOUND_SELECTION;\r\n   // not sure what to do with m_sel_bounds (is it necessary?)\r\n   for (size_t i = 0; i < selset.size(); i++) {\r\n      PixelRef pix = selset[i];\r\n      if (includes(pix)) {\r\n            m_points(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x)).m_state |= Point::SELECTED;\r\n            AttributeRow& row = m_attributes->getRow(AttributeKey(pix));\r\n            if (!row.isSelected()) {\r\n               row.setSelection(true);\r\n               m_selection_set.insert(pix);\r\n            }\r\n      }\r\n   }\r\n   return true;\r\n}\r\n\r\n// Helper function: is there a blocked point next to you?\r\n// ...rather scruffily goes round the eight adjacent points...\r\n\r\n// This is being phased out, with the new \"edge\" points (which are the filled edges of the graph)\r\n\r\nbool PointMap::blockedAdjacent( const PixelRef p ) const\r\n{\r\n   bool ba = false;\r\n   PixelRef temp = p.right();\r\n   PixelRef bounds(m_cols, m_rows);\r\n\r\n   if (bounds.encloses(temp) && getPoint(temp).blocked()) {                      // Right\r\n      ba = true;\r\n   }\r\n   else {\r\n      temp = temp.up();\r\n      if (bounds.encloses(temp) && getPoint(temp).blocked()) {                   // Top right\r\n         ba = true;\r\n      }\r\n      else {\r\n         temp = temp.left();\r\n         if (bounds.encloses(temp) && getPoint(temp).blocked()) {                // Top\r\n            ba = true;\r\n         }\r\n         else {\r\n            temp = temp.left();\r\n            if (bounds.encloses(temp) && getPoint(temp).blocked()) {             // Top Left\r\n               ba = true;\r\n            }\r\n            else {\r\n               temp = temp.down();\r\n               if (bounds.encloses(temp) && getPoint(temp).blocked()) {          // Left\r\n                  ba = true;\r\n               }\r\n               else {\r\n                  temp = temp.down();\r\n                  if (bounds.encloses(temp) && getPoint(temp).blocked()) {       // Bottom Left\r\n                     ba = true;\r\n                  }\r\n                  else {\r\n                     temp = temp.right();\r\n                     if (bounds.encloses(temp) && getPoint(temp).blocked()) {    // Bottom\r\n                        ba = true;\r\n                     }\r\n                     else {\r\n                        temp = temp.right();\r\n                        if (bounds.encloses(temp) && getPoint(temp).blocked()) { // Bottom right\r\n                           ba = true;\r\n                        }\r\n                     }\r\n                  }\r\n               }\r\n            }\r\n         }\r\n      }\r\n   }\r\n   return ba;\r\n}\r\n\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool PointMap::read(std::istream& stream )\r\n{\r\n   m_name = dXstring::readString(stream);\r\n\r\n\r\n   // NOTE: You MUST set m_spacepix manually!\r\n   m_displayed_attribute = -1;\r\n\r\n   stream.read( (char *) &m_spacing, sizeof(m_spacing) );\r\n\r\n   int rows, cols;\r\n   stream.read( reinterpret_cast<char *>(&rows), sizeof(rows) );\r\n   stream.read( reinterpret_cast<char *>(&cols), sizeof(cols) );\r\n   m_rows = static_cast<size_t>(rows);\r\n   m_cols = static_cast<size_t>(cols);\r\n\r\n   stream.read( (char *) &m_filled_point_count, sizeof(m_filled_point_count) );\r\n\r\n   stream.read( (char *) &m_bottom_left, sizeof(m_bottom_left) );\r\n\r\n   m_region = QtRegion(\r\n      Point2f(m_bottom_left.x-m_spacing/2.0, m_bottom_left.y-m_spacing/2.0), \r\n      Point2f(m_bottom_left.x+double(m_cols-1)*m_spacing + m_spacing/2.0,\r\n              m_bottom_left.y+double(m_rows-1)*m_spacing + m_spacing/2.0) );\r\n\r\n   int displayed_attribute;  // n.b., temp variable necessary to force recalc below\r\n\r\n   // our data read\r\n   stream.read((char *)&displayed_attribute,sizeof(displayed_attribute));\r\n   m_attributes->read( stream, m_layers );\r\n\r\n   m_points = depthmapX::ColumnMatrix<Point>(m_rows, m_cols);\r\n   \r\n   for (size_t j = 0; j < m_cols; j++) {\r\n      for (size_t k = 0; k < m_rows; k++) {\r\n         m_points(k, j).read(stream);\r\n\r\n         // check if occdistance of any pixel's bin is set, meaning that\r\n         // the isovist analysis was done\r\n         if(!m_hasIsovistAnalysis) {\r\n             for(int b = 0; b < 32; b++) {\r\n                if(m_points(k, j).m_node && m_points(k, j).m_node->occdistance(b) > 0) {\r\n                    m_hasIsovistAnalysis = true;\r\n                    break;\r\n                }\r\n             }\r\n         }\r\n      }\r\n\r\n\r\n      for (size_t k = 0; k < m_rows; k++) {\r\n         Point& pnt = m_points(k, j);\r\n         // Old style point node reffing and also unselects selected nodes which would otherwise be difficult\r\n\r\n         // would soon be better simply to turn off the select flag....\r\n         pnt.m_state &= ( Point::EMPTY | Point::FILLED | Point::MERGED | Point::BLOCKED | Point::CONTEXTFILLED | Point::EDGE);\r\n\r\n         // Set the node pixel if it exists:\r\n         if (pnt.m_node) {\r\n            pnt.m_node->setPixel(PixelRef(j,k));\r\n         }\r\n         // Add merge line if merged:\r\n         if (!pnt.m_merge.empty()) {\r\n             depthmapX::addIfNotExists(m_merge_lines, PixelRefPair(PixelRef(j,k),pnt.m_merge));\r\n         }\r\n      }\r\n   }\r\n\r\n   m_selection = NO_SELECTION;\r\n   m_pinned_selection = false;\r\n\r\n   m_initialised = true;\r\n   m_blockedlines = false;\r\n\r\n   stream.read((char *) &m_processed, sizeof(m_processed));\r\n   stream.read((char *) &m_boundarygraph, sizeof(m_boundarygraph));\r\n\r\n   // now, as soon as loaded, must recalculate our screen display:\r\n   // note m_displayed_attribute should be -2 in order to force recalc...\r\n   m_displayed_attribute = -2;\r\n   setDisplayedAttribute(displayed_attribute);\r\n\r\n   return true;\r\n}\r\n\r\nbool PointMap::write( std::ostream& stream )\r\n{\r\n   dXstring::writeString(stream, m_name);\r\n\r\n   stream.write( (char *) &m_spacing, sizeof(m_spacing) );\r\n\r\n   int rows = static_cast<int>(m_rows);\r\n   int cols = static_cast<int>(m_cols);\r\n   stream.write( reinterpret_cast<char *>(&rows), sizeof(rows) );\r\n   stream.write( reinterpret_cast<char *>(&cols), sizeof(cols) );\r\n\r\n   stream.write( (char *) &m_filled_point_count, sizeof(m_filled_point_count) );\r\n\r\n   stream.write( (char *) &m_bottom_left, sizeof(m_bottom_left) );\r\n\r\n   // TODO: Compatibility. The attribute columns will be stored sorted alphabetically\r\n   // so the displayed attribute needs to match that\r\n   int sortedDisplayedAttribute = m_attributes->getColumnSortedIndex(m_displayed_attribute);\r\n   stream.write( (char *) &sortedDisplayedAttribute, sizeof(sortedDisplayedAttribute) );\r\n\r\n   m_attributes->write( stream, m_layers );\r\n   \r\n   for (auto& point: m_points) {\r\n       point.write( stream );\r\n   }\r\n\r\n   stream.write((char *) &m_processed, sizeof(m_processed));\r\n   stream.write((char *) &m_boundarygraph, sizeof(m_boundarygraph));\r\n\r\n   return false;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n\r\n// Now what this class is actually for: making a visibility graph!\r\n\r\n// Visibility graph construction constants\r\n\r\nint PointMap::tagState(bool settag)\r\n{\r\n   m_selection_set.clear();\r\n   m_selection = NO_SELECTION;\r\n\r\n   int count = 0;\r\n\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n\r\n         PixelRef curs = PixelRef( i, j );\r\n\r\n         // First ensure only one of filled/empty/blocked is on:\r\n         Point& pt = getPoint(curs);\r\n         if (pt.filled() ) {\r\n            if (settag) {\r\n               pt.m_misc = count;\r\n               pt.m_processflag = 0x00FF; // process all quadrants\r\n            }\r\n            else {\r\n               pt.m_misc = 0;\r\n               pt.m_processflag = 0x0000; // reset process flag\r\n            }\r\n            count++;\r\n         }\r\n\r\n      }\r\n   }\r\n   return count;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n#include \"sparksieve2.h\"\r\n\r\n// The fast way to generate graphs... attempt 2\r\n// This uses the new points line segments to allow quick overlap comparisons\r\n// The spark method uses a 1024 long bit string to check against\r\n\r\n// writing the algo has thrown up something: it would be more appropriate to \r\n// have lines between the grid points, rather than centred on the grid square,\r\n// i.e.:\r\n//\r\n// .-.     ---\r\n// |X| not |.| (dots are the grid points)\r\n// .-.     ---\r\n//\r\n// Then wouldn't have to 'test twice' for the grid point being blocked...\r\n// ...perhaps a tweak for a later date!\r\n\r\nbool PointMap::sparkGraph2( Communicator *comm, bool boundarygraph, double maxdist )\r\n{\r\n   // Note, graph must be fixed (i.e., having blocking pixels filled in)\r\n\r\n   if (!m_blockedlines) {\r\n      blockLines();\r\n   }\r\n\r\n   if (boundarygraph) {\r\n      for (size_t i = 0; i < m_cols; i++) {\r\n         for (size_t j = 0; j < m_rows; j++) {\r\n            PixelRef curs = PixelRef( static_cast<short>(i), static_cast<short>(j) );\r\n            if ( getPoint( curs ).filled() && !getPoint( curs ).edge()) {\r\n               m_points(j, i).m_state &= ~Point::FILLED;\r\n               m_filled_point_count--;\r\n            }\r\n         }\r\n      }\r\n   }\r\n\r\n   // attributes table set up\r\n   // n.b. these must be entered in alphabetical order to preserve col indexing:\r\n   int connectivity_col = m_attributes->insertOrResetLockedColumn(\"Connectivity\");\r\n   m_attributes->insertOrResetColumn(\"Point First Moment\");\r\n   m_attributes->insertOrResetColumn(\"Point Second Moment\");\r\n\r\n   // pre-label --- allows faster node access later on\r\n   int count = tagState( true );\r\n\r\n   // start the timer when you know the true count including fixed points\r\n   \r\n   time_t atime = 0;\r\n   if (comm) {\r\n      qtimer( atime, 0 );\r\n      comm->CommPostMessage( Communicator::NUM_RECORDS, count );\r\n   }\r\n\r\n   count = 0;\r\n\r\n   for (size_t i = 0; i < m_cols; i++) {\r\n\r\n      for (size_t j = 0; j < m_rows; j++) {\r\n\r\n         PixelRef curs = PixelRef( i, j );\r\n   \r\n         if ( getPoint( curs ).getState() & Point::FILLED ) {\r\n\r\n            getPoint( curs ).m_node = std::unique_ptr<Node>(new Node());\r\n            m_attributes->addRow( AttributeKey(curs) );\r\n\r\n            sparkPixel2(curs,1,maxdist); // make flag of 1 suggests make this node, don't set reciprocral process flags on those you can see\r\n                                         // maxdist controls how far to see out to\r\n\r\n            count++;    // <- increment count\r\n\r\n            if (comm) {\r\n               if (qtimer( atime, 500 )) {\r\n                  if (comm->IsCancelled()) {\r\n                     tagState( false );         // <- the state field has been used for tagging visited nodes... set back to a state variable\r\n                     // (well, actually, no it hasn't!)\r\n                     // Should clear all nodes and attributes here:\r\n                     // Clear nodes\r\n                     // Clear attributes\r\n                     m_attributes->clear();\r\n                     m_displayed_attribute = -2;\r\n                     //\r\n                     throw Communicator::CancelledException();\r\n                  }\r\n                  comm->CommPostMessage( Communicator::CURRENT_RECORD, count );\r\n               }         \r\n            } // if (comm)\r\n         } // if ( getPoint( curs ).getState() & Point::FILLED )\r\n      } // rows\r\n   } // cols\r\n\r\n   tagState( false );  // <- the state field has been used for tagging visited nodes... set back to a state variable\r\n\r\n   // keeping lines blocked now is wasteful of memory... free the memory involved\r\n   unblockLines(false);\r\n\r\n   // and add grid connections\r\n   // (this is easier than trying to work it out per pixel as we calculate visibility)\r\n   addGridConnections();\r\n\r\n   // the graph is processed:\r\n   m_processed = true;\r\n   if (boundarygraph) {\r\n      m_boundarygraph = true;\r\n   }\r\n\r\n   // override and reset:\r\n   m_displayed_attribute = -2;\r\n   setDisplayedAttribute(connectivity_col);\r\n\r\n   return true;\r\n}\r\n\r\nbool PointMap::unmake(bool removeLinks) {\r\n    for (size_t i = 0; i < m_cols; i++) {\r\n        for (size_t j = 0; j < m_rows; j++) {\r\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\r\n            Point &pnt = getPoint(curs);\r\n            if (pnt.filled()) {\r\n                if(removeLinks) {\r\n                    pnt.m_merge = NoPixel;\r\n                }\r\n                pnt.m_grid_connections = 0;\r\n                pnt.m_node = nullptr;\r\n                pnt.m_lines.clear();\r\n                pnt.setBlock(false);\r\n            }\r\n        }\r\n    }\r\n\r\n    m_blockedlines = false;\r\n\r\n    if(removeLinks) {\r\n        m_merge_lines.clear();\r\n    }\r\n\r\n    m_attributes->clear();\r\n\r\n    m_processed = false;\r\n    m_boundarygraph = false;\r\n\r\n    m_displayed_attribute = -2;\r\n\r\n    return true;\r\n}\r\n\r\n// 'make' construct types are: \r\n// 1 -- build this node\r\n// 2 -- register the reciprocal q octant in nodes you can see as requiring processing\r\n\r\nbool PointMap::sparkPixel2(PixelRef curs, int make, double maxdist)\r\n{\r\n   static std::vector<PixelRef> bins_b[32];\r\n   static float far_bin_dists[32];\r\n   for (int i = 0; i < 32; i++) {\r\n      far_bin_dists[i] = 0.0f;\r\n   }\r\n   int neighbourhood_size = 0;\r\n   double total_dist = 0.0;\r\n   double total_dist_sqr = 0.0;\r\n\r\n   Point2f centre0 = depixelate(curs);\r\n\r\n   for (int q = 0; q < 8; q++) {\r\n\r\n      if (!((getPoint(curs).m_processflag) & (1 << q)) ) {\r\n         continue;\r\n      }\r\n\r\n      sparkSieve2 sieve(centre0, maxdist);\r\n      int depth = 0;\r\n\r\n      // attempt 0 depth line tests by taken appropriate quadrant\r\n      // from immediately around centre\r\n      // note regionate border must be greater than tolerance squared used in interection testing later\r\n      double border = m_spacing * 1e-10;\r\n      QtRegion viewport0 = regionate(curs, 1e-10);\r\n      switch (q) {\r\n      case 0:\r\n         viewport0.top_right.x = centre0.x;\r\n         viewport0.bottom_left.y = centre0.y - border;\r\n         break;\r\n      case 6:\r\n         viewport0.top_right.x = centre0.x + border;\r\n         viewport0.bottom_left.y = centre0.y;\r\n         break;\r\n      case 1:\r\n         viewport0.bottom_left.x = centre0.x;\r\n         viewport0.bottom_left.y = centre0.y - border;\r\n         break;\r\n      case 7:\r\n         viewport0.bottom_left.x = centre0.x - border;\r\n         viewport0.bottom_left.y = centre0.y;\r\n         break;\r\n      case 2:\r\n         viewport0.top_right.x = centre0.x;\r\n         viewport0.top_right.y = centre0.y + border;\r\n         break;\r\n      case 4:\r\n         viewport0.top_right.x = centre0.x + border;\r\n         viewport0.top_right.y = centre0.y;\r\n         break;\r\n      case 3:\r\n         viewport0.bottom_left.x = centre0.x;\r\n         viewport0.top_right.y = centre0.y + border;\r\n         break;\r\n      case 5:\r\n         viewport0.bottom_left.x = centre0.x - border;\r\n         viewport0.top_right.y = centre0.y;\r\n         break;\r\n      }\r\n      std::vector<Line> lines0;\r\n      for (const Line& line: getPoint(curs).m_lines)\r\n      {\r\n         Line l = line;\r\n         if (l.crop(viewport0)) {\r\n            lines0.push_back(l);\r\n         }\r\n      }\r\n      sieve.block(lines0, q);\r\n      sieve.collectgarbage();\r\n\r\n      std::vector<PixelRef> addlist;\r\n\r\n      for (depth = 1; sieve.hasGaps(); depth++) {\r\n\r\n         addlist.clear();   \r\n         if (!sieve2(sieve, addlist, q, depth, curs))\r\n         {\r\n            break;\r\n         }\r\n\r\n         for (size_t n = 0; n < addlist.size(); n++)\r\n         {\r\n            if (getPoint(addlist[n]).getState() & Point::FILLED)\r\n            {\r\n               int bin = whichbin(depixelate(addlist[n])-centre0);\r\n               if (make & 1) {\r\n                  // the blocked cells shouldn't contribute to point stats\r\n                  // note m_spacing is used to scale the moment of inertia appropriately\r\n                  double this_dist = dist(addlist[n],curs) * m_spacing;\r\n                  if (this_dist > far_bin_dists[bin]) {\r\n                     far_bin_dists[bin] = (float) this_dist;\r\n                  }\r\n                  total_dist += this_dist;\r\n                  total_dist_sqr += this_dist * this_dist;\r\n                  neighbourhood_size++;\r\n\r\n                  bins_b[bin].push_back( addlist[n] );\r\n               }\r\n               if (make & 2) {\r\n                  getPoint(addlist[n]).m_processflag |= q_opposite(bin);\r\n               }\r\n            }\r\n         }\r\n\r\n      }  // <- for (depth = 1; sieve.hasgaps(); depth++)\r\n\r\n   }  // <- for (int q = 0; q < 8; q++)\r\n\r\n   if (make & 1) {\r\n      // The bins are cleared in the make function!\r\n      Point& pt = getPoint( curs );\r\n      pt.m_node->make(curs, bins_b, far_bin_dists, pt.m_processflag);   // note: make clears bins!\r\n      AttributeRow& row = m_attributes->getRow( AttributeKey(curs) );\r\n      row.setValue( \"Connectivity\", float(neighbourhood_size) );\r\n      row.setValue( \"Point First Moment\", float(total_dist) );\r\n      row.setValue( \"Point Second Moment\", float(total_dist_sqr) );\r\n   }\r\n   else {\r\n      // Clear bins by hand if not using them to make\r\n      for (int i = 0; i < 32; i++) {\r\n         bins_b[i].clear();\r\n      }\r\n   }\r\n\r\n   // reset process flag\r\n   getPoint(curs).m_processflag = 0;\r\n\r\n   return true;\r\n}\r\n\r\nbool PointMap::sieve2(sparkSieve2& sieve, std::vector<PixelRef>& addlist, int q, int depth, PixelRef curs)\r\n{\r\n   bool hasgaps = false;\r\n   int firstind = 0;\r\n\r\n   for (auto iter = sieve.m_gaps.begin(); iter != sieve.m_gaps.end(); ++iter) {\r\n      // this goes through all open points\r\n      if (iter->remove) {\r\n         continue;\r\n      }\r\n      for (int ind = (int)ceil(iter->start * (depth - 0.5) - 0.5);\r\n               ind <= (int) floor(iter->end * (depth + 0.5) + 0.5); ind++) {\r\n         if (ind < firstind) {\r\n            continue;\r\n         }\r\n         if (ind > depth) {\r\n            break;\r\n         }\r\n         // this did say first = ind + 1, but I needed to change it to cope with vertical lines\r\n         // I have a feeling the ind + 1 was there for a reason!\r\n         // (if there to cope with boundary graph, could easily simply use ind + 1 in the specific check)\r\n         firstind = ind; \r\n\r\n         // x and y are calculated using Grad's whichbin q quadrants\r\n         int x = (q >= 4 ? ind : depth);\r\n         int y = (q >= 4 ? depth : ind);\r\n\r\n         PixelRef here = PixelRef( \r\n                           curs.x + (q % 2 ? x : -x), curs.y + (q <= 1 || q >= 6 ? y : -y) );\r\n\r\n         if (includes(here)) {\r\n            hasgaps = true;\r\n            // centre gap checks to see if the point is blocked itself\r\n            bool centregap = (double(ind) >= (iter->start * depth) &&\r\n                              double(ind) <= (iter->end * depth));\r\n\r\n            if (centregap && (getPoint(here).m_state & Point::FILLED)) {\r\n               // don't repeat axes / diagonals\r\n               if ((ind != 0 || q == 0 || q == 1 || q == 5 || q == 6) && (ind != depth || q < 4)) {\r\n                  // block test as usual [tested 31.10.04 -- MUST use 1e-10 for Gassin at 10 grid spacing]\r\n                  if (!sieve.testblock(depixelate(here), getPoint(here).m_lines, m_spacing * 1e-10))  \r\n                  {\r\n                     addlist.push_back(here);\r\n                  }\r\n               }\r\n            }\r\n            sieve.block( getPoint(here).m_lines, q );\r\n         }\r\n      }\r\n   }\r\n   sieve.collectgarbage();\r\n\r\n   return hasgaps;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool PointMap::binDisplay(Communicator *)\r\n{\r\n   int bindisplay_col = m_attributes->insertOrResetColumn(\"Node Bins\");\r\n\r\n   for (auto& sel: m_selection_set) {\r\n      Point& p = getPoint(sel);\r\n      // Code for colouring pretty bins:\r\n      for (int i = 0; i < 32; i++) {\r\n         Bin& b = p.m_node->bin(i);\r\n         b.first();\r\n         while(!b.is_tail()) {\r\n            //m_attributes->setValue( row, bindisplay_col, float((i % 8) + 1) );\r\n            m_attributes->getRow(AttributeKey(b.cursor())).setValue( bindisplay_col, float(b.distance()) );\r\n            b.next();   \r\n         }\r\n      }\r\n   }\r\n\r\n   // override and reset:\r\n   m_displayed_attribute = -2;\r\n   setDisplayedAttribute(bindisplay_col);\r\n\r\n   return true;\r\n}\r\n\r\n\r\n// Merge connections... very fiddly indeed... using a simple method for now...\r\n// ...and even that's too complicated... so I'll settle for a very, very simple\r\n// merge points (just a reference to another point --- yes, that simple!)\r\n\r\n// the first point should have been selected, the second is chosen now:\r\n\r\nbool PointMap::mergePoints(const Point2f& p)\r\n{\r\n   if (!m_selection_set.size()) {\r\n      return false;\r\n   }\r\n\r\n   // note that in a multiple selection, the point p is adjusted by the selection bounds\r\n   PixelRef bl = pixelate(m_sel_bounds.bottom_left);\r\n   PixelRef tr = pixelate(m_sel_bounds.top_right);\r\n   //\r\n   PixelRef offset = pixelate(p) - PixelRef(tr.x,bl.y);\r\n   //\r\n   for (auto& sel: m_selection_set) {\r\n      PixelRef a = sel;\r\n      PixelRef b = ((PixelRef)sel) + offset;\r\n      // check in limits:\r\n      if (includes(b) && getPoint(b).filled()) {\r\n         mergePixels(a,b);\r\n      }\r\n   }\r\n   clearSel();\r\n   \r\n   return true;\r\n}\r\n\r\nbool PointMap::unmergePoints()\r\n{\r\n   if (!m_selection_set.size()) {\r\n      return false;\r\n   }\r\n   for (auto& sel: m_selection_set) {\r\n      PixelRef a = sel;\r\n      Point p = getPoint(a);\r\n      if(p.getMergePixel() != NoPixel) {\r\n        unmergePixel(a);\r\n      }\r\n   }\r\n   clearSel();\r\n   return true;\r\n}\r\n\r\n// Either of the pixels can be given here and the other will also be unmerged\r\nbool PointMap::unmergePixel(PixelRef a) {\r\n    PixelRef c = getPoint(a).m_merge;\r\n    depthmapX::findAndErase(m_merge_lines, PixelRefPair(a,c));\r\n    getPoint(c).m_merge = NoPixel;\r\n    getPoint(c).m_state &= ~Point::MERGED;\r\n    getPoint(a).m_merge = NoPixel;\r\n    getPoint(a).m_state &= ~Point::MERGED;\r\n    return true;\r\n}\r\n\r\nbool PointMap::mergePixels(PixelRef a, PixelRef b)\r\n{\r\n   if (a == b && !getPoint(a).m_merge.empty()) {\r\n       unmergePixel(a);\r\n   }\r\n   if (a != b && getPoint(a).m_merge != b) {\r\n      if (!getPoint(a).m_merge.empty()) {\r\n         PixelRef c = getPoint(a).m_merge;\r\n         auto it = std::find(m_merge_lines.begin(), m_merge_lines.end(), PixelRefPair(a,c));\r\n         if(it != m_merge_lines.end())\r\n             m_merge_lines.erase(it);\r\n         getPoint(c).m_merge = NoPixel;\r\n         getPoint(c).m_state &= ~Point::MERGED;\r\n      }\r\n      if (!getPoint(b).m_merge.empty()) {\r\n         PixelRef c = getPoint(b).m_merge;\r\n         auto it = std::find(m_merge_lines.begin(), m_merge_lines.end(), PixelRefPair(b,c));\r\n         if(it != m_merge_lines.end())\r\n             m_merge_lines.erase(it);\r\n         getPoint(c).m_merge = NoPixel;\r\n         getPoint(c).m_state &= ~Point::MERGED;\r\n      }\r\n      getPoint(a).m_merge = b;\r\n      getPoint(a).m_state |= Point::MERGED;\r\n      getPoint(b).m_merge = a;\r\n      getPoint(b).m_state |= Point::MERGED;\r\n      m_merge_lines.push_back(PixelRefPair(a,b));\r\n   }\r\n\r\n   // actually this return now triggers redraw whatever\r\n   // rather than passing back altered status (as a point must be deselected)\r\n   return true;\r\n}\r\n\r\nvoid PointMap::mergeFromShapeMap(const ShapeMap& shapemap)\r\n{\r\n   const std::map<int,SalaShape>& polygons = shapemap.getAllShapes();\r\n   for (auto polygon: polygons) {\r\n      const SalaShape& poly = polygon.second;\r\n      if (poly.isLine()) {\r\n         PixelRef a = pixelate(poly.getLine().start());\r\n         PixelRef b = pixelate(poly.getLine().end());\r\n         if (getPoint(a).filled() && getPoint(b).filled()) {\r\n            mergePixels(a,b);\r\n         }\r\n      }\r\n   }\r\n}\r\n\r\nbool PointMap::isPixelMerged(const PixelRef& a)\r\n{\r\n    return !getPoint(a).m_merge.empty();\r\n}\r\n\r\n\r\n// -2 for point not in visibility graph, -1 for point has no data\r\ndouble PointMap::getLocationValue(const Point2f& point)\r\n{\r\n   double val = -2;\r\n\r\n   // \"false\" does not constrain to bounds\r\n   PixelRef pix = pixelate(point, false);\r\n   // quick check for outside row / col bounds:\r\n   if (!includes(pix)) {\r\n      return val;\r\n   }\r\n\r\n   if (!getPoint(pix).filled()) {\r\n      val = -2;\r\n   }\r\n   else if (m_displayed_attribute == -1) {\r\n      val = static_cast<float>(pix);\r\n   } else {\r\n      val = m_attributes->getRow(AttributeKey(pix)).getValue(m_displayed_attribute);\r\n   }\r\n\r\n   return val;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n// Update connections will load an old graph and add char information\r\n\r\nvoid PointMap::addGridConnections()\r\n{\r\n   for (auto iter = m_attributes->begin(); iter != m_attributes->end(); iter++) {\r\n      PixelRef curs = iter->getKey().value;\r\n      PixelRef node = curs.right();\r\n      Point& point = getPoint(curs);\r\n      point.m_grid_connections = 0;\r\n      for (int i = 0; i < 32; i += 4) {\r\n         Bin& bin = point.m_node->bin(i);\r\n         bin.first();\r\n         while (!bin.is_tail()) {\r\n            if (node == bin.cursor()) {\r\n               point.m_grid_connections |= (1 << (i / 4));\r\n               break;\r\n            }\r\n            bin.next();\r\n         }\r\n         char dir = PixelRef::NODIR;\r\n         if (i == 0) {\r\n            dir = PixelRef::VERTICAL;\r\n         }\r\n         else if (i == 4 || i == 8) {\r\n            dir = PixelRef::NEGHORIZONTAL;\r\n         }\r\n         else if (i == 12 || i == 16) {\r\n            dir = PixelRef::NEGVERTICAL;\r\n         }\r\n         else if (i == 20 || i == 24) {\r\n            dir = PixelRef::HORIZONTAL;\r\n         }\r\n         node.move(dir);\r\n      }\r\n   }\r\n}\r\n\r\n// value in range 0 to 1\r\nPixelRef PointMap::pickPixel(double value) const\r\n{\r\n   int which = (int)ceil(value * m_rows * m_cols) - 1;\r\n   return PixelRef(which % m_cols, which / m_cols);\r\n}\r\n"
  },
  {
    "path": "salalib/pointdata.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#ifndef __POINTDATA_H__\r\n#define __POINTDATA_H__\r\n\r\n#include \"salalib/spacepixfile.h\"\r\n#include \"genlib/exceptions.h\"\r\n#include \"salalib/point.h\"\r\n#include \"salalib/options.h\"\r\n#include \"salalib/attributetable.h\"\r\n#include <vector>\r\n#include <set>\r\n#include <deque>\r\n\r\nclass MetaGraph;\r\nclass PointMap;\r\nclass PafAgent;\r\nclass ShapeMap;\r\n\r\nclass OldPoint1 {\r\n   friend class PointMap;\r\nprotected:\r\n   int m_noderef;\r\n   int m_state;\r\n};\r\n\r\nclass OldPoint2 {\r\n   friend class PointMap;\r\nprotected:\r\n   int m_noderef;\r\n   int m_state;\r\n   int m_misc;\r\n};\r\n\r\nclass Bin;\r\nclass Isovist;\r\n\r\nstruct PixelVec;\r\n\r\n\r\n\r\nclass sparkSieve2;\r\n\r\nnamespace depthmapX\r\n{\r\n    enum PointMapExceptionType{NO_ISOVIST_ANALYSIS};\r\n    class PointMapException: public depthmapX::RuntimeException {\r\n    private:\r\n        PointMapExceptionType m_errorType;\r\n    public:\r\n        PointMapException(PointMapExceptionType errorType, std::string message) : depthmapX::RuntimeException(message)\r\n        {\r\n            m_errorType = errorType;\r\n        }\r\n        PointMapExceptionType getErrorType() const {\r\n            return m_errorType;\r\n        }\r\n    };\r\n}\r\n\r\nclass PointMap : public PixelBase\r\n{\r\n   friend class PointMaps;\r\n   friend class MapInfoData; // <- for mapinfo export\r\n   // MetaGraph is a friend for two functions:\r\n   // convertAttributes: this really should not be at the metagraph level!  Fix!\r\n   // pushValuesToLayer: this swaps values from a PointMap to a DataLayer, and it needs to be changed in the future\r\n   // (e.g., when making DataLayers into ShapeMaps)\r\n   friend class MetaGraph;\r\npublic:\r\n   bool m_hasIsovistAnalysis = false;\r\n   const std::vector<SpacePixelFile>& getDrawingFiles() { return *m_drawingFiles; }\r\nprotected:\r\n   std::string m_name;\r\n   const QtRegion* m_parentRegion;\r\n   const std::vector<SpacePixelFile>* m_drawingFiles;\r\n   depthmapX::ColumnMatrix<Point> m_points;    // will contain the graph reference when created\r\n   int m_filled_point_count;\r\n   double m_spacing;\r\n   Point2f m_offset;\r\n   Point2f m_bottom_left;\r\n   bool m_initialised;\r\n   bool m_blockedlines;\r\n   bool m_processed;\r\n   bool m_boundarygraph;\r\n   int m_undocounter;\r\n   std::vector<PixelRefPair> m_merge_lines;\r\nprivate:\r\n   std::unique_ptr<AttributeTable> m_attributes;\r\n   std::unique_ptr<AttributeTableHandle> m_attribHandle;\r\n   LayerManagerImpl m_layers;\r\npublic:\r\n   PointMap(const QtRegion& parentRegion, const std::vector<SpacePixelFile>& drawingFiles,\r\n            const std::string& name = std::string(\"VGA Map\"));\r\n   virtual ~PointMap() {}\r\n   void copy(const PointMap& other);\r\n   const std::string& getName() const\r\n   { return m_name; }\r\n\r\n   PointMap(PointMap&& other):\r\n              m_parentRegion(std::move(other.m_parentRegion)),\r\n              m_drawingFiles(std::move(other.m_drawingFiles)),\r\n              m_points(std::move(other.m_points)),\r\n              m_attributes(std::move(other.m_attributes)),\r\n              m_attribHandle(std::move(other.m_attribHandle)),\r\n              m_layers(std::move(other.m_layers)) {\r\n       copy(other);\r\n   }\r\n   PointMap& operator =(PointMap&& other) {\r\n       m_parentRegion = std::move(other.m_parentRegion);\r\n       m_drawingFiles = std::move(other.m_drawingFiles);\r\n       m_points = std::move(other.m_points);\r\n       m_attributes = std::move(other.m_attributes);\r\n       m_attribHandle = std::move(other.m_attribHandle);\r\n       m_layers = std::move(other.m_layers);\r\n       copy(other);\r\n       return *this;\r\n   }\r\n   PointMap(const PointMap& ) = delete;\r\n   PointMap& operator =(const PointMap&) = delete;\r\n\r\n   void communicate( time_t& atime, Communicator *comm, int record );\r\n   // constrain is constrain to existing rows / cols\r\n   PixelRef pixelate( const Point2f& p, bool constrain = true, int scalefactor = 1 ) const;\r\n   Point2f depixelate( const PixelRef& p, double scalefactor = 1.0 ) const;   // Inlined below\r\n   QtRegion regionate( const PixelRef& p, double border ) const;     // Inlined below\r\n   bool setGrid(double spacing, const Point2f& offset = Point2f());\r\n   std::vector<std::pair<PixelRef, PixelRef>> getMergedPixelPairs()\r\n   {\r\n       // unnecessary converter until the m_merge_lines variable is\r\n       // replaced with a std container\r\n       std::vector<std::pair<PixelRef, PixelRef>> mergedPixelPairs;\r\n       for (size_t i = 0; i < m_merge_lines.size(); i++) {\r\n           mergedPixelPairs.push_back(std::make_pair(m_merge_lines[i].a, m_merge_lines[i].b));\r\n       }\r\n       return mergedPixelPairs;\r\n   }\r\n   //\r\n   bool isProcessed() const\r\n   { return m_processed; }\r\n   void fillLine(const Line& li);\r\n   bool blockLines();\r\n   void blockLine(const Line& li);\r\n   void unblockLines(bool clearblockedflag = true);\r\n   bool fillPoint(const Point2f& p, bool add = true); // use add = false for remove point\r\n   //bool blockPoint(const Point2f& p, bool add = true); // no longer used\r\n   //\r\n   bool makePoints(const Point2f& seed, int fill_type, Communicator *comm = nullptr); // Point2f non-reference deliberate\r\n   bool clearPoints();  // Clear *selected* points\r\n   bool undoPoints();\r\n   bool canUndo() const\r\n      { return !m_processed && m_undocounter != 0; }\r\n   void outputPoints(std::ostream& stream, char delim );\r\n   void outputMergeLines(std::ostream& stream, char delim);\r\n   int  tagState(bool settag);\r\n   bool sparkGraph2(Communicator *comm, bool boundarygraph, double maxdist );\r\n   bool unmake(bool removeLinks);\r\n   bool sparkPixel2(PixelRef curs, int make, double maxdist = -1.0);\r\n   bool sieve2(sparkSieve2& sieve, std::vector<PixelRef>& addlist, int q, int depth, PixelRef curs);\r\n   // bool makeGraph( Graph& graph, int optimization_level = 0, Communicator *comm = NULL);\r\n   //\r\n   bool binDisplay(Communicator *);\r\n   bool mergePoints(const Point2f& p);\r\n   bool unmergePoints();\r\n   bool unmergePixel(PixelRef a);\r\n   bool mergePixels(PixelRef a, PixelRef b);\r\n   void mergeFromShapeMap(const ShapeMap& shapemap);\r\n   bool isPixelMerged(const PixelRef &a);\r\n\r\n   void outputSummary(std::ostream& myout, char delimiter = '\\t');\r\n   void outputMif(std::ostream& miffile, std::ostream& midfile );\r\n   void outputNet(std::ostream& netfile );\r\n   void outputConnections(std::ostream& myout);\r\n   void outputBinSummaries(std::ostream& myout);\r\n\r\n   const Point& getPoint(const PixelRef& p) const\r\n      { return m_points(static_cast<size_t>(p.y), static_cast<size_t>(p.x)); }\r\n   Point& getPoint(const PixelRef& p)\r\n      { return m_points(static_cast<size_t>(p.y), static_cast<size_t>(p.x)); }\r\n   depthmapX::BaseMatrix<Point>& getPoints() { return m_points; }\r\n   const int& pointState( const PixelRef& p ) const\r\n      { return m_points(static_cast<size_t>(p.y), static_cast<size_t>(p.x)).m_state; }\r\n   // to be phased out\r\n   bool blockedAdjacent( const PixelRef p ) const;\r\n   //\r\n   int getFilledPointCount() const\r\n      { return m_filled_point_count; }\r\n   //\r\n   void requireIsovistAnalysis()\r\n   {\r\n       if(!m_hasIsovistAnalysis) {\r\n           throw depthmapX::PointMapException(depthmapX::PointMapExceptionType::NO_ISOVIST_ANALYSIS, \"Current pointmap does not contain isovist analysis\");\r\n       }\r\n   }\r\nprotected:\r\n   int expand( const PixelRef p1, const PixelRef p2, PixelRefVector& list, int filltype );\r\n   //\r\n   //void walk( PixelRef& start, int steps, Graph& graph,\r\n   //           int parity, int dominant_axis, const int grad_pair[] );\r\n\r\n   // Selection functionality\r\nprotected:\r\n   enum { NO_SELECTION = 0, SINGLE_SELECTION = 1, COMPOUND_SELECTION = 2, LAYER_SELECTION = 4, OVERRIDE_SELECTION = 8 };\r\n   int m_selection;\r\n   bool m_pinned_selection;\r\n   std::set<int> m_selection_set;      // n.b., m_selection_set stored as int for compatibility with other map layers\r\n   mutable PixelRef s_bl;\r\n   mutable PixelRef s_tr;\r\npublic:\r\n   bool isSelected() const                              // does a selection exist\r\n      { return m_selection != NO_SELECTION; }\r\n   bool clearSel(); // clear the current selection\r\n   bool setCurSel( QtRegion& r, bool add = false ); // set current selection\r\n   bool setCurSel(const std::vector<int> &selset, bool add = false );\r\n   // Note: passed by ref, use with care in multi-threaded app\r\n   std::set<int>& getSelSet()\r\n      { return m_selection_set; }\r\n   const std::set<int>& getSelSet() const\r\n      { return m_selection_set; }\r\n   //\r\n   PixelRefVector getLayerPixels(int layer);\r\n\r\n   // Attribute functionality\r\nprotected:\r\n   // which attribute is currently displayed:\r\n   mutable int m_displayed_attribute;\r\npublic:\r\n   int addAttribute(const std::string& name)\r\n      { return m_attributes->insertOrResetColumn(name); }\r\n   void removeAttribute(int col)\r\n      { m_attributes->removeColumn(col); }\r\n   // I don't want to do this, but every so often you will need to update this table\r\n   // use const version by preference\r\n   AttributeTable& getAttributeTable()\r\n      { return *m_attributes.get(); }\r\n   const AttributeTable& getAttributeTable() const\r\n      { return *m_attributes.get(); }\r\n   LayerManagerImpl& getLayers()\r\n      { return m_layers; }\r\n   const LayerManagerImpl& getLayers() const\r\n      { return m_layers; }\r\n   AttributeTableHandle& getAttributeTableHandle()\r\n      { return *m_attribHandle.get(); }\r\n   const AttributeTableHandle& getAttributeTableHandle() const\r\n      { return *m_attribHandle.get(); }\r\npublic:\r\n   double getDisplayMinValue() const\r\n   { return (m_displayed_attribute != -1) ? m_attributes->getColumn(m_displayed_attribute).getStats().min : 0; }\r\n\r\n   double getDisplayMaxValue() const\r\n   { return (m_displayed_attribute != -1) ? m_attributes->getColumn(m_displayed_attribute).getStats().max : pixelate(m_region.top_right).x; }\r\n\r\n   const DisplayParams& getDisplayParams() const\r\n   { return m_attributes->getColumn(m_displayed_attribute).getDisplayParams(); }\r\n   // make a local copy of the display params for access speed:\r\n   void setDisplayParams(const DisplayParams& dp, bool apply_to_all = false)\r\n   { if (apply_to_all)\r\n        m_attributes->setDisplayParams(dp);\r\n     else\r\n        m_attributes->getColumn(m_displayed_attribute).setDisplayParams(dp);\r\n   }\r\n   //\r\npublic:\r\n   void setDisplayedAttribute( int col );\r\n   // use set displayed attribute instead unless you are deliberately changing the column order:\r\n   void overrideDisplayedAttribute(int attribute)\r\n   { m_displayed_attribute = attribute; }\r\n   // now, there is a slightly odd thing here: the displayed attribute can go out of step with the underlying\r\n   // attribute data if there is a delete of an attribute in idepthmap.h, so it just needs checking before returning!\r\n   int getDisplayedAttribute() const\r\n   {\r\n     if (m_displayed_attribute == m_attribHandle->getDisplayColIndex()) return m_displayed_attribute;\r\n     if (m_attribHandle->getDisplayColIndex() != -2) {\r\n        m_displayed_attribute = m_attribHandle->getDisplayColIndex();\r\n     }\r\n     return m_displayed_attribute; }\r\n\r\n   float getDisplayedSelectedAvg() {\r\n       return(m_attributes->getSelAvg(m_displayed_attribute));\r\n   }\r\n\r\n   double getLocationValue(const Point2f& point);\r\n   //\r\n   // Screen functionality\r\npublic:\r\n   enum {VIEW_ATTRIBUTES, VIEW_MERGED, VIEW_LAYERS, VIEW_AGENTS};\r\nprotected:\r\n   int m_viewing_deprecated;\r\n   int m_draw_step;\r\n   mutable bool m_finished;\r\n   mutable PixelRef bl;\r\n   mutable PixelRef cur;   // cursor for points\r\n   mutable PixelRef rc;    // cursor for grid lines\r\n   mutable PixelRef prc;   // cursor for point lines\r\n   mutable PixelRef tr;\r\n   mutable int curmergeline;\r\n   mutable QtRegion m_sel_bounds;\r\npublic:\r\n   void setScreenPixel( double m_unit );\r\n   void makeViewportPoints( const QtRegion& viewport ) const;\r\n   bool findNextPoint() const;\r\n   Point2f getNextPointLocation() const\r\n   { return getPoint(cur).m_location; }\r\n   bool findNextRow() const;\r\n   Line getNextRow() const;\r\n   bool findNextPointRow() const;\r\n   Line getNextPointRow() const;\r\n   bool findNextCol() const;\r\n   Line getNextCol() const;\r\n   bool findNextPointCol() const;\r\n   Line getNextPointCol() const;\r\n   bool findNextMergeLine() const;\r\n   Line getNextMergeLine() const;\r\n   bool getPointSelected() const;\r\n   PafColor getPointColor(PixelRef pixelRef) const;\r\n   PafColor getCurrentPointColor() const;\r\n   int getSelCount()\r\n      { return (int) m_selection_set.size(); }\r\n   const QtRegion& getSelBounds() const\r\n      { return m_sel_bounds; }\r\n   //\r\n   double getSpacing() const\r\n   { return m_spacing; }\r\n   //\r\npublic:\r\n   // this is an odd helper function, value in range 0 to 1\r\n   PixelRef pickPixel(double value) const;\r\npublic:\r\n   bool read(std::istream &stream);\r\n   bool write(std::ostream &stream);\r\n   void addGridConnections(); // adds grid connections where graph does not include them\r\n   void outputConnectionsAsCSV(std::ostream &myout, std::string delim = \",\");\r\n   void outputLinksAsCSV(std::ostream &myout, std::string delim = \",\");\r\n};\r\n\r\n// inlined to make thread safe\r\n\r\ninline Point2f PointMap::depixelate( const PixelRef& p, double scalefactor ) const\r\n{\r\n   return Point2f( m_bottom_left.x + m_spacing * scalefactor * double(p.x),\r\n                   m_bottom_left.y + m_spacing * scalefactor * double(p.y) );\r\n}\r\n\r\ninline QtRegion PointMap::regionate( const PixelRef& p, double border ) const\r\n{\r\n   return QtRegion(\r\n         Point2f( m_bottom_left.x + m_spacing * (double(p.x) - 0.5 - border),\r\n                  m_bottom_left.y + m_spacing * (double(p.y) - 0.5 - border)),\r\n         Point2f( m_bottom_left.x + m_spacing * (double(p.x) + 0.5 + border),\r\n                  m_bottom_left.y + m_spacing * (double(p.y) + 0.5 + border))\r\n      );\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// A helper class for metric integration\r\n\r\n// to allow a dist / PixelRef pair for easy sorting\r\n// (have to do comparison operation on both dist and PixelRef as\r\n// otherwise would have a duplicate key for pqmap / pqvector)\r\n\r\nstruct MetricTriple\r\n{\r\n   float dist;\r\n   PixelRef pixel;\r\n   PixelRef lastpixel;\r\n   MetricTriple(float d = 0.0f, PixelRef p = NoPixel, PixelRef lp = NoPixel)\r\n   {\r\n      dist = d; pixel = p; lastpixel = lp;\r\n   }\r\n   friend bool operator == (const MetricTriple& mp1, const MetricTriple& mp2);\r\n   friend bool operator < (const MetricTriple& mp1, const MetricTriple& mp2);\r\n   friend bool operator > (const MetricTriple& mp1, const MetricTriple& mp2);\r\n   friend bool operator != (const MetricTriple& mp1, const MetricTriple& mp2);\r\n};\r\n\r\ninline bool operator == (const MetricTriple& mp1, const MetricTriple& mp2)\r\n{ return (mp1.dist == mp2.dist && mp1.pixel == mp2.pixel); }\r\ninline bool operator < (const MetricTriple& mp1, const MetricTriple& mp2)\r\n{ return (mp1.dist < mp2.dist) || (mp1.dist == mp2.dist && mp1.pixel < mp2.pixel); }\r\ninline bool operator > (const MetricTriple& mp1, const MetricTriple& mp2)\r\n{ return (mp1.dist > mp2.dist) || (mp1.dist == mp2.dist && mp1.pixel > mp2.pixel); }\r\ninline bool operator != (const MetricTriple& mp1, const MetricTriple& mp2)\r\n{ return (mp1.dist != mp2.dist) || (mp1.pixel != mp2.pixel); }\r\n\r\n// Note: angular triple simply based on metric triple\r\n\r\nstruct AngularTriple\r\n{\r\n   float angle;\r\n   PixelRef pixel;\r\n   PixelRef lastpixel;\r\n   AngularTriple(float a = 0.0f, PixelRef p = NoPixel, PixelRef lp = NoPixel)\r\n   {\r\n      angle = a; pixel = p; lastpixel = lp;\r\n   }\r\n   friend bool operator == (const AngularTriple& mp1, const AngularTriple& mp2);\r\n   friend bool operator < (const AngularTriple& mp1, const AngularTriple& mp2);\r\n   friend bool operator > (const AngularTriple& mp1, const AngularTriple& mp2);\r\n   friend bool operator != (const AngularTriple& mp1, const AngularTriple& mp2);\r\n};\r\n\r\ninline bool operator == (const AngularTriple& mp1, const AngularTriple& mp2)\r\n{ return (mp1.angle == mp2.angle && mp1.pixel == mp2.pixel); }\r\ninline bool operator < (const AngularTriple& mp1, const AngularTriple& mp2)\r\n{ return (mp1.angle < mp2.angle) || (mp1.angle == mp2.angle && mp1.pixel < mp2.pixel); }\r\ninline bool operator > (const AngularTriple& mp1, const AngularTriple& mp2)\r\n{ return (mp1.angle > mp2.angle) || (mp1.angle == mp2.angle && mp1.pixel > mp2.pixel); }\r\ninline bool operator != (const AngularTriple& mp1, const AngularTriple& mp2)\r\n{ return (mp1.angle != mp2.angle) || (mp1.pixel != mp2.pixel); }\r\n\r\n// true grads are also similar to generated grads...\r\n// this scruffy helper function converts a true grad to a bin:\r\n\r\n// (now corrected as of 2.1008r!)\r\n\r\ninline int whichbin( const Point2f& grad )\r\n{\r\n   int bin = 0;\r\n   double ratio;\r\n\r\n\r\n   // This is only for true gradients...\r\n   //    ...see below for calculated gradients\r\n   //\r\n   // Octant:\r\n   //       +     -\r\n   //    - \\ 8 | 8 / +\r\n   //      16\\ | / 0\r\n   //      ---- ----\r\n   //      16/ | \\32\r\n   //    + /24 | 24\\ -\r\n   //      -      +\r\n\r\n   if (fabs(grad.y) > fabs(grad.x)) {\r\n      bin = 1; // temporary: label y priority\r\n   }\r\n\r\n   if (bin == 0) {\r\n      ratio = fabs(grad.y) / fabs(grad.x);\r\n\r\n      // now actual bin number\r\n      if (grad.x > 0.0) {\r\n         if (grad.y >= 0.0) {\r\n            bin = 0;\r\n         }\r\n         else {\r\n            bin = -32;\r\n         }\r\n      }\r\n      else {\r\n         if (grad.y >= 0.0) {\r\n            bin = -16;\r\n         }\r\n         else {\r\n            bin = 16;\r\n         }\r\n      }\r\n   }\r\n   else {\r\n      ratio = fabs(grad.x) / fabs(grad.y);\r\n\r\n      // now actual bin number\r\n      if (grad.y > 0.0) {\r\n         if (grad.x >= 0.0) {\r\n            bin = -8;\r\n         }\r\n         else {\r\n            bin = 8;\r\n         }\r\n      }\r\n      else {\r\n         if (grad.x >= 0.0) {\r\n            bin = 24;\r\n         }\r\n         else {\r\n            bin = -24;\r\n         }\r\n      }\r\n   }\r\n\r\n   if (ratio < 1e-12) {\r\n      // nop\r\n   }\r\n   else if (ratio < 0.2679491924311227) {   // < 15 degrees\r\n      bin += 1;\r\n   }\r\n   else if (ratio < 0.5773502691896257) {   // < 30 degrees\r\n      bin += 2;\r\n   }\r\n   else if (ratio < 1.0 - 1e-12) {          // < 45 degrees\r\n      bin += 3;\r\n   }\r\n   else {\r\n      bin += 4;\r\n   }\r\n\r\n   if (bin < 0) {\r\n      bin = -bin;\r\n   }\r\n   // this is necessary:\r\n   bin = bin % 32;\r\n\r\n   return bin;\r\n}\r\n\r\n/////////////////////////////////\r\n\r\n// Another helper to write down the q-octant from any bin, in shifted format\r\n// note that sieve2 has been used to get the precise required q-octant for the bin\r\n\r\ninline int processoctant(int bin)\r\n{\r\n   int q = -1;\r\n   switch (bin) {\r\n   case 0: case 1: case 2: case 3: case 4:\r\n      q = 1; break;\r\n   case 5: case 6: case 7:\r\n      q = 7; break;\r\n   case 8: case 9: case 10: case 11:\r\n      q = 6; break;\r\n   case 12: case 13: case 14: case 15: case 16:\r\n      q = 0; break;\r\n   case 17: case 18: case 19: case 20:\r\n      q = 2; break;\r\n   case 21: case 22: case 23:\r\n      q = 4; break;\r\n   case 24: case 25: case 26: case 27:\r\n      q = 5; break;\r\n   case 28: case 29: case 30: case 31:\r\n      q = 3; break;\r\n   }\r\n\r\n   return (1 << q);\r\n}\r\n\r\n// ...but in order to determine what *needs* processing, we need this octant:\r\n\r\ninline int flagoctant(int bin)\r\n{\r\n   int q = 0;\r\n\r\n   // have to use two q octants if you are on diagonals or axes...\r\n   switch (bin) {\r\n   case 0:\r\n      q |= 1 << 1; q |= 1 << 3; break;\r\n   case 1: case 2: case 3:\r\n      q |= 1 << 1; break;\r\n   case 4:\r\n      q |= 1 << 1; q |= 1 << 7; break;\r\n   case 5: case 6: case 7:\r\n      q |= 1 << 7; break;\r\n   case 8:\r\n      q |= 1 << 7; q |= 1 << 6; break;\r\n   case 9: case 10: case 11:\r\n      q = 1 << 6; break;\r\n   case 12:\r\n      q |= 1 << 6; q |= 1 << 0; break;\r\n   case 13: case 14: case 15:\r\n      q |= 1 << 0; break;\r\n   case 16:\r\n      q |= 1 << 0; q |= 1 << 2; break;\r\n   case 17: case 18: case 19:\r\n      q |= 1 << 2; break;\r\n   case 20:\r\n      q |= 1 << 2; q |= 1 << 4; break;\r\n   case 21: case 22: case 23:\r\n      q |= 1 << 4; break;\r\n   case 24:\r\n      q |= 1 << 4; q |= 1 << 5; break;\r\n   case 25: case 26: case 27:\r\n      q |= 1 << 5; break;\r\n   case 28:\r\n      q |= 1 << 5; q |= 1 << 3; break;\r\n   case 29: case 30: case 31:\r\n      q |= 1 << 3; break;\r\n   }\r\n\r\n   return q;\r\n}\r\n\r\n\r\n// Another helper, this time to write down the q-octant for the bin opposing you\r\n\r\ninline int q_opposite(int bin)\r\n{\r\n   int opposing_bin = (16 + bin) % 32;\r\n\r\n   /*\r\n    *       \\ 6 | 7 /\r\n    *      0 \\ | / 1\r\n    *      - -   - -\r\n    *      2 / | \\ 3\r\n    *      / 4 | 5 \\\r\n    */\r\n\r\n   return flagoctant(opposing_bin);\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "salalib/salaprogram.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2011-2012, Tasos Varoudis\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n// salaprogram.cpp - a component of the depthmapX - spatial network analysis platform\n// SalaScripting language\n\n\n/////////////////////////////////////////////////////////////////////////\n\n// SalaScripting language\n\n// A \"Pythonesque\" language, which is pre-interpretted, and thus generally\n// should run fairly fast\n\n// The class implementation is very much hardcoded for built-in classes,\n// so user defined classes will be difficult to implement\n// (but would you really want classes in an inbuilt scripting language?! -- I guess some people would)\n\n// User defined functions are not included yet, but should be fairly easy using a global function stack\n// alongside the global variable stack\n\n#include \"salalib/salaprogram.h\"\n#include \"salalib/ngraph.h\"\n#include \"salalib/shapemap.h\"\n#include \"salalib/pointdata.h\"\n#include \"salalib/connector.h\"\n\n#include <math.h>\n#include <float.h>\n#include <time.h>\n#include <cstring>\n#include <cmath>\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\n// Assign and list access rather incongruently in math ops, but never mind:\n\nbool g_sala_loaded = false;\n\nstd::vector<SalaFuncLabel> g_sala_math_ops;\nstd::vector<SalaFuncLabel> g_sala_comp_ops;\nstd::vector<SalaFuncLabel> g_sala_logical_ops;\nstd::vector<SalaFuncLabel> g_sala_global_funcs;\nstd::vector<SalaMemberFuncLabel> g_sala_member_funcs;\n\nvoid loadSalaProgram()\n{\n\t// math ops\n\tg_sala_math_ops.push_back( SalaFuncLabel( SalaObj::S_ADD, \"+\", \"add\" ) );\n\tg_sala_math_ops.push_back( SalaFuncLabel( SalaObj::S_SUBTRACT, \"-\", \"subtract\" ) );\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_MINUS, \"-\", \"negative\" ));\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_PLUS, \"+\", \"positive\" ));\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_MULTIPLY, \"*\", \"multiply\" ));\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_DIVIDE, \"/\", \"divide\" ));\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_MODULO, \"%\", \"modulo\" ));\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_POWER, \"^\", \"power\" ));\n\tg_sala_math_ops.push_back(    SalaFuncLabel( SalaObj::S_ASSIGN, \"=\", \"assignment\" ));\n\tg_sala_math_ops.push_back(SalaFuncLabel( SalaObj::S_LIST_ACCESS, \"[]\", \"list access\" )); // list access included even though not parsed directly like this\n\n\t// comp ops\n   g_sala_comp_ops.push_back( SalaFuncLabel( SalaObj::S_GT, \">\", \"greater than\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_LT, \"<\", \"less than\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_GEQ, \">=\", \"greater than or equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_LEQ, \"<=\", \"less than or equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_NEQ, \"!=\", \"not equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_EQ, \"==\", \"equal to\" ));\n   g_sala_comp_ops.push_back(SalaFuncLabel( SalaObj::S_IS, \"is\", \"is the same object as\" ));\n\n   // logical ops\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_NOT, \"not\", \"logical not\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_NOT, \"!\", \"logical not\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_AND, \"and\", \"logical and\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_AND, \"&&\", \"logical and\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_OR, \"or\", \"logical or\" ));\n   g_sala_logical_ops.push_back(SalaFuncLabel( SalaObj::S_OR, \"||\", \"logical or\" ));\n\n   // global functions\n\tg_sala_global_funcs.push_back(   SalaFuncLabel( SalaObj::S_SQRT, \"sqrt\", \"square root\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_LOG, \"log\", \"log base 10\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_LN, \"ln\", \"natural logarithm\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_RAND, \"random\", \"random number (0.0 to 1.0)\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_SIN, \"sin\", \"sine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_COS, \"cos\", \"cosine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_TAN, \"tan\", \"tangent\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_ASIN, \"asin\", \"inverse sine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_ACOS, \"acos\", \"inverse cosine\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_ATAN, \"atan\", \"inverse tangent\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_LEN, \"len\", \"array or string length\" ));\n   g_sala_global_funcs.push_back(SalaFuncLabel( SalaObj::S_RANGE, \"range\", \"set of integers\" ));\n\n   // member functions\n\tg_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FAPPEND, \"append\", \"append item\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FEXTEND, \"extend\", \"extend by list\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FPOP, \"pop\", \"pop (last) item\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_LIST, SalaObj::S_FCLEAR, \"clear\", \"clear contents\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FVALUE, \"value\", \"get attribute value\" ));\n\tg_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FSETVALUE, \"setvalue\", \"set attribute value\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FMARK, \"mark\", \"get node mark\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FSETMARK, \"setmark\", \"set node mark\" ));\n   g_sala_member_funcs.push_back(SalaMemberFuncLabel( SalaObj::S_GRAPHOBJ, SalaObj::S_FCONNECTIONS, \"connections\", \"get list of connections\" ));\n\n\tg_sala_loaded = true;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n\nSalaProgram::SalaProgram(SalaObj context)\n{\n\tif (!g_sala_loaded) {\n\t   loadSalaProgram();\n\t}\n\n   // col is used when run in update mode, it does not form part of the program:\n   m_col = -1;\n   m_thisobj = context;\n}\n\nSalaProgram::~SalaProgram()\n{\n}\n\n// use istrstream to make an istream from a string:\n// istrstream file(char *);\n\nbool SalaProgram::parse(std::istream& program)\n{\n   m_var_stack.clear();\n   m_error_stack.clear();\n\n   // this ensures wipe of any pre-existing variables in the global context:\n   m_root_command = SalaCommand(this,NULL,-1,SalaCommand::SC_ROOT);\n\n   int line = 0;\n\n   SalaCommand *parent = &m_root_command;\n\n   while (!program.eof()) {\n\n      // the problem with a language being \"Pythonesque\" is that the \"end\" of \n      // any control is implicit through the amount of indentation\n      // Thus, the parser eats the white space, only handing of control\n      // to a function when it is ready to parse, and knows its parent\n      int indent = 0;\n      bool endloop = false;\n      while (!endloop) {\n         char ch = program.peek();\n         switch (ch) {\n            case ' ':\n               indent++; break;\n            case 13:\n               break; // ignore\n            case '\\n':\n               line++; indent = 0; break;\n            case '#':\n               // hit comment, read to end of line:\n               while (ch != EOF && ch != '\\n') \n                  { program.get(); ch = program.peek(); }\n               line++;\n               break;\n            case '\\\\':\n               // hit line continuation, ignore everything after it:\n               while (ch != EOF && ch != '\\n') \n                  { program.get(); ch = program.peek(); }\n               line++;\n               break;\n            case EOF:\n               program.get(); // actually shift onto the eof character\n               endloop = true;\n               break;\n            default:\n               endloop = true;\n               break;\n            }\n            if (!endloop) {\n               program.get();\n            }\n      }\n\n      // okay, we now know indent level, and we are ready to parse:\n      if (!program.eof()) { \n         while (indent <= parent->m_indent) {\n            parent = parent->m_parent;\n         }\n\n         parent->m_children.push_back(SalaCommand(this,parent,indent));\n\n         SalaCommand &thiscommand = parent->m_children.back();\n\n         try {\n            line = thiscommand.parse(program,line);\n         }\n         catch (SalaError e) {\n            if (e.lineno == -1)\n               e.lineno = line;\n            m_error_stack.push_back(e);\n            return false;\n         }\n\n         // sort out commands capable of having children:\n         if (thiscommand.m_command == SalaCommand::SC_FOR || thiscommand.m_command == SalaCommand::SC_IF || thiscommand.m_command == SalaCommand::SC_WHILE) {\n            parent = &thiscommand;\n         }\n         else if (thiscommand.m_command == SalaCommand::SC_ELSE) {\n            if (parent->m_children.size() < 2) {\n               m_error_stack.push_back(SalaError(\"'Else' must be preceded by an 'if','for' or 'while'\", thiscommand.m_line));\n               return false;\n            }\n            int command = parent->m_children[parent->m_children.size()-2].m_command;\n            if (command != SalaCommand::SC_IF && command != SalaCommand::SC_ELIF && command != SalaCommand::SC_FOR && command != SalaCommand::SC_WHILE) {\n               m_error_stack.push_back(SalaError(\"'Else' must be preceded by an 'if','for' or 'while'\", thiscommand.m_line));\n               return false;\n            }\n            parent = &thiscommand;\n         }\n         else if (thiscommand.m_command == SalaCommand::SC_ELIF) {\n            if (parent->m_children.size() < 2) {\n               m_error_stack.push_back(SalaError(\"'Elif' must be preceded by an 'if' condition\", thiscommand.m_line));\n               return false;\n            }\n            int command = parent->m_children[parent->m_children.size()-2].m_command;\n            if (command != SalaCommand::SC_IF && command != SalaCommand::SC_ELIF) {\n               m_error_stack.push_back(SalaError(\"'Elif' must be preceded by an 'if' condition\", thiscommand.m_line));\n               return false;\n            }\n            parent = &thiscommand;\n         }\n      }\n   }\n\n   // do a quick check that all 'for', 'if' and 'elif' have children:\n   // TO DO!\n\n   return true;\n}\n\nSalaObj SalaProgram::evaluate()\n{\n   for (size_t i = 0; i < m_var_stack.size(); i++) {\n      // uninitialise all variables:\n      m_var_stack[i].uninit();\n   }\n   m_marked = false;\n\n   // run the program\n   SalaObj obj;\n   bool ret = false, ifhandled = false;\n   m_root_command.evaluate(obj,ret,ifhandled);\n\n   // clear marks if they've been used:\n   if (m_marked) {\n      marks.clear();\n      m_marked = false;\n   }\n\n   return obj;\n}\n\n// this function is called by depthmapX to run a script to update a column\n// the operation is on a single node / row of the database combination\n\nbool SalaProgram::runupdate(int col, const std::set<int> &selset)\n{\n   AttributeTable *table = m_thisobj.getTable();\n   //\n   // note: reference, will change object directly, which is important for commands running the program\n   int& row = m_thisobj.data.graph.node;\n   m_col = col;\n   if (selset.size()) {\n      for (auto& sel: selset) {\n         row = sel;\n         try {\n            SalaObj val = evaluate();\n            float v = (float) val.toDouble();   // note, toDouble will type check and throw if there's a problem\n            if (!std::isfinite(v)) {\n               v = -1.0f;\n            }\n            table->getRow(AttributeKey(sel)).setValue(m_col,v);\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   else {\n      for (auto iter = table->begin(); iter != table->end(); iter++) {\n         row = iter->getKey().value;\n         try {\n            SalaObj val = evaluate();\n            float v = (float) val.toDouble();   // note, toDouble will type check and throw if there's a problem\n            if (!std::isfinite(v)) {\n               v = -1.0f;\n            }\n            iter->getRow().setValue(m_col,v);\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   return true;\n}\n\n// this function is called by depthmapX to run a script to select values\n// the operation is on a single node / row of the database combination\n\nbool SalaProgram::runselect(std::vector<int> &selsetout, const std::set<int>& selsetin)\n{\n   AttributeTable *table = m_thisobj.getTable();\n\n   if (selsetin.size()) {\n      for (auto& key: selsetin) {\n         try {\n            SalaObj val = evaluate();\n            bool v = val.toBool();   // note, toBool will type check and throw if there's a problem\n            if (v) {\n               selsetout.push_back(key);\n            }\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   else {\n      for (auto iter = table->begin(); iter != table->end(); iter++) {\n          int key = iter->getKey().value;\n         try {\n            SalaObj val = evaluate();\n            bool v = val.toBool();   // note, toBool will type check and throw if there's a problem\n            if (v) {\n               selsetout.push_back(key);\n            }\n         }\n         catch (SalaError e) {\n            // error\n            m_error_stack.push_back(e);\n            return false;\n         }\n      }\n   }\n   return true;\n}\n\nstd::string SalaProgram::getLastErrorMessage() const\n{ \n   const SalaError& error = m_error_stack.back();\n   if (error.lineno == -1) {\n      return error.message; \n   }\n   else {\n      return error.message + \" on line \" + dXstring::formatString(error.lineno+1,\"%d\");\n   }\n}\n\n////////////////////////////////////////////////////////////////////////////\n\nSalaCommand::SalaCommand(SalaProgram *program, SalaCommand *parent, int indent, Command command)\n{\n   m_program = program;\n   m_parent = parent;\n   m_indent = indent;\n   m_command = command;\n   m_line = 0;\n}\n\nint SalaCommand::parse(std::istream& program, int line)\n{\n   m_func_stack.clear();\n   m_eval_stack.clear();\n   m_var_names.clear();\n\n   m_command = SC_NONE;\n\n   // useful to know which line the command starts on for debugging purposes\n   m_line = line;\n\n   int last = SP_FUNCTION;\n   bool endloop = false;\n   bool overridecache = false;\n   SalaBuffer buffer;\n   char cache = ' ';\n   //\n   while (!endloop && !program.eof()) {\n      char alpha = program.get();\n      switch (alpha) {\n      // string constant\n      case '\\\"': case '\\'': // variants: either delimit with single or double quotes\n         if (!buffer.empty()) {\n            decode(buffer);\n            buffer.clear();\n         }\n         {\n            char delim = alpha;\n            char beta = program.peek();\n            while (beta != EOF && beta != '\\n' && (beta != delim || alpha == '\\\\')) {\n               alpha = program.get();\n               beta = program.peek();\n               buffer.add(alpha);\n            }\n            if (beta == EOF || beta == '\\n') {\n               throw SalaError(\"No closing quote\",m_line);\n            }\n            else {\n               program.get(); // take off closing quote and discard\n            }\n            // add even if the string constant is empty:\n            m_eval_stack.push_back( std::string(buffer) );\n            buffer.clear();\n            last = SP_DATA;\n         }\n         break;\n      // operator stack\n      case '+': case '-':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            if (last & SP_NUMBER && cache == 'e') {\n               // check for 9.999e+99...\n               // decode will handle later:\n               buffer.add(alpha);\n               break;\n            }\n            // otherwise handled, clear the buffer:\n            buffer.clear();\n         }\n         if (last == SP_FUNCTION || last == SP_COMMAND) {\n            pushFunc( alpha == '+' ? SalaObj(SalaObj::S_PLUS) : SalaObj(SalaObj::S_MINUS) );\n         }\n         else {\n            pushFunc( alpha == '+' ? SalaObj(SalaObj::S_ADD) : SalaObj(SalaObj::S_SUBTRACT) );\n         }\n         last = SP_FUNCTION;\n         break;\n      case '=':\n         if (!buffer.empty()) {\n            // n.b., this will catch '>=', '<=', '==' and '!='\n            if (strchr(\"><=!\",cache) != NULL) {\n               buffer.add(alpha);\n               last = decode(buffer);\n               buffer.clear();\n               overridecache = true;\n               // handled next step (see default clause below)\n               break;\n            }\n            else {\n               last = decode(buffer);\n               buffer.clear();\n            }\n         }\n         buffer.add(alpha); // <- '=' decoded later\n         break;\n      case '!': case '<': case '>':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         // note: this looks a little odd, simply adding to the buffer, but these\n         // are handled by the default function next step if still hanging on the buffer\n         buffer.add(alpha);\n         break;\n      case '/': case '*':  case '%':  case '^':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         last = decode(std::string(1,alpha));\n         break;\n      case '(':\n         // note: the opening bracket forms a function\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         if (last == SP_DATA) {\n            // whatever that just went onto the eval stack, the user thought it was a function...\n            // alert them: \n            throw SalaError(m_last_string + \" is not a known function name\", m_line);\n            // (in the future, we may well want to transfer an object hashed function name to the func stack instead)\n         }\n         else if (last == SP_NUMBER) {\n            throw SalaError(\"Cannot treat a number as if it were a function\", m_line);\n         }\n         // check for pair of open / close brackets: () or (  ) -- this is a null value\n         {\n            char beta = program.peek();\n            while (beta != EOF && beta == ' ') {\n               alpha = program.get();\n               beta = program.peek();\n            }\n            if (beta == ')') {\n               alpha = program.get();\n               m_eval_stack.push_back(SalaObj());\n               last = SP_DATA;\n            }\n            else {\n               pushFunc( SalaObj::S_OPEN_BRACKET );\n               last = SP_FUNCTION;\n            }\n         }\n         break;\n      case ')':\n         // note: the closing bracket forms a data packet:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         pushFunc( SalaObj::S_CLOSE_BRACKET );\n         last = SP_DATA;\n         break;\n      case '[':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         // check for pair of open / close brackets: [] or [  ] -- this is a null value or empty list depending on context\n         {\n            char beta = program.peek();\n            while (beta != EOF && beta == ' ') {\n               alpha = program.get();\n               beta = program.peek();\n            }\n            if (beta == ']') {\n               alpha = program.get();\n               if (last == SP_DATA) {\n                  throw SalaError(\"Accessor operator ('[]') requires a parameter\", m_line);\n               }\n               else {\n                  // put an empty list on the stack\n                  m_eval_stack.push_back( SalaObj(SalaObj::S_CONST_LIST, 0) );\n               }\n               last = SP_DATA;\n            }\n            else {\n               if (last == SP_DATA) {\n                  // list accessor function\n                  pushFunc( SalaObj::S_LIST_ACCESS );\n                  pushFunc( SalaObj::S_OPEN_SQR_BRACKET_ACCESS );\n               }\n               else {\n                  // making an list...\n                  pushFunc( SalaObj::S_OPEN_SQR_BRACKET_LIST );\n               }\n               last = SP_FUNCTION;\n            }\n         }\n         break;\n      case ']':\n         // note: the closing bracket forms a data packet:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         pushFunc( SalaObj::S_CLOSE_SQR_BRACKET );\n         last = SP_DATA;\n         break;\n      case ',':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         pushFunc( SalaObj::S_COMMA );\n         last = SP_FUNCTION;\n         break;\n      case ':':\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         // end of command (def, if, else, elif and for)\n         if (m_command == SC_FOR || m_command == SC_WHILE || m_command == SC_IF || m_command == SC_ELIF || m_command == SC_ELSE) {\n            bool commentfound = false;\n            alpha = program.get();\n            while (!program.eof() && alpha != '\\n') {\n               // continue to end of line, only comments allowed though!\n               if (!commentfound) {\n                  if (alpha == '#') {\n                     commentfound = true;\n                  }\n                  else if (alpha != ' ' && alpha != 13) { // 13 ignored, as it appears \\n is 10 in this stream... (so 13,10 can be found)\n                     throw SalaError(\"'For', 'if', 'else', etc cannot have execution part on same line; insert a new line after ':'\", m_line);\n                  }\n               }\n               alpha = program.get();\n            }\n            line++;\n            endloop = true;\n         }\n         else {\n            throw SalaError(\"Unexpected colon ':' in expression\",m_line);\n         }\n         break;\n      // end of line:\n      case '\\\\':\n         // hit line continuation, read to end of line:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         while (!program.eof() && program.get() != '\\n');\n         // note, end loop is not set, this is a continuation character\n         line++; // line is incremented, although it this command will still start on the original line\n         break;\n      case '#':\n         // loop through until hit \\n or end\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         while (!program.eof() && program.get() != '\\n');\n         line++;  // should have hit a line end (or if it's end of file, it doesn't matter)\n         endloop = true;\n         break;\n      case '\\n':\n         // force end of command parse:\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         line++;  // hit a line end\n         endloop = true;\n         break;\n      case ' ':\n         // white space: read word\n         if (!buffer.empty()) {\n            last = decode(buffer);\n            buffer.clear();\n         }\n         break;\n      case '.':\n         // currently handled inelegantly through decode for either number (1.002) or member access (blah.x())\n         buffer.add('.');\n         break;\n      case '\\t':\n         throw SalaError(\"Tab character found: please use only spaces to indent lines\",m_line);\n         break;\n      default:\n         if (strchr(\"<>=!\",cache)) {\n            // >, <, = and ! are held as next step operators\n            last = decode(buffer);\n            buffer.clear();\n         }\n         if (alpha != EOF && alpha != 13) {  // 13 ignored, as it appears \\n is 10 in this stream...\n            if (!isalphanum_(alpha) && alpha != '&' && alpha != '|') { // include & and | for and and or\n               throw SalaError(\"Unrecognised symbol ('\" + std::string(1,alpha) + \"')\",m_line);\n            }\n            buffer.add(alpha);\n         }\n         break;\n      }\n      if (overridecache) {\n         cache = ' ';\n         overridecache = false;\n      }\n      else {\n         cache = alpha;\n      }\n      if (last == SP_COMMAND) {\n         if (m_command == SC_FOR) {\n            // check the name of the for variable:\n            alpha = program.get();\n            while (alpha == ' ') {\n               alpha = program.get();\n            }\n            if (!isalpha_(alpha)) {\n               throw SalaError(\"'For' command expecting variable name\",m_line);\n            }\n            while (isalphanum_(alpha)) {\n               buffer.add(alpha);\n               alpha = program.get();\n            }\n            if (alpha != ' ') {\n               throw SalaError(\"Command expecting syntax 'for xyz in'...\",m_line);\n            }\n            // add the for iterator variable:\n            m_program->m_var_stack.push_back(SalaObj());\n            int x = m_program->m_var_stack.size() - 1;\n            m_var_names.insert(std::make_pair(buffer,x));\n            m_for_iter = SalaObj( SalaObj::S_VAR, x);\n            // now check for 'in'\n            while (alpha == ' ') {\n               alpha = program.get();\n            }\n            if (alpha != 'i' || program.get() != 'n') {\n               throw SalaError(\"Command expecting syntax 'for xyz in'...\",m_line);\n            }\n         }\n         last = SP_FUNCTION;\n      }\n   }\n   if (!buffer.empty()) {\n      decode(buffer);\n      buffer.clear();\n      last = SP_DATA;\n   }\n   // push remaining functions onto eval stack:\n   while (m_func_stack.size()) {\n      if (m_func_stack.back().type & SalaObj::S_BRACKET) {\n         throw SalaError(\"Unmatched brackets\",m_line);\n      }\n      m_eval_stack.push_back(m_func_stack.back());\n      m_func_stack.pop_back();\n   }\n\n   if (m_eval_stack.size() == 0 && m_command != SC_ELSE) { // note, else is by definition empty\n      throw SalaError(\"Partial or missing command\",m_line);\n   }\n   return line;\n}\n\nint SalaCommand::decode(std::string string)   // string copied as makelower applied\n{\n   // ideally, some form of hashing the string should be performed so that\n   // functions can be found quicker than a long list of \"else ifs\"\n   int retvar = SP_NONE;\n   dXstring::toLower(string);\n\n   if (m_command == SC_NONE) {\n      if (string == \"return\") {\n         m_command = SC_RETURN;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"for\") {\n         m_command = SC_FOR;  // n.b. will still need a variable name and \"in\": for x in ...\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"while\") {\n         m_command = SC_WHILE;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"if\") {\n         m_command = SC_IF;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"elif\") {\n         m_command = SC_ELIF;\n         retvar = SP_COMMAND;\n      }\n      else if (string == \"else\") {\n         m_command = SC_ELSE;\n         retvar = SP_COMMAND;\n      }\n   }\n   if (retvar == SP_COMMAND) {\n      // \n      m_last_string = string; // make a copy for debugging purposes\n      return retvar;\n   }\n\n   // numeric constant\n   if (isdigit(string[0]) || (string.length() > 1 && string[0] == '.' && isdigit(string[1]))) {\n      if (string[string.length()-1] == 'e') {\n         // handle later... at the moment we have hit + or - in 9.999e+99 or 9.999e-99\n         m_last_string = string; // make a copy for debugging purposes\n         return SP_NUMBER;\n      }\n      if (string.find_first_of('.') != std::string::npos || string.find_first_of('e') != std::string::npos) {\n         m_eval_stack.push_back( atof(string.c_str()) );\n      }\n      else {\n         m_eval_stack.push_back( atoi(string.c_str()) );\n      }\n      retvar = SP_NUMBER;\n   }\n   // this is a different 'e' to the 'e' above -> natural logarithm\n   else if (string == \"e\") {\n      m_eval_stack.push_back( 2.7182818284590452353602874713527 );\n      retvar = SP_NUMBER;\n   }\n   else if (string == \"pi\") {\n      m_eval_stack.push_back( 3.1415926535897932384626433832795 );\n      retvar = SP_NUMBER;\n   }\n   // boolean constants\n   else if (string == \"true\") {\n      m_eval_stack.push_back( bool(true) );\n      retvar = SP_NUMBER;\n   }\n   else if (string == \"false\") {\n      m_eval_stack.push_back( bool(false) );\n      retvar = SP_NUMBER;\n   }\n   // this\n   else if (string == \"this\") {\n      m_eval_stack.push_back( SalaObj(SalaObj::S_THIS) );\n      retvar = SP_DATA;\n   }\n   else if (string == \"none\") {\n      m_eval_stack.push_back(SalaObj());\n      retvar = SP_DATA;\n   }\n   else {\n      // everything else should be in one of the operator / func lists:\n      size_t i;\n      if (retvar == SP_NONE) {\n         // note, math ops include assignment\n         for (i = 0 ; i < g_sala_math_ops.size(); i++) {\n            if (string == g_sala_math_ops[i].name) {\n               pushFunc( g_sala_math_ops[i].func );\n               retvar = SP_FUNCTION;\n               break;\n            }\n         }\n      }\n      if (retvar == SP_NONE) {\n         for (i = 0 ; i < g_sala_comp_ops.size(); i++) {\n            if (string == g_sala_comp_ops[i].name) {\n               pushFunc( g_sala_comp_ops[i].func );\n               retvar = SP_FUNCTION;\n               break;\n            }\n         }\n      }\n      if (retvar == SP_NONE) {\n         for (i = 0 ; i < g_sala_logical_ops.size(); i++) {\n            if (string == g_sala_logical_ops[i].name) {\n               pushFunc( g_sala_logical_ops[i].func );\n               retvar = SP_FUNCTION;\n               break;\n            }\n         }\n      }\n      if (retvar == SP_NONE) {\n         for (i = 0 ; i < g_sala_global_funcs.size(); i++) {\n            if (string == g_sala_global_funcs[i].name) {\n               pushFunc( g_sala_global_funcs[i].func );\n               retvar = SP_FUNCTION;\n            }\n         }\n      }\n   }\n\n   if (retvar == SP_NONE) {\n      size_t n = string.find_first_of(\".\");\n      if (n != std::string::npos) {\n         if (n > 0) {\n            decode(string.substr(0,n));\n         }\n         if (decode_member(string.substr(n+1),false) == SP_NONE) {\n            throw SalaError(\"There is no known member function called \" + string.substr(n+1),m_line);\n         }\n         retvar = SP_FUNCTION;\n      }\n      else {\n         // see if it's a member function of 'this':\n         retvar = decode_member(string,true);\n\n         if (retvar == SP_NONE) {\n            // see if it exists in the variable stack (walk up scope)\n            SalaCommand *parent = m_parent;\n            auto n = parent->m_var_names.end();\n            int x = -1;\n            while (parent != NULL) {\n               n = parent->m_var_names.find(string);\n               if (n != parent->m_var_names.end()) {\n                  x = n->second;\n                  parent = NULL;\n               } else {\n                  parent = parent->m_parent;\n               }\n            }\n            if (x != -1) {\n               m_eval_stack.push_back( SalaObj( SalaObj::S_VAR, x) );\n               retvar = SP_DATA;\n            }\n            else {\n               m_program->m_var_stack.push_back(SalaObj());\n               x = m_program->m_var_stack.size() - 1;\n               // note: attach simply to your m_parent, not parent variable, which has walked up the stack\n               m_parent->m_var_names.insert(std::make_pair(string,x));\n               m_eval_stack.push_back( SalaObj( SalaObj::S_VAR, x) );\n               retvar = SP_DATA;\n            }\n         }\n      }\n   }\n\n   if (retvar == SP_NONE) {\n      // should never reach this point\n      throw SalaError(\"There is no known function or variable called \" + string,m_line);\n   }\n\n\n   if (m_command == SC_NONE) {\n      m_command = SC_EXPR;\n   }\n\n   m_last_string = string; // make a copy for debugging purposes\n\n   return retvar;\n}\n\n// note, thisobj not usually known (type S_NALL),\n// but, depending where SalaScript is called from, it may be:\n//    a graph node / table row (for \"select by query\" and \"edit connections\")\n//    a map (not yet implemented, but intended for scripting agents)\n\nint SalaCommand::decode_member(const std::string& string, bool apply_to_this)\n{\n   int retvar = SP_NONE;\n\n   // note, all hardcoded for built in classes:\n   // string classes:\n   for (size_t i = 0; i < g_sala_member_funcs.size(); i++) {\n      // note '&' in the type -- essentially allows for inheritance between objects (tuple is type of list, etc)\n      if (!apply_to_this || (m_program->m_thisobj.type & g_sala_member_funcs[i].type) != 0) {\n         if (string == g_sala_member_funcs[i].name) {\n            pushFunc( g_sala_member_funcs[i].func );\n            retvar = SP_FUNCTION;\n            break;\n         }\n      }\n   }\n   if (retvar == SP_FUNCTION && apply_to_this) {\n      m_eval_stack.push_back(SalaObj(SalaObj::S_THIS));\n   }\n   return retvar;\n}\n\nvoid SalaCommand::pushFunc(const SalaObj& func)\n{\n   // note comma is part of the \"Bracket\" class of things:\n   if (func.type & SalaObj::S_BRACKET) {\n      if (func.type == SalaObj::S_CLOSE_BRACKET) {\n         while (m_func_stack.size() && m_func_stack.back().type != SalaObj::S_OPEN_BRACKET) {\n            m_eval_stack.push_back(m_func_stack.back());\n            m_func_stack.pop_back();\n         }\n         if (m_func_stack.size()) {\n            // don't necessarily pop it... if it's a group marker, we want to hang onto it:\n            if (m_func_stack.back().data.count > 1) {\n               m_func_stack.back().type = SalaObj::S_CONST_TUPLE;\n               m_eval_stack.push_back(m_func_stack.back());\n            }\n            m_func_stack.pop_back(); // remove opening bracket\n         }\n      }\n      else if (func.type == SalaObj::S_CLOSE_SQR_BRACKET) {\n         while (m_func_stack.size() && (m_func_stack.back().type & SalaObj::S_OPEN_SQR_BRACKET) == 0) {\n            m_eval_stack.push_back(m_func_stack.back());\n            m_func_stack.pop_back();\n         }\n         if (m_func_stack.size()) {\n            // don't pop it, always make a list from a make list command, even if it's only one item long:\n            if (m_func_stack.back().type == SalaObj::S_OPEN_SQR_BRACKET_LIST || m_func_stack.back().data.count > 1) {\n               m_func_stack.back().type = SalaObj::S_CONST_LIST;\n               m_eval_stack.push_back(m_func_stack.back());\n            }\n            m_func_stack.pop_back();\n         }\n      }\n      else if (func.type == SalaObj::S_COMMA) {\n         // go and increment your associated group / list\n         while (m_func_stack.size() && m_func_stack.back().type != SalaObj::S_OPEN_BRACKET && (m_func_stack.back().type & SalaObj::S_OPEN_SQR_BRACKET) == 0) {\n            m_eval_stack.push_back(m_func_stack.back());\n            m_func_stack.pop_back();\n         }\n         if (m_func_stack.size()) {\n            m_func_stack.back().data.count++;\n         }\n      }      \n      else {\n         m_func_stack.push_back( func );\n      }\n   }\n   else if (!m_func_stack.size() || func.precedence() > m_func_stack.back().precedence()) {    // original: >\n      m_func_stack.push_back(func);\n   }\n   else {\n      while (m_func_stack.size() && func.precedence() <= m_func_stack.back().precedence()) {     // original <=\n         m_eval_stack.push_back(m_func_stack.back());\n         m_func_stack.pop_back();\n      }\n      m_func_stack.push_back(func);\n   }\n}\n\nvoid SalaCommand::evaluate(SalaObj& obj, bool& ret, bool& ifhandled)\n{\n   int begin = m_eval_stack.size()-1;\n   SalaObj *p_obj = NULL;\n   switch (m_command) {\n   case SC_EXPR:\n      obj = evaluate(begin,p_obj);\n      break;\n   case SC_RETURN:\n      ret = true;\n      obj = evaluate(begin,p_obj);\n      break;\n   case SC_ROOT:\n      {\n         for (size_t i = 0; i < m_children.size(); i++) {\n            m_children[i].evaluate(obj,ret,ifhandled);\n            if (ret)\n               break;\n         }\n      }\n      break;\n   case SC_IF:\n      {\n         SalaObj test = evaluate(begin,p_obj);\n         if (test.toBool() == true) {\n            for (size_t i = 0; i < m_children.size(); i++) {\n               m_children[i].evaluate(obj,ret,ifhandled);\n               if (ret)\n                  break;\n            }\n            ifhandled = true;\n         }\n         else {\n            ifhandled = false;\n         }\n      }\n      break;\n   case SC_ELIF:\n      if (!ifhandled) {\n         SalaObj test = evaluate(begin,p_obj);\n         if (test.toBool() == true) {\n            for (size_t i = 0; i < m_children.size(); i++) {\n               m_children[i].evaluate(obj,ret,ifhandled);\n               if (ret)\n                  break;\n            }\n            ifhandled = true;\n         }\n      }\n      break;\n   case SC_ELSE:\n      if (!ifhandled) {\n         for (size_t i = 0; i < m_children.size(); i++) {\n            m_children[i].evaluate(obj,ret,ifhandled);\n            if (ret)\n               break;\n         }\n      }\n      break;\n   case SC_FOR:\n      {\n         // eventually I'd like to do this with generators / iterators rather than constructing a list each time\n         SalaObj list = evaluate(begin,p_obj);\n         if (list.type == SalaObj::S_LIST) {\n            int len = list.data.list.list->size();\n            if (len != 0) {\n               for (int i = 0; i < len; i++) {\n                  // reset all my stack (actually, all parent functions should do this!)\n                  for (auto varName: m_var_names) {\n                     m_program->m_var_stack[varName.second].uninit();\n                  }\n                  m_program->m_var_stack[m_for_iter.data.var] = list.data.list.list->at(i);\n                  for (size_t k = 0; k < m_children.size(); k++) {\n                     m_children[k].evaluate(obj,ret,ifhandled);\n                     if (ret)\n                        break;\n                  }\n                  if (ret) \n                     break;\n               }\n               ifhandled = true;\n            }\n            else {\n               ifhandled = false;\n            }\n         }\n         else {\n            ifhandled = false;\n         }\n      }\n      break;\n   case SC_WHILE:\n      {\n         int counter = 0;\n         while (evaluate(begin,p_obj).toBool()) {\n            for (size_t k = 0; k < m_children.size(); k++) {\n               m_children[k].evaluate(obj,ret,ifhandled);\n               if (ret)\n                  break;\n            }\n            if (ret)\n               break;\n            if (++counter == 0x04000000) { // <- an arbitrary big number\n               throw SalaError(\"Infinite loop\",m_line);\n            }\n            begin = m_eval_stack.size()-1;\n         }\n         if (counter) {\n            ifhandled = true;\n         }\n         else {\n            ifhandled = false;\n         }\n      }\n      break;\n   default:\n      throw SalaError(\"Unknown command\",m_line);\n      break;\n   }\n}\n\nSalaObj SalaCommand::evaluate(int& pointer, SalaObj* &p_obj)\n{\n   if (pointer < 0) {\n      throw SalaError(\"Missing argument\",m_line);\n   }\n   SalaObj data = m_eval_stack[pointer];\n   pointer--;\n   if (data.type == SalaObj::S_FUNCTION) {\n      SalaObj::Func func = data.data.func;\n      int group = (func & SalaObj::S_GROUP);\n      if (group == SalaObj::S_MATH_OPS) {\n         try {\n            switch (func) {\n            case SalaObj::S_ADD:\n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) + evaluate(pointer,p_obj);\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    SalaObj tmp2 = evaluate(pointer,p_obj);\n            \t    data = tmp1 + tmp2;\n               }\n#endif               \n               break;\n            case SalaObj::S_SUBTRACT:\n    \t       // Quick mod - TV\n#if defined(_MSC_VER)    \t       \n               data = evaluate(pointer,p_obj) - evaluate(pointer,p_obj);\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    SalaObj tmp2 = evaluate(pointer,p_obj);\n            \t    data = tmp1 - tmp2;\n               }\n#endif               \n               break;\n            case SalaObj::S_PLUS:\n               data = evaluate(pointer,p_obj);  // just ignore it\n               break;\n            case SalaObj::S_MINUS:\n    \t       // Quick mod - TV\n#if defined(_MSC_VER)    \t       \n               data = -evaluate(pointer,p_obj);\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n            \t    data = -tmp1;\n               }\n#endif               \n               break;\n            case SalaObj::S_MULTIPLY:\n    \t       // Quick mod - TV\n#if defined(_MSC_VER)    \t       \n               data = evaluate(pointer,p_obj) * evaluate(pointer,p_obj);\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    SalaObj tmp2 = evaluate(pointer,p_obj);\n            \t    data = tmp1 * tmp2;\n               }\n#endif               \n               break;\n            case SalaObj::S_DIVIDE:\n    \t       // Quick mod - TV\n#if defined(_MSC_VER)    \t       \n               data = evaluate(pointer,p_obj) / evaluate(pointer,p_obj);\n#else\n\t       {\n                SalaObj tmp1 = evaluate(pointer,p_obj);\n                SalaObj tmp2 = evaluate(pointer,p_obj);\n                    data = tmp2 / tmp1;\n               }\n#endif               \n               break;\n            case SalaObj::S_MODULO:\n               data = evaluate(pointer,p_obj);\n               \n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) % data;   // reverse order\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer, p_obj);\n\t    \t    data = tmp1 % data;\n\t       }\n#endif               \n               break;\n            case SalaObj::S_POWER:\n               data = evaluate(pointer,p_obj);   // reverse order\n               data = pow(evaluate(pointer,p_obj).toDouble(),data.toDouble());\n               break;\n            case SalaObj::S_ASSIGN:\n               data = evaluate(pointer,p_obj);  // reverse order\n               evaluate(pointer,p_obj);\n               if (p_obj != nullptr) {\n                  *p_obj = data;\n               }\n               else {\n                  throw SalaError(\"Cannot assign to constant, function or none\",m_line);\n               }\n               data = SalaObj(); // assign returns nil value\n               break;\n            case SalaObj::S_LIST_ACCESS:\n               {\n                  int x = evaluate(pointer,p_obj).toInt(); \n                  data = evaluate(pointer,p_obj);\n                  if (data.type == SalaObj::S_LIST) {\n                     // setting p_obj allows things above this in the stack to modify it\n                     p_obj = &(data.list_at(x));\n                     return *p_obj;\n                  }\n                  else if (data.type == SalaObj::S_STRING) {\n                     // but n.b., strings cannot be modified, keep p_obj as null\n                     p_obj = NULL;\n                     return data.char_at(x);\n                  }\n                  else \n                     throw SalaError(\"Cannot be applied to \" + data.getTypeIndefArt() + data.getTypeStr(),m_line);\n               }\n               break;\n            default:\n                break;\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_math_ops.size(); i++) {\n               if (g_sala_math_ops[i].func == func) {\n                  e.message = \"In '\" + g_sala_math_ops[i].name + \"' operator: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw std::move(e);\n         }\n      }\n      else if (group == SalaObj::S_LOGICAL_OPS) {\n         try {\n            switch (func) {\n            case SalaObj::S_OR:\n               // note: you cannot simply say evaluate(x) || evaluate(y) because if evaluate(x) is true,\n               // the in-built || operator will not evaluate(y)\n               // but... it's on the eval stack... it would be nice simply to pop the eval stack at\n               // this point if the first half evaluates to true, thus emulating C... but it's in reverse order too!\n               data = evaluate(pointer,p_obj);\n               data = evaluate(pointer,p_obj).toBool() || data.toBool();\n               break;\n            case SalaObj::S_AND:\n               data = evaluate(pointer,p_obj).toBool() && evaluate(pointer,p_obj).toBool();\n               break;\n            case SalaObj::S_NOT:\n               data = !evaluate(pointer,p_obj).toBool();\n               break;\n            case SalaObj::S_EQ:\n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) == evaluate(pointer,p_obj);\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer, p_obj);\n\t    \t    SalaObj tmp2 = evaluate(pointer, p_obj);\n\t    \t    data = (tmp1 == tmp2);\n\t       }\n#endif               \n               break;\n            case SalaObj::S_IS:\n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = op_is(evaluate(pointer,p_obj),evaluate(pointer,p_obj));\n#else\n\t       {\n\t\t    SalaObj tmp1 = evaluate(pointer, p_obj);\n\t\t    SalaObj tmp2 = evaluate(pointer, p_obj);\n\t\t    data = op_is(tmp1, tmp2);\n\t       }\n#endif               \n               break;\n            case SalaObj::S_NEQ:\n    \t       // Quick mod - TV\n#if defined(_MSC_VER)    \t       \n               data = evaluate(pointer,p_obj) != evaluate(pointer,p_obj);\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    SalaObj tmp2 = evaluate(pointer,p_obj);\n\t    \t    data = (tmp1 != tmp2);\n\t       }\n#endif               \n               break;\n            case SalaObj::S_GT:\n               data = evaluate(pointer,p_obj);\n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) > data;   // revese order\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    data = (tmp1 > data);\n\t       }\n#endif               \n               break;\n            case SalaObj::S_LT:\n               data = evaluate(pointer,p_obj);\n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) < data;   // revese order\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    data = (tmp1 < data);\n\t       }\n#endif               \n               break;\n            case SalaObj::S_GEQ:\n               data = evaluate(pointer,p_obj);\n               \n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) >= data;   // revese order\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer,p_obj);\n\t    \t    data = (tmp1 >= data);\n\t       }\n#endif               \n               break;\n            case SalaObj::S_LEQ:\n               data = evaluate(pointer,p_obj);\n               \n               // Quick mod - TV\n#if defined(_MSC_VER)               \n               data = evaluate(pointer,p_obj) <= data;   // revese order\n#else\n\t       {\n\t    \t    SalaObj tmp1 = evaluate(pointer, p_obj);\n\t    \t    data = (tmp1 <= data);\n\t       }\n#endif               \n               break;\n            default:\n                break;\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_logical_ops.size(); i++) {\n               if (g_sala_logical_ops[i].func == func) {\n                  e.message = \"In '\" + g_sala_logical_ops[i].name + \"' operator: \" + e.message;\n                  break;\n               }\n            }\n            for (size_t j = 0; j < g_sala_comp_ops.size(); j++) {\n               if (g_sala_comp_ops[j].func == func) {\n                  e.message = \"In '\" + g_sala_comp_ops[j].name + \"' operator: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw std::move(e);\n         }\n      }\n      else if (group == SalaObj::S_GLOBAL_FUNCS) {\n         try {\n            switch (func) {\n            case SalaObj::S_LEN:\n               data = evaluate(pointer,p_obj);\n               data = SalaObj( data.length() );\n               break;\n            case SalaObj::S_RANGE:\n               data = evaluate(pointer,p_obj);\n               { \n                  int len = data.length();\n                  if (len != 2 && len != 3) {\n                     throw SalaError(\"Range takes either 2 or 3 parameters\",m_line);\n                  }\n                  int start = data.data.list.list->at(0).toInt();\n                  int end = data.data.list.list->at(1).toInt();\n                  int step = (len == 3) ? data.data.list.list->at(2).toInt() : 1;\n                  if (step == 0) {\n                     throw SalaError(\"Range cannot have a step of 0\",m_line);\n                  }\n                  int listlen = (int) ceil(float(end - start) / float(step)); \n                  if (listlen <= 0) {\n                     data = SalaObj( SalaObj::S_LIST );\n                  }\n                  else {\n                     data = SalaObj( SalaObj::S_LIST, listlen );\n                     for (int i = start, j = 0; i < end; i += step, j++) {\n                        data.data.list.list->at(j) = i;\n                     }\n                  }\n               }\n               break;\n            case SalaObj::S_SQRT:\n               data = sqrt(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_LOG:\n               data = log10(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_LN:\n               data = ln(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_RAND:\n               data = evaluate(pointer,p_obj);\n               data.ensureNone();\n               data = SalaObj(prandom());\n               break;\n            case SalaObj::S_SIN:\n               data = sin(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_COS:\n               data = cos(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_TAN:\n               data = tan(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_ASIN:\n               data = asin(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_ACOS:\n               data = acos(evaluate(pointer,p_obj).toDouble());\n               break;\n            case SalaObj::S_ATAN:\n               data = atan(evaluate(pointer,p_obj).toDouble());\n               break;\n            default:\n                break;\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_global_funcs.size(); i++) {\n               if (g_sala_global_funcs[i].func == func) {\n                  e.message = \"In '\" + g_sala_global_funcs[i].name + \"' function: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw std::move(e);\n         }\n      }\n      else if (group == SalaObj::S_MEMBER_FUNCS) {\n         try {\n            SalaObj param = evaluate(pointer,p_obj);\n            SalaObj obj = evaluate(pointer,p_obj);\n            switch (obj.type) {\n            case SalaObj::S_LIST: case SalaObj::S_TUPLE:\n               switch (func) {\n               case SalaObj::S_FAPPEND:\n                  obj.data.list.list->push_back(param);\n                  data = SalaObj(); // returns none\n                  break;\n               case SalaObj::S_FEXTEND:\n                  if (param.type & SalaObj::S_LIST) {\n                     int count = param.data.list.list->size();\n                     for (int i = 0; i < count; i++) {\n                        obj.data.list.list->push_back(param.data.list.list->at(i));\n                     }\n                  }\n                  else {\n                     throw SalaError(\"Parameter must be a list not \"  + param.getTypeIndefArt() + param.getTypeStr(),m_line);\n                  }\n                  data = SalaObj(); // returns none\n                  break;\n               case SalaObj::S_FPOP:\n                  if (obj.data.list.list->size() == 0) {\n                     throw SalaError(\"List is empty\", m_line);\n                  }\n                  if (param.type == SalaObj::S_NONE) {\n                     data = obj.data.list.list->back();\n                     obj.data.list.list->pop_back();\n                  }\n                  else {\n                     std::vector<SalaObj>& list = *(obj.data.list.list);\n                     int i = param.toInt();\n                     if (i < 0) \n                        i += list.size();\n                     if (i < 0 || i >= (int)list.size()) \n                        throw SalaError(\"Index out of range\");\n                     data = list[i];\n                     list.erase(list.begin() + i);\n                  }\n                  break;\n               case SalaObj::S_FCLEAR:\n                  param.ensureNone();\n                  obj.data.list.list->clear();\n                  obj = SalaObj();\n                  break;\n               default:\n                  throw SalaError(\"Not a member function of \" + obj.getTypeStr(),m_line);\n               }\n               break;\n            case SalaObj::S_SHAPEMAPOBJ: case SalaObj::S_POINTMAPOBJ:\n               switch (func) {\n               case SalaObj::S_FVALUE:\n                  {\n                     const std::string& str = param.toStringRef();\n                     AttributeTable *table = obj.getTable();\n                     if (str == \"Ref Number\") {\n                         data = SalaObj(obj.data.graph.node);\n                     } else {\n                         if (!table->hasColumn(str)) {\n                            throw SalaError(str + \" is an unknown column\",m_line);\n                         }\n                         data = SalaObj(table->getRow(AttributeKey(obj.data.graph.node)).getValue(\n                                            table->getColumnIndex(str)));\n                     }\n                  }\n                  break;\n               case SalaObj::S_FSETVALUE:\n                  {\n                     if (param.length() != 2) {\n                        throw SalaError(\"Function takes 2 parameters\");\n                     }\n                     const std::string& str = param.list_at(0).toStringRef();\n                     float val = (float) param.list_at(1).toDouble();\n                     AttributeTable *table = obj.getTable();\n                     int col = -1;\n                     if (str != \"Ref Number\") {\n                        if (!table->hasColumn(str)) {\n                           throw SalaError(str + \" is an unknown column\",m_line);\n                        }\n                        col = table->getColumnIndex(str);\n                     } else {\n                         throw SalaError(\"The reference number can not be changed\",m_line);\n                     }\n                     table->getRow(AttributeKey(obj.data.graph.node)).setValue(col, val);\n                     data = SalaObj(); // returns none\n                  }\n                  break;\n               case SalaObj::S_FCONNECTIONS:\n                  {\n                     data = connections(obj, param);\n                  }\n                  break;\n               case SalaObj::S_FMARK:\n                  {\n                     param.ensureNone();\n                     data = m_program->marks[obj.data.graph.node];\n                  }\n                  break;\n               case SalaObj::S_FSETMARK:\n                  {\n                     m_program->marks[obj.data.graph.node] = param;\n                     m_program->m_marked = true;   // <- this tells the program to tidy up marks between executions\n                     data = SalaObj(); // returns none\n                  }\n                  break;\n               default:\n                  throw SalaError(\"Not a member function of \" + obj.getTypeStr(),m_line);\n               }\n               break;\n            default:\n               throw SalaError(\"Not a member function of \" + obj.getTypeStr(), m_line);\n            }\n         }\n         catch (SalaError e)\n         {\n            // slow to go through one by one, but this is an exception...\n            for (size_t i = 0; i < g_sala_member_funcs.size(); i++) {\n               if (g_sala_member_funcs[i].func == func) {\n                  SalaObj type = SalaObj(g_sala_member_funcs[i].type);\n                  e.message = \"In \" + type.getTypeStr() + \" '\" + g_sala_member_funcs[i].name + \"' function: \" + e.message;\n                  break;\n               }\n            }\n            e.lineno = m_line; throw std::move(e);\n         }\n      }\n   }\n   else if (data.type == SalaObj::S_THIS) {\n      p_obj = &(m_program->m_thisobj);\n      return *p_obj;\n   }\n   else if (data.type & SalaObj::S_VAR) {\n      // retrieve value from variable stack (keeping in a variable stack means it can be reassigned dynamically)\n      p_obj = &(m_program->m_var_stack[data.data.var]);\n      return *p_obj;\n   }\n   else if (data.type & SalaObj::S_CONST_LIST) {\n      // build an list from either a const tuple or const list:\n      int x = data.data.count;\n      data = SalaObj((data.type == SalaObj::S_CONST_LIST) ? SalaObj::S_LIST : SalaObj::S_TUPLE, x);\n      for (--x; x >= 0; x--) {\n         data.data.list.list->at(x) = evaluate(pointer,p_obj);  // n.b., direct access to the list\n      }\n   }\n   p_obj = NULL;\n   return data;\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n\nSalaObj SalaCommand::connections(SalaObj graphobj, SalaObj param)\n{\n   // now, depending on type of object, it may or may not be allowed parameters:\n   // for point maps it can be none (all connections) or a bin number (0-32)\n   // for segment maps it can be 'all' or 'forward' or 'back' (a string -- no parameters is excluded due to potential for errors)\n   // for axial maps it must be none\n   SalaObj list;\n   if ((graphobj.type & SalaObj::S_MAP) == SalaObj::S_POINTMAP) {\n      // point map version\n      Node& node = graphobj.data.graph.map.point->getPoint(graphobj.data.graph.node).getNode();\n      if (param.type == SalaObj::S_NONE) {\n         int count = node.count();\n         list = SalaObj( SalaObj::S_LIST, count);\n         node.first();\n         for (int i = 0; i < count; i++) {\n            graphobj.data.graph.node = node.cursor();\n            list.data.list.list->at(i) = graphobj;\n            node.next();\n         }\n      }\n      else {\n         int b = param.toInt(); // note, will throw if it's not the right type\n         if (b < 0 || b > 31) {\n            throw SalaError(\"Bin must be in range 0 to 31\");\n         }\n         Bin& bin = node.bin(b);\n         int count = bin.count();\n         list = SalaObj( SalaObj::S_LIST, count);\n         bin.first();\n         for (int i = 0; i < count; i++) {\n            graphobj.data.graph.node = bin.cursor();\n            list.data.list.list->at(i) = graphobj;\n            bin.next();\n         }\n      }\n   }\n   else {\n      int idx = std::distance(graphobj.data.graph.map.shape->getAllShapes().begin(),\n                                graphobj.data.graph.map.shape->getAllShapes().find(graphobj.data.graph.node));\n      const Connector& connector = graphobj.data.graph.map.shape->getConnections()[idx];\n      int mode = Connector::CONN_ALL;\n      if (graphobj.data.graph.map.shape->isSegmentMap()) {\n         const std::string& str = param.toStringRef();\n         if (str == \"forward\") {\n            mode = Connector::SEG_CONN_FW;\n         }\n         else if (str == \"back\") {\n            mode = Connector::SEG_CONN_BK;\n         }\n         else if (str == \"all\") {\n            mode = Connector::SEG_CONN_ALL;\n         }  \n      }\n      else {\n         param.ensureNone();\n      }\n      int count = connector.count(mode);\n      list = SalaObj( SalaObj::S_LIST, count);\n      int cursor = 0;\n      for (int i = 0; i < count; i++) {\n         int connectedIndex = connector.getConnectedRef(cursor, mode);\n         if (connectedIndex == -1) {\n            cursor = -1;\n            graphobj.data.graph.node = -1;\n         } else {\n            graphobj.data.graph.node = graphobj.data.graph.map.shape->getShapeRefFromIndex(connectedIndex)->first;\n         }\n         list.data.list.list->at(i) = graphobj;\n         cursor++;\n      }\n   }\n   return list;\n}\n\n/////////////////////////////////////////////////////////////////////////////////\n\nAttributeTable *SalaObj::getTable()\n{\n   if ((type & SalaObj::S_MAP) == SalaObj::S_POINTMAP) {\n      return &(data.graph.map.point->getAttributeTable());\n   }\n   else {\n      return &(data.graph.map.shape->getAttributeTable());\n   }\n}\n\nint SalaObj::precedence() const\n{\n   int prec = 0;\n   if ((type & S_BRACKET) == 0) { // preserve bracket on func stack until after close bracket, remember to strip any at end\n      switch (func()) {\n         case S_ASSIGN:\n            prec = 1; // do absolutely last!\n            break;\n         case S_AND:\n            prec = 2;\n            break;\n         case S_OR:\n            prec = 3;\n            break;\n         case S_NOT:\n            prec = 4;\n            break;\n         case S_EQ: case S_IS: case S_LT: case S_GT: case S_LEQ: case S_GEQ: case S_NEQ:\n            prec = 5;\n            break;\n         case S_ADD: case S_SUBTRACT:\n            prec = 6;\n            break;\n         case S_MULTIPLY: case S_DIVIDE: case S_MODULO:\n            prec = 7;\n            break;\n         case S_POWER:\n            prec = 8;\n            break;\n         default: // function -- place straight on eval stack when you meet next operator\n            prec = 9;\n            break;\n      }\n   }\n   return prec;\n}\n"
  },
  {
    "path": "salalib/salaprogram.h",
    "content": "// salaprogram.h - a component of the depthmapX - spatial network analysis platform\r\n// SalaScripting language\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n#pragma once\r\n\r\n#include \"salalib/attributetable.h\"\r\n\r\n#include \"genlib/stringutils.h\"\r\n\r\n#include <cmath>\r\n#include <vector>\r\n#include <set>\r\n#include <map>\r\n\r\nclass AttributeTable;\r\nclass PointMap;\r\nclass ShapeMap;\r\n\r\ninline bool isalphanum_(char c)\r\n{\r\n   if (isalnum(c) || c == '_') \r\n      return true;\r\n   else\r\n      return false;\r\n}\r\n\r\ninline bool isalpha_(char c)\r\n{\r\n   if (isalpha(c) || c == '_') \r\n      return true;\r\n   else\r\n      return false;\r\n}\r\n\r\nstruct SalaError\r\n{\r\n   int lineno;\r\n   std::string message;\r\n   SalaError(const std::string& m = std::string(), int li = -1)\r\n   { message = m; lineno = li; }\r\n};\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// A series of 8-byte types to go in the SalaObj data union\r\n// note, they cannot cannot instantiate a copy constructor as it is used as\r\n// a member of the union in SalaObj\r\n\r\nclass SalaObj;\r\n\r\nstruct SalaStr\r\n{\r\npublic:\r\n   int *refcount;\r\n   std::string *string;\r\npublic:\r\n   friend bool operator == (const SalaStr& a, const SalaStr& b);\r\n   friend bool operator != (const SalaStr& a, const SalaStr& b);\r\n   friend bool operator < (const SalaStr& a, const SalaStr& b);\r\n   friend bool operator > (const SalaStr& a, const SalaStr& b);\r\n   // operator const std::string&() { return *string; }\r\n   char char_at(size_t i) const\r\n   { return string->operator[](i); }\r\n   size_t length() const\r\n   { return string->length(); }\r\n};\r\ninline bool operator == (const SalaStr& a, const SalaStr& b)\r\n{ return *(a.string) == *(b.string); }\r\ninline bool operator != (const SalaStr& a, const SalaStr& b)\r\n{ return *(a.string) != *(b.string); }\r\ninline bool operator < (const SalaStr& a, const SalaStr& b)\r\n{ return *(a.string) < *(b.string); }\r\ninline bool operator > (const SalaStr& a, const SalaStr& b)\r\n{ return *(a.string) > *(b.string); }\r\n\r\nstruct SalaList {\r\n   int *refcount;\r\n   std::vector<SalaObj> *list;\r\npublic:\r\n   friend bool operator == (const SalaList& a, const SalaList& b);\r\n   friend bool operator != (const SalaList& a, const SalaList& b);\r\n   // inlines below\r\n};\r\n\r\nstruct SalaGrf {\r\n   int node;\r\n   union Map {\r\n      PointMap *point;  // vga \r\n      ShapeMap *shape;  // everything else\r\n   };\r\n   Map map;\r\n};\r\n\r\n// SalaObj is 16 bytes, which is larger than I intended, but it appears\r\n// when you put both a double (8 bytes) and an int (4 bytes) into a class, it pads\r\n// to 16 bytes rather than the 12 you would expect\r\n\r\n// union members aren't allow copy constructors, so the list functionality \r\n// is built directly into the SalaObj, making it no more inefficient than if it \r\n// were to reference directly to another object to find, e.g., length or refcount\r\n\r\n// note lists are stored by reference.  I'm not sure if this is a good idea!\r\n\r\nclass SalaObj\r\n{\r\n   friend class SalaProgram;\r\n   friend class SalaCommand;\r\n   friend class SalaArray;\r\npublic:\r\n   // Object types\r\n   enum Type { S_BRACKET = 0x0000003f, S_OPEN_SQR_BRACKET = 0x0000000c,\r\n               S_OPEN_BRACKET = 0x00000001, S_CLOSE_BRACKET = 0x00000002, \r\n               S_OPEN_SQR_BRACKET_LIST = 0x00000004, S_OPEN_SQR_BRACKET_ACCESS = 0x00000008,\r\n               S_CLOSE_SQR_BRACKET = 0x00000010, S_COMMA = 0x00000020, // bracket includes comma for checking purposes\r\n               S_NONE = 0x00000100, S_UNINIT = 0x00000200, S_FUNCTION = 0x00000400,\r\n               S_BOOL = 0x00001000, S_CHAR = 0x00002000, \r\n               S_INT = 0x00004000, S_DOUBLE = 0x00008000, S_NUMBER = 0x0000c000, \r\n               S_STRING = 0x00010000, S_VAR = 0x00020000,\r\n               S_CONST_LIST = 0x00100000, S_CONST_TUPLE = 0x00300000, // tuple is a type of list\r\n               S_LIST = 0x00400000, S_TUPLE = 0x00500000,  // tuple is a type of list\r\n               // maps are bitwise 'or'ed to node to make appropriate node type for each map\r\n               S_GRAPHOBJ = 0x01000000, S_MAP = 0x06000000, S_POINTMAP = 0x02000000, S_SHAPEMAP = 0x04000000,\r\n               // however, as the variable is uses the typename of the enum, each must be filled in explicitly:\r\n               S_POINTMAPOBJ = 0x03000000, S_SHAPEMAPOBJ = 0x05000000,\r\n               S_THIS = 0x10000000\r\n         };\r\n   // Built-in Functions, note, some of the groupings contain other operations (eg., math ops includes assign, and logical ops includes both comparators and logical ops)\r\n   enum Func { \r\n          S_FNULL = 0x00000000, S_GROUP = 0xf0000000, \r\n          S_MATH_OPS = 0x10000000, S_LOGICAL_OPS = 0x20000000, S_GLOBAL_FUNCS = 0x30000000, S_MEMBER_FUNCS = 0x40000000,\r\n          S_ADD = 0x10000001, S_SUBTRACT = 0x10000002, S_MINUS = 0x10000003, S_PLUS = 0x10000004,\r\n          S_MULTIPLY = 0x10000005, S_DIVIDE = 0x10000006, S_MODULO = 0x10000007, S_POWER = 0x10000008, \r\n          S_ASSIGN = 0x10000009, S_LIST_ACCESS = 0x1000000a,\r\n          S_LT  = 0x20000001, S_GT = 0x20000002, S_LEQ = 0x20000003, S_GEQ = 0x20000004, S_EQ = 0x20000005, \r\n          S_NEQ = 0x20000006, S_AND = 0x20000007, S_OR = 0x20000008, S_NOT = 0x20000009, S_IS = 0x2000000a, \r\n          S_LEN = 0x30000001, S_RANGE = 0x30000002,          \r\n          S_SQRT = 0x30000003, S_LOG = 0x30000004, S_LN = 0x30000005, S_RAND = 0x30000006, \r\n          S_SIN = 0x30000007, S_COS = 0x30000008, S_TAN = 0x30000009,\r\n          S_ASIN = 0x3000000a, S_ACOS = 0x3000000b, S_ATAN = 0x3000000c,\r\n          S_FPOP = 0x40000001, S_FAPPEND = 0x40000002, S_FEXTEND = 0x40000003, S_FCLEAR = 0x40000004,\r\n          S_FVALUE = 0x40000011, S_FSETVALUE = 0x40000012, S_FCONNECTIONS = 0x40000013, \r\n          S_FMARK = 0x40000014, S_FSETMARK = 0x40000015\r\n   };\r\nprotected:\r\n   union Data {\r\n      bool   b;\r\n      char   ch;\r\n      int    i;\r\n      double f;\r\n      SalaList list;\r\n      SalaStr str;\r\n      SalaGrf graph;\r\n      Func   func;\r\n      int    var;\r\n      int    count;  // used by brackets to count how many objects they have\r\n   };\r\n   Data data;\r\n   Type type;\r\npublic:\r\n   SalaObj() { type = S_NONE; }\r\n   // Two usages: (a) used for brackets (=groups of things, hence the count) and commas\r\n   //             (b) used for lists\r\n   SalaObj(Type t) \r\n   { \r\n      type = t; \r\n      if (t & S_LIST) {\r\n         data.list.refcount = new int(1);\r\n         data.list.list = new std::vector<SalaObj>;\r\n      }\r\n      else {\r\n         data.count = 1; \r\n      }\r\n   }  \r\n   // Two usages: (a) used to address variable or user function tables\r\n   //             (b) used for lists\r\n   SalaObj(Type t, int v) \r\n   { \r\n      type = t; \r\n      if (t & S_LIST) {\r\n         data.list.refcount = new int(1);\r\n         data.list.list = new std::vector<SalaObj>(v); // set blanks\r\n      }\r\n      else {\r\n         data.var = v; \r\n      }\r\n   }  \r\n   // other constructors\r\n   SalaObj(bool a) { type = S_BOOL; data.b = a; }\r\n   SalaObj(int a) { type = S_INT; data.i = a; }\r\n   SalaObj(double a) { type = S_DOUBLE; data.f = a; }\r\n   SalaObj(Func f) { type = S_FUNCTION; data.func = f; }\r\n   SalaObj(const std::string& a) { type = S_STRING; data.str.refcount = new int(1); data.str.string = new std::string(a); }\r\n   // note, type required here as sometimes this will be an axial map, sometimes segment map, sometimes point map,\r\n   // also not fully filled in until runtime, but still required by parse\r\n   SalaObj(Type t, SalaGrf graph) \r\n   { type = t; data.graph = graph; }\r\n   //\r\n   SalaObj(const SalaObj& obj);\r\n   SalaObj& operator = (const SalaObj& obj);\r\n   ~SalaObj();\r\n   void reset();\r\n   void uninit() { reset(); type = S_UNINIT; }  // <- used to uninitialise variables before running program, thus they give nice error messages if used before initialisation\r\n   int func() const { return data.func; }\r\n   int precedence() const;\r\n   bool toBool() const;\r\n   int toInt() const;\r\n   double toDouble() const;\r\n   std::string toString() const;\r\n   const std::string& toStringRef() const;\r\n   friend SalaObj op_is(SalaObj& a, SalaObj& b);\r\n   friend SalaObj operator - (SalaObj& a);\r\n   friend SalaObj operator + (SalaObj& a, SalaObj& b);\r\n   friend SalaObj operator - (SalaObj& a, SalaObj& b);\r\n   friend SalaObj operator / (SalaObj& a, SalaObj& b);\r\n   friend SalaObj operator * (SalaObj& a, SalaObj& b);\r\n   friend SalaObj operator % (SalaObj& a, SalaObj& b);\r\n   friend bool operator || (SalaObj& a, SalaObj& b);\r\n   friend bool operator && (SalaObj& a, SalaObj& b);\r\n   friend bool operator ! (SalaObj& a);\r\n   friend bool operator == (SalaObj& a, SalaObj& b);\r\n   friend bool operator != (SalaObj& a, SalaObj& b);\r\n   friend bool operator > (SalaObj& a, SalaObj& b);\r\n   friend bool operator < (SalaObj& a, SalaObj& b);\r\n   friend bool operator >= (SalaObj& a, SalaObj& b);\r\n   friend bool operator <= (SalaObj& a, SalaObj& b);\r\n   // operations for lists:\r\n   SalaObj& list_at(int i);\r\n   SalaObj char_at(int i); // actually returns a string of the char -- note constant\r\n   int length();\r\n   // check for no parameters\r\n   void ensureNone()\r\n   { if (type != SalaObj::S_NONE) throw SalaError(\"Does not take any parameters\"); }\r\n   //\r\n   // operations for graphs / graph nodes:\r\n   AttributeTable *getTable();\r\n   //\r\n   const std::string getTypeStr() const;\r\n   const std::string getTypeIndefArt() const;\r\n};\r\n\r\n// Quick mod - TV\r\nclass SalaProgram;\r\n\r\nclass SalaCommand\r\n{\r\n   friend class SalaProgram;\r\n   //\r\n   enum Command { SC_NONE, SC_ROOT, SC_EXPR, SC_RETURN, SC_FOR, SC_WHILE, SC_IF, SC_ELIF, SC_ELSE };\r\n   enum { SP_NONE, SP_DATA, SP_NUMBER, SP_FUNCTION, SP_COMMAND }; // used while calculating what is on eval stack\r\nprotected:\r\n   //\r\n   SalaProgram *m_program; // information about the running program (in particular, the global variable and error stack)\r\n   SalaCommand *m_parent;\r\n   std::vector<SalaCommand> m_children;\r\n   //\r\n   std::map<std::string,int> m_var_names;\r\n   //\r\n   Command m_command;\r\n   int m_indent;  // vital for program flow due to Pythonesque syntax\r\n   std::vector<SalaObj> m_eval_stack;\r\n   std::vector<SalaObj> m_func_stack;\r\n   //\r\n   SalaObj m_for_iter;  // object used in a for loop\r\n   //\r\n   int m_line; // useful for debugging to know which line this command starts on\r\n   std::string m_last_string; // occassionally useful in debugging if the user does something unsyntactical\r\n   //\r\npublic:\r\n   SalaCommand() { m_program = NULL; m_parent = NULL; m_indent = 0; m_command = SC_NONE; }\r\n   SalaCommand(SalaProgram *program, SalaCommand *parent, int indent, Command command = SC_NONE);\r\nprotected:\r\n   int parse(std::istream& program, int line);\r\n   int decode(std::string string);\r\n   int decode_member(const std::string& string, bool apply_to_this);\r\n   void pushFunc(const SalaObj& func);\r\n   //\r\n   void evaluate(SalaObj& obj, bool& ret, bool& ifhandled);\r\n   SalaObj evaluate(int& pointer, SalaObj* &p_obj);\r\n   SalaObj connections(SalaObj graphnode, SalaObj param); \r\n};\r\n\r\nclass SalaProgram\r\n{\r\n   friend class SalaCommand;\r\n   //\r\n   SalaCommand m_root_command;\r\n   std::vector<SalaObj> m_var_stack;\r\n   std::vector<SalaError> m_error_stack;\r\n   //\r\n   // column is stored away from the context, as it's not actually passed to the program itself, just used to update a column\r\n   int m_col;  \r\n   // m_thisobj stores contextual information (which attribute table, node etc)\r\n   // NB ! -- this can be messed with by SalaCommand!\r\n   SalaObj m_thisobj;\r\n   //\r\n   bool m_marked; // this is used to tell the program that a node has been \"marked\" -- all marks are cleared at the end of the execution\r\n   // marks for state management in maps\r\n   std::map<int, SalaObj> marks;\r\n\r\npublic:\r\n   SalaProgram(SalaObj context);\r\n   ~SalaProgram();\r\n   bool parse(std::istream& program);\r\n   SalaObj evaluate();\r\n   bool runupdate(int col, const std::set<int> &selset = std::set<int>());\r\n   bool runselect(std::vector<int>& selsetout, const std::set<int> &selsetin = std::set<int>());\r\n   std::string getLastErrorMessage() const;\r\n};\r\n\r\ninline SalaObj::SalaObj(const SalaObj& obj)\r\n{\r\n   type = obj.type;\r\n   switch(obj.type) {\r\n      case S_FUNCTION: data.func = obj.data.func; break;\r\n      case S_BOOL: data.b = obj.data.b; break;\r\n      case S_INT: data.i = obj.data.i; break;\r\n      case S_DOUBLE: data.f = obj.data.f; break;\r\n      case S_VAR: data.var = obj.data.var; break;\r\n      case S_STRING: \r\n         data.str.string = obj.data.str.string; \r\n         data.str.refcount = obj.data.str.refcount; \r\n         *(data.str.refcount) += 1;\r\n         break;\r\n      case S_LIST: case S_TUPLE:\r\n         data.list.list = obj.data.list.list; \r\n         data.list.refcount = obj.data.list.refcount; \r\n         *(data.list.refcount) += 1;\r\n         break;\r\n      case S_NONE: case S_UNINIT: case S_THIS:\r\n         break;\r\n      case S_SHAPEMAPOBJ: case S_SHAPEMAP:\r\n         data.graph.map.shape = obj.data.graph.map.shape;\r\n         data.graph.node = obj.data.graph.node;\r\n         break;\r\n      case S_POINTMAPOBJ: case S_POINTMAP:\r\n         data.graph.map.point = obj.data.graph.map.point;\r\n         data.graph.node = obj.data.graph.node;\r\n         break;\r\n      case S_OPEN_BRACKET: case S_CLOSE_BRACKET: case S_OPEN_SQR_BRACKET_LIST: case S_OPEN_SQR_BRACKET_ACCESS: \r\n      case S_CLOSE_SQR_BRACKET: case S_COMMA: case S_CONST_LIST: case S_CONST_TUPLE:\r\n         data.count = obj.data.count; break;\r\n      default: throw SalaError(\"Cannot instantiate unknown type\");\r\n   }\r\n}\r\ninline SalaObj& SalaObj::operator = (const SalaObj& obj)\r\n{\r\n   if (this != &obj) {\r\n      reset();\r\n      type = obj.type;\r\n      switch(obj.type) {\r\n         case S_FUNCTION: data.func = obj.data.func; break;\r\n         case S_BOOL: data.b = obj.data.b; break;\r\n         case S_INT: data.i = obj.data.i; break;\r\n         case S_DOUBLE: data.f = obj.data.f; break;\r\n         case S_VAR: data.var = obj.data.var; break;\r\n         case S_STRING: \r\n            data.str.string = obj.data.str.string; \r\n            data.str.refcount = obj.data.str.refcount; \r\n            *(data.str.refcount) += 1;\r\n            break;\r\n         case S_LIST: case S_TUPLE:\r\n            data.list.list = obj.data.list.list; \r\n            data.list.refcount = obj.data.list.refcount; \r\n            *(data.list.refcount) += 1;\r\n            break;\r\n         case S_NONE: case S_UNINIT: case S_THIS:\r\n            break;\r\n         case S_SHAPEMAPOBJ: case S_SHAPEMAP:\r\n            data.graph.map.shape = obj.data.graph.map.shape;\r\n            data.graph.node = obj.data.graph.node;\r\n            break;\r\n         case S_POINTMAPOBJ: case S_POINTMAP:\r\n            data.graph.map.point = obj.data.graph.map.point;\r\n            data.graph.node = obj.data.graph.node;\r\n            break;\r\n         case S_OPEN_BRACKET: case S_CLOSE_BRACKET: case S_OPEN_SQR_BRACKET_LIST: case S_OPEN_SQR_BRACKET_ACCESS: \r\n         case S_CLOSE_SQR_BRACKET: case S_COMMA: case S_CONST_LIST: case S_CONST_TUPLE:\r\n            data.count = obj.data.count; break;\r\n         default: throw SalaError(\"Cannot instantiate unknown type\");\r\n      }\r\n   }\r\n   return *this;\r\n}\r\ninline SalaObj::~SalaObj()\r\n{ \r\n   reset();\r\n}\r\ninline void SalaObj::reset()\r\n{\r\n   if (type & S_STRING) { \r\n      *(data.str.refcount) -= 1; \r\n      if (*(data.str.refcount) == 0) {\r\n         delete data.str.refcount;\r\n         delete data.str.string; \r\n      }\r\n      data.str.refcount = NULL;\r\n      data.str.string = NULL;\r\n   } \r\n   else if (type & S_LIST) \r\n   { \r\n      *(data.list.refcount) -= 1; \r\n      if (*(data.list.refcount) == 0) {\r\n         delete data.str.refcount;\r\n         delete data.list.list; \r\n      }\r\n      data.str.refcount = NULL;\r\n      data.list.list = NULL;\r\n   } \r\n   type = S_NONE; \r\n}\r\ninline bool SalaObj::toBool() const\r\n{\r\n   switch(type) {\r\n      case S_BOOL: return data.b;\r\n      case S_INT: return data.i != 0;\r\n      case S_DOUBLE: return data.f != 0.0;\r\n      default: \r\n         throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a boolean value\"));\r\n   }\r\n   return false;\r\n}\r\ninline int SalaObj::toInt() const\r\n{\r\n   switch(type) {\r\n      case S_BOOL: return data.b ? 1 : 0;\r\n      case S_INT: return data.i;\r\n      case S_DOUBLE: return int(std::floor(data.f)); // ensure properly implemented\r\n      default: throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to an integer value\"));\r\n   }\r\n   return 0;\r\n}\r\ninline double SalaObj::toDouble() const\r\n{\r\n   switch(type) {\r\n      case S_BOOL: return data.b ? 1.0 : 0.0;\r\n      case S_INT: return double(data.i);\r\n      case S_DOUBLE: return data.f;\r\n      default: throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a floating point number\"));\r\n   }\r\n   return 0.0;\r\n}\r\ninline std::string SalaObj::toString() const\r\n{\r\n   switch(type) {\r\n      case S_INT: return dXstring::formatString(data.i);\r\n      case S_DOUBLE: return dXstring::formatString(data.f);\r\n      case S_STRING: return *(data.str.string);\r\n      default: throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a string\"));\r\n   }\r\n   return std::string();\r\n}\r\ninline const std::string& SalaObj::toStringRef() const\r\n{\r\n   if (type != S_STRING) {\r\n      throw SalaError(std::string(\"Cannot convert \") + getTypeIndefArt() + getTypeStr() + std::string(\" to a string reference\"));\r\n   }\r\n   return *(data.str.string);\r\n}\r\n\r\ninline SalaObj operator + (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: throw SalaError(\"Cannot add booleans\");\r\n      case SalaObj::S_INT: return SalaObj(a.data.i + b.data.i);\r\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f + b.data.f);\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) + b.data.f) : (a.data.f + double(b.data.i));\r\n      case SalaObj::S_STRING: return SalaObj(*(a.data.str.string) + *(b.data.str.string));\r\n      default: throw SalaError(std::string(\"Cannot add \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" to \")  + b.getTypeIndefArt() + b.getTypeStr());\r\n   }\r\n   return SalaObj();\r\n}\r\ninline SalaObj operator - (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: throw SalaError(\"Cannot subtract booleans\");\r\n      case SalaObj::S_INT: return SalaObj(a.data.i - b.data.i);\r\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f - b.data.f);\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) - b.data.f) : (a.data.f - double(b.data.i));\r\n      default: throw SalaError(std::string(\"Cannot subtract \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" from \") + a.getTypeIndefArt() + a.getTypeStr());\r\n   }\r\n   return SalaObj();\r\n}\r\ninline SalaObj operator - (SalaObj& a)\r\n{\r\n   switch (a.type) {\r\n      case SalaObj::S_BOOL: throw SalaError(\"Cannot minus booleans\");\r\n      case SalaObj::S_INT: return SalaObj(-a.data.i);\r\n      case SalaObj::S_DOUBLE: return SalaObj(-a.data.f);\r\n      default: throw SalaError(std::string(\"Cannot minus \") + a.getTypeIndefArt() + a.getTypeStr());\r\n   }\r\n   return SalaObj();\r\n}\r\ninline SalaObj operator * (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_INT: return SalaObj(a.data.i * b.data.i);\r\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f * b.data.f);\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) * b.data.f) : (a.data.f * double(b.data.i));\r\n      default: throw SalaError(std::string(\"Cannot multiply \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" by \") + b.getTypeIndefArt() + b.getTypeStr());\r\n   }\r\n   return SalaObj();\r\n}\r\ninline SalaObj operator % (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_INT: return SalaObj(a.data.i % b.data.i);\r\n      case SalaObj::S_DOUBLE: return SalaObj(fmod(a.data.f,b.data.f));\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? fmod(double(a.data.i),b.data.f) : fmod(a.data.f,double(b.data.i));\r\n      default: throw SalaError(std::string(\"Cannot multiply \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" by \") + b.getTypeIndefArt() + b.getTypeStr());\r\n   }\r\n   return SalaObj();\r\n}\r\ninline SalaObj operator / (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_INT: if (b.data.i != 0) return SalaObj(a.data.i / b.data.i); else throw SalaError(\"Integer divide by zero error\");\r\n      case SalaObj::S_DOUBLE: return SalaObj(a.data.f / b.data.f);\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) / b.data.f) : (a.data.f / double(b.data.i));\r\n      default: throw SalaError(std::string(\"Cannot divide \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" by \")  + a.getTypeIndefArt() + b.getTypeStr());\r\n   }\r\n   return SalaObj();\r\n}\r\n// assume already bools (use convert to bool first)\r\ninline bool operator && (SalaObj& a, SalaObj& b)\r\n{\r\n   return a.data.b && b.data.b;\r\n}\r\n// assume already bools (use convert to bool first)\r\ninline bool operator || (SalaObj& a, SalaObj& b)\r\n{\r\n   return a.data.b || b.data.b;\r\n}\r\n// assume already bools (use convert to bool first)\r\ninline bool operator ! (SalaObj& a)\r\n{\r\n   return !a.data.b;\r\n}\r\ninline bool operator == (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_NONE: return true; // none == none\r\n      case SalaObj::S_BOOL: return a.data.b == b.data.b;\r\n      case SalaObj::S_INT: return a.data.i == b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f == b.data.f;\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) == b.data.f) : (a.data.f == double(b.data.i));\r\n      case SalaObj::S_STRING: return a.data.str == b.data.str;\r\n      case SalaObj::S_LIST: return a.data.list == b.data.list;\r\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '=='\"));\r\n   }\r\n   return false;\r\n}\r\ninline SalaObj op_is(SalaObj& a, SalaObj& b)\r\n{\r\n   // note, op_is is forgiving: does not complain if cannot compare, just returns false\r\n   switch (a.type & b.type) {\r\n      case SalaObj::S_NONE: return true; // none is none\r\n      case SalaObj::S_BOOL: return a.data.b == b.data.b;\r\n      case SalaObj::S_INT: return a.data.i == b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f == b.data.f;\r\n      // n.b., no number! int is not double and v.v.\r\n      case SalaObj::S_STRING: return a.data.str.string == b.data.str.string;  // n.b.: pointer compare!\r\n      case SalaObj::S_LIST: return a.data.list.list == b.data.list.list;      // n.b.: pointer compare!\r\n   }\r\n   return false;\r\n}\r\n\r\ninline bool operator != (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: return a.data.b != b.data.b;\r\n      case SalaObj::S_INT: return a.data.i != b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f != b.data.f;\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) != b.data.f) : (a.data.f != double(b.data.i));\r\n      case SalaObj::S_STRING: return a.data.str != b.data.str;\r\n      case SalaObj::S_LIST: return a.data.list != b.data.list;\r\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '!='\"));\r\n   }\r\n   return false;\r\n}\r\ninline bool operator < (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: return a.data.b < b.data.b;\r\n      case SalaObj::S_INT: return a.data.i < b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f < b.data.f;\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) < b.data.f) : (a.data.f < double(b.data.i));\r\n      case SalaObj::S_STRING: return a.data.str < b.data.str;\r\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '<'\"));\r\n   }\r\n   return false;\r\n}\r\ninline bool operator > (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: return a.data.b > b.data.b;\r\n      case SalaObj::S_INT: return a.data.i > b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f > b.data.f;\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) > b.data.f) : (a.data.f > double(b.data.i));\r\n      case SalaObj::S_STRING: return a.data.str > b.data.str;\r\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '>'\"));\r\n   }\r\n   return false;\r\n}\r\ninline bool operator <= (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: return a.data.b <= b.data.b;\r\n      case SalaObj::S_INT: return a.data.i <= b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f <= b.data.f;\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) <= b.data.f) : (a.data.f <= double(b.data.i));\r\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '<='\"));\r\n   }\r\n   return false;\r\n}\r\ninline bool operator >= (SalaObj& a, SalaObj& b)\r\n{\r\n   switch (a.type | b.type) {\r\n      case SalaObj::S_BOOL: return a.data.b >= b.data.b;\r\n      case SalaObj::S_INT: return a.data.i >= b.data.i;\r\n      case SalaObj::S_DOUBLE: return a.data.f >= b.data.f;\r\n      case SalaObj::S_NUMBER:\r\n         return (a.type == SalaObj::S_INT) ? (double(a.data.i) >= b.data.f) : (a.data.f >= double(b.data.i));\r\n      default: throw SalaError(std::string(\"Cannot compare \") + a.getTypeIndefArt() + a.getTypeStr() + std::string(\" with \") + b.getTypeIndefArt() + b.getTypeStr() + std::string(\" using '>='\"));\r\n   }\r\n   return false;\r\n}\r\n// list operations: note -> precheck in program and sort into list and string\r\ninline SalaObj& SalaObj::list_at(int i)\r\n{\r\n   if (i < 0)\r\n      i += (int)data.list.list->size();\r\n   if (i < 0 || size_t(i) >= data.list.list->size()) \r\n      throw SalaError(\"Index out of range\");\r\n   return data.list.list->at(i); \r\n}\r\ninline SalaObj SalaObj::char_at(int i) // actually returns a string of the char\r\n{\r\n   if (i < 0)\r\n      i += data.str.length();\r\n   if (i < 0 || i >= static_cast<int>(data.str.length()))\r\n      throw SalaError(\"String index out of range\");\r\n   return SalaObj(std::string(1,data.str.char_at(i)));\r\n}\r\ninline int SalaObj::length()\r\n{\r\n   if (type & S_LIST) \r\n      return (int)data.list.list->size();\r\n   else if (type == S_STRING) \r\n      return (int)data.str.length();\r\n   throw SalaError(\"Cannot get the length of \" + getTypeIndefArt() + getTypeStr());\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////\r\n\r\ninline const std::string SalaObj::getTypeStr() const\r\n{\r\n   switch(type) {\r\n   case S_NONE:\r\n      return \"none\";\r\n   case S_UNINIT:\r\n      return \"uninitialised variable\";\r\n   case S_FUNCTION:\r\n      return \"function\";\r\n   case S_BOOL:\r\n      return \"boolean\";\r\n   case S_INT:\r\n      return \"integer\";\r\n   case S_DOUBLE:\r\n      return \"float\";\r\n   case S_STRING:\r\n      return \"string\";\r\n   case S_LIST:\r\n      return \"list\";\r\n   case S_TUPLE:\r\n      return \"tuple\";\r\n   case S_THIS:\r\n      return \"this\";\r\n   default:\r\n       break;\r\n   }\r\n   if (type & S_GRAPHOBJ) {\r\n      return \"graph object\";\r\n   }\r\n   else if (type & S_MAP) {\r\n      return \"graph\";\r\n   }\r\n   return \"unknown type\";\r\n}\r\n\r\ninline const std::string SalaObj::getTypeIndefArt() const\r\n{\r\n   switch(type & ~S_GRAPHOBJ) {\r\n   case S_FUNCTION: case S_BOOL: case S_DOUBLE: case S_STRING: case S_TUPLE: case S_LIST:\r\n   case S_SHAPEMAP: case S_POINTMAP:\r\n      return \"a \";\r\n   case S_INT: case S_UNINIT: \r\n      return \"an \";\r\n   case S_NONE: case S_THIS:\r\n      return \"\";\r\n   default:\r\n      return \"an \";  // unknown type\r\n   }\r\n   return std::string();\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// comparisons for lists (must be after the associated SalaObj comparisons have been declared)\r\n\r\ninline bool operator == (const SalaList& a, const SalaList& b)\r\n{ \r\n   if (a.list->size() != a.list->size()) \r\n      return false; \r\n   for (size_t i = 0; i < a.list->size(); i++) { \r\n      if (a.list->at(i) != b.list->at(i)) \r\n         return false; \r\n   } \r\n   return true; \r\n}\r\ninline bool operator != (const SalaList& a, const SalaList& b)\r\n{ \r\n   if (a.list->size() != a.list->size()) \r\n      return true; \r\n   for (size_t i = 0; i < a.list->size(); i++) { \r\n      if (a.list->at(i) != b.list->at(i)) \r\n         return true; \r\n   }\r\n   return false; \r\n}\r\n\r\n/////////////////////////////////////////////\r\n\r\n// helpers for parser:\r\n\r\nstruct SalaBuffer\r\n{\r\n   int bufpos;\r\n   char buffer[128];\r\n   SalaBuffer()\r\n   { bufpos = -1; buffer[0] = '\\0'; }\r\n   void add(char c)\r\n   { bufpos++; if (bufpos > 127) throw SalaError(\"Overlong string of characters\");\r\n     buffer[bufpos] = c; }\r\n   void clear()\r\n   { bufpos = -1; buffer[0] = '\\0'; }\r\n   operator std::string()\r\n   { buffer[bufpos + 1] = '\\0'; return std::string(buffer); }\r\n   bool empty()\r\n   { return bufpos == -1; }\r\n};\r\n\r\n///////////////////////////////////////////////////\r\n\r\n/////////////////////////////////////////////\r\n\r\n// Operator and function names\r\n\r\nstruct SalaFuncLabel\r\n{\r\n   SalaObj::Func func;\r\n   std::string name;\r\n   std::string desc;\r\n   SalaFuncLabel(SalaObj::Func f = SalaObj::S_FNULL, const std::string& str = std::string(), const std::string& des = std::string()) {\r\n      func = f; name = str; desc = des;\r\n   }\r\n};\r\n\r\nstruct SalaMemberFuncLabel : public SalaFuncLabel\r\n{\r\n   SalaObj::Type type;\r\n   SalaMemberFuncLabel(SalaObj::Type t = SalaObj::S_NONE, SalaObj::Func f = SalaObj::S_FNULL, const std::string& str = std::string(), const std::string& des = std::string()) {\r\n      type = t; func = f; name = str; desc = des;\r\n   }\r\n};\r\n\r\n"
  },
  {
    "path": "salalib/segmmodules/CMakeLists.txt",
    "content": "target_sources(salalib\n    PRIVATE\n        segmangular.cpp\n        segmmetric.cpp\n        segmtopological.cpp\n        segmtulip.cpp\n        segmtopologicalpd.cpp\n        segmmetricpd.cpp\n        segmtulipdepth.cpp\n    PUBLIC\n        segmangular.h\n        segmmetric.h\n        segmtopological.h\n        segmtulip.h\n        segmhelpers.h\n        segmmetricpd.h\n        segmtopologicalpd.h\n        segmtulipdepth.h)\n"
  },
  {
    "path": "salalib/segmmodules/segmangular.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmangular.h\"\n#include \"salalib/options.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentAngular::run(Communicator *comm, ShapeGraph &map, bool) {\n\n    if (map.getMapType() != ShapeMap::SEGMENTMAP) {\n        return false;\n    }\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getConnections().size());\n    }\n\n    // note: radius must be sorted lowest to highest, but if -1 occurs (\"radius n\") it needs to be last...\n    // ...to ensure no mess ups, we'll re-sort here:\n    bool radius_n = false;\n    std::vector<double> radii;\n    for (double radius : m_radius_set) {\n        if (radius < 0) {\n            radius_n = true;\n        } else {\n            radii.push_back(radius);\n        }\n    }\n    if (radius_n) {\n        radii.push_back(-1.0);\n    }\n\n    std::vector<int> depth_col, count_col, total_col;\n    // first enter table values\n    for (int radius : radii) {\n        std::string radius_text = makeRadiusText(Options::RADIUS_ANGULAR, radius);\n        std::string depth_col_text = std::string(\"Angular Mean Depth\") + radius_text;\n        attributes.insertOrResetColumn(depth_col_text.c_str());\n        std::string count_col_text = std::string(\"Angular Node Count\") + radius_text;\n        attributes.insertOrResetColumn(count_col_text.c_str());\n        std::string total_col_text = std::string(\"Angular Total Depth\") + radius_text;\n        attributes.insertOrResetColumn(total_col_text.c_str());\n    }\n\n    for (int radius : radii) {\n        std::string radius_text = makeRadiusText(Options::RADIUS_ANGULAR, radius);\n        std::string depth_col_text = std::string(\"Angular Mean Depth\") + radius_text;\n        depth_col.push_back(attributes.getColumnIndex(depth_col_text.c_str()));\n        std::string count_col_text = std::string(\"Angular Node Count\") + radius_text;\n        count_col.push_back(attributes.getColumnIndex(count_col_text.c_str()));\n        std::string total_col_text = std::string(\"Angular Total Depth\") + radius_text;\n        total_col.push_back(attributes.getColumnIndex(total_col_text.c_str()));\n    }\n\n    std::vector<bool> covered(map.getShapeCount());\n    size_t i = 0;\n    for (auto & iter : attributes){\n        for (size_t j = 0; j < map.getShapeCount(); j++) {\n            covered[j] = false;\n        }\n        std::vector<std::pair<float, SegmentData>> anglebins;\n        anglebins.push_back(std::make_pair(0.0f, SegmentData(0, i, SegmentRef(), 0, 0.0, 0)));\n\n        std::vector<double> total_depth;\n        std::vector<int> node_count;\n        for (size_t r = 0; r < radii.size(); r++) {\n            total_depth.push_back(0.0);\n            node_count.push_back(0);\n        }\n        // node_count includes this one, but will be added in next algo:\n        while (anglebins.size()) {\n            auto iter = anglebins.begin();\n            SegmentData lineindex = iter->second;\n            if (!covered[lineindex.ref]) {\n                covered[lineindex.ref] = true;\n                double depth_to_line = iter->first;\n                total_depth[lineindex.coverage] += depth_to_line;\n                node_count[lineindex.coverage] += 1;\n                anglebins.erase(iter);\n                Connector &line = map.getConnections()[lineindex.ref];\n                if (lineindex.dir != -1) {\n                    for (auto &segconn : line.m_forward_segconns) {\n                        if (!covered[segconn.first.ref]) {\n                            double angle = depth_to_line + segconn.second;\n                            size_t rbin = lineindex.coverage;\n                            while (rbin != radii.size() && radii[rbin] != -1 && angle > radii[rbin]) {\n                                rbin++;\n                            }\n                            if (rbin != radii.size()) {\n                                depthmapX::insert_sorted(\n                                    anglebins, std::make_pair(float(angle),\n                                                              SegmentData(segconn.first, SegmentRef(), 0, 0.0, rbin)));\n                            }\n                        }\n                    }\n                }\n                if (lineindex.dir != 1) {\n                    for (auto &segconn : line.m_back_segconns) {\n                        if (!covered[segconn.first.ref]) {\n                            double angle = depth_to_line + segconn.second;\n                            size_t rbin = lineindex.coverage;\n                            while (rbin != radii.size() && radii[rbin] != -1 && angle > radii[rbin]) {\n                                rbin++;\n                            }\n                            if (rbin != radii.size()) {\n                                depthmapX::insert_sorted(\n                                    anglebins, std::make_pair(float(angle),\n                                                              SegmentData(segconn.first, SegmentRef(), 0, 0.0, rbin)));\n                            }\n                        }\n                    }\n                }\n            } else {\n                anglebins.erase(iter);\n            }\n        }\n        AttributeRow &row = iter.getRow();\n        // set the attributes for this node:\n        int curs_node_count = 0;\n        double curs_total_depth = 0.0;\n        for (size_t r = 0; r < radii.size(); r++) {\n            curs_node_count += node_count[r];\n            curs_total_depth += total_depth[r];\n            row.setValue(count_col[r], float(curs_node_count));\n            if (curs_node_count > 1) {\n                // note -- node_count includes this one -- mean depth as per p.108 Social Logic of Space\n                double mean_depth = curs_total_depth / double(curs_node_count - 1);\n                row.setValue(depth_col[r], float(mean_depth));\n                row.setValue(total_col[r], float(curs_total_depth));\n            } else {\n                row.setValue(depth_col[r], -1);\n                row.setValue(total_col[r], -1);\n            }\n        }\n        //\n        if (comm) {\n            if (qtimer(atime, 500)) {\n                if (comm->IsCancelled()) {\n                    throw Communicator::CancelledException();\n                }\n                comm->CommPostMessage(Communicator::CURRENT_RECORD, i);\n            }\n        }\n        i++;\n    }\n\n    map.setDisplayedAttribute(-2); // <- override if it's already showing\n    map.setDisplayedAttribute(depth_col.back());\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmangular.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/isegment.h\"\n\nclass SegmentAngular : ISegment {\n  private:\n    std::set<double> m_radius_set;\n\n  public:\n    std::string getAnalysisName() const override { return \"Angular Analysis\"; }\n    bool run(Communicator *comm, ShapeGraph &map, bool) override;\n    SegmentAngular(std::set<double> radius_set) : m_radius_set(radius_set) {}\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmhelpers.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\nstruct TopoMetSegmentRef {\n    int ref;\n    int dir;\n    double dist;\n    int previous;\n    bool done;\n    TopoMetSegmentRef(int r = -1, int d = -1, double di = 0.0, int p = -1) {\n        ref = r;\n        dir = d;\n        dist = di;\n        previous = p;\n        done = false;\n    }\n};\n\n// should be double not float!\n\nstruct TopoMetSegmentChoice {\n    double choice;\n    double wchoice;\n    TopoMetSegmentChoice() {\n        choice = 0.0;\n        wchoice = 0.0;\n    }\n};\n\nstruct SegInfo {\n    double length;\n    int layer;\n    SegInfo() {\n        length = 0.0f;\n        layer = 0;\n    }\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmmetric.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmmetric.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentMetric::run(Communicator *comm, ShapeGraph &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    bool retvar = true;\n\n    time_t atime = 0;\n\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS,\n                              (m_sel_only ? map.getSelSet().size() : map.getConnections().size()));\n    }\n    int reccount = 0;\n\n    // record axial line refs for topological analysis\n    std::vector<int> axialrefs;\n    // quick through to find the longest seg length\n    std::vector<float> seglengths;\n    float maxseglength = 0.0f;\n    for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n        AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n        axialrefs.push_back(row.getValue(attributes.getColumnIndex(\"Axial Line Ref\")));\n        seglengths.push_back(row.getValue(attributes.getColumnIndex(\"Segment Length\")));\n        if (seglengths.back() > maxseglength) {\n            maxseglength = seglengths.back();\n        }\n    }\n\n    std::string prefix, suffix;\n    int maxbin = 512;\n    prefix = \"Metric \";\n\n    if (m_radius != -1.0) {\n        suffix = dXstring::formatString(m_radius, \" R%.f metric\");\n    }\n    std::string choicecol = prefix + \"Choice\" + suffix;\n    std::string wchoicecol = prefix + \"Choice [SLW]\" + suffix;\n    std::string meandepthcol = prefix + \"Mean Depth\" + suffix;\n    std::string wmeandepthcol = prefix + std::string(\"Mean Depth [SLW]\") + suffix;\n    std::string totaldcol = prefix + \"Total Depth\" + suffix;\n    std::string totalcol = prefix + \"Total Nodes\" + suffix;\n    std::string wtotalcol = prefix + \"Total Length\" + suffix;\n    //\n    if (!m_sel_only) {\n        attributes.insertOrResetColumn(choicecol.c_str());\n        attributes.insertOrResetColumn(wchoicecol.c_str());\n    }\n    attributes.insertOrResetColumn(meandepthcol.c_str());\n    attributes.insertOrResetColumn(wmeandepthcol.c_str());\n    attributes.insertOrResetColumn(totaldcol.c_str());\n    attributes.insertOrResetColumn(totalcol.c_str());\n    attributes.insertOrResetColumn(wtotalcol.c_str());\n    //\n    std::vector<unsigned int> seen(map.getShapeCount());\n    std::vector<TopoMetSegmentRef> audittrail(map.getShapeCount());\n    std::vector<TopoMetSegmentChoice> choicevals(map.getShapeCount());\n    for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n        AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n        if (m_sel_only && !row.isSelected()) {\n            continue;\n        }\n        for (size_t i = 0; i < map.getShapeCount(); i++) {\n            seen[i] = 0xffffffff;\n        }\n        std::vector<int> list[512]; // 512 bins!\n        int bin = 0;\n        list[bin].push_back(cursor);\n        double rootseglength = seglengths[cursor];\n        audittrail[cursor] = TopoMetSegmentRef(cursor, Connector::SEG_CONN_ALL, rootseglength * 0.5, -1);\n        int open = 1;\n        unsigned int segdepth = 0;\n        double total = 0.0, wtotal = 0.0, wtotaldepth = 0.0, totalsegdepth = 0.0, totalmetdepth = 0.0;\n        while (open != 0) {\n            while (list[bin].size() == 0) {\n                bin++;\n                segdepth += 1;\n                if (bin == maxbin) {\n                    bin = 0;\n                }\n            }\n            //\n            TopoMetSegmentRef &here = audittrail[list[bin].back()];\n            list[bin].pop_back();\n            open--;\n            //\n            if (here.done) {\n                continue;\n            } else {\n                here.done = true;\n            }\n            //\n            double len = seglengths[here.ref];\n            totalsegdepth += segdepth;\n            totalmetdepth += here.dist - len * 0.5; // preloaded with length ahead\n            wtotal += len;\n            wtotaldepth += len * (here.dist - len * 0.5);\n            total += 1;\n            //\n            Connector &axline = map.getConnections().at(here.ref);\n            int connected_cursor = -2;\n\n            auto iter = axline.m_back_segconns.begin();\n            bool backsegs = true;\n\n            while (connected_cursor != -1) {\n                if (backsegs && iter == axline.m_back_segconns.end()) {\n                    iter = axline.m_forward_segconns.begin();\n                    backsegs = false;\n                }\n                if (!backsegs && iter == axline.m_forward_segconns.end()) {\n                    break;\n                }\n\n                connected_cursor = iter->first.ref;\n\n                if (seen[connected_cursor] > segdepth && static_cast<size_t>(connected_cursor) != cursor) {\n                    bool seenalready = (seen[connected_cursor] == 0xffffffff) ? false : true;\n                    float length = seglengths[connected_cursor];\n                    audittrail[connected_cursor] =\n                        TopoMetSegmentRef(connected_cursor, here.dir, here.dist + length, here.ref);\n                    seen[connected_cursor] = segdepth;\n                    if (m_radius == -1 || here.dist + length < m_radius) {\n                        // puts in a suitable bin ahead of us...\n                        open++;\n                        //\n                        // better to divide by 511 but have 512 bins...\n                        list[(bin + int(floor(0.5 + 511 * length / maxseglength))) % 512].push_back(connected_cursor);\n                    }\n                    // not sure why this is outside the radius restriction\n                    // (sel_only: with restricted selection set, not all lines will be labelled)\n                    // (seenalready: need to check that we're not doing this twice, given the seen can go twice)\n\n                    // Quick mod - TV\n                    if (!m_sel_only && connected_cursor > int(cursor) &&\n                        !seenalready) { // only one way paths, saves doing this twice\n                        int subcur = connected_cursor;\n                        while (subcur != -1) {\n                            // in this method of choice, start and end lines are included\n                            choicevals[subcur].choice += 1;\n                            choicevals[subcur].wchoice += (rootseglength * length);\n                            subcur = audittrail[subcur].previous;\n                        }\n                    }\n                }\n                iter++;\n            }\n        }\n        // also put in mean depth:\n        //\n        row.setValue(meandepthcol.c_str(), totalmetdepth / (total - 1));\n        row.setValue(totaldcol.c_str(), totalmetdepth);\n        row.setValue(wmeandepthcol.c_str(), wtotaldepth / (wtotal - rootseglength));\n        row.setValue(totalcol.c_str(), total);\n        row.setValue(wtotalcol.c_str(), wtotal);\n        //\n        if (comm) {\n            if (qtimer(atime, 500)) {\n                if (comm->IsCancelled()) {\n                    throw Communicator::CancelledException();\n                }\n            }\n            comm->CommPostMessage(Communicator::CURRENT_RECORD, reccount);\n        }\n        reccount++;\n    }\n    if (!m_sel_only) {\n        // note, I've stopped sel only from calculating choice values:\n        for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n            AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n            row.setValue(choicecol.c_str(), choicevals[cursor].choice);\n            row.setValue(wchoicecol.c_str(), choicevals[cursor].wchoice);\n        }\n    }\n\n    if (!m_sel_only) {\n        map.setDisplayedAttribute(attributes.getColumnIndex(choicecol.c_str()));\n    } else {\n        map.setDisplayedAttribute(attributes.getColumnIndex(meandepthcol.c_str()));\n    }\n\n    return retvar;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmmetric.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/segmmodules/segmhelpers.h\"\n\n#include \"salalib/isegment.h\"\n\nclass SegmentMetric : ISegment {\n  private:\n    double m_radius;\n    bool m_sel_only;\n\n  public:\n    std::string getAnalysisName() const override { return \"Metric Analysis\"; }\n    bool run(Communicator *comm, ShapeGraph &map, bool) override;\n    SegmentMetric(double radius, bool sel_only) : m_radius(radius), m_sel_only(sel_only) {}\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmmetricpd.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmmetricpd.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentMetricPD::run(Communicator *, ShapeGraph &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    bool retvar = true;\n\n    // record axial line refs for topological analysis\n    std::vector<int> axialrefs;\n    // quick through to find the longest seg length\n    std::vector<float> seglengths;\n    float maxseglength = 0.0f;\n    for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n        AttributeRow &row = map.getAttributeRowFromShapeIndex(cursor);\n        axialrefs.push_back(row.getValue(\"Axial Line Ref\"));\n        seglengths.push_back(row.getValue(\"Segment Length\"));\n        if (seglengths.back() > maxseglength) {\n            maxseglength = seglengths.back();\n        }\n    }\n\n    int maxbin;\n    std::string prefix;\n    prefix = \"Metric \";\n    maxbin = 512;\n    std::string depthcol = prefix + \"Step Depth\";\n\n    attributes.insertOrResetColumn(depthcol.c_str());\n\n    std::vector<unsigned int> seen(map.getShapeCount());\n    std::vector<TopoMetSegmentRef> audittrail(map.getShapeCount());\n    std::vector<int> list[512]; // 512 bins!\n    int open = 0;\n\n    for (size_t i = 0; i < map.getShapeCount(); i++) {\n        seen[i] = 0xffffffff;\n    }\n    for (auto &cursor : map.getSelSet()) {\n        seen[cursor] = 0;\n        open++;\n        double length = seglengths[cursor];\n        audittrail[cursor] = TopoMetSegmentRef(cursor, Connector::SEG_CONN_ALL, length * 0.5, -1);\n        // better to divide by 511 but have 512 bins...\n        list[(int(floor(0.5 + 511 * length / maxseglength))) % 512].push_back(cursor);\n        AttributeRow &row = map.getAttributeRowFromShapeIndex(cursor);\n        row.setValue(depthcol.c_str(), 0);\n    }\n\n    unsigned int segdepth = 0;\n    int bin = 0;\n\n    while (open != 0) {\n        while (list[bin].size() == 0) {\n            bin++;\n            segdepth += 1;\n            if (bin == maxbin) {\n                bin = 0;\n            }\n        }\n        //\n        TopoMetSegmentRef &here = audittrail[list[bin].back()];\n        list[bin].pop_back();\n        open--;\n        // this is necessary using unsigned ints for \"seen\", as it is possible to add a node twice\n        if (here.done) {\n            continue;\n        } else {\n            here.done = true;\n        }\n\n        Connector &axline = map.getConnections().at(here.ref);\n        int connected_cursor = -2;\n\n        auto iter = axline.m_back_segconns.begin();\n        bool backsegs = true;\n\n        while (connected_cursor != -1) {\n            if (backsegs && iter == axline.m_back_segconns.end()) {\n                iter = axline.m_forward_segconns.begin();\n                backsegs = false;\n            }\n            if (!backsegs && iter == axline.m_forward_segconns.end()) {\n                break;\n            }\n\n            connected_cursor = iter->first.ref;\n            if (seen[connected_cursor] > segdepth) {\n                float length = seglengths[connected_cursor];\n                seen[connected_cursor] = segdepth;\n                audittrail[connected_cursor] =\n                    TopoMetSegmentRef(connected_cursor, here.dir, here.dist + length, here.ref);\n                // puts in a suitable bin ahead of us...\n                open++;\n                //\n                // better to divide by 511 but have 512 bins...\n                list[(bin + int(floor(0.5 + 511 * length / maxseglength))) % 512].push_back(connected_cursor);\n                AttributeRow &row = map.getAttributeRowFromShapeIndex(connected_cursor);\n                row.setValue(depthcol.c_str(), here.dist + length * 0.5);\n            }\n            iter++;\n        }\n    }\n\n    map.setDisplayedAttribute(attributes.getColumnIndex(depthcol.c_str()));\n\n    return retvar;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmmetricpd.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/segmmodules/segmhelpers.h\"\n\n#include \"salalib/isegment.h\"\n\nclass SegmentMetricPD : ISegment {\n  public:\n    std::string getAnalysisName() const override { return \"Metric Analysis\"; }\n    bool run(Communicator *, ShapeGraph &map, bool) override;\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmtopological.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmtopological.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentTopological::run(Communicator *comm, ShapeGraph &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    bool retvar = true;\n\n    time_t atime = 0;\n\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS,\n                              (m_sel_only ? map.getSelSet().size() : map.getConnections().size()));\n    }\n    int reccount = 0;\n\n    // record axial line refs for topological analysis\n    std::vector<int> axialrefs;\n    // quick through to find the longest seg length\n    std::vector<float> seglengths;\n    float maxseglength = 0.0f;\n    for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n        AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n        axialrefs.push_back(row.getValue(attributes.getColumnIndex(\"Axial Line Ref\")));\n        seglengths.push_back(row.getValue(attributes.getColumnIndex(\"Segment Length\")));\n        if (seglengths.back() > maxseglength) {\n            maxseglength = seglengths.back();\n        }\n    }\n\n    std::string prefix, suffix;\n    int maxbin;\n    prefix = \"Topological \";\n    maxbin = 2;\n    if (m_radius != -1.0) {\n        suffix = dXstring::formatString(m_radius, \" R%.f metric\");\n    }\n    std::string choicecol = prefix + \"Choice\" + suffix;\n    std::string wchoicecol = prefix + \"Choice [SLW]\" + suffix;\n    std::string meandepthcol = prefix + \"Mean Depth\" + suffix;\n    std::string wmeandepthcol = prefix + std::string(\"Mean Depth [SLW]\") + suffix;\n    std::string totaldcol = prefix + \"Total Depth\" + suffix;\n    std::string totalcol = prefix + \"Total Nodes\" + suffix;\n    std::string wtotalcol = prefix + \"Total Length\" + suffix;\n    //\n    if (!m_sel_only) {\n        attributes.insertOrResetColumn(choicecol.c_str());\n        attributes.insertOrResetColumn(wchoicecol.c_str());\n    }\n    attributes.insertOrResetColumn(meandepthcol.c_str());\n    attributes.insertOrResetColumn(wmeandepthcol.c_str());\n    attributes.insertOrResetColumn(totaldcol.c_str());\n    attributes.insertOrResetColumn(totalcol.c_str());\n    attributes.insertOrResetColumn(wtotalcol.c_str());\n    //\n    std::vector<unsigned int> seen(map.getShapeCount());\n    std::vector<TopoMetSegmentRef> audittrail(map.getShapeCount());\n    std::vector<TopoMetSegmentChoice> choicevals(map.getShapeCount());\n    for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n        AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n        if (m_sel_only && !row.isSelected()) {\n            continue;\n        }\n        for (size_t i = 0; i < map.getShapeCount(); i++) {\n            seen[i] = 0xffffffff;\n        }\n        std::vector<int> list[512]; // 512 bins!\n        int bin = 0;\n        list[bin].push_back(cursor);\n        double rootseglength = seglengths[cursor];\n        audittrail[cursor] = TopoMetSegmentRef(cursor, Connector::SEG_CONN_ALL, rootseglength * 0.5, -1);\n        int open = 1;\n        unsigned int segdepth = 0;\n        double total = 0.0, wtotal = 0.0, wtotaldepth = 0.0, totalsegdepth = 0.0, totalmetdepth = 0.0;\n        while (open != 0) {\n            while (list[bin].size() == 0) {\n                bin++;\n                segdepth += 1;\n                if (bin == maxbin) {\n                    bin = 0;\n                }\n            }\n            //\n            TopoMetSegmentRef &here = audittrail[list[bin].back()];\n            list[bin].pop_back();\n            open--;\n            //\n            if (here.done) {\n                continue;\n            } else {\n                here.done = true;\n            }\n            //\n            double len = seglengths[here.ref];\n            totalsegdepth += segdepth;\n            totalmetdepth += here.dist - len * 0.5; // preloaded with length ahead\n            wtotal += len;\n            wtotaldepth += len * segdepth;\n\n            total += 1;\n            //\n            Connector &axline = map.getConnections().at(here.ref);\n            int connected_cursor = -2;\n\n            auto iter = axline.m_back_segconns.begin();\n            bool backsegs = true;\n\n            while (connected_cursor != -1) {\n                if (backsegs && iter == axline.m_back_segconns.end()) {\n                    iter = axline.m_forward_segconns.begin();\n                    backsegs = false;\n                }\n                if (!backsegs && iter == axline.m_forward_segconns.end()) {\n                    break;\n                }\n\n                connected_cursor = iter->first.ref;\n\n                if (seen[connected_cursor] > segdepth && static_cast<size_t>(connected_cursor) != cursor) {\n                    bool seenalready = (seen[connected_cursor] == 0xffffffff) ? false : true;\n                    float length = seglengths[connected_cursor];\n                    int axialref = axialrefs[connected_cursor];\n                    audittrail[connected_cursor] =\n                        TopoMetSegmentRef(connected_cursor, here.dir, here.dist + length, here.ref);\n                    seen[connected_cursor] = segdepth;\n                    if (m_radius == -1 || here.dist + length < m_radius) {\n                        // puts in a suitable bin ahead of us...\n                        open++;\n                        //\n                        if (axialrefs[here.ref] == axialref) {\n                            list[bin].push_back(connected_cursor);\n                        } else {\n                            list[(bin + 1) % 2].push_back(connected_cursor);\n                            seen[connected_cursor] =\n                                segdepth + 1; // this is so if another node is connected directly to this one but\n                                              // is found later it is still handled -- note it can result in the\n                                              // connected cursor being added twice\n                        }\n                    }\n                    // not sure why this is outside the radius restriction\n                    // (sel_only: with restricted selection set, not all lines will be labelled)\n                    // (seenalready: need to check that we're not doing this twice, given the seen can go twice)\n\n                    // Quick mod - TV\n                    if (!m_sel_only && connected_cursor > int(cursor) &&\n                        !seenalready) { // only one way paths, saves doing this twice\n                        int subcur = connected_cursor;\n                        while (subcur != -1) {\n                            // in this method of choice, start and end lines are included\n                            choicevals[subcur].choice += 1;\n                            choicevals[subcur].wchoice += (rootseglength * length);\n                            subcur = audittrail[subcur].previous;\n                        }\n                    }\n                }\n                iter++;\n            }\n        }\n        // also put in mean depth:\n        row.setValue(meandepthcol.c_str(), totalsegdepth / (total - 1));\n        row.setValue(totaldcol.c_str(), totalsegdepth);\n        row.setValue(wmeandepthcol.c_str(), wtotaldepth / (wtotal - rootseglength));\n        row.setValue(totalcol.c_str(), total);\n        row.setValue(wtotalcol.c_str(), wtotal);\n        //\n        if (comm) {\n            if (qtimer(atime, 500)) {\n                if (comm->IsCancelled()) {\n                    throw Communicator::CancelledException();\n                }\n            }\n            comm->CommPostMessage(Communicator::CURRENT_RECORD, reccount);\n        }\n        reccount++;\n    }\n    if (!m_sel_only) {\n        // note, I've stopped sel only from calculating choice values:\n        for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n            AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n            row.setValue(choicecol.c_str(), choicevals[cursor].choice);\n            row.setValue(wchoicecol.c_str(), choicevals[cursor].wchoice);\n        }\n    }\n\n    if (!m_sel_only) {\n        map.setDisplayedAttribute(attributes.getColumnIndex(choicecol.c_str()));\n    } else {\n        map.setDisplayedAttribute(attributes.getColumnIndex(meandepthcol.c_str()));\n    }\n\n    return retvar;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmtopological.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/segmmodules/segmhelpers.h\"\n\n#include \"salalib/isegment.h\"\n\nclass SegmentTopological : ISegment {\n  private:\n    double m_radius;\n    bool m_sel_only;\n\n  public:\n    std::string getAnalysisName() const override { return \"Topological Analysis\"; }\n    bool run(Communicator *comm, ShapeGraph &map, bool) override;\n    SegmentTopological(double radius, bool sel_only) : m_radius(radius), m_sel_only(sel_only) {}\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmtopologicalpd.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmtopologicalpd.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentTopologicalPD::run(Communicator *, ShapeGraph &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    bool retvar = true;\n\n    // record axial line refs for topological analysis\n    std::vector<int> axialrefs;\n    // quick through to find the longest seg length\n    std::vector<float> seglengths;\n    float maxseglength = 0.0f;\n    for (size_t cursor = 0; cursor < map.getShapeCount(); cursor++) {\n        AttributeRow& row = map.getAttributeRowFromShapeIndex(cursor);\n        axialrefs.push_back(row.getValue(\"Axial Line Ref\"));\n        seglengths.push_back(row.getValue(\"Segment Length\"));\n        if (seglengths.back() > maxseglength) {\n            maxseglength = seglengths.back();\n        }\n    }\n\n    int maxbin = 2;\n    std::string prefix = \"Topological \";\n    std::string depthcol = prefix + \"Step Depth\";\n\n    attributes.insertOrResetColumn(depthcol.c_str());\n\n    std::vector<unsigned int> seen(map.getShapeCount());\n    std::vector<TopoMetSegmentRef> audittrail(map.getShapeCount());\n    std::vector<int> list[512]; // 512 bins!\n    int open = 0;\n\n    for (size_t i = 0; i < map.getShapeCount(); i++) {\n        seen[i] = 0xffffffff;\n    }\n    for (auto &cursor : map.getSelSet()) {\n        seen[cursor] = 0;\n        open++;\n        double length = seglengths[cursor];\n        audittrail[cursor] = TopoMetSegmentRef(cursor, Connector::SEG_CONN_ALL, length * 0.5, -1);\n        list[0].push_back(cursor);\n        attributes.getRow(AttributeKey(cursor)).setValue(depthcol.c_str(), 0);\n    }\n\n    unsigned int segdepth = 0;\n    int bin = 0;\n\n    while (open != 0) {\n        while (list[bin].size() == 0) {\n            bin++;\n            segdepth += 1;\n            if (bin == maxbin) {\n                bin = 0;\n            }\n        }\n        //\n        TopoMetSegmentRef &here = audittrail[list[bin].back()];\n        list[bin].pop_back();\n        open--;\n        // this is necessary using unsigned ints for \"seen\", as it is possible to add a node twice\n        if (here.done) {\n            continue;\n        } else {\n            here.done = true;\n        }\n\n        Connector &axline = map.getConnections().at(here.ref);\n        int connected_cursor = -2;\n\n        auto iter = axline.m_back_segconns.begin();\n        bool backsegs = true;\n\n        while (connected_cursor != -1) {\n            if (backsegs && iter == axline.m_back_segconns.end()) {\n                iter = axline.m_forward_segconns.begin();\n                backsegs = false;\n            }\n            if (!backsegs && iter == axline.m_forward_segconns.end()) {\n                break;\n            }\n\n            connected_cursor = iter->first.ref;\n            AttributeRow& row = map.getAttributeRowFromShapeIndex(connected_cursor);\n            if (seen[connected_cursor] > segdepth) {\n                float length = seglengths[connected_cursor];\n                int axialref = axialrefs[connected_cursor];\n                seen[connected_cursor] = segdepth;\n                audittrail[connected_cursor] =\n                    TopoMetSegmentRef(connected_cursor, here.dir, here.dist + length, here.ref);\n                // puts in a suitable bin ahead of us...\n                open++;\n                //\n                if (axialrefs[here.ref] == axialref) {\n                    list[bin].push_back(connected_cursor);\n                    row.setValue(depthcol.c_str(), segdepth);\n                } else {\n                    list[(bin + 1) % 2].push_back(connected_cursor);\n                    seen[connected_cursor] =\n                        segdepth +\n                        1; // this is so if another node is connected directly to this one but is found later it is\n                           // still handled -- note it can result in the connected cursor being added twice\n                    row.setValue(depthcol.c_str(), segdepth + 1);\n                }\n            }\n            iter++;\n        }\n    }\n\n    map.setDisplayedAttribute(attributes.getColumnIndex(depthcol.c_str()));\n\n    return retvar;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmtopologicalpd.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/segmmodules/segmhelpers.h\"\n\n#include \"salalib/isegment.h\"\n\nclass SegmentTopologicalPD : ISegment {\n  public:\n    std::string getAnalysisName() const override { return \"Topological Analysis\"; }\n    bool run(Communicator *, ShapeGraph &map, bool) override;\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmtulip.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmtulip.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool SegmentTulip::run(Communicator *comm, ShapeGraph &map, bool) {\n\n    if (map.getMapType() != ShapeMap::SEGMENTMAP) {\n        return false;\n    }\n\n    // TODO: Understand what these parameters do. They were never truly provided in the original function\n    int weighting_col2 = m_weighted_measure_col2;\n    int routeweight_col = m_routeweight_col;\n    bool interactive = m_interactive;\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    int processed_rows = 0;\n\n    time_t atime = 0;\n\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS,\n                              (m_sel_only ? map.getSelSet().size() : map.getConnections().size()));\n    }\n\n    // note: radius must be sorted lowest to highest, but if -1 occurs (\"radius n\") it needs to be last...\n    // ...to ensure no mess ups, we'll re-sort here:\n    bool radius_n = false;\n    std::vector<double> radius_unconverted;\n    for (int radius : m_radius_set) {\n        if (radius == -1.0) {\n            radius_n = true;\n        } else {\n            radius_unconverted.push_back(radius);\n        }\n    }\n    if (radius_n) {\n        radius_unconverted.push_back(-1.0);\n    }\n\n    // retrieve weighted col data, as this may well be overwritten in the new analysis:\n    std::vector<float> weights;\n    std::vector<float> routeweights; // EF\n    std::string weighting_col_text;\n\n    int tulip_bins = m_tulip_bins;\n\n    if (m_weighted_measure_col != -1) {\n        weighting_col_text = attributes.getColumnName(m_weighted_measure_col);\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            weights.push_back(map.getAttributeRowFromShapeIndex(i).getValue(m_weighted_measure_col));\n        }\n    } else { // Normal run // TV\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            weights.push_back(1.0f);\n        }\n    }\n    // EF routeweight*\n    std::string routeweight_col_text;\n    if (routeweight_col != -1) {\n        // we normalise the column values between 0 and 1 and reverse it so that high values can be treated as a 'low\n        // cost' - similar to the angular cost\n        double max_value = attributes.getColumn(routeweight_col).getStats().max;\n        routeweight_col_text = attributes.getColumnName(routeweight_col);\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            routeweights.push_back(1.0 - (map.getAttributeRowFromShapeIndex(i).getValue(routeweight_col) /\n                                          max_value)); // scale and revert!\n        }\n    } else { // Normal run // TV\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            routeweights.push_back(1.0f);\n        }\n    }\n    //*EF routeweight\n\n    // EFEF*\n    // for origin-destination weighting\n    std::vector<float> weights2;\n    std::string weighting_col_text2;\n    if (weighting_col2 != -1) {\n        weighting_col_text2 = attributes.getColumnName(weighting_col2);\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            weights2.push_back(map.getAttributeRowFromShapeIndex(i).getValue(weighting_col2));\n        }\n    } else { // Normal run // TV\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            weights2.push_back(1.0f);\n        }\n    }\n    //*EFEF\n\n    std::string tulip_text = std::string(\"T\") + dXstring::formatString(tulip_bins, \"%d\");\n\n    // first enter the required attribute columns:\n    size_t r;\n    for (r = 0; r < radius_unconverted.size(); r++) {\n        std::string radius_text = makeRadiusText(m_radius_type, radius_unconverted[r]);\n        if (m_choice) {\n            // EF routeweight *\n            if (routeweight_col != -1) {\n                std::string choice_col_text =\n                    tulip_text + \" Choice [Route weight by \" + routeweight_col_text + \"]\" + radius_text;\n                attributes.insertOrResetColumn(choice_col_text.c_str());\n                if (m_weighted_measure_col != -1) {\n                    std::string w_choice_col_text = tulip_text + \" Choice [[Route weight by \" + routeweight_col_text +\n                                                    \"][\" + weighting_col_text + \" Wgt]]\" + radius_text;\n\n                    attributes.insertOrResetColumn(w_choice_col_text.c_str());\n                }\n                // EFEF*\n                if (weighting_col2 != -1) {\n                    std::string w_choice_col_text2 = tulip_text + \" Choice [[Route weight by \" + routeweight_col_text +\n                                                     \"][\" + weighting_col_text + \"-\" + weighting_col_text2 + \" Wgt]]\" +\n                                                     radius_text;\n\n                    attributes.insertOrResetColumn(w_choice_col_text2.c_str());\n                }\n                //*EFEF\n            }\n            //*EF routeweight\n            else { // Normal run // TV\n                std::string choice_col_text = tulip_text + \" Choice\" + radius_text;\n                attributes.insertOrResetColumn(choice_col_text.c_str());\n                if (m_weighted_measure_col != -1) {\n                    std::string w_choice_col_text =\n                        tulip_text + \" Choice [\" + weighting_col_text + \" Wgt]\" + radius_text;\n                    attributes.insertOrResetColumn(w_choice_col_text.c_str());\n                }\n                // EFEF*\n                if (weighting_col2 != -1) {\n                    std::string w_choice_col_text2 = tulip_text + \" Choice [\" + weighting_col_text + \"-\" +\n                                                     weighting_col_text2 + \" Wgt]\" + radius_text;\n                    attributes.insertOrResetColumn(w_choice_col_text2.c_str());\n                }\n                //*EFEF\n            }\n        }\n\n        // EF routeweight *\n        if (routeweight_col != -1) {\n            std::string integ_col_text = tulip_text + \" Integration [Route weight by \" + routeweight_col_text + \"]\" +\n                                         radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string w_integ_col_text = tulip_text + \" Integration [[Route weight by \" + routeweight_col_text +\n                                           \"][\" + weighting_col_text + \" Wgt]]\" + radius_text;\n\n            std::string count_col_text = tulip_text + \" Node Count [Route weight by \" + routeweight_col_text + \"]\" +\n                                         radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string td_col_text = tulip_text + \" Total Depth [Route weight by \" + routeweight_col_text + \"]\" +\n                                      radius_text; // <- note, the fact this is a tulip is unnecessary\n            // '[' comes after 'R' in ASCII, so this column will come after Mean Depth R...\n            std::string w_td_text = tulip_text + \" Total Depth [[Route weight by \" + routeweight_col_text + \"][\" +\n                                    weighting_col_text + \" Wgt]]\" + radius_text;\n            std::string total_weight_text = tulip_text + \" Total \" + weighting_col_text + \" [Route weight by \" +\n                                            routeweight_col_text + \"]\" + radius_text;\n\n            attributes.insertOrResetColumn(integ_col_text.c_str());\n            attributes.insertOrResetColumn(count_col_text.c_str());\n            attributes.insertOrResetColumn(td_col_text.c_str());\n            if (m_weighted_measure_col != -1) {\n                attributes.insertOrResetColumn(w_integ_col_text.c_str());\n                attributes.insertOrResetColumn(w_td_text.c_str());\n                attributes.insertOrResetColumn(total_weight_text.c_str());\n            }\n        }\n        //*EF routeweight\n        else { // Normal run // TV\n            std::string integ_col_text =\n                tulip_text + \" Integration\" + radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string w_integ_col_text = tulip_text + \" Integration [\" + weighting_col_text + \" Wgt]\" + radius_text;\n\n            std::string count_col_text =\n                tulip_text + \" Node Count\" + radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string td_col_text =\n                tulip_text + \" Total Depth\" + radius_text; // <- note, the fact this is a tulip is unnecessary\n            // '[' comes after 'R' in ASCII, so this column will come after Mean Depth R...\n            std::string w_td_text = tulip_text + \" Total Depth [\" + weighting_col_text + \" Wgt]\" + radius_text;\n            std::string total_weight_text = tulip_text + \" Total \" + weighting_col_text + radius_text;\n\n            attributes.insertOrResetColumn(integ_col_text.c_str());\n            attributes.insertOrResetColumn(count_col_text.c_str());\n            attributes.insertOrResetColumn(td_col_text.c_str());\n            if (m_weighted_measure_col != -1) {\n                attributes.insertOrResetColumn(w_integ_col_text.c_str());\n                attributes.insertOrResetColumn(w_td_text.c_str());\n                attributes.insertOrResetColumn(total_weight_text.c_str());\n            }\n        }\n    }\n    std::vector<int> choice_col, w_choice_col, w_choice_col2, count_col, integ_col, w_integ_col, td_col, w_td_col,\n        total_weight_col;\n    // then look them up! eek....\n    for (r = 0; r < radius_unconverted.size(); r++) {\n        std::string radius_text = makeRadiusText(m_radius_type, radius_unconverted[r]);\n        if (m_choice) {\n            // EF routeweight *\n            if (routeweight_col != -1) {\n                std::string choice_col_text =\n                    tulip_text + \" Choice [Route weight by \" + routeweight_col_text + \"]\" + radius_text;\n                choice_col.push_back(attributes.getColumnIndex(choice_col_text.c_str()));\n                if (m_weighted_measure_col != -1) {\n                    std::string w_choice_col_text = tulip_text + \" Choice [[Route weight by \" + routeweight_col_text +\n                                                    \"][\" + weighting_col_text + \" Wgt]]\" + radius_text;\n                    w_choice_col.push_back(attributes.getColumnIndex(w_choice_col_text.c_str()));\n                }\n                // EFEF*\n                if (weighting_col2 != -1) {\n                    std::string w_choice_col_text2 = tulip_text + \" Choice [[Route weight by \" + routeweight_col_text +\n                                                     \"][\" + weighting_col_text + \"-\" + weighting_col_text2 + \" Wgt]]\" +\n                                                     radius_text;\n                    w_choice_col2.push_back(attributes.getColumnIndex(w_choice_col_text2.c_str()));\n                }\n                //*EFEF\n            }\n            //* EF routeweight\n            else { // Normal run // TV\n                std::string choice_col_text = tulip_text + \" Choice\" + radius_text;\n                choice_col.push_back(attributes.getColumnIndex(choice_col_text.c_str()));\n                if (m_weighted_measure_col != -1) {\n                    std::string w_choice_col_text =\n                        tulip_text + \" Choice [\" + weighting_col_text + \" Wgt]\" + radius_text;\n                    w_choice_col.push_back(attributes.getColumnIndex(w_choice_col_text.c_str()));\n                }\n                // EFEF*\n                if (weighting_col2 != -1) {\n                    std::string w_choice_col_text2 = tulip_text + \" Choice [\" + weighting_col_text + \"-\" +\n                                                     weighting_col_text2 + \" Wgt]\" + radius_text;\n                    w_choice_col2.push_back(attributes.getColumnIndex(w_choice_col_text2.c_str()));\n                }\n                //*EFEF\n            }\n        }\n        // EF routeweight *\n        if (routeweight_col != -1) {\n            std::string integ_col_text = tulip_text + \" Integration [Route weight by \" + routeweight_col_text + \"]\" +\n                                         radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string w_integ_col_text = tulip_text + \" Integration [[Route weight by \" + routeweight_col_text +\n                                           \"][\" + weighting_col_text + \" Wgt]]\" + radius_text;\n\n            std::string count_col_text = tulip_text + \" Node Count [Route weight by \" + routeweight_col_text + \"]\" +\n                                         radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string td_col_text = tulip_text + \" Total Depth [Route weight by \" + routeweight_col_text + \"]\" +\n                                      radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string w_td_text = tulip_text + \" Total Depth [[Route weight by \" + routeweight_col_text + \"][\" +\n                                    weighting_col_text + \" Wgt]]\" + radius_text;\n            std::string total_weight_col_text = tulip_text + \" Total \" + weighting_col_text + \" [Route weight by \" +\n                                                routeweight_col_text + \"]\" + radius_text;\n\n            integ_col.push_back(attributes.getColumnIndex(integ_col_text.c_str()));\n            count_col.push_back(attributes.getColumnIndex(count_col_text.c_str()));\n            td_col.push_back(attributes.getColumnIndex(td_col_text.c_str()));\n            if (m_weighted_measure_col != -1) {\n                // '[' comes after 'R' in ASCII, so this column will come after Mean Depth R...\n                w_integ_col.push_back(attributes.getColumnIndex(w_integ_col_text.c_str()));\n                w_td_col.push_back(attributes.getColumnIndex(w_td_text.c_str()));\n                total_weight_col.push_back(attributes.getColumnIndex(total_weight_col_text.c_str()));\n            }\n        }\n        //* EF routeweight\n        else { // Normal run // TV\n            std::string integ_col_text =\n                tulip_text + \" Integration\" + radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string w_integ_col_text = tulip_text + \" Integration [\" + weighting_col_text + \" Wgt]\" + radius_text;\n\n            std::string count_col_text =\n                tulip_text + \" Node Count\" + radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string td_col_text =\n                tulip_text + \" Total Depth\" + radius_text; // <- note, the fact this is a tulip is unnecessary\n            std::string w_td_text = tulip_text + \" Total Depth [\" + weighting_col_text + \" Wgt]\" + radius_text;\n            std::string total_weight_col_text = tulip_text + \" Total \" + weighting_col_text + radius_text;\n\n            integ_col.push_back(attributes.getColumnIndex(integ_col_text.c_str()));\n            count_col.push_back(attributes.getColumnIndex(count_col_text.c_str()));\n            td_col.push_back(attributes.getColumnIndex(td_col_text.c_str()));\n            if (m_weighted_measure_col != -1) {\n                // '[' comes after 'R' in ASCII, so this column will come after Mean Depth R...\n                w_integ_col.push_back(attributes.getColumnIndex(w_integ_col_text.c_str()));\n                w_td_col.push_back(attributes.getColumnIndex(w_td_text.c_str()));\n                total_weight_col.push_back(attributes.getColumnIndex(total_weight_col_text.c_str()));\n            }\n        }\n    }\n\n    tulip_bins /= 2; // <- actually use semicircle of tulip bins\n    tulip_bins += 1;\n\n    std::vector<std::vector<SegmentData>> bins(tulip_bins);\n\n    // TODO: Replace these with STL\n    AnalysisInfo ***audittrail;\n    unsigned int **uncovered;\n    audittrail = new AnalysisInfo **[map.getConnections().size()];\n    uncovered = new unsigned int *[map.getConnections().size()];\n    for (size_t i = 0; i < map.getConnections().size(); i++) {\n        audittrail[i] = new AnalysisInfo *[radius_unconverted.size()];\n        for (size_t j = 0; j < radius_unconverted.size(); j++) {\n            audittrail[i][j] = new AnalysisInfo[2];\n        }\n        uncovered[i] = new unsigned int[2];\n    }\n    std::vector<double> radius;\n    for (r = 0; r < radius_unconverted.size(); r++) {\n        if (m_radius_type == Options::RADIUS_ANGULAR && radius_unconverted[r] != -1) {\n            radius.push_back(floor(radius_unconverted[r] * tulip_bins * 0.5));\n        } else {\n            radius.push_back(radius_unconverted[r]);\n        }\n    }\n    // entered once for each segment\n    int length_col = attributes.getColumnIndex(\"Segment Length\");\n    std::vector<float> lengths;\n    if (length_col != -1) {\n        for (size_t i = 0; i < map.getConnections().size(); i++) {\n            AttributeRow& row = map.getAttributeRowFromShapeIndex(i);\n            lengths.push_back(row.getValue(length_col));\n        }\n    }\n\n    int radiussize = radius.size();\n    int radiusmask = 0;\n    for (int i = 0; i < radiussize; i++) {\n        radiusmask |= (1 << i);\n    }\n\n    for (size_t cursor = 0; cursor < map.getConnections().size(); cursor++) {\n        AttributeRow &row =\n            map.getAttributeRowFromShapeIndex(cursor);\n\n        if (m_sel_only) {\n            // could use m_selection_set.searchindex(rowid) to find\n            // if this row is selected as m_selection_set is ordered for axial and segment maps, etc\n            // BUT, actually quicker to check the tag in the attributes that shows it's selected\n            if (!row.isSelected()) {\n                continue;\n            }\n        }\n\n        for (int k = 0; k < tulip_bins; k++) {\n            bins[k].clear();\n        }\n        for (size_t j = 0; j < map.getConnections().size(); j++) {\n            for (int dir = 0; dir < 2; dir++) {\n                for (int k = 0; k < radiussize; k++) {\n                    audittrail[j][k][dir].clearLine();\n                }\n                uncovered[j][dir] = radiusmask;\n            }\n        }\n\n        double rootseglength = row.getValue(length_col);\n        double rootweight = (m_weighted_measure_col != -1) ? weights[cursor] : 0.0;\n\n        // setup: direction 0 (both ways), segment i, previous -1, segdepth (step depth) 0, metricdepth 0.5 *\n        // rootseglength, bin 0\n        SegmentData segmentData(0, cursor, SegmentRef(), 0, 0.5 * rootseglength, radiusmask);\n        auto it = std::lower_bound(bins[0].begin(), bins[0].end(), segmentData);\n        if (it == bins[0].end() || segmentData != *it) {\n            bins[0].insert(it, segmentData);\n        }\n        // this version below is only designed to be used temporarily --\n        // could be on an option?\n        // bins[0].push_back(SegmentData(0,rowid,SegmentRef(),0,0.0,radiusmask));\n        int depthlevel = 0;\n        int opencount = 1;\n        size_t currentbin = 0;\n        while (opencount) {\n            while (!bins[currentbin].size()) {\n                depthlevel++;\n                currentbin++;\n                if (currentbin == static_cast<size_t>(tulip_bins)) {\n                    currentbin = 0;\n                }\n            }\n            SegmentData lineindex = bins[currentbin].back();\n            bins[currentbin].pop_back();\n            //\n            opencount--;\n\n            int ref = lineindex.ref;\n            int dir = (lineindex.dir == 1) ? 0 : 1;\n            int coverage = lineindex.coverage & uncovered[ref][dir];\n            if (coverage != 0) {\n                int rbin = 0;\n                int rbinbase;\n                if (lineindex.previous.ref != -1) {\n                    uncovered[ref][dir] &= ~coverage;\n                    while (((coverage >> rbin) & 0x1) == 0)\n                        rbin++;\n                    rbinbase = rbin;\n                    while (rbin < radiussize) {\n                        if (((coverage >> rbin) & 0x1) == 1) {\n                            audittrail[ref][rbin][dir].depth = depthlevel;\n                            audittrail[ref][rbin][dir].previous = lineindex.previous;\n                            audittrail[lineindex.previous.ref][rbin][(lineindex.previous.dir == 1) ? 0 : 1].leaf =\n                                false;\n                        }\n                        rbin++;\n                    }\n                } else {\n                    rbinbase = 0;\n                    uncovered[ref][0] &= ~coverage;\n                    uncovered[ref][1] &= ~coverage;\n                }\n                Connector &line = map.getConnections()[ref];\n                float seglength;\n                int extradepth;\n                if (lineindex.dir != -1) {\n                    for (auto &segconn : line.m_forward_segconns) {\n                        rbin = rbinbase;\n                        SegmentRef conn = segconn.first;\n                        if ((uncovered[conn.ref][(conn.dir == 1 ? 0 : 1)] & coverage) != 0) {\n                            // EF routeweight*\n                            if (routeweight_col != -1) { // EF here we do the weighting of the angular cost by the\n                                                         // weight of the next segment\n                                // note that the content of the routeweights array is scaled between 0 and 1 and is\n                                // reversed\n                                // such that: = 1.0-(attributes.getValue(i, routeweight_col)/max_value)\n                                extradepth = (int)floor(segconn.second * tulip_bins * 0.5 * routeweights[conn.ref]);\n                            }\n                            //*EF routeweight\n                            else {\n                                extradepth = (int)floor(segconn.second * tulip_bins * 0.5);\n                            }\n                            seglength = lengths[conn.ref];\n                            switch (m_radius_type) {\n                            case Options::RADIUS_ANGULAR:\n                                while (rbin != radiussize && radius[rbin] != -1 &&\n                                       depthlevel + extradepth > (int)radius[rbin]) {\n                                    rbin++;\n                                }\n                                break;\n                            case Options::RADIUS_METRIC:\n                                while (rbin != radiussize && radius[rbin] != -1 &&\n                                       lineindex.metricdepth + seglength * 0.5 > radius[rbin]) {\n                                    rbin++;\n                                }\n                                break;\n                            case Options::RADIUS_STEPS:\n                                if (rbin != radiussize && radius[rbin] != -1 &&\n                                    lineindex.segdepth >= (int)radius[rbin]) {\n                                    rbin++;\n                                }\n                                break;\n                            }\n                            if ((coverage >> rbin) != 0) {\n                                SegmentData sd(conn, SegmentRef(1, lineindex.ref), lineindex.segdepth + 1,\n                                               lineindex.metricdepth + seglength, (coverage >> rbin) << rbin);\n                                size_t bin = (currentbin + tulip_bins + extradepth) % tulip_bins;\n                                depthmapX::insert_sorted(bins[bin], sd);\n                                opencount++;\n                            }\n                        }\n                    }\n                }\n                if (lineindex.dir != 1) {\n                    for (auto &segconn : line.m_back_segconns) {\n                        rbin = rbinbase;\n                        SegmentRef conn = segconn.first;\n                        if ((uncovered[conn.ref][(conn.dir == 1 ? 0 : 1)] & coverage) != 0) {\n                            // EF routeweight*\n                            if (routeweight_col != -1) { // EF here we do the weighting of the angular cost by the\n                                                         // weight of the next segment\n                                // note that the content of the routeweights array is scaled between 0 and 1 and is\n                                // reversed\n                                // such that: = 1.0-(attributes.getValue(i, routeweight_col)/max_value)\n                                extradepth = (int)floor(segconn.second * tulip_bins * 0.5 * routeweights[conn.ref]);\n                            }\n                            //*EF routeweight\n                            else {\n                                extradepth = (int)floor(segconn.second * tulip_bins * 0.5);\n                            }\n                            seglength = lengths[conn.ref];\n                            switch (m_radius_type) {\n                            case Options::RADIUS_ANGULAR:\n                                while (rbin != radiussize && radius[rbin] != -1 &&\n                                       depthlevel + extradepth > (int)radius[rbin]) {\n                                    rbin++;\n                                }\n                                break;\n                            case Options::RADIUS_METRIC:\n                                while (rbin != radiussize && radius[rbin] != -1 &&\n                                       lineindex.metricdepth + seglength * 0.5 > radius[rbin]) {\n                                    rbin++;\n                                }\n                                break;\n                            case Options::RADIUS_STEPS:\n                                if (rbin != radiussize && radius[rbin] != -1 &&\n                                    lineindex.segdepth >= (int)radius[rbin]) {\n                                    rbin++;\n                                }\n                                break;\n                            }\n                            if ((coverage >> rbin) != 0) {\n                                SegmentData sd(conn, SegmentRef(-1, lineindex.ref), lineindex.segdepth + 1,\n                                               lineindex.metricdepth + seglength, (coverage >> rbin) << rbin);\n                                size_t bin = (currentbin + tulip_bins + extradepth) % tulip_bins;\n                                depthmapX::insert_sorted(bins[bin], sd);\n                                opencount++;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        // set the attributes for this node:\n        for (int k = 0; k < radiussize; k++) {\n            // note, curs_total_depth must use double as mantissa can get too long for int in large systems\n            double curs_node_count = 0.0, curs_total_depth = 0.0;\n            double curs_total_weight = 0.0, curs_total_weighted_depth = 0.0;\n            size_t j;\n            for (j = 0; j < map.getConnections().size(); j++) {\n                // find dir according\n                bool m0 = ((uncovered[j][0] >> k) & 0x1) == 0;\n                bool m1 = ((uncovered[j][1] >> k) & 0x1) == 0;\n                if ((m0 | m1) != 0) {\n                    int dir;\n                    if (m0 & m1) {\n                        // dir is the one with the lowest depth:\n                        if (audittrail[j][k][0].depth < audittrail[j][k][1].depth)\n                            dir = 0;\n                        else\n                            dir = 1;\n                    } else {\n                        // dir is simply the one that's filled in:\n                        dir = m0 ? 0 : 1;\n                    }\n                    curs_node_count++;\n                    curs_total_depth += audittrail[j][k][dir].depth;\n                    curs_total_weight += weights[j];\n                    curs_total_weighted_depth += audittrail[j][k][dir].depth * weights[j];\n                    //\n                    if (m_choice && audittrail[j][k][dir].leaf) {\n                        // note, graph may be directed (e.g., for one way streets), so both ways must be included from\n                        // now on:\n                        SegmentRef here = SegmentRef(dir == 0 ? 1 : -1, j);\n                        if (here.ref != static_cast<int>(cursor)) {\n                            int choicecount = 0;\n                            double choiceweight = 0.0;\n                            // EFEF*\n                            double choiceweight2 = 0.0;\n                            //*EFEF\n                            while (here.ref != static_cast<int>(cursor)) { // not rowid means not the current root for the path\n                                int heredir = (here.dir == 1) ? 0 : 1;\n                                // each node has the existing choicecount and choiceweight from previously encountered\n                                // nodes added to it\n                                audittrail[here.ref][k][heredir].choice += choicecount;\n                                // nb, weighted values calculated anyway to save time on 'if'\n                                audittrail[here.ref][k][heredir].weighted_choice += choiceweight;\n                                // EFEF*\n                                audittrail[here.ref][k][heredir].weighted_choice2 += choiceweight2;\n                                //*EFEF\n                                // if the node hasn't been encountered before, the choicecount and choiceweight is\n                                // incremented for all remaining nodes to be encountered on the backwards route from it\n                                if (!audittrail[here.ref][k][heredir].choicecovered) {\n                                    // this node has not been encountered before: this adds the choicecount and weight\n                                    // for this node, and flags it as visited\n                                    choicecount++;\n                                    choiceweight += weights[here.ref] * rootweight;\n                                    // EFEF*\n                                    choiceweight2 += weights2[here.ref] * rootweight; // rootweight!\n                                    //*EFEF\n\n                                    audittrail[here.ref][k][heredir].choicecovered = true;\n                                    // note, for weighted choice, the start and end points have choice added to them:\n                                    if (m_weighted_measure_col != -1) {\n                                        audittrail[here.ref][k][heredir].weighted_choice +=\n                                            (weights[here.ref] * rootweight) / 2.0;\n                                        // EFEF*\n                                        if (weighting_col2 != -1) {\n                                            audittrail[here.ref][k][heredir].weighted_choice2 +=\n                                                (weights2[here.ref] * rootweight) / 2.0; // rootweight!\n                                        }\n                                        //*EFEF\n                                    }\n                                }\n                                here = audittrail[here.ref][k][heredir].previous;\n                            }\n                            // note, for weighted choice, the start and end points have choice added to them:\n                            // (this is the summed weight for all starting nodes encountered in this path)\n                            if (m_weighted_measure_col != -1) {\n                                audittrail[here.ref][k][(here.dir == 1) ? 0 : 1].weighted_choice += choiceweight / 2.0;\n                                // EFEF*\n                                if (weighting_col2 != -1) {\n                                    audittrail[here.ref][k][(here.dir == 1) ? 0 : 1].weighted_choice2 +=\n                                        choiceweight2 / 2.0;\n                                }\n                                //*EFEF\n                            }\n                        }\n                    }\n                }\n            }\n            double total_depth_conv = curs_total_depth / ((tulip_bins - 1.0f) * 0.5f);\n            double total_weighted_depth_conv = curs_total_weighted_depth / ((tulip_bins - 1.0f) * 0.5f);\n            //\n            row.setValue(count_col[k], float(curs_node_count));\n            if (curs_node_count > 1) {\n                // for dmap 8 and above, mean depth simply isn't calculated as for radius measures it is meaningless\n                row.setValue(td_col[k], total_depth_conv);\n                if (m_weighted_measure_col != -1) {\n                    row.setValue(total_weight_col[k], float(curs_total_weight));\n                    row.setValue(w_td_col[k], float(total_weighted_depth_conv));\n                }\n            } else {\n                row.setValue(td_col[k], -1);\n                if (m_weighted_measure_col != -1) {\n                    row.setValue(total_weight_col[k], -1.0f);\n                    row.setValue(w_td_col[k], -1.0f);\n                }\n            }\n            // for dmap 10 an above, integration is included!\n            if (total_depth_conv > 1e-9) {\n                row.setValue(integ_col[k], (float)(curs_node_count * curs_node_count / total_depth_conv));\n                if (m_weighted_measure_col != -1) {\n                    row.setValue(w_integ_col[k],\n                                 (float)(curs_total_weight * curs_total_weight / total_weighted_depth_conv));\n                }\n            } else {\n                row.setValue(integ_col[k], -1);\n                if (m_weighted_measure_col != -1) {\n                    row.setValue(w_integ_col[k], -1.0f);\n                }\n            }\n        }\n        //\n        processed_rows++;\n        //\n        if (comm) {\n            if (qtimer(atime, 500)) {\n                if (comm->IsCancelled()) {\n                    // interactive is usual Depthmap: throw an exception if cancelled\n                    if (interactive) {\n                        for (size_t i = 0; i < map.getConnections().size(); i++) {\n                            for (size_t j = 0; j < size_t(radiussize); j++) {\n                                delete[] audittrail[i][j];\n                            }\n                            delete[] audittrail[i];\n                            delete[] uncovered[i];\n                        }\n                        delete[] audittrail;\n                        delete[] uncovered;\n                        throw Communicator::CancelledException();\n                    } else {\n                        // in non-interactive mode, retain what's been processed already\n                        break;\n                    }\n                }\n                comm->CommPostMessage(Communicator::CURRENT_RECORD, cursor);\n            }\n        }\n    }\n    if (m_choice) {\n        for (size_t cursor = 0; cursor < map.getConnections().size(); cursor++) {\n            AttributeRow &row =\n                attributes.getRow(AttributeKey(depthmapX::getMapAtIndex(map.getAllShapes(), cursor)->first));\n            for (size_t r = 0; r < radius.size(); r++) {\n                // according to Eva's correction, total choice and total weighted choice\n                // should already have been accumulated by radius at this stage\n                double total_choice = audittrail[cursor][r][0].choice + audittrail[cursor][r][1].choice;\n                double total_weighted_choice =\n                    audittrail[cursor][r][0].weighted_choice + audittrail[cursor][r][1].weighted_choice;\n                // EFEF*\n                double total_weighted_choice2 =\n                    audittrail[cursor][r][0].weighted_choice2 + audittrail[cursor][r][1].weighted_choice2;\n                //*EFEF\n\n                // normalised choice now excluded for two reasons:\n                // a) not useful measure, b) in parallel calculations, cannot be calculated at this stage\n                // n.b., it is possible through the front end: the new choice takes into account bidirectional routes,\n                // so it should be normalised according to (n-1)(n-2) (maximum possible through routes) not\n                // (n-1)(n-2)/2 the relativised segment length weighted choice equation was\n                // (total_seg_length*total_seg_length-seg_length*seg_length)/2 again, drop the divide by 2 for the new\n                // implementation\n                //\n                //\n                row.setValue(choice_col[r], float(total_choice));\n                if (m_weighted_measure_col != -1) {\n                    row.setValue(w_choice_col[r], float(total_weighted_choice));\n                    // EFEF*\n                    if (weighting_col2 != -1) {\n                        row.setValue(w_choice_col2[r], float(total_weighted_choice2));\n                    }\n                    //*EFEF\n                }\n            }\n        }\n    }\n    for (size_t i = 0; i < map.getConnections().size(); i++) {\n        for (int j = 0; j < radiussize; j++) {\n            delete[] audittrail[i][j];\n        }\n        delete[] audittrail[i];\n        delete[] uncovered[i];\n    }\n    delete[] audittrail;\n    delete[] uncovered;\n\n    map.setDisplayedAttribute(-2); // <- override if it's already showing\n    if (m_choice) {\n        map.setDisplayedAttribute(choice_col.back());\n    } else {\n        map.setDisplayedAttribute(td_col.back());\n    }\n    return processed_rows > 0;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmtulip.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/isegment.h\"\n\nclass SegmentTulip : ISegment {\n  private:\n    std::set<double> m_radius_set;\n    bool m_sel_only;\n    int m_tulip_bins;\n    int m_weighted_measure_col;\n    int m_weighted_measure_col2;\n    int m_routeweight_col;\n    int m_radius_type;\n    bool m_choice;\n    bool m_interactive;\n\n  public:\n    std::string getAnalysisName() const override { return \"Tulip Analysis\"; }\n    bool run(Communicator *comm, ShapeGraph &map, bool) override;\n    SegmentTulip(std::set<double> radius_set, bool sel_only, int tulip_bins, int weighted_measure_col, int radius_type,\n                 bool choice, bool interactive = false, int weighted_measure_col2 = -1, int routeweight_col = -1)\n        : m_radius_set(radius_set), m_sel_only(sel_only), m_tulip_bins(tulip_bins),\n          m_weighted_measure_col(weighted_measure_col), m_radius_type(radius_type), m_choice(choice),\n          m_interactive(interactive), m_weighted_measure_col2(weighted_measure_col2),\n          m_routeweight_col(routeweight_col) {}\n};\n"
  },
  {
    "path": "salalib/segmmodules/segmtulipdepth.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/segmmodules/segmtulipdepth.h\"\n\n#include \"genlib/stringutils.h\"\n\n// revised to use tulip bins for faster analysis of large spaces\n\nbool SegmentTulipDepth::run(Communicator *, ShapeGraph &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    std::string stepdepth_col_text = \"Angular Step Depth\";\n    int stepdepth_col = attributes.insertOrResetColumn(stepdepth_col_text.c_str());\n\n    // The original code set tulip_bins to 1024, divided by two and added one\n    // in order to duplicate previous code (using a semicircle of tulip bins)\n    size_t tulip_bins = 513;\n\n    std::vector<bool> covered(map.getConnections().size());\n    for (size_t i = 0; i < map.getConnections().size(); i++) {\n       covered[i] = false;\n    }\n    std::vector<std::vector<SegmentData> > bins(tulip_bins);\n\n    int opencount = 0;\n    for (auto& sel: map.getSelSet()) {\n       int row = depthmapX::getMapAtIndex(map.getAllShapes(), sel)->first;\n       if (row != -1) {\n          bins[0].push_back(SegmentData(0,row,SegmentRef(),0,0.0,0));\n          opencount++;\n       }\n    }\n    int depthlevel = 0;\n    auto binIter = bins.begin();\n    int currentbin = 0;\n    while (opencount) {\n       while (binIter->empty()) {\n          depthlevel++;\n          binIter++;\n          currentbin++;\n          if (binIter == bins.end()) {\n             binIter = bins.begin();\n          }\n       }\n       SegmentData lineindex;\n       if (binIter->size() > 1) {\n          // it is slightly slower to delete from an arbitrary place in the bin,\n          // but it is necessary to use random paths to even out the number of times through equal paths\n          int curr = pafrand() % binIter->size();\n          auto currIter = binIter->begin() + curr;\n          lineindex = *currIter;\n          binIter->erase(currIter);\n          // note: do not clear choice values here!\n       }\n       else {\n          lineindex = binIter->front();\n          binIter->pop_back();\n       }\n       opencount--;\n       if (!covered[lineindex.ref]) {\n          covered[lineindex.ref] = true;\n          Connector& line = map.getConnections()[lineindex.ref];\n          // convert depth from tulip_bins normalised to standard angle\n          // (note the -1)\n          double depth_to_line = depthlevel / ((tulip_bins - 1) * 0.5);\n          map.getAttributeRowFromShapeIndex(lineindex.ref).setValue(stepdepth_col,depth_to_line);\n          int extradepth;\n          if (lineindex.dir != -1) {\n             for (auto& segconn: line.m_forward_segconns) {\n                if (!covered[segconn.first.ref]) {\n                   extradepth = (int) floor(segconn.second * tulip_bins * 0.5);\n                   bins[(currentbin + tulip_bins + extradepth) % tulip_bins].push_back(\n                       SegmentData(segconn.first,lineindex.ref,lineindex.segdepth+1,0.0,0));\n                   opencount++;\n                }\n             }\n          }\n          if (lineindex.dir != 1) {\n             for (auto& segconn: line.m_back_segconns) {\n                if (!covered[segconn.first.ref]) {\n                   extradepth = (int) floor(segconn.second * tulip_bins * 0.5);\n                   bins[(currentbin + tulip_bins + extradepth) % tulip_bins].push_back(\n                       SegmentData(segconn.first,lineindex.ref,lineindex.segdepth+1,0.0,0));\n                   opencount++;\n                 }\n             }\n          }\n       }\n    }\n\n    map.setDisplayedAttribute(-2); // <- override if it's already showing\n    map.setDisplayedAttribute(stepdepth_col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/segmmodules/segmtulipdepth.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/isegment.h\"\n\nclass SegmentTulipDepth : ISegment\n{\npublic:\n    std::string getAnalysisName() const override {\n        return \"Tulip Analysis\";\n    }\n    bool run(Communicator *, ShapeGraph &map, bool) override;\n};\n"
  },
  {
    "path": "salalib/shapemap.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n#include \"salalib/shapemap.h\"\r\n#include \"salalib/attributetable.h\"\r\n#include \"salalib/attributetablehelpers.h\"\r\n#include \"salalib/mgraph.h\"              // purely for the version info --- as phased out should replace\r\n#include \"salalib/parsers/mapinfodata.h\" // for mapinfo interface\r\n\r\n#include \"genlib/comm.h\" // for communicator\r\n#include \"genlib/containerutils.h\"\r\n#include \"genlib/exceptions.h\"\r\n#include \"genlib/stringutils.h\"\r\n\r\n#include <float.h>\r\n#include <math.h>\r\n#include <numeric>\r\n#include <stdexcept>\r\n#include <time.h>\r\n#include <unordered_map>\r\n#include <unordered_set>\r\n\r\n#ifndef _WIN32\r\n#define _finite finite\r\n#endif\r\n\r\nstatic const double TOLERANCE_A = 1e-9;\r\n\r\n// import TOLERANCE_B from axial map...\r\nstatic const double TOLERANCE_B = 1e-12;\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool SalaShape::read(std::istream &stream) {\r\n    // defaults\r\n    m_draworder = -1;\r\n    m_selected = false;\r\n\r\n    stream.read((char *)&m_type, sizeof(m_type));\r\n\r\n    stream.read((char *)&m_region, sizeof(m_region));\r\n\r\n    stream.read((char *)&m_centroid, sizeof(m_centroid));\r\n\r\n    stream.read((char *)&m_area, sizeof(m_area));\r\n    stream.read((char *)&m_perimeter, sizeof(m_perimeter));\r\n\r\n    dXreadwrite::readIntoVector(stream, m_points);\r\n\r\n    return true;\r\n}\r\n\r\nbool SalaShape::write(std::ofstream &stream) {\r\n    stream.write((char *)&m_type, sizeof(m_type));\r\n    stream.write((char *)&m_region, sizeof(m_region));\r\n    stream.write((char *)&m_centroid, sizeof(m_centroid));\r\n    stream.write((char *)&m_area, sizeof(m_area));\r\n    stream.write((char *)&m_perimeter, sizeof(m_perimeter));\r\n    dXreadwrite::writeVector(stream, m_points);\r\n    return true;\r\n}\r\n\r\nvoid SalaShape::setCentroidAreaPerim() {\r\n    m_area = 0.0;\r\n    m_perimeter = 0.0;\r\n    m_centroid = Point2f(0, 0);\r\n    for (size_t i = 0; i < m_points.size(); i++) {\r\n        Point2f &p1 = m_points[i];\r\n        Point2f &p2 = m_points[(i + 1) % m_points.size()];\r\n        double a_i = (p1.x * p2.y - p2.x * p1.y) / 2.0;\r\n        m_area += a_i;\r\n        a_i /= 6.0;\r\n        m_centroid.x += (p1.x + p2.x) * a_i;\r\n        m_centroid.y += (p1.y + p2.y) * a_i;\r\n        Point2f side = p2 - p1;\r\n        m_perimeter += side.length();\r\n    }\r\n    m_type &= ~SHAPE_CCW;\r\n    if (sgn(m_area) == 1) {\r\n        m_type |= SHAPE_CCW;\r\n    }\r\n    m_centroid.scale(2.0 / m_area); // note, *not* fabs(m_area) as it is then confused by clockwise ordered shapes\r\n    m_area = fabs(m_area);\r\n    if (isOpen()) {\r\n        // take off the automatically collected final side\r\n        Point2f side = m_points.back() - m_points.front();\r\n        m_perimeter -= side.length();\r\n    }\r\n}\r\n\r\n// allows override of the above (used for isovists)\r\nvoid SalaShape::setCentroid(const Point2f &p) { m_centroid = p; }\r\n\r\n// get the angular deviation along the length of a poly line:\r\ndouble SalaShape::getAngDev() const {\r\n    double dev = 0.0;\r\n    for (size_t i = 1; i < m_points.size() - 1; i++) {\r\n        double ang = angle(m_points[i - 1], m_points[i], m_points[i + 1]);\r\n\r\n        // Quick mod - TV\r\n#if defined(_MSC_VER)\r\n        dev += abs(M_PI - ang);\r\n#else\r\n        (M_PI - ang) < 0.0 ? dev += (ang - M_PI) : dev += (M_PI - ang);\r\n#endif\r\n    }\r\n    // convert to Iida Hillier units (0 to 2):\r\n    dev /= M_PI * 0.5;\r\n    return dev;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// the replacement for datalayers\r\n\r\nShapeMap::ShapeMap(const std::string &name, int type)\r\n    : m_pixel_shapes(0, 0), m_attributes(new AttributeTable()),\r\n      m_attribHandle(new AttributeTableHandle(*m_attributes)) {\r\n    m_name = name;\r\n    m_map_type = type;\r\n    m_hasgraph = false;\r\n\r\n    // shape and object counters\r\n    m_obj_ref = -1;\r\n    // -1 is the shape ref column (which will be shown by default)\r\n    m_displayed_attribute = -1;\r\n    m_invalidate = false;\r\n    // for polygons:\r\n    m_show_lines = true;\r\n    m_show_fill = true;\r\n    m_show_centroids = false;\r\n\r\n    // data (MUST be set before use)\r\n    m_tolerance = 0.0;\r\n\r\n    // note show is\r\n    m_show = true;\r\n    m_editable = false;\r\n\r\n    m_bsp_tree = false;\r\n    m_bsp_root = NULL;\r\n    //\r\n    m_hasMapInfoData = false;\r\n}\r\n\r\nShapeMap::~ShapeMap() {\r\n    if (m_bsp_root) {\r\n        delete m_bsp_root;\r\n        m_bsp_root = NULL;\r\n    }\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// this can be reinit as well\r\n\r\nvoid ShapeMap::init(int size, const QtRegion &r) {\r\n    m_display_shapes.clear();\r\n    m_rows = __min(__max(20, (int)sqrt((double)size)), 32768);\r\n    m_cols = __min(__max(20, (int)sqrt((double)size)), 32768);\r\n    if (m_region.atZero()) {\r\n        m_region = r;\r\n    } else {\r\n        m_region = runion(m_region, r);\r\n    }\r\n    // calculate geom data:\r\n    m_tolerance = __max(m_region.width(), m_region.height()) * TOLERANCE_A;\r\n    //\r\n    m_pixel_shapes = depthmapX::ColumnMatrix<std::vector<ShapeRef>>(m_rows, m_cols);\r\n}\r\n\r\n// this makes an exact copy, keep the reference numbers and so on:\r\n\r\nvoid ShapeMap::copy(const ShapeMap &sourcemap, int copyflags) {\r\n    if ((copyflags & ShapeMap::COPY_GEOMETRY) == ShapeMap::COPY_GEOMETRY) {\r\n        m_shapes.clear();\r\n        init(sourcemap.m_shapes.size(), sourcemap.m_region);\r\n        for (auto shape : sourcemap.m_shapes) {\r\n            // using makeShape is actually easier than thinking about a total copy:\r\n            makeShape(shape.second, shape.first);\r\n            // note that addShape automatically adds the attribute row\r\n        }\r\n    }\r\n\r\n    if ((copyflags & ShapeMap::COPY_ATTRIBUTES) == ShapeMap::COPY_ATTRIBUTES) {\r\n        // assumes attribute rows are filled in already\r\n\r\n        // TODO: Compatibility. The columns are sorted in the old implementation so\r\n        // they are also passed sorted in the conversion:\r\n\r\n        std::vector<size_t> indices(sourcemap.m_attributes->getNumColumns());\r\n        std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\r\n\r\n        std::sort(indices.begin(), indices.end(), [&](size_t a, size_t b) {\r\n            return sourcemap.m_attributes->getColumnName(a) < sourcemap.m_attributes->getColumnName(b);\r\n        });\r\n\r\n        for (int idx : indices) {\r\n            int outcol = m_attributes->insertOrResetColumn(sourcemap.m_attributes->getColumnName(idx));\r\n            // n.b. outcol not necessarily the same as incol, although row position in table (j) should match\r\n\r\n            auto targetIter = m_attributes->begin();\r\n            for (auto sourceIter = sourcemap.m_attributes->begin(); sourceIter != sourcemap.m_attributes->end();\r\n                 sourceIter++) {\r\n                targetIter->getRow().setValue(outcol, sourceIter->getRow().getValue(idx));\r\n                targetIter++;\r\n            }\r\n        }\r\n    }\r\n\r\n    if ((copyflags & ShapeMap::COPY_ATTRIBUTES) == ShapeMap::COPY_GRAPH) {\r\n        if (sourcemap.m_hasgraph) {\r\n            m_hasgraph = true;\r\n            // straight copy:\r\n            m_connectors = sourcemap.m_connectors;\r\n            m_links = sourcemap.m_links;\r\n            m_unlinks = sourcemap.m_unlinks;\r\n        }\r\n    }\r\n\r\n    // copies mapinfodata (projection data) regardless of copy flags\r\n    if (sourcemap.hasMapInfoData()) {\r\n        m_mapinfodata = MapInfoData();\r\n        m_mapinfodata.m_coordsys = sourcemap.getMapInfoData().m_coordsys;\r\n        m_mapinfodata.m_bounds = sourcemap.getMapInfoData().m_bounds;\r\n        m_hasMapInfoData = true;\r\n    }\r\n}\r\n\r\n// Zaps all memory structures, apart from mapinfodata\r\nvoid ShapeMap::clearAll() {\r\n    if (m_bsp_root) {\r\n        delete m_bsp_root;\r\n        m_bsp_root = NULL;\r\n    }\r\n    m_display_shapes.clear();\r\n\r\n    m_shapes.clear();\r\n    m_undobuffer.clear();\r\n    m_connectors.clear();\r\n    m_attributes->clear();\r\n    m_links.clear();\r\n    m_unlinks.clear();\r\n    m_region = QtRegion();\r\n\r\n    m_obj_ref = -1;\r\n    m_displayed_attribute = -1;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nint ShapeMap::makePointShapeWithRef(const Point2f &point, int shape_ref, bool tempshape,\r\n                                    const std::map<int, float> &extraAttributes) {\r\n    bool bounds_good = true;\r\n\r\n    if (!m_region.contains_touch(point)) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), QtRegion(point, point));\r\n    }\r\n\r\n    m_shapes.insert(std::make_pair(shape_ref, SalaShape(point)));\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    if (!tempshape) {\r\n        auto &row = m_attributes->addRow(AttributeKey(shape_ref));\r\n        for (auto &attr : extraAttributes) {\r\n            row.setValue(attr.first, attr.second);\r\n        }\r\n        m_newshape = true;\r\n    }\r\n\r\n    return shape_ref;\r\n}\r\n\r\nint ShapeMap::makePointShape(const Point2f &point, bool tempshape, const std::map<int, float> &extraAttributes) {\r\n    return makePointShapeWithRef(point, getNextShapeKey(), tempshape, extraAttributes);\r\n}\r\n\r\nint ShapeMap::makeLineShapeWithRef(const Line &line, int shape_ref, bool through_ui, bool tempshape,\r\n                                   const std::map<int, float> &extraAttributes) {\r\n    // note, map must have editable flag on if we are to make a shape through the user interface:\r\n    if (through_ui && !m_editable) {\r\n        return -1;\r\n    }\r\n\r\n    bool bounds_good = true;\r\n\r\n    if (!(m_region.contains_touch(line.start()) && m_region.contains_touch(line.end()))) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), line);\r\n    }\r\n\r\n    // note, shape constructor sets centroid, length etc\r\n    m_shapes.insert(std::make_pair(shape_ref, SalaShape(line)));\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    if (!tempshape) {\r\n        auto &row = m_attributes->addRow(AttributeKey(shape_ref));\r\n        for (auto &attr : extraAttributes) {\r\n            row.setValue(attr.first, attr.second);\r\n        }\r\n        m_newshape = true;\r\n    }\r\n\r\n    if (through_ui) {\r\n        // manually add connections:\r\n        if (m_hasgraph) {\r\n            int rowid = depthmapX::findIndexFromKey(m_shapes, shape_ref);\r\n            if (isAxialMap()) {\r\n                connectIntersected(rowid, true); // \"true\" means line-line intersections only will be applied\r\n            } else {\r\n                connectIntersected(rowid, false);\r\n            }\r\n        }\r\n        // if through ui, set undo counter:\r\n        m_undobuffer.push_back(SalaEvent(SalaEvent::SALA_CREATED, shape_ref));\r\n        // update displayed attribute if through ui:\r\n        invalidateDisplayedAttribute();\r\n        setDisplayedAttribute(m_displayed_attribute);\r\n    }\r\n\r\n    return shape_ref;\r\n}\r\n\r\nint ShapeMap::getNextShapeKey() {\r\n    if (m_shapes.size() == 0)\r\n        return 0;\r\n    return m_shapes.rbegin()->first + 1;\r\n}\r\n\r\nint ShapeMap::makeLineShape(const Line &line, bool through_ui, bool tempshape,\r\n                            const std::map<int, float> &extraAttributes) {\r\n    return makeLineShapeWithRef(line, getNextShapeKey(), through_ui, tempshape, extraAttributes);\r\n}\r\n\r\nint ShapeMap::makePolyShapeWithRef(const std::vector<Point2f> &points, bool open, int shape_ref, bool tempshape,\r\n                                   const std::map<int, float> &extraAttributes) {\r\n    bool bounds_good = true;\r\n\r\n    switch (points.size()) {\r\n    case 0:\r\n        return -1;\r\n    case 1:\r\n        return makePointShapeWithRef(points[0], shape_ref, tempshape);\r\n    case 2:\r\n        return makeLineShapeWithRef(Line(points[0], points[1]), shape_ref, false,\r\n                                    tempshape); // false is not through ui: there really should be a through ui here?\r\n    }\r\n\r\n    QtRegion region(points[0], points[0]);\r\n    size_t i;\r\n    for (i = 1; i < points.size(); i++) {\r\n        region.encompass(points[i]);\r\n    }\r\n    if (!m_region.contains_touch(region.bottom_left) || !m_region.contains_touch(region.top_right)) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), region);\r\n    }\r\n\r\n    size_t len = points.size();\r\n    // NOTE: This is commented out deliberately\r\n    // Sometimes you really do want a polyline that forms a loop\r\n    /*\r\n    if (points.head() == points.tail()) {\r\n       len--;\r\n       open = false;\r\n    }\r\n    */\r\n\r\n    // not sure if it matters if the polygon is clockwise or anticlockwise... we'll soon tell!\r\n\r\n    if (open) {\r\n        m_shapes.insert(std::make_pair(shape_ref, SalaShape(SalaShape::SHAPE_POLY)));\r\n    } else {\r\n        m_shapes.insert(std::make_pair(shape_ref, SalaShape(SalaShape::SHAPE_POLY | SalaShape::SHAPE_CLOSED)));\r\n    }\r\n    for (i = 0; i < len; i++) {\r\n        m_shapes.rbegin()->second.m_points.push_back(points[i]);\r\n    }\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    if (!tempshape) {\r\n        // set centroid now also adds a few other things: as well as area, perimeter\r\n        m_shapes.rbegin()->second.setCentroidAreaPerim();\r\n\r\n        auto &row = m_attributes->addRow(AttributeKey(shape_ref));\r\n        for (auto &attr : extraAttributes) {\r\n            row.setValue(attr.first, attr.second);\r\n        }\r\n        m_newshape = true;\r\n    }\r\n\r\n    return shape_ref;\r\n}\r\n\r\nint ShapeMap::makePolyShape(const std::vector<Point2f> &points, bool open, bool tempshape,\r\n                            const std::map<int, float> &extraAttributes) {\r\n    return makePolyShapeWithRef(points, open, getNextShapeKey(), tempshape, extraAttributes);\r\n}\r\n\r\nint ShapeMap::makeShape(const SalaShape &poly, int override_shape_ref, const std::map<int, float> &extraAttributes) {\r\n    // overridden shape cannot exist:\r\n    if (override_shape_ref != -1 && m_shapes.find(override_shape_ref) != m_shapes.end()) {\r\n        return -1; // failure!\r\n    }\r\n\r\n    bool bounds_good = true;\r\n\r\n    if (!m_region.contains_touch(poly.m_region.bottom_left) || !m_region.contains_touch(poly.m_region.top_right)) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), poly.m_region);\r\n    }\r\n\r\n    int shape_ref;\r\n    if (override_shape_ref == -1) {\r\n        shape_ref = getNextShapeKey();\r\n    } else {\r\n        shape_ref = override_shape_ref;\r\n    }\r\n\r\n    m_shapes.insert(std::make_pair(shape_ref, poly));\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    auto &row = m_attributes->addRow(AttributeKey(shape_ref));\r\n    for (auto &attr : extraAttributes) {\r\n        row.setValue(attr.first, attr.second);\r\n    }\r\n\r\n    m_newshape = true;\r\n\r\n    return shape_ref;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// n.b., only works from current selection (and uses point selected attribute)\r\n\r\nint ShapeMap::makeShapeFromPointSet(const PointMap &pointmap) {\r\n    bool bounds_good = true;\r\n    PixelRefVector selset;\r\n    Point2f offset = Point2f(pointmap.getSpacing() / 2, pointmap.getSpacing() / 2);\r\n    for (auto &sel : pointmap.getSelSet()) {\r\n        selset.push_back(sel);\r\n        if (!m_region.contains_touch(pointmap.depixelate(sel) - offset) ||\r\n            !m_region.contains_touch(pointmap.depixelate(sel) + offset)) {\r\n            bounds_good = false;\r\n        }\r\n    }\r\n    if (!bounds_good) {\r\n        QtRegion r(pointmap.getRegion().bottom_left - offset, pointmap.getRegion().top_right + offset);\r\n        init(m_shapes.size(), r);\r\n    }\r\n    std::map<int, int> relations;\r\n    for (size_t j = 0; j < selset.size(); j++) {\r\n        PixelRef pix = selset[j];\r\n        auto relation = relations.insert(std::make_pair(pix, ShapeRef::SHAPE_EDGE));\r\n        if (pointmap.includes(pix.right()) && pointmap.getPoint(pix.right()).selected()) {\r\n            relation.first->second &= ~ShapeRef::SHAPE_R;\r\n        }\r\n        if (pointmap.includes(pix.up()) && pointmap.getPoint(pix.up()).selected()) {\r\n            relation.first->second &= ~ShapeRef::SHAPE_T;\r\n        }\r\n        if (pointmap.includes(pix.down()) && pointmap.getPoint(pix.down()).selected()) {\r\n            relation.first->second &= ~ShapeRef::SHAPE_B;\r\n        }\r\n        if (pointmap.includes(pix.left()) && pointmap.getPoint(pix.left()).selected()) {\r\n            relation.first->second &= ~ShapeRef::SHAPE_L;\r\n        }\r\n    }\r\n    // now find pixel with SHAPE_B | SHAPE_L\r\n    PixelRef minpix = NoPixel;\r\n\r\n    for (auto &relation : relations) {\r\n        if ((relation.second & (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) == (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) {\r\n            if ((minpix == NoPixel) || (relation.first < (int)minpix)) {\r\n                minpix = relation.first;\r\n            }\r\n        }\r\n    }\r\n    // now follow round anticlockwise...\r\n    SalaShape poly(SalaShape::SHAPE_POLY | SalaShape::SHAPE_CLOSED);\r\n    pointPixelBorder(pointmap, relations, poly, ShapeRef::SHAPE_L, minpix, minpix, true);\r\n\r\n    for (auto relation : relations) {\r\n        if (relation.second != 0) {\r\n            // more than one shape!\r\n            return -1;\r\n        }\r\n    }\r\n    poly.setCentroidAreaPerim();\r\n\r\n    int new_shape_ref = getNextShapeKey();\r\n    m_shapes.insert(std::make_pair(new_shape_ref, poly));\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(new_shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    m_attributes->addRow(AttributeKey(new_shape_ref));\r\n    m_newshape = true;\r\n\r\n    return new_shape_ref;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::convertPointsToPolys(double poly_radius, bool selected_only) {\r\n    // I'm not sure quite how easy this will be...\r\n    QtRegion region;\r\n\r\n    bool done_something = false;\r\n\r\n    // replace the points with polys\r\n    for (auto shape : m_shapes) {\r\n        if (selected_only && !m_attributes->getRow(AttributeKey(shape.first)).isSelected()) {\r\n            continue;\r\n        }\r\n        if (shape.second.isPoint()) {\r\n            done_something = true;\r\n            // remove old spatial index\r\n            removePolyPixels(shape.first);\r\n            // construct a poly from the point:\r\n            Point2f p = shape.second.getCentroid();\r\n            //\r\n            if (region.atZero()) {\r\n                region = QtRegion(p, p);\r\n            }\r\n            // replace with a polygon:\r\n            shape.second = SalaShape(SalaShape::SHAPE_POLY | SalaShape::SHAPE_CLOSED);\r\n            for (int k = 0; k < 8; k++) {\r\n                Point2f poly_p;\r\n                if (k == 0) {\r\n                    poly_p.x = p.x + poly_radius;\r\n                    poly_p.y = p.y;\r\n                } else if (k == 1) {\r\n                    poly_p.x = p.x + poly_radius * M_ROOT_1_2;\r\n                    poly_p.y = p.y + poly_radius * M_ROOT_1_2;\r\n                } else if (k == 2) {\r\n                    poly_p.x = p.x;\r\n                    poly_p.y = p.y + poly_radius;\r\n                } else if (k == 3) {\r\n                    poly_p.x = p.x - poly_radius * M_ROOT_1_2;\r\n                    poly_p.y = p.y + poly_radius * M_ROOT_1_2;\r\n                } else if (k == 4) {\r\n                    poly_p.x = p.x - poly_radius;\r\n                    poly_p.y = p.y;\r\n                } else if (k == 5) {\r\n                    poly_p.x = p.x - poly_radius * M_ROOT_1_2;\r\n                    poly_p.y = p.y - poly_radius * M_ROOT_1_2;\r\n                } else if (k == 6) {\r\n                    poly_p.x = p.x;\r\n                    poly_p.y = p.y - poly_radius;\r\n                } else if (k == 7) {\r\n                    poly_p.x = p.x + poly_radius * M_ROOT_1_2;\r\n                    poly_p.y = p.y - poly_radius * M_ROOT_1_2;\r\n                }\r\n                region.encompass(poly_p);\r\n                shape.second.m_points.push_back(poly_p);\r\n            }\r\n            shape.second.setCentroidAreaPerim();\r\n        }\r\n    }\r\n\r\n    if (done_something) {\r\n        // spatially reindex (simplest just to redo everything)\r\n        init(m_shapes.size(), region);\r\n\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::moveShape(int shaperef, const Line &line, bool undoing) {\r\n    bool bounds_good = true;\r\n\r\n    auto shapeIter = m_shapes.find(shaperef);\r\n    if (shapeIter == m_shapes.end()) {\r\n        return false;\r\n    }\r\n\r\n    // remove shape from the pixel grid\r\n    removePolyPixels(shaperef); // done first, as all interface references use this list\r\n\r\n    if (!undoing) {\r\n        // set undo counter, but only if this is not an undo itself:\r\n        m_undobuffer.push_back(SalaEvent(SalaEvent::SALA_MOVED, shaperef));\r\n        m_undobuffer.back().m_geometry = shapeIter->second;\r\n        m_undobuffer.back().m_geometry.m_selected =\r\n            false; // <- this m_selected really shouldn't be used -- should use attributes, but for some reason it is!\r\n    }\r\n\r\n    if (!(m_region.contains_touch(line.start()) && m_region.contains_touch(line.end()))) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), line);\r\n    }\r\n\r\n    shapeIter->second = SalaShape(line);\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(shaperef);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    int rowid = std::distance(m_shapes.begin(), shapeIter);\r\n    AttributeRow &row = m_attributes->getRow(AttributeKey(shapeIter->first));\r\n    // change connections:\r\n    if (m_hasgraph) {\r\n        //\r\n        const std::vector<int> oldconnections = m_connectors[size_t(rowid)].m_connections;\r\n        //\r\n        int conn_col = m_attributes->getOrInsertLockedColumn(\"Connectivity\");\r\n        int leng_col = -1;\r\n        //\r\n        if (isAxialMap()) {\r\n            // line connections optimised for line-line intersection\r\n            m_connectors[size_t(rowid)].m_connections =\r\n                getLineConnections(shaperef, TOLERANCE_B * __max(m_region.height(), m_region.width()));\r\n        } else {\r\n            m_connectors[size_t(rowid)].m_connections =\r\n                getShapeConnections(shaperef, TOLERANCE_B * __max(m_region.height(), m_region.width()));\r\n        }\r\n\r\n        std::vector<int> &newconnections = m_connectors[size_t(rowid)].m_connections;\r\n        row.setValue(conn_col, float(newconnections.size()));\r\n        if (isAxialMap()) {\r\n            leng_col = m_attributes->getOrInsertLockedColumn(\"Line Length\");\r\n            row.setValue(leng_col, (float)depthmapX::getMapAtIndex(m_shapes, rowid)->second.getLength());\r\n        }\r\n        //\r\n        // now go through our old connections, and remove ourself:\r\n        for (int oldconnection : oldconnections) {\r\n            if (oldconnection != rowid) { // <- exclude self!\r\n                auto &connections = m_connectors[size_t(oldconnection)].m_connections;\r\n                depthmapX::findAndErase(connections, rowid);\r\n                auto &oldConnectionRow = getAttributeRowFromShapeIndex(oldconnection);\r\n                oldConnectionRow.incrValue(conn_col, -1.0f);\r\n            }\r\n        }\r\n        // now go through our new connections, and add ourself:\r\n        for (int newconnection : m_connectors[size_t(rowid)].m_connections) {\r\n            if (newconnection != rowid) { // <- exclude self!\r\n                depthmapX::insert_sorted(m_connectors[size_t(newconnection)].m_connections, rowid);\r\n                auto &newConnectionRow = getAttributeRowFromShapeIndex(newconnection);\r\n                newConnectionRow.incrValue(conn_col);\r\n            }\r\n        }\r\n        // now check any unlinks still exist in our newconnections are unlinked again (argh...)\r\n        for (auto revIter = m_unlinks.rbegin(); revIter != m_unlinks.rend(); ++revIter) {\r\n            int connb = -1;\r\n            if (revIter->a == rowid)\r\n                connb = revIter->b;\r\n            else if (revIter->b == rowid)\r\n                connb = revIter->a;\r\n            if (connb != -1) {\r\n                if (std::find(newconnections.begin(), newconnections.end(), connb) == newconnections.end()) {\r\n                    // no longer required:\r\n                    m_unlinks.erase(std::next(revIter).base());\r\n                } else {\r\n                    // enforce:\r\n                    depthmapX::findAndErase(newconnections, connb);\r\n                    depthmapX::findAndErase(m_connectors[size_t(connb)].m_connections, rowid);\r\n                    auto &connbRow = getAttributeRowFromShapeIndex(connb);\r\n                    connbRow.incrValue(conn_col, -1.0f);\r\n                    row.incrValue(conn_col, -1.0f);\r\n                }\r\n            }\r\n        }\r\n        // now check any links are actually required (argh...)\r\n        for (auto revIter = m_links.rbegin(); revIter != m_links.rend(); ++revIter) {\r\n            int connb = -1;\r\n            if (revIter->a == rowid)\r\n                connb = revIter->b;\r\n            else if (revIter->b == rowid)\r\n                connb = revIter->a;\r\n            if (connb != -1) {\r\n                if (std::find(newconnections.begin(), newconnections.end(), connb) != newconnections.end()) {\r\n                    // no longer required:\r\n                    m_links.erase(std::next(revIter).base());\r\n                } else {\r\n                    // enforce:\r\n                    depthmapX::insert_sorted(newconnections, connb);\r\n                    depthmapX::insert_sorted(m_connectors[size_t(connb)].m_connections, rowid);\r\n                    auto &connbRow = getAttributeRowFromShapeIndex(connb);\r\n                    connbRow.incrValue(conn_col);\r\n                    row.incrValue(conn_col);\r\n                }\r\n            }\r\n        }\r\n        // update displayed attribute for any changes:\r\n        invalidateDisplayedAttribute();\r\n        setDisplayedAttribute(m_displayed_attribute);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// some functions to make a polygon from the UI\r\n\r\nint ShapeMap::polyBegin(const Line &line) {\r\n    // add geometry\r\n    bool bounds_good = true;\r\n    if (!(m_region.contains_touch(line.start()) && m_region.contains_touch(line.end()))) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), line);\r\n    }\r\n\r\n    int new_shape_ref = getNextShapeKey();\r\n    m_shapes.insert(std::make_pair(new_shape_ref, SalaShape(line)));\r\n    m_shapes.rbegin()->second.m_centroid = line.getCentre();\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(new_shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    // insert into attributes\r\n    m_attributes->addRow(AttributeKey(new_shape_ref));\r\n    // would usually set attributes here, but actually, really want\r\n    // to set the attributes only when the user completes the drawing\r\n\r\n    // change connections:\r\n    if (m_hasgraph) {\r\n        // dummy for now to ensure there is a row in the connector table\r\n        // so all indices match...\r\n        m_connectors.push_back(Connector());\r\n    }\r\n\r\n    // flag new shape\r\n    m_newshape = true;\r\n\r\n    // set undo counter:\r\n    m_undobuffer.push_back(SalaEvent(SalaEvent::SALA_CREATED, new_shape_ref));\r\n\r\n    // update displayed attribute\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(m_displayed_attribute);\r\n\r\n    return new_shape_ref;\r\n}\r\n\r\nbool ShapeMap::polyAppend(int shape_ref, const Point2f &point) {\r\n    // don't do anything too complex:\r\n    SalaShape &shape = m_shapes.rbegin()->second;\r\n\r\n    // check you can actually do this first\r\n    if (!(shape.isLine() || shape.isPolyLine())) {\r\n        return false;\r\n    }\r\n\r\n    // junk the old shape pixels:\r\n    removePolyPixels(shape_ref);\r\n\r\n    bool bounds_good = true;\r\n    if (!m_region.contains_touch(point)) {\r\n        bounds_good = false;\r\n        init(m_shapes.size(), QtRegion(point, point));\r\n    }\r\n\r\n    if (shape.m_type == SalaShape::SHAPE_LINE) {\r\n        // convert it to a poly line:\r\n        shape.m_type = SalaShape::SHAPE_POLY;\r\n        shape.m_points.push_back(shape.m_region.t_start());\r\n        shape.m_points.push_back(shape.m_region.t_end());\r\n    }\r\n    // add new point:\r\n    shape.m_points.push_back(point);\r\n\r\n    if (bounds_good) {\r\n        // note: also sets polygon bounding box:\r\n        makePolyPixels(shape_ref);\r\n    } else {\r\n        // pixelate all polys in the pixel new structure:\r\n        for (auto shape : m_shapes) {\r\n            makePolyPixels(shape.first);\r\n        }\r\n    }\r\n\r\n    shape.setCentroidAreaPerim();\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::polyClose(int shape_ref) {\r\n    // don't do anything too complex:\r\n    SalaShape &shape = m_shapes.rbegin()->second;\r\n\r\n    // check you can actually do this first\r\n    if (!shape.isPolyLine()) {\r\n        return false;\r\n    }\r\n\r\n    // junk the old shape pixels:\r\n    removePolyPixels(shape_ref);\r\n\r\n    shape.m_type |= SalaShape::SHAPE_CLOSED;\r\n\r\n    makePolyPixels(shape_ref);\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::polyCancel(int shape_ref) {\r\n    // don't do anything too complex:\r\n    SalaShape &shape = m_shapes.rbegin()->second;\r\n\r\n    // check you can actually do this first\r\n    if (!(shape.isLine() || shape.isPolyLine())) {\r\n        return false;\r\n    }\r\n\r\n    m_undobuffer.pop_back();\r\n    removeShape(shape_ref, true);\r\n\r\n    // update displayed attribute\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(m_displayed_attribute);\r\n\r\n    return true;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::removeSelected() {\r\n    // note, map must have editable flag on if we are to remove shape:\r\n    if (!m_editable) {\r\n        return false;\r\n    }\r\n\r\n    // pray that the selection set is in order!\r\n    // (it should be: code currently uses add() throughout)\r\n    for (auto &shapeRef : m_selection_set) {\r\n        removeShape(shapeRef);\r\n    }\r\n    m_selection_set.clear();\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(m_displayed_attribute);\r\n    return true;\r\n}\r\n\r\nvoid ShapeMap::removeShape(int shaperef, bool undoing) {\r\n    // remove shape from four keys: the pixel grid, the poly list, the attributes and the connections\r\n    removePolyPixels(shaperef); // done first, as all interface references use this list\r\n\r\n    auto shapeIter = m_shapes.find(shaperef);\r\n    size_t rowid = std::distance(m_shapes.begin(), shapeIter);\r\n\r\n    if (!undoing) { // <- if not currently undoing another event, then add to the undo buffer:\r\n        m_undobuffer.push_back(SalaEvent(SalaEvent::SALA_DELETED, shaperef));\r\n        m_undobuffer.back().m_geometry = shapeIter->second;\r\n        m_undobuffer.back().m_geometry.m_selected =\r\n            false; // <- this m_selected really shouldn't be used -- should use attributes, but for some reason it is!\r\n    }\r\n\r\n    if (m_hasgraph) {\r\n        // note that the connections have no key for speed when processing,\r\n        // we rely on the index order matching the index order of the shapes\r\n        // and the attributes, and simply change all references (ick!)\r\n        int conn_col = m_attributes->getColumnIndex(\"Connectivity\");\r\n\r\n        // TODO: Replace with iterators\r\n        for (size_t i = m_connectors.size() - 1; static_cast<int>(i) != -1; i--) {\r\n            if (i == rowid) {\r\n                continue; // it's going to be removed anyway\r\n            }\r\n            for (size_t j = m_connectors[i].m_connections.size() - 1; static_cast<int>(j) != -1; j--) {\r\n                if (m_connectors[i].m_connections[j] == int(rowid)) {\r\n                    m_connectors[i].m_connections.erase(m_connectors[i].m_connections.begin() + int(j));\r\n                    if (conn_col != -1) {\r\n                        auto &row = getAttributeRowFromShapeIndex(i);\r\n                        row.incrValue(conn_col, -1.0f);\r\n                    }\r\n                } else if (m_connectors[i].m_connections[j] > int(rowid)) {\r\n                    m_connectors[i].m_connections[j] -= 1;\r\n                }\r\n            }\r\n            // note, you cannot delete from a segment map, it's just too messy!\r\n        }\r\n\r\n        m_connectors.erase(m_connectors.begin() + int(rowid));\r\n\r\n        // take out explicit links and unlinks (note, undo won't restore these):\r\n        for (auto revIter = m_links.rbegin(); revIter != m_links.rend(); ++revIter) {\r\n            if (revIter->a == static_cast<int>(rowid) || revIter->b == static_cast<int>(rowid)) {\r\n                m_links.erase(std::next(revIter).base());\r\n            } else {\r\n                if (revIter->a > int(rowid))\r\n                    revIter->a -= 1;\r\n                if (revIter->b > int(rowid))\r\n                    revIter->b -= 1;\r\n            }\r\n        }\r\n        for (auto revIter = m_unlinks.rbegin(); revIter != m_unlinks.rend(); ++revIter) {\r\n            if (revIter->a == static_cast<int>(rowid) || revIter->b == static_cast<int>(rowid)) {\r\n                m_unlinks.erase(std::next(revIter).base());\r\n            } else {\r\n                if (revIter->a > int(rowid))\r\n                    revIter->a -= 1;\r\n                if (revIter->b > int(rowid))\r\n                    revIter->b -= 1;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (shapeIter != m_shapes.end()) {\r\n        shapeIter = m_shapes.erase(shapeIter);\r\n    }\r\n    // n.b., shaperef should have been used to create the row in the first place:\r\n    const AttributeKey shapeRefKey(shaperef);\r\n    m_attributes->removeRow(shapeRefKey);\r\n\r\n    m_newshape = true;\r\n    m_invalidate = true;\r\n}\r\n\r\nvoid ShapeMap::undo() {\r\n    if (m_undobuffer.size() == 0) {\r\n        return;\r\n    }\r\n\r\n    SalaEvent &event = m_undobuffer.back();\r\n\r\n    if (event.m_action == SalaEvent::SALA_CREATED) {\r\n\r\n        removeShape(\r\n            event.m_shape_ref,\r\n            true); // <- note, must tell remove shape it's an undo, or it will add this remove to the undo stack!\r\n\r\n    } else if (event.m_action == SalaEvent::SALA_DELETED) {\r\n\r\n        makeShape(event.m_geometry, event.m_shape_ref);\r\n        int rowid = std::distance(m_shapes.begin(), m_shapes.find(event.m_shape_ref));\r\n        auto &row = m_attributes->getRow(AttributeKey(event.m_shape_ref));\r\n\r\n        if (rowid != -1 && m_hasgraph) {\r\n            // redo connections... n.b. TO DO this is intended to use the slower \"any connection\" method, so it can\r\n            // handle any sort of graph\r\n            // ...but that doesn't exist yet, so for the moment do lines:\r\n            //\r\n            // insert new connector at the row:\r\n            m_connectors[rowid] = Connector();\r\n            //\r\n            // now go through all connectors, ensuring they're reindexed above this one:\r\n            // Argh!  ...but, remember the reason we're doing this is for fast processing elsewhere\r\n            // -- this is a user triggered *undo*, they'll just have to wait:\r\n            for (size_t i = 0; i < m_connectors.size(); i++) {\r\n                for (size_t j = 0; j < m_connectors[i].m_connections.size(); j++) {\r\n                    if (m_connectors[i].m_connections[j] >= rowid) {\r\n                        m_connectors[i].m_connections[j] += 1;\r\n                    }\r\n                }\r\n            }\r\n            // it gets worse, the links and unlinks will also be all over the shop due to the inserted row:\r\n            size_t j;\r\n            for (j = 0; j < m_links.size(); j++) {\r\n                if (m_links[j].a >= rowid)\r\n                    m_links[j].a += 1;\r\n                if (m_links[j].b >= rowid)\r\n                    m_links[j].b += 1;\r\n            }\r\n            for (j = 0; j < m_unlinks.size(); j++) {\r\n                if (m_unlinks[j].a >= rowid)\r\n                    m_unlinks[j].a += 1;\r\n                if (m_unlinks[j].b >= rowid)\r\n                    m_unlinks[j].b += 1;\r\n            }\r\n            //\r\n            // calculate this line's connections\r\n            m_connectors[size_t(rowid)].m_connections =\r\n                getLineConnections(event.m_shape_ref, TOLERANCE_B * __max(m_region.height(), m_region.width()));\r\n            // update:\r\n            int conn_col = m_attributes->getOrInsertLockedColumn(\"Connectivity\");\r\n            row.setValue(conn_col, float(m_connectors[rowid].m_connections.size()));\r\n            //\r\n            if (event.m_geometry.isLine()) {\r\n                int leng_col = m_attributes->getOrInsertLockedColumn(\"Line Length\");\r\n                row.setValue(leng_col, (float)depthmapX::getMapAtIndex(m_shapes, rowid)->second.getLength());\r\n            }\r\n            //\r\n            // now go through our connections, and add ourself:\r\n            const std::vector<int> &connections = m_connectors[size_t(rowid)].m_connections;\r\n            for (int connection : connections) {\r\n                if (connection != rowid) { // <- exclude self!\r\n                    depthmapX::insert_sorted(m_connectors[size_t(connection)].m_connections, rowid);\r\n                    auto &row = getAttributeRowFromShapeIndex(connection);\r\n                    row.incrValue(conn_col);\r\n                }\r\n            }\r\n        }\r\n    } else if (event.m_action == SalaEvent::SALA_MOVED) {\r\n\r\n        moveShape(event.m_shape_ref, event.m_geometry.getLine(),\r\n                  true); // <- note, must tell remove shape it's an undo, or it will add this remove to the undo stack!\r\n    }\r\n\r\n    m_undobuffer.pop_back();\r\n\r\n    m_newshape = true;\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(m_displayed_attribute);\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid ShapeMap::makePolyPixels(int polyref) {\r\n    ShapeRef shapeRef = ShapeRef(polyref);\r\n    // first add into pixels, and ensure you have a bl, tr for the set (useful for testing later)\r\n    SalaShape &poly = m_shapes.find(polyref)->second;\r\n    if (poly.isClosed()) {\r\n        std::map<int, int> relations;\r\n        for (size_t k = 0; k < poly.m_points.size(); k++) {\r\n            int nextk = int((k + 1) % poly.m_points.size());\r\n            Line li(poly.m_points[k], poly.m_points[nextk]);\r\n            if (k == 0) {\r\n                poly.m_region = li;\r\n            } else {\r\n                poly.m_region = runion(poly.m_region, li);\r\n            }\r\n            PixelRefVector pixels = pixelateLine(li);\r\n            // debug\r\n            // int duplicate_shaperefs = 0;\r\n            // end debug\r\n            for (size_t i = 0; i < pixels.size(); i++) {\r\n                PixelRef pix = pixels[i];\r\n                std::vector<ShapeRef> &pixShapes =\r\n                    m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n                auto it = depthmapX::findBinary(pixShapes, shapeRef);\r\n                if (it == pixShapes.end()) {\r\n                    pixShapes.push_back(shapeRef);\r\n                    it = pixShapes.end() - 1;\r\n                }\r\n                it->m_polyrefs.push_back(k);\r\n                relations.insert(std::make_pair(pixels[i], ShapeRef::SHAPE_EDGE));\r\n            }\r\n        }\r\n        // erase joined sides, and look for min:\r\n        PixelRef minpix = NoPixel;\r\n        for (auto &relation : relations) {\r\n            PixelRef pix = relation.first;\r\n            PixelRef nextpix;\r\n            nextpix = pix.right();\r\n            if (includes(nextpix)) {\r\n                auto &pixShapes = m_pixel_shapes(static_cast<size_t>(nextpix.y), static_cast<size_t>(nextpix.x));\r\n                if (depthmapX::findBinary(pixShapes, shapeRef) != pixShapes.end()) {\r\n                    relation.second &= ~ShapeRef::SHAPE_R;\r\n                }\r\n            }\r\n            nextpix = pix.up();\r\n            if (includes(nextpix)) {\r\n                auto &pixShapes = m_pixel_shapes(static_cast<size_t>(nextpix.y), static_cast<size_t>(nextpix.x));\r\n                if (depthmapX::findBinary(pixShapes, shapeRef) != pixShapes.end()) {\r\n                    relation.second &= ~ShapeRef::SHAPE_T;\r\n                }\r\n            }\r\n            nextpix = pix.down();\r\n            if (includes(nextpix)) {\r\n                auto &pixShapes = m_pixel_shapes(static_cast<size_t>(nextpix.y), static_cast<size_t>(nextpix.x));\r\n                if (depthmapX::findBinary(pixShapes, shapeRef) != pixShapes.end()) {\r\n                    relation.second &= ~ShapeRef::SHAPE_B;\r\n                }\r\n            }\r\n            nextpix = pix.left();\r\n            if (includes(nextpix)) {\r\n                auto &pixShapes = m_pixel_shapes(static_cast<size_t>(nextpix.y), static_cast<size_t>(nextpix.x));\r\n                if (depthmapX::findBinary(pixShapes, shapeRef) != pixShapes.end()) {\r\n                    relation.second &= ~ShapeRef::SHAPE_L;\r\n                }\r\n            }\r\n            if ((relation.second & (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) ==\r\n                (ShapeRef::SHAPE_B | ShapeRef::SHAPE_L)) {\r\n                if ((minpix == NoPixel) || (relation.first < int(minpix))) {\r\n                    minpix = relation.first;\r\n                }\r\n            }\r\n        }\r\n        shapePixelBorder(relations, polyref, ShapeRef::SHAPE_L, minpix, minpix, true);\r\n        // go through any that aren't on the outer border: this will be internal edges, and will cause problems\r\n        // for point in polygon algorithms!\r\n\r\n        for (auto &relation : relations) {\r\n            PixelRef pix = relation.first;\r\n            std::vector<ShapeRef> &pixShapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n            const auto iter = depthmapX::findBinary(pixShapes, shapeRef);\r\n            if (iter == pixShapes.end())\r\n                throw new depthmapX::RuntimeException(\"Poly reference not found\");\r\n            unsigned char &tags = iter->m_tags;\r\n            if (tags == 0x00) {\r\n                tags |= ShapeRef::SHAPE_INTERNAL_EDGE;\r\n            }\r\n        }\r\n        // now, any remaining tags are internal sides, and need to be cleared through fill\r\n        // we could go either direction, but we just go left to right:\r\n        for (auto &relation : relations) {\r\n            PixelRef pix = relation.first;\r\n            if (relation.second & ShapeRef::SHAPE_R) {\r\n                bool lastWasNotFound = true;\r\n                while (lastWasNotFound) {\r\n                    PixelRef nextpix = pix.right();\r\n                    if (!includes(nextpix)) {\r\n                        // this shouldn't happen\r\n                        break;\r\n                    }\r\n                    // returns -1 if cannot add due to already existing:\r\n                    lastWasNotFound = false;\r\n                    std::vector<ShapeRef> &pixelShapes =\r\n                        m_pixel_shapes(static_cast<size_t>(nextpix.y), static_cast<size_t>(nextpix.x));\r\n                    const auto it = depthmapX::findBinary(pixelShapes, shapeRef);\r\n                    if (it == pixelShapes.end()) {\r\n                        lastWasNotFound = true;\r\n                        pixelShapes.push_back(ShapeRef(polyref, ShapeRef::SHAPE_CENTRE));\r\n                    }\r\n                    pix = nextpix;\r\n                }\r\n            }\r\n        }\r\n        // Done...! This polygon is registered in the pixel polygon structure\r\n    } else {\r\n        // Open shapes much easier!\r\n        switch (poly.m_type & SalaShape::SHAPE_TYPE) {\r\n        case SalaShape::SHAPE_POINT: {\r\n            PixelRef pix = pixelate(poly.m_centroid);\r\n            std::vector<ShapeRef> &pixShapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n            const auto it = depthmapX::findBinary(pixShapes, shapeRef);\r\n            if (it == pixShapes.end()) {\r\n                pixShapes.push_back(ShapeRef(polyref, ShapeRef::SHAPE_OPEN));\r\n            }\r\n        } break;\r\n        case SalaShape::SHAPE_LINE: {\r\n            PixelRefVector pixels = pixelateLine(poly.m_region);\r\n            for (size_t i = 0; i < pixels.size(); i++) {\r\n                PixelRef pix = pixels[i];\r\n                std::vector<ShapeRef> &pixShapes =\r\n                    m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n                const auto it = depthmapX::findBinary(pixShapes, shapeRef);\r\n                if (it == pixShapes.end()) {\r\n                    pixShapes.push_back(ShapeRef(polyref, ShapeRef::SHAPE_OPEN));\r\n                }\r\n            }\r\n        } break;\r\n        case SalaShape::SHAPE_POLY:\r\n            for (size_t k = 0; k < poly.m_points.size() - 1; k++) {\r\n                int nextk = (k + 1);\r\n                Line li(poly.m_points[k], poly.m_points[nextk]);\r\n                if (k == 0) {\r\n                    poly.m_region = li;\r\n                } else {\r\n                    poly.m_region = runion(poly.m_region, li);\r\n                }\r\n                PixelRefVector pixels = pixelateLine(li);\r\n                for (size_t i = 0; i < pixels.size(); i++) {\r\n                    PixelRef pix = pixels[i];\r\n                    std::vector<ShapeRef> &pixShapes =\r\n                        m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n                    auto it = depthmapX::findBinary(pixShapes, shapeRef);\r\n                    if (it == pixShapes.end()) {\r\n                        pixShapes.push_back(ShapeRef(polyref, ShapeRef::SHAPE_OPEN));\r\n                        it = pixShapes.end() - 1;\r\n                    }\r\n                    it->m_polyrefs.push_back(k);\r\n                }\r\n            }\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid ShapeMap::shapePixelBorder(std::map<int, int> &relations, int polyref, int side, PixelRef currpix,\r\n                                PixelRef minpix, bool first) {\r\n    if (!first && currpix == minpix && side == ShapeRef::SHAPE_L) {\r\n        // looped:\r\n        return;\r\n    }\r\n    auto relation = relations.find(currpix);\r\n    if (relation->second & side) {\r\n        std::vector<ShapeRef> &pixShapes =\r\n            m_pixel_shapes(static_cast<size_t>(currpix.y), static_cast<size_t>(currpix.x));\r\n        const auto iter = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n        if (iter == pixShapes.end())\r\n            throw new depthmapX::RuntimeException(\"Poly reference not found\");\r\n        iter->m_tags |= side;\r\n        relation->second &= ~side; // <- clear to check all have been done later\r\n        side <<= 1;\r\n        if (side > ShapeRef::SHAPE_T) {\r\n            side = ShapeRef::SHAPE_L;\r\n        }\r\n        shapePixelBorder(relations, polyref, side, currpix, minpix, false);\r\n    } else {\r\n        currpix.move(moveDir(side));\r\n        side >>= 1;\r\n        if (side < ShapeRef::SHAPE_L) {\r\n            side = ShapeRef::SHAPE_T;\r\n        }\r\n        shapePixelBorder(relations, polyref, side, currpix, minpix, false);\r\n    }\r\n}\r\n\r\n// note that this is almost exactly the same as shapePixelBorder\r\nvoid ShapeMap::pointPixelBorder(const PointMap &pointmap, std::map<int, int> &relations, SalaShape &poly, int side,\r\n                                PixelRef currpix, PixelRef minpix, bool first) {\r\n    if (!first && currpix == minpix && side == ShapeRef::SHAPE_L) {\r\n        // looped:\r\n        return;\r\n    }\r\n    auto relation = relations.find(currpix);\r\n    if (relation->second & side) {\r\n        poly.m_points.push_back(pointmap.depixelate(currpix) + pointOffset(pointmap, side));\r\n        relation->second &= ~side; // <- clear to check all have been done later\r\n        side <<= 1;\r\n        if (side > ShapeRef::SHAPE_T) {\r\n            side = ShapeRef::SHAPE_L;\r\n        }\r\n        pointPixelBorder(pointmap, relations, poly, side, currpix, minpix, false);\r\n    } else {\r\n        currpix.move(moveDir(side));\r\n        side >>= 1;\r\n        if (side < ShapeRef::SHAPE_L) {\r\n            side = ShapeRef::SHAPE_T;\r\n        }\r\n        pointPixelBorder(pointmap, relations, poly, side, currpix, minpix, false);\r\n    }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid ShapeMap::removePolyPixels(int polyref) {\r\n    auto shapeIter = m_shapes.find(polyref);\r\n    if (shapeIter == m_shapes.end()) {\r\n        return;\r\n    }\r\n    SalaShape &poly = shapeIter->second;\r\n    if (poly.isClosed()) {\r\n        // easiest just to use scan lines to find internal pixels rather than trace a complex border:\r\n        PixelRef minpix = pixelate(poly.m_region.bottom_left);\r\n        PixelRef maxpix = pixelate(poly.m_region.top_right);\r\n        for (int x = minpix.x; x <= maxpix.x; x++) {\r\n            for (int y = minpix.y; y <= maxpix.y; y++) {\r\n                std::vector<ShapeRef> &pixShapes = m_pixel_shapes(static_cast<size_t>(y), static_cast<size_t>(x));\r\n                const auto it = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n                if (it != pixShapes.end())\r\n                    pixShapes.erase(it);\r\n            }\r\n        }\r\n    } else {\r\n        // open shapes easier still, as no need to find internal pixels:\r\n        switch (poly.m_type & SalaShape::SHAPE_TYPE) {\r\n        case SalaShape::SHAPE_POINT: {\r\n            PixelRef pix = pixelate(poly.m_centroid);\r\n            std::vector<ShapeRef> &pixShapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n            const auto it = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n            if (it != pixShapes.end())\r\n                pixShapes.erase(it);\r\n        } break;\r\n        case SalaShape::SHAPE_LINE: {\r\n            PixelRefVector list = pixelateLine(poly.m_region);\r\n            for (size_t i = 0; i < list.size(); i++) {\r\n                std::vector<ShapeRef> &pixShapes =\r\n                    m_pixel_shapes(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x));\r\n                const auto it = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n                if (it != pixShapes.end())\r\n                    pixShapes.erase(it);\r\n            }\r\n        } break;\r\n        case SalaShape::SHAPE_POLY:\r\n            for (size_t k = 0; k < poly.m_points.size() - 1; k++) {\r\n                size_t nextk = (k + 1);\r\n                Line li(poly.m_points[k], poly.m_points[nextk]);\r\n                PixelRefVector list = pixelateLine(li);\r\n                for (size_t i = 0; i < list.size(); i++) {\r\n                    std::vector<ShapeRef> &pixShapes =\r\n                        m_pixel_shapes(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x));\r\n                    const auto it = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n                    if (it != pixShapes.end())\r\n                        pixShapes.erase(it);\r\n                }\r\n            }\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nint ShapeMap::moveDir(int side) {\r\n    int dir = PixelRef::NODIR;\r\n    switch (side) {\r\n    case ShapeRef::SHAPE_L:\r\n        dir = PixelRef::NEGHORIZONTAL;\r\n        break;\r\n    case ShapeRef::SHAPE_B:\r\n        dir = PixelRef::NEGVERTICAL;\r\n        break;\r\n    case ShapeRef::SHAPE_R:\r\n        dir = PixelRef::HORIZONTAL;\r\n        break;\r\n    case ShapeRef::SHAPE_T:\r\n        dir = PixelRef::VERTICAL;\r\n        break;\r\n    }\r\n    return dir;\r\n}\r\n\r\nPoint2f ShapeMap::pointOffset(const PointMap &pointmap, int side) {\r\n    Point2f p;\r\n    switch (side) {\r\n    case ShapeRef::SHAPE_L:\r\n        p = Point2f(-pointmap.getSpacing() / 2, 0.0);\r\n        break;\r\n    case ShapeRef::SHAPE_B:\r\n        p = Point2f(0.0, -pointmap.getSpacing() / 2);\r\n        break;\r\n    case ShapeRef::SHAPE_R:\r\n        p = Point2f(pointmap.getSpacing() / 2, 0.0);\r\n        break;\r\n    case ShapeRef::SHAPE_T:\r\n        p = Point2f(0.0, pointmap.getSpacing() / 2);\r\n        break;\r\n    }\r\n    return p;\r\n}\r\n\r\n// Point in poly testing (returns topmost displayed poly)\r\n\r\nint ShapeMap::pointInPoly(const Point2f &p) const {\r\n    if (!m_region.contains(p)) {\r\n        return -1;\r\n    }\r\n    std::vector<size_t> testedshapes;\r\n    PixelRef pix = pixelate(p);\r\n    const std::vector<ShapeRef> &shapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n    int drawlast = -1;\r\n    int draworder = -1;\r\n\r\n    for (const ShapeRef &shape : shapes) {\r\n        auto iter = depthmapX::findBinary(testedshapes, shape.m_shape_ref);\r\n        if (iter != testedshapes.end()) {\r\n            continue;\r\n        }\r\n        testedshapes.insert(iter, int(shape.m_shape_ref));\r\n\r\n        int shapeindex = testPointInPoly(p, shape);\r\n\r\n        // if there's a shapeindex, then add:\r\n        int currentDrawOrder = m_attribHandle->findInIndex(AttributeKey(shape.m_shape_ref));\r\n        if (shapeindex != -1 && currentDrawOrder > draworder) {\r\n            drawlast = shapeindex;\r\n            draworder = currentDrawOrder;\r\n        }\r\n    }\r\n    return drawlast;\r\n}\r\n\r\n// Point in specific poly (by reference)\r\n\r\nbool ShapeMap::pointInPoly(const Point2f &p, int polyref) const {\r\n    PixelRef pix = pixelate(p);\r\n    const std::vector<ShapeRef> &shapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n    const auto iter = depthmapX::findBinary(shapes, ShapeRef(polyref));\r\n    if (iter != shapes.end()) {\r\n        return (testPointInPoly(p, *iter) != -1);\r\n    }\r\n    return false;\r\n}\r\n\r\n// similar to above, but builds a list\r\n\r\nstd::vector<int> ShapeMap::pointInPolyList(const Point2f &p) const {\r\n    std::vector<int> shapeindexlist;\r\n    if (!m_region.contains(p)) {\r\n        return shapeindexlist;\r\n    }\r\n    std::vector<size_t> testedshapes;\r\n    PixelRef pix = pixelate(p);\r\n    const std::vector<ShapeRef> &shapes = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n    for (const ShapeRef &shape : shapes) {\r\n        auto iter = depthmapX::findBinary(testedshapes, shape.m_shape_ref);\r\n        if (iter != testedshapes.end()) {\r\n            continue;\r\n        }\r\n        testedshapes.insert(iter, int(shape.m_shape_ref));\r\n\r\n        int shapeindex = testPointInPoly(p, shape);\r\n\r\n        // if there's a shapeindex, then add (note it is an add -- you may be passed a list again to expand)\r\n        if (shapeindex != -1) {\r\n            shapeindexlist.push_back(shapeindex);\r\n        }\r\n    }\r\n    std::sort(shapeindexlist.begin(), shapeindexlist.end());\r\n    return shapeindexlist;\r\n}\r\n\r\n// note, lineref is only used as an \"exclude self\" test when called from getShapeConnections\r\nstd::vector<int> ShapeMap::lineInPolyList(const Line &li_orig, size_t lineref, double tolerance) const {\r\n    std::vector<int> shapeindexlist;\r\n    if (!intersect_region(m_region, li_orig)) {\r\n        return shapeindexlist;\r\n    }\r\n    Line li = li_orig;\r\n    if (!m_region.contains(li.start()) || !m_region.contains(li.end())) {\r\n        li.crop(m_region);\r\n    }\r\n\r\n    shapeindexlist = pointInPolyList(li.start());\r\n    std::vector<int> endShapeIndexList = pointInPolyList(li.end());\r\n    shapeindexlist.insert(shapeindexlist.end(), endShapeIndexList.begin(), endShapeIndexList.end());\r\n\r\n    // only now pixelate and test for any other shapes:\r\n    PixelRefVector list = pixelateLine(li);\r\n    for (size_t i = 0; i < list.size(); i++) {\r\n        PixelRef pix = list[i];\r\n        if (includes(pix)) {\r\n            const std::vector<ShapeRef> &shapes =\r\n                m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n            for (const ShapeRef &shape : shapes) {\r\n                // slow to do this as it can repeat -- really need to use a linetest like structure to avoid retest of\r\n                // polygon lines\r\n                if (shape.m_shape_ref != lineref &&\r\n                    shape.m_tags & (ShapeRef::SHAPE_EDGE | ShapeRef::SHAPE_INTERNAL_EDGE | ShapeRef::SHAPE_OPEN)) {\r\n                    auto shapeIter = m_shapes.find(shape.m_shape_ref);\r\n                    const SalaShape &poly = shapeIter->second;\r\n                    switch (poly.m_type & (SalaShape::SHAPE_LINE | SalaShape::SHAPE_POLY)) {\r\n                    case SalaShape::SHAPE_LINE:\r\n                        if (intersect_region(li, poly.m_region)) {\r\n                            // note: in this case m_region is stored as a line:\r\n                            if (intersect_line(li, poly.m_region, tolerance)) {\r\n                                shapeindexlist.push_back(int(std::distance(m_shapes.begin(), shapeIter)));\r\n                            }\r\n                        }\r\n                        break;\r\n                    case SalaShape::SHAPE_POLY: {\r\n                        for (size_t k = 0; k < shape.m_polyrefs.size(); k++) {\r\n                            Line lineb = Line(poly.m_points[shape.m_polyrefs[k]],\r\n                                              poly.m_points[((shape.m_polyrefs[k] + 1) % poly.m_points.size())]);\r\n                            if (intersect_region(li, lineb)) {\r\n                                if (intersect_line(li, lineb, tolerance)) {\r\n                                    shapeindexlist.push_back(int(std::distance(m_shapes.begin(), shapeIter)));\r\n                                }\r\n                            }\r\n                        }\r\n                    } break;\r\n                    default:\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    std::sort(shapeindexlist.begin(), shapeindexlist.end());\r\n    return shapeindexlist;\r\n}\r\n\r\nstd::vector<int> ShapeMap::polyInPolyList(int polyref, double tolerance) const {\r\n    std::vector<int> shapeindexlist;\r\n    auto shapeIter = m_shapes.find(polyref);\r\n    if (shapeIter == m_shapes.end()) {\r\n        return shapeindexlist;\r\n    }\r\n    const SalaShape &poly = shapeIter->second;\r\n    if (poly.isClosed()) { // <- it ought to be, you shouldn't be using this function if not!\r\n        std::vector<size_t> testedlist;\r\n        // easiest just to use scan lines to find internal pixels rather than trace a complex border:\r\n        PixelRef minpix = pixelate(poly.m_region.bottom_left);\r\n        PixelRef maxpix = pixelate(poly.m_region.top_right);\r\n        // pass one: shape centre of either object coincident automatically adds\r\n        int x;\r\n        for (x = minpix.x; x <= maxpix.x; x++) {\r\n            for (int y = minpix.y; y <= maxpix.y; y++) {\r\n                const std::vector<ShapeRef> &pixShapes =\r\n                    m_pixel_shapes(static_cast<size_t>(y), static_cast<size_t>(x));\r\n                const auto iter = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n                if (iter != pixShapes.end()) {\r\n                    // this has us in it, now looked through everything else:\r\n                    for (const ShapeRef &shapeRef : pixShapes) {\r\n                        if (*iter != shapeRef &&\r\n                            ((iter->m_tags & ShapeRef::SHAPE_CENTRE) || (shapeRef.m_tags & ShapeRef::SHAPE_CENTRE))) {\r\n                            auto iter = depthmapX::findBinary(testedlist, shapeRef.m_shape_ref);\r\n                            if (iter == testedlist.end()) {\r\n                                testedlist.insert(iter, shapeRef.m_shape_ref);\r\n                                shapeindexlist.push_back(\r\n                                    int(depthmapX::findIndexFromKey(m_shapes, int(shapeRef.m_shape_ref))));\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // that was the easy bit... now, pass 2, for non centre things:\r\n        for (x = minpix.x; x <= maxpix.x; x++) {\r\n            for (int y = minpix.y; y <= maxpix.y; y++) {\r\n                const std::vector<ShapeRef> &pixShapes =\r\n                    m_pixel_shapes(static_cast<size_t>(y), static_cast<size_t>(x));\r\n                const auto iter = depthmapX::findBinary(pixShapes, ShapeRef(polyref));\r\n                if (iter != pixShapes.end()) {\r\n                    const ShapeRef &shaperef = *iter;\r\n                    if ((shaperef.m_tags & ShapeRef::SHAPE_CENTRE) == 0) {\r\n                        // this has us in it, now looked through everything else:\r\n                        for (auto &shaperefb : pixShapes) {\r\n                            auto iter = depthmapX::findBinary(testedlist, shaperefb.m_shape_ref);\r\n                            if (shaperef != shaperefb && iter == testedlist.end()) {\r\n                                auto shapeIter = m_shapes.find(shaperefb.m_shape_ref);\r\n                                size_t indexb = std::distance(m_shapes.begin(), shapeIter);\r\n                                const SalaShape &polyb = shapeIter->second;\r\n                                if (polyb.isPoint()) {\r\n                                    if (testPointInPoly(polyb.getPoint(), shaperef) != -1) {\r\n                                        shapeindexlist.push_back(int(indexb));\r\n                                    }\r\n                                } else if (polyb.isLine()) {\r\n                                    if (testPointInPoly(polyb.getLine().start(), shaperef) != -1 ||\r\n                                        testPointInPoly(polyb.getLine().end(), shaperef) != -1) {\r\n                                        testedlist.insert(iter, shaperefb.m_shape_ref);\r\n                                        shapeindexlist.push_back(int(indexb));\r\n                                    } else {\r\n                                        for (size_t k = 0; k < shaperef.m_polyrefs.size(); k++) {\r\n                                            Line line = Line(\r\n                                                poly.m_points[shaperef.m_polyrefs[k]],\r\n                                                poly.m_points[((shaperef.m_polyrefs[k] + 1) % poly.m_points.size())]);\r\n                                            if (intersect_region(line, polyb.getLine())) {\r\n                                                if (intersect_line(line, polyb.getLine(), tolerance)) {\r\n                                                    testedlist.insert(iter, shaperefb.m_shape_ref);\r\n                                                    shapeindexlist.push_back(int(indexb));\r\n                                                    break;\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                } else if (polyb.isPolyLine()) {\r\n                                    if (testPointInPoly(polyb.m_points[shaperefb.m_polyrefs[0]], shaperef) != -1) {\r\n                                        testedlist.insert(iter, shaperefb.m_shape_ref);\r\n                                        shapeindexlist.push_back(int(indexb));\r\n                                    } else {\r\n                                        for (size_t k = 0; k < shaperef.m_polyrefs.size(); k++) {\r\n                                            for (size_t kk = 0; kk < shaperefb.m_polyrefs.size(); kk++) {\r\n                                                Line line = Line(poly.m_points[shaperef.m_polyrefs[k]],\r\n                                                                 poly.m_points[((shaperef.m_polyrefs[k] + 1) %\r\n                                                                                poly.m_points.size())]);\r\n                                                Line lineb = Line(polyb.m_points[shaperefb.m_polyrefs[kk]],\r\n                                                                  polyb.m_points[((shaperefb.m_polyrefs[kk] + 1) %\r\n                                                                                  polyb.m_points.size())]);\r\n                                                if (intersect_region(line, lineb)) {\r\n                                                    if (intersect_line(line, lineb, tolerance)) {\r\n                                                        auto iterInternal =\r\n                                                            depthmapX::findBinary(testedlist, shaperefb.m_shape_ref);\r\n                                                        if (iterInternal == testedlist.end()) {\r\n                                                            testedlist.insert(iterInternal, shaperefb.m_shape_ref);\r\n                                                            shapeindexlist.push_back(int(indexb));\r\n                                                            break;\r\n                                                        }\r\n                                                    }\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                } else {\r\n                                    // poly to poly, ick!\r\n                                    // first test one entirely inside the other\r\n                                    // any point at all will suffice to check this: however, we need to check that the\r\n                                    // polyref point *itself* is within the pixel, not just part of the line associated\r\n                                    // with it...\r\n                                    if ((pixelate(polyb.m_points[shaperefb.m_polyrefs[0]]) == PixelRef(x, y) &&\r\n                                         testPointInPoly(polyb.m_points[shaperefb.m_polyrefs[0]], shaperef) != -1) ||\r\n                                        (pixelate(poly.m_points[shaperef.m_polyrefs[0]]) == PixelRef(x, y) &&\r\n                                         testPointInPoly(poly.m_points[shaperef.m_polyrefs[0]], shaperefb) != -1)) {\r\n                                        testedlist.insert(iter, shaperefb.m_shape_ref);\r\n                                        shapeindexlist.push_back(int(indexb));\r\n                                    } else {\r\n                                        // now check crossing\r\n                                        bool breakit = false;\r\n                                        for (size_t k = 0; k < shaperef.m_polyrefs.size() && !breakit; k++) {\r\n                                            for (size_t kk = 0; kk < shaperefb.m_polyrefs.size(); kk++) {\r\n                                                Line line = Line(poly.m_points[shaperef.m_polyrefs[k]],\r\n                                                                 poly.m_points[((shaperef.m_polyrefs[k] + 1) %\r\n                                                                                poly.m_points.size())]);\r\n                                                Line lineb = Line(polyb.m_points[shaperefb.m_polyrefs[kk]],\r\n                                                                  polyb.m_points[((shaperefb.m_polyrefs[kk] + 1) %\r\n                                                                                  polyb.m_points.size())]);\r\n                                                if (intersect_region(line, lineb)) {\r\n                                                    if (intersect_line(line, lineb, tolerance)) {\r\n                                                        testedlist.insert(iter, shaperefb.m_shape_ref);\r\n                                                        shapeindexlist.push_back(int(indexb));\r\n                                                        breakit = true;\r\n                                                        break;\r\n                                                    }\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n    } else {\r\n        throw depthmapX::RuntimeException(\"this function is to be used for polygons only\");\r\n    }\r\n    std::sort(shapeindexlist.begin(), shapeindexlist.end());\r\n    return shapeindexlist;\r\n}\r\n\r\nstd::vector<int> ShapeMap::shapeInPolyList(const SalaShape &shape) // note: no const due to poly in poly testing\r\n{\r\n    std::vector<int> shapeindexlist;\r\n    if (!intersect_region(m_region, shape.m_region)) {\r\n        // quick test that actually coincident\r\n        return shapeindexlist;\r\n    }\r\n    if (shape.isPoint()) {\r\n        shapeindexlist = pointInPolyList(shape.getPoint());\r\n    } else if (shape.isLine()) {\r\n        shapeindexlist = lineInPolyList(shape.getLine());\r\n    } else if (shape.isPolyLine()) {\r\n        for (size_t i = 1; i < shape.m_points.size() - 1; i++) {\r\n            Line li(shape.m_points[i], shape.m_points[i - 1]);\r\n            shapeindexlist = lineInPolyList(li);\r\n        }\r\n    } else {\r\n        // first *add* the poly temporarily (note this may grow pixel set):\r\n        int ref = makePolyShape(shape.m_points, false, true); // false is closed poly, true is temporary shape\r\n        // do test:\r\n        shapeindexlist = polyInPolyList(ref);\r\n        // clean up:\r\n        removePolyPixels(ref);\r\n        m_shapes.erase(m_shapes.find(ref));\r\n    }\r\n    return shapeindexlist;\r\n}\r\n\r\n// helper for point in poly --\r\n// currently needs slight rewrite to avoid problem if point is in line with a vertex\r\n// (counter incremented twice on touching implies not in poly when is)\r\n\r\nint ShapeMap::testPointInPoly(const Point2f &p, const ShapeRef &shape) const {\r\n    auto shapeIter = m_shapes.end();\r\n    // simplist: in shape centre\r\n    if (shape.m_tags & ShapeRef::SHAPE_CENTRE) {\r\n        shapeIter = m_shapes.find(shape.m_shape_ref);\r\n    }\r\n    // check not an open shape (cannot be inside)\r\n    else if ((shape.m_tags & ShapeRef::SHAPE_OPEN) == 0) {\r\n        auto tempShapeIter = m_shapes.find(shape.m_shape_ref);\r\n        const SalaShape &poly = tempShapeIter->second;\r\n        if (poly.m_region.contains_touch(p)) {\r\n            // next simplest, on the outside border:\r\n            int alpha = 0;\r\n            int counter = 0;\r\n            int parity = 0;\r\n            if (shape.m_tags & ShapeRef::SHAPE_EDGE) {\r\n                // run a test line to the edge:\r\n                if (shape.m_tags & (ShapeRef::SHAPE_L | ShapeRef::SHAPE_R)) {\r\n                    if (shape.m_tags & ShapeRef::SHAPE_L) {\r\n                        parity = -1;\r\n                    } else if (shape.m_tags & ShapeRef::SHAPE_R) {\r\n                        parity = +1;\r\n                    }\r\n                    for (size_t j = 0; j < shape.m_polyrefs.size(); j++) {\r\n                        Line lineb = Line(poly.m_points[shape.m_polyrefs[j]],\r\n                                          poly.m_points[((shape.m_polyrefs[j] + 1) % poly.m_points.size())]);\r\n                        if (lineb.bottom_left.y <= p.y && lineb.top_right.y >= p.y) {\r\n                            // crosses or touches... but we need to check\r\n                            // touching exception:\r\n                            if (lineb.t_start().y == p.y) {\r\n                                if (parity * lineb.t_start().x >= parity * p.x) {\r\n                                    alpha -= 1;\r\n                                    counter++;\r\n                                }\r\n                            }\r\n                            // the other touching exception\r\n                            else if (lineb.t_end().y == p.y) {\r\n                                if (parity * lineb.t_end().x >= parity * p.x) {\r\n                                    alpha += 1;\r\n                                    // n.b., no counter here\r\n                                }\r\n                            }\r\n                            // at this stage we know the line isn't horizontal, so we can find the intersection point:\r\n                            else if (parity * (lineb.grad(XAXIS) * (p.y - lineb.ay()) + lineb.ax()) >= parity * p.x) {\r\n                                counter++;\r\n                            }\r\n                        }\r\n                    }\r\n                } else {\r\n                    if (shape.m_tags & ShapeRef::SHAPE_B) {\r\n                        parity = -1;\r\n                    } else if (shape.m_tags & ShapeRef::SHAPE_T) {\r\n                        parity = +1;\r\n                    }\r\n                    for (size_t j = 0; j < shape.m_polyrefs.size(); j++) {\r\n                        Line lineb = Line(poly.m_points[shape.m_polyrefs[j]],\r\n                                          poly.m_points[((shape.m_polyrefs[j] + 1) % poly.m_points.size())]);\r\n                        if (lineb.bottom_left.x <= p.x && lineb.top_right.x >= p.x) {\r\n                            // crosses or touches... but we need to check\r\n                            // touching exception:\r\n                            if (lineb.top_right.x == p.x) {\r\n                                if (parity * lineb.by() >= parity * p.y) {\r\n                                    alpha -= 1;\r\n                                    counter++;\r\n                                }\r\n                            }\r\n                            // the other touching exception\r\n                            else if (lineb.bottom_left.x == p.x) {\r\n                                if (parity * lineb.ay() >= parity * p.y) {\r\n                                    alpha += 1;\r\n                                    // n.b., no counter here\r\n                                }\r\n                            }\r\n                            // at this stage we know the line isn't vertical, so we can find the intersection point:\r\n                            else if (parity * (lineb.grad(YAXIS) * (p.x - lineb.ax()) + lineb.ay()) >= parity * p.y) {\r\n                                counter++;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                if (counter % 2 != 0 && alpha == 0) {\r\n                    shapeIter = tempShapeIter;\r\n                }\r\n            }\r\n            // and now the pig -- it's somewhere in the middle of the poly:\r\n            else if (shape.m_tags & ShapeRef::SHAPE_INTERNAL_EDGE) {\r\n                std::vector<int> testnodes;\r\n                size_t j;\r\n                for (j = 0; j < size_t(shape.m_polyrefs.size()); j++) {\r\n                    depthmapX::addIfNotExists(testnodes, int(shape.m_polyrefs[j]));\r\n                }\r\n                PixelRef pix2 = pixelate(p);\r\n                pix2.move(PixelRef::NEGVERTICAL); // move pix2 down, search for this shape...\r\n                const std::vector<ShapeRef> *pixelShapes =\r\n                    &m_pixel_shapes(static_cast<size_t>(pix2.y), static_cast<size_t>(pix2.x));\r\n                // bit of code duplication like this, but easier on params to this function:\r\n                auto iter = std::find(pixelShapes->begin(), pixelShapes->end(), shape.m_shape_ref);\r\n                while (iter != pixelShapes->end()) {\r\n                    for (size_t k = 0; k < iter->m_polyrefs.size(); k++) {\r\n                        depthmapX::addIfNotExists(testnodes, int(iter->m_polyrefs[k]));\r\n                    }\r\n                    pix2.move(PixelRef::NEGVERTICAL); // move pix2 down, search for this shape...\r\n                    if (includes(pix2)) {\r\n                        pixelShapes = &m_pixel_shapes(static_cast<size_t>(pix2.y), static_cast<size_t>(pix2.x));\r\n                        iter = std::find(pixelShapes->begin(), pixelShapes->end(), shape.m_shape_ref);\r\n                    } else {\r\n                        iter = pixelShapes->end();\r\n                    }\r\n                }\r\n                int alpha = 0;\r\n                int counter = 0;\r\n                int parity = -1;\r\n\r\n                for (j = 0; j < testnodes.size(); j++) {\r\n                    Line lineb =\r\n                        Line(poly.m_points[testnodes[j]], poly.m_points[((testnodes[j] + 1) % poly.m_points.size())]);\r\n                    if (lineb.bottom_left.x <= p.x && lineb.top_right.x >= p.x) {\r\n                        // crosses or touches... but we need to check\r\n                        // touching exception:\r\n                        if (lineb.top_right.x == p.x) {\r\n                            if (parity * lineb.by() >= parity * p.y) {\r\n                                alpha -= 1;\r\n                                counter++;\r\n                            }\r\n                        }\r\n                        // the other touching exception\r\n                        else if (lineb.bottom_left.x == p.x) {\r\n                            if (parity * lineb.ay() >= parity * p.y) {\r\n                                alpha += 1;\r\n                                // n.b., no counter here\r\n                            }\r\n                        }\r\n                        // at this stage we know the line isn't vertical, so we can find the intersection point:\r\n                        else if (parity * (lineb.grad(YAXIS) * (p.x - lineb.ax()) + lineb.ay()) >= parity * p.y) {\r\n                            counter++;\r\n                        }\r\n                    }\r\n                }\r\n                if (counter % 2 != 0 && alpha == 0) {\r\n                    shapeIter = m_shapes.find(shape.m_shape_ref);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return (shapeIter == m_shapes.end()) ? -1 : std::distance(m_shapes.begin(), shapeIter); // note convert to -1\r\n}\r\n\r\n// also note that you may want to find a close poly line or point\r\n// if you can't find a point in poly (or even if you can)\r\n\r\n// (see also getClosestVertex below)\r\n\r\n// returns a rowid *not* a shape key\r\n\r\nint ShapeMap::getClosestOpenGeom(const Point2f &p) const {\r\n    if (!m_region.contains(p)) {\r\n        return -1;\r\n    }\r\n\r\n    PixelRef pix = pixelate(p);\r\n\r\n    auto shapeIter = m_shapes.end();\r\n    double mindist = -1;\r\n    const std::vector<ShapeRef> &shapeRefs = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n    for (const ShapeRef &ref : shapeRefs) {\r\n        if (ref.m_tags & ShapeRef::SHAPE_OPEN) {\r\n            double thisdist = -1.0;\r\n            auto tempShapeIter = m_shapes.find(ref.m_shape_ref);\r\n            const SalaShape &poly = tempShapeIter->second;\r\n            switch (poly.m_type) {\r\n            case SalaShape::SHAPE_POINT:\r\n                thisdist = dist(p, poly.m_centroid);\r\n            case SalaShape::SHAPE_LINE:\r\n                thisdist = dist(p, poly.m_region); // note, in this case m_region is a line\r\n                break;\r\n            case SalaShape::SHAPE_POLY:\r\n            case SalaShape::SHAPE_POLY | SalaShape::SHAPE_CCW: // note CCW should never have happened, but it has\r\n                for (size_t j = 0; j < ref.m_polyrefs.size(); j++) {\r\n                    Line line(poly.m_points[ref.m_polyrefs[j]], poly.m_points[ref.m_polyrefs[j] + 1]);\r\n                    double tempthisdist = dist(p, line);\r\n                    if (tempthisdist != -1 && (thisdist == -1 || tempthisdist < thisdist)) {\r\n                        thisdist = tempthisdist;\r\n                    }\r\n                }\r\n                break;\r\n            }\r\n            if (thisdist != -1.0 && (mindist == -1 || thisdist < mindist)) {\r\n                mindist = thisdist;\r\n                shapeIter = tempShapeIter;\r\n            }\r\n        }\r\n    }\r\n\r\n    return (shapeIter == m_shapes.end()) ? -1 : std::distance(m_shapes.begin(), shapeIter); // note conversion to -1\r\n}\r\n\r\nPoint2f ShapeMap::getClosestVertex(const Point2f &p) const {\r\n    Point2f vertex; // null by default\r\n\r\n    if (!m_region.contains(p)) {\r\n        return vertex; // will be null in this case\r\n    }\r\n\r\n    PixelRef pix = pixelate(p);\r\n\r\n    double mindist = -1.0;\r\n    const std::vector<ShapeRef> &shapeRefs = m_pixel_shapes(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n    for (const ShapeRef &ref : shapeRefs) {\r\n        double thisdist = -1.0;\r\n        Point2f thisvertex;\r\n        const SalaShape &poly = m_shapes.find(ref.m_shape_ref)->second;\r\n        switch (poly.m_type) {\r\n        case SalaShape::SHAPE_POINT:\r\n            thisvertex = poly.m_centroid;\r\n            thisdist = dist(p, thisvertex);\r\n            break;\r\n        case SalaShape::SHAPE_LINE: {\r\n            double d1 = dist(p, poly.m_region.start());\r\n            double d2 = dist(p, poly.m_region.end());\r\n            if (d1 < d2) {\r\n                thisvertex = poly.m_region.start();\r\n                thisdist = d1;\r\n            } else {\r\n                thisvertex = poly.m_region.end();\r\n                thisdist = d2;\r\n            }\r\n        } break;\r\n        default: // either a poly line or a polygon\r\n            for (size_t j = 0; j < ref.m_polyrefs.size(); j++) {\r\n                double d1 = dist(p, poly.m_points[ref.m_polyrefs[j]]);\r\n                // note this can be used for both open / closed with the % poly.size()\r\n                double d2 = dist(p, poly.m_points[(ref.m_polyrefs[j] + 1) % poly.m_points.size()]);\r\n                if (thisdist == -1 || d1 < thisdist) {\r\n                    thisvertex = poly.m_points[ref.m_polyrefs[j]];\r\n                    thisdist = d1;\r\n                }\r\n                if (d2 < thisdist) {\r\n                    thisvertex = poly.m_points[(ref.m_polyrefs[j] + 1) % poly.m_points.size()];\r\n                    thisdist = d2;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        if (thisdist != -1.0 && (mindist == -1.0 || thisdist < mindist)) {\r\n            mindist = thisdist;\r\n            vertex = thisvertex;\r\n        }\r\n    }\r\n\r\n    return vertex;\r\n}\r\n\r\n// nb, uses full BSP tree test:\r\n\r\n#include \"isovist.h\"\r\n\r\nint ShapeMap::getClosestLine(const Point2f &p) const {\r\n    // not the best place to check this, but we must all the same:\r\n    if (m_newshape) {\r\n        m_bsp_tree = false;\r\n    }\r\n\r\n    if (!m_bsp_tree) {\r\n        makeBSPtree();\r\n    }\r\n\r\n    int index = -1;\r\n\r\n    if (m_bsp_tree) { // <- check there is actually something in the tree!\r\n        Isovist iso;\r\n        index = iso.getClosestLine(m_bsp_root, p);\r\n    }\r\n\r\n    return index;\r\n}\r\n\r\n// code to add intersections when shapes are added to the graph one by one:\r\nint ShapeMap::connectIntersected(int rowid, bool linegraph) {\r\n    auto shaperefIter = depthmapX::getMapAtIndex(m_shapes, rowid);\r\n    int conn_col = m_attributes->getOrInsertLockedColumn(\"Connectivity\");\r\n    int leng_col = -1;\r\n    if (linegraph) {\r\n        // historically line length has always been added at this point\r\n        leng_col = m_attributes->getOrInsertLockedColumn(\"Line Length\");\r\n    }\r\n    // all indices should match... this grows connectors if necessary to same length as shapes\r\n    while (m_connectors.size() < m_shapes.size()) {\r\n        m_connectors.push_back(Connector());\r\n    }\r\n    m_connectors[size_t(rowid)].m_connections =\r\n        linegraph ? getLineConnections(shaperefIter->first, TOLERANCE_B * __max(m_region.height(), m_region.width()))\r\n                  : getShapeConnections(shaperefIter->first, TOLERANCE_B * __max(m_region.height(), m_region.width()));\r\n\r\n    auto &row = getAttributeRowFromShapeIndex(rowid);\r\n    row.setValue(conn_col, float(m_connectors[size_t(rowid)].m_connections.size()));\r\n    if (linegraph) {\r\n        row.setValue(leng_col, (float)shaperefIter->second.getLength());\r\n    }\r\n    // now go through our connections, and add ourself:\r\n    const std::vector<int> &connections = m_connectors[size_t(rowid)].m_connections;\r\n    for (int connection : connections) {\r\n        if (connection != rowid) { // <- exclude self!\r\n            depthmapX::insert_sorted(m_connectors[size_t(connection)].m_connections, rowid);\r\n            auto &connectionRow = getAttributeRowFromShapeIndex(connection);\r\n            connectionRow.incrValue(conn_col);\r\n        }\r\n    }\r\n    return m_connectors[size_t(rowid)].m_connections.size();\r\n}\r\n\r\n// this assumes this is a line map (to speed up axial map creation)\r\n// use the other version, getShapeConnections for arbitrary shape-shape connections\r\n// note, connections are listed by rowid in list, *not* reference number\r\n// (so they may vary: must be checked carefully when shapes are removed / added)\r\nstd::vector<int> ShapeMap::getLineConnections(int lineref, double tolerance) {\r\n    std::vector<int> connections;\r\n\r\n    SalaShape &poly = m_shapes.find(lineref)->second;\r\n    if (!poly.isLine()) {\r\n        return std::vector<int>();\r\n    }\r\n    const Line &l = poly.getLine();\r\n\r\n    std::unordered_set<ShapeRef, ShapeRefHash> shapesToTest;\r\n\r\n    // As of version 10, self-connections are *not* added\r\n    // In the past:\r\n    // <exclude> it's useful to have yourself in your connections list\r\n    // (apparently! -- this needs checking, as most of the time it is then checked to exclude self again!) </exclude>\r\n    // <exclude> connections.add(m_shapes.searchindex(lineref)); </exclude>\r\n\r\n    shapesToTest.insert(lineref);\r\n\r\n    PixelRefVector list = pixelateLine(l);\r\n\r\n    for (size_t i = 0; i < list.size(); i++) {\r\n        const std::vector<ShapeRef> &shapeRefs =\r\n            m_pixel_shapes(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x));\r\n        for (const ShapeRef &shape : shapeRefs) {\r\n            shapesToTest.insert(shape);\r\n        }\r\n    }\r\n    for (ShapeRef shape : shapesToTest) {\r\n        if ((shape.m_tags & ShapeRef::SHAPE_OPEN) == ShapeRef::SHAPE_OPEN) {\r\n            const Line &line = m_shapes.find(int(shape.m_shape_ref))->second.getLine();\r\n            if (intersect_region(line, l, line.length() * tolerance)) {\r\n                // n.b. originally this followed the logic that we must normalise intersect_line properly: tolerance *\r\n                // line length one * line length two in fact, works better if it's just line.length() * tolerance...\r\n                if (intersect_line(line, l, line.length() * tolerance)) {\r\n                    depthmapX::insert_sorted(connections,\r\n                                             depthmapX::findIndexFromKey(m_shapes, int(shape.m_shape_ref)));\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return connections;\r\n}\r\n\r\n// this is only problematic as there is lots of legacy code with shape-in-shape testing,\r\nstd::vector<int> ShapeMap::getShapeConnections(int shaperef, double tolerance) {\r\n    // In versions prior to 10, note that unlike getLineConnections, self-connection is excluded by all of the\r\n    // following functions As of version 10, both getShapeConnections and getLineConnections exclude self-connection\r\n\r\n    std::vector<int> connections;\r\n\r\n    auto shapeIter = m_shapes.find(shaperef);\r\n    if (shapeIter != m_shapes.end()) {\r\n        SalaShape &shape = shapeIter->second;\r\n        if (shape.isPoint()) {\r\n            // a point is simple, it never intersects itself:\r\n            connections = pointInPolyList(shape.getPoint());\r\n        } else if (shape.isPolygon()) {\r\n            // a closed poly is actually quite simple too as we already have code using a polyref:\r\n            connections = polyInPolyList(shaperef, tolerance);\r\n        } else if (shape.isLine()) {\r\n            // line is a bit slow because there's no tested shape as in getLineConnections, but similar:\r\n            connections = lineInPolyList(shape.getLine(), shaperef, tolerance);\r\n        } else if (shape.isPolyLine()) {\r\n            // this is the worst for efficiency: potential for many possible retries of the same shape:\r\n            for (size_t i = 1; i < shape.m_points.size() - 1; i++) {\r\n                Line li(shape.m_points[i - 1], shape.m_points[i]);\r\n                connections = lineInPolyList(li, shaperef, tolerance);\r\n            }\r\n        }\r\n    }\r\n\r\n    return connections;\r\n}\r\n\r\n// for any geometry, not just line to lines\r\nvoid ShapeMap::makeShapeConnections() {\r\n    if (m_hasgraph) {\r\n        m_connectors.clear();\r\n        m_attributes->clear();\r\n        m_links.clear();\r\n        m_unlinks.clear();\r\n\r\n        // note, expects these to be numbered 0, 1...\r\n        int conn_col = m_attributes->insertOrResetLockedColumn(\"Connectivity\");\r\n\r\n        int i = -1;\r\n        for (auto shape : m_shapes) {\r\n            i++;\r\n            int key = shape.first;\r\n            auto &row = m_attributes->addRow(AttributeKey(key));\r\n            // all indices should match...\r\n            m_connectors.push_back(Connector());\r\n            m_connectors[i].m_connections =\r\n                getShapeConnections(key, TOLERANCE_B * __max(m_region.height(), m_region.width()));\r\n            row.setValue(conn_col, float(m_connectors[i].m_connections.size()));\r\n        }\r\n\r\n        m_displayed_attribute = -1; // <- override if it's already showing\r\n        setDisplayedAttribute(conn_col);\r\n    }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// note: uses rowid not key\r\ndouble ShapeMap::getLocationValue(const Point2f &point) const {\r\n    double val = -1.0;\r\n    int x = pointInPoly(point);\r\n    if (x == -1) {\r\n        // try looking for a polyline instead\r\n        x = getClosestOpenGeom(point);\r\n    }\r\n    if (x != -1) {\r\n        int key = getShapeRefFromIndex(x)->first;\r\n        if (m_displayed_attribute == -1) {\r\n            val = static_cast<float>(key);\r\n        } else {\r\n            auto &row = m_attributes->getRow(AttributeKey(key));\r\n            val = row.getValue(m_displayed_attribute);\r\n        }\r\n    }\r\n    return (x == -1) ? -2.0 : val; // -2.0 is returned when point cannot be associated with a poly\r\n}\r\n\r\nconst std::map<int, SalaShape> ShapeMap::getShapesInRegion(const QtRegion &r) const {\r\n\r\n    std::map<int, SalaShape> shapesInRegion;\r\n\r\n    if (r.bottom_left == r.top_right) {\r\n        // note: uses index not key\r\n        int index = pointInPoly(r.bottom_left);\r\n        if (index == -1) {\r\n            // try looking for a polyline instead\r\n            index = getClosestOpenGeom(r.bottom_left);\r\n        }\r\n        if (index != -1) {\r\n            shapesInRegion.insert(*getShapeRefFromIndex(index));\r\n        }\r\n    } else {\r\n        PixelRef bl = pixelate(r.bottom_left);\r\n        PixelRef tr = pixelate(r.top_right);\r\n        for (int i = bl.x; i <= tr.x; i++) {\r\n            for (int j = bl.y; j <= tr.y; j++) {\r\n                const std::vector<ShapeRef> &shapeRefs =\r\n                    m_pixel_shapes(static_cast<size_t>(j), static_cast<size_t>(i));\r\n                for (const ShapeRef &shapeRef : shapeRefs) {\r\n                    // relies on indices of shapes and attributes being aligned\r\n                    auto shape = m_shapes.find(shapeRef.m_shape_ref);\r\n                    if(shape != m_shapes.end()) {\r\n                        shapesInRegion.insert(*shape);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return shapesInRegion;\r\n}\r\n\r\nbool ShapeMap::setCurSel(QtRegion &r, bool add) {\r\n    if (add == false) {\r\n        clearSel();\r\n    }\r\n\r\n    std::map<int, SalaShape> shapesInRegion = getShapesInRegion(r);\r\n    for (auto shape: shapesInRegion) {\r\n        shape.second.m_selected = true;\r\n        if (m_selection_set.insert(shape.first).second) {\r\n            auto &row = m_attributes->getRow(AttributeKey(shape.first));\r\n            row.setSelection(true);\r\n        }\r\n    }\r\n\r\n    return !shapesInRegion.empty();\r\n}\r\n\r\n// this version is used by setSelSet in MetaGraph, ultimately called from CTableView and PlotView\r\nbool ShapeMap::setCurSel(const std::vector<int> &selset, bool add) {\r\n    // note: override cursel, can only be used with analysed pointdata:\r\n    if (!add) {\r\n        clearSel();\r\n    }\r\n    for (int shapeRef : selset) {\r\n        if (m_selection_set.insert(shapeRef).second) {\r\n            auto &row = m_attributes->getRow(AttributeKey(shapeRef));\r\n            row.setSelection(true);\r\n        }\r\n        m_shapes.at(shapeRef).m_selected = true;\r\n    }\r\n    return !m_selection_set.empty();\r\n}\r\n\r\n// this version is used when setting a selection set via the scripting language\r\nbool ShapeMap::setCurSelDirect(const std::vector<int> &selset, bool add) {\r\n    // note: override cursel, can only be used with analysed pointdata:\r\n    if (!add) {\r\n        clearSel();\r\n    }\r\n    for (int shapeRef : selset) {\r\n        if (m_selection_set.insert(shapeRef).second) {\r\n            auto &row = m_attributes->getRow(AttributeKey(shapeRef));\r\n            row.setSelection(true);\r\n        }\r\n        m_shapes.at(shapeRef).m_selected = true;\r\n    }\r\n    return !m_selection_set.empty();\r\n}\r\n\r\nfloat ShapeMap::getDisplayedSelectedAvg() { return (m_attributes->getSelAvg(m_displayed_attribute)); }\r\n\r\nbool ShapeMap::clearSel() {\r\n    // note, only clear if need be, as m_attributes->deselectAll is slow\r\n    if (m_selection_set.size()) {\r\n        m_attributes->deselectAllRows();\r\n        for (auto &shapeRef : m_selection_set) {\r\n            m_shapes.at(shapeRef).m_selected = false;\r\n        }\r\n        m_selection_set.clear();\r\n    }\r\n    return true;\r\n}\r\n\r\nQtRegion ShapeMap::getSelBounds() {\r\n    QtRegion r;\r\n    if (m_selection_set.size()) {\r\n        for (auto &shapeRef : m_selection_set) {\r\n            r = runion(r, m_shapes.at(shapeRef).getBoundingBox());\r\n        }\r\n    }\r\n    return r;\r\n}\r\n\r\nbool ShapeMap::selectionToLayer(const std::string &name) {\r\n    bool retvar = false;\r\n    if (m_selection_set.size()) {\r\n        dXreimpl::pushSelectionToLayer(*m_attributes, m_layers, name);\r\n        retvar = m_layers.isLayerVisible(m_layers.getLayerIndex(name));\r\n        if (retvar) {\r\n            clearSel();\r\n        }\r\n    }\r\n    return retvar;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::read(std::istream &stream) {\r\n    // turn off selection / editable etc\r\n    m_editable = false;\r\n    m_show = true; // <- by default show\r\n    m_map_type = ShapeMap::EMPTYMAP;\r\n\r\n    // clear old BSP tree (if exists)\r\n    m_bsp_tree = false;\r\n    m_bsp_root = NULL;\r\n\r\n    // clear old:\r\n    m_display_shapes.clear();\r\n    m_shapes.clear();\r\n    m_attributes->clear();\r\n    m_connectors.clear();\r\n    m_links.clear();\r\n    m_unlinks.clear();\r\n    m_undobuffer.clear();\r\n\r\n    // name\r\n    m_name = dXstring::readString(stream);\r\n\r\n    stream.read((char *)&m_map_type, sizeof(m_map_type));\r\n\r\n    stream.read((char *)&m_show, sizeof(m_show));\r\n    stream.read((char *)&m_editable, sizeof(m_editable));\r\n\r\n    // PixelBase read\r\n    // read extents:\r\n    stream.read((char *)&m_region, sizeof(m_region));\r\n    // read rows / cols\r\n    int rows, cols;\r\n    stream.read(reinterpret_cast<char *>(&rows), sizeof(rows));\r\n    stream.read(reinterpret_cast<char *>(&cols), sizeof(cols));\r\n    m_rows = static_cast<size_t>(rows);\r\n    m_cols = static_cast<size_t>(cols);\r\n    // calculate geom data:\r\n    m_tolerance = __max(m_region.width(), m_region.height()) * TOLERANCE_A;\r\n\r\n    // read next object ref to be used:\r\n    stream.read((char *)&m_obj_ref, sizeof(m_obj_ref));\r\n    int depr_int;\r\n    stream.read((char *)&depr_int, sizeof(depr_int));\r\n\r\n    // read shape data\r\n    int count = 0;\r\n    stream.read((char *)&count, sizeof(count));\r\n    for (int j = 0; j < count; j++) {\r\n        int key;\r\n        stream.read((char *)&key, sizeof(key));\r\n        auto iter = m_shapes.insert(std::make_pair(key, SalaShape())).first;\r\n        iter->second.read(stream);\r\n    }\r\n\r\n    // read object data (currently unused)\r\n    // PK: As the above comment (and others regarding the m_objects\r\n    // functionality) suggest, these are no longer used so they can\r\n    // just be skipped if ever found\r\n    stream.read((char *)&count, sizeof(count));\r\n    for (int k = 0; k < count; k++) {\r\n        int key;\r\n        stream.read((char *)&key, sizeof(key));\r\n        unsigned int size;\r\n        stream.read((char *)&size, sizeof(size));\r\n        stream.ignore(sizeof(int) * std::streamsize(size));\r\n    }\r\n    // read attribute data\r\n    m_attributes->read(stream, m_layers);\r\n    stream.read((char *)&m_displayed_attribute, sizeof(m_displayed_attribute));\r\n\r\n    if (int(m_displayed_attribute) >= 0) {\r\n        std::vector<size_t> indices(m_attributes->getNumColumns());\r\n        std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\r\n\r\n        std::sort(indices.begin(), indices.end(),\r\n                  [&](size_t a, size_t b) { return m_attributes->getColumnName(a) < m_attributes->getColumnName(b); });\r\n        m_displayed_attribute = indices[m_displayed_attribute];\r\n    }\r\n\r\n    // prepare pixel map:\r\n    m_pixel_shapes = depthmapX::ColumnMatrix<std::vector<ShapeRef>>(m_rows, m_cols);\r\n    // Now add the pixel shapes pixel map:\r\n    // pixelate all polys in the pixel structure:\r\n    for (auto shape : m_shapes) {\r\n        makePolyPixels(shape.first);\r\n    }\r\n\r\n    // shape connections:\r\n    count = 0;\r\n    stream.read((char *)&count, sizeof(count));\r\n    for (int i = 0; i < count; i++) {\r\n        m_connectors.push_back(Connector());\r\n        m_connectors[size_t(i)].read(stream);\r\n    }\r\n    dXreadwrite::readIntoVector(stream, m_links);\r\n    dXreadwrite::readIntoVector(stream, m_unlinks);\r\n\r\n    // some miscellaneous extra data for mapinfo files\r\n    m_hasMapInfoData = false;\r\n    char x = stream.get();\r\n    if (x == 'm') {\r\n        m_mapinfodata = MapInfoData();\r\n        m_mapinfodata.read(stream);\r\n        m_hasMapInfoData = true;\r\n    }\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(m_displayed_attribute);\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::write(std::ofstream &stream) {\r\n    // name\r\n    dXstring::writeString(stream, m_name);\r\n\r\n    stream.write((char *)&m_map_type, sizeof(m_map_type));\r\n    stream.write((char *)&m_show, sizeof(m_show));\r\n    stream.write((char *)&m_editable, sizeof(m_editable));\r\n\r\n    // PixelBase write\r\n    // write extents:\r\n    stream.write((char *)&m_region, sizeof(m_region));\r\n    // write rows / cols\r\n    int rows = static_cast<int>(m_rows);\r\n    int cols = static_cast<int>(m_cols);\r\n    stream.write(reinterpret_cast<char *>(&rows), sizeof(rows));\r\n    stream.write(reinterpret_cast<char *>(&cols), sizeof(cols));\r\n\r\n    // write next object ref to be used:\r\n    stream.write((char *)&m_obj_ref, sizeof(m_obj_ref));\r\n\r\n    // left here for backwards-compatibility\r\n    // TODO: Remove at next iteration of the .graph file format\r\n    int largest_shape_ref = m_shapes.empty() ? -1 : m_shapes.rbegin()->first;\r\n    stream.write((char *)&largest_shape_ref, sizeof(largest_shape_ref));\r\n\r\n    // write shape data\r\n    int count = m_shapes.size();\r\n    stream.write((char *)&count, sizeof(count));\r\n    for (auto shape : m_shapes) {\r\n        int key = shape.first;\r\n        stream.write((char *)&key, sizeof(key));\r\n        shape.second.write(stream);\r\n    }\r\n    // write object data (currently unused)\r\n    count = 0;\r\n    stream.write((char *)&count, sizeof(count));\r\n\r\n    // write attribute data\r\n    m_attributes->write(stream, m_layers);\r\n\r\n    // TODO: Compatibility. The attribute columns will be stored sorted alphabetically\r\n    // so the displayed attribute needs to match that\r\n    int sortedDisplayedAttribute = m_attributes->getColumnSortedIndex(m_displayed_attribute);\r\n    stream.write((char *)&sortedDisplayedAttribute, sizeof(sortedDisplayedAttribute));\r\n\r\n    // write connections data\r\n    count = m_connectors.size();\r\n    stream.write((char *)&count, sizeof(count));\r\n\r\n    for (int i = 0; i < count; i++) {\r\n        m_connectors[i].write(stream);\r\n    }\r\n    dXreadwrite::writeVector(stream, m_links);\r\n    dXreadwrite::writeVector(stream, m_unlinks);\r\n\r\n    // some miscellaneous extra data for mapinfo files\r\n    if (m_hasMapInfoData) {\r\n        stream.put('m');\r\n        m_mapinfodata.write(stream);\r\n    } else {\r\n        stream.put('x');\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::output(std::ofstream &stream, char delimiter) {\r\n    stream << \"Ref\";\r\n    if ((m_map_type & LINEMAP) == 0) {\r\n        stream << delimiter << \"cx\" << delimiter << \"cy\";\r\n    } else {\r\n        stream << delimiter << \"x1\" << delimiter << \"y1\" << delimiter << \"x2\" << delimiter << \"y2\";\r\n    }\r\n\r\n    // TODO: For compatibility write the columns in alphabetical order\r\n    // but the physical columns in the order inserted\r\n\r\n    std::vector<size_t> indices(m_attributes->getNumColumns());\r\n    std::iota(indices.begin(), indices.end(), static_cast<size_t>(0));\r\n\r\n    std::sort(indices.begin(), indices.end(),\r\n              [&](size_t a, size_t b) { return m_attributes->getColumnName(a) < m_attributes->getColumnName(b); });\r\n    for (int idx : indices) {\r\n        stream << delimiter << m_attributes->getColumnName(idx);\r\n    }\r\n\r\n    stream << std::endl;\r\n\r\n    for (auto iter = m_attributes->begin(); iter != m_attributes->end(); iter++) {\r\n        int key = iter->getKey().value;\r\n        if (isObjectVisible(m_layers, iter->getRow())) {\r\n            stream << key;\r\n            auto shape = m_shapes[key];\r\n            if ((m_map_type & LINEMAP) == 0) {\r\n                stream << delimiter << shape.m_centroid.x << delimiter << shape.m_centroid.y;\r\n            } else {\r\n                stream.precision(12); // TODO: Here for compatibility with old version\r\n                const Line &li = shape.getLine();\r\n                stream << delimiter << li.start().x << delimiter << li.start().y << delimiter << li.end().x\r\n                       << delimiter << li.end().y;\r\n            }\r\n            stream.precision(8); // TODO: Here for compatibility with old version\r\n            for (int idx : indices) {\r\n                stream << delimiter << iter->getRow().getValue(idx);\r\n            }\r\n            stream << std::endl;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::importPoints(const std::vector<Point2f> &points, const depthmapX::Table &data) {\r\n    // assumes that points and data come in the same order\r\n\r\n    std::vector<int> shape_refs;\r\n\r\n    for (auto &point : points) {\r\n        shape_refs.push_back(makePointShape(point));\r\n    }\r\n\r\n    bool dataImported = importData(data, shape_refs);\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(-1);\r\n\r\n    return dataImported;\r\n}\r\n\r\nbool ShapeMap::importPointsWithRefs(const std::map<int, Point2f> &points, const depthmapX::Table &data) {\r\n    // assumes that points and data come in the same order\r\n\r\n    std::vector<int> shape_refs;\r\n\r\n    for (auto &point : points) {\r\n        shape_refs.push_back(makePointShapeWithRef(point.second, point.first));\r\n    }\r\n\r\n    bool dataImported = importData(data, shape_refs);\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(-1);\r\n\r\n    return dataImported;\r\n}\r\n\r\nbool ShapeMap::importLines(const std::vector<Line> &lines, const depthmapX::Table &data) {\r\n    // assumes that lines and data come in the same order\r\n\r\n    std::vector<int> shape_refs;\r\n\r\n    for (auto &line : lines) {\r\n        shape_refs.push_back(makeLineShape(line));\r\n    }\r\n\r\n    bool dataImported = importData(data, shape_refs);\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(-1);\r\n\r\n    return dataImported;\r\n}\r\n\r\nbool ShapeMap::importLinesWithRefs(const std::map<int, Line> &lines, const depthmapX::Table &data) {\r\n    // assumes that lines and data come in the same order\r\n\r\n    std::vector<int> shape_refs;\r\n\r\n    for (auto &line : lines) {\r\n        shape_refs.push_back(makeLineShapeWithRef(line.second, line.first));\r\n    }\r\n\r\n    bool dataImported = importData(data, shape_refs);\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(-1);\r\n\r\n    return dataImported;\r\n}\r\n\r\nbool ShapeMap::importPolylines(const std::vector<depthmapX::Polyline> &polylines, const depthmapX::Table &data) {\r\n    // assumes that lines and data come in the same order\r\n\r\n    std::vector<int> shape_refs;\r\n\r\n    for (auto &polyline : polylines) {\r\n        shape_refs.push_back(makePolyShape(polyline.m_vertices, !polyline.m_closed));\r\n    }\r\n\r\n    bool dataImported = importData(data, shape_refs);\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(-1);\r\n\r\n    return dataImported;\r\n}\r\n\r\nbool ShapeMap::importPolylinesWithRefs(const std::map<int, depthmapX::Polyline> &polylines,\r\n                                       const depthmapX::Table &data) {\r\n    // assumes that lines and data come in the same order\r\n\r\n    std::vector<int> shape_refs;\r\n\r\n    for (auto &polyline : polylines) {\r\n        shape_refs.push_back(\r\n            makePolyShapeWithRef(polyline.second.m_vertices, !polyline.second.m_closed, polyline.first));\r\n    }\r\n\r\n    bool dataImported = importData(data, shape_refs);\r\n\r\n    invalidateDisplayedAttribute();\r\n    setDisplayedAttribute(-1);\r\n\r\n    return dataImported;\r\n}\r\n\r\nbool ShapeMap::importData(const depthmapX::Table &data, std::vector<int> shape_refs) {\r\n    for (auto &column : data) {\r\n        std::string colName = column.first;\r\n        std::replace(colName.begin(), colName.end(), '_', ' ');\r\n        dXstring::makeInitCaps(colName);\r\n\r\n        if (colName.empty())\r\n            continue;\r\n\r\n        int colIndex = m_attributes->insertOrResetColumn(colName);\r\n\r\n        if (colIndex == -1) {\r\n            // error adding column (e.g., duplicate column names)\r\n            continue;\r\n        }\r\n\r\n        std::unordered_map<std::string, size_t> colcodes;\r\n\r\n        for (size_t i = 0; i < column.second.size(); i++) {\r\n            std::string cellValue = column.second[i];\r\n            double value = 0;\r\n            if (dXstring::isDouble(cellValue)) {\r\n                value = stod(cellValue);\r\n            } else {\r\n                std::unordered_map<std::string, size_t>::iterator cellAt = colcodes.find(cellValue);\r\n                if (cellAt == colcodes.end()) {\r\n\r\n                    // TODO:\r\n                    // It seems that the original intention here was that if we are past 32 unique\r\n                    // values, we should stop trying to make the column categorical and fill the rest\r\n                    // of the values with -1.0f. It's not possible to test the original implementation\r\n                    // because the app crashes if we load a file with more than 32 unique values. When\r\n                    // and if we have a robust implementation of an attribute table that allows for\r\n                    // both categorical and plain string attributes this should be re-examined for a\r\n                    // better way to classify the column as either. Meanwhile after this threshold (32)\r\n                    // we set the whole column to -1 so that it does not give the impression it worked\r\n                    // when it's actually half-baked\r\n\r\n                    if (colcodes.size() >= 32) {\r\n                        for (size_t j = 0; j < column.second.size(); j++) {\r\n                            m_attributes->getRow(AttributeKey(shape_refs[j])).setValue(colIndex, -1.0f);\r\n                        }\r\n                        continue;\r\n                    } else {\r\n                        value = colcodes.size();\r\n                        colcodes.insert(std::make_pair(cellValue, colcodes.size()));\r\n                    }\r\n                } else {\r\n                    value = cellAt->second;\r\n                }\r\n            }\r\n            m_attributes->getRow(AttributeKey(shape_refs[i])).setValue(colIndex, value);\r\n        }\r\n    }\r\n    return true;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////\r\n\r\nvoid ShapeMap::setDisplayedAttribute(int col) {\r\n    if (!m_invalidate && m_displayed_attribute == col) {\r\n        return;\r\n    }\r\n    m_displayed_attribute = col;\r\n    m_invalidate = true;\r\n\r\n    // always override at this stage:\r\n    m_attribHandle->setDisplayColIndex(m_displayed_attribute);\r\n\r\n    m_invalidate = false;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////////////\r\n\r\n// this is all very similar to spacepixel, apart from a few minor details\r\n\r\nvoid ShapeMap::makeViewportShapes(const QtRegion &viewport) const {\r\n    if (m_invalidate) {\r\n        return;\r\n    }\r\n\r\n    if (m_display_shapes.empty() || m_newshape) {\r\n        m_display_shapes.assign(m_shapes.size(), -1);\r\n        m_newshape = false;\r\n    }\r\n\r\n    m_current = -1; // note: findNext expects first to be labelled -1\r\n\r\n    PixelRef bl = pixelate(viewport.bottom_left);\r\n    PixelRef tr = pixelate(viewport.top_right);\r\n\r\n    for (int i = bl.x; i <= tr.x; i++) {\r\n        for (int j = bl.y; j <= tr.y; j++) {\r\n            const std::vector<ShapeRef> &shapeRefs = m_pixel_shapes(static_cast<size_t>(j), static_cast<size_t>(i));\r\n            for (const ShapeRef &shape : shapeRefs) {\r\n                // copy the index to the correct draworder position (draworder is formatted on display attribute)\r\n                int x = std::distance(m_shapes.begin(), m_shapes.find(shape.m_shape_ref));\r\n                AttributeKey shapeRefKey(shape.m_shape_ref);\r\n                if (isObjectVisible(m_layers, m_attributes->getRow(shapeRefKey))) {\r\n                    m_display_shapes[m_attribHandle->findInIndex(shapeRefKey)] = x;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    m_curlinkline = -1;\r\n    m_curunlinkpoint = -1;\r\n}\r\n\r\nbool ShapeMap::findNextShape(bool &nextlayer) const {\r\n    // note: will not work immediately after a new poly has been added: makeViewportShapes first\r\n    if (m_invalidate || m_newshape) {\r\n        return false;\r\n    }\r\n\r\n    while (++m_current < (int)m_shapes.size() && m_display_shapes[m_current] == -1)\r\n        ;\r\n\r\n    if (m_current < (int)m_shapes.size()) {\r\n        return true;\r\n    } else {\r\n        m_current = (int)m_shapes.size();\r\n        nextlayer = true;\r\n        return false;\r\n    }\r\n}\r\n\r\nconst SalaShape &ShapeMap::getNextShape() const {\r\n    int x = m_display_shapes[m_current]; // x has display order in it\r\n    m_display_shapes[m_current] = -1;    // you've drawn it\r\n    return depthmapX::getMapAtIndex(m_shapes, x)->second;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\nstd::vector<SalaEdgeU> SalaShape::getClippingSet(QtRegion &clipframe) const {\r\n    std::vector<SalaEdgeU> edgeset;\r\n    bool last_inside = (clipframe.contains_touch(m_points[0])) ? true : false;\r\n    bool found_inside = last_inside;\r\n    for (size_t i = 1; i < m_points.size(); i++) {\r\n        bool next_inside = (clipframe.contains_touch(m_points[i])) ? true : false;\r\n        found_inside |= next_inside;\r\n        if (last_inside != next_inside) {\r\n            if (last_inside) {\r\n                EdgeU eu = clipframe.getCutEdgeU(m_points[i - 1], m_points[i]);\r\n                edgeset.push_back(SalaEdgeU(i, false, eu));\r\n            } else {\r\n                EdgeU eu = clipframe.getCutEdgeU(m_points[i], m_points[i - 1]);\r\n                edgeset.push_back(SalaEdgeU(i - 1, true, eu));\r\n            }\r\n        }\r\n        last_inside = next_inside;\r\n    }\r\n    if (!found_inside) {\r\n        // note: deliberately add a single empty SalaEdgeU if this polygon is never inside the frame\r\n        edgeset.push_back(SalaEdgeU());\r\n    }\r\n    return edgeset;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\n// copied from SpacePixel\r\n\r\nPixelRef ShapeMap::pixelate(const Point2f &p, bool constrain, int) const {\r\n    PixelRef r;\r\n\r\n    Point2f p1 = p;\r\n    p1.normalScale(m_region);\r\n\r\n    if (constrain) {\r\n        if (p1.x <= 0.0) {\r\n            r.x = 0;\r\n        } else if (p1.x >= 1.0) {\r\n            r.x = m_cols - 1;\r\n        } else {\r\n            r.x = short(floor(p1.x * m_cols));\r\n        }\r\n    } else {\r\n        r.x = short(floor(p1.x * m_cols));\r\n    }\r\n\r\n    if (constrain) {\r\n        if (p1.y <= 0.0) {\r\n            r.y = 0;\r\n        } else if (p1.y >= 1.0) {\r\n            r.y = m_rows - 1;\r\n        } else {\r\n            r.y = short(floor(p1.y * m_rows));\r\n        }\r\n    } else {\r\n        r.y = short(floor(p1.y * m_rows));\r\n    }\r\n\r\n    return r;\r\n}\r\n\r\nvoid ShapeMap::copyMapInfoBaseData(const ShapeMap &sourceMap) {\r\n    m_mapinfodata = MapInfoData();\r\n    m_mapinfodata.m_coordsys = sourceMap.getMapInfoData().m_coordsys;\r\n    m_mapinfodata.m_bounds = sourceMap.getMapInfoData().m_bounds;\r\n    m_hasMapInfoData = true;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////\r\n\r\nint ShapeMap::loadMifMap(std::istream &miffile, std::istream &midfile) {\r\n    m_mapinfodata = MapInfoData();\r\n    int retvar = m_mapinfodata.import(miffile, midfile, *this);\r\n    if (retvar == MINFO_OK)\r\n        m_hasMapInfoData = true;\r\n    return retvar;\r\n}\r\n\r\n///////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::outputMifMap(std::ostream &miffile, std::ostream &midfile) {\r\n    if (!m_hasMapInfoData) {\r\n        MapInfoData mapinfodata;\r\n        mapinfodata.exportFile(miffile, midfile, *this);\r\n    } else {\r\n        m_mapinfodata.exportFile(miffile, midfile, *this);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// Code for explicit linking / unlinking\r\n\r\nbool ShapeMap::linkShapes(const Point2f &p) {\r\n    if (m_selection_set.size() != 1) {\r\n        return false;\r\n    }\r\n    int index1 = std::distance(m_shapes.begin(), m_shapes.find(*m_selection_set.begin()));\r\n    // note: uses rowid not key\r\n    int index2 = pointInPoly(p);\r\n    if (index2 == -1) {\r\n        // try looking for a polyline instead\r\n        index2 = getClosestOpenGeom(p);\r\n    }\r\n    if (index2 == -1) {\r\n        return false;\r\n    }\r\n    clearSel();\r\n\r\n    linkShapes(index1, index2);\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::linkShapesFromRefs(int ref1, int ref2, bool refresh) {\r\n    int index1 = depthmapX::findIndexFromKey(m_shapes, ref1);\r\n    int index2 = depthmapX::findIndexFromKey(m_shapes, ref2);\r\n    return linkShapes(index1, index2, refresh);\r\n}\r\n\r\nbool ShapeMap::linkShapes(int index1, int index2, bool refresh) {\r\n    int conn_col = m_attributes->getOrInsertLockedColumn(\"Connectivity\");\r\n    bool update = false;\r\n\r\n    if (index1 != index2) {\r\n        // link these lines...\r\n        // first look for explicit unlinks and clear\r\n        OrderedIntPair link(index1, index2);\r\n        auto unlinkiter = std::find(m_unlinks.begin(), m_unlinks.end(), link);\r\n        if (unlinkiter != m_unlinks.end()) {\r\n            m_unlinks.erase(unlinkiter);\r\n            update = true;\r\n        } else {\r\n            // then check not linked already\r\n            auto &connections1 = m_connectors[size_t(index1)].m_connections;\r\n            auto &connections2 = m_connectors[size_t(index2)].m_connections;\r\n            auto linkIter1 = std::find(connections1.begin(), connections1.end(), index2);\r\n            auto linkIter2 = std::find(connections2.begin(), connections2.end(), index1);\r\n            if (linkIter1 == connections1.end() && linkIter2 == connections2.end()) {\r\n                // finally, link the two lines\r\n                depthmapX::addIfNotExists(m_links, link);\r\n                update = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (update) {\r\n        depthmapX::insert_sorted(m_connectors[size_t(index1)].m_connections, index2);\r\n        depthmapX::insert_sorted(m_connectors[size_t(index2)].m_connections, index1);\r\n        auto &row1 = getAttributeRowFromShapeIndex(index1);\r\n        auto &row2 = getAttributeRowFromShapeIndex(index2);\r\n        row1.incrValue(conn_col);\r\n        row2.incrValue(conn_col);\r\n        if (refresh && getDisplayedAttribute() == conn_col) {\r\n            invalidateDisplayedAttribute();\r\n            setDisplayedAttribute(conn_col); // <- reflect changes to connectivity counts\r\n        }\r\n    }\r\n\r\n    return update;\r\n}\r\n\r\n// this version is used to link segments in segment analysis\r\n// note it only links one way!\r\nbool ShapeMap::linkShapes(int id1, int dir1, int id2, int dir2, float weight) {\r\n    bool success = false;\r\n    Connector &connector = m_connectors[size_t(id1)];\r\n    if (dir1 == 1) {\r\n        success = depthmapX::addIfNotExists(connector.m_forward_segconns, SegmentRef(dir2, id2), weight);\r\n    } else {\r\n        success = depthmapX::addIfNotExists(connector.m_back_segconns, SegmentRef(dir2, id2), weight);\r\n    }\r\n\r\n    // checking success != -1 avoids duplicate entries adding to connectivity\r\n    if (success) {\r\n        int conn_col = m_attributes->getOrInsertLockedColumn(\"Connectivity\");\r\n        auto &row = getAttributeRowFromShapeIndex(id1);\r\n        row.incrValue(conn_col);\r\n        int weight_col = m_attributes->getOrInsertLockedColumn(\"Weighted Connectivity\");\r\n        row.incrValue(weight_col, weight);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::unlinkShapes(const Point2f &p) {\r\n    if (m_selection_set.size() != 1) {\r\n        return false;\r\n    }\r\n    int index1 = std::distance(m_shapes.begin(), m_shapes.find(*m_selection_set.begin()));\r\n    int index2 = pointInPoly(p);\r\n    if (index2 == -1) {\r\n        // try looking for a polyline instead\r\n        index2 = getClosestOpenGeom(p);\r\n    }\r\n    if (index2 == -1) {\r\n        return false;\r\n    }\r\n    clearSel();\r\n\r\n    unlinkShapes(index1, index2);\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::unlinkShapesFromRefs(int ref1, int ref2, bool refresh) {\r\n    int index1 = depthmapX::findIndexFromKey(m_shapes, ref1);\r\n    int index2 = depthmapX::findIndexFromKey(m_shapes, ref2);\r\n    return unlinkShapes(index1, index2, refresh);\r\n}\r\n\r\n// note: uses rowids rather than shape key\r\nbool ShapeMap::unlinkShapes(int index1, int index2, bool refresh) {\r\n    int conn_col = m_attributes->getColumnIndex(\"Connectivity\");\r\n    bool update = false;\r\n\r\n    if (index1 != index2) {\r\n        // unlink these shapes...\r\n        // first look for explicit links and clear\r\n        OrderedIntPair unlink(index1, index2);\r\n        auto linkiter = std::find(m_links.begin(), m_links.end(), unlink);\r\n        if (linkiter != m_links.end()) {\r\n            m_links.erase(linkiter);\r\n            update = true;\r\n        } else {\r\n            // then check if linked already\r\n            auto &connections1 = m_connectors[size_t(index1)].m_connections;\r\n            auto &connections2 = m_connectors[size_t(index2)].m_connections;\r\n            auto linkIter1 = std::find(connections1.begin(), connections1.end(), index2);\r\n            auto linkIter2 = std::find(connections2.begin(), connections2.end(), index1);\r\n            if (linkIter1 != connections1.end() && linkIter2 != connections2.end()) {\r\n                // finally, unlink the two shapes\r\n                depthmapX::addIfNotExists(m_unlinks, unlink);\r\n                update = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (update && conn_col != -1) {\r\n        depthmapX::findAndErase(m_connectors[size_t(index1)].m_connections, index2);\r\n        depthmapX::findAndErase(m_connectors[size_t(index2)].m_connections, index1);\r\n        auto &row1 = getAttributeRowFromShapeIndex(index1);\r\n        auto &row2 = getAttributeRowFromShapeIndex(index2);\r\n        row1.incrValue(conn_col, -1.0f);\r\n        row2.incrValue(conn_col, -1.0f);\r\n        if (refresh && getDisplayedAttribute() == conn_col) {\r\n            invalidateDisplayedAttribute();\r\n            setDisplayedAttribute(conn_col); // <- reflect changes to connectivity counts\r\n        }\r\n    }\r\n    return update;\r\n}\r\n\r\nbool ShapeMap::unlinkShapesByKey(int key1, int key2, bool refresh) {\r\n    int conn_col = m_attributes->getColumnIndex(\"Connectivity\");\r\n    bool update = false;\r\n\r\n    int index1 = std::distance(m_shapes.begin(), m_shapes.find(key1));\r\n    int index2 = std::distance(m_shapes.begin(), m_shapes.find(key2));\r\n\r\n    if (key1 != key2) {\r\n        // unlink these shapes...\r\n        // first look for explicit links and clear\r\n        OrderedIntPair unlink(index1, index2);\r\n        auto linkiter = std::find(m_links.begin(), m_links.end(), unlink);\r\n        if (linkiter != m_links.end()) {\r\n            m_links.erase(linkiter);\r\n            update = true;\r\n        } else {\r\n            // then check if linked already\r\n            auto &connections1 = m_connectors[size_t(index1)].m_connections;\r\n            auto &connections2 = m_connectors[size_t(index2)].m_connections;\r\n            auto linkIter1 = std::find(connections1.begin(), connections1.end(), index2);\r\n            auto linkIter2 = std::find(connections2.begin(), connections2.end(), index1);\r\n            if (linkIter1 != connections1.end() && linkIter2 != connections2.end()) {\r\n                // finally, unlink the two shapes\r\n                depthmapX::addIfNotExists(m_unlinks, unlink);\r\n                update = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (update && conn_col != -1) {\r\n        depthmapX::findAndErase(m_connectors[size_t(index1)].m_connections, index2);\r\n        depthmapX::findAndErase(m_connectors[size_t(index2)].m_connections, index1);\r\n        auto &row1 = m_attributes->getRow(AttributeKey(key1));\r\n        auto &row2 = m_attributes->getRow(AttributeKey(key1));\r\n        row1.incrValue(conn_col, -1.0f);\r\n        row2.incrValue(conn_col, -1.0f);\r\n        if (refresh && getDisplayedAttribute() == conn_col) {\r\n            invalidateDisplayedAttribute();\r\n            setDisplayedAttribute(conn_col); // <- reflect changes to connectivity counts\r\n        }\r\n    }\r\n    return update;\r\n}\r\n\r\nbool ShapeMap::clearLinks() {\r\n    for (size_t i = 0; i < m_unlinks.size(); i++) {\r\n        OrderedIntPair link = m_unlinks[i];\r\n        depthmapX::insert_sorted(m_connectors[size_t(link.a)].m_connections, link.b);\r\n        depthmapX::insert_sorted(m_connectors[size_t(link.b)].m_connections, link.a);\r\n    }\r\n    m_unlinks.clear();\r\n\r\n    for (size_t j = 0; j < m_links.size(); j++) {\r\n        OrderedIntPair link = m_links[j];\r\n        depthmapX::findAndErase(m_connectors[size_t(link.a)].m_connections, link.b);\r\n        depthmapX::findAndErase(m_connectors[size_t(link.b)].m_connections, link.a);\r\n    }\r\n    m_links.clear();\r\n\r\n    return true;\r\n}\r\n\r\nbool ShapeMap::unlinkShapeSet(std::istream &idset, int refcol) {\r\n    std::string line;\r\n    std::vector<std::pair<int, int>> unlinks;\r\n    do {\r\n        std::pair<int, int> unlink;\r\n        dXstring::safeGetline(idset, line);\r\n        if (!line.empty()) {\r\n            auto tokens = dXstring::split(line, '\\t');\r\n            if (tokens.size() < 2) {\r\n                return false;\r\n            }\r\n            try {\r\n                unlink.first = stoi(tokens[0]);\r\n                unlink.second = stoi(tokens[1]);\r\n                unlinks.push_back(unlink);\r\n            } catch (const std::invalid_argument) {\r\n                ;\r\n            } catch (const std::out_of_range) {\r\n                ;\r\n            } // don't do anything if it can't parse the numbers, just ignore (e.g., first line)\r\n        }\r\n    } while (!idset.eof());\r\n\r\n    if (refcol != -1) {\r\n        // not using the standard \"Ref\", find the proper key\r\n        std::vector<AttributeIndexItem> idx =\r\n            refcol != -1 ? makeAttributeIndex(*m_attributes, refcol) : std::vector<AttributeIndexItem>();\r\n\r\n        AttributeKey dummykey(-1);\r\n        AttributeRowImpl dummyrow(*m_attributes);\r\n\r\n        for (size_t i = 0; i < unlinks.size(); i++) {\r\n            auto iter = depthmapX::findBinary(idx, AttributeIndexItem(dummykey, unlinks[i].first, dummyrow));\r\n            unlinks[i].first = (iter == idx.end()) ? -1 : iter->key.value;\r\n            iter = depthmapX::findBinary(idx, AttributeIndexItem(dummykey, unlinks[i].second, dummyrow));\r\n            unlinks[i].second = (iter == idx.end()) ? -1 : iter->key.value;\r\n        }\r\n    }\r\n    for (size_t i = 0; i < unlinks.size(); i++) {\r\n        unlinkShapesByKey(unlinks[i].first, unlinks[i].second, false);\r\n    }\r\n\r\n    int conn_col = m_attributes->getColumnIndex(\"Connectivity\");\r\n    if (getDisplayedAttribute() == conn_col) {\r\n        invalidateDisplayedAttribute();\r\n        setDisplayedAttribute(conn_col); // <- reflect changes to connectivity counts\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::findNextLinkLine() const {\r\n    if (m_curlinkline < (int)m_links.size()) {\r\n        m_curlinkline++;\r\n    }\r\n    return (m_curlinkline < (int)m_links.size());\r\n}\r\n\r\nLine ShapeMap::getNextLinkLine() const {\r\n    // note, links are stored directly by rowid, not by key:\r\n    if (m_curlinkline < (int)m_links.size()) {\r\n        return Line(depthmapX::getMapAtIndex(m_shapes, m_links[m_curlinkline].a)->second.getCentroid(),\r\n                    depthmapX::getMapAtIndex(m_shapes, m_links[m_curlinkline].b)->second.getCentroid());\r\n    }\r\n    return Line();\r\n}\r\n\r\nstd::vector<SimpleLine> ShapeMap::getAllLinkLines() {\r\n    std::vector<SimpleLine> linkLines;\r\n    for (size_t i = 0; i < m_links.size(); i++) {\r\n        linkLines.push_back(SimpleLine(depthmapX::getMapAtIndex(m_shapes, m_links[i].a)->second.getCentroid(),\r\n                                       depthmapX::getMapAtIndex(m_shapes, m_links[i].b)->second.getCentroid()));\r\n    }\r\n    return linkLines;\r\n}\r\n\r\n// note: these functions would need slight work for arbitrary shape overlaps\r\n\r\nbool ShapeMap::findNextUnlinkPoint() const {\r\n    if (m_curunlinkpoint < (int)m_unlinks.size()) {\r\n        m_curunlinkpoint++;\r\n    }\r\n    return (m_curunlinkpoint < (int)m_unlinks.size());\r\n}\r\n\r\nPoint2f ShapeMap::getNextUnlinkPoint() const {\r\n    // note, links are stored directly by rowid, not by key:\r\n    if (m_curunlinkpoint < (int)m_unlinks.size()) {\r\n        return intersection_point(depthmapX::getMapAtIndex(m_shapes, m_unlinks[m_curunlinkpoint].a)->second.getLine(),\r\n                                  depthmapX::getMapAtIndex(m_shapes, m_unlinks[m_curunlinkpoint].b)->second.getLine(),\r\n                                  TOLERANCE_A);\r\n    }\r\n    return Point2f();\r\n}\r\nstd::vector<Point2f> ShapeMap::getAllUnlinkPoints() {\r\n    std::vector<Point2f> unlinkPoints;\r\n    for (size_t i = 0; i < m_unlinks.size(); i++) {\r\n        unlinkPoints.push_back(intersection_point(depthmapX::getMapAtIndex(m_shapes, m_unlinks[i].a)->second.getLine(),\r\n                                                  depthmapX::getMapAtIndex(m_shapes, m_unlinks[i].b)->second.getLine(),\r\n                                                  TOLERANCE_A));\r\n    }\r\n    return unlinkPoints;\r\n}\r\n\r\nvoid ShapeMap::outputUnlinkPoints(std::ofstream &stream, char delim) {\r\n    stream << \"x\" << delim << \"y\" << std::endl;\r\n\r\n    stream.precision(12);\r\n    for (size_t i = 0; i < m_unlinks.size(); i++) {\r\n        // note, links are stored directly by rowid, not by key:\r\n        Point2f p =\r\n            intersection_point(depthmapX::getMapAtIndex(m_shapes, m_unlinks[i].a)->second.getLine(),\r\n                               depthmapX::getMapAtIndex(m_shapes, m_unlinks[i].b)->second.getLine(), TOLERANCE_A);\r\n        stream << p.x << delim << p.y << std::endl;\r\n    }\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nbool ShapeMap::makeBSPtree() const {\r\n    if (m_bsp_tree) {\r\n        return true;\r\n    }\r\n\r\n    std::vector<TaggedLine> partitionlines;\r\n    for (auto shape : m_shapes) {\r\n        if (shape.second.isLine()) {\r\n            partitionlines.push_back(TaggedLine(shape.second.getLine(), shape.first));\r\n        }\r\n    }\r\n\r\n    if (partitionlines.size()) {\r\n        //\r\n        // Now we'll try the BSP tree:\r\n        //\r\n        if (m_bsp_root) {\r\n            delete m_bsp_root;\r\n            m_bsp_root = NULL;\r\n        }\r\n        m_bsp_root = new BSPNode();\r\n\r\n        BSPTree::make(NULL, 0, partitionlines, m_bsp_root);\r\n        m_bsp_tree = true;\r\n    }\r\n\r\n    partitionlines.clear();\r\n\r\n    return m_bsp_tree;\r\n}\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// SPECIALS BELOW\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nint findwinner(double *bins, int bincount, int &difficult, int &impossible) {\r\n    difficult = 0;\r\n    impossible = 0;\r\n    //\r\n    double total = 0.0;\r\n    //\r\n    double maxvalue = -1.0;\r\n    int maxbin = -1;\r\n    int i;\r\n    for (i = 0; i < bincount; i++) {\r\n        if (i == 0 || bins[i] > maxvalue) {\r\n            maxvalue = bins[i];\r\n            maxbin = i;\r\n        }\r\n        total += bins[i];\r\n    }\r\n    if (maxvalue > total * 0.8) {\r\n        return maxbin;\r\n    }\r\n    int lastwinner = maxbin;\r\n    // no immediate clear winner, so see if across two adjacent bins:\r\n    double savebin = bins[bincount - 1];\r\n    double savebins0 = bins[0];\r\n    for (i = 0; i < bincount - 1; i++) {\r\n        double lastbin = savebin;\r\n        savebin = bins[i];\r\n        bins[i] += bins[i + 1] + lastbin;\r\n    }\r\n    bins[bincount - 1] += savebins0 + savebin;\r\n\r\n    // now check again for a clear winner:\r\n    maxvalue = -1.0;\r\n    maxbin = -1;\r\n    for (i = 0; i < bincount; i++) {\r\n        if (i == 0 || bins[i] > maxvalue) {\r\n            maxvalue = bins[i];\r\n            maxbin = i;\r\n        }\r\n    }\r\n    // if it's a tie, the last winner wins it:\r\n    if (maxbin != lastwinner && maxvalue == bins[lastwinner]) {\r\n        maxbin = lastwinner;\r\n    }\r\n    //\r\n    if (maxvalue > total * 0.8) {\r\n        return maxbin;\r\n    }\r\n    //\r\n    // now it's at least hard:\r\n    if (maxvalue > total * 0.6) {\r\n        difficult = 1;\r\n        return maxbin;\r\n    }\r\n    //\r\n    // if not even this is true, it's really a guess in the dark:\r\n    impossible = 1;\r\n    return maxbin;\r\n}\r\n\r\n// Quick mod - TV\r\n#if defined(_MSC_VER)\r\n#include <windows.h>\r\n#endif\r\n\r\nstd::vector<SimpleLine> ShapeMap::getAllShapesAsLines() const {\r\n    std::vector<SimpleLine> lines;\r\n    const std::map<int, SalaShape> &allShapes = getAllShapes();\r\n    for (auto refShape : allShapes) {\r\n        SalaShape &shape = refShape.second;\r\n        if (shape.isLine()) {\r\n            lines.push_back(SimpleLine(shape.getLine()));\r\n        } else if (shape.isPolyLine() || shape.isPolygon()) {\r\n            for (size_t n = 0; n < shape.m_points.size() - 1; n++) {\r\n                lines.push_back(SimpleLine(shape.m_points[n], shape.m_points[n + 1]));\r\n            }\r\n            if (shape.isPolygon()) {\r\n                lines.push_back(SimpleLine(shape.m_points.back(), shape.m_points.front()));\r\n            }\r\n        }\r\n    }\r\n    return lines;\r\n}\r\n\r\nstd::vector<std::pair<SimpleLine, PafColor>> ShapeMap::getAllLinesWithColour() {\r\n    std::vector<std::pair<SimpleLine, PafColor>> colouredLines;\r\n    std::map<int, SalaShape> &allShapes = getAllShapes();\r\n    int k = -1;\r\n    for (auto &refShape : allShapes) {\r\n        k++;\r\n        SalaShape &shape = refShape.second;\r\n        PafColor colour(dXreimpl::getDisplayColor(AttributeKey(refShape.first),\r\n                                                  m_attributes->getRow(AttributeKey(refShape.first)),\r\n                                                  *m_attribHandle.get(), true));\r\n        if (shape.isLine()) {\r\n            colouredLines.push_back(std::pair<SimpleLine, PafColor>(SimpleLine(shape.getLine()), colour));\r\n        } else if (shape.isPolyLine()) {\r\n            for (size_t n = 0; n < shape.m_points.size() - 1; n++) {\r\n                colouredLines.push_back(\r\n                    std::pair<SimpleLine, PafColor>(SimpleLine(shape.m_points[n], shape.m_points[n + 1]), colour));\r\n            }\r\n        }\r\n    }\r\n    return colouredLines;\r\n}\r\n\r\nstd::vector<std::pair<std::vector<Point2f>, PafColor>> ShapeMap::getAllPolygonsWithColour() {\r\n    std::vector<std::pair<std::vector<Point2f>, PafColor>> colouredPolygons;\r\n    std::map<int, SalaShape> &allShapes = getAllShapes();\r\n    for (auto &refShape : allShapes) {\r\n        SalaShape &shape = refShape.second;\r\n        if (shape.isPolygon()) {\r\n            std::vector<Point2f> vertices;\r\n            for (size_t n = 0; n < shape.m_points.size(); n++) {\r\n                vertices.push_back(shape.m_points[n]);\r\n            }\r\n            vertices.push_back(shape.m_points.back());\r\n            PafColor colour(dXreimpl::getDisplayColor(AttributeKey(refShape.first),\r\n                                                      m_attributes->getRow(AttributeKey(refShape.first)),\r\n                                                      *m_attribHandle.get(), true));\r\n            colouredPolygons.push_back(std::make_pair(vertices, colour));\r\n        }\r\n    }\r\n    return colouredPolygons;\r\n}\r\n\r\nstd::vector<std::pair<Point2f, PafColor>> ShapeMap::getAllPointsWithColour() {\r\n    std::vector<std::pair<Point2f, PafColor>> colouredPoints;\r\n    std::map<int, SalaShape> &allShapes = getAllShapes();\r\n    for (auto &refShape : allShapes) {\r\n        SalaShape &shape = refShape.second;\r\n        if (shape.isPoint()) {\r\n            PafColor colour(dXreimpl::getDisplayColor(AttributeKey(refShape.first),\r\n                                                      m_attributes->getRow(AttributeKey(refShape.first)),\r\n                                                      *m_attribHandle.get(), true));\r\n            colouredPoints.push_back(std::make_pair(shape.getCentroid(), colour));\r\n        }\r\n    }\r\n    return colouredPoints;\r\n}\r\n"
  },
  {
    "path": "salalib/shapemap.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n#pragma once\r\n\r\n#include \"salalib/attributetable.h\"\r\n#include \"salalib/attributetablehelpers.h\"\r\n#include \"salalib/attributetableview.h\"\r\n#include \"salalib/connector.h\"\r\n#include \"salalib/importtypedefs.h\"\r\n#include \"salalib/layermanagerimpl.h\"\r\n#include \"salalib/parsers/mapinfodata.h\"\r\n#include \"salalib/spacepix.h\"\r\n\r\n#include \"genlib/bsptree.h\"\r\n#include \"genlib/containerutils.h\"\r\n#include \"genlib/p2dpoly.h\"\r\n#include \"genlib/readwritehelpers.h\"\r\n#include \"genlib/stringutils.h\"\r\n\r\n#include <map>\r\n#include <set>\r\n#include <string>\r\n#include <vector>\r\n\r\n// each pixel has various lists of information:\r\n\r\nstruct ShapeRef {\r\n    enum { SHAPE_REF_NULL = 0xFFFFFFFF };\r\n    enum { SHAPE_L = 0x01, SHAPE_B = 0x02, SHAPE_R = 0x04, SHAPE_T = 0x08 };\r\n    enum { SHAPE_EDGE = 0x0f, SHAPE_INTERNAL_EDGE = 0x10, SHAPE_CENTRE = 0x20, SHAPE_OPEN = 0x40 };\r\n    unsigned char m_tags;\r\n    unsigned int m_shape_ref;\r\n    std::vector<short> m_polyrefs;\r\n    ShapeRef(unsigned int sref = SHAPE_REF_NULL, unsigned char tags = 0x00) {\r\n        m_shape_ref = sref;\r\n        m_tags = tags;\r\n    }\r\n    friend bool operator==(const ShapeRef &a, const ShapeRef &b);\r\n    friend bool operator!=(const ShapeRef &a, const ShapeRef &b);\r\n    friend bool operator<(const ShapeRef &a, const ShapeRef &b);\r\n    friend bool operator>(const ShapeRef &a, const ShapeRef &b);\r\n};\r\ninline bool operator==(const ShapeRef &a, const ShapeRef &b) { return a.m_shape_ref == b.m_shape_ref; }\r\ninline bool operator!=(const ShapeRef &a, const ShapeRef &b) { return a.m_shape_ref != b.m_shape_ref; }\r\ninline bool operator<(const ShapeRef &a, const ShapeRef &b) { return a.m_shape_ref < b.m_shape_ref; }\r\ninline bool operator>(const ShapeRef &a, const ShapeRef &b) { return a.m_shape_ref > b.m_shape_ref; }\r\n\r\nstruct ShapeRefHash {\r\n  public:\r\n    size_t operator()(const ShapeRef &shapeRef) const { return shapeRef.m_shape_ref; }\r\n};\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n// this is a helper for cutting polygons to fit a viewport / cropping frame\r\nstruct SalaEdgeU : public EdgeU {\r\n    int index;\r\n    bool entry; // or exit\r\n    SalaEdgeU() : EdgeU() {\r\n        index = -1;\r\n        entry = false;\r\n    }\r\n    SalaEdgeU(int i, bool e, const EdgeU &eu) : EdgeU(eu) {\r\n        index = i;\r\n        entry = e;\r\n    }\r\n};\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nclass PointMap;\r\n\r\nclass SalaShape {\r\n  public:\r\n    std::vector<Point2f> m_points;\r\n    enum {\r\n        SHAPE_POINT = 0x01,\r\n        SHAPE_LINE = 0x02,\r\n        SHAPE_POLY = 0x04,\r\n        SHAPE_CIRCLE = 0x08,\r\n        SHAPE_TYPE = 0x0f,\r\n        SHAPE_CLOSED = 0x40,\r\n        SHAPE_CCW = 0x80\r\n    };\r\n    friend class ShapeMap;\r\n\r\n  protected:\r\n    unsigned char m_type;\r\n    Point2f m_centroid; // centre of mass, but also used as for point if object is a point\r\n    Line m_region;      // bounding box, but also used as a line if object is a line, hence type\r\n    double m_area;\r\n    double m_perimeter;\r\n    // these are all temporary data which are recalculated on reload\r\n    mutable bool m_selected;\r\n    mutable float m_color;\r\n    mutable int m_draworder;\r\n\r\n  public:\r\n    SalaShape(unsigned char type = 0) {\r\n        m_type = type;\r\n        m_draworder = -1;\r\n        m_selected = false;\r\n        m_area = 0.0;\r\n        m_perimeter = 0.0;\r\n    }\r\n    SalaShape(const Point2f &point) {\r\n        m_type = SHAPE_POINT;\r\n        m_draworder = -1;\r\n        m_selected = false;\r\n        m_region = Line(point, point);\r\n        m_centroid = point;\r\n        m_area = 0.0;\r\n        m_perimeter = 0.0;\r\n    }\r\n    SalaShape(const Line &line) {\r\n        m_type = SHAPE_LINE;\r\n        m_draworder = -1;\r\n        m_selected = false;\r\n        m_region = line;\r\n        m_centroid = m_region.getCentre();\r\n        m_area = 0.0;\r\n        m_perimeter = m_region.length();\r\n    }\r\n    //\r\n    bool isOpen() const { return (m_type & SHAPE_CLOSED) == 0; }\r\n    bool isClosed() const { return (m_type & SHAPE_CLOSED) == SHAPE_CLOSED; }\r\n    bool isPoint() const { return (m_type == SHAPE_POINT); }\r\n    bool isLine() const { return (m_type == SHAPE_LINE); }\r\n    bool isPolyLine() const { return (m_type & (SHAPE_POLY | SHAPE_CLOSED)) == SHAPE_POLY; }\r\n    bool isPolygon() const { return (m_type & (SHAPE_POLY | SHAPE_CLOSED)) == (SHAPE_POLY | SHAPE_CLOSED); }\r\n    bool isCCW() const { return (m_type & SHAPE_CCW) == SHAPE_CCW; }\r\n    //\r\n    const Point2f &getPoint() const { return m_centroid; }\r\n    const Line &getLine() const { return m_region; }\r\n    const QtRegion &getBoundingBox() const { return m_region; }\r\n    //\r\n    double getArea() const { return m_area; }\r\n    double getPerimeter() const { return m_perimeter; }\r\n    // duplicate function, but easier to understand naming convention\r\n    double getLength() const { return m_perimeter; }\r\n    //\r\n    void setCentroidAreaPerim();\r\n    void setCentroid(const Point2f &p);\r\n    // duplicate function, but easier to understand naming convention\r\n    const Point2f &getCentroid() const { return m_centroid; }\r\n    //\r\n    double getAngDev() const;\r\n    //\r\n    std::vector<SalaEdgeU> getClippingSet(QtRegion &clipframe) const;\r\n    //\r\n    bool read(std::istream &stream);\r\n    bool write(std::ofstream &stream);\r\n\r\n    std::vector<Line> getAsLines() const {\r\n        std::vector<Line> lines;\r\n        if (isLine()) {\r\n            lines.push_back(getLine());\r\n        } else if (isPolyLine() || isPolygon()) {\r\n            for (size_t j = 0; j < m_points.size() - 1; j++) {\r\n                lines.push_back(Line(m_points[j], m_points[j + 1]));\r\n            }\r\n            if (isClosed()) {\r\n                lines.push_back(Line(m_points[m_points.size() - 1], m_points[0]));\r\n            }\r\n        }\r\n        return lines;\r\n    }\r\n};\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nstruct SalaEvent {\r\n    enum { SALA_NULL_EVENT, SALA_CREATED, SALA_DELETED, SALA_MOVED };\r\n    int m_action;\r\n    int m_shape_ref;\r\n    SalaShape m_geometry;\r\n    SalaEvent(int action = SALA_NULL_EVENT, int shape_ref = -1) {\r\n        m_action = action;\r\n        m_shape_ref = shape_ref;\r\n    }\r\n};\r\n\r\n/////////////////////////////////////////////////////////////////////////////////////////////////\r\n// Quick mod - TV\r\nclass MapInfoData;\r\n\r\nclass ShapeMap : public PixelBase {\r\n    friend class AxialMaps;\r\n    friend class MapInfoData;\r\n\r\n  public:\r\n    // now shapemaps cover a multitude of different types, record here:\r\n    // (note, allline maps are automatically generated and have extra information recorded for line reduction)\r\n    // Do not change numeric values!  They are saved to file.\r\n    // Note the Pesh map does auto-overlap of shape-shape (yet...), so can be used for an arbitrary shape map\r\n    enum {\r\n        EMPTYMAP = 0x0000,\r\n        DRAWINGMAP = 0x0001,\r\n        DATAMAP = 0x0002,\r\n        POINTMAP = 0x0004,\r\n        CONVEXMAP = 0x0008,\r\n        ALLLINEMAP = 0x0010,\r\n        AXIALMAP = 0x0020,\r\n        SEGMENTMAP = 0x0040,\r\n        PESHMAP = 0x0080,\r\n        LINEMAP = 0x0070\r\n    };\r\n    enum {\r\n        COPY_NAME = 0x0001,\r\n        COPY_GEOMETRY = 0x0002,\r\n        COPY_ATTRIBUTES = 0x0004,\r\n        COPY_GRAPH = 0x0008,\r\n        COPY_ALL = 0x000f\r\n    };\r\n\r\n  protected:\r\n    std::string m_name;\r\n    int m_map_type;\r\n    bool m_hasgraph;\r\n    // counters\r\n    int m_obj_ref;\r\n    mutable bool m_newshape; // if a new shape has been added\r\n    //\r\n    // quick grab for shapes\r\n    depthmapX::ColumnMatrix<std::vector<ShapeRef>> m_pixel_shapes; // i rows of j columns\r\n    //\r\n    // allow quick closest line test (note only works for a given layer, with many layers will be tricky)\r\n    mutable BSPNode *m_bsp_root = nullptr;\r\n    mutable bool m_bsp_tree = false;\r\n    //\r\n    std::map<int, SalaShape> m_shapes;\r\n    //\r\n    std::vector<SalaEvent> m_undobuffer;\r\n    //\r\n    std::unique_ptr<AttributeTable> m_attributes;\r\n    std::unique_ptr<AttributeTableHandle> m_attribHandle;\r\n    LayerManagerImpl m_layers;\r\n    //\r\n    // for graph functionality\r\n    // Note: this list is stored PACKED for optimal performance on graph analysis\r\n    // ALWAYS check it is in the same order as the shape list and attribute table\r\n    std::vector<Connector> m_connectors;\r\n    //\r\n    // for geometric operations\r\n    double m_tolerance;\r\n    // for screen drawing\r\n    mutable std::vector<int> m_display_shapes;\r\n    mutable int m_current;\r\n    mutable bool m_invalidate;\r\n    //\r\nprivate:\r\n    void moveData(ShapeMap& other) {\r\n        m_show = other.isShown();\r\n        m_shapes = std::move(other.m_shapes);\r\n        m_hasgraph = other.m_hasgraph;\r\n        m_connectors = std::move(other.m_connectors);\r\n        m_links = std::move(other.m_links);\r\n        m_unlinks = std::move(other.m_unlinks);\r\n        m_mapinfodata = std::move(other.m_mapinfodata);\r\n        m_hasMapInfoData = other.m_hasMapInfoData;\r\n        m_displayed_attribute = other.m_displayed_attribute;\r\n        m_display_shapes = std::move(other.m_display_shapes);\r\n        m_rows = other.m_rows;\r\n        m_cols = other.m_cols;\r\n        m_region = std::move(other.m_region);\r\n        m_map_type = other.m_map_type;\r\n    }\r\n\r\n  public:\r\n    ShapeMap(const std::string &name = std::string(), int type = EMPTYMAP);\r\n    virtual ~ShapeMap();\r\n    void copy(const ShapeMap &shapemap, int copyflags = 0);\r\n\r\n    ShapeMap(ShapeMap &&other)\r\n        : m_name(std::move(other.m_name)), m_pixel_shapes(std::move(other.m_pixel_shapes)),\r\n          m_attributes(std::move(other.m_attributes)), m_attribHandle(std::move(other.m_attribHandle)),\r\n          m_layers(std::move(other.m_layers)) {\r\n        moveData(other);\r\n    }\r\n    ShapeMap &operator=(ShapeMap &&other) {\r\n        m_name = std::move(other.m_name);\r\n        m_pixel_shapes = std::move(other.m_pixel_shapes);\r\n        m_attributes = std::move(other.m_attributes);\r\n        m_attribHandle = std::move(other.m_attribHandle);\r\n        m_layers = std::move(other.m_layers);\r\n        moveData(other);\r\n        return *this;\r\n    }\r\n    ShapeMap(const ShapeMap &) = delete;\r\n    ShapeMap &operator=(const ShapeMap &other) = delete;\r\n\r\n    // TODO: These three functions should be refactored out of the code as much as possible\r\n    // they are only left here because they're being used by various components that still\r\n    // access the attribute table through indices. Once these are removed these functions\r\n    // should only appear sparingly or removed entirely. The bits of the application\r\n    // that still use them are the connections of the axial/segment maps and the point\r\n    // in polygon functions.\r\n    const std::map<int, SalaShape>::const_iterator getShapeRefFromIndex(size_t index) const {\r\n        return depthmapX::getMapAtIndex(m_shapes, index);\r\n    }\r\n    AttributeRow &getAttributeRowFromShapeIndex(size_t index) {\r\n        return m_attributes->getRow(AttributeKey(getShapeRefFromIndex(index)->first));\r\n    }\r\n    const AttributeRow &getAttributeRowFromShapeIndex(size_t index) const {\r\n        return m_attributes->getRow(AttributeKey(getShapeRefFromIndex(index)->first));\r\n    }\r\n\r\n    void clearAll();\r\n    // num shapes total\r\n    size_t getShapeCount() const { return m_shapes.size(); }\r\n    // num shapes for this object (note, request by object rowid\r\n    // -- on interrogation, this is what you will usually receive)\r\n    size_t getShapeCount(int rowid) const {\r\n        return depthmapX::getMapAtIndex(m_shapes, rowid)->second.m_points.size();\r\n    }\r\n    //\r\n    int getIndex(int rowid) const { return depthmapX::getMapAtIndex(m_shapes, rowid)->first; }\r\n    //\r\n    // add shape tools\r\n    void makePolyPixels(int shaperef);\r\n    void shapePixelBorder(std::map<int, int> &relations, int shaperef, int side, PixelRef currpix, PixelRef minpix,\r\n                          bool first);\r\n    // remove shape tools\r\n    void removePolyPixels(int shaperef);\r\n    //\r\n    //\r\n    void init(int size, const QtRegion &r);\r\n    int getNextShapeKey();\r\n    // convert a single point into a shape\r\n    int makePointShapeWithRef(const Point2f &point, int shape_ref, bool tempshape = false,\r\n                              const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n    int makePointShape(const Point2f &point, bool tempshape = false,\r\n                       const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n    // or a single line into a shape\r\n    int makeLineShapeWithRef(const Line &line, int shape_ref, bool through_ui = false, bool tempshape = false,\r\n                             const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n    int makeLineShape(const Line &line, bool through_ui = false, bool tempshape = false,\r\n                      const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n    // or a polygon into a shape\r\n    int makePolyShapeWithRef(const std::vector<Point2f> &points, bool open, int shape_ref, bool tempshape = false,\r\n                             const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n    int makePolyShape(const std::vector<Point2f> &points, bool open, bool tempshape = false,\r\n                      const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n\r\n  public:\r\n    // or make a shape from a shape\r\n    int makeShape(const SalaShape &shape, int override_shape_ref = -1,\r\n                  const std::map<int, float> &extraAttributes = std::map<int, float>());\r\n    // convert points to polygons\r\n    bool convertPointsToPolys(double poly_radius, bool selected_only);\r\n    // convert a selected pixels to a layer object (note, uses selection attribute on pixel, you must select to make\r\n    // this work):\r\n    int makeShapeFromPointSet(const PointMap &pointmap);\r\n    //\r\n    // move a shape (currently only a line shape) -- in the future should use SalaShape\r\n    bool moveShape(int shaperef, const Line &line, bool undoing = false);\r\n    // delete selected shapes\r\n    bool removeSelected();\r\n    // delete a shape\r\n    void removeShape(int shaperef, bool undoing = false);\r\n    //\r\n    void setShapeAttributes(int rowid, const SalaShape &shape);\r\n    //\r\n    // some UI polygon creation tools:\r\n    int polyBegin(const Line &line);\r\n    bool polyAppend(int shape_ref, const Point2f &point);\r\n    bool polyClose(int shape_ref);\r\n    bool polyCancel(int shape_ref);\r\n    // some shape creation tools for the scripting language or DLL interface\r\n  public:\r\n    bool canUndo() const { return m_undobuffer.size() != 0; }\r\n    void undo();\r\n    //\r\n    // helpers:\r\n    Point2f pointOffset(const PointMap &pointmap, int side);\r\n    int moveDir(int side);\r\n    //\r\n    void pointPixelBorder(const PointMap &pointmap, std::map<int, int> &relations, SalaShape &shape, int side,\r\n                          PixelRef currpix, PixelRef minpix, bool first);\r\n    // slower point in topmost poly test:\r\n    int pointInPoly(const Point2f &p) const;\r\n    // test if point is inside a particular shape\r\n    bool pointInPoly(const Point2f &p, int shaperef) const;\r\n    // retrieve lists of polys point intersects:\r\n    std::vector<int> pointInPolyList(const Point2f &p) const;\r\n    std::vector<int> lineInPolyList(const Line &li, size_t lineref = -1, double tolerance = 0.0) const;\r\n    std::vector<int> polyInPolyList(int polyref, double tolerance = 0.0) const;\r\n    std::vector<int> shapeInPolyList(const SalaShape &shape);\r\n    // helper to make actual test of point in shape:\r\n    int testPointInPoly(const Point2f &p, const ShapeRef &shape) const;\r\n    // also allow look for a close polyline:\r\n    int getClosestOpenGeom(const Point2f &p) const;\r\n    // this version uses a BSP tree to find closest line (currently only line shapes)\r\n    int getClosestLine(const Point2f &p) const;\r\n    // this version simply finds the closest vertex to the point\r\n    Point2f getClosestVertex(const Point2f &p) const;\r\n    // Connect a particular shape into the graph\r\n    int connectIntersected(int rowid, bool linegraph);\r\n    // Get the connections for a particular line\r\n    std::vector<int> getLineConnections(int lineref, double tolerance);\r\n    // Get arbitrary shape connections for a particular shape\r\n    std::vector<int> getShapeConnections(int polyref, double tolerance);\r\n    // Make all connections\r\n    void makeShapeConnections();\r\n    //\r\n    bool makeBSPtree() const;\r\n    //\r\n    const std::vector<Connector> &getConnections() const { return m_connectors; }\r\n    std::vector<Connector> &getConnections() { return m_connectors; }\r\n    //\r\n    bool isAllLineMap() const { return m_map_type == ALLLINEMAP; }\r\n    bool isSegmentMap() const { return m_map_type == SEGMENTMAP; }\r\n    bool isAxialMap() const { return m_map_type == ALLLINEMAP || m_map_type == AXIALMAP; }\r\n    bool isPeshMap() const { return m_map_type == PESHMAP; }\r\n    int getMapType() const { return m_map_type; }\r\n    // Attribute functionality\r\n  protected:\r\n    // which attribute is currently displayed:\r\n    mutable int m_displayed_attribute;\r\n\r\n  public:\r\n    const std::string &getName() const { return m_name; }\r\n    int addAttribute(const std::string &name) { return m_attributes->insertOrResetColumn(name); }\r\n    void removeAttribute(int col) { m_attributes->removeColumn(col); }\r\n    // I don't want to do this, but every so often you will need to update this table\r\n    // use const version by preference\r\n    AttributeTable &getAttributeTable() { return *m_attributes.get(); }\r\n    const AttributeTable &getAttributeTable() const { return *m_attributes.get(); }\r\n    LayerManagerImpl &getLayers() { return m_layers; }\r\n    const LayerManagerImpl &getLayers() const { return m_layers; }\r\n    AttributeTableHandle &getAttributeTableHandle() { return *m_attribHandle.get(); }\r\n    const AttributeTableHandle &getAttributeTableHandle() const { return *m_attribHandle.get(); }\r\n\r\n  public:\r\n    // layer functionality\r\n    bool isLayerVisible(int layerid) const { return m_layers.isLayerVisible(layerid); }\r\n    void setLayerVisible(int layerid, bool show) { m_layers.setLayerVisible(layerid, show); }\r\n    bool selectionToLayer(const std::string &name = std::string(\"Unnamed\"));\r\n\r\n  public:\r\n    double getDisplayMinValue() const {\r\n        return (m_displayed_attribute != -1) ? m_attributes->getColumn(m_displayed_attribute).getStats().min : 0;\r\n    }\r\n    double getDisplayMaxValue() const {\r\n        return (m_displayed_attribute != -1) ? m_attributes->getColumn(m_displayed_attribute).getStats().max\r\n                                             : (m_shapes.size() > 0 ? m_shapes.rbegin()->first : 0);\r\n    }\r\n\r\n    const DisplayParams &getDisplayParams() const {\r\n        return m_attributes->getColumn(m_displayed_attribute).getDisplayParams();\r\n    }\r\n    // make a local copy of the display params for access speed:\r\n    void setDisplayParams(const DisplayParams &dp, bool apply_to_all = false) {\r\n        if (apply_to_all)\r\n            m_attributes->setDisplayParams(dp);\r\n        else\r\n            m_attributes->getColumn(m_displayed_attribute).setDisplayParams(dp);\r\n    }\r\n    //\r\n    mutable bool m_show_lines;\r\n    mutable bool m_show_fill;\r\n    mutable bool m_show_centroids;\r\n    void getPolygonDisplay(bool &show_lines, bool &show_fill, bool &show_centroids) {\r\n        show_lines = m_show_lines;\r\n        show_fill = m_show_fill;\r\n        show_centroids = m_show_centroids;\r\n    }\r\n    void setPolygonDisplay(bool show_lines, bool show_fill, bool show_centroids) {\r\n        m_show_lines = show_lines;\r\n        m_show_fill = show_fill;\r\n        m_show_centroids = show_centroids;\r\n    }\r\n    //\r\n  public:\r\n    void setDisplayedAttribute(int col);\r\n    // use set displayed attribute instead unless you are deliberately changing the column order:\r\n    void overrideDisplayedAttribute(int attribute) { m_displayed_attribute = attribute; }\r\n    // now, there is a slightly odd thing here: the displayed attribute can go out of step with the underlying\r\n    // attribute data if there is a delete of an attribute in idepthmap.h, so it just needs checking before returning!\r\n    int getDisplayedAttribute() const {\r\n        if (m_displayed_attribute == m_attribHandle->getDisplayColIndex())\r\n            return m_displayed_attribute;\r\n        if (m_attribHandle->getDisplayColIndex() != -2) {\r\n            m_displayed_attribute = m_attribHandle->getDisplayColIndex();\r\n        }\r\n        return m_displayed_attribute;\r\n    }\r\n    //\r\n    void invalidateDisplayedAttribute() { m_invalidate = true; }\r\n    //\r\n    double getDisplayedAverage() {\r\n        return m_attributes->getColumn(m_displayed_attribute).getStats().total / m_attributes->getNumRows();\r\n    }\r\n    //\r\n  protected:\r\n    mutable bool m_show; // used when shape map is a drawing layer\r\n    bool m_editable;\r\n    std::set<int> m_selection_set; // note: uses keys\r\n  public:\r\n    // Selection\r\n    bool hasSelectedElements() const { return !m_selection_set.empty(); }\r\n    const std::map<int, SalaShape> getShapesInRegion(const QtRegion &r) const;\r\n    bool setCurSel(QtRegion &r, bool add = false);\r\n    bool setCurSel(const std::vector<int> &selset, bool add = false);\r\n    bool setCurSelDirect(const std::vector<int> &selset, bool add = false);\r\n    float getDisplayedSelectedAvg();\r\n    bool clearSel();\r\n    std::set<int> &getSelSet() { return m_selection_set; }\r\n    const std::set<int> &getSelSet() const { return m_selection_set; }\r\n    size_t getSelCount() { return m_selection_set.size(); }\r\n    QtRegion getSelBounds();\r\n    // To showing\r\n    bool isShown() const { return m_show; }\r\n    void setShow(bool on = true) const { m_show = on; }\r\n    // To all editing\r\n    bool isEditable() const { return m_editable; }\r\n    void setEditable(bool on = true) { m_editable = on; }\r\n\r\n  protected:\r\n    bool m_hasMapInfoData = false;\r\n    MapInfoData m_mapinfodata;\r\n\r\n  public:\r\n    bool hasMapInfoData() const { return m_hasMapInfoData; }\r\n    int loadMifMap(std::istream &miffile, std::istream &midfile);\r\n    bool outputMifMap(std::ostream &miffile, std::ostream &midfile);\r\n    const MapInfoData &getMapInfoData() const { return m_mapinfodata; }\r\n\r\n  public:\r\n    // Screen\r\n    void makeViewportShapes(const QtRegion &viewport) const;\r\n    bool findNextShape(bool &nextlayer) const;\r\n    const SalaShape &getNextShape() const;\r\n    const PafColor getShapeColor() const {\r\n        AttributeKey key(m_display_shapes[m_current]);\r\n        const AttributeRow &row = m_attributes->getRow(key);\r\n        return dXreimpl::getDisplayColor(key, row, *m_attribHandle.get(), true);\r\n        ;\r\n    }\r\n    bool getShapeSelected() const {\r\n        return depthmapX::getMapAtIndex(m_shapes, m_display_shapes[m_current])->second.m_selected;\r\n    }\r\n    //\r\n    double getLocationValue(const Point2f &point) const;\r\n\r\n    // Quick mod - TV\r\n#if !defined(_MSC_VER)\r\n#define __max(x, y) ((x < y) ? y : x)\r\n#define __min(x, y) ((x < y) ? x : y)\r\n#endif\r\n    //\r\n    double getSpacing() const {\r\n        return __max(m_region.width(), m_region.height()) / (10 * log((double)10 + m_shapes.size()));\r\n    }\r\n    //\r\n    // dangerous: accessor for the shapes themselves:\r\n    const std::map<int, SalaShape> &getAllShapes() const { return m_shapes; }\r\n    std::map<int, SalaShape> &getAllShapes() { return m_shapes; }\r\n    // required for PixelBase, have to implement your own version of pixelate\r\n    PixelRef pixelate(const Point2f &p, bool constrain = true, int = 1) const;\r\n    //\r\n  public:\r\n    // file\r\n    bool read(std::istream &stream);\r\n    bool write(std::ofstream &stream);\r\n    //\r\n    bool output(std::ofstream &stream, char delimiter = '\\t');\r\n    //\r\n    // links and unlinks\r\n  protected:\r\n    std::vector<OrderedIntPair> m_links;\r\n    std::vector<OrderedIntPair> m_unlinks;\r\n    mutable int m_curlinkline;\r\n    mutable int m_curunlinkpoint;\r\n\r\n  public:\r\n    bool clearLinks();\r\n    bool linkShapes(const Point2f &p);\r\n    bool linkShapesFromRefs(int ref1, int ref2, bool refresh = true);\r\n    bool linkShapes(int index1, int index2, bool refresh = true);\r\n    bool linkShapes(int id1, int dir1, int id2, int dir2, float weight);\r\n    bool unlinkShapes(const Point2f &p);\r\n    bool unlinkShapesFromRefs(int index1, int index2, bool refresh = true);\r\n    bool unlinkShapes(int index1, int index2, bool refresh = true);\r\n    bool unlinkShapesByKey(int key1, int key2, bool refresh = true);\r\n    bool unlinkShapeSet(std::istream &idset, int refcol);\r\n\r\n  public:\r\n    // generic for all types of graphs\r\n    bool findNextLinkLine() const;\r\n    Line getNextLinkLine() const;\r\n    std::vector<SimpleLine> getAllLinkLines();\r\n    // specific to axial line graphs\r\n    bool findNextUnlinkPoint() const;\r\n    Point2f getNextUnlinkPoint() const;\r\n    std::vector<Point2f> getAllUnlinkPoints();\r\n    void outputUnlinkPoints(std::ofstream &stream, char delim);\r\n\r\n  public:\r\n    std::vector<SimpleLine> getAllShapesAsLines() const;\r\n    std::vector<std::pair<SimpleLine, PafColor>> getAllLinesWithColour();\r\n    std::vector<std::pair<std::vector<Point2f>, PafColor>> getAllPolygonsWithColour();\r\n    std::vector<std::pair<Point2f, PafColor>> getAllPointsWithColour();\r\n    bool importLines(const std::vector<Line> &lines, const depthmapX::Table &data);\r\n    bool importLinesWithRefs(const std::map<int, Line> &lines, const depthmapX::Table &data);\r\n    bool importPoints(const std::vector<Point2f> &points, const depthmapX::Table &data);\r\n    bool importPointsWithRefs(const std::map<int, Point2f> &points, const depthmapX::Table &data);\r\n    bool importPolylines(const std::vector<depthmapX::Polyline> &lines, const depthmapX::Table &data);\r\n    bool importPolylinesWithRefs(const std::map<int, depthmapX::Polyline> &lines, const depthmapX::Table &data);\r\n    void copyMapInfoBaseData(const ShapeMap &sourceMap);\r\n\r\n  private:\r\n    bool importData(const depthmapX::Table &data, std::vector<int> shape_refs);\r\n};\r\n"
  },
  {
    "path": "salalib/spacepix.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n// spatial data\r\n\r\n#include \"salalib/spacepix.h\"\r\n\r\n#include \"genlib/stringutils.h\"\r\n#include \"genlib/readwritehelpers.h\"\r\n#include \"genlib/containerutils.h\"\r\n\r\n#include <float.h>\r\n#include <math.h>\r\n#include <set>\r\n\r\n#ifndef _WIN32\r\n#define _finite finite\r\n#endif\r\n\r\n/*\r\n// Algorithm from Chi\r\n// make sure dx > dy\r\n   dx = x1 - x0;\r\n   dy = y1 - y0;\r\n   x = x0; y = y0;\r\n   d = 2*dy - dx;\r\n   inc1 = 2*dy;\r\n   inc2 = 2*(dy-dx);\r\n   while (x < x1) {\r\n      if (d <= 0) {\r\n         d += inc1;\r\n         x += 1;\r\n      }\r\n      else {\r\n         d += inc2;\r\n         x++;\r\n         y++;\r\n      }\r\n      pixel_list.push_back( PixelRef(x,y) );\r\n   }\r\n*/\r\n\r\nPixelRefVector PixelBase::pixelateLine(Line l, int scalefactor) const {\r\n    PixelRefVector pixel_list;\r\n\r\n    // this is *not* correct for lines that are off the edge...\r\n    // should use non-constrained version (false), and find where line enters the region\r\n    PixelRef a = pixelate(l.start(), true, scalefactor);\r\n    PixelRef b = pixelate(l.end(), true, scalefactor);\r\n\r\n    l.normalScale(m_region);\r\n\r\n    pixel_list.push_back(a);\r\n\r\n    int scaledcols = m_cols * scalefactor;\r\n    int scaledrows = m_rows * scalefactor;\r\n\r\n    int parity = 1; // Line goes upwards\r\n    if (a.y > b.y) {\r\n        parity = -1; // Line goes downwards\r\n        a.y *= -1;\r\n        b.y *= -1; // Set ay and by saves work on comparisons later on\r\n    }\r\n\r\n    // special case 1\r\n    if (a.x == b.x) {\r\n        while (a.y < b.y) {\r\n            a.y += 1;\r\n            pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n        }\r\n    } else if (a.y == b.y) {\r\n        while (a.x < b.x) {\r\n            a.x += 1;\r\n            pixel_list.push_back(PixelRef(a.x, parity * a.y)); // Lines always go left to right\r\n        }\r\n    } else {\r\n\r\n        double hw_ratio =\r\n            l.height() / l.width(); // Working all of these out leaves less scope for floating point error\r\n        double wh_ratio = l.width() / l.height();\r\n        double x0_const = l.ay() - double(parity) * hw_ratio * l.ax();\r\n        double y0_const = l.ax() - double(parity) * wh_ratio * l.ay();\r\n\r\n        while (a.x < b.x || a.y < b.y) {\r\n            PixelRef e;\r\n            e.y = parity *\r\n                  int(double(scaledrows) * (x0_const + parity * hw_ratio * (double(a.x + 1) / double(scaledcols))));\r\n            // Note when decending 1.5 -> 1 and ascending 1.5 -> 2\r\n            if (parity < 0) {\r\n                e.x = int(double(scaledcols) * (y0_const + wh_ratio * (double(a.y) / double(scaledrows))));\r\n            } else {\r\n                e.x = int(double(scaledcols) * (y0_const + wh_ratio * (double(a.y + 1) / double(scaledrows))));\r\n            }\r\n\r\n            if (a.y < e.y) {\r\n                while (a.y < e.y && a.y < b.y) {\r\n                    a.y += 1;\r\n                    pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n                }\r\n                if (a.x < b.x) {\r\n                    a.x += 1;\r\n                    pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n                }\r\n            } else if (a.x < e.x) {\r\n                while (a.x < e.x && a.x < b.x) {\r\n                    a.x += 1;\r\n                    pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n                }\r\n                if (a.y < b.y) {\r\n                    a.y += 1;\r\n                    pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n                }\r\n            } else {\r\n                // Special case: exactly diagonal step (should only require one step):\r\n                // (Should actually never happen) (Doesn't: checked with RFH)\r\n                a.x += 1;\r\n                pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n                a.y += 1;\r\n                pixel_list.push_back(PixelRef(a.x, parity * a.y));\r\n            }\r\n        }\r\n    }\r\n    return pixel_list;\r\n}\r\n\r\n// this version includes all pixels through which the line passes with touching\r\n// counting as both pixels.\r\n\r\nPixelRefVector PixelBase::pixelateLineTouching(Line l, double tolerance) const {\r\n    PixelRefVector pixel_list;\r\n\r\n    // now assume that scaling to region then scaling up is going to give pixelation\r\n    // this is not necessarily the case!\r\n    l.normalScale(m_region);\r\n    l.scale(Point2f(m_cols, m_rows));\r\n\r\n    // but it does give us a nice line...\r\n    int dir;\r\n    double grad, constant;\r\n\r\n    if (l.width() > l.height()) {\r\n        dir = XAXIS;\r\n        grad = l.grad(YAXIS);\r\n        constant = l.constant(YAXIS);\r\n    } else {\r\n        dir = YAXIS;\r\n        grad = l.grad(XAXIS);\r\n        constant = l.constant(XAXIS);\r\n    }\r\n    PixelRef bounds(m_cols, m_rows);\r\n\r\n    if (dir == XAXIS) {\r\n        int first = (int)floor(l.ax() - tolerance);\r\n        int last = (int)floor(l.bx() + tolerance);\r\n        for (int i = first; i <= last; i++) {\r\n            int j1 = (int)floor((first == i ? l.ax() : double(i)) * grad + constant - l.sign() * tolerance);\r\n            int j2 = (int)floor((last == i ? l.bx() : double(i + 1)) * grad + constant + l.sign() * tolerance);\r\n            if (bounds.encloses(PixelRef(i, j1))) {\r\n                pixel_list.push_back(PixelRef(i, j1));\r\n            }\r\n            if (j1 != j2) {\r\n                if (bounds.encloses(PixelRef(i, j2))) {\r\n                    pixel_list.push_back(PixelRef(i, j2));\r\n                }\r\n                if (abs(j2 - j1) == 2) {\r\n                    // this rare event happens if lines are exactly diagonal\r\n                    int j3 = (j1 + j2) / 2;\r\n                    if (bounds.encloses(PixelRef(i, j3))) {\r\n                        pixel_list.push_back(PixelRef(i, j3));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    } else {\r\n        int first = (int)floor(l.bottom_left.y - tolerance);\r\n        int last = (int)floor(l.top_right.y + tolerance);\r\n        for (int i = first; i <= last; i++) {\r\n            int j1 = (int)floor((first == i ? l.bottom_left.y : double(i)) * grad + constant - l.sign() * tolerance);\r\n            int j2 = (int)floor((last == i ? l.top_right.y : double(i + 1)) * grad + constant + l.sign() * tolerance);\r\n            if (bounds.encloses(PixelRef(j1, i))) {\r\n                pixel_list.push_back(PixelRef(j1, i));\r\n            }\r\n            if (j1 != j2) {\r\n                if (bounds.encloses(PixelRef(j2, i))) {\r\n                    pixel_list.push_back(PixelRef(j2, i));\r\n                }\r\n                if (abs(j2 - j1) == 2) {\r\n                    // this rare event happens if lines are exactly diagonal\r\n                    int j3 = (j1 + j2) / 2;\r\n                    if (bounds.encloses(PixelRef(j3, i))) {\r\n                        pixel_list.push_back(PixelRef(j3, i));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return pixel_list;\r\n}\r\n\r\n// this version for a quick set of pixels\r\n\r\nPixelRefVector PixelBase::quickPixelateLine(PixelRef p, PixelRef q) {\r\n    PixelRefVector list;\r\n\r\n    double dx = q.x - p.x;\r\n    double dy = q.y - p.y;\r\n    int polarity = -1;\r\n    double t = 0;\r\n    // Quick mod - TV\r\n#if defined(_MSC_VER)\r\n    if (abs(dx) == abs(dy)) {\r\n#else\r\n    if (fabs(dx) == fabs(dy)) {\r\n#endif\r\n        polarity = 0;\r\n    }\r\n#if defined(_MSC_VER)\r\n    else if (abs(dx) > abs(dy)) {\r\n        t = abs(dx);\r\n#else\r\n    else if (fabs(dx) > fabs(dy)) {\r\n        t = fabs(dx);\r\n#endif\r\n        polarity = 1;\r\n    } else {\r\n#if defined(_MSC_VER)\r\n        t = abs(dy);\r\n#else\r\n        t = fabs(dy);\r\n#endif\r\n        polarity = 2;\r\n    }\r\n\r\n    dx /= t;\r\n    dy /= t;\r\n    double ppx = p.x + 0.5;\r\n    double ppy = p.y + 0.5;\r\n\r\n    for (int i = 0; i <= t; i++) {\r\n        if (polarity == 1 && fabs(floor(ppy) - ppy) < 1e-9) {\r\n            list.push_back(PixelRef((short)floor(ppx), (short)floor(ppy + 0.5)));\r\n            list.push_back(PixelRef((short)floor(ppx), (short)floor(ppy - 0.5)));\r\n        } else if (polarity == 2 && fabs(floor(ppx) - ppx) < 1e-9) {\r\n            list.push_back(PixelRef((short)floor(ppx + 0.5), (short)floor(ppy)));\r\n            list.push_back(PixelRef((short)floor(ppx - 0.5), (short)floor(ppy)));\r\n        } else {\r\n            list.push_back(PixelRef((short)floor(ppx), (short)floor(ppy)));\r\n        }\r\n        ppx += dx;\r\n        ppy += dy;\r\n    }\r\n\r\n    return list;\r\n}\r\n\r\nSpacePixel::SpacePixel(const std::string &name) : m_pixel_lines(0, 0) {\r\n    m_name = name;\r\n    m_show = true;\r\n    m_edit = false;\r\n\r\n    m_cols = 0;\r\n    m_rows = 0;\r\n\r\n    m_ref = -1;\r\n    m_test = 0;\r\n\r\n    m_newline = false;\r\n\r\n    m_style = 0;\r\n    m_color = 0;\r\n}\r\n\r\nSpacePixel::SpacePixel(const SpacePixel &spacepixel)\r\n    : m_pixel_lines(spacepixel.m_pixel_lines.rows(), spacepixel.m_pixel_lines.columns()) {\r\n    // n.b., not strictly allowed\r\n    construct(spacepixel);\r\n}\r\n\r\nSpacePixel &SpacePixel::operator=(const SpacePixel &spacepixel) {\r\n    if (this != &spacepixel) {\r\n        construct(spacepixel);\r\n    }\r\n    return *this;\r\n}\r\n\r\nvoid SpacePixel::construct(const SpacePixel &spacepixel) {\r\n    m_name = spacepixel.m_name;\r\n    m_show = spacepixel.m_show;\r\n    m_edit = spacepixel.m_edit;\r\n\r\n    m_rows = spacepixel.m_rows;\r\n    m_cols = spacepixel.m_cols;\r\n\r\n    m_region = spacepixel.m_region;\r\n\r\n    m_ref = spacepixel.m_ref;\r\n    m_test = spacepixel.m_test;\r\n    m_lines = spacepixel.m_lines;\r\n    m_newline = true;\r\n\r\n    if (!m_rows || !m_cols) {\r\n        m_display_lines.clear();\r\n        return;\r\n    }\r\n\r\n    m_pixel_lines = spacepixel.m_pixel_lines;\r\n\r\n    m_color = spacepixel.m_color;\r\n    m_style = spacepixel.m_style;\r\n\r\n    // m_pixel_height = spacepixel.m_pixel_height;\r\n    // m_pixel_width  = spacepixel.m_pixel_width;\r\n}\r\n\r\nPixelRef SpacePixel::pixelate(const Point2f &p, bool constrain, int) const {\r\n    PixelRef r;\r\n\r\n    Point2f p1 = p;\r\n    p1.normalScale(m_region);\r\n\r\n    r.x = short(p1.x * double(m_cols - 1e-9));\r\n    if (constrain) {\r\n        if (r.x >= static_cast<short>(m_cols))\r\n            r.x = m_cols - 1;\r\n        else if (r.x < 0)\r\n            r.x = 0;\r\n    }\r\n    r.y = short(p1.y * double(m_rows - 1e-9));\r\n    if (constrain) {\r\n        if (r.y >= static_cast<short>(m_rows))\r\n            r.y = m_rows - 1;\r\n        else if (r.y < 0)\r\n            r.y = 0;\r\n    }\r\n\r\n    return r;\r\n}\r\n\r\nvoid SpacePixel::makeViewportLines(const QtRegion &viewport) const {\r\n    if (m_display_lines.empty() || m_newline) {\r\n        m_display_lines = std::vector<int>(m_lines.size());\r\n        m_newline = false;\r\n        std::fill(m_display_lines.begin(), m_display_lines.end(), 0);\r\n    }\r\n\r\n    m_current = -1; // note: findNext expects first to be labelled -1\r\n\r\n    /*\r\n    // Fixing bounding rectangle: normalisation removed\r\n    QtRegion r_viewport = viewport;\r\n\r\n    r_viewport.normalScale( m_region );\r\n    */\r\n\r\n    PixelRef bl = pixelate(viewport.bottom_left);\r\n    PixelRef tr = pixelate(viewport.top_right);\r\n\r\n    for (int i = bl.x; i <= tr.x; i++) {\r\n        for (int j = bl.y; j <= tr.y; j++) {\r\n            auto &pixel_lines = m_pixel_lines(static_cast<size_t>(j), static_cast<size_t>(i));\r\n            for (int pixel_line : pixel_lines) {\r\n                m_display_lines[size_t(depthmapX::findIndexFromKey(m_lines, pixel_line))] = 1;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// expect to be used as:\r\n//\r\n// if (findNext())\r\n//    getNext();\r\n\r\nbool SpacePixel::findNextLine(bool &nextlayer) const {\r\n    if (m_newline) // after adding a line you must reinitialise the display lines\r\n        return false;\r\n\r\n    while (++m_current < (int)m_lines.size() && m_display_lines[m_current] == 0)\r\n        ;\r\n\r\n    if (m_current < (int)m_lines.size()) {\r\n        return true;\r\n    } else {\r\n        m_current = (int)m_lines.size();\r\n        nextlayer = true;\r\n        return false;\r\n    }\r\n}\r\n\r\nconst Line &SpacePixel::getNextLine() const {\r\n    m_display_lines[m_current] = 0; // You've drawn it\r\n    /*\r\n    // Fixing: removed rectangle scaling\r\n    l.denormalScale( m_region );\r\n    */\r\n    return m_lines.find(m_current)->second.line;\r\n}\r\n\r\nvoid SpacePixel::initLines(int size, const Point2f &min, const Point2f &max, double density) {\r\n    m_display_lines.clear();\r\n    m_lines.clear();\r\n    m_ref = -1;\r\n    m_test = 0;\r\n\r\n    // work out extents...\r\n    m_region = QtRegion(min, max);\r\n\r\n    double wh_ratio = m_region.width() / m_region.height();\r\n    double hw_ratio = m_region.height() / m_region.width();\r\n\r\n    m_rows = (int)sqrt(double(size) * wh_ratio * density);\r\n    m_cols = (int)sqrt(double(size) * hw_ratio * density);\r\n\r\n    if (m_rows < 1)\r\n        m_rows = 1;\r\n    if (m_cols < 1)\r\n        m_cols = 1;\r\n\r\n    // could work these two out on the fly, but it's easier to have them stored:\r\n    // m_pixel_height = m_region.height() / double(m_rows);\r\n    // m_pixel_width  = m_region.width()  / double(m_cols);\r\n\r\n    m_pixel_lines = depthmapX::RowMatrix<std::vector<int>>(static_cast<size_t>(m_rows), static_cast<size_t>(m_cols));\r\n}\r\n\r\nvoid SpacePixel::reinitLines(double density) {\r\n    m_display_lines.clear();\r\n\r\n    double wh_ratio = m_region.width() / m_region.height();\r\n    double hw_ratio = m_region.height() / m_region.width();\r\n\r\n    m_rows = (int)sqrt(double(m_lines.size()) * wh_ratio * density);\r\n    m_cols = (int)sqrt(double(m_lines.size()) * hw_ratio * density);\r\n\r\n    if (m_rows < 1)\r\n        m_rows = 1;\r\n    if (m_cols < 1)\r\n        m_cols = 1;\r\n\r\n    m_pixel_lines = depthmapX::RowMatrix<std::vector<int>>(static_cast<size_t>(m_rows), static_cast<size_t>(m_cols));\r\n\r\n    // now re-add the lines:\r\n    for (auto line : m_lines) {\r\n        PixelRefVector list = pixelateLine(line.second.line);\r\n        for (size_t j = 0; j < list.size(); j++) {\r\n            // note: m_pixel_lines will be reordered by sortPixelLines\r\n            m_pixel_lines(static_cast<size_t>(list[j].y), static_cast<size_t>(list[j].x)).push_back(line.first);\r\n        }\r\n    }\r\n\r\n    // and finally sort:\r\n    sortPixelLines();\r\n\r\n    // flag as newline just in case:\r\n    m_newline = true;\r\n}\r\n\r\n// Add line: pixelate the line\r\n\r\nvoid SpacePixel::addLine(const Line &line) {\r\n    // Fairly simple: just pixelates the line!\r\n    m_ref++; // need unique keys for the lines so they can be added / removed at any time\r\n    m_lines.insert(std::make_pair(m_ref, LineTest(line, 0)));\r\n    m_newline = true;\r\n\r\n    PixelRefVector list = pixelateLine(line);\r\n\r\n    for (size_t i = 0; i < list.size(); i++) {\r\n        // note: m_pixel_lines will be reordered by sortPixelLines\r\n        m_pixel_lines(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x)).push_back(m_ref);\r\n    }\r\n}\r\n\r\nint SpacePixel::addLineDynamic(const Line &line) {\r\n    m_ref++; // need unique keys for the lines so they can be added / removed at any time\r\n    m_lines.insert(std::make_pair(m_ref, LineTest(line, 0)));\r\n    m_newline = true;\r\n\r\n    PixelRefVector list = pixelateLine(line);\r\n\r\n    for (size_t i = 0; i < list.size(); i++) {\r\n        // note: dynamic lines could be dodgy... only pixelate bits that fall in range\r\n        if (list[i].x >= 0 && list[i].y >= 0 &&\r\n                static_cast<size_t>(list[i].x) < m_cols && static_cast<size_t>(list[i].y) < m_rows) {\r\n            // note, this probably won't be reordered on dynamic\r\n            m_pixel_lines(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x)).push_back(m_ref);\r\n        }\r\n    }\r\n\r\n    return m_ref;\r\n}\r\n\r\nvoid SpacePixel::sortPixelLines() {\r\n    for (size_t i = 0; i < static_cast<size_t>(m_cols); i++) {\r\n        for (size_t j = 0; j < static_cast<size_t>(m_rows); j++) {\r\n            std::vector<int> &pixel_lines = m_pixel_lines(j, i);\r\n            // tidy up in case of removal\r\n            for (auto rev_iter = pixel_lines.rbegin(); rev_iter != pixel_lines.rend(); ++rev_iter) {\r\n                if (m_lines.find(*rev_iter) == m_lines.end()) {\r\n                    pixel_lines.erase(std::next(rev_iter).base());\r\n                }\r\n            }\r\n            std::sort(pixel_lines.begin(), pixel_lines.end());\r\n        }\r\n    }\r\n}\r\n\r\nbool SpacePixel::intersect(const Line &l, double tolerance) {\r\n    m_test++; // note loops! (but vary rarely: inevitabley, lines will have been marked before it loops)\r\n\r\n    PixelRefVector list = pixelateLine(l);\r\n\r\n    for (size_t i = 0; i < list.size(); i++) {\r\n        auto &pixel_lines = m_pixel_lines(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x));\r\n        for (int lineref : pixel_lines) {\r\n            LineTest &linetest = m_lines.find(lineref)->second;\r\n            if (linetest.test != m_test) {\r\n                if (intersect_region(linetest.line, l)) {\r\n                    if (intersect_line(linetest.line, l, tolerance)) {\r\n                        return true;\r\n                    }\r\n                }\r\n                linetest.test = m_test;\r\n            }\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool SpacePixel::intersect_exclude(const Line &l, double tolerance) {\r\n    m_test++; // note loops! (but vary rarely: inevitabley, lines will have been marked before it loops)\r\n\r\n    PixelRefVector list = pixelateLine(l);\r\n\r\n    for (size_t i = 0; i < list.size(); i++) {\r\n        auto &pixel_lines = m_pixel_lines(static_cast<size_t>(list[i].y), static_cast<size_t>(list[i].x));\r\n        for (int lineref : pixel_lines) {\r\n            LineTest &linetest = m_lines.find(lineref)->second;\r\n            if (linetest.test != m_test) {\r\n                if (intersect_region(linetest.line, l)) {\r\n                    if (intersect_line(linetest.line, l, tolerance)) {\r\n                        if (linetest.line.start() != l.start() && linetest.line.start() != l.end() &&\r\n                            linetest.line.end() != l.start() && linetest.line.end() != l.end()) {\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n                linetest.test = m_test;\r\n            }\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nvoid SpacePixel::cutLine(Line &l, short dir) {\r\n    m_test++;\r\n\r\n    double tolerance = l.length() * 1e-9;\r\n\r\n    std::set<double> loc;\r\n    PixelRefVector vec = pixelateLine(l);\r\n\r\n    int axis;\r\n    if (l.width() >= l.height()) {\r\n        axis = XAXIS;\r\n    } else {\r\n        axis = YAXIS;\r\n    }\r\n    Point2f truestart = (dir == l.direction()) ? l.start() : l.end();\r\n    Point2f trueend = (dir == l.direction()) ? l.end() : l.start();\r\n\r\n    bool found = false;\r\n    std::vector<Line> touching_lines;\r\n\r\n    for (size_t i = 0; i < vec.size() && !found; i++) {\r\n        // depending on direction of line either move head to tail or tail to head\r\n        PixelRef pix = (dir == l.direction()) ? vec[i] : vec[vec.size() - 1 - i];\r\n        auto &pixel_lines = m_pixel_lines(static_cast<size_t>(pix.y), static_cast<size_t>(pix.x));\r\n        for (int lineref : pixel_lines) {\r\n            // try {\r\n            LineTest &linetest = m_lines.find(lineref)->second;\r\n            if (linetest.test != m_test) {\r\n                if (intersect_region(linetest.line, l, tolerance * linetest.line.length())) {\r\n                    switch (intersect_line_distinguish(linetest.line, l, tolerance * linetest.line.length())) {\r\n                    case 0:\r\n                        break;\r\n                    case 2: {\r\n                        loc.insert(l.intersection_point(linetest.line, axis));\r\n                    } break;\r\n                    case 1:\r\n                        if (truestart != linetest.line.start() && truestart != linetest.line.end()) {\r\n                            if (!touching_lines.size()) {\r\n                                touching_lines.push_back(linetest.line);\r\n                            } else {\r\n                                Point2f a, b;\r\n                                int pair = -1;\r\n                                // if there may be more than one touches in the same pixel, we have to build a list of\r\n                                // possibles...\r\n                                for (size_t k = 0; k < touching_lines.size() && pair == -1; k++) {\r\n                                    if (linetest.line.start() == touching_lines[k].start() ||\r\n                                        linetest.line.end() == touching_lines[k].end()) {\r\n                                        a = linetest.line.end() - linetest.line.start();\r\n                                        pair = k;\r\n                                    } else if (linetest.line.start() == touching_lines[k].end() ||\r\n                                               linetest.line.end() == touching_lines[k].start()) {\r\n                                        a = linetest.line.start() - linetest.line.end();\r\n                                        pair = k;\r\n                                    }\r\n                                    if (pair != -1) {\r\n                                        b = touching_lines[pair].end() - touching_lines[pair].start();\r\n                                        Point2f p = trueend - truestart;\r\n                                        double oa = det(p, a);\r\n                                        double ob = det(p, b);\r\n                                        if (sgn(oa) != sgn(ob) || fabs(oa) < tolerance * linetest.line.length() ||\r\n                                            fabs(ob) < tolerance * linetest.line.length()) {\r\n                                            // crossed\r\n                                            if (fabs(oa) >\r\n                                                tolerance * linetest.line.length()) { // checks not parallel...\r\n                                                loc.insert(l.intersection_point(linetest.line, axis));\r\n                                            } else if (fabs(ob) > tolerance * linetest.line.length()) {\r\n                                                loc.insert(l.intersection_point(touching_lines[pair], axis));\r\n                                            } else {\r\n                                                // parallel with both lines ... this shouldn't happen...\r\n                                                std::cerr << \"couldn't chop at boundary\" << std::endl;\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                    pair = -1;\r\n                                }\r\n                                touching_lines.push_back(linetest.line);\r\n                            }\r\n                        }\r\n                        break;\r\n                    default:\r\n                        break;\r\n                    }\r\n                }\r\n                linetest.test = m_test;\r\n            }\r\n            //}\r\n            // catch (pexception) {\r\n            // the lineref may have been deleted -- this is supposed to be tidied up\r\n            // just ignore...\r\n            //   cerr << \"cut line exception -- missing line?\" << endl;\r\n            //}\r\n        }\r\n        if (loc.size()) {\r\n            // there's no guarantee the loc actually happened in this pixel...\r\n            // check the first loc actually occurred in this pixel...\r\n            if ((dir == l.direction() && (axis == XAXIS || l.sign() == 1)) ||\r\n                (dir != l.direction() && (axis == YAXIS && l.sign() == -1))) {\r\n                if (pix == pixelate(l.point_on_line(*loc.begin(), axis))) {\r\n                    found = true;\r\n                }\r\n            } else {\r\n                if (pix == pixelate(l.point_on_line(*loc.rbegin(), axis))) {\r\n                    found = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (loc.size()) {\r\n        // it intersected...\r\n        double pos;\r\n        if (dir == l.direction()) {\r\n            if (axis == XAXIS) {\r\n                pos = *loc.begin();\r\n                l.by() = l.ay() + l.sign() * l.height() * (pos - l.ax()) / l.width();\r\n                l.bx() = pos;\r\n            } else if (l.sign() == 1) {\r\n                pos = *loc.begin();\r\n                l.bx() = l.ax() + l.width() * (pos - l.ay()) / l.height();\r\n                l.by() = pos;\r\n            } else {\r\n                pos = *loc.rbegin();\r\n                l.bx() = l.ax() + l.width() * (l.ay() - pos) / l.height();\r\n                l.by() = pos;\r\n            }\r\n        } else {\r\n            if (axis == XAXIS) {\r\n                pos = *loc.rbegin();\r\n                l.ay() = l.by() - l.sign() * l.height() * (l.bx() - pos) / l.width();\r\n                l.ax() = pos;\r\n            } else if (l.sign() == 1) {\r\n                pos = *loc.rbegin();\r\n                l.ax() = l.bx() - l.width() * (l.by() - pos) / l.height();\r\n                l.ay() = pos;\r\n            } else {\r\n                pos = *loc.begin();\r\n                l.ax() = l.bx() - l.width() * (pos - l.by()) / l.height();\r\n                l.ay() = pos;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nbool SpacePixel::read(std::istream &stream) {\r\n    // clear anything that was there:\r\n    m_display_lines.clear();\r\n    m_lines.clear();\r\n\r\n    // read name:\r\n\r\n    m_name = dXstring::readString(stream);\r\n    stream.read((char *)&m_show, sizeof(m_show));\r\n\r\n    if (m_name.empty()) {\r\n        m_name = \"<unknown>\";\r\n    }\r\n\r\n    m_edit = false; // <- just default to not editable on read\r\n\r\n    stream.read((char *)&m_color, sizeof(m_color));\r\n\r\n    // read extents:\r\n    stream.read((char *)&m_region, sizeof(m_region));\r\n\r\n    // read rows / cols\r\n    int rows, cols;\r\n    stream.read(reinterpret_cast<char *>(&rows), sizeof(rows));\r\n    stream.read(reinterpret_cast<char *>(&cols), sizeof(cols));\r\n    m_rows = static_cast<size_t>(rows);\r\n    m_cols = static_cast<size_t>(cols);\r\n\r\n    // could work these two out on the fly, but it's easier to have them stored:\r\n    // m_pixel_height = m_region.height() / double(m_rows);\r\n    // m_pixel_width  = m_region.width()  / double(m_cols);\r\n\r\n    // prepare loader:\r\n    m_pixel_lines = depthmapX::RowMatrix<std::vector<int>>(static_cast<size_t>(m_rows), static_cast<size_t>(m_cols));\r\n\r\n    stream.read((char *)&m_ref, sizeof(m_ref));\r\n    dXreadwrite::readIntoMap(stream, m_lines);\r\n    // now load into structure:\r\n    int n = -1;\r\n    for (auto line : m_lines) {\r\n        n++;\r\n\r\n        PixelRefVector list = pixelateLine(line.second.line);\r\n\r\n        for (size_t m = 0; m < list.size(); m++) {\r\n            // note: m_pixel_lines is an *ordered* list! --- used by other ops.\r\n            m_pixel_lines(static_cast<size_t>(list[m].y), static_cast<size_t>(list[m].x)).push_back(n);\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool SpacePixel::write(std::ofstream &stream) {\r\n    // write name:\r\n    dXstring::writeString(stream, m_name);\r\n    stream.write((char *)&m_show, sizeof(m_show));\r\n    stream.write((char *)&m_color, sizeof(m_color));\r\n\r\n    // write extents:\r\n    stream.write((char *)&m_region, sizeof(m_region));\r\n\r\n    // write rows / cols\r\n    int rows = static_cast<int>(m_rows);\r\n    int cols = static_cast<int>(m_cols);\r\n    stream.write(reinterpret_cast<char *>(&rows), sizeof(rows));\r\n    stream.write(reinterpret_cast<char *>(&cols), sizeof(cols));\r\n\r\n    // write lines:\r\n    stream.write((char *)&m_ref, sizeof(m_ref));\r\n\r\n    dXreadwrite::writeMap(stream, m_lines);\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "salalib/spacepix.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n// Copyright (C) 2018, Petros Koutsolampros\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n#pragma once\r\n\r\n#include \"salalib/pafcolor.h\"\r\n#include \"salalib/pixelref.h\"\r\n\r\n#include \"genlib/p2dpoly.h\"\r\n#include \"genlib/pafmath.h\"\r\n#include \"genlib/simplematrix.h\"\r\n#include \"genlib/stringutils.h\"\r\n\r\n#include <deque>\r\n#include <map>\r\n\r\nclass SalaShape;\r\n\r\nclass PixelBase {\r\n  protected:\r\n    size_t m_rows;\r\n    size_t m_cols;\r\n    QtRegion m_region;\r\n\r\n  public:\r\n    PixelBase() { ; }\r\n    // constrain is constrain to bounding box (i.e., in row / col bounds)\r\n    virtual PixelRef pixelate(const Point2f &, bool constrain = true, int scalefactor = 1) const = 0;\r\n    PixelRefVector pixelateLine(Line l, int scalefactor = 1) const;\r\n    PixelRefVector pixelateLineTouching(Line l, double tolerance) const;\r\n    PixelRefVector quickPixelateLine(PixelRef p, PixelRef q);\r\n    bool includes(const PixelRef pix) const { return (pix.x >= 0 && pix.x < static_cast<short>(m_cols) &&\r\n                                                      pix.y >= 0 && pix.y < static_cast<short>(m_rows)); }\r\n    size_t getCols() const { return m_cols; }\r\n    size_t getRows() const { return m_rows; }\r\n    const QtRegion &getRegion() const { return m_region; }\r\n};\r\n\r\n/////////////////////////////////////////////\r\n\r\n// couple of quick helpers\r\n\r\nstruct LineTest {\r\n    Line line;\r\n    unsigned int test;\r\n    LineTest(const Line &l = Line(), int t = -1) {\r\n        line = l;\r\n        test = t;\r\n    }\r\n    // operator Line() {return line;}\r\n};\r\n\r\nstruct LineKey {\r\n    unsigned int file : 4;\r\n    unsigned int layer : 6;\r\n    unsigned int lineref : 20;\r\n    operator int() { return *(int *)this; }\r\n    LineKey(int value = 0) { *(int *)this = value; }\r\n    friend bool operator<(LineKey a, LineKey b);\r\n    friend bool operator>(LineKey a, LineKey b);\r\n    friend bool operator==(LineKey a, LineKey b);\r\n};\r\ninline bool operator<(LineKey a, LineKey b) { return int(a) < int(b); }\r\ninline bool operator>(LineKey a, LineKey b) { return int(a) > int(b); }\r\ninline bool operator==(LineKey a, LineKey b) { return int(a) == int(b); }\r\n\r\n/////////////////////////////////////////////\r\n\r\nclass SpacePixel : public PixelBase {\r\n    friend class PointMap;\r\n    friend class AxialMaps;\r\n    friend class AxialPolygons;\r\n    friend class ShapeMap; // for transfer to everything being ShapeMaps\r\n  protected:\r\n    bool m_lock;\r\n    mutable bool m_newline;\r\n\r\n  protected:\r\n    PafColor m_color;\r\n    int m_style; // allows for bold / dotted lines etc\r\n    std::string m_name;\r\n    bool m_show;\r\n    bool m_edit;\r\n    depthmapX::RowMatrix<std::vector<int>> m_pixel_lines;\r\n\r\n    int m_ref;\r\n    std::map<int, LineTest> m_lines;\r\n    //\r\n    // for screen drawing\r\n    mutable std::vector<int> m_display_lines;\r\n    mutable int m_current;\r\n    //\r\n    // for line testing\r\n    mutable unsigned int m_test;\r\n    //\r\n  public:\r\n    SpacePixel(const std::string &name = std::string(\"Default\"));\r\n    //\r\n    SpacePixel(const SpacePixel &spacepixel);\r\n    SpacePixel &operator=(const SpacePixel &spacepixel);\r\n    void construct(const SpacePixel &spacepixel);\r\n    //\r\n    PixelRef pixelate(const Point2f &p, bool constrain = true, int = 1) const;\r\n    //   PixelRefVector pixelate( const Line& l ) const;\r\n    //\r\n    void initLines(int size, const Point2f &min, const Point2f &max, double density = 1.0);\r\n    void reinitLines(double density); // just reinitialises pixel lines, keeps lines, current ref and test setting\r\n    //\r\n    void addLine(const Line &l);\r\n    void sortPixelLines();\r\n    //\r\n    int addLineDynamic(const Line &l);\r\n\r\n    virtual void makeViewportLines(const QtRegion &viewport) const;\r\n    virtual bool findNextLine(bool &) const;\r\n    virtual const Line &getNextLine() const;\r\n    //\r\n    bool intersect(const Line &l, double tolerance = 0.0);\r\n    bool intersect_exclude(const Line &l, double tolerance = 0.0);\r\n\r\n    void cutLine(Line &l, short dir);\r\n\r\n    QtRegion &getRegion() const { return (QtRegion &)m_region; }\r\n\r\n    void setRegion(QtRegion &region) { m_region = region; }\r\n    //\r\n    const std::map<int, LineTest> &getAllLines() const // Danger! Use solely to look at the raw line data\r\n    {\r\n        return m_lines;\r\n    }\r\n    //\r\n    // For easy layer manipulation:\r\n    void setName(const std::string &name) { m_name = name; }\r\n    std::string getName() { return m_name; }\r\n    void setShow(bool show = true) { m_show = show; }\r\n    bool isShown() const { return m_show; }\r\n    void setEditable(bool edit = true) { m_edit = edit; }\r\n    bool isEditable() const { return m_edit; }\r\n\r\n  public:\r\n    virtual bool read(std::istream &stream);\r\n    virtual bool write(std::ofstream &stream);\r\n    friend bool operator==(const SpacePixel &a, const SpacePixel &b);\r\n};\r\n\r\n// simply check they are the same name... useful for findindex from the group\r\ninline bool operator==(const SpacePixel &a, const SpacePixel &b) { return a.m_name == b.m_name; }\r\n"
  },
  {
    "path": "salalib/spacepixfile.cpp",
    "content": "#include \"salalib/spacepixfile.h\"\n\nvoid SpacePixelFile::makeViewportShapes( const QtRegion& viewport ) const\n{\n   m_current_layer = -1;\n   for (size_t i = m_spacePixels.size() - 1; static_cast<int>(i) != -1; i--) {\n      if (m_spacePixels[i].isShown()) {\n         m_current_layer = (int) i;\n         m_spacePixels[i].makeViewportShapes( (viewport.atZero() ? m_region : viewport) );\n      }\n   }\n}\n\nbool SpacePixelFile::findNextShape(bool& nextlayer) const\n{\n   if (m_current_layer == -1)\n      return false;\n   while (!m_spacePixels[m_current_layer].findNextShape(nextlayer)) {\n      while (++m_current_layer < (int)m_spacePixels.size() && !m_spacePixels[m_current_layer].isShown());\n      if (m_current_layer == static_cast<int>(m_spacePixels.size())) {\n         m_current_layer = -1;\n         return false;\n      }\n   }\n   return true;\n}\n\nbool SpacePixelFile::read( std::istream& stream )\n{\n   m_name = dXstring::readString(stream);\n   stream.read( (char *) &m_region, sizeof(m_region) );\n   int count;\n   stream.read( (char *) &count, sizeof(count) );\n   for (int i = 0; i < count; i++) {\n       m_spacePixels.emplace_back();\n       m_spacePixels.back().read(stream);\n   }\n\n   if (m_name.empty()) {\n      m_name = \"<unknown>\";\n   }\n   return true;\n}\n\nbool SpacePixelFile::write( std::ofstream& stream )\n{\n   dXstring::writeString(stream, m_name);\n   stream.write( (char *) &m_region, sizeof(m_region) );\n\n   // Quick mod - TV\n   int count = m_spacePixels.size();\n   stream.write( (char *) &count, sizeof(count) );\n   for (auto& spacePixel: m_spacePixels) {\n      spacePixel.write(stream);\n   }\n   return true;\n}\n"
  },
  {
    "path": "salalib/spacepixfile.h",
    "content": "#pragma once\n\n#include \"salalib/shapemap.h\"\n#include \"genlib/p2dpoly.h\"\n#include <deque>\n#include <string>\n\nclass SpacePixelFile\n{\nprotected:\n   std::string m_name;   // <- file name\n   mutable int m_current_layer;\npublic:\n   std::deque<ShapeMap> m_spacePixels;\n   QtRegion m_region;  // easier public for now\n   //\n   SpacePixelFile(const std::string& name = std::string())\n   { m_name = name; m_current_layer = -1; }\n   SpacePixelFile(SpacePixelFile&& other):\n       m_name(other.m_name),\n       m_current_layer(other.m_current_layer),\n       m_spacePixels(std::move(other.m_spacePixels)),\n       m_region(std::move(other.m_region)) {}\n   SpacePixelFile& operator =(SpacePixelFile&& other) {\n       m_name = other.m_name;\n       m_current_layer = other.m_current_layer;\n       m_spacePixels = std::move(other.m_spacePixels);\n       m_region = std::move(other.m_region);\n       return *this;\n   }\n   SpacePixelFile(const SpacePixelFile&) = delete;\n   SpacePixelFile& operator =(const SpacePixelFile&) = delete;\n\n   void setName(const std::string& name)\n   { m_name = name; }\n   const std::string& getName() const\n   { return m_name; }\n   //\n   QtRegion& getRegion() const\n      { return (QtRegion&) m_region; }\n   //\n   // Screen functionality:\n   void makeViewportShapes( const QtRegion& viewport = QtRegion() ) const;\n   bool findNextShape(bool& nextlayer) const;\n\n   const SalaShape& getNextShape() const\n      { return m_spacePixels[m_current_layer].getNextShape(); }\n\n   // Is any one sublayer shown?\n\n   bool isShown() const\n      { for (size_t i = 0; i < m_spacePixels.size(); i++) if (m_spacePixels[i].isShown()) return true; return false; }\n   //\npublic:\n   bool read(std::istream &stream);\n   bool write(std::ofstream& stream);\n};\n"
  },
  {
    "path": "salalib/sparksieve2.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n/////////////////////////////////////////////////////////////////////////////////\r\n\r\n// New spark sieve implemementation (more accurate)\r\n\r\n#include <math.h>\r\n\r\n#include <salalib/mgraph.h>\r\n#include <salalib/spacepix.h>\r\n#include <salalib/pointdata.h>\r\n\r\n#include \"sparksieve2.h\"\r\n\r\nsparkSieve2::sparkSieve2( const Point2f& centre, double maxdist )\r\n{\r\n   m_centre = centre;\r\n   m_maxdist = maxdist;\r\n\r\n   m_gaps.push_back( sparkZone2(0.0, 1.0) );\r\n}\r\n\r\nsparkSieve2::~sparkSieve2()\r\n{\r\n}\r\n\r\nbool sparkSieve2::testblock( const Point2f& point, const std::vector<Line>& lines, double tolerance )\r\n{\r\n   Line l(m_centre, point);\r\n\r\n   // maxdist is to construct graphs with a maximum visible distance: (-1.0 is infinite)\r\n   if (m_maxdist != -1.0 && l.length() > m_maxdist) {\r\n      return true;\r\n   }\r\n\r\n   for (auto line: lines)\r\n   {\r\n      // Note: must check regions intersect before using this intersect_line test -- see notes on intersect_line\r\n      if (intersect_region(l,line,tolerance) && intersect_line(l,line,tolerance)) {\r\n         return true;\r\n      }\r\n   }\r\n\r\n   return false;\r\n}\r\n\r\n//\r\n\r\nvoid sparkSieve2::block( const std::vector<Line>& lines, int q )\r\n{\r\n   for (auto line: lines) {\r\n      double a = tanify(line.start(), q);\r\n      double b = tanify(line.end(), q);\r\n\r\n      sparkZone2 block;\r\n      if (a < b) {\r\n         block.start = a - 1e-10;   // 1e-10 required for floating point error\r\n         block.end = b + 1e-10;\r\n      }\r\n      else {\r\n         block.start = b - 1e-10;   // 1e-10 required for floating point error\r\n         block.end = a + 1e-10;\r\n      }\r\n      // this creates a list of blocks sorted by start location\r\n      m_blocks.push_back(block);\r\n   }\r\n   std::sort( m_blocks.begin(), m_blocks.end() );\r\n   m_blocks.erase( std::unique( m_blocks.begin(), m_blocks.end() ), m_blocks.end() );\r\n}\r\n\r\nvoid sparkSieve2::collectgarbage()\r\n{\r\n   auto iter = m_gaps.begin();\r\n   auto blockIter = m_blocks.begin();\r\n\r\n   for (; blockIter != m_blocks.end() && iter != m_gaps.end();)\r\n   {\r\n      if (blockIter->end < iter->start) {\r\n         blockIter++;\r\n         continue;\r\n      }\r\n      bool create = true;\r\n      if (blockIter->start <= iter->start) {\r\n         create = false;\r\n         if (blockIter->end > iter->start) {\r\n            // simply move the start in front of us\r\n            iter->start = blockIter->end;\r\n         }\r\n      }\r\n      if (blockIter->end >= iter->end) {\r\n         create = false;\r\n         if (blockIter->start < iter->end) {\r\n            // move the end behind us\r\n            iter->end = blockIter->start;\r\n         }\r\n      }\r\n      if (iter->end <= iter->start + 1e-10) { // 1e-10 required for floating point error\r\n         iter = m_gaps.erase(iter);\r\n         continue;  // on the next iteration, stay with this block\r\n      }\r\n      else if (blockIter->end > iter->end) {\r\n         ++iter;\r\n         continue; // on the next iteration, stay with this block\r\n      }\r\n      else if (create) {\r\n         // add a new gap (has to be behind us), and move the start in front of us\r\n         m_gaps.insert(iter, sparkZone2( iter->start, blockIter->start ) );\r\n         iter->start = blockIter->end;\r\n      }\r\n      blockIter++;\r\n   }\r\n   // reset blocks for next row:\r\n   m_blocks.clear();\r\n}\r\n\r\n/* q quadrants:\r\n*\r\n*       \\ 6 | 7 /\r\n*       0 \\ | / 1\r\n*       - -   - -\r\n*       2 / | \\ 3\r\n*       / 4 | 5 \\\r\n*/\r\n\r\ndouble sparkSieve2::tanify( const Point2f& point, int q )\r\n{\r\n   switch (q)\r\n   {\r\n   case 0:\r\n      return (point.y - m_centre.y) / (m_centre.x - point.x);\r\n      break;\r\n   case 1:\r\n      return (point.y - m_centre.y) / (point.x - m_centre.x);\r\n      break;\r\n   case 2:\r\n      return (m_centre.y - point.y) / (m_centre.x - point.x);\r\n      break;\r\n   case 3:\r\n      return (m_centre.y - point.y) / (point.x - m_centre.x);\r\n      break;\r\n   case 4:\r\n      return (m_centre.x - point.x) / (m_centre.y - point.y);\r\n      break;\r\n   case 5:\r\n      return (point.x - m_centre.x) / (m_centre.y - point.y);\r\n      break;\r\n   case 6:\r\n      return (m_centre.x - point.x) / (point.y - m_centre.y);\r\n      break;\r\n   case 7:\r\n      return (point.x - m_centre.x) / (point.y - m_centre.y);\r\n      break;\r\n   }\r\n   return -1.0;\r\n}\r\n"
  },
  {
    "path": "salalib/sparksieve2.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\r\n// Copyright (C) 2011-2012, Tasos Varoudis\r\n\r\n// This program is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n\r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n\r\n// You should have received a copy of the GNU General Public License\r\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n\r\n\r\n// This is my code to make a set of axial lines from a set of boundary lines\r\n\r\n#ifndef __SPARKSIEVE2_H__\r\n#define __SPARKSIEVE2_H__\r\n\r\n#include <float.h>\r\n#include \"genlib/p2dpoly.h\"\r\n#include <list>\r\n#include <map>\r\n\r\nclass sparkSieve2\r\n{\r\npublic:\r\n   struct sparkZone2{\r\n      double start;\r\n      double end;\r\n      bool remove;\r\n      sparkZone2( double s = 0.0, double e = 0.0 )\r\n      { start = s; end = e; remove = false; }\r\n      // to allow ordered lists:\r\n      friend bool operator == (const sparkZone2& a, const sparkZone2& b);\r\n      friend bool operator != (const sparkZone2& a, const sparkZone2& b);\r\n      friend bool operator < (const sparkZone2& a, const sparkZone2& b);\r\n      friend bool operator > (const sparkZone2& a, const sparkZone2& b);\r\n   };\r\nprivate:\r\n   Point2f m_centre;\r\n   double m_maxdist; // for creating graphs that only see out a certain distance: set to -1.0 for infinite\r\n   std::vector<sparkZone2> m_blocks;\r\npublic:\r\n   std::list<sparkZone2> m_gaps;\r\npublic:\r\n   sparkSieve2( const Point2f& centre, double maxdist = -1.0 );\r\n   ~sparkSieve2();\r\n   bool testblock(const Point2f& point, const std::vector<Line> &lines, double tolerance );\r\n   void block(const std::vector<Line> &lines, int q );\r\n   void collectgarbage();\r\n   double tanify( const Point2f& point, int q );\r\n   //\r\n   bool hasGaps() const \r\n   {\r\n      return (!m_gaps.empty());\r\n   }\r\n};\r\n\r\ninline bool operator == (const sparkSieve2::sparkZone2& a, const sparkSieve2::sparkZone2& b)\r\n{\r\n   return (a.start == b.start && a.end == b.end);\r\n}\r\ninline bool operator != (const sparkSieve2::sparkZone2& a, const sparkSieve2::sparkZone2& b)\r\n{\r\n   return (a.start != b.start || a.end != b.end);\r\n}\r\ninline bool operator < (const sparkSieve2::sparkZone2& a, const sparkSieve2::sparkZone2& b)\r\n{\r\n   return (a.start == b.start) ? (a.end > b.end) : (a.start < b.start);\r\n}\r\ninline bool operator > (const sparkSieve2::sparkZone2& a, const sparkSieve2::sparkZone2& b)\r\n{\r\n   return (a.start == b.start) ? (a.end < b.end) : (a.start > b.start);\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "salalib/tidylines.cpp",
    "content": "#include \"salalib/tidylines.h\"\n#include \"salalib/tolerances.h\"\n\n// helper -- a little class to tidy up a set of lines\n\nvoid TidyLines::tidy(std::vector<Line>& lines, const QtRegion& region)\n{\n   m_region = region;\n   double maxdim = std::max(m_region.width(),m_region.height());\n\n   // simple first pass -- remove very short lines\n   lines.erase(\n               std::remove_if(lines.begin(), lines.end(),\n                              [maxdim](const Line& line)\n   {return line.length() < maxdim * TOLERANCE_B;}), lines.end());\n\n   // now load up m_lines...\n   initLines(lines.size(),m_region.bottom_left,m_region.top_right);\n   for (auto& line: lines) {\n      addLine(line);\n   }\n   sortPixelLines();\n\n   std::vector<int> removelist;\n   for (size_t i = 0; i < lines.size(); i++) {\n      // n.b., as m_lines have just been made, note that what's in m_lines matches whats in lines\n      // we will use this later!\n      m_test++;\n      m_lines[i].test = m_test;\n      PixelRefVector list = pixelateLine( m_lines[i].line );\n      for (size_t a = 0; a < list.size(); a++) {\n         auto pixel_lines = m_pixel_lines(static_cast<size_t>(list[a].y), static_cast<size_t>(list[a].x));\n         for (int j: pixel_lines) {\n            if (m_lines[j].test != m_test && j > (int)i && intersect_region(lines[i],lines[j],TOLERANCE_B * maxdim)) {\n               m_lines[j].test = m_test;\n               int axis_i = (lines[i].width() >= lines[i].height()) ? XAXIS : YAXIS;\n               int axis_j = (lines[j].width() >= lines[j].height()) ? XAXIS : YAXIS;\n               int axis_reverse = (axis_i == XAXIS) ? YAXIS : XAXIS;\n               if (axis_i == axis_j && fabs(lines[i].grad(axis_reverse) - lines[j].grad(axis_reverse)) < TOLERANCE_A\n                                    && fabs(lines[i].constant(axis_reverse) - lines[j].constant(axis_reverse)) < (TOLERANCE_B * maxdim)) {\n                  // check for overlap and merge\n                  int parity = (axis_i == XAXIS) ? 1 : lines[i].sign();\n                  if ((lines[i].start()[axis_i] * parity + TOLERANCE_B * maxdim) > (lines[j].start()[axis_j] * parity) &&\n                      (lines[i].start()[axis_i] * parity) < (lines[j].end()[axis_j] * parity + TOLERANCE_B * maxdim)) {\n                     int end = ((lines[i].end()[axis_i] * parity) > (lines[j].end()[axis_j] * parity)) ? i : j;\n                     lines[j].bx() = lines[end].bx();\n                     lines[j].by() = lines[end].by();\n                     removelist.push_back(i);\n                     continue; // <- don't do this any more, we've zapped it and replaced it with the later line\n                  }\n                  if ((lines[j].start()[axis_j] * parity + TOLERANCE_B * maxdim) > (lines[i].start()[axis_i] * parity) &&\n                      (lines[j].start()[axis_j] * parity) < (lines[i].end()[axis_i]  * parity + TOLERANCE_B * maxdim)) {\n                     int end = ((lines[i].end()[axis_i] * parity) > (lines[j].end()[axis_j] * parity)) ? i : j;\n                     lines[j].ax() = lines[i].ax();\n                     lines[j].ay() = lines[i].ay();\n                     lines[j].bx() = lines[end].bx();\n                     lines[j].by() = lines[end].by();\n                     removelist.push_back(i);\n                     continue; // <- don't do this any more, we've zapped it and replaced it with the later line\n                  }\n               }\n            }\n         }\n      }\n   }\n\n   // comes out sorted, remove duplicates just in case\n   removelist.erase(std::unique(removelist.begin(), removelist.end()), removelist.end());\n\n   for(auto iter = removelist.rbegin(); iter != removelist.rend(); ++iter)\n       lines.erase(lines.begin() + *iter);\n   removelist.clear();  // always clear this list, it's reused\n}\n\nvoid TidyLines::quicktidy(std::map<int, std::pair<Line, int>>& lines, const QtRegion& region)\n{\n   m_region = region;\n\n   double avglen = 0.0;\n\n   for (auto line: lines) {\n      avglen += line.second.first.length();\n   }\n   avglen /= lines.size();\n\n   double tolerance = avglen * 10e-6;\n\n   auto iter = lines.begin(), end = lines.end();\n   for(; iter != end; ) {\n       if (iter->second.first.length() < tolerance) {\n           iter = lines.erase(iter);\n       } else {\n           ++iter;\n       }\n   }\n\n   // now load up m_lines...\n   initLines(lines.size(),m_region.bottom_left,m_region.top_right);\n   for (auto line: lines) {\n      addLine(line.second.first);\n   }\n   sortPixelLines();\n\n   // and chop duplicate lines:\n   std::vector<int> removelist;\n   int i = -1;\n   for (auto line: lines) {\n      i++;\n      PixelRef start = pixelate(line.second.first.start());\n      auto& pixel_lines = m_pixel_lines(static_cast<size_t>(start.y), static_cast<size_t>(start.x));\n      for (int k: pixel_lines) {\n         if (k > int(i) && approxeq(m_lines[i].line.start(),m_lines[k].line.start(),tolerance)) {\n            if (approxeq(m_lines[i].line.end(),m_lines[k].line.end(),tolerance)) {\n               removelist.push_back(line.first);\n               break;\n            }\n         }\n      }\n   }\n   for(int remove: removelist) {\n       lines.erase(remove);\n   }\n   removelist.clear(); // always clear this list, it's reused}\n}\n"
  },
  {
    "path": "salalib/tidylines.h",
    "content": "#pragma once\n\n#include \"salalib/spacepix.h\"\n\n#include \"genlib/p2dpoly.h\"\n\n// helpers... a class to tidy up ugly maps people may give me...\n\nclass TidyLines : public SpacePixel\n{\npublic:\n   void tidy(std::vector<Line> &lines, const QtRegion& region);\n   void quicktidy(std::map<int, std::pair<Line, int> > &lines, const QtRegion& region);\n};\n"
  },
  {
    "path": "salalib/tolerances.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2018 Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\nstatic const double TOLERANCE_A = 1e-9;\nstatic const double TOLERANCE_B = 1e-12;\nstatic const double TOLERANCE_C = 1e-6;\n"
  },
  {
    "path": "salalib/vgamodules/CMakeLists.txt",
    "content": "target_sources(salalib\n    PRIVATE\n       vgaisovist.cpp \n       vgaangular.cpp\n       vgametric.cpp\n       vgathroughvision.cpp\n       vgavisuallocal.cpp\n       vgavisualglobal.cpp\n       vgaangulardepth.cpp\n       vgametricdepth.cpp\n       vgavisualglobaldepth.cpp\n    PUBLIC\n       vgaangular.h\n       vgametric.h\n       vgavisualglobal.h\n       vgaangulardepth.h\n       vgametricdepth.h\n       vgavisualglobaldepth.h\n       vgaisovist.h\n       vgathroughvision.h\n       vgavisuallocal.h)\n"
  },
  {
    "path": "salalib/vgamodules/vgaangular.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgaangular.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAAngular::run(Communicator *comm, PointMap &map, bool) {\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getFilledPointCount());\n    }\n\n    std::string radius_text;\n    if (m_radius != -1.0) {\n        if (map.getRegion().width() > 100.0) {\n            radius_text = std::string(\" R\") + dXstring::formatString(m_radius, \"%.f\");\n        } else if (map.getRegion().width() < 1.0) {\n            radius_text = std::string(\" R\") + dXstring::formatString(m_radius, \"%.4f\");\n        } else {\n            radius_text = std::string(\" R\") + dXstring::formatString(m_radius, \"%.2f\");\n        }\n    }\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // n.b. these must be entered in alphabetical order to preserve col indexing:\n    std::string mean_depth_col_text = std::string(\"Angular Mean Depth\") + radius_text;\n    int mean_depth_col = attributes.getOrInsertColumn(mean_depth_col_text.c_str());\n    std::string total_detph_col_text = std::string(\"Angular Total Depth\") + radius_text;\n    int total_depth_col = attributes.getOrInsertColumn(total_detph_col_text.c_str());\n    std::string count_col_text = std::string(\"Angular Node Count\") + radius_text;\n    int count_col = attributes.getOrInsertColumn(count_col_text.c_str());\n\n    // TODO: Binary compatibility. Remove in re-examination\n    total_depth_col = attributes.getOrInsertColumn(total_detph_col_text.c_str());\n\n    int count = 0;\n\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n\n            if (map.getPoint(curs).filled()) {\n\n                if (m_gates_only) {\n                    count++;\n                    continue;\n                }\n\n                // TODO: Break out miscs/dist/cumangle into local variables and remove from Point class\n                for (auto &point : map.getPoints()) {\n                    point.m_misc = 0;\n                    point.m_dist = 0.0f;\n                    point.m_cumangle = -1.0f;\n                }\n\n                float total_angle = 0.0f;\n                int total_nodes = 0;\n\n                // note that m_misc is used in a different manner to analyseGraph / PointDepth\n                // here it marks the node as used in calculation only\n\n                std::set<AngularTriple> search_list;\n                search_list.insert(AngularTriple(0.0f, curs, NoPixel));\n                map.getPoint(curs).m_cumangle = 0.0f;\n                while (search_list.size()) {\n                    std::set<AngularTriple>::iterator it = search_list.begin();\n                    AngularTriple here = *it;\n                    search_list.erase(it);\n                    if (m_radius != -1.0 && here.angle > m_radius) {\n                        break;\n                    }\n                    Point &p = map.getPoint(here.pixel);\n                    // nb, the filled check is necessary as diagonals seem to be stored with 'gaps' left in\n                    if (p.filled() && p.m_misc != ~0) {\n                        p.getNode().extractAngular(search_list, &map, here);\n                        p.m_misc = ~0;\n                        if (!p.getMergePixel().empty()) {\n                            Point &p2 = map.getPoint(p.getMergePixel());\n                            if (p2.m_misc != ~0) {\n                                p2.m_cumangle = p.m_cumangle;\n                                p2.getNode().extractAngular(search_list, &map,\n                                                            AngularTriple(here.angle, p.getMergePixel(), NoPixel));\n                                p2.m_misc = ~0;\n                            }\n                        }\n                        total_angle += p.m_cumangle;\n                        total_nodes += 1;\n                    }\n                }\n\n                AttributeRow &row = map.getAttributeTable().getRow(AttributeKey(curs));\n                if (total_nodes > 0) {\n                    row.setValue(mean_depth_col, float(double(total_angle) / double(total_nodes)));\n                }\n                row.setValue(total_depth_col, total_angle);\n                row.setValue(count_col, float(total_nodes));\n\n                count++; // <- increment count\n            }\n            if (comm) {\n                if (qtimer(atime, 500)) {\n                    if (comm->IsCancelled()) {\n                        throw Communicator::CancelledException();\n                    }\n                    comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\n                }\n            }\n        }\n    }\n\n    map.setDisplayedAttribute(-2);\n    map.setDisplayedAttribute(mean_depth_col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgaangular.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAAngular : IVGA {\n  private:\n    double m_radius;\n    bool m_gates_only;\n\n  public:\n    std::string getAnalysisName() const override { return \"Angular Analysis\"; }\n    bool run(Communicator *, PointMap &map, bool) override;\n    VGAAngular(double radius, bool gates_only) : m_radius(radius), m_gates_only(gates_only) {}\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgaangulardepth.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgaangulardepth.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAAngularDepth::run(Communicator *, PointMap &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // n.b., insert columns sets values to -1 if the column already exists\n    int path_angle_col = attributes.insertOrResetColumn(\"Angular Step Depth\");\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        PixelRef pix = iter->getKey().value;\n        map.getPoint(pix).m_misc = 0;\n        map.getPoint(pix).m_dist = 0.0f;\n        map.getPoint(pix).m_cumangle = -1.0f;\n    }\n\n    std::set<AngularTriple> search_list; // contains root point\n\n    for (auto &sel : map.getSelSet()) {\n        search_list.insert(AngularTriple(0.0f, sel, NoPixel));\n        map.getPoint(sel).m_cumangle = 0.0f;\n    }\n\n    // note that m_misc is used in a different manner to analyseGraph / PointDepth\n    // here it marks the node as used in calculation only\n    while (search_list.size()) {\n        std::set<AngularTriple>::iterator it = search_list.begin();\n        AngularTriple here = *it;\n        search_list.erase(it);\n        Point &p = map.getPoint(here.pixel);\n        // nb, the filled check is necessary as diagonals seem to be stored with 'gaps' left in\n        if (p.filled() && p.m_misc != ~0) {\n            p.getNode().extractAngular(search_list, &map, here);\n            p.m_misc = ~0;\n            AttributeRow &row = map.getAttributeTable().getRow(AttributeKey(here.pixel));\n            row.setValue(path_angle_col, float(p.m_cumangle));\n            if (!p.getMergePixel().empty()) {\n                Point &p2 = map.getPoint(p.getMergePixel());\n                if (p2.m_misc != ~0) {\n                    p2.m_cumangle = p.m_cumangle;\n                    AttributeRow &mergePixelRow = map.getAttributeTable().getRow(AttributeKey(p.getMergePixel()));\n                    mergePixelRow.setValue(path_angle_col, float(p2.m_cumangle));\n                    p2.getNode().extractAngular(search_list, &map,\n                                                AngularTriple(here.angle, p.getMergePixel(), NoPixel));\n                    p2.m_misc = ~0;\n                }\n            }\n        }\n    }\n\n    map.setDisplayedAttribute(-2);\n    map.setDisplayedAttribute(path_angle_col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgaangulardepth.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAAngularDepth : IVGA {\n  public:\n    std::string getAnalysisName() const override { return \"Angular Depth\"; }\n    bool run(Communicator *comm, PointMap &map, bool) override;\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgaisovist.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgaisovist.h\"\n#include \"salalib/isovist.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAIsovist::run(Communicator *comm, PointMap &map, bool simple_version) {\n    map.m_hasIsovistAnalysis = false;\n\n    // note, BSP tree plays with comm counting...\n    if(comm) {\n        comm->CommPostMessage(Communicator::NUM_STEPS, 2);\n        comm->CommPostMessage(Communicator::CURRENT_STEP, 1);\n    }\n    BSPNode bspRoot = makeBSPtree(comm, map.getDrawingFiles());\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    if(comm) comm->CommPostMessage(Communicator::CURRENT_STEP, 2);\n\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getFilledPointCount());\n    }\n    int count = 0;\n\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n            if (map.getPoint(curs).filled()) {\n                count++;\n                if (map.getPoint(curs).contextfilled() && !curs.iseven()) {\n                    continue;\n                }\n                Isovist isovist;\n                isovist.makeit(&bspRoot, map.depixelate(curs), map.getRegion(), 0, 0);\n\n                AttributeRow &row = attributes.getRow(AttributeKey(curs));\n                isovist.setData(attributes, row, simple_version);\n                Node &node = map.getPoint(curs).getNode();\n                std::vector<PixelRef> *occ = node.m_occlusion_bins;\n                for (size_t k = 0; k < 32; k++) {\n                    occ[k].clear();\n                    node.bin(static_cast<int>(k)).setOccDistance(0.0f);\n                }\n                for (size_t k = 0; k < isovist.getOcclusionPoints().size(); k++) {\n                    const PointDist &pointdist = isovist.getOcclusionPoints().at(k);\n                    int bin = whichbin(pointdist.m_point - map.depixelate(curs));\n                    // only occlusion bins with a certain distance recorded (arbitrary scale note!)\n                    if (pointdist.m_dist > 1.5) {\n                        PixelRef pix = map.pixelate(pointdist.m_point);\n                        if (pix != curs) {\n                            occ[bin].push_back(pix);\n                        }\n                    }\n                    node.bin(bin).setOccDistance(static_cast<float>(pointdist.m_dist));\n                }\n            }\n            if (comm) {\n                if (qtimer(atime, 500)) {\n                    if (comm->IsCancelled()) {\n                        throw Communicator::CancelledException();\n                    }\n                    comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\n                }\n            }\n        }\n    }\n    map.m_hasIsovistAnalysis = true;\n\n    return true;\n}\n\nBSPNode VGAIsovist::makeBSPtree(Communicator *communicator, const std::vector<SpacePixelFile>& drawingFiles) {\n    std::vector<TaggedLine> partitionlines;\n    for (const auto &pixelGroup : drawingFiles) {\n        for (const auto &pixel : pixelGroup.m_spacePixels) {\n            // chooses the first editable layer it can find:\n            if (pixel.isShown()) {\n                auto refShapes = pixel.getAllShapes();\n                int k = -1;\n                for (const auto &refShape : refShapes) {\n                    k++;\n                    std::vector<Line> newLines = refShape.second.getAsLines();\n                    // I'm not sure what the tagging was meant for any more,\n                    // tagging at the moment tags the *polygon* it was original attached to\n                    // must check it is not a zero length line:\n                    for (const Line &line : newLines) {\n                        if (line.length() > 0.0) {\n                            partitionlines.push_back(TaggedLine(line, k));\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    BSPNode bspRoot;\n    if (partitionlines.size()) {\n\n        time_t atime = 0;\n        if(communicator) {\n            communicator->CommPostMessage(Communicator::NUM_RECORDS, static_cast<int>(partitionlines.size()));\n            qtimer(atime, 0);\n        }\n\n        BSPTree::make(communicator, atime, partitionlines, &bspRoot);\n    }\n\n    return bspRoot;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgaisovist.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAIsovist : IVGA {\n  public:\n    std::string getAnalysisName() const override { return \"Isovist Analysis\"; }\n    bool run(Communicator *comm, PointMap &map, bool simple_version) override;\n    BSPNode makeBSPtree(Communicator *communicator, const std::vector<SpacePixelFile> &drawingFiles);\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgametric.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgametric.h\"\n\n#include \"genlib/stringutils.h\"\n\n// This is a slow algorithm, but should give the correct answer\n// for demonstrative purposes\n\nbool VGAMetric::run(Communicator *comm, PointMap &map, bool) {\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getFilledPointCount());\n    }\n\n    std::string radius_text;\n    if (m_radius != -1.0) {\n        if (m_radius > 100.0) {\n            radius_text = std::string(\" R\") + dXstring::formatString(m_radius, \"%.f\");\n        } else if (map.getRegion().width() < 1.0) {\n            radius_text = std::string(\" R\") + dXstring::formatString(m_radius, \"%.4f\");\n        } else {\n            radius_text = std::string(\" R\") + dXstring::formatString(m_radius, \"%.2f\");\n        }\n    }\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // n.b. these must be entered in alphabetical order to preserve col indexing:\n    std::string mspa_col_text = std::string(\"Metric Mean Shortest-Path Angle\") + radius_text;\n    int mspa_col = attributes.insertOrResetColumn(mspa_col_text.c_str());\n    std::string mspl_col_text = std::string(\"Metric Mean Shortest-Path Distance\") + radius_text;\n    int mspl_col = attributes.insertOrResetColumn(mspl_col_text.c_str());\n    std::string dist_col_text = std::string(\"Metric Mean Straight-Line Distance\") + radius_text;\n    int dist_col = attributes.insertOrResetColumn(dist_col_text.c_str());\n    std::string count_col_text = std::string(\"Metric Node Count\") + radius_text;\n    int count_col = attributes.insertOrResetColumn(count_col_text.c_str());\n\n    int count = 0;\n\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n\n            if (map.getPoint(curs).filled()) {\n\n                if (m_gates_only) {\n                    count++;\n                    continue;\n                }\n\n                // TODO: Break out miscs/dist/cumangle into local variables and remove from Point class\n                for (auto &point : map.getPoints()) {\n                    point.m_misc = 0;\n                    point.m_dist = -1.0f;\n                    point.m_cumangle = 0.0f;\n                }\n\n                float euclid_depth = 0.0f;\n                float total_depth = 0.0f;\n                float total_angle = 0.0f;\n                int total_nodes = 0;\n\n                // note that m_misc is used in a different manner to analyseGraph / PointDepth\n                // here it marks the node as used in calculation only\n\n                std::set<MetricTriple> search_list;\n                search_list.insert(MetricTriple(0.0f, curs, NoPixel));\n                while (search_list.size()) {\n                    std::set<MetricTriple>::iterator it = search_list.begin();\n                    MetricTriple here = *it;\n                    search_list.erase(it);\n                    if (m_radius != -1.0 && (here.dist * map.getSpacing()) > m_radius) {\n                        break;\n                    }\n                    Point &p = map.getPoint(here.pixel);\n                    // nb, the filled check is necessary as diagonals seem to be stored with 'gaps' left in\n                    if (p.filled() && p.m_misc != ~0) {\n                        p.getNode().extractMetric(search_list, &map, here);\n                        p.m_misc = ~0;\n                        if (!p.getMergePixel().empty()) {\n                            Point &p2 = map.getPoint(p.getMergePixel());\n                            if (p2.m_misc != ~0) {\n                                p2.m_cumangle = p.m_cumangle;\n                                p2.getNode().extractMetric(search_list, &map,\n                                                           MetricTriple(here.dist, p.getMergePixel(), NoPixel));\n                                p2.m_misc = ~0;\n                            }\n                        }\n                        total_depth += float(here.dist * map.getSpacing());\n                        total_angle += p.m_cumangle;\n                        euclid_depth += float(map.getSpacing() * dist(here.pixel, curs));\n                        total_nodes += 1;\n                    }\n                }\n\n                AttributeRow &row = attributes.getRow(AttributeKey(curs));\n                row.setValue(mspa_col, float(double(total_angle) / double(total_nodes)));\n                row.setValue(mspl_col, float(double(total_depth) / double(total_nodes)));\n                row.setValue(dist_col, float(double(euclid_depth) / double(total_nodes)));\n                row.setValue(count_col, float(total_nodes));\n\n                count++; // <- increment count\n            }\n            if (comm) {\n                if (qtimer(atime, 500)) {\n                    if (comm->IsCancelled()) {\n                        throw Communicator::CancelledException();\n                    }\n                    comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\n                }\n            }\n        }\n    }\n\n    map.overrideDisplayedAttribute(-2);\n    map.setDisplayedAttribute(mspl_col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgametric.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAMetric : IVGA {\n  private:\n    double m_radius;\n    bool m_gates_only;\n\n  public:\n    std::string getAnalysisName() const override { return \"Metric Analysis\"; }\n    bool run(Communicator *comm, PointMap &map, bool) override;\n    VGAMetric(double radius, bool gates_only) : m_radius(radius), m_gates_only(gates_only) {}\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgametricdepth.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgametricdepth.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAMetricDepth::run(Communicator *, PointMap &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // n.b., insert columns sets values to -1 if the column already exists\n    int path_angle_col = attributes.insertOrResetColumn(\"Metric Step Shortest-Path Angle\");\n    int path_length_col = attributes.insertOrResetColumn(\"Metric Step Shortest-Path Length\");\n    int dist_col = -1;\n    if (map.getSelSet().size() == 1) {\n        // Note: Euclidean distance is currently only calculated from a single point\n        dist_col = attributes.insertOrResetColumn(\"Metric Straight-Line Distance\");\n    }\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        PixelRef pix = iter->getKey().value;\n        map.getPoint(pix).m_misc = 0;\n        map.getPoint(pix).m_dist = -1.0f;\n        map.getPoint(pix).m_cumangle = 0.0f;\n    }\n\n    // in order to calculate Penn angle, the MetricPair becomes a metric triple...\n    std::set<MetricTriple> search_list; // contains root point\n\n    for (auto &sel : map.getSelSet()) {\n        search_list.insert(MetricTriple(0.0f, sel, NoPixel));\n    }\n\n    // note that m_misc is used in a different manner to analyseGraph / PointDepth\n    // here it marks the node as used in calculation only\n    while (search_list.size()) {\n        std::set<MetricTriple>::iterator it = search_list.begin();\n        MetricTriple here = *it;\n        search_list.erase(it);\n        Point &p = map.getPoint(here.pixel);\n        // nb, the filled check is necessary as diagonals seem to be stored with 'gaps' left in\n        if (p.filled() && p.m_misc != ~0) {\n            p.getNode().extractMetric(search_list, &map, here);\n            p.m_misc = ~0;\n            AttributeRow &row = map.getAttributeTable().getRow(AttributeKey(here.pixel));\n            row.setValue(path_length_col, float(map.getSpacing() * here.dist));\n            row.setValue(path_angle_col, float(p.m_cumangle));\n            if (map.getSelSet().size() == 1) {\n                // Note: Euclidean distance is currently only calculated from a single point\n                row.setValue(dist_col, float(map.getSpacing() * dist(here.pixel, *map.getSelSet().begin())));\n            }\n            if (!p.getMergePixel().empty()) {\n                Point &p2 = map.getPoint(p.getMergePixel());\n                if (p2.m_misc != ~0) {\n                    p2.m_cumangle = p.m_cumangle;\n                    AttributeRow &mergePixelRow =\n                        map.getAttributeTable().getRow(AttributeKey(p.getMergePixel()));\n                    mergePixelRow.setValue(path_length_col, float(map.getSpacing() * here.dist));\n                    mergePixelRow.setValue(path_angle_col, float(p2.m_cumangle));\n                    if (map.getSelSet().size() == 1) {\n                        // Note: Euclidean distance is currently only calculated from a single point\n                        mergePixelRow.setValue(\n                            dist_col, float(map.getSpacing() * dist(p.getMergePixel(), *map.getSelSet().begin())));\n                    }\n                    p2.getNode().extractMetric(search_list, &map, MetricTriple(here.dist, p.getMergePixel(), NoPixel));\n                    p2.m_misc = ~0;\n                }\n            }\n        }\n    }\n\n    map.setDisplayedAttribute(-2);\n    map.setDisplayedAttribute(path_length_col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgametricdepth.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAMetricDepth : IVGA {\n  public:\n    std::string getAnalysisName() const override { return \"Metric Depth\"; }\n    bool run(Communicator *, PointMap &map, bool) override;\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgathroughvision.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgathroughvision.h\"\n#include \"salalib/agents/agenthelpers.h\"\n\n#include \"genlib/stringutils.h\"\n\n// This is a slow algorithm, but should give the correct answer\n// for demonstrative purposes\n\nbool VGAThroughVision::run(Communicator *comm, PointMap &map, bool) {\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getFilledPointCount());\n    }\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // current version (not sure of differences!)\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n            map.getPoint(curs).m_misc = 0;\n        }\n    }\n\n    bool hasGateColumn = map.getAttributeTable().hasColumn(g_col_gate);\n\n    int count = 0;\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            std::vector<int> seengates;\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n            Point &p = map.getPoint(curs);\n            if (map.getPoint(curs).filled()) {\n                p.getNode().first();\n                while (!p.getNode().is_tail()) {\n                    PixelRef x = p.getNode().cursor();\n                    PixelRefVector pixels = map.quickPixelateLine(x, curs);\n                    for (size_t k = 1; k < pixels.size() - 1; k++) {\n                        PixelRef key = pixels[k];\n                        map.getPoint(key).m_misc += 1;\n\n                        // TODO: Undocumented functionality. Shows how many times a gate is passed?\n                        if (hasGateColumn) {\n                            auto iter = attributes.find(AttributeKey(key));\n                            if (iter != attributes.end()) {\n                                int gate = static_cast<int>(iter->getRow().getValue(g_col_gate));\n                                if (gate != -1) {\n                                    auto gateIter = depthmapX::findBinary(seengates, gate);\n                                    if (gateIter == seengates.end()) {\n                                        iter->getRow().incrValue(g_col_gate_counts);\n                                        seengates.insert(gateIter, int(gate));\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    p.getNode().next();\n                }\n                // only increment count for actual filled points\n                count++;\n            }\n            if (comm) {\n                if (qtimer(atime, 500)) {\n                    if (comm->IsCancelled()) {\n                        throw Communicator::CancelledException();\n                    }\n                    comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\n                }\n            }\n        }\n    }\n\n    int col = attributes.getOrInsertColumn(\"Through vision\");\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        PixelRef pix = iter->getKey().value;\n        iter->getRow().setValue(col, static_cast<float>(map.getPoint(pix).m_misc));\n        map.getPoint(pix).m_misc = 0;\n    }\n\n    map.overrideDisplayedAttribute(-2);\n    map.setDisplayedAttribute(col);\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgathroughvision.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAThroughVision : IVGA {\n  public:\n    std::string getAnalysisName() const override { return \"Through Vision Analysis\"; }\n    bool run(Communicator *comm, PointMap &map, bool) override;\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgavisualglobal.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgavisualglobal.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAVisualGlobal::run(Communicator *comm, PointMap &map, bool simple_version) {\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getFilledPointCount());\n    }\n    AttributeTable &attributes = map.getAttributeTable();\n\n    int entropy_col = -1, rel_entropy_col = -1, integ_dv_col = -1, integ_pv_col = -1, integ_tk_col = -1,\n        depth_col = -1, count_col = -1;\n    std::string radius_text;\n    if (m_radius != -1) {\n        radius_text = std::string(\" R\") + dXstring::formatString(int(m_radius), \"%d\");\n    }\n\n    // n.b. these must be entered in alphabetical order to preserve col indexing:\n    // dX simple version test // TV\n#ifndef _COMPILE_dX_SIMPLE_VERSION\n    if (!simple_version) {\n        std::string entropy_col_text = std::string(\"Visual Entropy\") + radius_text;\n        entropy_col = attributes.insertOrResetColumn(entropy_col_text.c_str());\n    }\n#endif\n\n    std::string integ_dv_col_text = std::string(\"Visual Integration [HH]\") + radius_text;\n    integ_dv_col = attributes.insertOrResetColumn(integ_dv_col_text.c_str());\n\n#ifndef _COMPILE_dX_SIMPLE_VERSION\n    if (!simple_version) {\n        std::string integ_pv_col_text = std::string(\"Visual Integration [P-value]\") + radius_text;\n        integ_pv_col = attributes.insertOrResetColumn(integ_pv_col_text.c_str());\n        std::string integ_tk_col_text = std::string(\"Visual Integration [Tekl]\") + radius_text;\n        integ_tk_col = attributes.insertOrResetColumn(integ_tk_col_text.c_str());\n        std::string depth_col_text = std::string(\"Visual Mean Depth\") + radius_text;\n        depth_col = attributes.insertOrResetColumn(depth_col_text.c_str());\n        std::string count_col_text = std::string(\"Visual Node Count\") + radius_text;\n        count_col = attributes.insertOrResetColumn(count_col_text.c_str());\n        std::string rel_entropy_col_text = std::string(\"Visual Relativised Entropy\") + radius_text;\n        rel_entropy_col = attributes.insertOrResetColumn(rel_entropy_col_text.c_str());\n    }\n#endif\n\n    int count = 0;\n\n    depthmapX::RowMatrix<int> miscs(map.getRows(), map.getCols());\n    depthmapX::RowMatrix<PixelRef> extents(map.getRows(), map.getCols());\n\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(i, j);\n            if (map.getPoint(curs).filled()) {\n\n                if ((map.getPoint(curs).contextfilled() && !curs.iseven()) || (m_gates_only)) {\n                    count++;\n                    continue;\n                }\n\n                for (size_t ii = 0; ii < map.getCols(); ii++) {\n                    for (size_t jj = 0; jj < map.getRows(); jj++) {\n                        miscs(jj, ii) = 0;\n                        extents(jj, ii) = PixelRef(ii, jj);\n                    }\n                }\n\n                int total_depth = 0;\n                int total_nodes = 0;\n\n                std::vector<int> distribution;\n                std::vector<PixelRefVector> search_tree;\n                search_tree.push_back(PixelRefVector());\n                search_tree.back().push_back(curs);\n\n                int level = 0;\n                while (search_tree[level].size()) {\n                    search_tree.push_back(PixelRefVector());\n                    const PixelRefVector &searchTreeAtLevel = search_tree[level];\n                    distribution.push_back(0);\n                    for (auto currLvlIter = searchTreeAtLevel.rbegin(); currLvlIter != searchTreeAtLevel.rend();\n                         currLvlIter++) {\n                        int &pmisc = miscs(currLvlIter->y, currLvlIter->x);\n                        Point &p = map.getPoint(*currLvlIter);\n                        if (p.filled() && pmisc != ~0) {\n                            total_depth += level;\n                            total_nodes += 1;\n                            distribution.back() += 1;\n                            if ((int)m_radius == -1 ||\n                                (level < (int)m_radius &&\n                                    (!p.contextfilled() || currLvlIter->iseven()))) {\n                                extractUnseen(p.getNode(), search_tree[level + 1], miscs, extents);\n                                pmisc = ~0;\n                                if (!p.getMergePixel().empty()) {\n                                    PixelRef mergePixel = p.getMergePixel();\n                                    int &p2misc = miscs(mergePixel.y, mergePixel.x);\n                                    Point &p2 = map.getPoint(mergePixel);\n                                    if (p2misc != ~0) {\n                                        extractUnseen(p2.getNode(), search_tree[level + 1], miscs,\n                                                      extents); // did say p.misc\n                                        p2misc = ~0;\n                                    }\n                                }\n                            } else {\n                                pmisc = ~0;\n                            }\n                        }\n                        search_tree[level].pop_back();\n                    }\n                    level++;\n                }\n                AttributeRow &row = attributes.getRow(AttributeKey(curs));\n                // only set to single float precision after divide\n                // note -- total_nodes includes this one -- mean depth as per p.108 Social Logic of Space\n                if (!simple_version) {\n                    row.setValue(count_col, float(total_nodes)); // note: total nodes includes this one\n                }\n                // ERROR !!!!!!\n                if (total_nodes > 1) {\n                    double mean_depth = double(total_depth) / double(total_nodes - 1);\n                    if (!simple_version) {\n                        row.setValue(depth_col, float(mean_depth));\n                    }\n                    // total nodes > 2 to avoid divide by 0 (was > 3)\n                    if (total_nodes > 2 && mean_depth > 1.0) {\n                        double ra = 2.0 * (mean_depth - 1.0) / double(total_nodes - 2);\n                        // d-value / p-values from Depthmap 4 manual, note: node_count includes this one\n                        double rra_d = ra / dvalue(total_nodes);\n                        double rra_p = ra / pvalue(total_nodes);\n                        double integ_tk = teklinteg(total_nodes, total_depth);\n                        row.setValue(integ_dv_col, float(1.0 / rra_d));\n                        if (!simple_version) {\n                            row.setValue(integ_pv_col, float(1.0 / rra_p));\n                        }\n                        if (total_depth - total_nodes + 1 > 1) {\n                            if (!simple_version) {\n                                row.setValue(integ_tk_col, float(integ_tk));\n                            }\n                        } else {\n                            if (!simple_version) {\n                                row.setValue(integ_tk_col, -1.0f);\n                            }\n                        }\n                    } else {\n                        row.setValue(integ_dv_col, (float)-1);\n                        if (!simple_version) {\n                            row.setValue(integ_pv_col, (float)-1);\n                            row.setValue(integ_tk_col, (float)-1);\n                        }\n                    }\n                    double entropy = 0.0, rel_entropy = 0.0, factorial = 1.0;\n                    // n.b., this distribution contains the root node itself in distribution[0]\n                    // -> chopped from entropy to avoid divide by zero if only one node\n                    for (size_t k = 1; k < distribution.size(); k++) {\n                        if (distribution[k] > 0) {\n                            double prob = double(distribution[k]) / double(total_nodes - 1);\n                            entropy -= prob * log2(prob);\n                            // Formula from Turner 2001, \"Depthmap\"\n                            factorial *= double(k + 1);\n                            double q = (pow(mean_depth, double(k)) / double(factorial)) * exp(-mean_depth);\n                            rel_entropy += (float)prob * log2(prob / q);\n                        }\n                    }\n                    if (!simple_version) {\n                        row.setValue(entropy_col, float(entropy));\n                        row.setValue(rel_entropy_col, float(rel_entropy));\n                    }\n                } else {\n                    if (!simple_version) {\n                        row.setValue(depth_col, (float)-1);\n                        row.setValue(entropy_col, (float)-1);\n                        row.setValue(rel_entropy_col, (float)-1);\n                    }\n                }\n                count++; // <- increment count\n                if (comm) {\n                    if (qtimer(atime, 500)) {\n                        if (comm->IsCancelled()) {\n                            throw Communicator::CancelledException();\n                        }\n                        comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\n                    }\n                }\n            }\n        }\n    }\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n            map.getPoint(curs).m_misc = miscs(j, i);\n            map.getPoint(curs).m_extent = extents(j, i);\n        }\n    }\n    map.setDisplayedAttribute(integ_dv_col);\n\n    return true;\n}\n\nvoid VGAVisualGlobal::extractUnseen(Node &node, PixelRefVector &pixels, depthmapX::RowMatrix<int> &miscs,\n                                    depthmapX::RowMatrix<PixelRef> &extents) {\n    for (int i = 0; i < 32; i++) {\n        Bin &bin = node.bin(i);\n        for (auto pixVec : bin.m_pixel_vecs) {\n            for (PixelRef pix = pixVec.start(); pix.col(bin.m_dir) <= pixVec.end().col(bin.m_dir);) {\n                int &misc = miscs(pix.y, pix.x);\n                PixelRef &extent = extents(pix.y, pix.x);\n                if (misc == 0) {\n                    pixels.push_back(pix);\n                    misc |= (1 << i);\n                }\n                // 10.2.02 revised --- diagonal was breaking this as it was extent in diagonal or horizontal\n                if (!(bin.m_dir & PixelRef::DIAGONAL)) {\n                    if (extent.col(bin.m_dir) >= pixVec.end().col(bin.m_dir))\n                        break;\n                    extent.col(bin.m_dir) = pixVec.end().col(bin.m_dir);\n                }\n                pix.move(bin.m_dir);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgavisualglobal.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\n#include \"genlib/simplematrix.h\"\n\nclass VGAVisualGlobal : IVGA {\n  private:\n    double m_radius;\n    bool m_gates_only;\n\n  public:\n    std::string getAnalysisName() const override { return \"Global Visibility Analysis\"; }\n    bool run(Communicator *comm, PointMap &map, bool simple_version) override;\n    void extractUnseen(Node &node, PixelRefVector &pixels, depthmapX::RowMatrix<int> &miscs,\n                       depthmapX::RowMatrix<PixelRef> &extents);\n    VGAVisualGlobal(double radius, bool gates_only) : m_radius(radius), m_gates_only(gates_only) {}\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgavisualglobaldepth.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgavisualglobaldepth.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAVisualGlobalDepth::run(Communicator *, PointMap &map, bool) {\n\n    AttributeTable &attributes = map.getAttributeTable();\n\n    // n.b., insert columns sets values to -1 if the column already exists\n    int col = attributes.insertOrResetColumn(\"Visual Step Depth\");\n\n    for (auto iter = attributes.begin(); iter != attributes.end(); iter++) {\n        PixelRef pix = iter->getKey().value;\n        map.getPoint(pix).m_misc = 0;\n        map.getPoint(pix).m_extent = pix;\n    }\n\n    std::vector<PixelRefVector> search_tree;\n    search_tree.push_back(PixelRefVector());\n    for (auto &sel : map.getSelSet()) {\n        // need to convert from ints (m_selection_set) to pixelrefs for this op:\n        search_tree.back().push_back(sel);\n    }\n\n    size_t level = 0;\n    while (search_tree[level].size()) {\n        search_tree.push_back(PixelRefVector());\n        const PixelRefVector& searchTreeAtLevel = search_tree[level];\n        for (auto currLvlIter = searchTreeAtLevel.rbegin(); currLvlIter != searchTreeAtLevel.rend(); currLvlIter++) {\n            Point &p = map.getPoint(*currLvlIter);\n            if (p.filled() && p.m_misc != ~0) {\n                AttributeRow &row = attributes.getRow(AttributeKey(*currLvlIter));\n                row.setValue(col, float(level));\n                if (!p.contextfilled() || currLvlIter->iseven() || level == 0) {\n                    p.getNode().extractUnseen(search_tree[level + 1], &map);\n                    p.m_misc = ~0;\n                    if (!p.getMergePixel().empty()) {\n                        Point &p2 = map.getPoint(p.getMergePixel());\n                        if (p2.m_misc != ~0) {\n                            AttributeRow &mergePixelRow = attributes.getRow(AttributeKey(p.getMergePixel()));\n                            mergePixelRow.setValue(col, float(level));\n                            p2.getNode().extractUnseen(search_tree[level + 1], &map); // did say p.misc\n                            p2.m_misc = ~0;\n                        }\n                    }\n                } else {\n                    p.m_misc = ~0;\n                }\n            }\n        }\n        level++;\n    }\n\n    // force redisplay:\n    map.setDisplayedAttribute(-2);\n    map.setDisplayedAttribute(col);\n\n    return true;\n}\n\nvoid VGAVisualGlobalDepth::extractUnseen(Node &node, PixelRefVector &pixels, depthmapX::RowMatrix<int> &miscs,\n                   depthmapX::RowMatrix<PixelRef> &extents) {\n    for (int i = 0; i < 32; i++) {\n        Bin &bin = node.bin(i);\n        for (auto pixVec : bin.m_pixel_vecs) {\n            for (PixelRef pix = pixVec.start(); pix.col(bin.m_dir) <= pixVec.end().col(bin.m_dir);) {\n                int &misc = miscs(pix.y, pix.x);\n                PixelRef &extent = extents(pix.y, pix.x);\n                if (misc == 0) {\n                    pixels.push_back(pix);\n                    misc |= (1 << i);\n                }\n                // 10.2.02 revised --- diagonal was breaking this as it was extent in diagonal or horizontal\n                if (!(bin.m_dir & PixelRef::DIAGONAL)) {\n                    if (extent.col(bin.m_dir) >= pixVec.end().col(bin.m_dir))\n                        break;\n                    extent.col(bin.m_dir) = pixVec.end().col(bin.m_dir);\n                }\n                pix.move(bin.m_dir);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgavisualglobaldepth.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\n#include \"genlib/simplematrix.h\"\n\nclass VGAVisualGlobalDepth : IVGA {\n  public:\n    std::string getAnalysisName() const override { return \"Global Visibility Depth\"; }\n    bool run(Communicator *comm, PointMap &map, bool simple_version) override;\n    void extractUnseen(Node &node, PixelRefVector &pixels, depthmapX::RowMatrix<int> &miscs,\n                       depthmapX::RowMatrix<PixelRef> &extents);\n};\n"
  },
  {
    "path": "salalib/vgamodules/vgavisuallocal.cpp",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#include \"salalib/vgamodules/vgavisuallocal.h\"\n\n#include \"genlib/stringutils.h\"\n\nbool VGAVisualLocal::run(Communicator *comm, PointMap &map, bool simple_version) {\n    time_t atime = 0;\n    if (comm) {\n        qtimer(atime, 0);\n        comm->CommPostMessage(Communicator::NUM_RECORDS, map.getFilledPointCount());\n    }\n\n    int cluster_col = -1, control_col = -1, controllability_col = -1;\n    if (!simple_version) {\n        cluster_col = map.getAttributeTable().insertOrResetColumn(\"Visual Clustering Coefficient\");\n        control_col = map.getAttributeTable().insertOrResetColumn(\"Visual Control\");\n        controllability_col = map.getAttributeTable().insertOrResetColumn(\"Visual Controllability\");\n    }\n\n    int count = 0;\n\n    for (size_t i = 0; i < map.getCols(); i++) {\n        for (size_t j = 0; j < map.getRows(); j++) {\n            PixelRef curs = PixelRef(static_cast<short>(i), static_cast<short>(j));\n            if (map.getPoint(curs).filled()) {\n                if ((map.getPoint(curs).contextfilled() && !curs.iseven()) || (m_gates_only)) {\n                    count++;\n                    continue;\n                }\n                AttributeRow &row = map.getAttributeTable().getRow(AttributeKey(curs));\n\n                // This is much easier to do with a straight forward list:\n                PixelRefVector neighbourhood;\n                PixelRefVector totalneighbourhood;\n                map.getPoint(curs).getNode().contents(neighbourhood);\n\n                // only required to match previous non-stl output. Without this\n                // the output differs by the last digit of the float\n                std::sort(neighbourhood.begin(), neighbourhood.end());\n\n                int cluster = 0;\n                float control = 0.0f;\n\n                for (size_t i = 0; i < neighbourhood.size(); i++) {\n                    int intersect_size = 0, retro_size = 0;\n                    Point &retpt = map.getPoint(neighbourhood[i]);\n                    if (retpt.filled() && retpt.hasNode()) {\n                        retpt.getNode().first();\n                        while (!retpt.getNode().is_tail()) {\n                            retro_size++;\n                            if (std::find(neighbourhood.begin(), neighbourhood.end(), retpt.getNode().cursor()) !=\n                                neighbourhood.end()) {\n                                intersect_size++;\n                            }\n                            if (std::find(totalneighbourhood.begin(), totalneighbourhood.end(),\n                                          retpt.getNode().cursor()) == totalneighbourhood.end()) {\n                                totalneighbourhood.push_back(\n                                    retpt.getNode().cursor()); // <- note add does nothing if member already exists\n                            }\n                            retpt.getNode().next();\n                        }\n                        control += 1.0f / float(retro_size);\n                        cluster += intersect_size;\n                    }\n                }\n#ifndef _COMPILE_dX_SIMPLE_VERSION\n                if (!simple_version) {\n                    if (neighbourhood.size() > 1) {\n                        row.setValue(cluster_col,\n                                     float(cluster / double(neighbourhood.size() * (neighbourhood.size() - 1.0))));\n                        row.setValue(control_col, float(control));\n                        row.setValue(controllability_col,\n                                     float(double(neighbourhood.size()) / double(totalneighbourhood.size())));\n                    } else {\n                        row.setValue(cluster_col, -1);\n                        row.setValue(control_col, -1);\n                        row.setValue(controllability_col, -1);\n                    }\n                }\n#endif\n                count++; // <- increment count\n            }\n            if (comm) {\n                if (qtimer(atime, 500)) {\n                    if (comm->IsCancelled()) {\n                        throw Communicator::CancelledException();\n                    }\n                    comm->CommPostMessage(Communicator::CURRENT_RECORD, count);\n                }\n            }\n        }\n    }\n\n#ifndef _COMPILE_dX_SIMPLE_VERSION\n    if (!simple_version)\n        map.setDisplayedAttribute(cluster_col);\n#endif\n\n    return true;\n}\n"
  },
  {
    "path": "salalib/vgamodules/vgavisuallocal.h",
    "content": "// sala - a component of the depthmapX - spatial network analysis platform\n// Copyright (C) 2000-2010, University College London, Alasdair Turner\n// Copyright (C) 2011-2012, Tasos Varoudis\n// Copyright (C) 2017-2018, Petros Koutsolampros\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#pragma once\n\n#include \"salalib/ivga.h\"\n#include \"salalib/pixelref.h\"\n#include \"salalib/pointdata.h\"\n\nclass VGAVisualLocal : IVGA {\n  private:\n    bool m_gates_only;\n\n  public:\n    std::string getAnalysisName() const override { return \"Local Visibility Analysis\"; }\n    bool run(Communicator *comm, PointMap &map, bool simple_version) override;\n    VGAVisualLocal(bool gates_only) : m_gates_only(gates_only) {}\n};\n"
  },
  {
    "path": "testdata/barnsbury_axial.RT1",
    "content": "DUMMY TEXT                                             A00                                                                                                                                    00005306350001844680000530732000183731\nDUMMY TEXT                                             A01                                                                                                                                    00005306550001842670000531386000184568\nDUMMY TEXT                                             A02                                                                                                                                    00005307810001843220000530814000184178\nDUMMY TEXT                                             A03                                                                                                                                    00005306670001842030000531124000184392\nDUMMY TEXT                                             A04                                                                                                                                    00005307980001842070000530856000184149\nDUMMY TEXT                                             A05                                                                                                                                    00005307470001841450000530810000184207\nDUMMY TEXT                                             A06                                                                                                                                    00005307530001841640000530781000183967\nDUMMY TEXT                                             A07                                                                                                                                    00005306380001841230000531070000184116\nDUMMY TEXT                                             A08                                                                                                                                    00005308370001839670000530855000184153\nDUMMY TEXT                                             A09                                                                                                                                    00005307760001839700000530838000183968\nDUMMY TEXT                                             A10                                                                                                                                    00005308030001836730000530817000183970\nDUMMY TEXT                                             A11                                                                                                                                    00005308030001837420000530916000183745\nDUMMY TEXT                                             A12                                                                                                                                    00005309120001836630000530932000184418\nDUMMY TEXT                                             A13                                                                                                                                    00005309950001841910000531426000184272\nDUMMY TEXT                                             A14                                                                                                                                    00005309920001842600000531006000184067\nDUMMY TEXT                                             A15                                                                                                                                    00005310650001842640000531069000184200\nDUMMY TEXT                                             A16                                                                                                                                    00005310140001842820000531076000184252\nDUMMY TEXT                                             A17                                                                                                                                    00005310550001842540000531446000184352\nDUMMY TEXT                                             A18                                                                                                                                    00005311010001844550000531227000184068\nDUMMY TEXT                                             A19                                                                                                                                    00005312140001840670000531445000184127\nDUMMY TEXT                                             A20                                                                                                                                    00005311660001838830000531225000184081\nDUMMY TEXT                                             A21                                                                                                                                    00005311030001839440000531189000183939\nDUMMY TEXT                                             A22                                                                                                                                    00005312740001845280000531297000184441\nDUMMY TEXT                                             A23                                                                                                                                    00005313320001845830000531443000184125\nDUMMY TEXT                                             A24                                                                                                                                    00005310260001841140000531441000184200\nDUMMY TEXT                                             A25                                                                                                                                    00005313790001837260000531438000184206\nDUMMY TEXT                                             A26                                                                                                                                    00005313700001835110000531409000184011\nDUMMY TEXT                                             A27                                                                                                                                    00005312870001837160000531396000183759\nDUMMY TEXT                                             A28                                                                                                                                    00005312940001837770000531391000183726\nDUMMY TEXT                                             A29                                                                                                                                    00005313030001839670000531311000183765\nDUMMY TEXT                                             A30                                                                                                                                    00005310690001838800000531403000183913\nDUMMY TEXT                                             A31                                                                                                                                    00005310550001839730000531081000183854\nDUMMY TEXT                                             A32                                                                                                                                    00005309790001838530000531006000183971\nDUMMY TEXT                                             A33                                                                                                                                    00005310020001839650000531057000183972\nDUMMY TEXT                                             A34                                                                                                                                    00005306750001838810000531237000183892\nDUMMY TEXT                                             A35                                                                                                                                    00005312460001839010000531247000183877\nDUMMY TEXT                                             A36                                                                                                                                    00005313780001840390000531423000184035\nDUMMY TEXT                                             A37                                                                                                                                    00005313650001840480000531385000184035\nDUMMY TEXT                                             A38                                                                                                                                    00005313600001841120000531368000184041\nDUMMY TEXT                                             A39                                                                                                                                    00005311760001839320000531212000183499\nDUMMY TEXT                                             A40                                                                                                                                    00005311910001835230000531385000183575\nDUMMY TEXT                                             A41                                                                                                                                    00005309040001836810000531226000183515\nDUMMY TEXT                                             A42                                                                                                                                    00005310870001835040000531157000183893\nDUMMY TEXT                                             A43                                                                                                                                    00005310290001838910000531030000183855\nDUMMY TEXT                                             A44                                                                                                                                    00005311820001837480000531275000183743\nDUMMY TEXT                                             A45                                                                                                                                    00005312400001837410000531312000183782\nDUMMY TEXT                                             A46                                                                                                                                    00005312380001837540000531308000183714\nDUMMY TEXT                                             A47                                                                                                                                    00005312930001835470000531303000183726\nDUMMY TEXT                                             A48                                                                                                                                    00005307070001835750000530731000183750\nDUMMY TEXT                                             A49                                                                                                                                    00005307110001836900000530973000183658\nDUMMY TEXT                                             A50                                                                                                                                    00005311390001841420000531154000184098\nDUMMY TEXT                                             A51                                                                                                                                    00005310910001840890000531155000184099\nDUMMY TEXT                                             A52                                                                                                                                    00005310600001841270000531065000184023\nDUMMY TEXT                                             A53                                                                                                                                    00005309150001840350000531213000184017\nDUMMY TEXT                                             A54                                                                                                                                    00005312810001840880000531294000184020\nDUMMY TEXT                                             A55                                                                                                                                    00005312630001840150000531322000184027\nDUMMY TEXT                                             A56                                                                                                                                    00005312670001840230000531279000183953\nDUMMY TEXT                                             A57                                                                                                                                    00005312760001839540000531332000183964\nDUMMY TEXT                                             A58                                                                                                                                    00005313150001840330000531330000183957\nDUMMY TEXT                                             A59                                                                                                                                    00005308050001838140000530917000183816\nDUMMY TEXT                                             A60                                                                                                                                    00005311370001843380000531389000184417"
  },
  {
    "path": "testdata/barnsbury_extended1.dxf",
    "content": "  0\r\nSECTION\r\n  2\r\nHEADER\r\n  9\r\n$ACADVER\r\n  1\r\nAC1032\r\n  9\r\n$ACADMAINTVER\r\n 90\r\n       29\r\n  9\r\n$DWGCODEPAGE\r\n  3\r\nANSI_1252\r\n  9\r\n$LASTSAVEDBY\r\n  1\r\npetros\r\n  9\r\n$REQUIREDVERSIONS\r\n160\r\n                 0\r\n  9\r\n$INSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$EXTMIN\r\n 10\r\n529323.2560585713\r\n 20\r\n181958.3850119969\r\n 30\r\n0.0\r\n  9\r\n$EXTMAX\r\n 10\r\n537745.3426184553\r\n 20\r\n188578.5076793431\r\n 30\r\n0.0\r\n  9\r\n$LIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$LIMMAX\r\n 10\r\n12.0\r\n 20\r\n9.0\r\n  9\r\n$ORTHOMODE\r\n 70\r\n     0\r\n  9\r\n$REGENMODE\r\n 70\r\n     1\r\n  9\r\n$FILLMODE\r\n 70\r\n     1\r\n  9\r\n$QTEXTMODE\r\n 70\r\n     0\r\n  9\r\n$MIRRTEXT\r\n 70\r\n     0\r\n  9\r\n$LTSCALE\r\n 40\r\n1.0\r\n  9\r\n$ATTMODE\r\n 70\r\n     1\r\n  9\r\n$TEXTSIZE\r\n 40\r\n0.2\r\n  9\r\n$TRACEWID\r\n 40\r\n0.05\r\n  9\r\n$TEXTSTYLE\r\n  7\r\nStandard\r\n  9\r\n$CLAYER\r\n  8\r\n0\r\n  9\r\n$CELTYPE\r\n  6\r\nByLayer\r\n  9\r\n$CECOLOR\r\n 62\r\n   256\r\n  9\r\n$CELTSCALE\r\n 40\r\n1.0\r\n  9\r\n$DISPSILH\r\n 70\r\n     0\r\n  9\r\n$DIMSCALE\r\n 40\r\n1.0\r\n  9\r\n$DIMASZ\r\n 40\r\n0.18\r\n  9\r\n$DIMEXO\r\n 40\r\n0.0625\r\n  9\r\n$DIMDLI\r\n 40\r\n0.38\r\n  9\r\n$DIMRND\r\n 40\r\n0.0\r\n  9\r\n$DIMDLE\r\n 40\r\n0.0\r\n  9\r\n$DIMEXE\r\n 40\r\n0.18\r\n  9\r\n$DIMTP\r\n 40\r\n0.0\r\n  9\r\n$DIMTM\r\n 40\r\n0.0\r\n  9\r\n$DIMTXT\r\n 40\r\n0.18\r\n  9\r\n$DIMCEN\r\n 40\r\n0.09\r\n  9\r\n$DIMTSZ\r\n 40\r\n0.0\r\n  9\r\n$DIMTOL\r\n 70\r\n     0\r\n  9\r\n$DIMLIM\r\n 70\r\n     0\r\n  9\r\n$DIMTIH\r\n 70\r\n     1\r\n  9\r\n$DIMTOH\r\n 70\r\n     1\r\n  9\r\n$DIMSE1\r\n 70\r\n     0\r\n  9\r\n$DIMSE2\r\n 70\r\n     0\r\n  9\r\n$DIMTAD\r\n 70\r\n     0\r\n  9\r\n$DIMZIN\r\n 70\r\n     0\r\n  9\r\n$DIMBLK\r\n  1\r\n\r\n  9\r\n$DIMASO\r\n 70\r\n     1\r\n  9\r\n$DIMSHO\r\n 70\r\n     1\r\n  9\r\n$DIMPOST\r\n  1\r\n\r\n  9\r\n$DIMAPOST\r\n  1\r\n\r\n  9\r\n$DIMALT\r\n 70\r\n     0\r\n  9\r\n$DIMALTD\r\n 70\r\n     2\r\n  9\r\n$DIMALTF\r\n 40\r\n25.4\r\n  9\r\n$DIMLFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMTOFL\r\n 70\r\n     0\r\n  9\r\n$DIMTVP\r\n 40\r\n0.0\r\n  9\r\n$DIMTIX\r\n 70\r\n     0\r\n  9\r\n$DIMSOXD\r\n 70\r\n     0\r\n  9\r\n$DIMSAH\r\n 70\r\n     0\r\n  9\r\n$DIMBLK1\r\n  1\r\n\r\n  9\r\n$DIMBLK2\r\n  1\r\n\r\n  9\r\n$DIMSTYLE\r\n  2\r\nStandard\r\n  9\r\n$DIMCLRD\r\n 70\r\n     0\r\n  9\r\n$DIMCLRE\r\n 70\r\n     0\r\n  9\r\n$DIMCLRT\r\n 70\r\n     0\r\n  9\r\n$DIMTFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMGAP\r\n 40\r\n0.09\r\n  9\r\n$DIMJUST\r\n 70\r\n     0\r\n  9\r\n$DIMSD1\r\n 70\r\n     0\r\n  9\r\n$DIMSD2\r\n 70\r\n     0\r\n  9\r\n$DIMTOLJ\r\n 70\r\n     1\r\n  9\r\n$DIMTZIN\r\n 70\r\n     0\r\n  9\r\n$DIMALTZ\r\n 70\r\n     0\r\n  9\r\n$DIMALTTZ\r\n 70\r\n     0\r\n  9\r\n$DIMUPT\r\n 70\r\n     0\r\n  9\r\n$DIMDEC\r\n 70\r\n     4\r\n  9\r\n$DIMTDEC\r\n 70\r\n     4\r\n  9\r\n$DIMALTU\r\n 70\r\n     2\r\n  9\r\n$DIMALTTD\r\n 70\r\n     2\r\n  9\r\n$DIMTXSTY\r\n  7\r\nStandard\r\n  9\r\n$DIMAUNIT\r\n 70\r\n     0\r\n  9\r\n$DIMADEC\r\n 70\r\n     0\r\n  9\r\n$DIMALTRND\r\n 40\r\n0.0\r\n  9\r\n$DIMAZIN\r\n 70\r\n     0\r\n  9\r\n$DIMDSEP\r\n 70\r\n    46\r\n  9\r\n$DIMATFIT\r\n 70\r\n     3\r\n  9\r\n$DIMFRAC\r\n 70\r\n     0\r\n  9\r\n$DIMLDRBLK\r\n  1\r\n\r\n  9\r\n$DIMLUNIT\r\n 70\r\n     2\r\n  9\r\n$DIMLWD\r\n 70\r\n    -2\r\n  9\r\n$DIMLWE\r\n 70\r\n    -2\r\n  9\r\n$DIMTMOVE\r\n 70\r\n     0\r\n  9\r\n$DIMFXL\r\n 40\r\n1.0\r\n  9\r\n$DIMFXLON\r\n 70\r\n     0\r\n  9\r\n$DIMJOGANG\r\n 40\r\n0.7853981633974483\r\n  9\r\n$DIMTFILL\r\n 70\r\n     0\r\n  9\r\n$DIMTFILLCLR\r\n 70\r\n     0\r\n  9\r\n$DIMARCSYM\r\n 70\r\n     0\r\n  9\r\n$DIMLTYPE\r\n  6\r\n\r\n  9\r\n$DIMLTEX1\r\n  6\r\n\r\n  9\r\n$DIMLTEX2\r\n  6\r\n\r\n  9\r\n$DIMTXTDIRECTION\r\n 70\r\n     0\r\n  9\r\n$LUNITS\r\n 70\r\n     2\r\n  9\r\n$LUPREC\r\n 70\r\n     4\r\n  9\r\n$SKETCHINC\r\n 40\r\n0.1\r\n  9\r\n$FILLETRAD\r\n 40\r\n0.0\r\n  9\r\n$AUNITS\r\n 70\r\n     0\r\n  9\r\n$AUPREC\r\n 70\r\n     0\r\n  9\r\n$MENU\r\n  1\r\n.\r\n  9\r\n$ELEVATION\r\n 40\r\n0.0\r\n  9\r\n$PELEVATION\r\n 40\r\n0.0\r\n  9\r\n$THICKNESS\r\n 40\r\n0.0\r\n  9\r\n$LIMCHECK\r\n 70\r\n     0\r\n  9\r\n$CHAMFERA\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERB\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERC\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERD\r\n 40\r\n0.0\r\n  9\r\n$SKPOLY\r\n 70\r\n     0\r\n  9\r\n$TDCREATE\r\n 40\r\n2458404.565312500\r\n  9\r\n$TDUCREATE\r\n 40\r\n2458404.523645833\r\n  9\r\n$TDUPDATE\r\n 40\r\n2458404.623425926\r\n  9\r\n$TDUUPDATE\r\n 40\r\n2458404.581759259\r\n  9\r\n$TDINDWG\r\n 40\r\n0.0581134259\r\n  9\r\n$TDUSRTIMER\r\n 40\r\n0.0581134259\r\n  9\r\n$USRTIMER\r\n 70\r\n     1\r\n  9\r\n$ANGBASE\r\n 50\r\n0.0\r\n  9\r\n$ANGDIR\r\n 70\r\n     0\r\n  9\r\n$PDMODE\r\n 70\r\n     0\r\n  9\r\n$PDSIZE\r\n 40\r\n0.0\r\n  9\r\n$PLINEWID\r\n 40\r\n0.0\r\n  9\r\n$SPLFRAME\r\n 70\r\n     0\r\n  9\r\n$SPLINETYPE\r\n 70\r\n     6\r\n  9\r\n$SPLINESEGS\r\n 70\r\n     8\r\n  9\r\n$HANDSEED\r\n  5\r\n659\r\n  9\r\n$SURFTAB1\r\n 70\r\n     6\r\n  9\r\n$SURFTAB2\r\n 70\r\n     6\r\n  9\r\n$SURFTYPE\r\n 70\r\n     6\r\n  9\r\n$SURFU\r\n 70\r\n     6\r\n  9\r\n$SURFV\r\n 70\r\n     6\r\n  9\r\n$UCSBASE\r\n  2\r\n\r\n  9\r\n$UCSNAME\r\n  2\r\n\r\n  9\r\n$UCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORTHOREF\r\n  2\r\n\r\n  9\r\n$UCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$UCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSBASE\r\n  2\r\n\r\n  9\r\n$PUCSNAME\r\n  2\r\n\r\n  9\r\n$PUCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORTHOREF\r\n  2\r\n\r\n  9\r\n$PUCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$PUCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$USERI1\r\n 70\r\n     0\r\n  9\r\n$USERI2\r\n 70\r\n     0\r\n  9\r\n$USERI3\r\n 70\r\n     0\r\n  9\r\n$USERI4\r\n 70\r\n     0\r\n  9\r\n$USERI5\r\n 70\r\n     0\r\n  9\r\n$USERR1\r\n 40\r\n0.0\r\n  9\r\n$USERR2\r\n 40\r\n0.0\r\n  9\r\n$USERR3\r\n 40\r\n0.0\r\n  9\r\n$USERR4\r\n 40\r\n0.0\r\n  9\r\n$USERR5\r\n 40\r\n0.0\r\n  9\r\n$WORLDVIEW\r\n 70\r\n     1\r\n  9\r\n$SHADEDGE\r\n 70\r\n     3\r\n  9\r\n$SHADEDIF\r\n 70\r\n    70\r\n  9\r\n$TILEMODE\r\n 70\r\n     1\r\n  9\r\n$MAXACTVP\r\n 70\r\n    64\r\n  9\r\n$PINSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMCHECK\r\n 70\r\n     0\r\n  9\r\n$PEXTMIN\r\n 10\r\n1.000000000000000E+20\r\n 20\r\n1.000000000000000E+20\r\n 30\r\n1.000000000000000E+20\r\n  9\r\n$PEXTMAX\r\n 10\r\n-1.000000000000000E+20\r\n 20\r\n-1.000000000000000E+20\r\n 30\r\n-1.000000000000000E+20\r\n  9\r\n$PLIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$PLIMMAX\r\n 10\r\n12.0\r\n 20\r\n9.0\r\n  9\r\n$UNITMODE\r\n 70\r\n     0\r\n  9\r\n$VISRETAIN\r\n 70\r\n     1\r\n  9\r\n$PLINEGEN\r\n 70\r\n     0\r\n  9\r\n$PSLTSCALE\r\n 70\r\n     1\r\n  9\r\n$TREEDEPTH\r\n 70\r\n  3020\r\n  9\r\n$CMLSTYLE\r\n  2\r\nStandard\r\n  9\r\n$CMLJUST\r\n 70\r\n     0\r\n  9\r\n$CMLSCALE\r\n 40\r\n1.0\r\n  9\r\n$PROXYGRAPHICS\r\n 70\r\n     1\r\n  9\r\n$MEASUREMENT\r\n 70\r\n     0\r\n  9\r\n$CELWEIGHT\r\n370\r\n    -1\r\n  9\r\n$ENDCAPS\r\n280\r\n     0\r\n  9\r\n$JOINSTYLE\r\n280\r\n     0\r\n  9\r\n$LWDISPLAY\r\n290\r\n     0\r\n  9\r\n$INSUNITS\r\n 70\r\n     0\r\n  9\r\n$HYPERLINKBASE\r\n  1\r\n\r\n  9\r\n$STYLESHEET\r\n  1\r\n\r\n  9\r\n$XEDIT\r\n290\r\n     1\r\n  9\r\n$CEPSNTYPE\r\n380\r\n     0\r\n  9\r\n$PSTYLEMODE\r\n290\r\n     1\r\n  9\r\n$FINGERPRINTGUID\r\n  2\r\n{2B8CF25F-82C1-5146-94DB-BDE3530BDA2A}\r\n  9\r\n$VERSIONGUID\r\n  2\r\n{0C0159B8-69B3-CE49-BF34-83025D685E03}\r\n  9\r\n$EXTNAMES\r\n290\r\n     1\r\n  9\r\n$PSVPSCALE\r\n 40\r\n0.0\r\n  9\r\n$OLESTARTUP\r\n290\r\n     0\r\n  9\r\n$SORTENTS\r\n280\r\n   127\r\n  9\r\n$INDEXCTL\r\n280\r\n     0\r\n  9\r\n$HIDETEXT\r\n280\r\n     0\r\n  9\r\n$XCLIPFRAME\r\n280\r\n     2\r\n  9\r\n$HALOGAP\r\n280\r\n     0\r\n  9\r\n$OBSCOLOR\r\n 70\r\n   257\r\n  9\r\n$OBSLTYPE\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONDISPLAY\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONCOLOR\r\n 70\r\n   257\r\n  9\r\n$DIMASSOC\r\n280\r\n     1\r\n  9\r\n$PROJECTNAME\r\n  1\r\n\r\n  9\r\n$CAMERADISPLAY\r\n290\r\n     0\r\n  9\r\n$LENSLENGTH\r\n 40\r\n50.0\r\n  9\r\n$CAMERAHEIGHT\r\n 40\r\n0.0\r\n  9\r\n$STEPSPERSEC\r\n 40\r\n2.0\r\n  9\r\n$STEPSIZE\r\n 40\r\n6.0\r\n  9\r\n$3DDWFPREC\r\n 40\r\n2.0\r\n  9\r\n$PSOLWIDTH\r\n 40\r\n0.25\r\n  9\r\n$PSOLHEIGHT\r\n 40\r\n4.0\r\n  9\r\n$LOFTANG1\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTANG2\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTMAG1\r\n 40\r\n0.0\r\n  9\r\n$LOFTMAG2\r\n 40\r\n0.0\r\n  9\r\n$LOFTPARAM\r\n 70\r\n     7\r\n  9\r\n$LOFTNORMALS\r\n280\r\n     1\r\n  9\r\n$LATITUDE\r\n 40\r\n37.795\r\n  9\r\n$LONGITUDE\r\n 40\r\n-122.394\r\n  9\r\n$NORTHDIRECTION\r\n 40\r\n0.0\r\n  9\r\n$TIMEZONE\r\n 70\r\n -8000\r\n  9\r\n$LIGHTGLYPHDISPLAY\r\n280\r\n     1\r\n  9\r\n$TILEMODELIGHTSYNCH\r\n280\r\n     1\r\n  9\r\n$CMATERIAL\r\n347\r\n11\r\n  9\r\n$SOLIDHIST\r\n280\r\n     0\r\n  9\r\n$SHOWHIST\r\n280\r\n     1\r\n  9\r\n$DWFFRAME\r\n280\r\n     2\r\n  9\r\n$DGNFRAME\r\n280\r\n     0\r\n  9\r\n$REALWORLDSCALE\r\n290\r\n     1\r\n  9\r\n$INTERFERECOLOR\r\n 62\r\n     1\r\n  9\r\n$INTERFEREOBJVS\r\n345\r\n33\r\n  9\r\n$INTERFEREVPVS\r\n346\r\n30\r\n  9\r\n$CSHADOW\r\n280\r\n     0\r\n  9\r\n$SHADOWPLANELOCATION\r\n 40\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nCLASSES\r\n  0\r\nCLASS\r\n  1\r\nACDBDICTIONARYWDFLT\r\n  2\r\nAcDbDictionaryWithDefault\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMATERIAL\r\n  2\r\nAcDbMaterial\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nVISUALSTYLE\r\n  2\r\nAcDbVisualStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n       24\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSCALE\r\n  2\r\nAcDbScale\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n       17\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nTABLESTYLE\r\n  2\r\nAcDbTableStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMLEADERSTYLE\r\n  2\r\nAcDbMLeaderStyle\r\n  3\r\nACDB_MLEADERSTYLE_CLASS\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBSECTIONVIEWSTYLE\r\n  2\r\nAcDbSectionViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBDETAILVIEWSTYLE\r\n  2\r\nAcDbDetailViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSORTENTSTABLE\r\n  2\r\nAcDbSortentsTable\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nDICTIONARYVAR\r\n  2\r\nAcDbDictionaryVar\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n       27\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nCELLSTYLEMAP\r\n  2\r\nAcDbCellStyleMap\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1152\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nTABLES\r\n  0\r\nTABLE\r\n  2\r\nVPORT\r\n  5\r\n8\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nVPORT\r\n  5\r\nB3\r\n330\r\n8\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbViewportTableRecord\r\n  2\r\n*Active\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n1.0\r\n 12\r\n532607.1185847557\r\n 22\r\n184421.2568788754\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 14\r\n1.0\r\n 24\r\n1.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 16\r\n0.0\r\n 26\r\n0.0\r\n 36\r\n1.0\r\n 17\r\n0.0\r\n 27\r\n0.0\r\n 37\r\n0.0\r\n 40\r\n5191.861925766842\r\n 41\r\n1.549218031278748\r\n 42\r\n50.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 50\r\n0.0\r\n 51\r\n0.0\r\n 71\r\n     0\r\n 72\r\n  1000\r\n 73\r\n     1\r\n 74\r\n     3\r\n 75\r\n     0\r\n 76\r\n     0\r\n 77\r\n     0\r\n 78\r\n     0\r\n281\r\n     0\r\n 65\r\n     1\r\n110\r\n0.0\r\n120\r\n0.0\r\n130\r\n0.0\r\n111\r\n1.0\r\n121\r\n0.0\r\n131\r\n0.0\r\n112\r\n0.0\r\n122\r\n1.0\r\n132\r\n0.0\r\n 79\r\n     0\r\n146\r\n0.0\r\n348\r\n2F\r\n 60\r\n     3\r\n 61\r\n     5\r\n292\r\n     1\r\n282\r\n     1\r\n141\r\n0.0\r\n142\r\n0.0\r\n 63\r\n   250\r\n421\r\n  3355443\r\n1001\r\nACAD_NAV_VCDISPLAY\r\n1070\r\n     1\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLTYPE\r\n  5\r\n5\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nLTYPE\r\n  5\r\n5A\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByBlock\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n5B\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByLayer\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n5C\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nContinuous\r\n 70\r\n     0\r\n  3\r\nSolid line\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLAYER\r\n  5\r\n2\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n345\r\n102\r\n}\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nLAYER\r\n  5\r\n54\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n340\r\n102\r\n}\r\n330\r\n2\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLayerTableRecord\r\n  2\r\n0\r\n 70\r\n     0\r\n 62\r\n     7\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n390\r\nF\r\n347\r\n21\r\n348\r\n0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nSTYLE\r\n  5\r\n3\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nSTYLE\r\n  5\r\n55\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n0.2\r\n  3\r\ntxt\r\n  4\r\n\r\n  0\r\nSTYLE\r\n  5\r\n59\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n0.2\r\n  3\r\ntxt\r\n  4\r\n\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nVIEW\r\n  5\r\n6\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     3\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nUCS\r\n  5\r\n7\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nAPPID\r\n  5\r\n9\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     4\r\n  0\r\nAPPID\r\n  5\r\n56\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n5D\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nAcadAnnotative\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\nB2\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_NAV_VCDISPLAY\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\nF2\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_EXEMPT_FROM_CAD_STANDARDS\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nDIMSTYLE\r\n  5\r\nA\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     3\r\n100\r\nAcDbDimStyleTable\r\n 71\r\n     1\r\n340\r\n57\r\n  0\r\nDIMSTYLE\r\n105\r\n57\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n340\r\n55\r\n  0\r\nDIMSTYLE\r\n105\r\n58\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n340\r\n55\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nBLOCK_RECORD\r\n  5\r\n1\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n6F\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n135\r\n102\r\n}\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Model_Space\r\n340\r\n72\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n6B\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space\r\n340\r\n6E\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nBLOCKS\r\n  0\r\nBLOCK\r\n  5\r\n70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Model_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Model_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\n6C\r\n330\r\n6B\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n6D\r\n330\r\n6B\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nENTITIES\r\n  0\r\nLINE\r\n  5\r\n73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530635.6962680001\r\n 20\r\n184468.675646\r\n 30\r\n0.0\r\n 11\r\n530732.3778539999\r\n 21\r\n183731.866556\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530655.0804069999\r\n 20\r\n184267.843134\r\n 30\r\n0.0\r\n 11\r\n531386.6646780001\r\n 21\r\n184568.766995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530781.419478\r\n 20\r\n184322.997346\r\n 30\r\n0.0\r\n 11\r\n530814.78724\r\n 21\r\n184178.968574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530667.7613100001\r\n 20\r\n184203.901437\r\n 30\r\n0.0\r\n 11\r\n531124.6861069999\r\n 21\r\n184392.857349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530798.725861\r\n 20\r\n184207.390438\r\n 30\r\n0.0\r\n 11\r\n530856.762846\r\n 21\r\n184149.487013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530747.8703240001\r\n 20\r\n184145.998012\r\n 30\r\n0.0\r\n 11\r\n530810.7554050001\r\n 21\r\n184207.340453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530753.9386890001\r\n 20\r\n184164.022852\r\n 30\r\n0.0\r\n 11\r\n530781.427723\r\n 21\r\n183967.049235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530638.0708449999\r\n 20\r\n184123.954322\r\n 30\r\n0.0\r\n 11\r\n531070.9777789999\r\n 21\r\n184116.826362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530837.4941380001\r\n 20\r\n183967.908989\r\n 30\r\n0.0\r\n 11\r\n530855.6744979999\r\n 21\r\n184153.675814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530776.9259189999\r\n 20\r\n183970.168342\r\n 30\r\n0.0\r\n 11\r\n530838.1125180001\r\n 21\r\n183968.488823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530803.8790240001\r\n 20\r\n183673.983124\r\n 30\r\n0.0\r\n 11\r\n530817.351454\r\n 21\r\n183970.908131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530803.31836\r\n 20\r\n183742.403539\r\n 30\r\n0.0\r\n 11\r\n530916.415863\r\n 21\r\n183745.002795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530912.1861470001\r\n 20\r\n183663.646083\r\n 30\r\n0.0\r\n 11\r\n530932.996681\r\n 21\r\n184479.6069563149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530995.2139119999\r\n 20\r\n184191.1051\r\n 30\r\n0.0\r\n 11\r\n531426.867596\r\n 21\r\n184272.091918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530992.995991\r\n 20\r\n184260.565217\r\n 30\r\n0.0\r\n 11\r\n531006.3035189999\r\n 21\r\n184067.090599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531065.5030580001\r\n 20\r\n184264.454104\r\n 30\r\n0.0\r\n 11\r\n531069.386482\r\n 21\r\n184200.262479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531014.2600029999\r\n 20\r\n184282.658893\r\n 30\r\n0.0\r\n 11\r\n531076.262863\r\n 21\r\n184252.777446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531055.8563370001\r\n 20\r\n184254.05708\r\n 30\r\n0.0\r\n 11\r\n531446.820644\r\n 21\r\n184352.768824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531101.674141\r\n 20\r\n184455.949289\r\n 30\r\n0.0\r\n 11\r\n531227.444303\r\n 21\r\n184068.530187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531214.16151\r\n 20\r\n184067.600453\r\n 30\r\n0.0\r\n 11\r\n531445.270572\r\n 21\r\n184127.80322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531166.2824399999\r\n 20\r\n183883.173244\r\n 30\r\n0.0\r\n 11\r\n531225.605654\r\n 21\r\n184081.636435\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531103.958023\r\n 20\r\n183944.145791\r\n 30\r\n0.0\r\n 11\r\n531189.2449350001\r\n 21\r\n183939.966987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531199.1268957056\r\n 20\r\n184509.5863229855\r\n 30\r\n0.0\r\n 11\r\n531222.4027027056\r\n 21\r\n184422.5212449855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531332.5770770001\r\n 20\r\n184583.962646\r\n 30\r\n0.0\r\n 11\r\n531443.794706\r\n 21\r\n184125.074001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531026.4544489999\r\n 20\r\n184114.297086\r\n 30\r\n0.0\r\n 11\r\n531441.626255\r\n 21\r\n184200.71235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531379.0874670001\r\n 20\r\n183726.907975\r\n 30\r\n0.0\r\n 11\r\n531438.2045550001\r\n 21\r\n184206.79061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531367.365093476\r\n 20\r\n183473.8360188434\r\n 30\r\n0.0\r\n 11\r\n531409.569458\r\n 21\r\n184011.596484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531287.1303\r\n 20\r\n183716.111065\r\n 30\r\n0.0\r\n 11\r\n531396.253684\r\n 21\r\n183759.488649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531294.394199\r\n 20\r\n183777.773415\r\n 30\r\n0.0\r\n 11\r\n531391.413833\r\n 21\r\n183726.268158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531303.999695\r\n 20\r\n183967.539095\r\n 30\r\n0.0\r\n 11\r\n531311.931444\r\n 21\r\n183765.686875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531069.774\r\n 20\r\n183880.95388\r\n 30\r\n0.0\r\n 11\r\n531403.294966\r\n 21\r\n183913.414588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531055.773886\r\n 20\r\n183973.477395\r\n 30\r\n0.0\r\n 11\r\n531081.1604290001\r\n 21\r\n183854.721389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530979.070082\r\n 20\r\n183853.471746\r\n 30\r\n0.0\r\n 11\r\n531006.056167\r\n 21\r\n183971.198048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531002.3706249999\r\n 20\r\n183965.559662\r\n 30\r\n0.0\r\n 11\r\n531057.7609460001\r\n 21\r\n183972.597647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530675.0499439999\r\n 20\r\n183881.16382\r\n 30\r\n0.0\r\n 11\r\n531237.536258\r\n 21\r\n183892.420597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531246.803707\r\n 20\r\n183901.647956\r\n 30\r\n0.0\r\n 11\r\n531247.100529\r\n 21\r\n183877.364907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531378.13104\r\n 20\r\n184039.148597\r\n 30\r\n0.0\r\n 11\r\n531423.297484\r\n 21\r\n184035.389673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531365.8376540001\r\n 20\r\n184048.645878\r\n 30\r\n0.0\r\n 11\r\n531385.9885830001\r\n 21\r\n184035.489644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531360.008395\r\n 20\r\n184112.477607\r\n 30\r\n0.0\r\n 11\r\n531368.607994\r\n 21\r\n184041.148025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531176.638237\r\n 20\r\n183932.709065\r\n 30\r\n0.0\r\n 11\r\n531212.5949479999\r\n 21\r\n183499.852969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531191.28971\r\n 20\r\n183523.406227\r\n 30\r\n0.0\r\n 11\r\n531385.782456\r\n 21\r\n183575.241389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530904.180192\r\n 20\r\n183681.79089\r\n 30\r\n0.0\r\n 11\r\n531226.595062\r\n 21\r\n183515.558473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531087.294754\r\n 20\r\n183504.461649\r\n 30\r\n0.0\r\n 11\r\n531157.6993310001\r\n 21\r\n183893.960157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531029.2082989999\r\n 20\r\n183891.140964\r\n 30\r\n0.0\r\n 11\r\n531030.2306869999\r\n 21\r\n183855.631128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531182.681866\r\n 20\r\n183748.751722\r\n 30\r\n0.0\r\n 11\r\n531275.851057\r\n 21\r\n183743.153325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531240.7600770001\r\n 20\r\n183741.113908\r\n 30\r\n0.0\r\n 11\r\n531312.920852\r\n 21\r\n183782.89195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531238.3195390001\r\n 20\r\n183754.010217\r\n 30\r\n0.0\r\n 11\r\n531308.0562649999\r\n 21\r\n183714.501526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531293.948966\r\n 20\r\n183547.909213\r\n 30\r\n0.0\r\n 11\r\n531303.2823749999\r\n 21\r\n183726.188181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530707.321114\r\n 20\r\n183575.611283\r\n 30\r\n0.0\r\n 11\r\n530731.6605340001\r\n 21\r\n183750.551207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530711.864142\r\n 20\r\n183690.118506\r\n 30\r\n0.0\r\n 11\r\n530973.265559\r\n 21\r\n183658.367594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531139.131454\r\n 20\r\n184142.888902\r\n 30\r\n0.0\r\n 11\r\n531154.5332279999\r\n 21\r\n184098.471616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531091.4007950001\r\n 20\r\n184089.16428\r\n 30\r\n0.0\r\n 11\r\n531155.7864770001\r\n 21\r\n184099.901207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531060.2262189999\r\n 20\r\n184127.683254\r\n 30\r\n0.0\r\n 11\r\n531065.6514689999\r\n 21\r\n184023.503075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530915.1048979999\r\n 20\r\n184035.689587\r\n 30\r\n0.0\r\n 11\r\n531213.1391220001\r\n 21\r\n184017.404821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531281.4989239999\r\n 20\r\n184088.374506\r\n 30\r\n0.0\r\n 11\r\n531294.732247\r\n 21\r\n184020.813845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531263.3103189999\r\n 20\r\n184015.655322\r\n 30\r\n0.0\r\n 11\r\n531322.3284660001\r\n 21\r\n184027.032065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531267.276193\r\n 20\r\n184023.293136\r\n 30\r\n0.0\r\n 11\r\n531279.9983229999\r\n 21\r\n183953.103227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531276.7909939999\r\n 20\r\n183954.982689\r\n 30\r\n0.0\r\n 11\r\n531332.164824\r\n 21\r\n183964.220045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531315.9385439999\r\n 20\r\n184033.420237\r\n 30\r\n0.0\r\n 11\r\n531330.6065079999\r\n 21\r\n183957.32202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530805.297175\r\n 20\r\n183814.47291\r\n 30\r\n0.0\r\n 11\r\n530917.998915\r\n 21\r\n183816.172423\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531137.2515800001\r\n 20\r\n184338.103022\r\n 30\r\n0.0\r\n 11\r\n531389.731841\r\n 21\r\n184417.270361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531482.3151479505\r\n 20\r\n184748.9871594448\r\n 30\r\n0.0\r\n 11\r\n531515.6829099504\r\n 21\r\n184604.9583874448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531368.6569799505\r\n 20\r\n184629.8912504447\r\n 30\r\n0.0\r\n 11\r\n531825.5817769504\r\n 21\r\n184818.8471624447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531499.6215309505\r\n 20\r\n184633.3802514448\r\n 30\r\n0.0\r\n 11\r\n531557.6585159504\r\n 21\r\n184575.4768264448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531448.7659939505\r\n 20\r\n184571.9878254447\r\n 30\r\n0.0\r\n 11\r\n531511.6510749504\r\n 21\r\n184633.3302664447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531455.263586\r\n 20\r\n184588.2416564698\r\n 30\r\n0.0\r\n 11\r\n531482.7526199998\r\n 21\r\n184391.2680394698\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531253.86750234\r\n 20\r\n184551.3453196492\r\n 30\r\n0.0\r\n 11\r\n531771.8734489504\r\n 21\r\n184542.8161754447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531538.3898079505\r\n 20\r\n184393.8988024447\r\n 30\r\n0.0\r\n 11\r\n531556.5701679504\r\n 21\r\n184579.6656274448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531477.8215889504\r\n 20\r\n184396.1581554448\r\n 30\r\n0.0\r\n 11\r\n531539.0081879505\r\n 21\r\n184394.4786364447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531504.7746939504\r\n 20\r\n184099.9729374447\r\n 30\r\n0.0\r\n 11\r\n531518.2471239504\r\n 21\r\n184396.8979444447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531504.2140299504\r\n 20\r\n184168.3933524448\r\n 30\r\n0.0\r\n 11\r\n531617.3115329505\r\n 21\r\n184170.9926084448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531613.0818169504\r\n 20\r\n184089.6358964447\r\n 30\r\n0.0\r\n 11\r\n531633.8923509504\r\n 21\r\n184844.9097024448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531696.1095819504\r\n 20\r\n184617.0949134447\r\n 30\r\n0.0\r\n 11\r\n532336.8255974543\r\n 21\r\n184713.6317642464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531693.8916609504\r\n 20\r\n184686.5550304448\r\n 30\r\n0.0\r\n 11\r\n531707.1991889504\r\n 21\r\n184493.0804124447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531766.3987279504\r\n 20\r\n184690.4439174447\r\n 30\r\n0.0\r\n 11\r\n531770.2821519504\r\n 21\r\n184626.2522924448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531715.1556729503\r\n 20\r\n184708.6487064448\r\n 30\r\n0.0\r\n 11\r\n531777.1585329505\r\n 21\r\n184678.7672594447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531756.7520069505\r\n 20\r\n184680.0468934447\r\n 30\r\n0.0\r\n 11\r\n531893.0496688435\r\n 21\r\n184714.4597021531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531802.5698109504\r\n 20\r\n184881.9391024447\r\n 30\r\n0.0\r\n 11\r\n531928.3399729504\r\n 21\r\n184494.5200004447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531915.0571799504\r\n 20\r\n184493.5902664447\r\n 30\r\n0.0\r\n 11\r\n532146.1662419505\r\n 21\r\n184553.7930334447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531867.1781099504\r\n 20\r\n184309.1630574448\r\n 30\r\n0.0\r\n 11\r\n531926.5013239504\r\n 21\r\n184507.6262484447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531804.8536929503\r\n 20\r\n184370.1356044448\r\n 30\r\n0.0\r\n 11\r\n531890.1406049505\r\n 21\r\n184365.9568004447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531914.954988917\r\n 20\r\n184937.2488970258\r\n 30\r\n0.0\r\n 11\r\n531938.230795917\r\n 21\r\n184850.1838190259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531727.3501189504\r\n 20\r\n184540.2868994447\r\n 30\r\n0.0\r\n 11\r\n532142.5219249505\r\n 21\r\n184626.7021634447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531988.0259699504\r\n 20\r\n184142.1008784448\r\n 30\r\n0.0\r\n 11\r\n532097.1493539504\r\n 21\r\n184185.4784624447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531995.2898689503\r\n 20\r\n184203.7632284447\r\n 30\r\n0.0\r\n 11\r\n532092.3095029504\r\n 21\r\n184152.2579714447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532004.8953649504\r\n 20\r\n184393.5289084448\r\n 30\r\n0.0\r\n 11\r\n532012.8271139505\r\n 21\r\n184191.6766884448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531770.6696699504\r\n 20\r\n184306.9436934447\r\n 30\r\n0.0\r\n 11\r\n532197.7006858273\r\n 21\r\n184339.4044014448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531756.6695559503\r\n 20\r\n184399.4672084447\r\n 30\r\n0.0\r\n 11\r\n531782.0560989504\r\n 21\r\n184280.7112024448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531679.9657519504\r\n 20\r\n184279.4615594447\r\n 30\r\n0.0\r\n 11\r\n531706.9518369503\r\n 21\r\n184397.1878614447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531703.2662949504\r\n 20\r\n184391.5494754448\r\n 30\r\n0.0\r\n 11\r\n531758.6566159504\r\n 21\r\n184398.5874604448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531375.9456139504\r\n 20\r\n184307.1536334448\r\n 30\r\n0.0\r\n 11\r\n531938.4319279503\r\n 21\r\n184318.4104104447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531947.6993769504\r\n 20\r\n184327.6377694447\r\n 30\r\n0.0\r\n 11\r\n531947.9961989505\r\n 21\r\n184303.3547204447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532079.0267099504\r\n 20\r\n184465.1384104447\r\n 30\r\n0.0\r\n 11\r\n532156.3508382652\r\n 21\r\n184461.3794864448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532066.7333239505\r\n 20\r\n184474.6356914448\r\n 30\r\n0.0\r\n 11\r\n532086.8842529504\r\n 21\r\n184461.4794574448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532060.9040649504\r\n 20\r\n184538.4674204447\r\n 30\r\n0.0\r\n 11\r\n532069.5036639504\r\n 21\r\n184467.1378384447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531877.5339069504\r\n 20\r\n184358.6988784447\r\n 30\r\n0.0\r\n 11\r\n531913.4906179503\r\n 21\r\n184005.4836986493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531605.0758619504\r\n 20\r\n184107.7807034448\r\n 30\r\n0.0\r\n 11\r\n531784.3258864618\r\n 21\r\n184010.3328863243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531761.9190629788\r\n 20\r\n183988.7626476783\r\n 30\r\n0.0\r\n 11\r\n531858.5950009506\r\n 21\r\n184319.9499704448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531730.1039689503\r\n 20\r\n184317.1307774448\r\n 30\r\n0.0\r\n 11\r\n531731.1263569504\r\n 21\r\n184281.6209414447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531883.5775359503\r\n 20\r\n184174.7415354448\r\n 30\r\n0.0\r\n 11\r\n531976.7467269504\r\n 21\r\n184169.1431384447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531941.6557469504\r\n 20\r\n184167.1037214447\r\n 30\r\n0.0\r\n 11\r\n532013.8165219504\r\n 21\r\n184208.8817634447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531939.2152089505\r\n 20\r\n184180.0000304447\r\n 30\r\n0.0\r\n 11\r\n532008.9519349504\r\n 21\r\n184140.4913394448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531994.8446359504\r\n 20\r\n184026.5398393117\r\n 30\r\n0.0\r\n 11\r\n532004.1780449503\r\n 21\r\n184152.1779944448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531409.1658425192\r\n 20\r\n184133.617550475\r\n 30\r\n0.0\r\n 11\r\n531674.1612289504\r\n 21\r\n184084.3574074447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531840.0271239504\r\n 20\r\n184568.8787154448\r\n 30\r\n0.0\r\n 11\r\n531855.4288979504\r\n 21\r\n184524.4614294448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531792.2964649504\r\n 20\r\n184515.1540934448\r\n 30\r\n0.0\r\n 11\r\n531856.6821469506\r\n 21\r\n184525.8910204447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531761.1218889504\r\n 20\r\n184553.6730674448\r\n 30\r\n0.0\r\n 11\r\n531766.5471389503\r\n 21\r\n184449.4928884447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531616.0005679503\r\n 20\r\n184461.6794004447\r\n 30\r\n0.0\r\n 11\r\n531914.0347919505\r\n 21\r\n184443.3946344448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531982.3945939504\r\n 20\r\n184514.3643194447\r\n 30\r\n0.0\r\n 11\r\n531995.6279169504\r\n 21\r\n184446.8036584448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531964.2059889504\r\n 20\r\n184441.6451354448\r\n 30\r\n0.0\r\n 11\r\n532023.2241359505\r\n 21\r\n184453.0218784447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531968.1718629504\r\n 20\r\n184449.2829494447\r\n 30\r\n0.0\r\n 11\r\n531980.8939929504\r\n 21\r\n184379.0930404447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531977.6866639504\r\n 20\r\n184380.9725024447\r\n 30\r\n0.0\r\n 11\r\n532033.0604939504\r\n 21\r\n184390.2098584447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532016.8342139503\r\n 20\r\n184459.4100504447\r\n 30\r\n0.0\r\n 11\r\n532031.5021779503\r\n 21\r\n184383.3118334448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531506.1928449503\r\n 20\r\n184240.4627234447\r\n 30\r\n0.0\r\n 11\r\n531618.8945849504\r\n 21\r\n184242.1622364448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531838.1472499504\r\n 20\r\n184764.0928354447\r\n 30\r\n0.0\r\n 11\r\n532090.6275109504\r\n 21\r\n184843.2601744448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531898.1410099429\r\n 20\r\n185489.5773460393\r\n 30\r\n0.0\r\n 11\r\n532384.9456462926\r\n 21\r\n183588.3773949871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532034.5704961169\r\n 20\r\n184072.7659341317\r\n 30\r\n0.0\r\n 11\r\n532153.81876062\r\n 21\r\n183879.2475727824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531848.4441497004\r\n 20\r\n184056.3091599104\r\n 30\r\n0.0\r\n 11\r\n531872.7555329125\r\n 21\r\n183888.2560305589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531400.0540388189\r\n 20\r\n183972.7571852804\r\n 30\r\n0.0\r\n 11\r\n532184.2443917333\r\n 21\r\n184077.3429025231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531934.003528394\r\n 20\r\n183974.8942294735\r\n 30\r\n0.0\r\n 11\r\n532082.7807717206\r\n 21\r\n183561.6762489006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532002.2213451149\r\n 20\r\n183988.1590894068\r\n 30\r\n0.0\r\n 11\r\n531813.3438607319\r\n 21\r\n183944.1725686889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532017.6216248512\r\n 20\r\n183917.199737725\r\n 30\r\n0.0\r\n 11\r\n531954.8704583398\r\n 21\r\n183903.1307362112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532027.4228756862\r\n 20\r\n183970.6899285112\r\n 30\r\n0.0\r\n 11\r\n532007.8099904357\r\n 21\r\n183904.7157649685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532005.8194622598\r\n 20\r\n183925.0652505675\r\n 30\r\n0.0\r\n 11\r\n532165.6070012576\r\n 21\r\n183554.8422905387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532215.3406327096\r\n 20\r\n183914.506790095\r\n 30\r\n0.0\r\n 11\r\n531850.025606886\r\n 21\r\n183726.0905468235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531846.9898456826\r\n 20\r\n183739.0551582372\r\n 30\r\n0.0\r\n 11\r\n531943.2723962861\r\n 21\r\n183520.502093417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531657.2879060011\r\n 20\r\n183756.915025109\r\n 30\r\n0.0\r\n 11\r\n531862.6710068011\r\n 21\r\n183729.9954447442\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531707.542847412\r\n 20\r\n183828.1640623365\r\n 30\r\n0.0\r\n 11\r\n531717.0163799135\r\n 21\r\n183743.3019863348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532612.061878647\r\n 20\r\n183803.7866919309\r\n 30\r\n0.0\r\n 11\r\n531940.3427695725\r\n 21\r\n183521.5239075487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531863.1594357444\r\n 20\r\n183931.8064504249\r\n 30\r\n0.0\r\n 11\r\n532014.6676634007\r\n 21\r\n183535.7250404825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531536.9533087979\r\n 20\r\n183521.91630484\r\n 30\r\n0.0\r\n 11\r\n532020.1225745254\r\n 21\r\n183540.0721337803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531322.8230960096\r\n 20\r\n183496.2175151871\r\n 30\r\n0.0\r\n 11\r\n531822.8598906507\r\n 21\r\n183537.2174611747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531511.6320955302\r\n 20\r\n183610.9754424221\r\n 30\r\n0.0\r\n 11\r\n531571.8542817987\r\n 21\r\n183510.1646492979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531573.6637703916\r\n 20\r\n183613.6364478867\r\n 30\r\n0.0\r\n 11\r\n531538.2870985667\r\n 21\r\n183509.6456215089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531762.5332163358\r\n 20\r\n183634.4117035529\r\n 30\r\n0.0\r\n 11\r\n531564.5281508437\r\n 21\r\n183594.3963889772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531647.8000830325\r\n 20\r\n183818.5796003908\r\n 30\r\n0.0\r\n 11\r\n531724.9336515695\r\n 21\r\n183527.7567185295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531562.2020126962\r\n 20\r\n183850.0654772609\r\n 30\r\n0.0\r\n 11\r\n531683.6345265603\r\n 21\r\n183848.7965788212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531664.5618179023\r\n 20\r\n183949.0972884033\r\n 30\r\n0.0\r\n 11\r\n531554.5510755348\r\n 21\r\n183899.2438278418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531559.3441468586\r\n 20\r\n183903.9768061644\r\n 30\r\n0.0\r\n 11\r\n531563.459261181\r\n 21\r\n183848.292995883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531576.9778841278\r\n 20\r\n184241.5424111468\r\n 30\r\n0.0\r\n 11\r\n531576.9801121507\r\n 21\r\n184241.5301770692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531688.3652557219\r\n 20\r\n183680.3696937222\r\n 30\r\n0.0\r\n 11\r\n531664.4402060374\r\n 21\r\n183676.2047723989\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531845.0466985964\r\n 20\r\n183572.6468079129\r\n 30\r\n0.0\r\n 11\r\n531848.5375890713\r\n 21\r\n183527.4588575618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531852.4623111796\r\n 20\r\n183586.2972429151\r\n 30\r\n0.0\r\n 11\r\n531842.6874311459\r\n 21\r\n183564.3063776991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531914.5479255571\r\n 20\r\n183602.2297999917\r\n 30\r\n0.0\r\n 11\r\n531845.5021105826\r\n 21\r\n183582.3668242385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531707.8411943863\r\n 20\r\n183754.5901321862\r\n 30\r\n0.0\r\n 11\r\n531365.7560113711\r\n 21\r\n183674.7938172478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531374.0607747642\r\n 20\r\n183774.5071494866\r\n 30\r\n0.0\r\n 11\r\n531666.5682496065\r\n 21\r\n183767.1082814454\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531643.2974167897\r\n 20\r\n183893.5059139139\r\n 30\r\n0.0\r\n 11\r\n531608.4049033558\r\n 21\r\n183886.834614473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531527.2010051643\r\n 20\r\n183719.29209353\r\n 30\r\n0.0\r\n 11\r\n531536.5299245022\r\n 21\r\n183626.4222304713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531528.9213936644\r\n 20\r\n183660.7390828553\r\n 30\r\n0.0\r\n 11\r\n531581.6708679228\r\n 21\r\n183596.1629633728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531541.263570164\r\n 20\r\n183665.2046948853\r\n 30\r\n0.0\r\n 11\r\n531513.379763223\r\n 21\r\n183590.0605605288\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531346.6694038719\r\n 20\r\n183577.4244724932\r\n 30\r\n0.0\r\n 11\r\n531524.155712167\r\n 21\r\n183596.6367946471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531909.3516392598\r\n 20\r\n183825.1299313012\r\n 30\r\n0.0\r\n 11\r\n531867.9584077485\r\n 21\r\n183802.8429323334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531848.70377308\r\n 20\r\n183863.6836230238\r\n 30\r\n0.0\r\n 11\r\n531869.5695376331\r\n 21\r\n183801.8336633017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531881.7592038701\r\n 20\r\n183900.6011533052\r\n 30\r\n0.0\r\n 11\r\n531779.7769291967\r\n 21\r\n183878.6339348538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531767.8030984371\r\n 20\r\n184029.1975708737\r\n 30\r\n0.0\r\n 11\r\n531797.2733862307\r\n 21\r\n183732.0608456437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531878.2349730312\r\n 20\r\n183675.8916353841\r\n 30\r\n0.0\r\n 11\r\n531813.6487009317\r\n 21\r\n183652.0551673432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531803.5459941819\r\n 20\r\n183682.2525717864\r\n 30\r\n0.0\r\n 11\r\n531824.1875434457\r\n 21\r\n183625.8034938436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531811.718444662\r\n 20\r\n183679.5552745401\r\n 30\r\n0.0\r\n 11\r\n531744.4550535487\r\n 21\r\n183655.8042296553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531745.7990662274\r\n 20\r\n183659.270202339\r\n 30\r\n0.0\r\n 11\r\n531763.7475182558\r\n 21\r\n183606.0776947413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531829.4751229565\r\n 20\r\n183633.1302494412\r\n 30\r\n0.0\r\n 11\r\n531756.6892737099\r\n 21\r\n183606.5161939831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532101.7684936581\r\n 20\r\n183858.112361732\r\n 30\r\n0.0\r\n 11\r\n532220.1805946465\r\n 21\r\n183621.4853892659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531603.2015619726\r\n 20\r\n184097.5481402789\r\n 30\r\n0.0\r\n 11\r\n531677.7782680863\r\n 21\r\n183688.04728826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530735.9131272892\r\n 20\r\n184226.3356863664\r\n 30\r\n0.0\r\n 11\r\n530283.9544628965\r\n 21\r\n184816.224090947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530031.1888274785\r\n 20\r\n184139.9555640059\r\n 30\r\n0.0\r\n 11\r\n532155.7272385915\r\n 21\r\n185032.5284892478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530736.1824591328\r\n 20\r\n184432.3874965597\r\n 30\r\n0.0\r\n 11\r\n530658.0779895487\r\n 21\r\n184557.9159257529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530571.6050156501\r\n 20\r\n184436.4223187819\r\n 30\r\n0.0\r\n 11\r\n531028.5298126501\r\n 21\r\n184625.3782307819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530666.7818999167\r\n 20\r\n184526.4514665502\r\n 30\r\n0.0\r\n 11\r\n530666.9708656795\r\n 21\r\n184608.4335532921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530587.4192474452\r\n 20\r\n184533.9936815043\r\n 30\r\n0.0\r\n 11\r\n530675.262569967\r\n 21\r\n184534.9832109703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530604.4459568053\r\n 20\r\n184525.5195397091\r\n 30\r\n0.0\r\n 11\r\n530484.7853398737\r\n 21\r\n184684.3766753369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530494.1205644549\r\n 20\r\n184472.0484992076\r\n 30\r\n0.0\r\n 11\r\n530795.5503186188\r\n 21\r\n184782.8528180704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530525.0832024871\r\n 20\r\n184723.3672426156\r\n 30\r\n0.0\r\n 11\r\n530669.1589131753\r\n 21\r\n184604.6995201719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530483.8014128733\r\n 20\r\n184678.989008366\r\n 30\r\n0.0\r\n 11\r\n530525.9304985947\r\n 21\r\n184723.3935218478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530293.6891368917\r\n 20\r\n184907.7016572334\r\n 30\r\n0.0\r\n 11\r\n530512.942028526\r\n 21\r\n184707.017488296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530341.6169557605\r\n 20\r\n184858.8693757858\r\n 30\r\n0.0\r\n 11\r\n530423.5169519545\r\n 21\r\n184936.9090576151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530363.0611291584\r\n 20\r\n184991.515820703\r\n 30\r\n0.0\r\n 11\r\n530950.6381382885\r\n 21\r\n184434.1646856795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530794.3778468289\r\n 20\r\n184676.7579559348\r\n 30\r\n0.0\r\n 11\r\n531157.1550750989\r\n 21\r\n184924.2987611555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530841.8667898658\r\n 20\r\n184626.0191412416\r\n 30\r\n0.0\r\n 11\r\n530714.6380901394\r\n 21\r\n184772.3829895024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530895.9427945592\r\n 20\r\n184674.477204796\r\n 30\r\n0.0\r\n 11\r\n530853.3539856806\r\n 21\r\n184722.662670036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530872.5246082747\r\n 20\r\n184625.397131656\r\n 30\r\n0.0\r\n 11\r\n530895.3127741604\r\n 21\r\n184690.3429168817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530881.7703476819\r\n 20\r\n184675.0240901761\r\n 30\r\n0.0\r\n 11\r\n531228.261643328\r\n 21\r\n184881.2784956878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531056.8004158705\r\n 20\r\n184564.4609387729\r\n 30\r\n0.0\r\n 11\r\n530872.2051953306\r\n 21\r\n184927.5536250086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530862.1453565096\r\n 20\r\n184918.8302863079\r\n 30\r\n0.0\r\n 11\r\n531068.2731269009\r\n 21\r\n185039.441703539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530697.9914463482\r\n 20\r\n185015.5737333332\r\n 30\r\n0.0\r\n 11\r\n530880.1604013233\r\n 21\r\n184916.9768076993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530696.9350081967\r\n 20\r\n184928.3907741009\r\n 30\r\n0.0\r\n 11\r\n530754.3600034362\r\n 21\r\n184991.5864201783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531230.2997171692\r\n 20\r\n184634.8808927253\r\n 30\r\n0.0\r\n 11\r\n531185.2838804869\r\n 21\r\n184712.9556354173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531310.6762763139\r\n 20\r\n184636.9221898522\r\n 30\r\n0.0\r\n 11\r\n531065.3007066001\r\n 21\r\n185040.3313857042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530762.244886776\r\n 20\r\n184753.1969188066\r\n 30\r\n0.0\r\n 11\r\n531117.1883003287\r\n 21\r\n184985.2538073602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530857.7930969276\r\n 20\r\n185213.7272284981\r\n 30\r\n0.0\r\n 11\r\n531119.0590254821\r\n 21\r\n184978.5341598309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530551.2309914298\r\n 20\r\n185447.3752691109\r\n 30\r\n0.0\r\n 11\r\n530733.9839065221\r\n 21\r\n185290.855504596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530348.8181148427\r\n 20\r\n184670.0431449962\r\n 30\r\n0.0\r\n 11\r\n530754.9648854495\r\n 21\r\n185059.3532645555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530768.0427135953\r\n 20\r\n185059.3665338815\r\n 30\r\n0.0\r\n 11\r\n530751.1019407378\r\n 21\r\n185076.7666714392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530958.1276376176\r\n 20\r\n185054.7821770324\r\n 30\r\n0.0\r\n 11\r\n530999.5616859051\r\n 21\r\n185101.4584959087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530956.1327284902\r\n 20\r\n185039.3761384984\r\n 30\r\n0.0\r\n 11\r\n530961.1058763477\r\n 21\r\n185062.9221409832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530997.0898474322\r\n 20\r\n184990.0711256135\r\n 30\r\n0.0\r\n 11\r\n530952.7982457301\r\n 21\r\n185046.6406968503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530292.8641702958\r\n 20\r\n185138.907267058\r\n 30\r\n0.0\r\n 11\r\n530369.4465080707\r\n 21\r\n185353.2161854958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530370.209055034\r\n 20\r\n184973.0161857821\r\n 30\r\n0.0\r\n 11\r\n530279.2606443146\r\n 21\r\n185168.0844213306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530155.8545585965\r\n 20\r\n184909.1432228739\r\n 30\r\n0.0\r\n 11\r\n530296.6434578779\r\n 21\r\n184802.4901862823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530239.946090109\r\n 20\r\n184831.2897865306\r\n 30\r\n0.0\r\n 11\r\n530402.572414678\r\n 21\r\n185038.3924175608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530862.2055151921\r\n 20\r\n184812.5389120712\r\n 30\r\n0.0\r\n 11\r\n530841.7372332032\r\n 21\r\n184854.8610028793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530790.4707324915\r\n 20\r\n184816.8599962522\r\n 30\r\n0.0\r\n 11\r\n530843.6341425299\r\n 21\r\n184854.7341230553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530795.6071824628\r\n 20\r\n184767.5732594106\r\n 30\r\n0.0\r\n 11\r\n530725.8663087268\r\n 21\r\n184845.1564635503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530627.8983637173\r\n 20\r\n184730.1996766032\r\n 30\r\n0.0\r\n 11\r\n530825.9688616006\r\n 21\r\n184953.6427548386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530924.4874933892\r\n 20\r\n184951.6836966566\r\n 30\r\n0.0\r\n 11\r\n530886.1381600594\r\n 21\r\n185008.8579249901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530860.2504800935\r\n 20\r\n184990.3167291071\r\n 30\r\n0.0\r\n 11\r\n530910.0659924778\r\n 21\r\n185023.9468745498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530868.4525274285\r\n 20\r\n184987.7108168294\r\n 30\r\n0.0\r\n 11\r\n530827.8842952691\r\n 21\r\n185046.3852955798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530826.9412049412\r\n 20\r\n185042.789476152\r\n 30\r\n0.0\r\n 11\r\n530872.6657967761\r\n 21\r\n185075.3601914692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530910.0543372351\r\n 20\r\n185014.9114050643\r\n 30\r\n0.0\r\n 11\r\n530866.6906180778\r\n 21\r\n185079.1428277431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531418.7837954784\r\n 20\r\n184696.3400722527\r\n 30\r\n0.0\r\n 11\r\n531280.8903155291\r\n 21\r\n184879.4025017154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531365.823685466\r\n 20\r\n184738.3257753346\r\n 30\r\n0.0\r\n 11\r\n531592.6022829192\r\n 21\r\n184976.3217497332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531322.1351667875\r\n 20\r\n184916.8361742784\r\n 30\r\n0.0\r\n 11\r\n531466.2108774758\r\n 21\r\n184798.1684518348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531280.8533771736\r\n 20\r\n184872.4579400288\r\n 30\r\n0.0\r\n 11\r\n531322.982462895\r\n 21\r\n184916.8624535107\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531090.7411011921\r\n 20\r\n185101.1705888962\r\n 30\r\n0.0\r\n 11\r\n531309.9939928264\r\n 21\r\n184900.4864199589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531234.6183701311\r\n 20\r\n185110.4794756935\r\n 30\r\n0.0\r\n 11\r\n531708.2884303343\r\n 21\r\n184665.0084063687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531591.4298111294\r\n 20\r\n184870.2268875977\r\n 30\r\n0.0\r\n 11\r\n531810.6718730136\r\n 21\r\n185019.8265656036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531638.9187541661\r\n 20\r\n184819.4880729046\r\n 30\r\n0.0\r\n 11\r\n531511.6900544397\r\n 21\r\n184965.8519211652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531692.9947588596\r\n 20\r\n184867.9461364589\r\n 30\r\n0.0\r\n 11\r\n531650.4059499809\r\n 21\r\n184916.131601699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531669.5765725752\r\n 20\r\n184818.8660633189\r\n 30\r\n0.0\r\n 11\r\n531692.3647384609\r\n 21\r\n184883.8118485445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531678.8223119822\r\n 20\r\n184868.493021839\r\n 30\r\n0.0\r\n 11\r\n532025.3136076283\r\n 21\r\n185074.7474273507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531803.886242807\r\n 20\r\n184855.9649338027\r\n 30\r\n0.0\r\n 11\r\n531669.257159631\r\n 21\r\n185121.0225566715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531659.1973208101\r\n 20\r\n185112.2992179708\r\n 30\r\n0.0\r\n 11\r\n531865.3250912014\r\n 21\r\n185232.9106352019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531525.0175778789\r\n 20\r\n185192.8194795596\r\n 30\r\n0.0\r\n 11\r\n531677.2123656238\r\n 21\r\n185110.4457393622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531361.9808639693\r\n 20\r\n184957.7832641063\r\n 30\r\n0.0\r\n 11\r\n531551.4119677366\r\n 21\r\n185185.0553518411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531559.2968510764\r\n 20\r\n184946.6658504695\r\n 30\r\n0.0\r\n 11\r\n531914.240264629\r\n 21\r\n185178.722739023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531495.5870839868\r\n 20\r\n185514.328262188\r\n 30\r\n0.0\r\n 11\r\n531683.1901243598\r\n 21\r\n185202.3268566529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531462.5997031672\r\n 20\r\n185412.663348532\r\n 30\r\n0.0\r\n 11\r\n531570.4877017599\r\n 21\r\n185459.0282866746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531511.2935385215\r\n 20\r\n185374.1416658756\r\n 30\r\n0.0\r\n 11\r\n531543.5981320771\r\n 21\r\n185479.1274464145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531145.8700791432\r\n 20\r\n184863.5120766591\r\n 30\r\n0.0\r\n 11\r\n531379.5250384659\r\n 21\r\n185080.3303849344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531364.8828980397\r\n 20\r\n185058.1671364388\r\n 30\r\n0.0\r\n 11\r\n531313.3430297857\r\n 21\r\n185456.7339505713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531306.0542879552\r\n 20\r\n185343.6943371587\r\n 30\r\n0.0\r\n 11\r\n531471.2618974371\r\n 21\r\n185366.875736194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531447.4325044233\r\n 20\r\n185362.2124236505\r\n 30\r\n0.0\r\n 11\r\n531528.0241316422\r\n 21\r\n185383.6033531333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531454.8133421622\r\n 20\r\n185351.359117895\r\n 30\r\n0.0\r\n 11\r\n531476.2768427921\r\n 21\r\n185428.5825972159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531385.8070593463\r\n 20\r\n185499.2874665739\r\n 30\r\n0.0\r\n 11\r\n531481.1514824921\r\n 21\r\n185416.9376060774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531046.8204185548\r\n 20\r\n185009.8251670371\r\n 30\r\n0.0\r\n 11\r\n531131.4314460383\r\n 21\r\n185132.7716499767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531659.2574794926\r\n 20\r\n185006.0078437341\r\n 30\r\n0.0\r\n 11\r\n531638.7891975036\r\n 21\r\n185048.3299345422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531587.5226967918\r\n 20\r\n185010.328927915\r\n 30\r\n0.0\r\n 11\r\n531640.6861068304\r\n 21\r\n185048.2030547182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531592.6591467632\r\n 20\r\n184961.0421910735\r\n 30\r\n0.0\r\n 11\r\n531522.9182730272\r\n 21\r\n185038.6253952131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531424.9503280177\r\n 20\r\n184923.6686082661\r\n 30\r\n0.0\r\n 11\r\n531623.020825901\r\n 21\r\n185147.1116865014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531721.5394576896\r\n 20\r\n185145.1526283194\r\n 30\r\n0.0\r\n 11\r\n531683.1901243598\r\n 21\r\n185202.3268566529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531522.4751258036\r\n 20\r\n185175.0126803835\r\n 30\r\n0.0\r\n 11\r\n531707.1179567783\r\n 21\r\n185217.4158062127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531190.971715833\r\n 20\r\n185002.7164624653\r\n 30\r\n0.0\r\n 11\r\n531271.9560624464\r\n 21\r\n185081.1135679418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531510.9794785422\r\n 20\r\n185470.5053524346\r\n 30\r\n0.0\r\n 11\r\n531383.9700559601\r\n 21\r\n186031.2293542523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531446.5789296222\r\n 20\r\n185494.6210341629\r\n 30\r\n0.0\r\n 11\r\n531394.3170697989\r\n 21\r\n185715.8408406318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531303.1927971798\r\n 20\r\n185374.8117721197\r\n 30\r\n0.0\r\n 11\r\n531201.7089334832\r\n 21\r\n185510.9511236965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531179.1304861695\r\n 20\r\n185309.1540542189\r\n 30\r\n0.0\r\n 11\r\n531945.5235833686\r\n 21\r\n185894.4094584342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531306.2594945883\r\n 20\r\n185492.8769809982\r\n 30\r\n0.0\r\n 11\r\n531119.7299674333\r\n 21\r\n185890.4829456162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531363.9212119025\r\n 20\r\n185531.6681318393\r\n 30\r\n0.0\r\n 11\r\n531199.1434766117\r\n 21\r\n185429.4046678644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531324.7054493229\r\n 20\r\n185592.7788688038\r\n 30\r\n0.0\r\n 11\r\n531270.3457337778\r\n 21\r\n185558.4180331335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531369.4236081366\r\n 20\r\n185561.8345429817\r\n 30\r\n0.0\r\n 11\r\n531308.9422635012\r\n 21\r\n185594.6866734165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531321.9057846517\r\n 20\r\n185578.8749408755\r\n 30\r\n0.0\r\n 11\r\n531173.5376807172\r\n 21\r\n185953.8202748729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531458.9627071512\r\n 20\r\n185734.036583085\r\n 30\r\n0.0\r\n 11\r\n531071.0819022518\r\n 21\r\n185609.6976292752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531078.0896100116\r\n 20\r\n185598.3755699595\r\n 30\r\n0.0\r\n 11\r\n530991.8880389454\r\n 21\r\n185821.0975061012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530956.4097734758\r\n 20\r\n185451.7474070975\r\n 30\r\n0.0\r\n 11\r\n531082.7918483163\r\n 21\r\n185615.8646001648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531042.3088874028\r\n 20\r\n185436.8032889021\r\n 30\r\n0.0\r\n 11\r\n530989.0780830456\r\n 21\r\n185503.5700563008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531427.9086440181\r\n 20\r\n185996.2182578582\r\n 30\r\n0.0\r\n 11\r\n530990.5357910721\r\n 21\r\n185818.3049727551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531225.67491972\r\n 20\r\n185473.3432035857\r\n 30\r\n0.0\r\n 11\r\n531053.182121386\r\n 21\r\n185860.7466894662\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530705.244826224\r\n 20\r\n185533.1168306179\r\n 30\r\n0.0\r\n 11\r\n531060.1140837642\r\n 21\r\n185861.5220430019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530750.2210620191\r\n 20\r\n185452.1857979919\r\n 30\r\n0.0\r\n 11\r\n530721.6518899537\r\n 21\r\n185566.0863253691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530796.0140686663\r\n 20\r\n185494.1144299564\r\n 30\r\n0.0\r\n 11\r\n530697.5223713036\r\n 21\r\n185542.7455561081\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530944.3922051937\r\n 20\r\n185612.8039722922\r\n 30\r\n0.0\r\n 11\r\n530775.9576853574\r\n 21\r\n185501.2824771057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530993.2462747479\r\n 20\r\n185401.3925582406\r\n 30\r\n0.0\r\n 11\r\n530842.445202569\r\n 21\r\n185661.7511045552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530910.7632248174\r\n 20\r\n185339.3410325321\r\n 30\r\n0.0\r\n 11\r\n530866.5377199338\r\n 21\r\n185054.4967921601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531241.8445475884\r\n 20\r\n185051.9469660791\r\n 30\r\n0.0\r\n 11\r\n531241.8374840348\r\n 21\r\n185051.9572004795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531058.6997013602\r\n 20\r\n185297.1334434182\r\n 30\r\n0.0\r\n 11\r\n530922.2746789083\r\n 21\r\n185514.9725242263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530924.3468199957\r\n 20\r\n185527.8851535635\r\n 30\r\n0.0\r\n 11\r\n530904.4681140505\r\n 21\r\n185513.935543462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530959.1812899459\r\n 20\r\n185714.807207831\r\n 30\r\n0.0\r\n 11\r\n530929.7367229487\r\n 21\r\n185749.2623184473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530974.0721419792\r\n 20\r\n185710.3813506865\r\n 30\r\n0.0\r\n 11\r\n530951.6203425609\r\n 21\r\n185719.0452490875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531029.2769113626\r\n 20\r\n185742.952861627\r\n 30\r\n0.0\r\n 11\r\n530966.368846218\r\n 21\r\n185708.2478517434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530990.5554871495\r\n 20\r\n185489.0985828673\r\n 30\r\n0.0\r\n 11\r\n530692.0265768201\r\n 21\r\n185303.9764231624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530835.9437799745\r\n 20\r\n185306.8642317253\r\n 30\r\n0.0\r\n 11\r\n530970.1789346107\r\n 21\r\n185451.086004182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531368.1091655744\r\n 20\r\n185350.5718122836\r\n 30\r\n0.0\r\n 11\r\n530668.7795996761\r\n 21\r\n185311.5128716326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530837.7457079078\r\n 20\r\n185386.5022824307\r\n 30\r\n0.0\r\n 11\r\n530778.7567006423\r\n 21\r\n185458.8357962565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530797.6081421722\r\n 20\r\n185429.1683182495\r\n 30\r\n0.0\r\n 11\r\n530789.3411006597\r\n 21\r\n185512.1396281498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530809.4994571749\r\n 20\r\n185434.7241835344\r\n 30\r\n0.0\r\n 11\r\n530736.6862803595\r\n 21\r\n185468.2262566015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530609.7436608612\r\n 20\r\n185359.4255856905\r\n 30\r\n0.0\r\n 11\r\n530748.9595424861\r\n 21\r\n185471.1817544603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531183.0307102225\r\n 20\r\n185581.4869541878\r\n 30\r\n0.0\r\n 11\r\n531137.9864403011\r\n 21\r\n185568.0287342017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531167.3269023387\r\n 20\r\n185511.358919597\r\n 30\r\n0.0\r\n 11\r\n531138.4141562844\r\n 21\r\n185569.8811441243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531226.956583333\r\n 20\r\n185337.0486008117\r\n 30\r\n0.0\r\n 11\r\n531037.9542343994\r\n 21\r\n185568.2127058122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531055.5968811997\r\n 20\r\n185665.1585449819\r\n 30\r\n0.0\r\n 11\r\n530905.7031021065\r\n 21\r\n185592.1718504262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531342.5419517839\r\n 20\r\n185694.0402766141\r\n 30\r\n0.0\r\n 11\r\n531259.2409286286\r\n 21\r\n185945.1870251501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530564.9552335094\r\n 20\r\n184893.4794901465\r\n 30\r\n0.0\r\n 11\r\n530687.4949689912\r\n 21\r\n184780.9839569827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530476.7429703214\r\n 20\r\n184939.4505193447\r\n 30\r\n0.0\r\n 11\r\n530406.7340426724\r\n 21\r\n184768.7171604471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531173.3663268639\r\n 20\r\n185528.1064924517\r\n 30\r\n0.0\r\n 11\r\n531070.7327473466\r\n 21\r\n185471.5685231011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531054.9475551248\r\n 20\r\n184568.1054545053\r\n 30\r\n0.0\r\n 11\r\n531230.7725863385\r\n 21\r\n184476.7284847849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533270.7018874835\r\n 20\r\n183269.704674172\r\n 30\r\n0.0\r\n 11\r\n533995.2261483039\r\n 21\r\n183104.4788902862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533457.9214482086\r\n 20\r\n183355.7642878445\r\n 30\r\n0.0\r\n 11\r\n533604.5737555198\r\n 21\r\n183337.0347532795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533530.1315517867\r\n 20\r\n183207.8193128204\r\n 30\r\n0.0\r\n 11\r\n533511.6243141418\r\n 21\r\n183701.9266786306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533572.3429516997\r\n 20\r\n183331.8438445227\r\n 30\r\n0.0\r\n 11\r\n533646.7981581808\r\n 21\r\n183366.1588628451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533612.2522464815\r\n 20\r\n183262.8325135418\r\n 30\r\n0.0\r\n 11\r\n533576.567616609\r\n 21\r\n183343.107264685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533597.4568488472\r\n 20\r\n183274.7830833879\r\n 30\r\n0.0\r\n 11\r\n533791.7168653863\r\n 21\r\n183232.1532961663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533594.7911288029\r\n 20\r\n183152.2117233308\r\n 30\r\n0.0\r\n 11\r\n533751.8214958982\r\n 21\r\n183555.6973923812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533810.3821678945\r\n 20\r\n183285.0285129525\r\n 30\r\n0.0\r\n 11\r\n533642.492107029\r\n 21\r\n183366.5930041412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533787.2284528752\r\n 20\r\n183229.0149493306\r\n 30\r\n0.0\r\n 11\r\n533810.0531847598\r\n 21\r\n183285.8097756414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534074.3386399248\r\n 20\r\n183151.4269752421\r\n 30\r\n0.0\r\n 11\r\n533800.5742660043\r\n 21\r\n183267.181170518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534009.9822550737\r\n 20\r\n183174.6632241171\r\n 30\r\n0.0\r\n 11\r\n534046.8228962966\r\n 21\r\n183281.6238171917\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.646702763\r\n 20\r\n183249.4026584481\r\n 30\r\n0.0\r\n 11\r\n533363.7016999166\r\n 21\r\n183552.296365491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533655.8537941067\r\n 20\r\n183510.4459319125\r\n 30\r\n0.0\r\n 11\r\n533729.8187339051\r\n 21\r\n183943.3581115531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533589.946866456\r\n 20\r\n183532.4891602347\r\n 30\r\n0.0\r\n 11\r\n533776.0005197917\r\n 21\r\n183477.7757597539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533611.4813241646\r\n 20\r\n183601.8337010309\r\n 30\r\n0.0\r\n 11\r\n533673.0261102665\r\n 21\r\n183583.1820253481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533576.6132530237\r\n 20\r\n183560.1026257608\r\n 30\r\n0.0\r\n 11\r\n533626.1680009311\r\n 21\r\n183607.8685391599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533617.8809475537\r\n 20\r\n183589.176602051\r\n 30\r\n0.0\r\n 11\r\n533661.0930421482\r\n 21\r\n183990.087829921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533444.4675323084\r\n 20\r\n183702.2585308958\r\n 30\r\n0.0\r\n 11\r\n533851.4514544708\r\n 21\r\n183685.6518652057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533847.7102810031\r\n 20\r\n183672.8729522521\r\n 30\r\n0.0\r\n 11\r\n533871.5176046772\r\n 21\r\n183910.5049850937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534004.0299181535\r\n 20\r\n183563.9235520484\r\n 30\r\n0.0\r\n 11\r\n533838.5224367574\r\n 21\r\n183688.479384923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533925.2076230635\r\n 20\r\n183526.6538560638\r\n 30\r\n0.0\r\n 11\r\n533958.7459745272\r\n 21\r\n183605.1809134549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533207.3255747524\r\n 20\r\n183960.3049635265\r\n 30\r\n0.0\r\n 11\r\n533517.743220695\r\n 21\r\n183803.8631234574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533404.6134673158\r\n 20\r\n183963.2474941249\r\n 30\r\n0.0\r\n 11\r\n533873.5643870205\r\n 21\r\n183908.1731405794\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533738.7306447869\r\n 20\r\n183513.0669599583\r\n 30\r\n0.0\r\n 11\r\n533801.8809645519\r\n 21\r\n183932.4084239981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534224.47460254\r\n 20\r\n183709.2127634093\r\n 30\r\n0.0\r\n 11\r\n533794.9927018023\r\n 21\r\n183931.3106481514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534457.7232899407\r\n 20\r\n183610.3296057948\r\n 30\r\n0.0\r\n 11\r\n533968.0924029948\r\n 21\r\n183836.668115154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534202.6632789288\r\n 20\r\n183619.2296539358\r\n 30\r\n0.0\r\n 11\r\n534199.8836010037\r\n 21\r\n183736.6255700483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534147.3617370868\r\n 20\r\n183647.456398454\r\n 30\r\n0.0\r\n 11\r\n534229.3554706404\r\n 21\r\n183720.5496849997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533972.7437243368\r\n 20\r\n183722.3685368734\r\n 30\r\n0.0\r\n 11\r\n534164.7865490214\r\n 21\r\n183659.7044734213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533972.5943166301\r\n 20\r\n183472.651390221\r\n 30\r\n0.0\r\n 11\r\n534057.9839914489\r\n 21\r\n183796.6861657618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533880.9676565471\r\n 20\r\n183491.6555787594\r\n 30\r\n0.0\r\n 11\r\n534001.1484391712\r\n 21\r\n183474.2186921551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533966.8649116843\r\n 20\r\n183378.0488408435\r\n 30\r\n0.0\r\n 11\r\n533865.8384516585\r\n 21\r\n183444.2408746609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533869.8459157255\r\n 20\r\n183438.8265558422\r\n 30\r\n0.0\r\n 11\r\n533882.4827401662\r\n 21\r\n183493.2134252263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.3120588305\r\n 20\r\n183102.5693639709\r\n 30\r\n0.0\r\n 11\r\n534020.1041949207\r\n 21\r\n183633.953815103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534014.6697131808\r\n 20\r\n183645.8490315072\r\n 30\r\n0.0\r\n 11\r\n534037.5443778956\r\n 21\r\n183637.6940154909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533931.3368567337\r\n 20\r\n183816.7552329881\r\n 30\r\n0.0\r\n 11\r\n533950.5478562621\r\n 21\r\n183857.8048940144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.161300471\r\n 20\r\n183808.5253846964\r\n 30\r\n0.0\r\n 11\r\n533937.4969419636\r\n 21\r\n183822.8529595328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533856.2782318213\r\n 20\r\n183825.2273517097\r\n 30\r\n0.0\r\n 11\r\n533926.1545818143\r\n 21\r\n183808.5193272029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533961.1739025831\r\n 20\r\n183590.8382696407\r\n 30\r\n0.0\r\n 11\r\n534379.5749554227\r\n 21\r\n183474.2284763425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534350.0885551939\r\n 20\r\n183462.4292674622\r\n 30\r\n0.0\r\n 11\r\n534369.0260173707\r\n 21\r\n183662.8181014637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534101.8508752668\r\n 20\r\n183248.1966110715\r\n 30\r\n0.0\r\n 11\r\n534369.7091801646\r\n 21\r\n183492.8116011192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534331.7371032914\r\n 20\r\n183358.3280084779\r\n 30\r\n0.0\r\n 11\r\n533990.9335592428\r\n 21\r\n183559.6209208238\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533948.953081579\r\n 20\r\n183438.1485673899\r\n 30\r\n0.0\r\n 11\r\n533982.607720473\r\n 21\r\n183426.774957106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534135.7799619498\r\n 20\r\n183532.6183973673\r\n 30\r\n0.0\r\n 11\r\n534173.3870155533\r\n 21\r\n183618.0440944372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534163.1125968062\r\n 20\r\n183584.4290320622\r\n 30\r\n0.0\r\n 11\r\n534148.9959986748\r\n 21\r\n183666.607520118\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534150.1714181212\r\n 20\r\n183586.619216026\r\n 30\r\n0.0\r\n 11\r\n534211.4401009357\r\n 21\r\n183638.2941240943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534362.7636945454\r\n 20\r\n183567.208368469\r\n 30\r\n0.0\r\n 11\r\n534198.8229231334\r\n 21\r\n183637.8760868667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534133.0534407664\r\n 20\r\n183026.7152225984\r\n 30\r\n0.0\r\n 11\r\n533977.4553795874\r\n 21\r\n183110.2952903923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534027.2513479877\r\n 20\r\n183070.7431726557\r\n 30\r\n0.0\r\n 11\r\n534147.8091657108\r\n 21\r\n183304.8470679847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533751.0505647677\r\n 20\r\n183628.6602944098\r\n 30\r\n0.0\r\n 11\r\n533798.0520979916\r\n 21\r\n183627.6775367849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533784.854580768\r\n 20\r\n183565.2423212487\r\n 30\r\n0.0\r\n 11\r\n533797.1467362854\r\n 21\r\n183629.3492675242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533737.9064232348\r\n 20\r\n183549.3855860542\r\n 30\r\n0.0\r\n 11\r\n533837.4861916935\r\n 21\r\n183518.2919734023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533773.7742595558\r\n 20\r\n183381.3482958636\r\n 30\r\n0.0\r\n 11\r\n533894.426477489\r\n 21\r\n183654.4815484178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533851.6151786993\r\n 20\r\n183743.2337394579\r\n 30\r\n0.0\r\n 11\r\n533919.5664651833\r\n 21\r\n183732.1799429354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533913.4912480489\r\n 20\r\n183700.922309379\r\n 30\r\n0.0\r\n 11\r\n533923.3192982251\r\n 21\r\n183760.2180207445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533907.7061656309\r\n 20\r\n183707.2939010718\r\n 30\r\n0.0\r\n 11\r\n533977.9455113938\r\n 21\r\n183694.8476074883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533975.0691473797\r\n 20\r\n183692.4926410805\r\n 30\r\n0.0\r\n 11\r\n533985.6377707644\r\n 21\r\n183747.6278747745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533915.1095672107\r\n 20\r\n183756.444406914\r\n 30\r\n0.0\r\n 11\r\n533991.5652424396\r\n 21\r\n183743.7709100099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533943.085985443\r\n 20\r\n183201.5481465576\r\n 30\r\n0.0\r\n 11\r\n533980.6329200526\r\n 21\r\n183307.8251348707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533567.3344408619\r\n 20\r\n183694.6941674654\r\n 30\r\n0.0\r\n 11\r\n533580.779713257\r\n 21\r\n183958.953461359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533299.3400004697\r\n 20\r\n184222.45492858\r\n 30\r\n0.0\r\n 11\r\n533281.5900181469\r\n 21\r\n184813.9041900183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533203.5044763441\r\n 20\r\n184131.5129678913\r\n 30\r\n0.0\r\n 11\r\n533448.5161786756\r\n 21\r\n184142.2478269584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533425.5537299617\r\n 20\r\n183189.4530703633\r\n 30\r\n0.0\r\n 11\r\n533355.5667372975\r\n 21\r\n184507.1397523095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533416.2853748554\r\n 20\r\n184137.0569182016\r\n 30\r\n0.0\r\n 11\r\n533490.7405813366\r\n 21\r\n184171.371936524\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533456.1946696371\r\n 20\r\n184068.0455872208\r\n 30\r\n0.0\r\n 11\r\n533420.5100397649\r\n 21\r\n184148.3203383639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533443.2091147538\r\n 20\r\n184079.7836062105\r\n 30\r\n0.0\r\n 11\r\n533637.4691312929\r\n 21\r\n184037.1538189889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533407.8651870973\r\n 20\r\n183878.1092921243\r\n 30\r\n0.0\r\n 11\r\n533595.7639190539\r\n 21\r\n184360.9104660599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533654.3245910503\r\n 20\r\n184090.2415866314\r\n 30\r\n0.0\r\n 11\r\n533486.4345301848\r\n 21\r\n184171.8060778201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533631.1708760309\r\n 20\r\n184034.2280230095\r\n 30\r\n0.0\r\n 11\r\n533653.9956079154\r\n 21\r\n184091.0228493203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.2810630806\r\n 20\r\n183956.640048921\r\n 30\r\n0.0\r\n 11\r\n533644.51668916\r\n 21\r\n184072.3942441969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533853.9246782293\r\n 20\r\n183979.876297796\r\n 30\r\n0.0\r\n 11\r\n533890.7653194523\r\n 21\r\n184086.8368908706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533965.5891259187\r\n 20\r\n184054.615732127\r\n 30\r\n0.0\r\n 11\r\n533264.55379769\r\n 21\r\n184336.4331711375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533499.7962172624\r\n 20\r\n184315.6590055914\r\n 30\r\n0.0\r\n 11\r\n533573.7611570609\r\n 21\r\n184748.571185232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533433.8892896117\r\n 20\r\n184337.7022339136\r\n 30\r\n0.0\r\n 11\r\n533619.9429429473\r\n 21\r\n184282.9888334328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533455.4237473202\r\n 20\r\n184407.0467747098\r\n 30\r\n0.0\r\n 11\r\n533516.9685334222\r\n 21\r\n184388.3950990269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533420.5556761794\r\n 20\r\n184365.3156994397\r\n 30\r\n0.0\r\n 11\r\n533470.1104240868\r\n 21\r\n184413.0816128387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533461.8233707093\r\n 20\r\n184394.3896757299\r\n 30\r\n0.0\r\n 11\r\n533505.0354653038\r\n 21\r\n184795.3009035999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n230\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533288.409955464\r\n 20\r\n184507.4716045747\r\n 30\r\n0.0\r\n 11\r\n533695.3938776265\r\n 21\r\n184490.8649388846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n231\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533691.6527041588\r\n 20\r\n184478.0860259309\r\n 30\r\n0.0\r\n 11\r\n533715.4600278328\r\n 21\r\n184715.7180587726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n232\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533847.9723413094\r\n 20\r\n184369.1366257273\r\n 30\r\n0.0\r\n 11\r\n533682.4648599131\r\n 21\r\n184493.6924586019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n233\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533769.1500462192\r\n 20\r\n184331.8669297427\r\n 30\r\n0.0\r\n 11\r\n533802.6883976829\r\n 21\r\n184410.3939871337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n234\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533280.1746114135\r\n 20\r\n184638.1115223118\r\n 30\r\n0.0\r\n 11\r\n533369.9039828841\r\n 21\r\n184629.7013561934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n235\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533248.5558904716\r\n 20\r\n184768.4605678038\r\n 30\r\n0.0\r\n 11\r\n533717.5068101762\r\n 21\r\n184713.3862142584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n236\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533582.6730679426\r\n 20\r\n184318.2800336372\r\n 30\r\n0.0\r\n 11\r\n533645.8233877078\r\n 21\r\n184737.6214976771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n237\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.0039373072\r\n 20\r\n184485.2255270968\r\n 30\r\n0.0\r\n 11\r\n533638.9351249581\r\n 21\r\n184736.5237218303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n238\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534046.6057020844\r\n 20\r\n184424.4427276146\r\n 30\r\n0.0\r\n 11\r\n534043.8260241595\r\n 21\r\n184541.8386437273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n239\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533991.3041602425\r\n 20\r\n184452.6694721329\r\n 30\r\n0.0\r\n 11\r\n534073.2978937962\r\n 21\r\n184525.7627586786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533816.6861474925\r\n 20\r\n184527.5816105521\r\n 30\r\n0.0\r\n 11\r\n534008.728972177\r\n 21\r\n184464.9175471002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533816.5367397858\r\n 20\r\n184277.8644638999\r\n 30\r\n0.0\r\n 11\r\n533901.9264146046\r\n 21\r\n184601.8992394407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533724.9100797029\r\n 20\r\n184296.8686524383\r\n 30\r\n0.0\r\n 11\r\n533845.0908623268\r\n 21\r\n184279.431765834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533810.80733484\r\n 20\r\n184183.2619145225\r\n 30\r\n0.0\r\n 11\r\n533709.7808748142\r\n 21\r\n184249.4539483398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533713.7883388812\r\n 20\r\n184244.0396295211\r\n 30\r\n0.0\r\n 11\r\n533726.4251633219\r\n 21\r\n184298.4264989052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533679.2544819863\r\n 20\r\n183907.7824376498\r\n 30\r\n0.0\r\n 11\r\n533864.0466180764\r\n 21\r\n184439.1668887819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n240\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533858.6121363364\r\n 20\r\n184451.062105186\r\n 30\r\n0.0\r\n 11\r\n533881.4868010512\r\n 21\r\n184442.9070891699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n241\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533775.2792798894\r\n 20\r\n184621.968306667\r\n 30\r\n0.0\r\n 11\r\n533794.4902794179\r\n 21\r\n184663.0179676933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n242\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533762.1037236266\r\n 20\r\n184613.7384583753\r\n 30\r\n0.0\r\n 11\r\n533781.4393651193\r\n 21\r\n184628.0660332116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n243\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533700.2206549769\r\n 20\r\n184630.4404253886\r\n 30\r\n0.0\r\n 11\r\n533770.0970049699\r\n 21\r\n184613.7324008818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n244\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533805.1163257388\r\n 20\r\n184396.0513433196\r\n 30\r\n0.0\r\n 11\r\n534148.8336143433\r\n 21\r\n184307.1003803216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n245\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533945.7932984225\r\n 20\r\n184053.4096847504\r\n 30\r\n0.0\r\n 11\r\n534099.4280930914\r\n 21\r\n184187.6594453309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n246\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534111.8739580623\r\n 20\r\n184159.1560880029\r\n 30\r\n0.0\r\n 11\r\n533834.8759823985\r\n 21\r\n184364.8339945026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n247\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533792.8955047349\r\n 20\r\n184243.3616410688\r\n 30\r\n0.0\r\n 11\r\n533826.5501436287\r\n 21\r\n184231.9880307849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n248\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533979.7223851056\r\n 20\r\n184337.8314710463\r\n 30\r\n0.0\r\n 11\r\n534017.3294387088\r\n 21\r\n184423.2571681159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n249\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534007.0550199618\r\n 20\r\n184389.6421057411\r\n 30\r\n0.0\r\n 11\r\n533992.9384218304\r\n 21\r\n184471.8205937969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533994.1138412768\r\n 20\r\n184391.8322897049\r\n 30\r\n0.0\r\n 11\r\n534055.3825240914\r\n 21\r\n184443.5071977732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534157.3418682092\r\n 20\r\n184390.7032924748\r\n 30\r\n0.0\r\n 11\r\n534042.765346289\r\n 21\r\n184443.0891605456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533853.5262160742\r\n 20\r\n183878.666833987\r\n 30\r\n0.0\r\n 11\r\n533991.7515888664\r\n 21\r\n184110.0601416636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533594.9929879234\r\n 20\r\n184433.8733680887\r\n 30\r\n0.0\r\n 11\r\n533641.9945211472\r\n 21\r\n184432.8906104638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533628.7970039238\r\n 20\r\n184370.4553949276\r\n 30\r\n0.0\r\n 11\r\n533641.0891594411\r\n 21\r\n184434.5623412031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533581.8488463905\r\n 20\r\n184354.5986597329\r\n 30\r\n0.0\r\n 11\r\n533681.4286148493\r\n 21\r\n184323.5050470813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n250\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533617.7166827114\r\n 20\r\n184186.5613695425\r\n 30\r\n0.0\r\n 11\r\n533738.3689006447\r\n 21\r\n184459.6946220967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n251\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533695.5576018551\r\n 20\r\n184548.4468131368\r\n 30\r\n0.0\r\n 11\r\n533763.508888339\r\n 21\r\n184537.3930166142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n252\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533757.4336712046\r\n 20\r\n184506.1353830579\r\n 30\r\n0.0\r\n 11\r\n533767.2617213808\r\n 21\r\n184565.4310944234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n253\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533751.6485887866\r\n 20\r\n184512.5069747506\r\n 30\r\n0.0\r\n 11\r\n533821.8879345495\r\n 21\r\n184500.0606811671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n254\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533819.0115705354\r\n 20\r\n184497.7057147594\r\n 30\r\n0.0\r\n 11\r\n533829.5801939202\r\n 21\r\n184552.8409484534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n255\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533759.0519903664\r\n 20\r\n184561.6574805929\r\n 30\r\n0.0\r\n 11\r\n533835.5076655954\r\n 21\r\n184548.9839836887\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n256\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533787.0284085987\r\n 20\r\n184006.7612202365\r\n 30\r\n0.0\r\n 11\r\n533824.5753432083\r\n 21\r\n184113.0382085496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n257\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533411.2768640178\r\n 20\r\n184499.9072411442\r\n 30\r\n0.0\r\n 11\r\n533424.7221364126\r\n 21\r\n184764.1665350379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n258\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534079.0438751079\r\n 20\r\n184492.5166948246\r\n 30\r\n0.0\r\n 11\r\n534641.721189493\r\n 21\r\n184610.5719340789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534078.581459301\r\n 20\r\n184263.7540395752\r\n 30\r\n0.0\r\n 11\r\n534244.6175290031\r\n 21\r\n184228.1883089295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534001.2095466687\r\n 20\r\n183814.2563075048\r\n 30\r\n0.0\r\n 11\r\n534167.6424192837\r\n 21\r\n184551.2581387564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534184.6430945557\r\n 20\r\n184315.7129436011\r\n 30\r\n0.0\r\n 11\r\n534623.810301958\r\n 21\r\n184321.8368213024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534195.8955435099\r\n 20\r\n184384.2914345422\r\n 30\r\n0.0\r\n 11\r\n534171.5481171157\r\n 21\r\n184191.8941348217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534267.7865448688\r\n 20\r\n184374.0893695216\r\n 30\r\n0.0\r\n 11\r\n534259.1867207302\r\n 21\r\n184310.3579900692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534221.0297037694\r\n 20\r\n184401.8573877923\r\n 30\r\n0.0\r\n 11\r\n534276.0859439502\r\n 21\r\n184360.5528367094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n260\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534256.3117883924\r\n 20\r\n184365.7534653767\r\n 30\r\n0.0\r\n 11\r\n534658.9839601197\r\n 21\r\n184387.0189272303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n261\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534340.2964578094\r\n 20\r\n184554.9790199963\r\n 30\r\n0.0\r\n 11\r\n534388.795247378\r\n 21\r\n184150.5540434503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n262\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534375.5833000987\r\n 20\r\n184152.2097741889\r\n 30\r\n0.0\r\n 11\r\n534613.971169032\r\n 21\r\n184166.5971171824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n263\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534292.9527107281\r\n 20\r\n183980.5182296566\r\n 30\r\n0.0\r\n 11\r\n534389.5250794471\r\n 21\r\n184163.7684943256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n264\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534243.591734117\r\n 20\r\n184052.3894925513\r\n 30\r\n0.0\r\n 11\r\n534326.4617765393\r\n 21\r\n184031.8012475966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n265\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534523.6546636549\r\n 20\r\n184592.9361776223\r\n 30\r\n0.0\r\n 11\r\n534529.6593127575\r\n 21\r\n184503.01379338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n267\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534200.4451829229\r\n 20\r\n184234.3143184903\r\n 30\r\n0.0\r\n 11\r\n534624.4909197793\r\n 21\r\n184238.8353143359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n268\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534471.5327107409\r\n 20\r\n183786.0600145884\r\n 30\r\n0.0\r\n 11\r\n534606.9904846774\r\n 21\r\n184209.2224334297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n269\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534421.2657241103\r\n 20\r\n183576.3330352236\r\n 30\r\n0.0\r\n 11\r\n534556.4776611428\r\n 21\r\n184059.4846922112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534379.2230397164\r\n 20\r\n183793.2446136424\r\n 30\r\n0.0\r\n 11\r\n534494.6738051587\r\n 21\r\n183814.7073368633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534398.2709077693\r\n 20\r\n183852.3393541769\r\n 30\r\n0.0\r\n 11\r\n534483.5028377962\r\n 21\r\n183783.049246773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534444.3820505485\r\n 20\r\n184036.6679774855\r\n 30\r\n0.0\r\n 11\r\n534413.1406446979\r\n 21\r\n183837.0904088021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534231.8313058096\r\n 20\r\n183993.0367155942\r\n 30\r\n0.0\r\n 11\r\n534531.3403140241\r\n 21\r\n183964.3680914949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534172.5775135222\r\n 20\r\n183923.7014562585\r\n 30\r\n0.0\r\n 11\r\n534215.9402417578\r\n 21\r\n184037.1348698833\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534115.2587862785\r\n 20\r\n184054.0831760169\r\n 30\r\n0.0\r\n 11\r\n534123.8030832675\r\n 21\r\n183933.6060995451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n270\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.0293094167\r\n 20\r\n183939.744568014\r\n 30\r\n0.0\r\n 11\r\n534174.6763040911\r\n 21\r\n183924.2648762933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n271\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533810.5991600926\r\n 20\r\n184073.5153000436\r\n 30\r\n0.0\r\n 11\r\n533810.6114064545\r\n 21\r\n184073.5131405614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n272\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533954.7380145801\r\n 20\r\n184048.098338197\r\n 30\r\n0.0\r\n 11\r\n534364.6500434818\r\n 21\r\n183975.815826753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n273\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534375.5265551551\r\n 20\r\n183983.0774559717\r\n 30\r\n0.0\r\n 11\r\n534371.123204419\r\n 21\r\n183959.1951387822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n274\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534530.9589212817\r\n 20\r\n184092.5949168104\r\n 30\r\n0.0\r\n 11\r\n534574.5465687242\r\n 21\r\n184080.1750068405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n275\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534520.7335404321\r\n 20\r\n184104.2896708572\r\n 30\r\n0.0\r\n 11\r\n534537.9608515989\r\n 21\r\n184087.4859158428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n276\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534527.3546613447\r\n 20\r\n184168.0441267445\r\n 30\r\n0.0\r\n 11\r\n534522.0020775037\r\n 21\r\n184096.3976877718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n277\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534312.6897586476\r\n 20\r\n184027.1174682027\r\n 30\r\n0.0\r\n 11\r\n534268.715040369\r\n 21\r\n183678.6121619755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n278\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534178.0924395927\r\n 20\r\n183721.0298699493\r\n 30\r\n0.0\r\n 11\r\n534286.6169309787\r\n 21\r\n183992.7609886244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n279\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534160.0049395611\r\n 20\r\n184014.8357883496\r\n 30\r\n0.0\r\n 11\r\n534154.1430236581\r\n 21\r\n183979.7982132065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534283.0554192325\r\n 20\r\n183845.4622028715\r\n 30\r\n0.0\r\n 11\r\n534373.3845904289\r\n 21\r\n183821.9572878209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534338.5613499616\r\n 20\r\n183826.740385397\r\n 30\r\n0.0\r\n 11\r\n534417.4375952255\r\n 21\r\n183853.7796193919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534338.6600611481\r\n 20\r\n183839.8652194019\r\n 30\r\n0.0\r\n 11\r\n534399.4430551205\r\n 21\r\n183787.6198821797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534353.3950801142\r\n 20\r\n183626.8977659865\r\n 30\r\n0.0\r\n 11\r\n534397.018575538\r\n 21\r\n183800.0089834212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534316.5240373919\r\n 20\r\n184240.583205404\r\n 30\r\n0.0\r\n 11\r\n534323.0481789416\r\n 21\r\n184194.0262992032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534259.3074196166\r\n 20\r\n184197.0997663956\r\n 30\r\n0.0\r\n 11\r\n534324.5541633551\r\n 21\r\n184195.1866329612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n280\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534236.1677363386\r\n 20\r\n184240.9189471798\r\n 30\r\n0.0\r\n 11\r\n534221.3497769108\r\n 21\r\n184137.6553470467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n281\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534075.9993490205\r\n 20\r\n184178.7166941591\r\n 30\r\n0.0\r\n 11\r\n534364.8760209383\r\n 21\r\n184103.158770916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n282\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534445.6665385903\r\n 20\r\n184159.5737598459\r\n 30\r\n0.0\r\n 11\r\n534445.5888953305\r\n 21\r\n184090.7293139994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n283\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534413.7624798858\r\n 20\r\n184091.7428221283\r\n 30\r\n0.0\r\n 11\r\n534473.8666444875\r\n 21\r\n184091.4951244661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n284\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534419.1301320043\r\n 20\r\n184098.4698326099\r\n 30\r\n0.0\r\n 11\r\n534418.0426346745\r\n 21\r\n184027.1445687356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n285\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534415.2591650874\r\n 20\r\n184029.6086372781\r\n 30\r\n0.0\r\n 11\r\n534471.3741634863\r\n 21\r\n184027.9664590178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n286\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534468.8322797114\r\n 20\r\n184098.9981249308\r\n 30\r\n0.0\r\n 11\r\n534468.5116705245\r\n 21\r\n184021.4998345739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n287\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534352.4198206242\r\n 20\r\n184432.4779143455\r\n 30\r\n0.0\r\n 11\r\n534615.4420738622\r\n 21\r\n184461.3404170194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n288\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533532.7624275796\r\n 20\r\n183279.5203883841\r\n 30\r\n0.0\r\n 11\r\n532822.6282750719\r\n 21\r\n183060.5581778998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n289\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533342.1028701529\r\n 20\r\n183213.5023917251\r\n 30\r\n0.0\r\n 11\r\n533311.0032423039\r\n 21\r\n183772.1392497893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533339.6295991045\r\n 20\r\n183351.3335597998\r\n 30\r\n0.0\r\n 11\r\n533194.7893030568\r\n 21\r\n183321.6859065113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533278.6891237384\r\n 20\r\n183198.401309585\r\n 30\r\n0.0\r\n 11\r\n533234.487352922\r\n 21\r\n184185.8116573112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533227.3181130724\r\n 20\r\n183318.9206275791\r\n 30\r\n0.0\r\n 11\r\n533150.504528331\r\n 21\r\n183347.5697367062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533192.6831632028\r\n 20\r\n183247.1171745893\r\n 30\r\n0.0\r\n 11\r\n533222.2627044432\r\n 21\r\n183329.8364542056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533206.543120186\r\n 20\r\n183260.1410566229\r\n 30\r\n0.0\r\n 11\r\n533016.016412499\r\n 21\r\n183203.0987351212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533218.3705491292\r\n 20\r\n183138.1125505508\r\n 30\r\n0.0\r\n 11\r\n533031.596680065\r\n 21\r\n183528.7207214253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n290\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532993.44798064\r\n 20\r\n183254.429505146\r\n 30\r\n0.0\r\n 11\r\n533154.7660373612\r\n 21\r\n183348.3247837068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n291\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533020.7270185264\r\n 20\r\n183200.3049458331\r\n 30\r\n0.0\r\n 11\r\n532993.7175981719\r\n 21\r\n183255.2331889633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n292\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532740.2254147077\r\n 20\r\n183101.4565594727\r\n 30\r\n0.0\r\n 11\r\n533004.5635047808\r\n 21\r\n183237.3658685307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n293\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532802.6632449139\r\n 20\r\n183129.4420001883\r\n 30\r\n0.0\r\n 11\r\n532757.924443903\r\n 21\r\n183233.3469615745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n294\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.720654224\r\n 20\r\n183195.6187514277\r\n 30\r\n0.0\r\n 11\r\n533412.4422479266\r\n 21\r\n183553.0579135474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n295\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533130.6806038581\r\n 20\r\n183490.7750957559\r\n 30\r\n0.0\r\n 11\r\n533024.5381114682\r\n 21\r\n183916.9411888579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n296\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533194.7538784246\r\n 20\r\n183517.6868499452\r\n 30\r\n0.0\r\n 11\r\n533013.3144771753\r\n 21\r\n183449.2086651994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n297\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533168.0923122618\r\n 20\r\n183585.2261651385\r\n 30\r\n0.0\r\n 11\r\n533108.1152453137\r\n 21\r\n183562.0227786959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n298\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533205.9844550757\r\n 20\r\n183546.2203893963\r\n 30\r\n0.0\r\n 11\r\n533152.9953396826\r\n 21\r\n183590.1454297818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n299\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533162.6574581374\r\n 20\r\n183572.125795115\r\n 30\r\n0.0\r\n 11\r\n533089.5755333646\r\n 21\r\n183968.6811254574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533327.1256725953\r\n 20\r\n183697.8633855617\r\n 30\r\n0.0\r\n 11\r\n532922.5243948965\r\n 21\r\n183650.8580632188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532927.2110360585\r\n 20\r\n183638.3948216737\r\n 30\r\n0.0\r\n 11\r\n532885.6939141481\r\n 21\r\n183873.5800684076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532779.4795621642\r\n 20\r\n183518.0569124989\r\n 30\r\n0.0\r\n 11\r\n532935.2056681788\r\n 21\r\n183654.6448395154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532860.8690292618\r\n 20\r\n183486.7880927641\r\n 30\r\n0.0\r\n 11\r\n532821.5502885538\r\n 21\r\n183562.5862219661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533293.6322814212\r\n 20\r\n183952.7605173787\r\n 30\r\n0.0\r\n 11\r\n532883.8273047613\r\n 21\r\n183871.1016442716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533047.8398997946\r\n 20\r\n183487.189023119\r\n 30\r\n0.0\r\n 11\r\n532953.4969078967\r\n 21\r\n183900.6314329289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532548.7839254298\r\n 20\r\n183646.44825568\r\n 30\r\n0.0\r\n 11\r\n532960.4479911811\r\n 21\r\n183900.052022287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532323.5859293173\r\n 20\r\n183530.3935634832\r\n 30\r\n0.0\r\n 11\r\n532794.9132185243\r\n 21\r\n183792.7256292301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532577.2654881728\r\n 20\r\n183558.3489116874\r\n 30\r\n0.0\r\n 11\r\n532571.2553581126\r\n 21\r\n183675.6238282977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532630.3005233718\r\n 20\r\n183590.633500544\r\n 30\r\n0.0\r\n 11\r\n532543.0686538527\r\n 21\r\n183657.3882892886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532798.8253221348\r\n 20\r\n183678.3983628817\r\n 30\r\n0.0\r\n 11\r\n532612.008295049\r\n 21\r\n183601.5437615102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532817.6548659477\r\n 20\r\n183429.3920899996\r\n 30\r\n0.0\r\n 11\r\n532708.2644265074\r\n 21\r\n183746.131200443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532982.2371375846\r\n 20\r\n183070.6166723318\r\n 30\r\n0.0\r\n 11\r\n532758.2115810167\r\n 21\r\n183586.6884875571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532762.7409918191\r\n 20\r\n183598.9569105556\r\n 30\r\n0.0\r\n 11\r\n532740.5404720749\r\n 21\r\n183589.1135627954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532833.0553973926\r\n 20\r\n183775.6181090037\r\n 30\r\n0.0\r\n 11\r\n532810.8274301857\r\n 21\r\n183815.1156361047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532846.8096853747\r\n 20\r\n183768.3969423502\r\n 30\r\n0.0\r\n 11\r\n532826.4564207106\r\n 21\r\n183781.2379333611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532907.2699385936\r\n 20\r\n183789.6813889798\r\n 30\r\n0.0\r\n 11\r\n532838.8392540151\r\n 21\r\n183767.7929495795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532820.202091548\r\n 20\r\n183548.1021399771\r\n 30\r\n0.0\r\n 11\r\n532411.6965931075\r\n 21\r\n183400.5198149712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532705.5512352485\r\n 20\r\n183195.8969469713\r\n 30\r\n0.0\r\n 11\r\n532420.1445797267\r\n 21\r\n183419.7888982393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532468.0705552294\r\n 20\r\n183288.5226947296\r\n 30\r\n0.0\r\n 11\r\n532792.8610919387\r\n 21\r\n183514.7460345087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532650.440516718\r\n 20\r\n183476.9836669457\r\n 30\r\n0.0\r\n 11\r\n532606.5484086562\r\n 21\r\n183559.3567393084\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532619.308676055\r\n 20\r\n183526.6044619072\r\n 30\r\n0.0\r\n 11\r\n532627.2382057076\r\n 21\r\n183609.6087075904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532632.0497533188\r\n 20\r\n183529.7565979628\r\n 30\r\n0.0\r\n 11\r\n532567.0871053734\r\n 21\r\n183576.7033975304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532319.1054598828\r\n 20\r\n183440.943242896\r\n 30\r\n0.0\r\n 11\r\n532579.7002024197\r\n 21\r\n183577.2303830341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532691.0044244704\r\n 20\r\n182972.7019742909\r\n 30\r\n0.0\r\n 11\r\n532839.9141442266\r\n 21\r\n183067.6876560392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532793.2164716504\r\n 20\r\n183024.5212818305\r\n 30\r\n0.0\r\n 11\r\n532655.4838754236\r\n 21\r\n183248.9506764272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533026.9073257411\r\n 20\r\n183601.5368553743\r\n 30\r\n0.0\r\n 11\r\n532980.1110058652\r\n 21\r\n183597.0408144468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532997.9421264003\r\n 20\r\n183535.767804562\r\n 30\r\n0.0\r\n 11\r\n532980.888773864\r\n 21\r\n183598.7755883294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533045.9449296638\r\n 20\r\n183523.46754336\r\n 30\r\n0.0\r\n 11\r\n532948.9701949887\r\n 21\r\n183485.011804273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533022.747934971\r\n 20\r\n183353.2179265787\r\n 30\r\n0.0\r\n 11\r\n532882.0015395169\r\n 21\r\n183616.5602579835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532918.0536104154\r\n 20\r\n183708.2663477616\r\n 30\r\n0.0\r\n 11\r\n532851.1196203771\r\n 21\r\n183692.1603013838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532859.5161003121\r\n 20\r\n183661.4447183113\r\n 30\r\n0.0\r\n 11\r\n532845.2798621558\r\n 21\r\n183719.8390800234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532864.808334425\r\n 20\r\n183668.2312208995\r\n 30\r\n0.0\r\n 11\r\n532795.6968644821\r\n 21\r\n183650.5654166575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532798.7413366781\r\n 20\r\n183648.4322205175\r\n 30\r\n0.0\r\n 11\r\n532784.0778326244\r\n 21\r\n183702.6223620896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532853.7488820336\r\n 20\r\n183716.6901838713\r\n 30\r\n0.0\r\n 11\r\n532778.4554968875\r\n 21\r\n183698.3327888569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533236.9410300952\r\n 20\r\n184128.2527506047\r\n 30\r\n0.0\r\n 11\r\n533126.981531269\r\n 21\r\n184343.3517983396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532835.6102659117\r\n 20\r\n183916.0876363871\r\n 30\r\n0.0\r\n 11\r\n533298.5518772549\r\n 21\r\n184154.1088557825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532781.1055054279\r\n 20\r\n184010.2498283422\r\n 30\r\n0.0\r\n 11\r\n533459.0946851481\r\n 21\r\n184343.719875779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533226.0654550621\r\n 20\r\n184305.4061726703\r\n 30\r\n0.0\r\n 11\r\n533119.9229626722\r\n 21\r\n184731.5722657724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533290.1387296285\r\n 20\r\n184332.3179268596\r\n 30\r\n0.0\r\n 11\r\n533108.6993283793\r\n 21\r\n184263.8397421138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533263.4771634658\r\n 20\r\n184399.8572420528\r\n 30\r\n0.0\r\n 11\r\n533203.5000965176\r\n 21\r\n184376.6538556104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533301.3693062795\r\n 20\r\n184360.8514663108\r\n 30\r\n0.0\r\n 11\r\n533248.3801908866\r\n 21\r\n184404.7765066962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533258.0423093414\r\n 20\r\n184386.7568720294\r\n 30\r\n0.0\r\n 11\r\n533184.9603845684\r\n 21\r\n184783.3122023718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533313.2245827507\r\n 20\r\n184499.6854179535\r\n 30\r\n0.0\r\n 11\r\n533017.9092461005\r\n 21\r\n184465.4891401333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533022.5958872625\r\n 20\r\n184453.0258985883\r\n 30\r\n0.0\r\n 11\r\n532981.0787653521\r\n 21\r\n184688.211145322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532874.8644133681\r\n 20\r\n184332.6879894133\r\n 30\r\n0.0\r\n 11\r\n533030.5905193828\r\n 21\r\n184469.2759164299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532956.2538804658\r\n 20\r\n184301.4191696784\r\n 30\r\n0.0\r\n 11\r\n532916.9351397578\r\n 21\r\n184377.2172988805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533312.5190293062\r\n 20\r\n184749.7419374041\r\n 30\r\n0.0\r\n 11\r\n532979.2121559653\r\n 21\r\n184685.7327211861\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533143.2247509987\r\n 20\r\n184301.8201000335\r\n 30\r\n0.0\r\n 11\r\n533048.8817591007\r\n 21\r\n184715.2625098432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532593.9135947571\r\n 20\r\n184428.0269791083\r\n 30\r\n0.0\r\n 11\r\n533055.8328423851\r\n 21\r\n184714.6830992013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532672.6503393768\r\n 20\r\n184372.9799886018\r\n 30\r\n0.0\r\n 11\r\n532666.6402093166\r\n 21\r\n184490.254905212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532725.6853745756\r\n 20\r\n184405.2645774584\r\n 30\r\n0.0\r\n 11\r\n532638.4535050566\r\n 21\r\n184472.0193662031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532894.2101733388\r\n 20\r\n184493.0294397962\r\n 30\r\n0.0\r\n 11\r\n532707.3931462529\r\n 21\r\n184416.1748384246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532913.0397171517\r\n 20\r\n184244.0231669139\r\n 30\r\n0.0\r\n 11\r\n532803.6492777113\r\n 21\r\n184560.7622773574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533002.9879995437\r\n 20\r\n184269.8284089141\r\n 30\r\n0.0\r\n 11\r\n532884.4483571425\r\n 21\r\n184243.4500331875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533018.0305508438\r\n 20\r\n184217.9793931889\r\n 30\r\n0.0\r\n 11\r\n533001.3606235288\r\n 21\r\n184271.2685517172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533077.6219887886\r\n 20\r\n183885.2477492463\r\n 30\r\n0.0\r\n 11\r\n532853.5964322206\r\n 21\r\n184401.3195644716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532858.125843023\r\n 20\r\n184413.5879874701\r\n 30\r\n0.0\r\n 11\r\n532835.9253232789\r\n 21\r\n184403.7446397097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532928.4402485964\r\n 20\r\n184590.2491859182\r\n 30\r\n0.0\r\n 11\r\n532906.2122813897\r\n 21\r\n184629.7467130191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532942.1945365787\r\n 20\r\n184583.0280192646\r\n 30\r\n0.0\r\n 11\r\n532921.8412719146\r\n 21\r\n184595.8690102754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533002.6547897976\r\n 20\r\n184604.3124658941\r\n 30\r\n0.0\r\n 11\r\n532934.2241052192\r\n 21\r\n184582.424026494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532915.586942752\r\n 20\r\n184362.7332168916\r\n 30\r\n0.0\r\n 11\r\n532579.4868776007\r\n 21\r\n184248.3190809244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532800.9360864524\r\n 20\r\n184010.5280238858\r\n 30\r\n0.0\r\n 11\r\n532637.6889675159\r\n 21\r\n184132.908686197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532627.4102219\r\n 20\r\n184103.5541580553\r\n 30\r\n0.0\r\n 11\r\n532888.2459431427\r\n 21\r\n184329.3771114232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532939.1957581605\r\n 20\r\n184211.3855460326\r\n 30\r\n0.0\r\n 11\r\n532906.4862421954\r\n 21\r\n184197.5262063909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532745.825367922\r\n 20\r\n184291.6147438601\r\n 30\r\n0.0\r\n 11\r\n532701.9332598602\r\n 21\r\n184373.9878162229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532714.693527259\r\n 20\r\n184341.2355388216\r\n 30\r\n0.0\r\n 11\r\n532722.6230569117\r\n 21\r\n184424.2397845048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532727.4346045227\r\n 20\r\n184344.3876748772\r\n 30\r\n0.0\r\n 11\r\n532662.4719565772\r\n 21\r\n184391.3344744447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532564.7483924605\r\n 20\r\n184331.0512654725\r\n 30\r\n0.0\r\n 11\r\n532675.0850536236\r\n 21\r\n184391.8614599485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532906.0166036281\r\n 20\r\n183843.1770056994\r\n 30\r\n0.0\r\n 11\r\n532750.8687266275\r\n 21\r\n184063.5817533417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533122.292176945\r\n 20\r\n184416.1679322887\r\n 30\r\n0.0\r\n 11\r\n533075.4958570691\r\n 21\r\n184411.6718913614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533093.3269776042\r\n 20\r\n184350.3988814763\r\n 30\r\n0.0\r\n 11\r\n533076.273625068\r\n 21\r\n184413.4066652438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533141.3297808676\r\n 20\r\n184338.0986202742\r\n 30\r\n0.0\r\n 11\r\n533044.3550461925\r\n 21\r\n184299.6428811874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533118.132786175\r\n 20\r\n184167.8490034932\r\n 30\r\n0.0\r\n 11\r\n532977.3863907207\r\n 21\r\n184431.1913348979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533013.4384616195\r\n 20\r\n184522.897424676\r\n 30\r\n0.0\r\n 11\r\n532946.5044715811\r\n 21\r\n184506.7913782983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532954.9009515162\r\n 20\r\n184476.0757952258\r\n 30\r\n0.0\r\n 11\r\n532940.6647133597\r\n 21\r\n184534.470156938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532960.1931856289\r\n 20\r\n184482.8622978139\r\n 30\r\n0.0\r\n 11\r\n532891.0817156861\r\n 21\r\n184465.196493572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532894.1261878821\r\n 20\r\n184463.0632974319\r\n 30\r\n0.0\r\n 11\r\n532879.4626838282\r\n 21\r\n184517.2534390039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532949.1337332375\r\n 20\r\n184531.3212607857\r\n 30\r\n0.0\r\n 11\r\n532873.8403480914\r\n 21\r\n184512.9638657713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532962.7457486525\r\n 20\r\n183975.8869687485\r\n 30\r\n0.0\r\n 11\r\n532917.3537715828\r\n 21\r\n184079.0574052173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532635.2106572713\r\n 20\r\n184438.4366176368\r\n 30\r\n0.0\r\n 11\r\n532065.2785999623\r\n 21\r\n184514.0689499459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532590.2300880724\r\n 20\r\n184386.4198395649\r\n 30\r\n0.0\r\n 11\r\n532364.6295972854\r\n 21\r\n184414.239316967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532652.7847925186\r\n 20\r\n184210.3495376971\r\n 30\r\n0.0\r\n 11\r\n532489.8745094784\r\n 21\r\n184162.4628243181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532763.5654245859\r\n 20\r\n183767.8992291204\r\n 30\r\n0.0\r\n 11\r\n532542.4660997646\r\n 21\r\n184490.3856919131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532543.1334552761\r\n 20\r\n184254.2287175145\r\n 30\r\n0.0\r\n 11\r\n532030.3823403245\r\n 21\r\n184165.1226977185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532526.7823938887\r\n 20\r\n184321.7732940453\r\n 30\r\n0.0\r\n 11\r\n532565.4542369875\r\n 21\r\n184131.7364379803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532455.8560125364\r\n 20\r\n184306.2218749684\r\n 30\r\n0.0\r\n 11\r\n532469.1992844791\r\n 21\r\n184243.3123939978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532500.404604757\r\n 20\r\n184337.4098207074\r\n 30\r\n0.0\r\n 11\r\n532448.5924934925\r\n 21\r\n184292.102419002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532467.9222000074\r\n 20\r\n184298.7677181402\r\n 30\r\n0.0\r\n 11\r\n532151.5594281791\r\n 21\r\n184344.7377033163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532546.3727587354\r\n 20\r\n184062.6106464354\r\n 30\r\n0.0\r\n 11\r\n532126.1632264118\r\n 21\r\n184073.4140238009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n307\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532584.4903761105\r\n 20\r\n183864.2182182287\r\n 30\r\n0.0\r\n 11\r\n532532.7635513458\r\n 21\r\n183974.0899667647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n308\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532631.8950520743\r\n 20\r\n183998.5224476362\r\n 30\r\n0.0\r\n 11\r\n532632.3872072136\r\n 21\r\n183877.743770919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n309\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532634.6940095361\r\n 20\r\n183884.0725369571\r\n 30\r\n0.0\r\n 11\r\n532582.3553185839\r\n 21\r\n183864.6230556592\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532934.2473785581\r\n 20\r\n184040.6907525797\r\n 30\r\n0.0\r\n 11\r\n532934.235328054\r\n 21\r\n184040.6876830364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532792.4137581562\r\n 20\r\n184004.5624334069\r\n 30\r\n0.0\r\n 11\r\n532167.9345982127\r\n 21\r\n183901.8182242516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n310\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532368.508547977\r\n 20\r\n184092.6775787239\r\n 30\r\n0.0\r\n 11\r\n532506.9565822644\r\n 21\r\n183612.623907776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n311\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532594.1521268948\r\n 20\r\n183661.7019549843\r\n 30\r\n0.0\r\n 11\r\n532478.1241977714\r\n 21\r\n183964.5209857737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n312\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532590.2102493452\r\n 20\r\n183956.0377104505\r\n 30\r\n0.0\r\n 11\r\n532598.6767912577\r\n 21\r\n183921.5368206355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n317\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532306.0587504182\r\n 20\r\n184266.992331815\r\n 30\r\n0.0\r\n 11\r\n532414.2191715132\r\n 21\r\n184122.5293847503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n318\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532477.551415465\r\n 20\r\n184130.3624860479\r\n 30\r\n0.0\r\n 11\r\n532412.6306058845\r\n 21\r\n184123.5738093414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n319\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532661.721044324\r\n 20\r\n184125.7436229359\r\n 30\r\n0.0\r\n 11\r\n532439.6824280089\r\n 21\r\n184049.5153294456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532847.7714891928\r\n 20\r\n183350.8987513204\r\n 30\r\n0.0\r\n 11\r\n532995.8222172223\r\n 21\r\n183426.7421009539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532774.0262611856\r\n 20\r\n183284.1426261447\r\n 30\r\n0.0\r\n 11\r\n532909.8188335092\r\n 21\r\n183159.1966094306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532709.4902750977\r\n 20\r\n183812.8863756505\r\n 30\r\n0.0\r\n 11\r\n532835.4314276548\r\n 21\r\n183979.9680373762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532463.9437321764\r\n 20\r\n184141.8423292799\r\n 30\r\n0.0\r\n 11\r\n532481.318514892\r\n 21\r\n184025.9617418272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n320\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533323.0645174747\r\n 20\r\n183697.3915731477\r\n 30\r\n0.0\r\n 11\r\n533469.8168568623\r\n 21\r\n183830.5378952181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n322\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529846.7918439317\r\n 20\r\n185094.6275250928\r\n 30\r\n0.0\r\n 11\r\n532736.3514167985\r\n 21\r\n185388.7767557458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n323\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530632.5473901829\r\n 20\r\n185377.7313809267\r\n 30\r\n0.0\r\n 11\r\n530347.847156352\r\n 21\r\n185292.772304566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n324\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530537.8475188888\r\n 20\r\n185421.3935488612\r\n 30\r\n0.0\r\n 11\r\n530918.4513398055\r\n 21\r\n185724.2180642567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n325\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530524.4682282156\r\n 20\r\n184838.4117535552\r\n 30\r\n0.0\r\n 11\r\n530539.0027126899\r\n 21\r\n185369.0524173398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n326\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530335.1690853607\r\n 20\r\n184982.8667579243\r\n 30\r\n0.0\r\n 11\r\n530559.2802786548\r\n 21\r\n185043.4543895813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n327\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530707.0247008471\r\n 20\r\n184994.505863614\r\n 30\r\n0.0\r\n 11\r\n530707.477024887\r\n 21\r\n185313.5574728215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n332\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531131.4314460383\r\n 20\r\n185132.7716499767\r\n 30\r\n0.0\r\n 11\r\n531131.4314460383\r\n 21\r\n185359.3560314326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n333\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530501.6760625543\r\n 20\r\n185036.5091148205\r\n 30\r\n0.0\r\n 11\r\n530743.4035747344\r\n 21\r\n185005.6828851596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n334\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530485.4823504736\r\n 20\r\n185236.4996961124\r\n 30\r\n0.0\r\n 11\r\n530775.1816292018\r\n 21\r\n185251.6757933341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n335\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532544.9929155681\r\n 20\r\n185376.4324141973\r\n 30\r\n0.0\r\n 11\r\n536042.6124124007\r\n 21\r\n185481.9872221566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n358\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532320.5649707108\r\n 20\r\n184501.5680036159\r\n 30\r\n0.0\r\n 11\r\n532310.185466446\r\n 21\r\n184245.5571047196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n366\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532121.1286102474\r\n 20\r\n185156.5429902478\r\n 30\r\n0.0\r\n 11\r\n532552.7822942475\r\n 21\r\n185237.5298082478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n367\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532107.1836522989\r\n 20\r\n185396.4993852853\r\n 30\r\n0.0\r\n 11\r\n532132.2182172474\r\n 21\r\n185032.5284892478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n368\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532191.4177562475\r\n 20\r\n185229.8919942478\r\n 30\r\n0.0\r\n 11\r\n532195.3011802475\r\n 21\r\n185165.7003692478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532227.5888392475\r\n 20\r\n185421.3871792478\r\n 30\r\n0.0\r\n 11\r\n532353.3590012474\r\n 21\r\n185033.9680772478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532340.0762082474\r\n 20\r\n185033.0383432478\r\n 30\r\n0.0\r\n 11\r\n532571.1852702475\r\n 21\r\n185093.2411102478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532292.1971382474\r\n 20\r\n184848.6111342478\r\n 30\r\n0.0\r\n 11\r\n532351.5203522474\r\n 21\r\n185047.0743252478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532229.8727212474\r\n 20\r\n184909.5836812478\r\n 30\r\n0.0\r\n 11\r\n532315.1596332476\r\n 21\r\n184905.4048772478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532325.041593953\r\n 20\r\n185475.0242132333\r\n 30\r\n0.0\r\n 11\r\n532348.3174009531\r\n 21\r\n185387.9591352333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n370\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532458.4917752475\r\n 20\r\n185549.4005362478\r\n 30\r\n0.0\r\n 11\r\n532569.7094042475\r\n 21\r\n185090.5118912478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n371\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532152.3691472474\r\n 20\r\n185079.7349762478\r\n 30\r\n0.0\r\n 11\r\n532567.5409532475\r\n 21\r\n185166.1502402478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n372\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532505.0021652475\r\n 20\r\n184692.3458652478\r\n 30\r\n0.0\r\n 11\r\n532564.1192532476\r\n 21\r\n185172.2285002478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n373\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532493.2797917234\r\n 20\r\n184439.2739090913\r\n 30\r\n0.0\r\n 11\r\n532535.4841562475\r\n 21\r\n184977.0343742478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n374\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532413.0449982474\r\n 20\r\n184681.5489552478\r\n 30\r\n0.0\r\n 11\r\n532522.1683822475\r\n 21\r\n184724.9265392478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n375\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532420.3088972474\r\n 20\r\n184743.2113052478\r\n 30\r\n0.0\r\n 11\r\n532517.3285312475\r\n 21\r\n184691.7060482478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n376\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532429.9143932474\r\n 20\r\n184932.9769852478\r\n 30\r\n0.0\r\n 11\r\n532437.8461422474\r\n 21\r\n184731.1247652478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n377\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532009.6784914184\r\n 20\r\n184830.2079244615\r\n 30\r\n0.0\r\n 11\r\n532529.2096642474\r\n 21\r\n184878.8524782478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532372.7184052475\r\n 20\r\n184867.0858462478\r\n 30\r\n0.0\r\n 11\r\n532373.0152272474\r\n 21\r\n184842.8027972478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532504.0457382474\r\n 20\r\n185004.5864872478\r\n 30\r\n0.0\r\n 11\r\n532549.2121822474\r\n 21\r\n185000.8275632478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532491.7523522475\r\n 20\r\n185014.0837682478\r\n 30\r\n0.0\r\n 11\r\n532511.9032812475\r\n 21\r\n185000.9275342478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532485.9230932474\r\n 20\r\n185077.9154972478\r\n 30\r\n0.0\r\n 11\r\n532494.5226922474\r\n 21\r\n185006.5859152478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n380\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532302.5529352474\r\n 20\r\n184898.1469552478\r\n 30\r\n0.0\r\n 11\r\n532338.5096462474\r\n 21\r\n184465.2908592478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n381\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532317.2044082475\r\n 20\r\n184488.8441172478\r\n 30\r\n0.0\r\n 11\r\n532511.6971542474\r\n 21\r\n184540.6792792478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n383\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532213.2094522475\r\n 20\r\n184469.8995392478\r\n 30\r\n0.0\r\n 11\r\n532283.6140292475\r\n 21\r\n184859.3980472478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n385\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532308.5965642474\r\n 20\r\n184714.1896122478\r\n 30\r\n0.0\r\n 11\r\n532401.7657552475\r\n 21\r\n184708.5912152478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n386\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532366.6747752475\r\n 20\r\n184706.5517982478\r\n 30\r\n0.0\r\n 11\r\n532438.8355502475\r\n 21\r\n184748.3298402478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n387\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532364.2342372475\r\n 20\r\n184719.4481072478\r\n 30\r\n0.0\r\n 11\r\n532433.9709632473\r\n 21\r\n184679.9394162478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n388\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532419.8636642474\r\n 20\r\n184513.3471032478\r\n 30\r\n0.0\r\n 11\r\n532429.1970732474\r\n 21\r\n184691.6260712478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532265.0461522474\r\n 20\r\n185108.3267922478\r\n 30\r\n0.0\r\n 11\r\n532280.4479262474\r\n 21\r\n185063.9095062478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532217.3154932475\r\n 20\r\n185054.6021702478\r\n 30\r\n0.0\r\n 11\r\n532281.7011752476\r\n 21\r\n185065.3390972478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532186.1409172473\r\n 20\r\n185093.1211442478\r\n 30\r\n0.0\r\n 11\r\n532191.5661672473\r\n 21\r\n184988.9409652478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532041.0195962473\r\n 20\r\n185001.1274772478\r\n 30\r\n0.0\r\n 11\r\n532339.0538202476\r\n 21\r\n184982.8427112478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532407.4136222474\r\n 20\r\n185053.8123962478\r\n 30\r\n0.0\r\n 11\r\n532420.6469452474\r\n 21\r\n184986.2517352478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n390\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532389.2250172473\r\n 20\r\n184981.0932122478\r\n 30\r\n0.0\r\n 11\r\n532448.2431642476\r\n 21\r\n184992.4699552478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n391\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532393.1908912475\r\n 20\r\n184988.7310262478\r\n 30\r\n0.0\r\n 11\r\n532405.9130212474\r\n 21\r\n184918.5411172478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n392\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532402.7056922474\r\n 20\r\n184920.4205792478\r\n 30\r\n0.0\r\n 11\r\n532458.0795222474\r\n 21\r\n184929.6579352478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n393\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532441.8532422473\r\n 20\r\n184998.8581272478\r\n 30\r\n0.0\r\n 11\r\n532456.5212062474\r\n 21\r\n184922.7599102478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n396\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532481.8907751978\r\n 20\r\n185659.2708376926\r\n 30\r\n0.0\r\n 11\r\n533213.4750461979\r\n 21\r\n185960.1946986926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n397\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532608.229846198\r\n 20\r\n185714.4250496926\r\n 30\r\n0.0\r\n 11\r\n532641.5976081978\r\n 21\r\n185570.3962776926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n398\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532494.571678198\r\n 20\r\n185595.3291406926\r\n 30\r\n0.0\r\n 11\r\n532951.4964751979\r\n 21\r\n185784.2850526926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n399\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532625.5362291979\r\n 20\r\n185598.8181416926\r\n 30\r\n0.0\r\n 11\r\n532683.5732141979\r\n 21\r\n185540.9147166926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532574.6806921979\r\n 20\r\n185537.4257156926\r\n 30\r\n0.0\r\n 11\r\n532637.5657731979\r\n 21\r\n185598.7681566926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532379.7822005875\r\n 20\r\n185516.783209897\r\n 30\r\n0.0\r\n 11\r\n532897.7881471978\r\n 21\r\n185508.2540656925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532630.1287281979\r\n 20\r\n185133.8312426926\r\n 30\r\n0.0\r\n 11\r\n532743.2262311979\r\n 21\r\n185136.4304986926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532738.9965151979\r\n 20\r\n185055.0737866926\r\n 30\r\n0.0\r\n 11\r\n532759.8070491979\r\n 21\r\n185810.3475926926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532822.0242801978\r\n 20\r\n185582.5328036926\r\n 30\r\n0.0\r\n 11\r\n533308.048428696\r\n 21\r\n185701.9470633644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532819.8063591979\r\n 20\r\n185651.9929206926\r\n 30\r\n0.0\r\n 11\r\n532833.1138871978\r\n 21\r\n185458.5183026926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532892.3134261978\r\n 20\r\n185655.8818076926\r\n 30\r\n0.0\r\n 11\r\n532896.1968501978\r\n 21\r\n185591.6901826926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532841.0703711978\r\n 20\r\n185674.0865966926\r\n 30\r\n0.0\r\n 11\r\n532903.0732311979\r\n 21\r\n185644.2051496926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532882.6667051979\r\n 20\r\n185645.4847836926\r\n 30\r\n0.0\r\n 11\r\n533018.964367091\r\n 21\r\n185679.8975924009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532928.4845091979\r\n 20\r\n185847.3769926925\r\n 30\r\n0.0\r\n 11\r\n533171.7912461943\r\n 21\r\n185088.6905515849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533040.9718781979\r\n 20\r\n185459.0281566926\r\n 30\r\n0.0\r\n 11\r\n533342.0861666041\r\n 21\r\n185539.2294065369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533040.8696871645\r\n 20\r\n185902.6867872737\r\n 30\r\n0.0\r\n 11\r\n533064.1454941645\r\n 21\r\n185815.6217092737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532853.2648171979\r\n 20\r\n185505.7247896926\r\n 30\r\n0.0\r\n 11\r\n533314.949234796\r\n 21\r\n185601.8213459973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532896.5843681978\r\n 20\r\n185272.3815836926\r\n 30\r\n0.0\r\n 11\r\n533323.6153840747\r\n 21\r\n185304.8422916926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532501.8603121979\r\n 20\r\n185272.5915236926\r\n 30\r\n0.0\r\n 11\r\n533064.3466261978\r\n 21\r\n185283.8483006926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533003.4486051978\r\n 20\r\n185324.1367686926\r\n 30\r\n0.0\r\n 11\r\n533056.9763947938\r\n 21\r\n184798.3148205676\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532730.9905601978\r\n 20\r\n185073.2185936926\r\n 30\r\n0.0\r\n 11\r\n532910.2405847092\r\n 21\r\n184975.7707765721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532887.8337612262\r\n 20\r\n184954.2005379262\r\n 30\r\n0.0\r\n 11\r\n532984.509699198\r\n 21\r\n185285.3878606926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533009.4922341978\r\n 20\r\n185140.1794256926\r\n 30\r\n0.0\r\n 11\r\n533223.8406176101\r\n 21\r\n185128.4247817856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533120.7593341979\r\n 20\r\n184991.9777295595\r\n 30\r\n0.0\r\n 11\r\n533164.6698493871\r\n 21\r\n185152.1929908819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532535.0805407667\r\n 20\r\n185099.0554407228\r\n 30\r\n0.0\r\n 11\r\n532800.0759271978\r\n 21\r\n185049.7952976926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532965.9418221979\r\n 20\r\n185534.3166056926\r\n 30\r\n0.0\r\n 11\r\n532981.3435961978\r\n 21\r\n185489.8993196926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532918.2111631979\r\n 20\r\n185480.5919836926\r\n 30\r\n0.0\r\n 11\r\n532982.596845198\r\n 21\r\n185491.3289106925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532887.0365871978\r\n 20\r\n185519.1109576926\r\n 30\r\n0.0\r\n 11\r\n532892.4618371978\r\n 21\r\n185414.9307786926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532632.1075431978\r\n 20\r\n185205.9006136926\r\n 30\r\n0.0\r\n 11\r\n532744.8092831978\r\n 21\r\n185207.6001266926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532964.0619481979\r\n 20\r\n185729.5307256926\r\n 30\r\n0.0\r\n 11\r\n533287.3999608604\r\n 21\r\n185848.0166997513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533160.4851943644\r\n 20\r\n185038.2038243795\r\n 30\r\n0.0\r\n 11\r\n533312.3771077996\r\n 21\r\n184720.5496568575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532525.9687370664\r\n 20\r\n184938.1950755283\r\n 30\r\n0.0\r\n 11\r\n533310.1590899808\r\n 21\r\n185042.7807927709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532783.2026042486\r\n 20\r\n184722.3529153568\r\n 30\r\n0.0\r\n 11\r\n533016.3547312031\r\n 21\r\n184679.6358716281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532833.4575456594\r\n 20\r\n184793.6019525844\r\n 30\r\n0.0\r\n 11\r\n532842.931078161\r\n 21\r\n184708.7398765826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532637.5467937776\r\n 20\r\n184576.4133326699\r\n 30\r\n0.0\r\n 11\r\n532697.7689800461\r\n 21\r\n184475.6025395458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532699.5784686391\r\n 20\r\n184579.0743381345\r\n 30\r\n0.0\r\n 11\r\n532664.2017968141\r\n 21\r\n184475.0835117567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532790.6590954802\r\n 20\r\n184784.0174906387\r\n 30\r\n0.0\r\n 11\r\n532807.618670413\r\n 21\r\n184536.4242881813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532688.1167109437\r\n 20\r\n184815.5033675087\r\n 30\r\n0.0\r\n 11\r\n532809.5492248077\r\n 21\r\n184814.234469069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532790.4765161498\r\n 20\r\n184914.5351786511\r\n 30\r\n0.0\r\n 11\r\n532680.4657737823\r\n 21\r\n184864.6817180896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.2588451061\r\n 20\r\n184869.4146964122\r\n 30\r\n0.0\r\n 11\r\n532689.3739594284\r\n 21\r\n184813.7308861308\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532702.8925823753\r\n 20\r\n185206.9803013947\r\n 30\r\n0.0\r\n 11\r\n532702.8948103981\r\n 21\r\n185206.968067317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532729.11626022\r\n 20\r\n185062.9860305268\r\n 30\r\n0.0\r\n 11\r\n532803.6929663337\r\n 21\r\n184653.4851785078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532833.7558926337\r\n 20\r\n184720.028022434\r\n 30\r\n0.0\r\n 11\r\n532491.6707096186\r\n 21\r\n184640.2317074956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532499.9754730116\r\n 20\r\n184739.9450397345\r\n 30\r\n0.0\r\n 11\r\n532792.482947854\r\n 21\r\n184732.5461716932\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532769.2121150372\r\n 20\r\n184858.9438041617\r\n 30\r\n0.0\r\n 11\r\n532734.3196016032\r\n 21\r\n184852.2725047208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532653.1157034118\r\n 20\r\n184684.7299837778\r\n 30\r\n0.0\r\n 11\r\n532662.4446227496\r\n 21\r\n184591.8601207191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532654.8360919118\r\n 20\r\n184626.1769731031\r\n 30\r\n0.0\r\n 11\r\n532707.5855661702\r\n 21\r\n184561.6008536206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532667.1782684115\r\n 20\r\n184630.6425851331\r\n 30\r\n0.0\r\n 11\r\n532639.2944614704\r\n 21\r\n184555.4984507766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532472.5841021194\r\n 20\r\n184542.862362741\r\n 30\r\n0.0\r\n 11\r\n532650.0704104144\r\n 21\r\n184562.0746848949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532893.7177966846\r\n 20\r\n184994.6354611215\r\n 30\r\n0.0\r\n 11\r\n532923.1880844782\r\n 21\r\n184697.4987358915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531861.8278255367\r\n 20\r\n185191.7735766143\r\n 30\r\n0.0\r\n 11\r\n531538.5384386285\r\n 21\r\n185607.8478836246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531733.7040754842\r\n 20\r\n185347.6380927605\r\n 30\r\n0.0\r\n 11\r\n532464.1482035561\r\n 21\r\n185651.3189967688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531862.0971573802\r\n 20\r\n185397.8253868076\r\n 30\r\n0.0\r\n 11\r\n531783.9926877962\r\n 21\r\n185523.3538160008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531697.5197138976\r\n 20\r\n185401.8602090297\r\n 30\r\n0.0\r\n 11\r\n532154.4445108975\r\n 21\r\n185590.8161210297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n400\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531792.6965981642\r\n 20\r\n185491.8893567981\r\n 30\r\n0.0\r\n 11\r\n531792.885563927\r\n 21\r\n185573.87144354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n401\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531713.3339456926\r\n 20\r\n185499.4315717521\r\n 30\r\n0.0\r\n 11\r\n531801.1772682144\r\n 21\r\n185500.4211012181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n402\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531730.3606550528\r\n 20\r\n185490.9574299569\r\n 30\r\n0.0\r\n 11\r\n531610.7000381212\r\n 21\r\n185649.8145655847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n403\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531620.0352627024\r\n 20\r\n185437.4863894554\r\n 30\r\n0.0\r\n 11\r\n531921.4650168662\r\n 21\r\n185748.2907083182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n404\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531650.9979007346\r\n 20\r\n185688.8051328634\r\n 30\r\n0.0\r\n 11\r\n531795.0736114228\r\n 21\r\n185570.1374104197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n405\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531609.7161111208\r\n 20\r\n185644.4268986138\r\n 30\r\n0.0\r\n 11\r\n531651.8451968421\r\n 21\r\n185688.8314120956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n406\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531419.6038351391\r\n 20\r\n185873.1395474812\r\n 30\r\n0.0\r\n 11\r\n531638.8567267734\r\n 21\r\n185672.4553785438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n407\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531467.5316540079\r\n 20\r\n185824.3072660336\r\n 30\r\n0.0\r\n 11\r\n531549.4316502019\r\n 21\r\n185902.346947863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n408\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531488.9758274058\r\n 20\r\n185956.9537109508\r\n 30\r\n0.0\r\n 11\r\n532119.1862890298\r\n 21\r\n185356.9691234335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n409\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531920.2925450763\r\n 20\r\n185642.1958461826\r\n 30\r\n0.0\r\n 11\r\n532283.0697733463\r\n 21\r\n185889.7366514033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531967.7814881132\r\n 20\r\n185591.4570314894\r\n 30\r\n0.0\r\n 11\r\n531840.5527883868\r\n 21\r\n185737.8208797502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532021.8574928066\r\n 20\r\n185639.9150950438\r\n 30\r\n0.0\r\n 11\r\n531979.268683928\r\n 21\r\n185688.1005602838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531998.4393065221\r\n 20\r\n185590.8350219038\r\n 30\r\n0.0\r\n 11\r\n532021.2274724078\r\n 21\r\n185655.7808071295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532007.6850459294\r\n 20\r\n185640.4619804239\r\n 30\r\n0.0\r\n 11\r\n532354.1763415755\r\n 21\r\n185846.7163859356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532182.715114118\r\n 20\r\n185529.8988290208\r\n 30\r\n0.0\r\n 11\r\n531998.1198935781\r\n 21\r\n185892.9915152565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531988.0600547571\r\n 20\r\n185884.2681765558\r\n 30\r\n0.0\r\n 11\r\n532194.1878251483\r\n 21\r\n186004.8795937868\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n410\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531823.9061445957\r\n 20\r\n185981.011623581\r\n 30\r\n0.0\r\n 11\r\n532006.0750995708\r\n 21\r\n185882.4146979472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n411\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531822.8497064442\r\n 20\r\n185893.8286643487\r\n 30\r\n0.0\r\n 11\r\n531880.2747016837\r\n 21\r\n185957.0243104261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n412\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532356.2144154167\r\n 20\r\n185600.3187829731\r\n 30\r\n0.0\r\n 11\r\n532311.1985787343\r\n 21\r\n185678.3935256651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n413\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532436.5909745613\r\n 20\r\n185602.3600801\r\n 30\r\n0.0\r\n 11\r\n532191.2154048476\r\n 21\r\n186005.769275952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n414\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531888.1595850235\r\n 20\r\n185718.6348090544\r\n 30\r\n0.0\r\n 11\r\n532243.1029985761\r\n 21\r\n185950.691697608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n415\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531983.707795175\r\n 20\r\n186179.1651187459\r\n 30\r\n0.0\r\n 11\r\n532196.6318225811\r\n 21\r\n185988.747421823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n416\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531651.9676286941\r\n 20\r\n186274.3789995667\r\n 30\r\n0.0\r\n 11\r\n531834.7205437863\r\n 21\r\n186117.8592350517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n417\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531474.7328130902\r\n 20\r\n185635.481035244\r\n 30\r\n0.0\r\n 11\r\n531880.879583697\r\n 21\r\n186024.7911548033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n419\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532084.0423358651\r\n 20\r\n186020.2200672802\r\n 30\r\n0.0\r\n 11\r\n532125.4763841526\r\n 21\r\n186066.8963861565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532082.0474267376\r\n 20\r\n186004.8140287462\r\n 30\r\n0.0\r\n 11\r\n532087.0205745952\r\n 21\r\n186028.360031231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532123.0045456797\r\n 20\r\n185955.5090158614\r\n 30\r\n0.0\r\n 11\r\n532078.7129439776\r\n 21\r\n186012.0785870981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531418.7788685433\r\n 20\r\n186104.3451573058\r\n 30\r\n0.0\r\n 11\r\n531495.3612063181\r\n 21\r\n186318.6540757437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531496.1237532815\r\n 20\r\n185938.45407603\r\n 30\r\n0.0\r\n 11\r\n531405.175342562\r\n 21\r\n186133.5223115784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531988.1202134396\r\n 20\r\n185777.976802319\r\n 30\r\n0.0\r\n 11\r\n531967.6519314506\r\n 21\r\n185820.2988931271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n420\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531916.3854307389\r\n 20\r\n185782.2978865\r\n 30\r\n0.0\r\n 11\r\n531969.5488407774\r\n 21\r\n185820.1720133031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n421\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531921.5218807102\r\n 20\r\n185733.0111496584\r\n 30\r\n0.0\r\n 11\r\n531851.7810069742\r\n 21\r\n185810.5943537981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n422\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531753.8130619647\r\n 20\r\n185695.637566851\r\n 30\r\n0.0\r\n 11\r\n531951.8835598481\r\n 21\r\n185919.0806450864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n423\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532050.4021916367\r\n 20\r\n185917.1215869044\r\n 30\r\n0.0\r\n 11\r\n532012.0528583068\r\n 21\r\n185974.2958152379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n424\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531986.1651783409\r\n 20\r\n185955.7546193549\r\n 30\r\n0.0\r\n 11\r\n532035.9806907252\r\n 21\r\n185989.3847647976\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n425\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531994.3672256759\r\n 20\r\n185953.1487070773\r\n 30\r\n0.0\r\n 11\r\n531953.7989935165\r\n 21\r\n186011.8231858276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n426\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531952.8559031887\r\n 20\r\n186008.2273663998\r\n 30\r\n0.0\r\n 11\r\n531998.5804950235\r\n 21\r\n186040.7980817171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n427\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532035.9690354825\r\n 20\r\n185980.3492953121\r\n 30\r\n0.0\r\n 11\r\n531992.6053163253\r\n 21\r\n186044.5807179909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n428\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532589.7485624646\r\n 20\r\n185685.3582884609\r\n 30\r\n0.0\r\n 11\r\n532589.9375282275\r\n 21\r\n185767.3403752028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n429\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532510.3859099931\r\n 20\r\n185692.900503415\r\n 30\r\n0.0\r\n 11\r\n532598.2292325149\r\n 21\r\n185693.8900328809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532526.4656307082\r\n 20\r\n185685.9832563354\r\n 30\r\n0.0\r\n 11\r\n532406.8050137765\r\n 21\r\n185844.8403919632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532357.8334418678\r\n 20\r\n185569.8587237367\r\n 30\r\n0.0\r\n 11\r\n532718.5169811667\r\n 21\r\n185941.7596399811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532448.049865035\r\n 20\r\n185882.2740645263\r\n 30\r\n0.0\r\n 11\r\n532592.1255757233\r\n 21\r\n185763.6063420826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532406.7680754211\r\n 20\r\n185837.8958302767\r\n 30\r\n0.0\r\n 11\r\n532448.8971611424\r\n 21\r\n185882.3003437585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532216.6557994395\r\n 20\r\n186066.608479144\r\n 30\r\n0.0\r\n 11\r\n532435.9086910738\r\n 21\r\n185865.9243102067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532360.5330683786\r\n 20\r\n186075.9173659413\r\n 30\r\n0.0\r\n 11\r\n532834.2031285817\r\n 21\r\n185630.4462966165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n430\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532717.3445093768\r\n 20\r\n185835.6647778455\r\n 30\r\n0.0\r\n 11\r\n532936.5865712611\r\n 21\r\n185985.2644558515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n431\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532764.8334524136\r\n 20\r\n185784.9259631524\r\n 30\r\n0.0\r\n 11\r\n532637.6047526871\r\n 21\r\n185931.289811413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n432\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532818.909457107\r\n 20\r\n185833.3840267067\r\n 30\r\n0.0\r\n 11\r\n532776.3206482284\r\n 21\r\n185881.5694919468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n433\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532795.4912708226\r\n 20\r\n185784.3039535667\r\n 30\r\n0.0\r\n 11\r\n532818.2794367084\r\n 21\r\n185849.2497387923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n434\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532804.7370102297\r\n 20\r\n185833.9309120868\r\n 30\r\n0.0\r\n 11\r\n533151.2283058758\r\n 21\r\n186040.1853175985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n435\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532929.8009410545\r\n 20\r\n185821.4028240506\r\n 30\r\n0.0\r\n 11\r\n532795.1718578784\r\n 21\r\n186086.4604469193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n436\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532785.1120190575\r\n 20\r\n186077.7371082186\r\n 30\r\n0.0\r\n 11\r\n532991.2397894489\r\n 21\r\n186198.3485254497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n437\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532620.9581088962\r\n 20\r\n186174.4805552439\r\n 30\r\n0.0\r\n 11\r\n532803.1270638713\r\n 21\r\n186075.88362961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n438\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532487.8955622168\r\n 20\r\n185923.2211543541\r\n 30\r\n0.0\r\n 11\r\n532677.3266659841\r\n 21\r\n186150.4932420889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n439\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.2115493238\r\n 20\r\n185912.1037407173\r\n 30\r\n0.0\r\n 11\r\n533069.5807117685\r\n 21\r\n186166.970324897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532596.3237212511\r\n 20\r\n186341.3319926437\r\n 30\r\n0.0\r\n 11\r\n532783.9267616241\r\n 21\r\n186029.3305871086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532563.3363404315\r\n 20\r\n186239.6670789878\r\n 30\r\n0.0\r\n 11\r\n532671.2243390242\r\n 21\r\n186286.0320171303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532612.0301757858\r\n 20\r\n186201.1453963313\r\n 30\r\n0.0\r\n 11\r\n532644.3347693412\r\n 21\r\n186306.1311768702\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532271.7847773906\r\n 20\r\n185828.9499669069\r\n 30\r\n0.0\r\n 11\r\n532505.4397367133\r\n 21\r\n186045.7682751822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532456.1709398957\r\n 20\r\n185958.2385074901\r\n 30\r\n0.0\r\n 11\r\n532414.07966705\r\n 21\r\n186283.737681027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532406.7909252194\r\n 20\r\n186170.6980676144\r\n 30\r\n0.0\r\n 11\r\n532571.9985347014\r\n 21\r\n186193.8794666497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n440\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532548.1691416875\r\n 20\r\n186189.2161541062\r\n 30\r\n0.0\r\n 11\r\n532628.7607689065\r\n 21\r\n186210.607083589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n441\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532555.5499794265\r\n 20\r\n186178.3628483507\r\n 30\r\n0.0\r\n 11\r\n532577.0134800563\r\n 21\r\n186255.5863276716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n442\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532486.5436966105\r\n 20\r\n186326.2911970296\r\n 30\r\n0.0\r\n 11\r\n532581.8881197563\r\n 21\r\n186243.9413365331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n443\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532172.7351168023\r\n 20\r\n185975.263057285\r\n 30\r\n0.0\r\n 11\r\n532257.3461442857\r\n 21\r\n186098.2095402245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n444\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532785.17217774\r\n 20\r\n185971.4457339819\r\n 30\r\n0.0\r\n 11\r\n532764.7038957511\r\n 21\r\n186013.76782479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n445\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532713.4373950393\r\n 20\r\n185975.7668181629\r\n 30\r\n0.0\r\n 11\r\n532766.6008050778\r\n 21\r\n186013.640944966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n446\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532718.5738450106\r\n 20\r\n185926.4800813213\r\n 30\r\n0.0\r\n 11\r\n532648.8329712746\r\n 21\r\n186004.063285461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n447\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532550.8650262651\r\n 20\r\n185889.1064985139\r\n 30\r\n0.0\r\n 11\r\n532748.9355241485\r\n 21\r\n186112.5495767493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n448\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532847.4541559371\r\n 20\r\n186110.5905185672\r\n 30\r\n0.0\r\n 11\r\n532809.1048226073\r\n 21\r\n186167.7647469007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n449\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532783.2171426415\r\n 20\r\n186149.2235510178\r\n 30\r\n0.0\r\n 11\r\n532833.0326550258\r\n 21\r\n186182.8536964605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532316.8864140805\r\n 20\r\n185968.1543527131\r\n 30\r\n0.0\r\n 11\r\n532397.8707606938\r\n 21\r\n186046.5514581896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532611.7161158065\r\n 20\r\n186297.5090828903\r\n 30\r\n0.0\r\n 11\r\n532484.7066932243\r\n 21\r\n186858.233084708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532547.3155668865\r\n 20\r\n186321.6247646187\r\n 30\r\n0.0\r\n 11\r\n532495.053707063\r\n 21\r\n186542.8445710875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532403.9294344441\r\n 20\r\n186201.8155025754\r\n 30\r\n0.0\r\n 11\r\n532302.4455707475\r\n 21\r\n186337.9548541522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532279.8671234338\r\n 20\r\n186136.1577846746\r\n 30\r\n0.0\r\n 11\r\n533301.9646360159\r\n 21\r\n186916.6816373291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532406.9961318524\r\n 20\r\n186319.8807114539\r\n 30\r\n0.0\r\n 11\r\n532220.4666046975\r\n 21\r\n186717.4866760719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n450\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532464.6578491668\r\n 20\r\n186358.671862295\r\n 30\r\n0.0\r\n 11\r\n532299.8801138759\r\n 21\r\n186256.40839832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n451\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532425.4420865872\r\n 20\r\n186419.7825992595\r\n 30\r\n0.0\r\n 11\r\n532371.082371042\r\n 21\r\n186385.4217635892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n452\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532470.1602454009\r\n 20\r\n186388.8382734374\r\n 30\r\n0.0\r\n 11\r\n532409.6789007655\r\n 21\r\n186421.6904038722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n453\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532422.6424219159\r\n 20\r\n186405.8786713312\r\n 30\r\n0.0\r\n 11\r\n532274.2743179815\r\n 21\r\n186780.8240053286\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n454\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532559.6993444154\r\n 20\r\n186561.0403135408\r\n 30\r\n0.0\r\n 11\r\n532171.8185395161\r\n 21\r\n186436.7013597309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n455\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532178.8262472758\r\n 20\r\n186425.3793004152\r\n 30\r\n0.0\r\n 11\r\n532092.6246762097\r\n 21\r\n186648.1012365569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n456\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532057.1464107401\r\n 20\r\n186278.7511375533\r\n 30\r\n0.0\r\n 11\r\n532183.5284855804\r\n 21\r\n186442.8683306205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n457\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532143.045524667\r\n 20\r\n186263.8070193578\r\n 30\r\n0.0\r\n 11\r\n532089.8147203099\r\n 21\r\n186330.5737867565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n458\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532517.844537266\r\n 20\r\n186743.5482656535\r\n 30\r\n0.0\r\n 11\r\n532433.5909544371\r\n 21\r\n186711.5572547416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n459\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532528.6452812824\r\n 20\r\n186823.2219883138\r\n 30\r\n0.0\r\n 11\r\n532091.2724283363\r\n 21\r\n186645.3087032108\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532326.4115569843\r\n 20\r\n186300.3469340414\r\n 30\r\n0.0\r\n 11\r\n532153.9187586503\r\n 21\r\n186687.7504199219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531805.9814634882\r\n 20\r\n186360.1205610736\r\n 30\r\n0.0\r\n 11\r\n532160.8507210284\r\n 21\r\n186688.5257734576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531638.584156153\r\n 20\r\n186248.3972793169\r\n 30\r\n0.0\r\n 11\r\n532019.1879770698\r\n 21\r\n186551.2217947124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531850.9576992834\r\n 20\r\n186279.1895284476\r\n 30\r\n0.0\r\n 11\r\n531822.388527218\r\n 21\r\n186393.0900558247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531896.7507059305\r\n 20\r\n186321.1181604121\r\n 30\r\n0.0\r\n 11\r\n531798.2590085679\r\n 21\r\n186369.7492865638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532045.128842458\r\n 20\r\n186439.807702748\r\n 30\r\n0.0\r\n 11\r\n531876.6943226217\r\n 21\r\n186328.2862075614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n460\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532093.9829120121\r\n 20\r\n186228.3962886964\r\n 30\r\n0.0\r\n 11\r\n531943.1818398332\r\n 21\r\n186488.7548350109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n461\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532011.4998620817\r\n 20\r\n186166.3447629878\r\n 30\r\n0.0\r\n 11\r\n531995.1789584217\r\n 21\r\n186015.2308868018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n462\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532367.7592458358\r\n 20\r\n186017.384856327\r\n 30\r\n0.0\r\n 11\r\n532367.7521822822\r\n 21\r\n186017.3950907273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n463\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532159.4363386244\r\n 20\r\n186124.1371738739\r\n 30\r\n0.0\r\n 11\r\n532023.0113161725\r\n 21\r\n186341.976254682\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n464\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532025.08345726\r\n 20\r\n186354.8888840192\r\n 30\r\n0.0\r\n 11\r\n532005.2047513148\r\n 21\r\n186340.9392739177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n465\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532059.9179272102\r\n 20\r\n186541.8109382867\r\n 30\r\n0.0\r\n 11\r\n532030.473360213\r\n 21\r\n186576.266048903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n466\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532074.8087792434\r\n 20\r\n186537.3850811423\r\n 30\r\n0.0\r\n 11\r\n532052.356979825\r\n 21\r\n186546.0489795433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n467\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532130.0135486268\r\n 20\r\n186569.9565920827\r\n 30\r\n0.0\r\n 11\r\n532067.1054834822\r\n 21\r\n186535.2515821992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n468\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532091.2921244136\r\n 20\r\n186316.102313323\r\n 30\r\n0.0\r\n 11\r\n531792.7632140843\r\n 21\r\n186130.9801536181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n469\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531936.6804172387\r\n 20\r\n186133.8679621811\r\n 30\r\n0.0\r\n 11\r\n532070.9155718749\r\n 21\r\n186278.0897346377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532468.8458028386\r\n 20\r\n186177.5755427393\r\n 30\r\n0.0\r\n 11\r\n531769.5162369404\r\n 21\r\n186138.5166020882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531938.4823451721\r\n 20\r\n186213.5060128864\r\n 30\r\n0.0\r\n 11\r\n531879.4933379066\r\n 21\r\n186285.8395267122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531898.3447794365\r\n 20\r\n186256.1720487052\r\n 30\r\n0.0\r\n 11\r\n531890.077737924\r\n 21\r\n186339.1433586055\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531910.2360944391\r\n 20\r\n186261.7279139901\r\n 30\r\n0.0\r\n 11\r\n531837.4229176238\r\n 21\r\n186295.2299870572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531710.4802981255\r\n 20\r\n186186.4293161462\r\n 30\r\n0.0\r\n 11\r\n531849.6961797504\r\n 21\r\n186298.185484916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532283.7673474868\r\n 20\r\n186408.4906846435\r\n 30\r\n0.0\r\n 11\r\n532238.7230775654\r\n 21\r\n186395.0324646574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n470\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532268.0635396029\r\n 20\r\n186338.3626500527\r\n 30\r\n0.0\r\n 11\r\n532239.1507935487\r\n 21\r\n186396.88487458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n471\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532327.6932205972\r\n 20\r\n186164.0523312674\r\n 30\r\n0.0\r\n 11\r\n532138.6908716636\r\n 21\r\n186395.2164362678\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n472\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532156.333518464\r\n 20\r\n186492.1622754376\r\n 30\r\n0.0\r\n 11\r\n532006.4397393707\r\n 21\r\n186419.1755808819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n473\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532443.2785890483\r\n 20\r\n186521.0440070698\r\n 30\r\n0.0\r\n 11\r\n532359.9775658928\r\n 21\r\n186772.1907556058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n474\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531690.8699317568\r\n 20\r\n185858.9173803943\r\n 30\r\n0.0\r\n 11\r\n531813.4096672386\r\n 21\r\n185746.4218472305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n475\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531602.6576685688\r\n 20\r\n185904.8884095925\r\n 30\r\n0.0\r\n 11\r\n531532.6487409198\r\n 21\r\n185734.1550506949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n476\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532274.1029641282\r\n 20\r\n186355.1102229073\r\n 30\r\n0.0\r\n 11\r\n532171.4693846109\r\n 21\r\n186298.5722535568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n477\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532180.8622533723\r\n 20\r\n185533.5433447531\r\n 30\r\n0.0\r\n 11\r\n532356.6872845859\r\n 21\r\n185442.1663750327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n478\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534574.6571852977\r\n 20\r\n184195.4021252921\r\n 30\r\n0.0\r\n 11\r\n535121.1408465514\r\n 21\r\n184069.916780534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n479\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534591.6805218133\r\n 20\r\n184183.5721895806\r\n 30\r\n0.0\r\n 11\r\n534563.5622932388\r\n 21\r\n184974.1290065872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534583.8361464561\r\n 20\r\n184321.2021780923\r\n 30\r\n0.0\r\n 11\r\n534730.4884537673\r\n 21\r\n184302.4726435274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534698.2576499472\r\n 20\r\n184297.2817347705\r\n 30\r\n0.0\r\n 11\r\n534772.7128564283\r\n 21\r\n184331.596753093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534738.1669447289\r\n 20\r\n184228.2704037896\r\n 30\r\n0.0\r\n 11\r\n534702.4823148565\r\n 21\r\n184308.5451549328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534723.3715470947\r\n 20\r\n184240.2209736357\r\n 30\r\n0.0\r\n 11\r\n534917.6315636337\r\n 21\r\n184197.5911864141\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534720.7058270503\r\n 20\r\n184117.6496135786\r\n 30\r\n0.0\r\n 11\r\n534877.7361941457\r\n 21\r\n184521.135282629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n480\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534936.296866142\r\n 20\r\n184250.4664032003\r\n 30\r\n0.0\r\n 11\r\n534768.4068052764\r\n 21\r\n184332.030894389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n481\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534913.1431511226\r\n 20\r\n184194.4528395784\r\n 30\r\n0.0\r\n 11\r\n534935.9678830072\r\n 21\r\n184251.2476658892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n482\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535200.2533381722\r\n 20\r\n184116.8648654899\r\n 30\r\n0.0\r\n 11\r\n534926.4889642517\r\n 21\r\n184232.6190607658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n483\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535135.8969533211\r\n 20\r\n184140.101114365\r\n 30\r\n0.0\r\n 11\r\n535172.7375945441\r\n 21\r\n184247.0617074395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n484\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535247.5614010104\r\n 20\r\n184214.8405486959\r\n 30\r\n0.0\r\n 11\r\n534562.2605079586\r\n 21\r\n184461.1649807091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n485\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534781.7684923542\r\n 20\r\n184475.8838221603\r\n 30\r\n0.0\r\n 11\r\n534855.7334321526\r\n 21\r\n184908.796001801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n486\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534715.8615647035\r\n 20\r\n184497.9270504825\r\n 30\r\n0.0\r\n 11\r\n534901.9152180392\r\n 21\r\n184443.2136500017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n487\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534737.396022412\r\n 20\r\n184567.2715912787\r\n 30\r\n0.0\r\n 11\r\n534798.940808514\r\n 21\r\n184548.6199155959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n488\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534702.5279512712\r\n 20\r\n184525.5405160086\r\n 30\r\n0.0\r\n 11\r\n534752.0826991785\r\n 21\r\n184573.3064294077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n489\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534743.7956458011\r\n 20\r\n184554.6144922988\r\n 30\r\n0.0\r\n 11\r\n534787.0077403957\r\n 21\r\n184955.5257201689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534570.3822305559\r\n 20\r\n184667.6964211436\r\n 30\r\n0.0\r\n 11\r\n534977.3661527182\r\n 21\r\n184651.0897554535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534973.6249792506\r\n 20\r\n184638.3108424999\r\n 30\r\n0.0\r\n 11\r\n534997.4323029246\r\n 21\r\n184875.9428753415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535129.9446164009\r\n 20\r\n184529.3614422962\r\n 30\r\n0.0\r\n 11\r\n534964.4371350048\r\n 21\r\n184653.9172751708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535051.122321311\r\n 20\r\n184492.0917463117\r\n 30\r\n0.0\r\n 11\r\n535084.6606727746\r\n 21\r\n184570.6188037027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534553.9285474718\r\n 20\r\n184777.7111798236\r\n 30\r\n0.0\r\n 11\r\n534643.6579189425\r\n 21\r\n184769.3010137052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534530.5281655633\r\n 20\r\n184928.6853843727\r\n 30\r\n0.0\r\n 11\r\n534999.4790852679\r\n 21\r\n184873.6110308273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n490\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534864.6453430343\r\n 20\r\n184478.5048502061\r\n 30\r\n0.0\r\n 11\r\n534927.7956627994\r\n 21\r\n184897.846314246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n491\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535350.3893007875\r\n 20\r\n184674.6506536572\r\n 30\r\n0.0\r\n 11\r\n534920.9074000498\r\n 21\r\n184896.7485383992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n492\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535583.6379881881\r\n 20\r\n184575.7674960427\r\n 30\r\n0.0\r\n 11\r\n535094.0071012423\r\n 21\r\n184802.1060054018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n493\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535328.5779771762\r\n 20\r\n184584.6675441836\r\n 30\r\n0.0\r\n 11\r\n535325.7982992511\r\n 21\r\n184702.0634602962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n494\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535273.2764353342\r\n 20\r\n184612.8942887018\r\n 30\r\n0.0\r\n 11\r\n535355.2701688879\r\n 21\r\n184685.9875752475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n495\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535098.6584225843\r\n 20\r\n184687.8064271212\r\n 30\r\n0.0\r\n 11\r\n535290.7012472688\r\n 21\r\n184625.1423636691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n496\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535098.5090148775\r\n 20\r\n184438.0892804688\r\n 30\r\n0.0\r\n 11\r\n535183.8986896964\r\n 21\r\n184762.1240560096\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n497\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535006.8823547946\r\n 20\r\n184457.0934690072\r\n 30\r\n0.0\r\n 11\r\n535127.0631374186\r\n 21\r\n184439.6565824029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n498\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535092.7796099318\r\n 20\r\n184343.4867310913\r\n 30\r\n0.0\r\n 11\r\n534991.7531499059\r\n 21\r\n184409.6787649087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n499\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534995.7606139729\r\n 20\r\n184404.26444609\r\n 30\r\n0.0\r\n 11\r\n535008.3974384137\r\n 21\r\n184458.6513154741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534961.226757078\r\n 20\r\n184068.0072542187\r\n 30\r\n0.0\r\n 11\r\n535146.0188931681\r\n 21\r\n184599.3917053508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535140.5844114282\r\n 20\r\n184611.286921755\r\n 30\r\n0.0\r\n 11\r\n535163.459076143\r\n 21\r\n184603.1319057388\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535057.2515549811\r\n 20\r\n184782.193123236\r\n 30\r\n0.0\r\n 11\r\n535076.4625545096\r\n 21\r\n184823.2427842622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535044.0759987184\r\n 20\r\n184773.9632749442\r\n 30\r\n0.0\r\n 11\r\n535063.411640211\r\n 21\r\n184788.2908497806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534982.1929300688\r\n 20\r\n184790.6652419575\r\n 30\r\n0.0\r\n 11\r\n535052.0692800617\r\n 21\r\n184773.9572174507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535087.0886008305\r\n 20\r\n184556.2761598885\r\n 30\r\n0.0\r\n 11\r\n535505.4896536701\r\n 21\r\n184439.6663665903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535476.0032534414\r\n 20\r\n184427.86715771\r\n 30\r\n0.0\r\n 11\r\n535494.9407156182\r\n 21\r\n184628.2559917115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535227.7655735143\r\n 20\r\n184213.6345013193\r\n 30\r\n0.0\r\n 11\r\n535495.623878412\r\n 21\r\n184458.2494913671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535457.6518015389\r\n 20\r\n184323.7658987257\r\n 30\r\n0.0\r\n 11\r\n535116.8482574903\r\n 21\r\n184525.0588110716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535074.8677798265\r\n 20\r\n184403.5864576378\r\n 30\r\n0.0\r\n 11\r\n535108.5224187205\r\n 21\r\n184392.2128473538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535261.6946601973\r\n 20\r\n184498.0562876151\r\n 30\r\n0.0\r\n 11\r\n535299.3017138007\r\n 21\r\n184583.481984685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535289.0272950536\r\n 20\r\n184549.86692231\r\n 30\r\n0.0\r\n 11\r\n535274.9106969223\r\n 21\r\n184632.0454103658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535276.0861163686\r\n 20\r\n184552.0571062738\r\n 30\r\n0.0\r\n 11\r\n535337.3547991832\r\n 21\r\n184603.7320143421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535488.6783927928\r\n 20\r\n184532.6462587168\r\n 30\r\n0.0\r\n 11\r\n535324.7376213809\r\n 21\r\n184603.3139771145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535258.9681390138\r\n 20\r\n183992.1531128462\r\n 30\r\n0.0\r\n 11\r\n535103.3700778348\r\n 21\r\n184075.7331806402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535153.1660462351\r\n 20\r\n184036.1810629035\r\n 30\r\n0.0\r\n 11\r\n535273.7238639583\r\n 21\r\n184270.2849582326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534876.9652630151\r\n 20\r\n184594.0981846576\r\n 30\r\n0.0\r\n 11\r\n534923.966796239\r\n 21\r\n184593.1154270327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534910.7692790155\r\n 20\r\n184530.6802114966\r\n 30\r\n0.0\r\n 11\r\n534923.0614345329\r\n 21\r\n184594.787157772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534863.8211214823\r\n 20\r\n184514.823476302\r\n 30\r\n0.0\r\n 11\r\n534963.400889941\r\n 21\r\n184483.7298636502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534899.6889578032\r\n 20\r\n184346.7861861114\r\n 30\r\n0.0\r\n 11\r\n535020.3411757364\r\n 21\r\n184619.9194386656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534977.5298769468\r\n 20\r\n184708.6716297057\r\n 30\r\n0.0\r\n 11\r\n535045.4811634307\r\n 21\r\n184697.6178331832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535039.4059462963\r\n 20\r\n184666.3601996268\r\n 30\r\n0.0\r\n 11\r\n535049.2339964726\r\n 21\r\n184725.6559109923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535033.6208638784\r\n 20\r\n184672.7317913196\r\n 30\r\n0.0\r\n 11\r\n535103.8602096413\r\n 21\r\n184660.2854977361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535100.9838456271\r\n 20\r\n184657.9305313283\r\n 30\r\n0.0\r\n 11\r\n535111.5524690118\r\n 21\r\n184713.0657650223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535041.0242654582\r\n 20\r\n184721.8822971619\r\n 30\r\n0.0\r\n 11\r\n535117.4799406871\r\n 21\r\n184709.2088002577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535069.0006836904\r\n 20\r\n184166.9860368055\r\n 30\r\n0.0\r\n 11\r\n535106.5476183001\r\n 21\r\n184273.2630251185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534693.2491391094\r\n 20\r\n184660.1320577132\r\n 30\r\n0.0\r\n 11\r\n534706.6944115045\r\n 21\r\n184924.3913516068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534453.6923026645\r\n 20\r\n184480.7570328502\r\n 30\r\n0.0\r\n 11\r\n534407.5047163943\r\n 21\r\n185779.3420802661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534427.7785696117\r\n 20\r\n185126.4152517712\r\n 30\r\n0.0\r\n 11\r\n534574.430876923\r\n 21\r\n185107.6857172062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534499.9886731898\r\n 20\r\n184978.4702767471\r\n 30\r\n0.0\r\n 11\r\n534481.4814355449\r\n 21\r\n185472.5776425573\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534542.2000731028\r\n 20\r\n185102.4948084494\r\n 30\r\n0.0\r\n 11\r\n534616.655279584\r\n 21\r\n185136.8098267719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534582.1093678846\r\n 20\r\n185033.4834774686\r\n 30\r\n0.0\r\n 11\r\n534546.4247380123\r\n 21\r\n185113.7582286117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534569.1238130012\r\n 20\r\n185045.2214964583\r\n 30\r\n0.0\r\n 11\r\n534763.3838295403\r\n 21\r\n185002.5917092368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534533.7798853447\r\n 20\r\n184843.5471823721\r\n 30\r\n0.0\r\n 11\r\n534721.6786173013\r\n 21\r\n185326.3483563077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534780.2392892977\r\n 20\r\n185055.6794768792\r\n 30\r\n0.0\r\n 11\r\n534612.3492284322\r\n 21\r\n185137.243968068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534757.0855742783\r\n 20\r\n184999.6659132573\r\n 30\r\n0.0\r\n 11\r\n534779.9103061629\r\n 21\r\n185056.4607395681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535044.1957613281\r\n 20\r\n184922.0779391688\r\n 30\r\n0.0\r\n 11\r\n534770.4313874075\r\n 21\r\n185037.8321344448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534979.8393764768\r\n 20\r\n184945.3141880438\r\n 30\r\n0.0\r\n 11\r\n535016.6800176997\r\n 21\r\n185052.2747811184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535091.5038241661\r\n 20\r\n185020.0536223748\r\n 30\r\n0.0\r\n 11\r\n534390.4684959374\r\n 21\r\n185301.8710613853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534625.7109155098\r\n 20\r\n185281.0968958392\r\n 30\r\n0.0\r\n 11\r\n534699.6758553083\r\n 21\r\n185714.0090754798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534559.8039878591\r\n 20\r\n185303.1401241614\r\n 30\r\n0.0\r\n 11\r\n534745.8576411948\r\n 21\r\n185248.4267236806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534581.3384455677\r\n 20\r\n185372.4846649576\r\n 30\r\n0.0\r\n 11\r\n534642.8832316696\r\n 21\r\n185353.8329892748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534546.4703744269\r\n 20\r\n185330.7535896875\r\n 30\r\n0.0\r\n 11\r\n534596.0251223342\r\n 21\r\n185378.5195030866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534587.7380689568\r\n 20\r\n185359.8275659777\r\n 30\r\n0.0\r\n 11\r\n534630.9501635513\r\n 21\r\n185760.7387938477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534157.7326287101\r\n 20\r\n185538.9153082807\r\n 30\r\n0.0\r\n 11\r\n534848.8426457485\r\n 21\r\n185522.3086425906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534817.5674024062\r\n 20\r\n185443.5239161787\r\n 30\r\n0.0\r\n 11\r\n534841.3747260803\r\n 21\r\n185681.1559490204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534973.8870395568\r\n 20\r\n185334.5745159751\r\n 30\r\n0.0\r\n 11\r\n534808.3795581605\r\n 21\r\n185459.1303488497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534895.0647444666\r\n 20\r\n185297.3048199906\r\n 30\r\n0.0\r\n 11\r\n534928.6030959303\r\n 21\r\n185375.8318773816\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534406.089309661\r\n 20\r\n185659.9740734423\r\n 30\r\n0.0\r\n 11\r\n534495.8186811316\r\n 21\r\n185651.5639073239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534374.470588719\r\n 20\r\n185733.8984580516\r\n 30\r\n0.0\r\n 11\r\n534843.4215084236\r\n 21\r\n185678.8241045062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534708.5877661901\r\n 20\r\n185283.717923885\r\n 30\r\n0.0\r\n 11\r\n534771.7380859552\r\n 21\r\n185703.0593879249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535078.9923763787\r\n 20\r\n185538.2018863312\r\n 30\r\n0.0\r\n 11\r\n534764.8498232055\r\n 21\r\n185701.9616120782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534942.4514380332\r\n 20\r\n185243.3023541477\r\n 30\r\n0.0\r\n 11\r\n535027.841112852\r\n 21\r\n185567.3371296885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534850.8247779503\r\n 20\r\n185262.3065426861\r\n 30\r\n0.0\r\n 11\r\n534971.0055605743\r\n 21\r\n185244.8696560818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534936.7220330874\r\n 20\r\n185148.6998047703\r\n 30\r\n0.0\r\n 11\r\n534835.6955730616\r\n 21\r\n185214.8918385876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534839.7030371286\r\n 20\r\n185209.4775197689\r\n 30\r\n0.0\r\n 11\r\n534852.3398615693\r\n 21\r\n185263.864389153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534805.1691802337\r\n 20\r\n184873.2203278976\r\n 30\r\n0.0\r\n 11\r\n534989.9613163239\r\n 21\r\n185404.6047790297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534984.5268345839\r\n 20\r\n185416.4999954338\r\n 30\r\n0.0\r\n 11\r\n535007.4014992987\r\n 21\r\n185408.3449794178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534901.1939781368\r\n 20\r\n185587.4061969149\r\n 30\r\n0.0\r\n 11\r\n534920.4049776653\r\n 21\r\n185628.4558579411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534888.0184218741\r\n 20\r\n185579.1763486232\r\n 30\r\n0.0\r\n 11\r\n534907.3540633668\r\n 21\r\n185593.5039234594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534826.1353532244\r\n 20\r\n185595.8783156365\r\n 30\r\n0.0\r\n 11\r\n534896.0117032174\r\n 21\r\n185579.1702911296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534931.0310239862\r\n 20\r\n185361.4892335674\r\n 30\r\n0.0\r\n 11\r\n535274.7483125908\r\n 21\r\n185272.5382705694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535071.7079966699\r\n 20\r\n185018.8475749982\r\n 30\r\n0.0\r\n 11\r\n535225.3427913389\r\n 21\r\n185153.0973355788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535237.7886563097\r\n 20\r\n185124.5939782508\r\n 30\r\n0.0\r\n 11\r\n534960.7906806459\r\n 21\r\n185330.2718847505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534918.8102029823\r\n 20\r\n185208.7995313166\r\n 30\r\n0.0\r\n 11\r\n534952.4648418761\r\n 21\r\n185197.4259210327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534979.4409143216\r\n 20\r\n184844.1047242348\r\n 30\r\n0.0\r\n 11\r\n535117.6662871139\r\n 21\r\n185075.4980319115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534720.9076861708\r\n 20\r\n185399.3112583365\r\n 30\r\n0.0\r\n 11\r\n534767.9092193946\r\n 21\r\n185398.3285007116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534754.7117021712\r\n 20\r\n185335.8932851755\r\n 30\r\n0.0\r\n 11\r\n534767.0038576885\r\n 21\r\n185400.0002314509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534707.7635446379\r\n 20\r\n185320.0365499808\r\n 30\r\n0.0\r\n 11\r\n534807.3433130968\r\n 21\r\n185288.9429373291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534743.6313809589\r\n 20\r\n185151.9992597903\r\n 30\r\n0.0\r\n 11\r\n534864.2835988922\r\n 21\r\n185425.1325123446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534912.9431068461\r\n 20\r\n184972.1991104843\r\n 30\r\n0.0\r\n 11\r\n534950.4900414558\r\n 21\r\n185078.4760987974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534537.1915622652\r\n 20\r\n185503.4776332377\r\n 30\r\n0.0\r\n 11\r\n534550.6368346601\r\n 21\r\n185729.6044252857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535204.4961575484\r\n 20\r\n185229.1919298231\r\n 30\r\n0.0\r\n 11\r\n535370.5322272506\r\n 21\r\n185193.6261991774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535127.1242449161\r\n 20\r\n184779.6941977527\r\n 30\r\n0.0\r\n 11\r\n535293.5571175311\r\n 21\r\n185516.6960290042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535310.5577928031\r\n 20\r\n185281.1508338489\r\n 30\r\n0.0\r\n 11\r\n535749.7250002055\r\n 21\r\n185277.1594001404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535321.8102417574\r\n 20\r\n185349.72932479\r\n 30\r\n0.0\r\n 11\r\n535297.4628153631\r\n 21\r\n185157.3320250695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535393.7012431163\r\n 20\r\n185339.5272597694\r\n 30\r\n0.0\r\n 11\r\n535385.1014189776\r\n 21\r\n185275.795880317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535346.9444020168\r\n 20\r\n185367.2952780401\r\n 30\r\n0.0\r\n 11\r\n535402.0006421976\r\n 21\r\n185325.9907269572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535382.2264866398\r\n 20\r\n185331.1913556245\r\n 30\r\n0.0\r\n 11\r\n535784.8986583672\r\n 21\r\n185352.4568174781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535466.2111560569\r\n 20\r\n185520.4169102442\r\n 30\r\n0.0\r\n 11\r\n535514.7099456254\r\n 21\r\n185115.9919336981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535501.4979983462\r\n 20\r\n185117.6476644367\r\n 30\r\n0.0\r\n 11\r\n535739.8858672794\r\n 21\r\n185132.0350074303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535418.8674089755\r\n 20\r\n184945.9561199044\r\n 30\r\n0.0\r\n 11\r\n535515.4397776946\r\n 21\r\n185129.2063845734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535369.5064323645\r\n 20\r\n185017.8273827992\r\n 30\r\n0.0\r\n 11\r\n535452.3764747868\r\n 21\r\n184997.2391378445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535717.5064167423\r\n 20\r\n185601.3754019604\r\n 30\r\n0.0\r\n 11\r\n535737.9102122855\r\n 21\r\n185129.6426019159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535326.3598811704\r\n 20\r\n185199.7522087382\r\n 30\r\n0.0\r\n 11\r\n535750.4056180268\r\n 21\r\n185204.2732045837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535597.4474089884\r\n 20\r\n184751.4979048362\r\n 30\r\n0.0\r\n 11\r\n535748.2235633978\r\n 21\r\n185210.8983017991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535547.1804223578\r\n 20\r\n184541.7709254714\r\n 30\r\n0.0\r\n 11\r\n535682.3923593902\r\n 21\r\n185024.9225824591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n500\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535505.1377379638\r\n 20\r\n184758.6825038902\r\n 30\r\n0.0\r\n 11\r\n535620.5885034062\r\n 21\r\n184780.1452271111\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n501\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535524.1856060168\r\n 20\r\n184817.7772444247\r\n 30\r\n0.0\r\n 11\r\n535609.4175360436\r\n 21\r\n184748.4871370208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n502\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535570.296748796\r\n 20\r\n185002.1058677334\r\n 30\r\n0.0\r\n 11\r\n535539.0553429453\r\n 21\r\n184802.52829905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n503\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535357.746004057\r\n 20\r\n184958.474605842\r\n 30\r\n0.0\r\n 11\r\n535657.2550122715\r\n 21\r\n184929.8059817427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n504\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535298.4922117697\r\n 20\r\n184889.1393465063\r\n 30\r\n0.0\r\n 11\r\n535341.8549400053\r\n 21\r\n185002.5727601311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n505\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535241.1734845259\r\n 20\r\n185019.5210662647\r\n 30\r\n0.0\r\n 11\r\n535249.717781515\r\n 21\r\n184899.043989793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n506\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535246.9440076642\r\n 20\r\n184905.1824582619\r\n 30\r\n0.0\r\n 11\r\n535300.5910023385\r\n 21\r\n184889.7027665412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n507\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534936.51385834\r\n 20\r\n185038.9531902914\r\n 30\r\n0.0\r\n 11\r\n534936.5261047019\r\n 21\r\n185038.9510308092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n508\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535080.6527128276\r\n 20\r\n185013.5362284448\r\n 30\r\n0.0\r\n 11\r\n535490.5647417293\r\n 21\r\n184941.2537170008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n509\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535501.4412534025\r\n 20\r\n184948.5153462196\r\n 30\r\n0.0\r\n 11\r\n535497.0379026665\r\n 21\r\n184924.6330290301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535656.8736195291\r\n 20\r\n185058.0328070582\r\n 30\r\n0.0\r\n 11\r\n535700.4612669717\r\n 21\r\n185045.6128970883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535646.6482386795\r\n 20\r\n185069.727561105\r\n 30\r\n0.0\r\n 11\r\n535663.8755498464\r\n 21\r\n185052.9238060906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535653.2693595921\r\n 20\r\n185133.4820169923\r\n 30\r\n0.0\r\n 11\r\n535647.9167757512\r\n 21\r\n185061.8355780196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535438.6044568951\r\n 20\r\n184992.5553584505\r\n 30\r\n0.0\r\n 11\r\n535394.6297386165\r\n 21\r\n184644.0500522233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535304.0071378401\r\n 20\r\n184686.4677601972\r\n 30\r\n0.0\r\n 11\r\n535412.5316292262\r\n 21\r\n184958.1988788722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535285.9196378086\r\n 20\r\n184980.2736785974\r\n 30\r\n0.0\r\n 11\r\n535280.0577219055\r\n 21\r\n184945.2361034543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n510\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535408.97011748\r\n 20\r\n184810.9000931193\r\n 30\r\n0.0\r\n 11\r\n535499.2992886763\r\n 21\r\n184787.3951780687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n511\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535464.4760482091\r\n 20\r\n184792.1782756448\r\n 30\r\n0.0\r\n 11\r\n535543.352293473\r\n 21\r\n184819.2175096397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n512\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535464.5747593956\r\n 20\r\n184805.3031096497\r\n 30\r\n0.0\r\n 11\r\n535525.357753368\r\n 21\r\n184753.0577724275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n513\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535479.3097783617\r\n 20\r\n184592.3356562343\r\n 30\r\n0.0\r\n 11\r\n535522.9332737854\r\n 21\r\n184765.446873669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n514\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535442.4387356393\r\n 20\r\n185206.0210956518\r\n 30\r\n0.0\r\n 11\r\n535448.962877189\r\n 21\r\n185159.464189451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n515\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535385.2221178641\r\n 20\r\n185162.5376566434\r\n 30\r\n0.0\r\n 11\r\n535450.4688616026\r\n 21\r\n185160.624523209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n516\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535362.082434586\r\n 20\r\n185206.3568374276\r\n 30\r\n0.0\r\n 11\r\n535347.2644751583\r\n 21\r\n185103.0932372945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n517\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535201.914047268\r\n 20\r\n185144.1545844069\r\n 30\r\n0.0\r\n 11\r\n535490.7907191858\r\n 21\r\n185068.5966611639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n518\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535571.5812368377\r\n 20\r\n185125.0116500937\r\n 30\r\n0.0\r\n 11\r\n535571.5035935779\r\n 21\r\n185056.1672042472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n519\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535539.6771781332\r\n 20\r\n185057.1807123762\r\n 30\r\n0.0\r\n 11\r\n535599.7813427349\r\n 21\r\n185056.9330147139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535545.0448302518\r\n 20\r\n185063.9077228577\r\n 30\r\n0.0\r\n 11\r\n535543.957332922\r\n 21\r\n184992.5824589834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535541.1738633348\r\n 20\r\n184995.0465275259\r\n 30\r\n0.0\r\n 11\r\n535597.2888617337\r\n 21\r\n184993.4043492656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535594.7469779589\r\n 20\r\n185064.4360151786\r\n 30\r\n0.0\r\n 11\r\n535594.4263687719\r\n 21\r\n184986.9377248218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535478.3345188717\r\n 20\r\n185397.9158045933\r\n 30\r\n0.0\r\n 11\r\n535741.3567721097\r\n 21\r\n185426.7783072673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n521\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534391.2765926995\r\n 20\r\n184519.6503847673\r\n 30\r\n0.0\r\n 11\r\n534386.096584341\r\n 21\r\n184657.946565643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n52B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534256.5953021055\r\n 20\r\n184456.2129860037\r\n 30\r\n0.0\r\n 11\r\n534150.4528097157\r\n 21\r\n184882.3790791057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n52F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534288.5721563849\r\n 20\r\n184537.5636853628\r\n 30\r\n0.0\r\n 11\r\n534215.4902316121\r\n 21\r\n184934.1190157052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n530\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534453.0403708427\r\n 20\r\n184663.3012758095\r\n 30\r\n0.0\r\n 11\r\n534104.3003871109\r\n 21\r\n184622.7857454523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n534\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534447.258926724\r\n 20\r\n184850.4577674675\r\n 30\r\n0.0\r\n 11\r\n534358.4101113065\r\n 21\r\n184835.3587940743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n535\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534473.2590024992\r\n 20\r\n184926.5403161469\r\n 30\r\n0.0\r\n 11\r\n534009.7420030087\r\n 21\r\n184836.5395345194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n536\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534173.7545980421\r\n 20\r\n184452.6269133669\r\n 30\r\n0.0\r\n 11\r\n534079.4116061442\r\n 21\r\n184866.0693231767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n537\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533755.4398820817\r\n 20\r\n184661.6264292207\r\n 30\r\n0.0\r\n 11\r\n534086.3626894285\r\n 21\r\n184865.4899125348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n54B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534152.8220239885\r\n 20\r\n184566.9747456222\r\n 30\r\n0.0\r\n 11\r\n534106.0257041126\r\n 21\r\n184562.4787046947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n54C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534123.8568246477\r\n 20\r\n184501.2056948098\r\n 30\r\n0.0\r\n 11\r\n534106.8034721114\r\n 21\r\n184564.2134785772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n557\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534476.3853151561\r\n 20\r\n184841.3974169092\r\n 30\r\n0.0\r\n 11\r\n534252.8962295165\r\n 21\r\n185308.7896885875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533961.5249641592\r\n 20\r\n184881.5255266349\r\n 30\r\n0.0\r\n 11\r\n534304.3350339336\r\n 21\r\n185057.7811684468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533907.0202036754\r\n 20\r\n184975.68771859\r\n 30\r\n0.0\r\n 11\r\n534585.0093833956\r\n 21\r\n185309.1577660268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534351.9801533095\r\n 20\r\n185270.8440629181\r\n 30\r\n0.0\r\n 11\r\n534245.8376609196\r\n 21\r\n185697.0101560202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534416.053427876\r\n 20\r\n185297.7558171074\r\n 30\r\n0.0\r\n 11\r\n534234.6140266268\r\n 21\r\n185229.2776323616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534389.3918617133\r\n 20\r\n185365.2951323006\r\n 30\r\n0.0\r\n 11\r\n534329.4147947651\r\n 21\r\n185342.0917458582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534427.284004527\r\n 20\r\n185326.2893565586\r\n 30\r\n0.0\r\n 11\r\n534374.294889134\r\n 21\r\n185370.214396944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n560\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534354.0779169706\r\n 20\r\n185514.3239438399\r\n 30\r\n0.0\r\n 11\r\n534310.8750828159\r\n 21\r\n185748.7500926196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n564\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534082.1685787133\r\n 20\r\n185266.8570599263\r\n 30\r\n0.0\r\n 11\r\n534042.8498380052\r\n 21\r\n185342.6551891283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n565\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534438.4337275536\r\n 20\r\n185715.179827652\r\n 30\r\n0.0\r\n 11\r\n534231.2455671621\r\n 21\r\n185651.1706114339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n566\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534269.1394492462\r\n 20\r\n185267.2579902813\r\n 30\r\n0.0\r\n 11\r\n534174.7964573482\r\n 21\r\n185680.700400091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534038.9544153992\r\n 20\r\n185209.4610571617\r\n 30\r\n0.0\r\n 11\r\n533929.5639759587\r\n 21\r\n185526.2001676052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534128.9026977911\r\n 20\r\n185235.266299162\r\n 30\r\n0.0\r\n 11\r\n534010.36305539\r\n 21\r\n185208.8879234353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534143.9452490913\r\n 20\r\n185183.4172834368\r\n 30\r\n0.0\r\n 11\r\n534127.2753217763\r\n 21\r\n185236.706441965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534203.536687036\r\n 20\r\n184850.6856394941\r\n 30\r\n0.0\r\n 11\r\n533979.511130468\r\n 21\r\n185366.7574547194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533984.0405412705\r\n 20\r\n185379.0258777179\r\n 30\r\n0.0\r\n 11\r\n533961.8400215264\r\n 21\r\n185369.1825299575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n573\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534041.5016409995\r\n 20\r\n185328.1711071394\r\n 30\r\n0.0\r\n 11\r\n533705.4015758481\r\n 21\r\n185213.7569711722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n574\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533926.8507846999\r\n 20\r\n184975.9659141336\r\n 30\r\n0.0\r\n 11\r\n533763.6036657633\r\n 21\r\n185098.3465764448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n575\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533753.3249201474\r\n 20\r\n185068.9920483031\r\n 30\r\n0.0\r\n 11\r\n534014.1606413901\r\n 21\r\n185294.815001671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534031.9313018756\r\n 20\r\n184808.6148959472\r\n 30\r\n0.0\r\n 11\r\n533876.783424875\r\n 21\r\n185029.0196435895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534248.2068751925\r\n 20\r\n185381.6058225365\r\n 30\r\n0.0\r\n 11\r\n534201.4105553166\r\n 21\r\n185377.1097816092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534219.2416758517\r\n 20\r\n185315.8367717241\r\n 30\r\n0.0\r\n 11\r\n534202.1883233154\r\n 21\r\n185378.8445554916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534267.2444791151\r\n 20\r\n185303.536510522\r\n 30\r\n0.0\r\n 11\r\n534170.26974444\r\n 21\r\n185265.0807714352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n585\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534088.6604468999\r\n 20\r\n184941.3248589964\r\n 30\r\n0.0\r\n 11\r\n534043.2684698303\r\n 21\r\n185044.4952954651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n588\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533778.699490766\r\n 20\r\n185175.787427945\r\n 30\r\n0.0\r\n 11\r\n533615.7892077258\r\n 21\r\n185127.9007145659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n589\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533889.4801228333\r\n 20\r\n184733.3371193682\r\n 30\r\n0.0\r\n 11\r\n533668.380798012\r\n 21\r\n185455.8235821609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533669.0481535236\r\n 20\r\n185219.6666077623\r\n 30\r\n0.0\r\n 11\r\n533156.2970385719\r\n 21\r\n185130.5605879663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533652.6970921362\r\n 20\r\n185287.2111842932\r\n 30\r\n0.0\r\n 11\r\n533691.368935235\r\n 21\r\n185097.1743282281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533726.3554435946\r\n 20\r\n185312.8337458587\r\n 30\r\n0.0\r\n 11\r\n533574.5071917399\r\n 21\r\n185257.5403092498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533593.8368982549\r\n 20\r\n185264.2056083881\r\n 30\r\n0.0\r\n 11\r\n533277.4741264265\r\n 21\r\n185310.1755935641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533672.2874569829\r\n 20\r\n185028.0485366832\r\n 30\r\n0.0\r\n 11\r\n533252.0779246593\r\n 21\r\n185038.8519140487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n590\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533710.405074358\r\n 20\r\n184829.6561084765\r\n 30\r\n0.0\r\n 11\r\n533658.6782495932\r\n 21\r\n184939.5278570125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n591\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533757.8097503218\r\n 20\r\n184963.9603378841\r\n 30\r\n0.0\r\n 11\r\n533758.301905461\r\n 21\r\n184843.1816611668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n592\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533760.6087077835\r\n 20\r\n184849.5104272049\r\n 30\r\n0.0\r\n 11\r\n533708.2700168314\r\n 21\r\n184830.060945907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n593\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534060.1620768055\r\n 20\r\n185006.1286428275\r\n 30\r\n0.0\r\n 11\r\n534060.1500263014\r\n 21\r\n185006.1255732843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n594\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.3284564037\r\n 20\r\n184970.0003236548\r\n 30\r\n0.0\r\n 11\r\n532885.2387837082\r\n 21\r\n184800.028308228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n595\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533494.4232462245\r\n 20\r\n185058.1154689717\r\n 30\r\n0.0\r\n 11\r\n533576.3287827944\r\n 21\r\n184703.1402534146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n596\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533720.0668251423\r\n 20\r\n184684.4216508722\r\n 30\r\n0.0\r\n 11\r\n533604.0388960189\r\n 21\r\n184929.9588760215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n597\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533716.1249475926\r\n 20\r\n184921.4756006983\r\n 30\r\n0.0\r\n 11\r\n533724.5914895052\r\n 21\r\n184886.9747108834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n598\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533431.9734486657\r\n 20\r\n185232.4302220629\r\n 30\r\n0.0\r\n 11\r\n533540.1338697607\r\n 21\r\n185087.9672749981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n599\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533603.4661137124\r\n 20\r\n185095.8003762957\r\n 30\r\n0.0\r\n 11\r\n533538.5453041319\r\n 21\r\n185089.0116995892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533787.6357425715\r\n 20\r\n185091.1815131837\r\n 30\r\n0.0\r\n 11\r\n533565.5971262563\r\n 21\r\n185014.9532196935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.4049733451\r\n 20\r\n184778.3242658983\r\n 30\r\n0.0\r\n 11\r\n533961.3461259023\r\n 21\r\n184945.405927624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533589.8584304239\r\n 20\r\n185107.2802195277\r\n 30\r\n0.0\r\n 11\r\n533607.2332131394\r\n 21\r\n184991.399632075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534448.9792157222\r\n 20\r\n184662.8294633956\r\n 30\r\n0.0\r\n 11\r\n534595.7315551097\r\n 21\r\n184795.9757854659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531733.2840274471\r\n 20\r\n186204.7351113824\r\n 30\r\n0.0\r\n 11\r\n531448.5837936163\r\n 21\r\n186119.7760350217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531632.4721077171\r\n 20\r\n185930.7358159032\r\n 30\r\n0.0\r\n 11\r\n531639.7393499542\r\n 21\r\n186196.0561477955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531358.457913672\r\n 20\r\n185930.1338576856\r\n 30\r\n0.0\r\n 11\r\n531685.1949769023\r\n 21\r\n186008.8922798291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531770.0292339276\r\n 20\r\n185963.2831550198\r\n 30\r\n0.0\r\n 11\r\n531808.2136621512\r\n 21\r\n186140.5612032772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532232.1680833026\r\n 20\r\n186022.1457130604\r\n 30\r\n0.0\r\n 11\r\n532232.1680833026\r\n 21\r\n186186.3597618883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531627.5907608017\r\n 20\r\n186001.9470050684\r\n 30\r\n0.0\r\n 11\r\n531869.3182729818\r\n 21\r\n185971.1207754074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531611.397048721\r\n 20\r\n186201.9375863602\r\n 30\r\n0.0\r\n 11\r\n531901.0963274493\r\n 21\r\n186217.1136835819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533414.1140397175\r\n 20\r\n185165.5370379062\r\n 30\r\n0.0\r\n 11\r\n533424.4254015407\r\n 21\r\n184724.7392205304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533322.7171241251\r\n 20\r\n184642.9320605513\r\n 30\r\n0.0\r\n 11\r\n532990.6437599907\r\n 21\r\n184514.5291438661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534153.2048046347\r\n 20\r\n184752.2472177889\r\n 30\r\n0.0\r\n 11\r\n533885.0218290623\r\n 21\r\n184579.4395168853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531550.2442337178\r\n 20\r\n185166.8802593773\r\n 30\r\n0.0\r\n 11\r\n531510.6297846931\r\n 21\r\n185399.9897693373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532988.2362401025\r\n 20\r\n186147.3083667564\r\n 30\r\n0.0\r\n 11\r\n533381.9029377306\r\n 21\r\n186201.5675327487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532778.6411400246\r\n 20\r\n187622.1886596294\r\n 30\r\n0.0\r\n 11\r\n533427.582290831\r\n 21\r\n185080.1812356924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534248.5818166204\r\n 20\r\n185619.4487363936\r\n 30\r\n0.0\r\n 11\r\n534493.593518952\r\n 21\r\n185630.1835954607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534282.0183703715\r\n 20\r\n185616.188519107\r\n 30\r\n0.0\r\n 11\r\n534172.0588715453\r\n 21\r\n185831.2875668419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533826.1828457042\r\n 20\r\n185498.1855968445\r\n 30\r\n0.0\r\n 11\r\n534504.1720254244\r\n 21\r\n185831.6556442813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534271.1427953385\r\n 20\r\n185793.3419411726\r\n 30\r\n0.0\r\n 11\r\n534165.0003029485\r\n 21\r\n186219.5080342747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534335.2160699049\r\n 20\r\n185820.2536953619\r\n 30\r\n0.0\r\n 11\r\n534153.7766686557\r\n 21\r\n185751.7755106161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534308.5545037421\r\n 20\r\n185887.7930105551\r\n 30\r\n0.0\r\n 11\r\n534248.577436794\r\n 21\r\n185864.5896241127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534303.1196496177\r\n 20\r\n185874.6926405317\r\n 30\r\n0.0\r\n 11\r\n534230.0377248448\r\n 21\r\n186271.2479708741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534358.301923027\r\n 20\r\n185987.6211864558\r\n 30\r\n0.0\r\n 11\r\n534062.9865863768\r\n 21\r\n185953.4249086355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534067.6732275388\r\n 20\r\n185940.9616670905\r\n 30\r\n0.0\r\n 11\r\n534026.1561056284\r\n 21\r\n186176.1469138242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533919.9417536444\r\n 20\r\n185820.6237579156\r\n 30\r\n0.0\r\n 11\r\n534075.6678596591\r\n 21\r\n185957.2116849322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534001.3312207422\r\n 20\r\n185789.3549381808\r\n 30\r\n0.0\r\n 11\r\n533962.0124800341\r\n 21\r\n185865.1530673827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534357.5963695824\r\n 20\r\n186237.6777059064\r\n 30\r\n0.0\r\n 11\r\n534024.2894962416\r\n 21\r\n186173.6684896884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534188.3020912749\r\n 20\r\n185789.7558685358\r\n 30\r\n0.0\r\n 11\r\n534093.959099377\r\n 21\r\n186203.1982783455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533638.9909350334\r\n 20\r\n185915.9627476106\r\n 30\r\n0.0\r\n 11\r\n534100.9101826614\r\n 21\r\n186202.6188677036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533717.7276796531\r\n 20\r\n185860.915757104\r\n 30\r\n0.0\r\n 11\r\n533711.7175495929\r\n 21\r\n185978.1906737143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533770.762714852\r\n 20\r\n185893.2003459607\r\n 30\r\n0.0\r\n 11\r\n533683.5308453329\r\n 21\r\n185959.9551347054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533939.2875136152\r\n 20\r\n185980.9652082985\r\n 30\r\n0.0\r\n 11\r\n533752.4704865293\r\n 21\r\n185904.110606927\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533958.117057428\r\n 20\r\n185731.9589354162\r\n 30\r\n0.0\r\n 11\r\n533848.7266179877\r\n 21\r\n186048.6980458597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534048.06533982\r\n 20\r\n185757.7641774165\r\n 30\r\n0.0\r\n 11\r\n533929.5256974189\r\n 21\r\n185731.3858016898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534063.1078911201\r\n 20\r\n185705.9151616913\r\n 30\r\n0.0\r\n 11\r\n534046.4379638052\r\n 21\r\n185759.2043202194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534282.8840061187\r\n 20\r\n185012.2849875451\r\n 30\r\n0.0\r\n 11\r\n533898.6737724969\r\n 21\r\n185889.2553329739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533903.2031832994\r\n 20\r\n185901.5237559724\r\n 30\r\n0.0\r\n 11\r\n533881.0026635552\r\n 21\r\n185891.680408212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533973.5175888728\r\n 20\r\n186078.1849544206\r\n 30\r\n0.0\r\n 11\r\n533951.289621666\r\n 21\r\n186117.6824815214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533987.2718768551\r\n 20\r\n186070.9637877669\r\n 30\r\n0.0\r\n 11\r\n533966.918612191\r\n 21\r\n186083.8047787778\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534047.7321300739\r\n 20\r\n186092.2482343965\r\n 30\r\n0.0\r\n 11\r\n533979.3014454954\r\n 21\r\n186070.3597949963\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533960.6642830283\r\n 20\r\n185850.6689853939\r\n 30\r\n0.0\r\n 11\r\n533624.564217877\r\n 21\r\n185736.2548494267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533846.0134267288\r\n 20\r\n185498.4637923881\r\n 30\r\n0.0\r\n 11\r\n533682.7663077922\r\n 21\r\n185620.8444546993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533672.4875621763\r\n 20\r\n185591.4899265576\r\n 30\r\n0.0\r\n 11\r\n533933.323283419\r\n 21\r\n185817.3128799255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533984.2730984368\r\n 20\r\n185699.3213145349\r\n 30\r\n0.0\r\n 11\r\n533951.5635824718\r\n 21\r\n185685.4619748932\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533790.9027081983\r\n 20\r\n185779.5505123624\r\n 30\r\n0.0\r\n 11\r\n533747.0106001366\r\n 21\r\n185861.9235847253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533759.7708675354\r\n 20\r\n185829.171307324\r\n 30\r\n0.0\r\n 11\r\n533767.7003971879\r\n 21\r\n185912.175553007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533772.511944799\r\n 20\r\n185832.3234433795\r\n 30\r\n0.0\r\n 11\r\n533707.5492968536\r\n 21\r\n185879.270242947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533609.8257327368\r\n 20\r\n185818.9870339748\r\n 30\r\n0.0\r\n 11\r\n533720.1623939\r\n 21\r\n185879.7972284508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533892.3579233192\r\n 20\r\n185253.3677321921\r\n 30\r\n0.0\r\n 11\r\n533795.9460669039\r\n 21\r\n185551.517521844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534167.3695172214\r\n 20\r\n185904.103700791\r\n 30\r\n0.0\r\n 11\r\n534120.5731973455\r\n 21\r\n185899.6076598636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n600\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534138.4043178805\r\n 20\r\n185838.3346499785\r\n 30\r\n0.0\r\n 11\r\n534121.3509653443\r\n 21\r\n185901.3424337461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n601\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534186.407121144\r\n 20\r\n185826.0343887765\r\n 30\r\n0.0\r\n 11\r\n534089.4323864689\r\n 21\r\n185787.5786496897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n602\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534163.2101264513\r\n 20\r\n185655.7847719955\r\n 30\r\n0.0\r\n 11\r\n534022.4637309971\r\n 21\r\n185919.1271034002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n603\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534058.5158018959\r\n 20\r\n186010.8331931783\r\n 30\r\n0.0\r\n 11\r\n533991.5818118574\r\n 21\r\n185994.7271468006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n604\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533999.9782917924\r\n 20\r\n185964.0115637281\r\n 30\r\n0.0\r\n 11\r\n533985.742053636\r\n 21\r\n186022.4059254402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n605\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534005.2705259052\r\n 20\r\n185970.7980663162\r\n 30\r\n0.0\r\n 11\r\n533936.1590559625\r\n 21\r\n185953.1322620743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n606\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533939.2035281584\r\n 20\r\n185950.9990659342\r\n 30\r\n0.0\r\n 11\r\n533924.5400241045\r\n 21\r\n186005.1892075063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n607\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533994.2110735139\r\n 20\r\n186019.257029288\r\n 30\r\n0.0\r\n 11\r\n533918.9176883678\r\n 21\r\n186000.8996342736\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n608\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534007.8230889289\r\n 20\r\n185463.8227372508\r\n 30\r\n0.0\r\n 11\r\n533962.4311118591\r\n 21\r\n185566.9931737196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n609\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533680.2879975476\r\n 20\r\n185926.3723861391\r\n 30\r\n0.0\r\n 11\r\n533183.0921970397\r\n 21\r\n185960.4920697405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533635.3074283488\r\n 20\r\n185874.3556080672\r\n 30\r\n0.0\r\n 11\r\n533409.7069375618\r\n 21\r\n185902.1750854693\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533697.862132795\r\n 20\r\n185698.2853061994\r\n 30\r\n0.0\r\n 11\r\n533534.9518497547\r\n 21\r\n185650.3985928204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533771.9073970045\r\n 20\r\n185375.8751922475\r\n 30\r\n0.0\r\n 11\r\n533587.5434400409\r\n 21\r\n185978.3214604154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533571.859734165\r\n 20\r\n185809.7090625476\r\n 30\r\n0.0\r\n 11\r\n533610.5315772639\r\n 21\r\n185619.6722064826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533500.9333528127\r\n 20\r\n185794.1576434707\r\n 30\r\n0.0\r\n 11\r\n533514.2766247555\r\n 21\r\n185731.2481625001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n610\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533545.4819450334\r\n 20\r\n185825.3455892097\r\n 30\r\n0.0\r\n 11\r\n533493.6698337688\r\n 21\r\n185780.0381875042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n611\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533512.9995402838\r\n 20\r\n185786.7034866426\r\n 30\r\n0.0\r\n 11\r\n533196.6367684554\r\n 21\r\n185832.6734718186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n612\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533591.4500990117\r\n 20\r\n185550.5464149377\r\n 30\r\n0.0\r\n 11\r\n533281.9833857183\r\n 21\r\n185528.8296416967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n616\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533979.3247188343\r\n 20\r\n185528.626521082\r\n 30\r\n0.0\r\n 11\r\n533979.3126683303\r\n 21\r\n185528.6234515387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n619\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533592.716804391\r\n 20\r\n185246.1291783604\r\n 30\r\n0.0\r\n 11\r\n533497.5594804018\r\n 21\r\n185639.2600493747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n61B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533351.1360906946\r\n 20\r\n185754.9281003174\r\n 30\r\n0.0\r\n 11\r\n533459.2965117895\r\n 21\r\n185610.4651532526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n61C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533522.6287557413\r\n 20\r\n185618.2982545502\r\n 30\r\n0.0\r\n 11\r\n533457.7079461609\r\n 21\r\n185611.5095778437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n61D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533706.7983846004\r\n 20\r\n185613.6793914381\r\n 30\r\n0.0\r\n 11\r\n533484.7597682852\r\n 21\r\n185537.451097948\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n620\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533365.6423109871\r\n 20\r\n185989.5037721182\r\n 30\r\n0.0\r\n 11\r\n533355.2628067224\r\n 21\r\n185733.4928732219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n621\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533337.2744785237\r\n 20\r\n186336.5469027501\r\n 30\r\n0.0\r\n 11\r\n533396.5976925238\r\n 21\r\n186535.0100937501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n622\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533550.0795055239\r\n 20\r\n186180.2816337501\r\n 30\r\n0.0\r\n 11\r\n533609.1965935239\r\n 21\r\n186660.1642687501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n623\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533538.3571319998\r\n 20\r\n185927.2096775935\r\n 30\r\n0.0\r\n 11\r\n533580.5614965238\r\n 21\r\n186464.9701427501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n624\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533458.1223385238\r\n 20\r\n186169.4847237501\r\n 30\r\n0.0\r\n 11\r\n533567.2457225238\r\n 21\r\n186212.8623077501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n625\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533465.3862375238\r\n 20\r\n186231.1470737501\r\n 30\r\n0.0\r\n 11\r\n533562.4058715238\r\n 21\r\n186179.6418167501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n626\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533474.9917335238\r\n 20\r\n186420.9127537501\r\n 30\r\n0.0\r\n 11\r\n533482.9234825238\r\n 21\r\n186219.0605337501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n627\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533054.7558316947\r\n 20\r\n186318.1436929638\r\n 30\r\n0.0\r\n 11\r\n533574.2870045238\r\n 21\r\n186366.7882467501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n628\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533417.7957455238\r\n 20\r\n186355.0216147501\r\n 30\r\n0.0\r\n 11\r\n533418.0925675238\r\n 21\r\n186330.7385657501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n629\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533347.6302755237\r\n 20\r\n186386.0827237501\r\n 30\r\n0.0\r\n 11\r\n533383.5869865237\r\n 21\r\n185953.2266277501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533362.2817485238\r\n 20\r\n185976.7798857501\r\n 30\r\n0.0\r\n 11\r\n533556.7744945238\r\n 21\r\n186028.6150477501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533258.2867925238\r\n 20\r\n185940.5511634717\r\n 30\r\n0.0\r\n 11\r\n533328.6913695239\r\n 21\r\n186347.3338157501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533353.6739045237\r\n 20\r\n186202.1253807501\r\n 30\r\n0.0\r\n 11\r\n533446.8430955237\r\n 21\r\n186196.5269837501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533411.7521155238\r\n 20\r\n186194.4875667501\r\n 30\r\n0.0\r\n 11\r\n533483.9128905238\r\n 21\r\n186236.2656087501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533409.3115775239\r\n 20\r\n186207.3838757501\r\n 30\r\n0.0\r\n 11\r\n533479.0483035237\r\n 21\r\n186167.8751847501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533464.9410045238\r\n 20\r\n186001.2828717501\r\n 30\r\n0.0\r\n 11\r\n533474.2744135237\r\n 21\r\n186179.5618397501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n631\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533828.2799445249\r\n 20\r\n186210.2886838591\r\n 30\r\n0.0\r\n 11\r\n534061.4320714794\r\n 21\r\n186167.5716401304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n632\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533878.5348859357\r\n 20\r\n186281.5377210867\r\n 30\r\n0.0\r\n 11\r\n533888.0084184373\r\n 21\r\n186196.6756450849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n633\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533682.6241340539\r\n 20\r\n186064.3491011722\r\n 30\r\n0.0\r\n 11\r\n533742.8463203225\r\n 21\r\n185963.5383080481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n634\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533744.6558089154\r\n 20\r\n186067.0101066368\r\n 30\r\n0.0\r\n 11\r\n533709.2791370904\r\n 21\r\n185963.019280259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n635\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.7364357564\r\n 20\r\n186271.9532591409\r\n 30\r\n0.0\r\n 11\r\n533852.6960106894\r\n 21\r\n186024.3600566836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n636\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533733.19405122\r\n 20\r\n186303.439136011\r\n 30\r\n0.0\r\n 11\r\n533854.626565084\r\n 21\r\n186302.1702375712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n637\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.5538564261\r\n 20\r\n186402.4709471534\r\n 30\r\n0.0\r\n 11\r\n533725.5431140586\r\n 21\r\n186352.6174865919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n638\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533730.3361853824\r\n 20\r\n186357.3504649146\r\n 30\r\n0.0\r\n 11\r\n533734.4512997048\r\n 21\r\n186301.6666546332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n639\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533774.1936004964\r\n 20\r\n186550.921799029\r\n 30\r\n0.0\r\n 11\r\n533848.7703066101\r\n 21\r\n186141.4209470101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533878.8332329101\r\n 20\r\n186207.9637909363\r\n 30\r\n0.0\r\n 11\r\n533536.7480498949\r\n 21\r\n186128.1674759979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533545.052813288\r\n 20\r\n186227.8808082367\r\n 30\r\n0.0\r\n 11\r\n533837.5602881303\r\n 21\r\n186220.4819401955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533814.2894553135\r\n 20\r\n186346.879572664\r\n 30\r\n0.0\r\n 11\r\n533779.3969418796\r\n 21\r\n186340.2082732231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533698.1930436881\r\n 20\r\n186172.6657522801\r\n 30\r\n0.0\r\n 11\r\n533707.521963026\r\n 21\r\n186079.7958892214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533699.9134321882\r\n 20\r\n186114.1127416054\r\n 30\r\n0.0\r\n 11\r\n533752.6629064465\r\n 21\r\n186049.5366221229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533712.2556086878\r\n 20\r\n186118.5783536354\r\n 30\r\n0.0\r\n 11\r\n533684.3718017468\r\n 21\r\n186043.434219279\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n640\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533517.6614423957\r\n 20\r\n186030.7981312433\r\n 30\r\n0.0\r\n 11\r\n533695.1477506907\r\n 21\r\n186050.0104533972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n641\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533938.7951369609\r\n 20\r\n186482.5712296238\r\n 30\r\n0.0\r\n 11\r\n533968.2654247545\r\n 21\r\n186185.4345043938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n643\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534367.7944644015\r\n 20\r\n186130.8678290536\r\n 30\r\n0.0\r\n 11\r\n534035.7211002671\r\n 21\r\n186002.4649123684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n64E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532380.4365915808\r\n 20\r\n183829.5073398477\r\n 30\r\n0.0\r\n 11\r\n532354.2882743064\r\n 21\r\n183002.9918967023\r\n 31\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nOBJECTS\r\n  0\r\nDICTIONARY\r\n  5\r\nC\r\n330\r\n0\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nACAD_CIP_PREVIOUS_PRODUCT_INFO\r\n350\r\nB4\r\n  3\r\nACAD_COLOR\r\n350\r\n62\r\n  3\r\nACAD_DETAILVIEWSTYLE\r\n350\r\n69\r\n  3\r\nACAD_GROUP\r\n350\r\nD\r\n  3\r\nACAD_LAYOUT\r\n350\r\n61\r\n  3\r\nACAD_MATERIAL\r\n350\r\n10\r\n  3\r\nACAD_MLEADERSTYLE\r\n350\r\n65\r\n  3\r\nACAD_MLINESTYLE\r\n350\r\n5E\r\n  3\r\nACAD_PLOTSETTINGS\r\n350\r\n60\r\n  3\r\nACAD_PLOTSTYLENAME\r\n350\r\nE\r\n  3\r\nACAD_SCALELIST\r\n350\r\n42\r\n  3\r\nACAD_SECTIONVIEWSTYLE\r\n350\r\n67\r\n  3\r\nACAD_TABLESTYLE\r\n350\r\n63\r\n  3\r\nACAD_VISUALSTYLE\r\n350\r\n29\r\n  3\r\nACDB_RECOMPOSE_DATA\r\n350\r\n658\r\n  3\r\nAcDbVariableDictionary\r\n350\r\n34B\r\n  0\r\nDICTIONARY\r\n  5\r\n345\r\n330\r\n2\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_LAYERSTATES\r\n360\r\n346\r\n  0\r\nDICTIONARY\r\n  5\r\n340\r\n330\r\n54\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nADSK_XREC_LAYER_RECONCILED\r\n360\r\n341\r\n  0\r\nDICTIONARY\r\n  5\r\n135\r\n330\r\n6F\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_SORTENTS\r\n360\r\n136\r\n  0\r\nXRECORD\r\n  5\r\nB4\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n300\r\nACDMAC\r\n300\r\n2018\r\n300\r\nACDMAC_F_S\r\n  0\r\nDICTIONARY\r\n  5\r\n62\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n69\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nImperial24\r\n350\r\n6A\r\n  0\r\nDICTIONARY\r\n  5\r\nD\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n61\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nLayout1\r\n350\r\n6E\r\n  3\r\nModel\r\n350\r\n72\r\n  0\r\nDICTIONARY\r\n  5\r\n10\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nByBlock\r\n350\r\n19\r\n  3\r\nByLayer\r\n350\r\n11\r\n  3\r\nGlobal\r\n350\r\n21\r\n  0\r\nDICTIONARY\r\n  5\r\n65\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n66\r\n  0\r\nDICTIONARY\r\n  5\r\n5E\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n5F\r\n  0\r\nDICTIONARY\r\n  5\r\n60\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nACDBDICTIONARYWDFLT\r\n  5\r\nE\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nNormal\r\n350\r\nF\r\n100\r\nAcDbDictionaryWithDefault\r\n340\r\nF\r\n  0\r\nDICTIONARY\r\n  5\r\n42\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nA0\r\n350\r\n43\r\n  3\r\nA1\r\n350\r\n44\r\n  3\r\nA2\r\n350\r\n45\r\n  3\r\nA3\r\n350\r\n46\r\n  3\r\nA4\r\n350\r\n47\r\n  3\r\nA5\r\n350\r\n48\r\n  3\r\nA6\r\n350\r\n49\r\n  3\r\nA7\r\n350\r\n4A\r\n  3\r\nA8\r\n350\r\n4B\r\n  3\r\nA9\r\n350\r\n4C\r\n  3\r\nB0\r\n350\r\n4D\r\n  3\r\nB1\r\n350\r\n4E\r\n  3\r\nB2\r\n350\r\n4F\r\n  3\r\nB3\r\n350\r\n50\r\n  3\r\nB4\r\n350\r\n51\r\n  3\r\nB5\r\n350\r\n52\r\n  3\r\nB6\r\n350\r\n53\r\n  0\r\nDICTIONARY\r\n  5\r\n67\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nImperial24\r\n350\r\n68\r\n  0\r\nDICTIONARY\r\n  5\r\n63\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n64\r\n  0\r\nDICTIONARY\r\n  5\r\n29\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n2dWireframe\r\n350\r\n2F\r\n  3\r\nBasic\r\n350\r\n2E\r\n  3\r\nBrighten\r\n350\r\n35\r\n  3\r\nColorChange\r\n350\r\n39\r\n  3\r\nConceptual\r\n350\r\n32\r\n  3\r\nDim\r\n350\r\n34\r\n  3\r\nEdgeColorOff\r\n350\r\n41\r\n  3\r\nFacepattern\r\n350\r\n38\r\n  3\r\nFlat\r\n350\r\n2A\r\n  3\r\nFlatWithEdges\r\n350\r\n2B\r\n  3\r\nGouraud\r\n350\r\n2C\r\n  3\r\nGouraudWithEdges\r\n350\r\n2D\r\n  3\r\nHidden\r\n350\r\n31\r\n  3\r\nJitterOff\r\n350\r\n3F\r\n  3\r\nLinepattern\r\n350\r\n37\r\n  3\r\nOverhangOff\r\n350\r\n40\r\n  3\r\nRealistic\r\n350\r\n33\r\n  3\r\nShaded\r\n350\r\n3E\r\n  3\r\nShaded with edges\r\n350\r\n3D\r\n  3\r\nShades of Gray\r\n350\r\n3A\r\n  3\r\nSketchy\r\n350\r\n3B\r\n  3\r\nThicken\r\n350\r\n36\r\n  3\r\nWireframe\r\n350\r\n30\r\n  3\r\nX-Ray\r\n350\r\n3C\r\n  0\r\nXRECORD\r\n  5\r\n658\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 90\r\n        1\r\n330\r\n64\r\n  0\r\nDICTIONARY\r\n  5\r\n34B\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nCANNOSCALE\r\n350\r\n351\r\n  3\r\nCMLEADERSTYLE\r\n350\r\n34D\r\n  3\r\nCTABLESTYLE\r\n350\r\n34C\r\n  3\r\nCVIEWDETAILSTYLE\r\n350\r\n34E\r\n  3\r\nCVIEWSECTIONSTYLE\r\n350\r\n34F\r\n  3\r\nLAYEREVAL\r\n350\r\n353\r\n  3\r\nLAYERNOTIFY\r\n350\r\n354\r\n  3\r\nLIGHTINGUNITS\r\n350\r\n352\r\n  3\r\nMSLTSCALE\r\n350\r\n350\r\n  0\r\nDICTIONARY\r\n  5\r\n346\r\n102\r\n{ACAD_REACTORS\r\n330\r\n345\r\n102\r\n}\r\n330\r\n345\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n341\r\n102\r\n{ACAD_REACTORS\r\n330\r\n340\r\n102\r\n}\r\n330\r\n340\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n290\r\n     1\r\n  0\r\nSORTENTSTABLE\r\n  5\r\n136\r\n102\r\n{ACAD_REACTORS\r\n330\r\n135\r\n102\r\n}\r\n330\r\n135\r\n100\r\nAcDbSortentsTable\r\n330\r\n6F\r\n331\r\n2D6\r\n  5\r\n2D7\r\n331\r\n25E\r\n  5\r\n25F\r\n331\r\n280\r\n  5\r\n281\r\n331\r\n2F8\r\n  5\r\n2F9\r\n331\r\n1F8\r\n  5\r\n1F9\r\n331\r\n90\r\n  5\r\n90\r\n331\r\n271\r\n  5\r\n272\r\n331\r\n2E9\r\n  5\r\n2EA\r\n331\r\n1E9\r\n  5\r\n1EA\r\n331\r\n2A2\r\n  5\r\n2A3\r\n331\r\n21A\r\n  5\r\n21B\r\n331\r\n182\r\n  5\r\n182\r\n331\r\n10A\r\n  5\r\n10A\r\n331\r\nFB\r\n  5\r\nFB\r\n331\r\n293\r\n  5\r\n294\r\n331\r\n30B\r\n  5\r\n30C\r\n331\r\n20B\r\n  5\r\n20C\r\n331\r\n12C\r\n  5\r\n12D\r\n331\r\n23C\r\n  5\r\n23D\r\n331\r\n1A4\r\n  5\r\n1A4\r\n331\r\n11D\r\n  5\r\n11E\r\n331\r\nD4\r\n  5\r\nD4\r\n331\r\n2B5\r\n  5\r\n2B6\r\n331\r\n22D\r\n  5\r\n22E\r\n331\r\n1C6\r\n  5\r\n1C7\r\n331\r\n14E\r\n  5\r\n14E\r\n331\r\n13F\r\n  5\r\n13F\r\n331\r\n24F\r\n  5\r\n250\r\n331\r\n1B7\r\n  5\r\n1B7\r\n331\r\nE7\r\n  5\r\nE7\r\n331\r\nC5\r\n  5\r\nC5\r\n331\r\nA3\r\n  5\r\nA3\r\n331\r\n81\r\n  5\r\n81\r\n331\r\n76\r\n  5\r\n76\r\n331\r\n160\r\n  5\r\n160\r\n331\r\n1C9\r\n  5\r\n1CA\r\n331\r\n151\r\n  5\r\n151\r\n331\r\n270\r\n  5\r\n271\r\n331\r\n2E8\r\n  5\r\n2E9\r\n331\r\n1E8\r\n  5\r\n1E9\r\n331\r\n2D9\r\n  5\r\n2DA\r\n331\r\n261\r\n  5\r\n262\r\n331\r\n292\r\n  5\r\n293\r\n331\r\n30A\r\n  5\r\n30B\r\n331\r\n20A\r\n  5\r\n20B\r\n331\r\nA2\r\n  5\r\nA2\r\n331\r\n283\r\n  5\r\n284\r\n331\r\n2FB\r\n  5\r\n2FC\r\n331\r\n1FB\r\n  5\r\n1FC\r\n331\r\n11C\r\n  5\r\n11D\r\n331\r\n2B4\r\n  5\r\n2B5\r\n331\r\n22C\r\n  5\r\n22D\r\n331\r\n194\r\n  5\r\n194\r\n331\r\n2A5\r\n  5\r\n2A6\r\n331\r\n31D\r\n  5\r\n31E\r\n331\r\n21D\r\n  5\r\n21E\r\n331\r\n185\r\n  5\r\n185\r\n331\r\n13E\r\n  5\r\n13E\r\n331\r\n10D\r\n  5\r\n10D\r\n331\r\n24E\r\n  5\r\n24F\r\n331\r\n1B6\r\n  5\r\n1B6\r\n331\r\n12F\r\n  5\r\n130\r\n331\r\nE6\r\n  5\r\nE6\r\n331\r\n2C7\r\n  5\r\n2C8\r\n331\r\n23F\r\n  5\r\n240\r\n331\r\n1A7\r\n  5\r\n1A7\r\n331\r\nD7\r\n  5\r\nD7\r\n331\r\nC4\r\n  5\r\nC4\r\n331\r\n93\r\n  5\r\n93\r\n331\r\n80\r\n  5\r\n80\r\n331\r\n1C8\r\n  5\r\n1C9\r\n331\r\n150\r\n  5\r\n150\r\n331\r\n141\r\n  5\r\n141\r\n331\r\n251\r\n  5\r\n252\r\n331\r\n2D8\r\n  5\r\n2D9\r\n331\r\n260\r\n  5\r\n261\r\n331\r\n1B9\r\n  5\r\n1B9\r\n331\r\nE9\r\n  5\r\nE9\r\n331\r\n282\r\n  5\r\n283\r\n331\r\n1FA\r\n  5\r\n1FB\r\n331\r\n92\r\n  5\r\n92\r\n331\r\n273\r\n  5\r\n274\r\n331\r\n2EB\r\n  5\r\n2EC\r\n331\r\n1EB\r\n  5\r\n1EC\r\n331\r\n2A4\r\n  5\r\n2A5\r\n331\r\n31C\r\n  5\r\n31D\r\n331\r\n21C\r\n  5\r\n21D\r\n331\r\n184\r\n  5\r\n184\r\n331\r\n10C\r\n  5\r\n10C\r\n331\r\n295\r\n  5\r\n296\r\n331\r\n20D\r\n  5\r\n20E\r\n331\r\n12E\r\n  5\r\n12F\r\n331\r\n2C6\r\n  5\r\n2C7\r\n331\r\n23E\r\n  5\r\n23F\r\n331\r\n1A6\r\n  5\r\n1A6\r\n331\r\n11F\r\n  5\r\n120\r\n331\r\nD6\r\n  5\r\nD6\r\n331\r\n2B7\r\n  5\r\n2B8\r\n331\r\n22F\r\n  5\r\n230\r\n331\r\nC7\r\n  5\r\nC7\r\n331\r\nA5\r\n  5\r\nA5\r\n331\r\n83\r\n  5\r\n83\r\n331\r\n140\r\n  5\r\n140\r\n331\r\n250\r\n  5\r\n251\r\n331\r\n1B8\r\n  5\r\n1B8\r\n331\r\n131\r\n  5\r\n132\r\n331\r\nE8\r\n  5\r\nE8\r\n331\r\n2C9\r\n  5\r\n2CA\r\n331\r\n241\r\n  5\r\n242\r\n331\r\n1CB\r\n  5\r\n1CC\r\n331\r\nD9\r\n  5\r\nD9\r\n331\r\n272\r\n  5\r\n273\r\n331\r\n2EA\r\n  5\r\n2EB\r\n331\r\n1EA\r\n  5\r\n1EB\r\n331\r\n2DB\r\n  5\r\n2DC\r\n331\r\n263\r\n  5\r\n264\r\n331\r\n294\r\n  5\r\n295\r\n331\r\n20C\r\n  5\r\n20D\r\n331\r\nA4\r\n  5\r\nA4\r\n331\r\n285\r\n  5\r\n286\r\n331\r\n1FD\r\n  5\r\n1FE\r\n331\r\n11E\r\n  5\r\n11F\r\n331\r\n2B6\r\n  5\r\n2B7\r\n331\r\n22E\r\n  5\r\n22F\r\n331\r\n10F\r\n  5\r\n10F\r\n331\r\nC6\r\n  5\r\nC6\r\n331\r\n2A7\r\n  5\r\n2A8\r\n331\r\n31F\r\n  5\r\n320\r\n331\r\n21F\r\n  5\r\n220\r\n331\r\n187\r\n  5\r\n187\r\n331\r\nB7\r\n  5\r\nB7\r\n331\r\n95\r\n  5\r\n95\r\n331\r\n82\r\n  5\r\n82\r\n331\r\n130\r\n  5\r\n131\r\n331\r\n2C8\r\n  5\r\n2C9\r\n331\r\n240\r\n  5\r\n241\r\n331\r\nD8\r\n  5\r\nD8\r\n331\r\n2B9\r\n  5\r\n2BA\r\n331\r\n231\r\n  5\r\n232\r\n331\r\n1CA\r\n  5\r\n1CB\r\n331\r\n199\r\n  5\r\n199\r\n331\r\n143\r\n  5\r\n143\r\n331\r\n253\r\n  5\r\n254\r\n331\r\n2DA\r\n  5\r\n2DB\r\n331\r\n262\r\n  5\r\n263\r\n331\r\n1DD\r\n  5\r\n1DE\r\n331\r\n1BB\r\n  5\r\n1BB\r\n331\r\nEB\r\n  5\r\nEB\r\n331\r\nC9\r\n  5\r\nC9\r\n331\r\n284\r\n  5\r\n285\r\n331\r\n1FC\r\n  5\r\n1FD\r\n331\r\n94\r\n  5\r\n94\r\n331\r\n275\r\n  5\r\n276\r\n331\r\n2ED\r\n  5\r\n2EE\r\n331\r\n1ED\r\n  5\r\n1EE\r\n331\r\n2A6\r\n  5\r\n2A7\r\n331\r\n31E\r\n  5\r\n31F\r\n331\r\n21E\r\n  5\r\n21F\r\n331\r\n186\r\n  5\r\n186\r\n331\r\nFF\r\n  5\r\nFF\r\n331\r\n297\r\n  5\r\n298\r\n331\r\n20F\r\n  5\r\n210\r\n331\r\nA7\r\n  5\r\nA7\r\n331\r\n85\r\n  5\r\n85\r\n331\r\n2B8\r\n  5\r\n2B9\r\n331\r\n230\r\n  5\r\n231\r\n331\r\n111\r\n  5\r\n111\r\n331\r\nC8\r\n  5\r\nC8\r\n331\r\n2A9\r\n  5\r\n2AA\r\n331\r\n221\r\n  5\r\n222\r\n331\r\n142\r\n  5\r\n142\r\n331\r\n252\r\n  5\r\n253\r\n331\r\n133\r\n  5\r\n134\r\n331\r\nEA\r\n  5\r\nEA\r\n331\r\n2CB\r\n  5\r\n2CC\r\n331\r\n243\r\n  5\r\n244\r\n331\r\n1DC\r\n  5\r\n1DD\r\n331\r\n1AB\r\n  5\r\n1AB\r\n331\r\n1CD\r\n  5\r\n1CE\r\n331\r\nDB\r\n  5\r\nDB\r\n331\r\nB9\r\n  5\r\nB9\r\n331\r\n274\r\n  5\r\n275\r\n331\r\n2EC\r\n  5\r\n2ED\r\n331\r\n1EC\r\n  5\r\n1ED\r\n331\r\n2DD\r\n  5\r\n2DE\r\n331\r\n265\r\n  5\r\n266\r\n331\r\n296\r\n  5\r\n297\r\n331\r\n20E\r\n  5\r\n20F\r\n331\r\nA6\r\n  5\r\nA6\r\n331\r\n287\r\n  5\r\n288\r\n331\r\n1FF\r\n  5\r\n200\r\n331\r\n97\r\n  5\r\n97\r\n331\r\n84\r\n  5\r\n84\r\n331\r\n110\r\n  5\r\n110\r\n331\r\n2A8\r\n  5\r\n2A9\r\n331\r\n320\r\n  5\r\n321\r\n331\r\n220\r\n  5\r\n221\r\n331\r\n188\r\n  5\r\n188\r\n331\r\nB8\r\n  5\r\nB8\r\n331\r\n299\r\n  5\r\n29A\r\n331\r\n311\r\n  5\r\n312\r\n331\r\n211\r\n  5\r\n212\r\n331\r\n179\r\n  5\r\n179\r\n331\r\n2CA\r\n  5\r\n2CB\r\n331\r\n242\r\n  5\r\n243\r\n331\r\n123\r\n  5\r\n124\r\n331\r\nDA\r\n  5\r\nDA\r\n331\r\n2BB\r\n  5\r\n2BC\r\n331\r\n233\r\n  5\r\n234\r\n331\r\n1CC\r\n  5\r\n1CD\r\n331\r\n145\r\n  5\r\n145\r\n331\r\n255\r\n  5\r\n256\r\n331\r\n1BD\r\n  5\r\n1BD\r\n331\r\n2DC\r\n  5\r\n2DD\r\n331\r\n264\r\n  5\r\n265\r\n331\r\n167\r\n  5\r\n167\r\n331\r\nED\r\n  5\r\nED\r\n331\r\nCB\r\n  5\r\nCB\r\n331\r\nA9\r\n  5\r\nA9\r\n331\r\n286\r\n  5\r\n287\r\n331\r\n1FE\r\n  5\r\n1FF\r\n331\r\n96\r\n  5\r\n96\r\n331\r\n277\r\n  5\r\n278\r\n331\r\n2EF\r\n  5\r\n2F0\r\n331\r\n1EF\r\n  5\r\n1F0\r\n331\r\n87\r\n  5\r\n87\r\n331\r\n298\r\n  5\r\n299\r\n331\r\n310\r\n  5\r\n311\r\n331\r\n210\r\n  5\r\n211\r\n331\r\nF1\r\n  5\r\nF1\r\n331\r\nA8\r\n  5\r\nA8\r\n331\r\n289\r\n  5\r\n28A\r\n331\r\n201\r\n  5\r\n202\r\n331\r\n169\r\n  5\r\n169\r\n331\r\n122\r\n  5\r\n123\r\n331\r\n2BA\r\n  5\r\n2BB\r\n331\r\n232\r\n  5\r\n233\r\n331\r\n113\r\n  5\r\n113\r\n331\r\nCA\r\n  5\r\nCA\r\n331\r\n2AB\r\n  5\r\n2AC\r\n331\r\n323\r\n  5\r\n324\r\n331\r\n223\r\n  5\r\n224\r\n331\r\n18B\r\n  5\r\n18B\r\n331\r\n144\r\n  5\r\n144\r\n331\r\n254\r\n  5\r\n255\r\n331\r\n2CD\r\n  5\r\n2CE\r\n331\r\n245\r\n  5\r\n246\r\n331\r\n1BC\r\n  5\r\n1BC\r\n331\r\n1DE\r\n  5\r\n1DF\r\n331\r\n1CF\r\n  5\r\n1D0\r\n331\r\n1AD\r\n  5\r\n1AD\r\n331\r\nEC\r\n  5\r\nEC\r\n331\r\nBB\r\n  5\r\nBB\r\n331\r\n99\r\n  5\r\n99\r\n331\r\n276\r\n  5\r\n277\r\n331\r\n2EE\r\n  5\r\n2EF\r\n331\r\n1EE\r\n  5\r\n1EF\r\n331\r\n2DF\r\n  5\r\n2E0\r\n331\r\n267\r\n  5\r\n268\r\n331\r\n86\r\n  5\r\n86\r\n331\r\nF0\r\n  5\r\nF0\r\n331\r\n288\r\n  5\r\n289\r\n331\r\n200\r\n  5\r\n201\r\n331\r\n168\r\n  5\r\n168\r\n331\r\n98\r\n  5\r\n98\r\n331\r\n279\r\n  5\r\n27A\r\n331\r\n2F1\r\n  5\r\n2F2\r\n331\r\n1F1\r\n  5\r\n1F2\r\n331\r\n112\r\n  5\r\n112\r\n331\r\n2AA\r\n  5\r\n2AB\r\n331\r\n322\r\n  5\r\n323\r\n331\r\n222\r\n  5\r\n223\r\n331\r\nBA\r\n  5\r\nBA\r\n331\r\n29B\r\n  5\r\n29C\r\n331\r\n213\r\n  5\r\n214\r\n331\r\n17B\r\n  5\r\n17B\r\n331\r\n134\r\n  5\r\n11B\r\n331\r\n2CC\r\n  5\r\n2CD\r\n331\r\n244\r\n  5\r\n245\r\n331\r\n125\r\n  5\r\n126\r\n331\r\nDC\r\n  5\r\nDC\r\n331\r\n2BD\r\n  5\r\n2BE\r\n331\r\n235\r\n  5\r\n236\r\n331\r\n1CE\r\n  5\r\n1CF\r\n331\r\n19D\r\n  5\r\n19D\r\n331\r\n147\r\n  5\r\n147\r\n331\r\n257\r\n  5\r\n258\r\n331\r\n2DE\r\n  5\r\n2DF\r\n331\r\n1BF\r\n  5\r\n1C0\r\n331\r\nEF\r\n  5\r\nEF\r\n331\r\nCD\r\n  5\r\nCD\r\n331\r\nAB\r\n  5\r\nAB\r\n331\r\n89\r\n  5\r\n89\r\n331\r\n278\r\n  5\r\n279\r\n331\r\n2F0\r\n  5\r\n2F1\r\n331\r\n1F0\r\n  5\r\n1F1\r\n331\r\n88\r\n  5\r\n88\r\n331\r\n269\r\n  5\r\n26A\r\n331\r\n2E1\r\n  5\r\n2E2\r\n331\r\n1E1\r\n  5\r\n1E2\r\n331\r\n29A\r\n  5\r\n29B\r\n331\r\n312\r\n  5\r\n313\r\n331\r\n212\r\n  5\r\n213\r\n331\r\n17A\r\n  5\r\n17A\r\n331\r\nAA\r\n  5\r\nAA\r\n331\r\n28B\r\n  5\r\n28C\r\n331\r\n203\r\n  5\r\n204\r\n331\r\n16B\r\n  5\r\n16B\r\n331\r\n124\r\n  5\r\n125\r\n331\r\n2BC\r\n  5\r\n2BD\r\n331\r\n234\r\n  5\r\n235\r\n331\r\n115\r\n  5\r\n115\r\n331\r\n225\r\n  5\r\n226\r\n331\r\n18D\r\n  5\r\n18D\r\n331\r\n146\r\n  5\r\n146\r\n331\r\n256\r\n  5\r\n257\r\n331\r\n137\r\n  5\r\n137\r\n331\r\nEE\r\n  5\r\nEE\r\n331\r\n2CF\r\n  5\r\n2D0\r\n331\r\n247\r\n  5\r\n248\r\n331\r\n1AF\r\n  5\r\n1AF\r\n331\r\n1D1\r\n  5\r\n1D2\r\n331\r\n159\r\n  5\r\n159\r\n331\r\nDF\r\n  5\r\nDF\r\n331\r\nBD\r\n  5\r\nBD\r\n331\r\n9B\r\n  5\r\n9B\r\n331\r\n79\r\n  5\r\n79\r\n331\r\n268\r\n  5\r\n269\r\n331\r\n2E0\r\n  5\r\n2E1\r\n331\r\n1E0\r\n  5\r\n1E1\r\n331\r\n2D1\r\n  5\r\n2D2\r\n331\r\n28A\r\n  5\r\n28B\r\n331\r\n202\r\n  5\r\n203\r\n331\r\n16A\r\n  5\r\n16A\r\n331\r\n9A\r\n  5\r\n9A\r\n331\r\n27B\r\n  5\r\n27C\r\n331\r\n2F3\r\n  5\r\n2F4\r\n331\r\n1F3\r\n  5\r\n1F4\r\n331\r\n114\r\n  5\r\n114\r\n331\r\n2AC\r\n  5\r\n2AD\r\n331\r\n224\r\n  5\r\n225\r\n331\r\n324\r\n  5\r\n1BF\r\n331\r\n18C\r\n  5\r\n18C\r\n331\r\n105\r\n  5\r\n105\r\n331\r\nBC\r\n  5\r\nBC\r\n331\r\n29D\r\n  5\r\n29E\r\n331\r\n215\r\n  5\r\n216\r\n331\r\n17D\r\n  5\r\n17D\r\n331\r\n2CE\r\n  5\r\n2CF\r\n331\r\n246\r\n  5\r\n247\r\n331\r\n1AE\r\n  5\r\n1AE\r\n331\r\n237\r\n  5\r\n238\r\n331\r\n1D0\r\n  5\r\n1D1\r\n331\r\n19F\r\n  5\r\n19F\r\n331\r\n1C1\r\n  5\r\n1C2\r\n331\r\n149\r\n  5\r\n149\r\n331\r\n127\r\n  5\r\n128\r\n331\r\nDE\r\n  5\r\nDE\r\n331\r\nAD\r\n  5\r\nAD\r\n331\r\n8B\r\n  5\r\n8B\r\n331\r\n78\r\n  5\r\n78\r\n331\r\n2D0\r\n  5\r\n2D1\r\n331\r\n258\r\n  5\r\n259\r\n331\r\n27A\r\n  5\r\n27B\r\n331\r\n2F2\r\n  5\r\n2F3\r\n331\r\n1F2\r\n  5\r\n1F3\r\n331\r\n8A\r\n  5\r\n8A\r\n331\r\n26B\r\n  5\r\n26C\r\n331\r\n2E3\r\n  5\r\n2E4\r\n331\r\n104\r\n  5\r\n104\r\n331\r\n29C\r\n  5\r\n29D\r\n331\r\n214\r\n  5\r\n215\r\n331\r\n17C\r\n  5\r\n17C\r\n331\r\nAC\r\n  5\r\nAC\r\n331\r\n28D\r\n  5\r\n28E\r\n331\r\n205\r\n  5\r\n206\r\n331\r\n16D\r\n  5\r\n16D\r\n331\r\n126\r\n  5\r\n127\r\n331\r\n2BE\r\n  5\r\n2BF\r\n331\r\n236\r\n  5\r\n237\r\n331\r\n19E\r\n  5\r\n19E\r\n331\r\n117\r\n  5\r\n117\r\n331\r\n2AF\r\n  5\r\n2B0\r\n331\r\n227\r\n  5\r\n228\r\n331\r\n1C0\r\n  5\r\n1C1\r\n331\r\n148\r\n  5\r\n148\r\n331\r\n139\r\n  5\r\n139\r\n331\r\n249\r\n  5\r\n24A\r\n331\r\n1B1\r\n  5\r\n1B1\r\n331\r\n1D3\r\n  5\r\n1D4\r\n331\r\n15B\r\n  5\r\n15B\r\n331\r\nE1\r\n  5\r\nE1\r\n331\r\nBF\r\n  5\r\nBF\r\n331\r\n9D\r\n  5\r\n9D\r\n331\r\n7B\r\n  5\r\n7B\r\n331\r\n26A\r\n  5\r\n26B\r\n331\r\n2E2\r\n  5\r\n2E3\r\n331\r\n1E2\r\n  5\r\n1E3\r\n331\r\n7A\r\n  5\r\n7A\r\n331\r\n2D3\r\n  5\r\n2D4\r\n331\r\n25B\r\n  5\r\n25C\r\n331\r\n28C\r\n  5\r\n28D\r\n331\r\n204\r\n  5\r\n205\r\n331\r\n16C\r\n  5\r\n16C\r\n331\r\n9C\r\n  5\r\n9C\r\n331\r\n27D\r\n  5\r\n27E\r\n331\r\n2F5\r\n  5\r\n2F6\r\n331\r\n1F5\r\n  5\r\n1F6\r\n331\r\n116\r\n  5\r\n116\r\n331\r\n2AE\r\n  5\r\n2AF\r\n331\r\n226\r\n  5\r\n227\r\n331\r\n18E\r\n  5\r\n18E\r\n331\r\n107\r\n  5\r\n107\r\n331\r\nBE\r\n  5\r\nBE\r\n331\r\n29F\r\n  5\r\n2A0\r\n331\r\n317\r\n  5\r\n318\r\n331\r\n217\r\n  5\r\n218\r\n331\r\n17F\r\n  5\r\n17F\r\n331\r\n138\r\n  5\r\n138\r\n331\r\n248\r\n  5\r\n249\r\n331\r\n1B0\r\n  5\r\n1B0\r\n331\r\n129\r\n  5\r\n12A\r\n331\r\nE0\r\n  5\r\nE0\r\n331\r\n239\r\n  5\r\n23A\r\n331\r\n1A1\r\n  5\r\n1A1\r\n331\r\n1D2\r\n  5\r\n1D3\r\n331\r\n15A\r\n  5\r\n15A\r\n331\r\n1C3\r\n  5\r\n1C4\r\n331\r\n14B\r\n  5\r\n14B\r\n331\r\nD1\r\n  5\r\nD1\r\n331\r\nAF\r\n  5\r\nAF\r\n331\r\n8D\r\n  5\r\n8D\r\n331\r\n73\r\n  5\r\n73\r\n331\r\n2D2\r\n  5\r\n2D3\r\n331\r\n25A\r\n  5\r\n25B\r\n331\r\n27C\r\n  5\r\n27D\r\n331\r\n2F4\r\n  5\r\n2F5\r\n331\r\n1F4\r\n  5\r\n1F5\r\n331\r\n8C\r\n  5\r\n8C\r\n331\r\n26D\r\n  5\r\n26E\r\n331\r\n2E5\r\n  5\r\n2E6\r\n331\r\n1E5\r\n  5\r\n1E6\r\n331\r\n106\r\n  5\r\n106\r\n331\r\n216\r\n  5\r\n217\r\n331\r\nAE\r\n  5\r\nAE\r\n331\r\n28F\r\n  5\r\n290\r\n331\r\n307\r\n  5\r\n308\r\n331\r\n207\r\n  5\r\n208\r\n331\r\n16F\r\n  5\r\n16F\r\n331\r\n238\r\n  5\r\n239\r\n331\r\n1A0\r\n  5\r\n1A0\r\n331\r\n119\r\n  5\r\n119\r\n331\r\nD0\r\n  5\r\nD0\r\n331\r\n2B1\r\n  5\r\n2B2\r\n331\r\n229\r\n  5\r\n22A\r\n331\r\n1C2\r\n  5\r\n1C3\r\n331\r\n14A\r\n  5\r\n14A\r\n331\r\n13B\r\n  5\r\n13B\r\n331\r\n24B\r\n  5\r\n24C\r\n331\r\n1B3\r\n  5\r\n1B3\r\n331\r\n15D\r\n  5\r\n15D\r\n331\r\nE3\r\n  5\r\nE3\r\n331\r\nC1\r\n  5\r\nC1\r\n331\r\n9F\r\n  5\r\n9F\r\n331\r\n7D\r\n  5\r\n7D\r\n331\r\n26C\r\n  5\r\n26D\r\n331\r\n2E4\r\n  5\r\n2E5\r\n331\r\n1E4\r\n  5\r\n1E5\r\n331\r\n7C\r\n  5\r\n7C\r\n331\r\n2D5\r\n  5\r\n2D6\r\n331\r\n25D\r\n  5\r\n25E\r\n331\r\n28E\r\n  5\r\n28F\r\n331\r\n206\r\n  5\r\n207\r\n331\r\n16E\r\n  5\r\n16E\r\n331\r\n9E\r\n  5\r\n9E\r\n331\r\n27F\r\n  5\r\n280\r\n331\r\n2F7\r\n  5\r\n2F8\r\n331\r\n1F7\r\n  5\r\n1F8\r\n331\r\n118\r\n  5\r\n118\r\n331\r\n2B0\r\n  5\r\n2B1\r\n331\r\n228\r\n  5\r\n229\r\n331\r\n2A1\r\n  5\r\n2A2\r\n331\r\n319\r\n  5\r\n31A\r\n331\r\n219\r\n  5\r\n21A\r\n331\r\n181\r\n  5\r\n181\r\n331\r\n13A\r\n  5\r\n13A\r\n331\r\n109\r\n  5\r\n109\r\n331\r\n24A\r\n  5\r\n24B\r\n331\r\n1B2\r\n  5\r\n1B2\r\n331\r\n12B\r\n  5\r\n12C\r\n331\r\nE2\r\n  5\r\nE2\r\n331\r\n23B\r\n  5\r\n23C\r\n331\r\n1A3\r\n  5\r\n1A3\r\n331\r\n1D4\r\n  5\r\n1D6\r\n331\r\n15C\r\n  5\r\n15C\r\n331\r\n14D\r\n  5\r\n14D\r\n331\r\nD3\r\n  5\r\nD3\r\n331\r\nC0\r\n  5\r\nC0\r\n331\r\n8F\r\n  5\r\n8F\r\n331\r\n75\r\n  5\r\n75\r\n331\r\n2D4\r\n  5\r\n2D5\r\n331\r\n25C\r\n  5\r\n25D\r\n331\r\n27E\r\n  5\r\n27F\r\n331\r\n2F6\r\n  5\r\n2F7\r\n331\r\n1F6\r\n  5\r\n1F7\r\n331\r\n8E\r\n  5\r\n8E\r\n331\r\n26F\r\n  5\r\n270\r\n331\r\n2E7\r\n  5\r\n2E8\r\n331\r\n1E7\r\n  5\r\n1E8\r\n331\r\n2A0\r\n  5\r\n2A1\r\n331\r\n318\r\n  5\r\n319\r\n331\r\n218\r\n  5\r\n219\r\n331\r\n180\r\n  5\r\n180\r\n331\r\n108\r\n  5\r\n108\r\n331\r\nF9\r\n  5\r\nF9\r\n331\r\n291\r\n  5\r\n292\r\n331\r\n309\r\n  5\r\n30A\r\n331\r\n209\r\n  5\r\n20A\r\n331\r\n171\r\n  5\r\n171\r\n331\r\n12A\r\n  5\r\n12B\r\n331\r\n2C2\r\n  5\r\n2C3\r\n331\r\n23A\r\n  5\r\n23B\r\n331\r\n1A2\r\n  5\r\n1A2\r\n331\r\n11B\r\n  5\r\n11C\r\n331\r\nD2\r\n  5\r\nD2\r\n331\r\n2B3\r\n  5\r\n2B4\r\n331\r\n22B\r\n  5\r\n22C\r\n331\r\n14C\r\n  5\r\n14C\r\n331\r\n24D\r\n  5\r\n24E\r\n331\r\n1D7\r\n  5\r\n1DC\r\n331\r\n1B5\r\n  5\r\n1B5\r\n331\r\n13D\r\n  5\r\n13D\r\n331\r\nC3\r\n  5\r\nC3\r\n331\r\nA1\r\n  5\r\nA1\r\n331\r\n7F\r\n  5\r\n7F\r\n331\r\n74\r\n  5\r\n74\r\n331\r\n26E\r\n  5\r\n26F\r\n331\r\n2E6\r\n  5\r\n2E7\r\n331\r\n1E6\r\n  5\r\n1E7\r\n331\r\n7E\r\n  5\r\n7E\r\n331\r\n2D7\r\n  5\r\n2D8\r\n331\r\n25F\r\n  5\r\n260\r\n331\r\n290\r\n  5\r\n291\r\n331\r\n308\r\n  5\r\n309\r\n331\r\n208\r\n  5\r\n209\r\n331\r\n170\r\n  5\r\n170\r\n331\r\nA0\r\n  5\r\nA0\r\n331\r\n281\r\n  5\r\n282\r\n331\r\n2F9\r\n  5\r\n2FA\r\n331\r\n1F9\r\n  5\r\n1FA\r\n331\r\n11A\r\n  5\r\n11A\r\n331\r\n2B2\r\n  5\r\n2B3\r\n331\r\n22A\r\n  5\r\n22B\r\n331\r\n2A3\r\n  5\r\n2A4\r\n331\r\n21B\r\n  5\r\n21C\r\n331\r\n183\r\n  5\r\n183\r\n331\r\n13C\r\n  5\r\n13C\r\n331\r\n10B\r\n  5\r\n10B\r\n331\r\n24C\r\n  5\r\n24D\r\n331\r\n1B4\r\n  5\r\n1B4\r\n331\r\n12D\r\n  5\r\n12E\r\n331\r\nE4\r\n  5\r\nE4\r\n331\r\n2C5\r\n  5\r\n2C6\r\n331\r\n23D\r\n  5\r\n23E\r\n331\r\n1A5\r\n  5\r\n1A5\r\n331\r\n1D6\r\n  5\r\n1D7\r\n331\r\n15E\r\n  5\r\n15E\r\n331\r\n1C7\r\n  5\r\n1C8\r\n331\r\n14F\r\n  5\r\n14F\r\n331\r\nD5\r\n  5\r\nD5\r\n331\r\nC2\r\n  5\r\nC2\r\n331\r\n91\r\n  5\r\n91\r\n331\r\n77\r\n  5\r\n77\r\n  0\r\nACDBDETAILVIEWSTYLE\r\n  5\r\n6A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n69\r\n102\r\n}\r\n330\r\n69\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nImperial24\r\n290\r\n     0\r\n300\r\nImperial24\r\n 90\r\n        0\r\n100\r\nAcDbDetailViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n        3\r\n 71\r\n     1\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n0.24\r\n300\r\n\r\n 40\r\n0.36\r\n280\r\n     3\r\n 71\r\n     2\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n 71\r\n     3\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 90\r\n        1\r\n 40\r\n0.75\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewType \\f \"%tc1\">% %<\\AcVar ViewDetailId>%\\PSCALE %<\\AcVar ViewScale \\f \"%sn\">%\r\n 71\r\n     4\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n280\r\n     0\r\n  0\r\nLAYOUT\r\n  5\r\n6E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n61\r\n102\r\n}\r\n330\r\n61\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\n\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout1\r\n 70\r\n     1\r\n 71\r\n     1\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n1.000000000000000E+20\r\n 24\r\n1.000000000000000E+20\r\n 34\r\n1.000000000000000E+20\r\n 15\r\n-1.000000000000000E+20\r\n 25\r\n-1.000000000000000E+20\r\n 35\r\n-1.000000000000000E+20\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n6B\r\n  0\r\nLAYOUT\r\n  5\r\n72\r\n102\r\n{ACAD_REACTORS\r\n330\r\n61\r\n102\r\n}\r\n330\r\n61\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\n\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n  1712\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     0\r\n  7\r\n\r\n 75\r\n     0\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nModel\r\n 70\r\n     1\r\n 71\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n6F\r\n331\r\nB3\r\n  0\r\nMATERIAL\r\n  5\r\n19\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1A\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10\r\n102\r\n}\r\n330\r\n10\r\n100\r\nAcDbMaterial\r\n  1\r\nByBlock\r\n 72\r\n     0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMATERIAL\r\n  5\r\n11\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n12\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10\r\n102\r\n}\r\n330\r\n10\r\n100\r\nAcDbMaterial\r\n  1\r\nByLayer\r\n 72\r\n     0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMATERIAL\r\n  5\r\n21\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n22\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10\r\n102\r\n}\r\n330\r\n10\r\n100\r\nAcDbMaterial\r\n  1\r\nGlobal\r\n 72\r\n     0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n66\r\n102\r\n{ACAD_REACTORS\r\n330\r\n65\r\n102\r\n}\r\n330\r\n65\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n5A\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n0.09\r\n291\r\n     1\r\n 43\r\n0.36\r\n  3\r\nStandard\r\n 44\r\n0.18\r\n300\r\n\r\n342\r\n55\r\n174\r\n     1\r\n178\r\n     6\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n0.18\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n0.18\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     0\r\n143\r\n0.125\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLINESTYLE\r\n  5\r\n5F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nAcDbMlineStyle\r\n  2\r\nSTANDARD\r\n 70\r\n     0\r\n  3\r\n\r\n 62\r\n   256\r\n 51\r\n90.0\r\n 52\r\n90.0\r\n 71\r\n     2\r\n 49\r\n0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n 49\r\n-0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n  0\r\nACDBPLACEHOLDER\r\n  5\r\nF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nE\r\n102\r\n}\r\n330\r\nE\r\n  0\r\nSCALE\r\n  5\r\n43\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:1\r\n140\r\n1.0\r\n141\r\n1.0\r\n290\r\n     1\r\n  0\r\nSCALE\r\n  5\r\n44\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/128\" = 1'-0\"\r\n140\r\n0.0078125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n45\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/64\" = 1'-0\"\r\n140\r\n0.015625\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n46\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/32\" = 1'-0\"\r\n140\r\n0.03125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n47\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/16\" = 1'-0\"\r\n140\r\n0.0625\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n48\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/32\" = 1'-0\"\r\n140\r\n0.09375\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n49\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/8\" = 1'-0\"\r\n140\r\n0.125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/16\" = 1'-0\"\r\n140\r\n0.1875\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/4\" = 1'-0\"\r\n140\r\n0.25\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/8\" = 1'-0\"\r\n140\r\n0.375\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/2\" = 1'-0\"\r\n140\r\n0.5\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/4\" = 1'-0\"\r\n140\r\n0.75\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1\" = 1'-0\"\r\n140\r\n1.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n50\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1-1/2\" = 1'-0\"\r\n140\r\n1.5\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n51\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3\" = 1'-0\"\r\n140\r\n3.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n52\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n6\" = 1'-0\"\r\n140\r\n6.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n53\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1'-0\" = 1'-0\"\r\n140\r\n12.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nACDBSECTIONVIEWSTYLE\r\n  5\r\n68\r\n102\r\n{ACAD_REACTORS\r\n330\r\n67\r\n102\r\n}\r\n330\r\n67\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nImperial24\r\n290\r\n     0\r\n300\r\nImperial24\r\n 90\r\n        0\r\n100\r\nAcDbSectionViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n       78\r\n 71\r\n     1\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n340\r\n0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n0.24\r\n300\r\nI, O, Q, S, X, Z\r\n 40\r\n0.48\r\n 90\r\n        3\r\n 40\r\n0.18\r\n 90\r\n        1\r\n 71\r\n     2\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n5C\r\n 90\r\n       50\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 40\r\n0.0\r\n 40\r\n0.24\r\n 71\r\n     3\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 90\r\n        1\r\n 40\r\n0.75\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewType \\f \"%tc1\">% %<\\AcVar ViewSectionStartId>%-%<\\AcVar ViewSectionEndId>%\\PSCALE %<\\AcVar ViewScale \\f \"%sn\">%\r\n 71\r\n     4\r\n 62\r\n   256\r\n 62\r\n   257\r\n300\r\nANSI31\r\n 40\r\n1.0\r\n 90\r\n        0\r\n290\r\n     0\r\n290\r\n     0\r\n 90\r\n        6\r\n 40\r\n0.0\r\n 40\r\n1.570796326794896\r\n 40\r\n0.2617993877991494\r\n 40\r\n1.308996938995747\r\n 40\r\n-0.2617993877991494\r\n 40\r\n1.832595714594046\r\n  0\r\nTABLESTYLE\r\n  5\r\n64\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n656\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n63\r\n102\r\n}\r\n330\r\n63\r\n100\r\nAcDbTableStyle\r\n280\r\n     0\r\n  3\r\nStandard\r\n 70\r\n     0\r\n 71\r\n     0\r\n 40\r\n0.06\r\n 41\r\n0.06\r\n280\r\n     0\r\n281\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.18\r\n170\r\n     2\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.25\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.18\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\n2dWireframe\r\n 70\r\n     4\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBasic\r\n 70\r\n     7\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n35\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBrighten\r\n 70\r\n    12\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n39\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nColorChange\r\n 70\r\n    16\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n32\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nConceptual\r\n 70\r\n     9\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n179.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n34\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nDim\r\n 70\r\n    11\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n-50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n41\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nEdgeColorOff\r\n 70\r\n    22\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        8\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n38\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFacepattern\r\n 70\r\n    15\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlat\r\n 70\r\n     0\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlatWithEdges\r\n 70\r\n     1\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraud\r\n 70\r\n     2\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraudWithEdges\r\n 70\r\n     3\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n31\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nHidden\r\n 70\r\n     6\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nJitterOff\r\n 70\r\n    20\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n       10\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n37\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nLinepattern\r\n 70\r\n    14\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n40\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nOverhangOff\r\n 70\r\n    21\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        9\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n33\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nRealistic\r\n 70\r\n     8\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded\r\n 70\r\n    27\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  7895160\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded with edges\r\n 70\r\n    26\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShades of Gray\r\n 70\r\n    23\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nSketchy\r\n 70\r\n    24\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n       11\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n36\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nThicken\r\n 70\r\n    13\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n       12\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n30\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nWireframe\r\n 70\r\n     5\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nX-Ray\r\n 70\r\n    25\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.5\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n351\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1:1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nImperial24\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nImperial24\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n353\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n354\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n15\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n352\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n350\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARY\r\n  5\r\n1A\r\n330\r\n19\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n1C\r\n  3\r\nDIFFUSETILE\r\n360\r\n1B\r\n  3\r\nOPACITYTILE\r\n360\r\n1F\r\n  3\r\nREFLECTIONTILE\r\n360\r\n1E\r\n  3\r\nREFRACTIONTILE\r\n360\r\n20\r\n  3\r\nSPECULARTILE\r\n360\r\n1D\r\n  0\r\nDICTIONARY\r\n  5\r\n12\r\n330\r\n11\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n14\r\n  3\r\nDIFFUSETILE\r\n360\r\n13\r\n  3\r\nOPACITYTILE\r\n360\r\n17\r\n  3\r\nREFLECTIONTILE\r\n360\r\n16\r\n  3\r\nREFRACTIONTILE\r\n360\r\n18\r\n  3\r\nSPECULARTILE\r\n360\r\n15\r\n  0\r\nDICTIONARY\r\n  5\r\n22\r\n330\r\n21\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n24\r\n  3\r\nDIFFUSETILE\r\n360\r\n23\r\n  3\r\nOPACITYTILE\r\n360\r\n27\r\n  3\r\nREFLECTIONTILE\r\n360\r\n26\r\n  3\r\nREFRACTIONTILE\r\n360\r\n28\r\n  3\r\nSPECULARTILE\r\n360\r\n25\r\n  0\r\nDICTIONARY\r\n  5\r\n656\r\n330\r\n64\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP\r\n360\r\n657\r\n  0\r\nXRECORD\r\n  5\r\n1C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n20\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n14\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n13\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n17\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n16\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n18\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n15\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n24\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n23\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n27\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n26\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n28\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n25\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nCELLSTYLEMAP\r\n  5\r\n657\r\n102\r\n{ACAD_REACTORS\r\n330\r\n656\r\n102\r\n}\r\n330\r\n656\r\n100\r\nAcDbCellStyleMap\r\n 90\r\n        3\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n    32768\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n55\r\n144\r\n0.25\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     0\r\n 94\r\n        0\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        1\r\n 91\r\n        1\r\n300\r\n_TITLE\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n55\r\n144\r\n0.18\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     0\r\n 94\r\n        0\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        2\r\n 91\r\n        1\r\n300\r\n_HEADER\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        2\r\n 62\r\n     0\r\n340\r\n55\r\n144\r\n0.18\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     0\r\n 94\r\n        0\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        3\r\n 91\r\n        2\r\n300\r\n_DATA\r\n309\r\nCELLSTYLE_END\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nACDSDATA\r\n 70\r\n     2\r\n 71\r\n     8\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        0\r\n  1\r\nAcDb_Thumbnail_Schema\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n 91\r\n        8\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 91\r\n        0\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        1\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        2\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        3\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        4\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n282\r\n     1\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        1\r\n  1\r\nAcDbDs::TreatedAsObjectDataSchema\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        2\r\n  1\r\nAcDbDs::LegacySchema\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        3\r\n  1\r\nAcDbDs::IndexedPropertySchema\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        4\r\n  1\r\nAcDbDs::HandleAttributeSchema\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n 91\r\n        1\r\n284\r\n     1\r\n  0\r\nACDSRECORD\r\n 90\r\n        0\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n320\r\n72\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 94\r\n     3606\r\n310\r\n89504E470D0A1A0A0000000D4948445200000100000000A50803000000840AD3BD00000300504C5445212830FFFFFF2128300000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099\r\n310\r\n000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00\r\n310\r\n33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066\r\n310\r\nFF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00\r\n310\r\n33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333\r\n310\r\nFF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB\r\n310\r\nBBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF0000000000000000000000000000000000000000000000000000000000002E4550F100000AD14944415478DAED9DDB7ADC360C84F1FEEF3BF7BDC8AE38FF80B29D7E962269C98BA475DCD404411C6606DCAACB2CD587AF8F37C0B2803EDD16FAB8FD6BFEAFFA98F3D7D402FA94A3\r\n310\r\n573B697D8CFBEB75FA9A7FF9F9DBD79FD3EF57E053B6FFE7ACFB7E3F62FFAFED57BF029AF8BF9EB7FF3203607F9A6D57CFDBFF6BA3D2A4F87BBC01F4B2C0F68BA224D0B30DA03FD1FFB57D8F82DA6907F428336C5EAF9729D436F86803684481F7E1BF7ED56E3FA4079588DBA51F8960FB7D72E79F6680D7C15B22788743D5\r\n310\r\n9E01C4D8A0DB5F7FDBBF4624DC6F8935AECDDD0DA057D0F3F4B7D5C33303E8BD46F2BCA301D48FDF9CE09508D52D355284BC44D43D0D206BFE6D677AF584E903329B8DFFF65D3FDC37EF6DF9DFCBA0DABD03304045BAD0CD6E40855B3BF2A1392CF476125F23336ADA375EF706680BE21AFBDBDCDF6B21310C9875861124DD\r\n310\r\n0635D2386179DC6788DF22A17DF59D2A84AF6E15E43D0C6027EFBB6EADB0467E18DF3F5A86F1553652374A82F867CDCA5CA1D25179A10C03DC69FB3303A81C1016F76F113F0DB021881A8E7593E6072E4DFF15E12101342B868B6133E936D8B150C5BCEFF9D60D72FF16EEB7BCB07D55EFD487107283ED63EB722C00D591B7\r\n310\r\nC7621F60FDC2D8FEE56FC1EB902546F50CEB6E82D7D1E3775A0239F1E27760347106FFCBB76806F01A007DAFD74F337FB972E78F90A7490EE4F75863A8C81BD62E5900B8F205F03656F2F86EED8DF7054114F856C7DF4803086DF645B7AF2A5CFB8101A01218DF3F921F4A6245916CAE724537B052D532FDD6F8D7C87F7619\r\n310\r\n46681C6E63D71DC160408B57BC069EB98AF1CB8F8D1192316E04018DCE77DC046D7C8AAE481990F679C76B1C19208E11D0B69AC9AA4801064101AD51175D28273AEDE355CB56F3A180B16A6F34C4E34FE580B0125B9398232F51178D3374DAC7C980F45CC97D7F739871A8EDBA6FE5B4A282BC407F280F79A47D46F873AA63\r\n310\r\n14C706110BBC90C6252A7A0620B62B9820690FD23E2A730877E4F2E8E7B0AF5544C4C51C20F5303A01D83B3479F4FE9DF0F0A377436CF1CBCD52CE121BFEE9B97FD8766200014B3EDF00F2D6B6D13E02BE9F6DB2E11C88916269CCDA71BA1C82208FA2B3DCDFDB9A0DF2F568874EB03CCE032F0404EEDD83125D01A852492D\r\n310\r\nEF63CC4740DF35A17DBC700F61A0F28C06645295189A5037B9FB4F0984DCB20E8EFE5B8E6BB40F2D529EDF4877AAB92D00D2E147BBBBE44E15B4C4C1C89F00654D681F5E7D23FBE53FE1CF8E12A039551715EE53A778806CFF4EFB94036216C23BE03961BFE6776060A98AE6389976F2E93AF0ECADBF99D03E860CB423AE59\r\n310\r\n9CD6D48DDD5980A7A8106D81A21E1EFCEA47B48FE23B2AC42EEA0668996D800756368ECA19D5A42591C3D964049ABE9B06EFCE62DD5E3EA7310A10A2E10BA3F35009ADF3090E10675F13325CD1D9E73F55C5558850EE95A3D14284898A8DF6E82F8EAE84B45F71F0CF334D894AC922FF81EB8124C11A93F120AEDE191EA089\r\n310\r\n13F7BB41984BD006740F50444113D6421D11F51F0AEC405F8EF3800C546E13F88654510008B9B27AEC0E5110F2A380BCAB100A81238B78F4AFEF5B931A8E91DF51020081CE050611E03CA11389C5146FA56175A911F414BF7705E26FA2EF9A08B6931FEE9EAE08A9D843E4C81990686201D3DE0B15D9B0085BED23BBA0F26A\r\n310\r\n043805986F737AF77D870012F0291E22EA696B3A70A7786487B502AD139110B706B4AF6008AD7740CD509440A9A019823F089C79BB157E81EAB8FD23E9D86938004A329C45E3D00A96CBC09A52260BC24E427A99E824E2910668999D20A7835FAE8AF44E824A08A9FA90442265BC5056845AB71D94C171AD50B017EE1168E0\r\n310\r\n90FF58F56380320B656EC65914DC419F372530775815E4618711DCF7AF11F445F2B38A6532549213A8AC3CBE9277710B39E14E00ED8846B8A0DA7422B7880218D8A9FA5E0DDF0493211614CB48E60082003A7016D95D0D3AA7860238F759DFAAE15BEFC8B0E215EE88B48EC27B8516E2B3034280F8B314128F6747EBE9F6D5\r\n310\r\nF0ADE225D217C88B438BAA2E9E22C9769C053CD99722B17BA062A7E0DC61658F4CEC03F87761CA4806BB3615FEF19A4AA7EA0BDBB7E41CCC664B9C5FA8E1A3ED909AA984BA93D07A33F1818488B3F55EC11837D0045073357CC570915D6CEA4891F4CA61D1D11BBB1CB78E0C84A87CCB8FC67E8A718EC00E77D5F0AEAB055D\r\n310\r\nA2E050C46A802D918E2745C07023CB95E7AE4C5354C3430BE089DE815F844E20EED1358CE2E1F83123FA80C880C44F9CE8463C21209CBFC79542CD986D2E206097E344DD7C6439EC099BC894C8FA89B478BAB247EEBDD84603C02812A090D219AA89361393D32F3302FB276AF81EDB3CAE5A928751440EF60CFDD450BE5BA8\r\n310\r\n4E4C203090E0CD70ED2115989E7509B9DF47CC2CDA9CA40C495D405292A99B54277A29064536534C5125E75621ADB53B70A67C6E3800077C2C034EAF8232FD830A8202A89470A21AF52DAFB689B99FA48FB1C8D3AAF40AD6BC122B6A9DEC8ECCA2DD3397E62B84D9670928A34AA93851474A03FEFD420D3FA7BEC97E26F718\r\n310\r\n22A3B36E8072FC0F92A8F8D1BCA70D070292C7D16AD451A5404BED7F550D3F3F2906FA152D0F465FAA3EECBB34A1BE890729439C729E26C42027CC97B2F776A14A8C3E29F1390EBF886A7182F9E2F015E4F4C416831D3AE9F00392953B63FEA44AD904026891F42F4E0CC5CCD9BCBB0E51D239812FE8BA06E8A53C9CDA078C\r\n310\r\n96841ABE280D7628BA89A75C28A2130A604D1A63F93381D10D00A30BF82349DC16DD425E18D85FFAC909B324D25E472062BEE6C8D1B256A310C890A954A12E0C40A0F7BDE68A3A77FB0DE49023C0217E5012AB5D0D4F42201E9EF420CBD92429F431272E35051CB8DD89FA2388601AD7F37D506C22E292028D9322E00E3E5A\r\n310\r\n5358122C6AED68237D77224B50607E434114E16EE799CE935C80905C6A9BD42B810A892CC4D0D5F875A06A21C4FEEE929E668050252803C477CC6FC5E86C8F6DC8217BA7AD7F1004C8D21AB09F7DF10EF38B71A3E87571417E3600A0F33DC047E4F8469604C01339CC107CBC1E33D11E63DA96D2C07FBFBA845D2168F0915F\r\n310\r\n777947892805E8738813CEF03223933DB687A4C5A442F1B6000EBB1044013C03E4BA9801F27D1455F87A390DD4FE13BCAC01569CF45045C577A5D77438F518C783C93E95A274A83E0112F3507307B9D4FC78F062D6F5785914FD820D7C021129529E2D354C5EDEB99607B497C27CB681D46ED33D16F8D47D76E45A2160E201\r\n310\r\nC6EAF9CC200D10121A1A804F08B559B46B3DC59FF296E87330E5132C09852431171D89C5BBECAB3900B27B8AC4BD36267096F0A14702C602CA108F9580FEBF34E828B9F80E6A84B8D0C756BCB335354010AF357D8AF20A06988A3551C8CCB0644B1C7DF07EC68EE8626FEAA953251487A97A4F3F796CD6C135C57C503C9671\r\n310\r\nDDE7B4829BDD1D5F8A2701E403103153E5D335B841573540E9275A657F56D00B65764DDE4E4A670D44FFFEBDD8A7D5F28925E5749CFBC7E9DCF7C1D44A80E4B17D3EA50A16FE091FB880FDF0F1B5AAD600544D3E8FE4EE06C81931A2E83E0E10BCCBFDFDBFAA7FDC9A889EA1F46DEF6C3DE10ECCC61DB726A9BD3618EFF2D5\r\n310\r\nE3AE00E66B85F767DB8353F51C03B48A08A2378C57DEED51E9BF2A131C2C76DD77710AF24EEFAAFFAD01381E335308B89CFC710600D1998C5F3CA2F09C8F1E532F8A82EEEEA0D3931CA07FBCD4D70D8E1E5300ED18E0874F3E3DC8049AB486BFD265DE32067CF8A7AE7FFC87CEAFB5D65A6BADB5D65A6BADB5D65A6BADB5D6\r\n310\r\n5A6BADB5D65A6BADB5D65A6BADB5D65A6BADB5D65A6BADB5D65A07AEFF00554FE27454DCB1F00000000049454E44AE426082\r\n  0\r\nENDSEC\r\n  0\r\nEOF\r\n"
  },
  {
    "path": "testdata/barnsbury_extended1_axial.csv",
    "content": "Ref,x1,y1,x2,y2,Connectivity,Line Length\n0,530635.696268,184468.675646,530732.377854,183731.866556,8,743.12512\n1,530655.080407,184267.843134,531386.664678,184568.766995,9,791.0567\n2,530781.419478,184322.997346,530814.78724,184178.968574,4,147.84348\n3,530667.76131,184203.901437,531124.686107,184392.857349,5,494.45386\n4,530798.725861,184207.390438,530856.762846,184149.487013,3,81.982307\n5,530747.870324,184145.998012,530810.755405,184207.340453,3,87.848892\n6,530753.938689,184164.022852,530781.427723,183967.049235,3,198.88251\n7,530638.070845,184123.954322,531070.977779,184116.826362,7,432.96561\n8,530837.494138,183967.908989,530855.674498,184153.675814,3,186.65433\n9,530776.925919,183970.168342,530838.112518,183968.488823,3,61.209644\n10,530803.879024,183673.983124,530817.351454,183970.908131,5,297.2305\n11,530803.31836,183742.403539,530916.415863,183745.002795,2,113.12737\n12,530912.186147,183663.646083,530932.996681,184479.606956,10,816.2262\n13,530995.213912,184191.1051,531426.867596,184272.091918,4,439.18533\n14,530992.995991,184260.565217,531006.303519,184067.090599,2,193.93173\n15,531065.503058,184264.454104,531069.386482,184200.262479,3,64.308983\n16,531014.260003,184282.658893,531076.262863,184252.777446,2,68.827721\n17,531055.856337,184254.05708,531446.820644,184352.768824,4,403.23331\n18,531101.674141,184455.949289,531227.444303,184068.530187,8,407.3226\n19,531214.16151,184067.600453,531445.270572,184127.80322,7,238.82162\n20,531166.28244,183883.173244,531225.605654,184081.636435,7,207.13977\n21,531103.958023,183944.145791,531189.244935,183939.966987,1,85.389229\n22,531199.126896,184509.586323,531222.402703,184422.521245,2,90.122643\n23,531332.577077,184583.962646,531443.794706,184125.074001,10,472.17386\n24,531026.454449,184114.297086,531441.626255,184200.71235,6,424.06982\n25,531379.087467,183726.907975,531438.204555,184206.79061,11,483.51025\n26,531367.365093,183473.836019,531409.569458,184011.596484,10,539.41406\n27,531287.1303,183716.111065,531396.253684,183759.488649,5,117.42882\n28,531294.394199,183777.773415,531391.413833,183726.268158,5,109.84353\n29,531303.999695,183967.539095,531311.931444,183765.686875,4,202.008\n30,531069.774,183880.95388,531403.294966,183913.414588,9,335.09689\n31,531055.773886,183973.477395,531081.160429,183854.721389,3,121.43914\n32,530979.070082,183853.471746,531006.056167,183971.198048,2,120.77968\n33,531002.370625,183965.559662,531057.760946,183972.597647,2,55.835659\n34,530675.049944,183881.16382,531237.536258,183892.420597,10,562.59894\n35,531246.803707,183901.647956,531247.100529,183877.364907,1,24.284863\n36,531378.13104,184039.148597,531423.297484,184035.389673,2,45.32259\n37,531365.837654,184048.645878,531385.988583,184035.489644,2,24.065462\n38,531360.008395,184112.477607,531368.607994,184041.148025,2,71.8461\n39,531176.638237,183932.709065,531212.594948,183499.852969,6,434.34695\n40,531191.28971,183523.406227,531385.782456,183575.241389,4,201.28168\n41,530904.180192,183681.79089,531226.595062,183515.558473,5,362.74588\n42,531087.294754,183504.461649,531157.699331,183893.960157,3,395.81042\n43,531029.208299,183891.140964,531030.230687,183855.631128,1,35.524551\n44,531182.681866,183748.751722,531275.851057,183743.153325,3,93.337242\n45,531240.760077,183741.113908,531312.920852,183782.89195,4,83.382149\n46,531238.319539,183754.010217,531308.056265,183714.501526,4,80.15078\n47,531293.948966,183547.909213,531303.282375,183726.188181,3,178.52312\n48,530707.321114,183575.611283,530731.660534,183750.551207,2,176.62498\n49,530711.864142,183690.118506,530973.265559,183658.367594,4,263.32266\n50,531139.131454,184142.888902,531154.533228,184098.471616,2,47.011806\n51,531091.400795,184089.16428,531155.786477,184099.901207,1,65.274788\n52,531060.226219,184127.683254,531065.651469,184023.503075,3,104.32134\n53,530915.104898,184035.689587,531213.139122,184017.404821,3,298.5946\n54,531281.498924,184088.374506,531294.732247,184020.813845,2,68.84449\n55,531263.310319,184015.655322,531322.328466,184027.032065,3,60.104675\n56,531267.276193,184023.293136,531279.998323,183953.103227,2,71.333557\n57,531276.790994,183954.982689,531332.164824,183964.220045,3,56.139023\n58,531315.938544,184033.420237,531330.606508,183957.32202,2,77.498955\n59,530805.297175,183814.47291,530917.998915,183816.172423,2,112.71455\n60,531137.25158,184338.103022,531389.731841,184417.270361,2,264.6011\n61,531482.315148,184748.987159,531515.68291,184604.958387,3,147.84348\n62,531368.65698,184629.89125,531825.581777,184818.847162,4,494.45386\n63,531499.621531,184633.380251,531557.658516,184575.476826,3,81.982307\n64,531448.765994,184571.987825,531511.651075,184633.330266,3,87.848892\n65,531455.263586,184588.241656,531482.75262,184391.268039,3,198.88251\n66,531253.867502,184551.34532,531771.873449,184542.816175,8,518.07617\n67,531538.389808,184393.898802,531556.570168,184579.665627,3,186.65433\n68,531477.821589,184396.158155,531539.008188,184394.478636,3,61.209644\n69,531504.774694,184099.972937,531518.247124,184396.897944,5,297.2305\n70,531504.21403,184168.393352,531617.311533,184170.992608,2,113.12737\n71,531613.081817,184089.635896,531633.892351,184844.909702,11,755.56042\n72,531696.109582,184617.094913,532336.825597,184713.631764,7,647.94781\n73,531693.891661,184686.55503,531707.199189,184493.080412,3,193.93173\n74,531766.398728,184690.443917,531770.282152,184626.252292,3,64.308983\n75,531715.155673,184708.648706,531777.158533,184678.767259,2,68.827721\n76,531756.752007,184680.046893,531893.049669,184714.459702,3,140.57487\n77,531802.569811,184881.939102,531928.339973,184494.52,7,407.3226\n78,531915.05718,184493.590266,532146.166242,184553.793033,5,238.82162\n79,531867.17811,184309.163057,531926.501324,184507.626248,7,207.13977\n80,531804.853693,184370.135604,531890.140605,184365.9568,1,85.389229\n81,531914.954989,184937.248897,531938.230796,184850.183819,1,90.122643\n82,531727.350119,184540.286899,532142.521925,184626.702163,5,424.06982\n83,531988.02597,184142.100878,532097.149354,184185.478462,4,117.42882\n84,531995.289869,184203.763228,532092.309503,184152.257971,4,109.84353\n85,532004.895365,184393.528908,532012.827114,184191.676688,4,202.008\n86,531770.66967,184306.943693,532197.700686,184339.404401,9,428.263\n87,531756.669556,184399.467208,531782.056099,184280.711202,3,121.43914\n88,531679.965752,184279.461559,531706.951837,184397.187861,2,120.77968\n89,531703.266295,184391.549475,531758.656616,184398.58746,2,55.835659\n90,531375.945614,184307.153633,531938.431928,184318.41041,10,562.59894\n91,531947.699377,184327.637769,531947.996199,184303.35472,1,24.284863\n92,532079.02671,184465.13841,532156.350838,184461.379486,1,77.415443\n93,532066.733324,184474.635691,532086.884253,184461.479457,2,24.065462\n94,532060.904065,184538.46742,532069.503664,184467.137838,2,71.8461\n95,531877.533907,184358.698878,531913.490618,184005.483699,5,355.04062\n96,531605.075862,184107.780703,531784.325886,184010.332886,5,204.02609\n97,531761.919063,183988.762648,531858.595001,184319.94997,5,345.00909\n98,531730.103969,184317.130777,531731.126357,184281.620941,1,35.524551\n99,531883.577536,184174.741535,531976.746727,184169.143138,3,93.337242\n100,531941.655747,184167.103721,532013.816522,184208.881763,4,83.382149\n101,531939.215209,184180.00003,532008.951935,184140.491339,4,80.15078\n102,531994.844636,184026.539839,532004.178045,184152.177994,3,125.98436\n103,531409.165843,184133.61755,531674.161229,184084.357407,7,269.535\n104,531840.027124,184568.878715,531855.428898,184524.461429,2,47.011806\n105,531792.296465,184515.154093,531856.682147,184525.89102,1,65.274788\n106,531761.121889,184553.673067,531766.547139,184449.492888,3,104.32134\n107,531616.000568,184461.6794,531914.034792,184443.394634,3,298.5946\n108,531982.394594,184514.364319,531995.627917,184446.803658,2,68.84449\n109,531964.205989,184441.645135,532023.224136,184453.021878,3,60.104675\n110,531968.171863,184449.282949,531980.893993,184379.09304,2,71.333557\n111,531977.686664,184380.972502,532033.060494,184390.209858,3,56.139023\n112,532016.834214,184459.41005,532031.502178,184383.311833,2,77.498955\n113,531506.192845,184240.462723,531618.894585,184242.162236,2,112.71455\n114,531838.14725,184764.092835,532090.627511,184843.260174,3,264.6011\n115,531898.14101,185489.577346,532384.945646,183588.377395,18,1962.5341\n116,532034.570496,184072.765934,532153.818761,183879.247573,2,227.30927\n117,531848.44415,184056.30916,531872.755533,183888.256031,4,169.80252\n118,531400.054039,183972.757185,532184.244392,184077.342903,11,791.13379\n119,531934.003528,183974.894229,532082.780772,183561.676249,4,439.18533\n120,531813.343861,183944.172569,532002.221345,183988.159089,2,193.93173\n121,531954.870458,183903.130736,532017.621625,183917.199738,3,64.308983\n122,532007.80999,183904.715765,532027.422876,183970.689929,2,68.827721\n123,532005.819462,183925.065251,532165.607001,183554.842291,4,403.23331\n124,531850.025607,183726.090547,532215.340633,183914.50679,8,411.04227\n125,531846.989846,183739.055158,531943.272396,183520.502093,6,238.82162\n126,531657.287906,183756.915025,531862.671007,183729.995445,7,207.13977\n127,531707.542847,183828.164062,531717.01638,183743.301986,1,85.389229\n128,531940.34277,183521.523908,532612.061879,183803.786692,10,728.61432\n129,531863.159436,183931.80645,532014.667663,183535.72504,6,424.06982\n130,531536.953309,183521.916305,532020.122575,183540.072134,8,483.51025\n131,531322.823096,183496.217515,531822.859891,183537.217461,5,501.71484\n132,531511.632096,183610.975442,531571.854282,183510.164649,5,117.42882\n133,531538.287099,183509.645622,531573.66377,183613.636448,5,109.84353\n134,531564.528151,183594.396389,531762.533216,183634.411704,4,202.008\n135,531647.800083,183818.5796,531724.933652,183527.756719,8,300.87793\n136,531562.202013,183850.065477,531683.634527,183848.796579,2,121.43914\n137,531554.551076,183899.243828,531664.561818,183949.097288,2,120.77968\n138,531559.344147,183903.976806,531563.459261,183848.292996,2,55.835659\n139,531576.977884,184241.542411,531576.980112,184241.530177,1,0.012435302\n140,531664.440206,183676.204772,531688.365256,183680.369694,1,24.284863\n141,531845.046699,183572.646808,531848.537589,183527.458858,2,45.32259\n142,531842.687431,183564.306378,531852.462311,183586.297243,2,24.065462\n143,531845.502111,183582.366824,531914.547926,183602.2298,2,71.8461\n144,531365.756011,183674.793817,531707.841194,183754.590132,5,351.26874\n145,531374.060775,183774.507149,531666.56825,183767.108281,4,292.60104\n146,531608.404903,183886.834614,531643.297417,183893.505914,1,35.524551\n147,531527.201005,183719.292094,531536.529925,183626.42223,3,93.337242\n148,531528.921394,183660.739083,531581.670868,183596.162963,4,83.382149\n149,531513.379763,183590.060561,531541.26357,183665.204695,4,80.15078\n150,531346.669404,183577.424472,531524.155712,183596.636795,3,178.52312\n151,531867.958408,183802.842932,531909.351639,183825.129931,2,47.011806\n152,531848.703773,183863.683623,531869.569538,183801.833663,1,65.274788\n153,531779.776929,183878.633935,531881.759204,183900.601153,3,104.32134\n154,531767.803098,184029.197571,531797.273386,183732.060846,5,298.5946\n155,531813.648701,183652.055167,531878.234973,183675.891635,2,68.84449\n156,531803.545994,183682.252572,531824.187543,183625.803494,3,60.104675\n157,531744.455054,183655.80423,531811.718445,183679.555275,2,71.333557\n158,531745.799066,183659.270202,531763.747518,183606.077695,3,56.139023\n159,531756.689274,183606.516194,531829.475123,183633.130249,2,77.498955\n160,532101.768494,183858.112362,532220.180595,183621.485389,2,264.6011\n161,531603.201562,184097.54814,531677.778268,183688.047288,9,416.23627\n162,530283.954463,184816.224091,530735.913127,184226.335686,8,743.12512\n163,530031.188827,184139.955564,532155.727239,185032.528489,15,2304.4197\n164,530658.07799,184557.915926,530736.182459,184432.387497,4,147.84348\n165,530571.605016,184436.422319,531028.529813,184625.378231,5,494.45386\n166,530666.7819,184526.451467,530666.970866,184608.433553,3,81.982307\n167,530587.419247,184533.993682,530675.26257,184534.983211,3,87.848892\n168,530484.78534,184684.376675,530604.445957,184525.51954,3,198.88251\n169,530494.120564,184472.048499,530795.550319,184782.852818,7,432.96561\n170,530525.083202,184723.367243,530669.158913,184604.69952,3,186.65433\n171,530483.801413,184678.989008,530525.930499,184723.393522,3,61.209644\n172,530293.689137,184907.701657,530512.942029,184707.017488,5,297.2305\n173,530341.616956,184858.869376,530423.516952,184936.909058,2,113.12737\n174,530363.061129,184991.515821,530950.638138,184434.164686,10,809.86853\n175,530794.377847,184676.757956,531157.155075,184924.298761,4,439.18533\n176,530714.63809,184772.38299,530841.86679,184626.019141,2,193.93173\n177,530853.353986,184722.66267,530895.942795,184674.477205,3,64.308983\n178,530872.524608,184625.397132,530895.312774,184690.342917,2,68.827721\n179,530881.770348,184675.02409,531228.261643,184881.278496,4,403.23331\n180,530872.205195,184927.553625,531056.800416,184564.460939,8,407.3226\n181,530862.145357,184918.830286,531068.273127,185039.441704,7,238.82162\n182,530697.991446,185015.573733,530880.160401,184916.976808,7,207.13977\n183,530696.935008,184928.390774,530754.360003,184991.58642,1,85.389229\n184,531185.28388,184712.955635,531230.299717,184634.880893,1,90.122643\n185,531065.300707,185040.331386,531310.676276,184636.92219,8,472.17386\n186,530762.244887,184753.196919,531117.1883,184985.253807,6,424.06982\n187,530857.793097,185213.727228,531119.059025,184978.53416,7,351.53329\n188,530551.230991,185447.375269,530733.983907,185290.855505,6,240.61809\n189,530348.818115,184670.043145,530754.964885,185059.353265,7,562.59894\n190,530751.101941,185076.766671,530768.042714,185059.366534,0,24.284863\n191,530958.127638,185054.782177,530999.561686,185101.458496,2,62.413612\n192,530956.132728,185039.376138,530961.105876,185062.922141,2,24.065462\n193,530952.798246,185046.640697,530997.089847,184990.071126,2,71.8461\n194,530292.86417,185138.907267,530369.446508,185353.216185,2,227.58112\n195,530279.260644,185168.084421,530370.209055,184973.016186,4,215.22832\n196,530155.854559,184909.143223,530296.643458,184802.490186,2,176.62498\n197,530239.94609,184831.289787,530402.572415,185038.392418,5,263.32266\n198,530841.737233,184854.861003,530862.205515,184812.538912,2,47.011806\n199,530790.470732,184816.859996,530843.634143,184854.734123,1,65.274788\n200,530725.866309,184845.156464,530795.607182,184767.573259,3,104.32134\n201,530627.898364,184730.199677,530825.968862,184953.642755,4,298.5946\n202,530886.13816,185008.857925,530924.487493,184951.683697,2,68.84449\n203,530860.25048,184990.316729,530910.065992,185023.946875,3,60.104675\n204,530827.884295,185046.385296,530868.452527,184987.710817,2,71.333557\n205,530826.941205,185042.789476,530872.665797,185075.360191,3,56.139023\n206,530866.690618,185079.142828,530910.054337,185014.911405,3,77.498955\n207,531280.890316,184879.402502,531418.783795,184696.340072,3,229.18652\n208,531365.823685,184738.325775,531592.602283,184976.32175,6,328.74097\n209,531322.135167,184916.836174,531466.210877,184798.168452,2,186.65433\n210,531280.853377,184872.45794,531322.982463,184916.862454,3,61.209644\n211,531090.741101,185101.170589,531309.993993,184900.48642,4,297.2305\n212,531234.61837,185110.479476,531708.28843,184665.008406,9,650.23676\n213,531591.429811,184870.226888,531810.671873,185019.826566,3,265.41882\n214,531511.690054,184965.851921,531638.918754,184819.488073,3,193.93173\n215,531650.40595,184916.131602,531692.994759,184867.946136,3,64.308983\n216,531669.576573,184818.866063,531692.364738,184883.811849,3,68.827721\n217,531678.822312,184868.493022,532025.313608,185074.747427,4,403.23331\n218,531669.25716,185121.022557,531803.886243,184855.964934,6,297.28864\n219,531659.197321,185112.299218,531865.325091,185232.910635,4,238.82162\n220,531525.017578,185192.81948,531677.212366,185110.445739,6,173.05688\n221,531361.980864,184957.783264,531551.411968,185185.055352,4,295.86609\n222,531559.296851,184946.66585,531914.240265,185178.722739,4,424.06982\n223,531495.587084,185514.328262,531683.190124,185202.326857,6,364.06012\n224,531462.599703,185412.663349,531570.487702,185459.028287,4,117.42882\n225,531511.293539,185374.141666,531543.598132,185479.127446,4,109.84353\n226,531145.870079,184863.512077,531379.525038,185080.330385,4,318.7551\n227,531313.34303,185456.733951,531364.882898,185058.167136,5,401.88538\n228,531306.054288,185343.694337,531471.261897,185366.875736,4,166.82605\n229,531447.432504,185362.212424,531528.024132,185383.603353,4,83.382149\n230,531454.813342,185351.359118,531476.276843,185428.582597,4,80.15078\n231,531385.807059,185499.287467,531481.151482,185416.937606,3,125.98436\n232,531046.820419,185009.825167,531131.431446,185132.77165,5,149.24767\n233,531638.789198,185048.329935,531659.257479,185006.007844,2,47.011806\n234,531587.522697,185010.328928,531640.686107,185048.203055,1,65.274788\n235,531522.918273,185038.625395,531592.659147,184961.042191,3,104.32134\n236,531424.950328,184923.668608,531623.020826,185147.111687,3,298.5946\n237,531683.190124,185202.326857,531721.539458,185145.152628,2,68.84449\n238,531522.475126,185175.01268,531707.117957,185217.415806,4,189.4492\n239,531190.971716,185002.716462,531271.956062,185081.113568,2,112.71455\n240,531383.970056,186031.229354,531510.979479,185470.505352,6,574.92853\n241,531394.31707,185715.840841,531446.57893,185494.621034,2,227.30927\n242,531201.708933,185510.951124,531303.192797,185374.811772,3,169.80252\n243,531179.130486,185309.154054,531945.523583,185894.409458,13,964.30402\n244,531119.729967,185890.482946,531306.259495,185492.876981,4,439.18533\n245,531199.143477,185429.404668,531363.921212,185531.668132,2,193.93173\n246,531270.345734,185558.418033,531324.705449,185592.778869,3,64.308983\n247,531308.942264,185594.686673,531369.423608,185561.834543,2,68.827721\n248,531173.537681,185953.820275,531321.905785,185578.874941,4,403.23331\n249,531071.081902,185609.697629,531458.962707,185734.036583,8,407.3226\n250,530991.888039,185821.097506,531078.08961,185598.37557,6,238.82162\n251,530956.409773,185451.747407,531082.791848,185615.8646,7,207.13977\n252,530989.078083,185503.570056,531042.308887,185436.803289,1,85.389229\n253,530990.535791,185818.304973,531427.908644,185996.218258,7,472.17386\n254,531053.182121,185860.746689,531225.67492,185473.343204,5,424.06982\n255,530705.244826,185533.116831,531060.114084,185861.522043,8,483.51025\n256,530721.65189,185566.086325,530750.221062,185452.185798,4,117.42882\n257,530697.522371,185542.745556,530796.014069,185494.11443,4,109.84353\n258,530775.957685,185501.282477,530944.392205,185612.803972,4,202.008\n259,530842.445203,185661.751105,530993.246275,185401.392558,7,300.87793\n260,530866.53772,185054.496792,530910.763225,185339.341033,5,288.25708\n261,531241.837484,185051.9572,531241.844548,185051.946966,1,0.012435302\n262,530922.274679,185514.972524,531058.699701,185297.133443,5,257.03241\n263,530904.468114,185513.935543,530924.34682,185527.885154,1,24.284863\n264,530929.736723,185749.262318,530959.18129,185714.807208,2,45.32259\n265,530951.620343,185719.045249,530974.072142,185710.381351,2,24.065462\n266,530966.368846,185708.247852,531029.276911,185742.952862,2,71.8461\n267,530692.026577,185303.976423,530990.555487,185489.098583,6,351.26874\n268,530835.94378,185306.864232,530970.178935,185451.086004,3,197.02538\n269,530668.7796,185311.512872,531368.109166,185350.571812,10,700.41949\n270,530778.756701,185458.835796,530837.745708,185386.502282,3,93.337242\n271,530789.341101,185512.139628,530797.608142,185429.168318,4,83.382149\n272,530736.68628,185468.226257,530809.499457,185434.724184,4,80.15078\n273,530609.743661,185359.425586,530748.959542,185471.181754,4,178.52312\n274,531137.98644,185568.028734,531183.03071,185581.486954,2,47.011806\n275,531138.414156,185569.881144,531167.326902,185511.35892,2,65.274788\n276,531037.954234,185568.212706,531226.956583,185337.048601,4,298.5946\n277,530905.703102,185592.17185,531055.596881,185665.158545,2,166.71893\n278,531259.240929,185945.187025,531342.541952,185694.040277,2,264.6011\n279,530564.955234,184893.47949,530687.494969,184780.983957,2,166.34673\n280,530406.734043,184768.71716,530476.74297,184939.450519,2,184.52948\n281,531070.732747,185471.568523,531173.366327,185528.106492,2,117.17591\n282,531054.947555,184568.105455,531230.772586,184476.728485,3,198.15195\n283,533270.701887,183269.704674,533995.226148,183104.47889,8,743.12512\n284,533457.921448,183355.764288,533604.573756,183337.034753,3,147.84348\n285,533511.624314,183701.926679,533530.131552,183207.819313,5,494.45386\n286,533572.342952,183331.843845,533646.798158,183366.158863,3,81.982307\n287,533576.567617,183343.107265,533612.252246,183262.832514,3,87.848892\n288,533597.456849,183274.783083,533791.716865,183232.153296,3,198.88251\n289,533594.791129,183152.211723,533751.821496,183555.697392,7,432.96561\n290,533642.492107,183366.593004,533810.382168,183285.028513,3,186.65433\n291,533787.228453,183229.014949,533810.053185,183285.809776,3,61.209644\n292,533800.574266,183267.181171,534074.33864,183151.426975,5,297.2305\n293,534009.982255,183174.663224,534046.822896,183281.623817,2,113.12737\n294,533363.7017,183552.296365,534121.646703,183249.402658,10,816.2262\n295,533655.853794,183510.445932,533729.818734,183943.358112,4,439.18533\n296,533589.946866,183532.48916,533776.00052,183477.77576,2,193.93173\n297,533611.481324,183601.833701,533673.02611,183583.182025,3,64.308983\n298,533576.613253,183560.102626,533626.168001,183607.868539,2,68.827721\n299,533617.880948,183589.176602,533661.093042,183990.08783,4,403.23331\n300,533444.467532,183702.258531,533851.451454,183685.651865,7,407.3226\n301,533847.710281,183672.872952,533871.517605,183910.504985,7,238.82162\n302,533838.522437,183688.479385,534004.029918,183563.923552,7,207.13977\n303,533925.207623,183526.653856,533958.745975,183605.180913,1,85.389229\n304,533207.325575,183960.304964,533517.743221,183803.863123,4,347.61066\n305,533404.613467,183963.247494,533873.564387,183908.173141,9,472.17386\n306,533738.730645,183513.06696,533801.880965,183932.408424,6,424.06982\n307,533794.992702,183931.310648,534224.474603,183709.212763,11,483.51025\n308,533968.092403,183836.668115,534457.72329,183610.329606,10,539.41406\n309,534199.883601,183736.62557,534202.663279,183619.229654,5,117.42882\n310,534147.361737,183647.456398,534229.355471,183720.549685,5,109.84353\n311,533972.743724,183722.368537,534164.786549,183659.704473,4,202.008\n312,533972.594317,183472.65139,534057.983991,183796.686166,9,335.09689\n313,533880.967657,183491.655579,534001.148439,183474.218692,3,121.43914\n314,533865.838452,183444.240875,533966.864912,183378.048841,2,120.77968\n315,533869.845916,183438.826556,533882.48274,183493.213425,2,55.835659\n316,533835.312059,183102.569364,534020.104195,183633.953815,10,562.59894\n317,534014.669713,183645.849032,534037.544378,183637.694015,1,24.284863\n318,533931.336857,183816.755233,533950.547856,183857.804894,2,45.32259\n319,533918.1613,183808.525385,533937.496942,183822.85296,2,24.065462\n320,533856.278232,183825.227352,533926.154582,183808.519327,2,71.8461\n321,533961.173903,183590.83827,534379.574955,183474.228476,6,434.34695\n322,534350.088555,183462.429267,534369.026017,183662.818101,4,201.28168\n323,534101.850875,183248.196611,534369.70918,183492.811601,5,362.74588\n324,533990.933559,183559.620921,534331.737103,183358.328008,3,395.81042\n325,533948.953082,183438.148567,533982.60772,183426.774957,1,35.524551\n326,534135.779962,183532.618397,534173.387016,183618.044094,3,93.337242\n327,534148.995999,183666.60752,534163.112597,183584.429032,4,83.382149\n328,534150.171418,183586.619216,534211.440101,183638.294124,4,80.15078\n329,534198.822923,183637.876087,534362.763695,183567.208368,3,178.52312\n330,533977.45538,183110.29529,534133.053441,183026.715223,2,176.62498\n331,534027.251348,183070.743173,534147.809166,183304.847068,4,263.32266\n332,533751.050565,183628.660294,533798.052098,183627.677537,2,47.011806\n333,533784.854581,183565.242321,533797.146736,183629.349268,1,65.274788\n334,533737.906423,183549.385586,533837.486192,183518.291973,3,104.32134\n335,533773.77426,183381.348296,533894.426477,183654.481548,3,298.5946\n336,533851.615179,183743.233739,533919.566465,183732.179943,2,68.84449\n337,533913.491248,183700.922309,533923.319298,183760.218021,3,60.104675\n338,533907.706166,183707.293901,533977.945511,183694.847607,2,71.333557\n339,533975.069147,183692.492641,533985.637771,183747.627875,3,56.139023\n340,533915.109567,183756.444407,533991.565242,183743.77091,2,77.498955\n341,533943.085985,183201.548147,533980.63292,183307.825135,2,112.71455\n342,533567.334441,183694.694167,533580.779713,183958.953461,2,264.6011\n343,533281.590018,184813.90419,533299.34,184222.454929,10,591.71558\n344,533203.504476,184131.512968,533448.516179,184142.247827,6,245.24675\n345,533355.566737,184507.139752,533425.55373,183189.45307,10,1319.5439\n346,533416.285375,184137.056918,533490.740581,184171.371937,3,81.982307\n347,533420.51004,184148.320338,533456.19467,184068.045587,3,87.848892\n348,533443.209115,184079.783606,533637.469131,184037.153819,3,198.88251\n349,533407.865187,183878.109292,533595.763919,184360.910466,7,518.07617\n350,533486.43453,184171.806078,533654.324591,184090.241587,3,186.65433\n351,533631.170876,184034.228023,533653.995608,184091.022849,3,61.209644\n352,533644.516689,184072.394244,533918.281063,183956.640049,5,297.2305\n353,533853.924678,183979.876298,533890.765319,184086.836891,2,113.12737\n354,533264.553798,184336.433171,533965.589126,184054.615732,11,755.56042\n355,533499.796217,184315.659006,533573.761157,184748.571185,5,439.18533\n356,533433.88929,184337.702234,533619.942943,184282.988833,3,193.93173\n357,533455.423747,184407.046775,533516.968533,184388.395099,3,64.308983\n358,533420.555676,184365.315699,533470.110424,184413.081613,2,68.827721\n359,533461.823371,184394.389676,533505.035465,184795.300904,4,403.23331\n360,533288.409955,184507.471605,533695.393878,184490.864939,8,407.3226\n361,533691.652704,184478.086026,533715.460028,184715.718059,7,238.82162\n362,533682.46486,184493.692459,533847.972341,184369.136626,7,207.13977\n363,533769.150046,184331.86693,533802.688398,184410.393987,1,85.389229\n364,533280.174611,184638.111522,533369.903983,184629.701356,2,90.122643\n365,533248.55589,184768.460568,533717.50681,184713.386214,11,472.17386\n366,533582.673068,184318.280034,533645.823388,184737.621498,6,424.06982\n367,533638.935125,184736.523722,534121.003937,184485.225527,11,543.63696\n368,534043.826024,184541.838644,534046.605702,184424.442728,4,117.42882\n369,533991.30416,184452.669472,534073.297894,184525.762759,4,109.84353\n370,533816.686147,184527.581611,534008.728972,184464.917547,4,202.008\n371,533816.53674,184277.864464,533901.926415,184601.899239,9,335.09689\n372,533724.91008,184296.868652,533845.090862,184279.431766,3,121.43914\n373,533709.780875,184249.453948,533810.807335,184183.261915,2,120.77968\n374,533713.788339,184244.03963,533726.425163,184298.426499,2,55.835659\n375,533679.254482,183907.782438,533864.046618,184439.166889,10,562.59894\n376,533858.612136,184451.062105,533881.486801,184442.907089,1,24.284863\n377,533775.27928,184621.968307,533794.490279,184663.017968,2,45.32259\n378,533762.103724,184613.738458,533781.439365,184628.066033,2,24.065462\n379,533700.220655,184630.440425,533770.097005,184613.732401,2,71.8461\n380,533805.116326,184396.051343,534148.833614,184307.10038,5,355.04062\n381,533945.793298,184053.409685,534099.428093,184187.659445,5,204.02609\n382,533834.875982,184364.833995,534111.873958,184159.156088,5,345.00909\n383,533792.895505,184243.361641,533826.550144,184231.988031,1,35.524551\n384,533979.722385,184337.831471,534017.329439,184423.257168,3,93.337242\n385,533992.938422,184471.820594,534007.05502,184389.642106,4,83.382149\n386,533994.113841,184391.83229,534055.382524,184443.507198,4,80.15078\n387,534042.765346,184443.089161,534157.341868,184390.703292,3,125.98436\n388,533853.526216,183878.666834,533991.751589,184110.060142,6,269.535\n389,533594.992988,184433.873368,533641.994521,184432.89061,2,47.011806\n390,533628.797004,184370.455395,533641.089159,184434.562341,1,65.274788\n391,533581.848846,184354.59866,533681.428615,184323.505047,3,104.32134\n392,533617.716683,184186.56137,533738.368901,184459.694622,3,298.5946\n393,533695.557602,184548.446813,533763.508888,184537.393017,2,68.84449\n394,533757.433671,184506.135383,533767.261721,184565.431094,3,60.104675\n395,533751.648589,184512.506975,533821.887935,184500.060681,2,71.333557\n396,533819.011571,184497.705715,533829.580194,184552.840948,3,56.139023\n397,533759.05199,184561.657481,533835.507666,184548.983984,2,77.498955\n398,533787.028409,184006.76122,533824.575343,184113.038209,3,112.71455\n399,533411.276864,184499.907241,533424.722136,184764.166535,3,264.6011\n400,534079.043875,184492.516695,534641.721189,184610.571934,10,574.92853\n401,534078.581459,184263.75404,534244.617529,184228.188309,4,169.80252\n402,534001.209547,183814.256308,534167.642419,184551.258139,11,755.56042\n403,534184.643095,184315.712944,534623.810302,184321.836821,4,439.2099\n404,534171.548117,184191.894135,534195.895544,184384.291435,2,193.93173\n405,534259.186721,184310.35799,534267.786545,184374.08937,3,64.308983\n406,534221.029704,184401.857388,534276.085944,184360.552837,2,68.827721\n407,534256.311788,184365.753465,534658.98396,184387.018927,4,403.23331\n408,534340.296458,184554.97902,534388.795247,184150.554043,7,407.3226\n409,534375.5833,184152.209774,534613.971169,184166.597117,5,238.82162\n410,534292.952711,183980.51823,534389.525079,184163.768494,7,207.13977\n411,534243.591734,184052.389493,534326.461777,184031.801248,1,85.389229\n412,534523.654664,184592.936178,534529.659313,184503.013793,1,90.122643\n413,534200.445183,184234.314318,534624.49092,184238.835314,5,424.06982\n414,534471.532711,183786.060015,534606.990485,184209.222433,7,444.31436\n415,534421.265724,183576.333035,534556.477661,184059.484692,5,501.71484\n416,534379.22304,183793.244614,534494.673805,183814.707337,5,117.42882\n417,534398.270908,183852.339354,534483.502838,183783.049247,5,109.84353\n418,534413.140645,183837.090409,534444.382051,184036.667977,4,202.008\n419,534231.831306,183993.036716,534531.340314,183964.368091,8,300.87793\n420,534172.577514,183923.701456,534215.940242,184037.13487,2,121.43914\n421,534115.258786,184054.083176,534123.803083,183933.6061,2,120.77968\n422,534121.029309,183939.744568,534174.676304,183924.264876,2,55.835659\n423,533810.59916,184073.5153,533810.611406,184073.513141,1,0.012435302\n424,533954.738015,184048.098338,534364.650043,183975.815827,8,416.23627\n425,534371.123204,183959.195139,534375.526555,183983.077456,1,24.284863\n426,534530.958921,184092.594917,534574.546569,184080.175007,2,45.32259\n427,534520.73354,184104.289671,534537.960852,184087.485916,2,24.065462\n428,534522.002078,184096.397688,534527.354661,184168.044127,2,71.8461\n429,534268.71504,183678.612162,534312.689759,184027.117468,5,351.26874\n430,534178.09244,183721.02987,534286.616931,183992.760989,4,292.60104\n431,534154.143024,183979.798213,534160.00494,184014.835788,1,35.524551\n432,534283.055419,183845.462203,534373.38459,183821.957288,3,93.337242\n433,534338.56135,183826.740385,534417.437595,183853.779619,4,83.382149\n434,534338.660061,183839.865219,534399.443055,183787.619882,4,80.15078\n435,534353.39508,183626.897766,534397.018576,183800.008983,3,178.52312\n436,534316.524037,184240.583205,534323.048179,184194.026299,2,47.011806\n437,534259.30742,184197.099766,534324.554163,184195.186633,1,65.274788\n438,534221.349777,184137.655347,534236.167736,184240.918947,3,104.32134\n439,534075.999349,184178.716694,534364.876021,184103.158771,5,298.5946\n440,534445.588895,184090.729314,534445.666539,184159.57376,2,68.84449\n441,534413.76248,184091.742822,534473.866644,184091.495124,3,60.104675\n442,534418.042635,184027.144569,534419.130132,184098.469833,2,71.333557\n443,534415.259165,184029.608637,534471.374163,184027.966459,3,56.139023\n444,534468.511671,184021.499835,534468.83228,184098.998125,2,77.498955\n445,534352.419821,184432.477914,534615.442074,184461.340417,3,264.6011\n446,532822.628275,183060.558178,533532.762428,183279.520388,8,743.12512\n447,533311.003242,183772.13925,533342.10287,183213.502392,5,559.50183\n448,533194.789303,183321.685907,533339.629599,183351.33356,4,147.84348\n449,533234.487353,184185.811657,533278.689124,183198.40131,9,988.39923\n450,533150.504528,183347.569737,533227.318113,183318.920628,3,81.982307\n451,533192.683163,183247.117175,533222.262704,183329.836454,3,87.848892\n452,533016.016412,183203.098735,533206.54312,183260.141057,3,198.88251\n453,533031.59668,183528.720721,533218.370549,183138.112551,7,432.96561\n454,532993.447981,183254.429505,533154.766037,183348.324784,3,186.65433\n455,532993.717598,183255.233189,533020.727019,183200.304946,3,61.209644\n456,532740.225415,183101.456559,533004.563505,183237.365869,5,297.2305\n457,532757.924444,183233.346962,532802.663245,183129.442,2,113.12737\n458,532685.720654,183195.618751,533412.442248,183553.057914,11,809.86853\n459,533024.538111,183916.941189,533130.680604,183490.775096,4,439.18533\n460,533013.314477,183449.208665,533194.753878,183517.68685,2,193.93173\n461,533108.115245,183562.022779,533168.092312,183585.226165,3,64.308983\n462,533152.99534,183590.14543,533205.984455,183546.220389,2,68.827721\n463,533089.575533,183968.681125,533162.657458,183572.125795,4,403.23331\n464,532922.524395,183650.858063,533327.125673,183697.863386,8,407.3226\n465,532885.693914,183873.580068,532927.211036,183638.394822,7,238.82162\n466,532779.479562,183518.056912,532935.205668,183654.64484,7,207.13977\n467,532821.550289,183562.586222,532860.869029,183486.788093,1,85.389229\n468,532883.827305,183871.101644,533293.632281,183952.760517,9,417.86157\n469,532953.496908,183900.631433,533047.8399,183487.189023,6,424.06982\n470,532548.783925,183646.448256,532960.447991,183900.052022,11,483.51025\n471,532323.585929,183530.393563,532794.913219,183792.725629,8,539.41406\n472,532571.255358,183675.623828,532577.265488,183558.348912,5,117.42882\n473,532543.068654,183657.388289,532630.300523,183590.633501,5,109.84353\n474,532612.008295,183601.543762,532798.825322,183678.398363,4,202.008\n475,532708.264427,183746.1312,532817.654866,183429.39209,8,335.09689\n476,532758.211581,183586.688488,532982.237138,183070.616672,8,562.59894\n477,532740.540472,183589.113563,532762.740992,183598.956911,1,24.284863\n478,532810.82743,183815.115636,532833.055397,183775.618109,2,45.32259\n479,532826.456421,183781.237933,532846.809685,183768.396942,2,24.065462\n480,532838.839254,183767.79295,532907.269939,183789.681389,2,71.8461\n481,532411.696593,183400.519815,532820.202092,183548.10214,5,434.34695\n482,532420.14458,183419.788898,532705.551235,183195.896947,4,362.74588\n483,532468.070555,183288.522695,532792.861092,183514.746035,3,395.81042\n484,532606.548409,183559.356739,532650.440517,183476.983667,3,93.337242\n485,532619.308676,183526.604462,532627.238206,183609.608708,4,83.382149\n486,532567.087105,183576.703398,532632.049753,183529.756598,4,80.15078\n487,532319.10546,183440.943243,532579.700202,183577.230383,3,294.0813\n488,532691.004424,182972.701974,532839.914144,183067.687656,2,176.62498\n489,532655.483875,183248.950676,532793.216472,183024.521282,4,263.32266\n490,532980.111006,183597.040814,533026.907326,183601.536855,2,47.011806\n491,532980.888774,183598.775588,532997.942126,183535.767805,1,65.274788\n492,532948.970195,183485.011804,533045.94493,183523.467543,3,104.32134\n493,532882.00154,183616.560258,533022.747935,183353.217927,4,298.5946\n494,532851.11962,183692.160301,532918.05361,183708.266348,2,68.84449\n495,532845.279862,183719.83908,532859.5161,183661.444718,3,60.104675\n496,532795.696864,183650.565417,532864.808334,183668.231221,2,71.333557\n497,532784.077833,183702.622362,532798.741337,183648.432221,3,56.139023\n498,532778.455497,183698.332789,532853.748882,183716.690184,2,77.498955\n499,533126.981531,184343.351798,533236.94103,184128.252751,5,241.57544\n500,532835.610266,183916.087636,533298.551877,184154.108856,5,520.54688\n501,532781.105505,184010.249828,533459.094685,184343.719876,10,755.56042\n502,533119.922963,184731.572266,533226.065455,184305.406173,5,439.18533\n503,533108.699328,184263.839742,533290.13873,184332.317927,3,193.93173\n504,533203.500097,184376.653856,533263.477163,184399.857242,3,64.308983\n505,533248.380191,184404.776507,533301.369306,184360.851466,3,68.827721\n506,533184.960385,184783.312202,533258.042309,184386.756872,5,403.23331\n507,533017.909246,184465.48914,533313.224583,184499.685418,6,297.28864\n508,532981.078765,184688.211145,533022.595887,184453.025899,8,238.82162\n509,532874.864413,184332.687989,533030.590519,184469.275916,7,207.13977\n510,532916.93514,184377.217299,532956.25388,184301.41917,1,85.389229\n511,532979.212156,184685.732721,533312.519029,184749.741937,8,339.39749\n512,533048.881759,184715.26251,533143.224751,184301.8201,7,424.06982\n513,532593.913595,184428.026979,533055.832842,184714.683099,11,543.63696\n514,532666.640209,184490.254905,532672.650339,184372.979989,5,117.42882\n515,532638.453505,184472.019366,532725.685375,184405.264577,4,109.84353\n516,532707.393146,184416.174838,532894.210173,184493.02944,4,202.008\n517,532803.649278,184560.762277,532913.039717,184244.023167,9,335.09689\n518,532884.448357,184243.450033,533002.988,184269.828409,3,121.43914\n519,533001.360624,184271.268552,533018.030551,184217.979393,1,55.835659\n520,532853.596432,184401.319564,533077.621989,183885.247749,9,562.59894\n521,532835.925323,184403.74464,532858.125843,184413.587987,1,24.284863\n522,532906.212281,184629.746713,532928.440249,184590.249186,2,45.32259\n523,532921.841272,184595.86901,532942.194537,184583.028019,2,24.065462\n524,532934.224105,184582.424026,533002.65479,184604.312466,2,71.8461\n525,532579.486878,184248.319081,532915.586943,184362.733217,5,355.04062\n526,532637.688968,184132.908686,532800.936086,184010.528024,5,204.02609\n527,532627.410222,184103.554158,532888.245943,184329.377111,5,345.00909\n528,532906.486242,184197.526206,532939.195758,184211.385546,1,35.524551\n529,532701.93326,184373.987816,532745.825368,184291.614744,3,93.337242\n530,532714.693527,184341.235539,532722.623057,184424.239785,4,83.382149\n531,532662.471957,184391.334474,532727.434605,184344.387675,4,80.15078\n532,532564.748392,184331.051265,532675.085054,184391.86146,3,125.98436\n533,532750.868727,184063.581753,532906.016604,183843.177006,7,269.535\n534,533075.495857,184411.671891,533122.292177,184416.167932,2,47.011806\n535,533076.273625,184413.406665,533093.326978,184350.398881,1,65.274788\n536,533044.355046,184299.642881,533141.329781,184338.09862,3,104.32134\n537,532977.386391,184431.191335,533118.132786,184167.849003,3,298.5946\n538,532946.504472,184506.791378,533013.438462,184522.897425,3,68.84449\n539,532940.664713,184534.470157,532954.900952,184476.075795,3,60.104675\n540,532891.081716,184465.196494,532960.193186,184482.862298,2,71.333557\n541,532879.462684,184517.253439,532894.126188,184463.063297,3,56.139023\n542,532873.840348,184512.963866,532949.133733,184531.321261,2,77.498955\n543,532917.353772,184079.057405,532962.745749,183975.886969,2,112.71455\n544,532065.2786,184514.06895,532635.210657,184438.436618,7,574.92853\n545,532364.629597,184414.239317,532590.230088,184386.41984,1,227.30927\n546,532489.874509,184162.462824,532652.784793,184210.349538,2,169.80252\n547,532542.4661,184490.385692,532763.565425,183767.899229,12,755.56042\n548,532030.38234,184165.122698,532543.133455,184254.228718,5,520.43597\n549,532526.782394,184321.773294,532565.454237,184131.736438,2,193.93173\n550,532455.856013,184306.221875,532469.199284,184243.312394,2,64.308983\n551,532448.592493,184292.102419,532500.404605,184337.409821,2,68.827721\n552,532151.559428,184344.737703,532467.9222,184298.767718,5,319.68521\n553,532126.163226,184073.414024,532546.372759,184062.610646,5,420.34839\n554,532532.763551,183974.089967,532584.490376,183864.218218,2,121.43914\n555,532631.895052,183998.522448,532632.387207,183877.743771,2,120.77968\n556,532582.355319,183864.623056,532634.69401,183884.072537,2,55.835659\n557,532934.235328,184040.687683,532934.247379,184040.690753,1,0.012435302\n558,532167.934598,183901.818224,532792.413758,184004.562433,7,632.87488\n559,532368.508548,184092.677579,532506.956582,183612.623908,4,499.61923\n560,532478.124198,183964.520986,532594.152127,183661.701955,4,324.28668\n561,532590.210249,183956.03771,532598.676791,183921.536821,0,35.524551\n562,532306.05875,184266.992332,532414.219172,184122.529385,3,180.46667\n563,532412.630606,184123.573809,532477.551415,184130.362486,2,65.274788\n564,532439.682428,184049.515329,532661.721044,184125.743623,5,234.75923\n565,532847.771489,183350.898751,532995.822217,183426.742101,2,166.34673\n566,532774.026261,183284.142626,532909.818834,183159.196609,2,184.52948\n567,532709.490275,183812.886376,532835.431428,183979.968037,2,209.23062\n568,532463.943732,184141.842329,532481.318515,184025.961742,3,117.17591\n569,533323.064517,183697.391573,533469.816857,183830.537895,3,198.15195\n570,529846.791844,185094.627525,532736.351417,185388.776756,16,2904.4927\n571,530347.847156,185292.772305,530632.54739,185377.731381,3,297.10651\n572,530537.847519,185421.393549,530918.45134,185724.218064,2,486.37634\n573,530524.468228,184838.411754,530539.002713,185369.052417,5,530.83966\n574,530335.169085,184982.866758,530559.280279,185043.45439,5,232.1566\n575,530707.024701,184994.505864,530707.477025,185313.557473,6,319.05194\n576,531131.431446,185132.77165,531131.431446,185359.356031,3,226.58438\n577,530501.676063,185036.509115,530743.403575,185005.682885,5,243.68513\n578,530485.48235,185236.499696,530775.181629,185251.675793,2,290.0965\n579,532544.992916,185376.432414,536042.612412,185481.987222,23,3499.2119\n580,532310.185466,184245.557105,532320.564971,184501.568004,4,256.22122\n581,532121.12861,185156.54299,532552.782294,185237.529808,4,439.18533\n582,532107.183652,185396.499385,532132.218217,185032.528489,3,364.83084\n583,532191.417756,185229.891994,532195.30118,185165.700369,1,64.308983\n584,532227.588839,185421.387179,532353.359001,185033.968077,5,407.3226\n585,532340.076208,185033.038343,532571.18527,185093.24111,7,238.82162\n586,532292.197138,184848.611134,532351.520352,185047.074325,6,207.13977\n587,532229.872721,184909.583681,532315.159633,184905.404877,1,85.389229\n588,532325.041594,185475.024213,532348.317401,185387.959135,1,90.122643\n589,532458.491775,185549.400536,532569.709404,185090.511891,8,472.17386\n590,532152.369147,185079.734976,532567.540953,185166.15024,5,424.06982\n591,532505.002165,184692.345865,532564.119253,185172.2285,11,483.51025\n592,532493.279792,184439.273909,532535.484156,184977.034374,10,539.41406\n593,532413.044998,184681.548955,532522.168382,184724.926539,5,117.42882\n594,532420.308897,184743.211305,532517.328531,184691.706048,5,109.84353\n595,532429.914393,184932.976985,532437.846142,184731.124765,4,202.008\n596,532009.678491,184830.207924,532529.209664,184878.852478,9,521.80353\n597,532372.718405,184867.085846,532373.015227,184842.802797,1,24.284863\n598,532504.045738,185004.586487,532549.212182,185000.827563,2,45.32259\n599,532491.752352,185014.083768,532511.903281,185000.927534,2,24.065462\n600,532485.923093,185077.915497,532494.522692,185006.585915,2,71.8461\n601,532302.552935,184898.146955,532338.509646,184465.290859,6,434.34695\n602,532317.204408,184488.844117,532511.697154,184540.679279,4,201.28168\n603,532213.209452,184469.899539,532283.614029,184859.398047,3,395.81042\n604,532308.596564,184714.189612,532401.765755,184708.591215,4,93.337242\n605,532366.674775,184706.551798,532438.83555,184748.32984,4,83.382149\n606,532364.234237,184719.448107,532433.970963,184679.939416,4,80.15078\n607,532419.863664,184513.347103,532429.197073,184691.626071,3,178.52312\n608,532265.046152,185108.326792,532280.447926,185063.909506,2,47.011806\n609,532217.315493,185054.60217,532281.701175,185065.339097,1,65.274788\n610,532186.140917,185093.121144,532191.566167,184988.940965,2,104.32134\n611,532041.019596,185001.127477,532339.05382,184982.842711,3,298.5946\n612,532407.413622,185053.812396,532420.646945,184986.251735,2,68.84449\n613,532389.225017,184981.093212,532448.243164,184992.469955,3,60.104675\n614,532393.190891,184988.731026,532405.913021,184918.541117,2,71.333557\n615,532402.705692,184920.420579,532458.079522,184929.657935,3,56.139023\n616,532441.853242,184998.858127,532456.521206,184922.75991,2,77.498955\n617,532481.890775,185659.270838,533213.475046,185960.194699,11,791.0567\n618,532608.229846,185714.42505,532641.597608,185570.396278,4,147.84348\n619,532494.571678,185595.329141,532951.496475,185784.285053,4,494.45386\n620,532625.536229,185598.818142,532683.573214,185540.914717,2,81.982307\n621,532574.680692,185537.425716,532637.565773,185598.768157,2,87.848892\n622,532379.782201,185516.78321,532897.788147,185508.254066,5,518.07617\n623,532630.128728,185133.831243,532743.226231,185136.430499,1,113.12737\n624,532738.996515,185055.073787,532759.807049,185810.347593,11,755.56042\n625,532822.02428,185582.532804,533308.048429,185701.947063,4,500.479\n626,532819.806359,185651.992921,532833.113887,185458.518303,3,193.93173\n627,532892.313426,185655.881808,532896.19685,185591.690183,3,64.308983\n628,532841.070371,185674.086597,532903.073231,185644.20515,2,68.827721\n629,532882.666705,185645.484784,533018.964367,185679.897592,3,140.57487\n630,532928.484509,185847.376993,533171.791246,185088.690552,12,796.74542\n631,533040.971878,185459.028157,533342.086167,185539.229407,3,311.61203\n632,533040.869687,185902.686787,533064.145494,185815.621709,1,90.122643\n633,532853.264817,185505.72479,533314.949235,185601.821346,5,471.57932\n634,532896.584368,185272.381584,533323.615384,185304.842292,5,428.263\n635,532501.860312,185272.591524,533064.346626,185283.848301,5,562.59894\n636,533003.448605,185324.136769,533056.976395,184798.314821,5,528.53943\n637,532730.99056,185073.218594,532910.240585,184975.770777,5,204.02609\n638,532887.833761,184954.200538,532984.509699,185285.387861,5,345.00909\n639,533009.492234,185140.179426,533223.840618,185128.424782,4,214.67044\n640,533120.759334,184991.97773,533164.669849,185152.192991,4,166.12364\n641,532535.080541,185099.055441,532800.075927,185049.795298,6,269.535\n642,532965.941822,185534.316606,532981.343596,185489.89932,2,47.011806\n643,532918.211163,185480.591984,532982.596845,185491.328911,1,65.274788\n644,532887.036587,185519.110958,532892.461837,185414.930779,2,104.32134\n645,532632.107543,185205.900614,532744.809283,185207.600127,2,112.71455\n646,532964.061948,185729.530726,533287.399961,185848.0167,3,344.36377\n647,533160.485194,185038.203824,533312.377108,184720.549657,5,352.10129\n648,532525.968737,184938.195076,533310.15909,185042.780793,10,791.13379\n649,532783.202604,184722.352915,533016.354731,184679.635872,7,237.03304\n650,532833.457546,184793.601953,532842.931078,184708.739877,1,85.389229\n651,532637.546794,184576.413333,532697.76898,184475.60254,4,117.42882\n652,532664.201797,184475.083512,532699.578469,184579.074338,3,109.84353\n653,532790.659095,184784.017491,532807.61867,184536.424288,5,248.17337\n654,532688.116711,184815.503368,532809.549225,184814.234469,2,121.43914\n655,532680.465774,184864.681718,532790.476516,184914.535179,2,120.77968\n656,532685.258845,184869.414696,532689.373959,184813.730886,2,55.835659\n657,532702.892582,185206.980301,532702.89481,185206.968067,1,0.012435302\n658,532729.11626,185062.986031,532803.692966,184653.485179,9,416.23627\n659,532491.67071,184640.231707,532833.755893,184720.028022,5,351.26874\n660,532499.975473,184739.94504,532792.482948,184732.546172,3,292.60104\n661,532734.319602,184852.272505,532769.212115,184858.943804,1,35.524551\n662,532653.115703,184684.729984,532662.444623,184591.860121,3,93.337242\n663,532654.836092,184626.176973,532707.585566,184561.600854,3,83.382149\n664,532639.294461,184555.498451,532667.178268,184630.642585,4,80.15078\n665,532472.584102,184542.862363,532650.07041,184562.074685,3,178.52312\n666,532893.717797,184994.635461,532923.188084,184697.498736,4,298.5946\n667,531538.538439,185607.847884,531861.827826,185191.773577,6,526.90973\n668,531733.704075,185347.638093,532464.148204,185651.318997,8,791.0567\n669,531783.992688,185523.353816,531862.097157,185397.825387,4,147.84348\n670,531697.519714,185401.860209,532154.444511,185590.816121,5,494.45386\n671,531792.696598,185491.889357,531792.885564,185573.871444,3,81.982307\n672,531713.333946,185499.431572,531801.177268,185500.421101,3,87.848892\n673,531610.700038,185649.814566,531730.360655,185490.95743,4,198.88251\n674,531620.035263,185437.486389,531921.465017,185748.290708,7,432.96561\n675,531650.997901,185688.805133,531795.073611,185570.13741,4,186.65433\n676,531609.716111,185644.426899,531651.845197,185688.831412,3,61.209644\n677,531419.603835,185873.139547,531638.856727,185672.455379,5,297.2305\n678,531467.531654,185824.307266,531549.43165,185902.346948,2,113.12737\n679,531488.975827,185956.953711,532119.186289,185356.969123,9,870.14178\n680,531920.292545,185642.195846,532283.069773,185889.736651,4,439.18533\n681,531840.552788,185737.82088,531967.781488,185591.457031,2,193.93173\n682,531979.268684,185688.10056,532021.857493,185639.915095,3,64.308983\n683,531998.439307,185590.835022,532021.227472,185655.780807,2,68.827721\n684,532007.685046,185640.46198,532354.176342,185846.716386,4,403.23331\n685,531998.119894,185892.991515,532182.715114,185529.898829,7,407.3226\n686,531988.060055,185884.268177,532194.187825,186004.879594,7,238.82162\n687,531823.906145,185981.011624,532006.0751,185882.414698,6,207.13977\n688,531822.849706,185893.828664,531880.274702,185957.02431,1,85.389229\n689,532311.198579,185678.393526,532356.214415,185600.318783,1,90.122643\n690,532191.215405,186005.769276,532436.590975,185602.36008,8,472.17386\n691,531888.159585,185718.634809,532243.102999,185950.691698,5,424.06982\n692,531983.707795,186179.165119,532196.631823,185988.747422,5,285.64932\n693,531651.967629,186274.379,531834.720544,186117.859235,5,240.61809\n694,531474.732813,185635.481035,531880.879584,186024.791155,5,562.59894\n695,532084.042336,186020.220067,532125.476384,186066.896386,2,62.413612\n696,532082.047427,186004.814029,532087.020575,186028.360031,2,24.065462\n697,532078.712944,186012.078587,532123.004546,185955.509016,2,71.8461\n698,531418.778869,186104.345157,531495.361206,186318.654076,1,227.58112\n699,531405.175343,186133.522312,531496.123753,185938.454076,2,215.22832\n700,531967.651931,185820.298893,531988.120213,185777.976802,2,47.011806\n701,531916.385431,185782.297886,531969.548841,185820.172013,1,65.274788\n702,531851.781007,185810.594354,531921.521881,185733.01115,3,104.32134\n703,531753.813062,185695.637567,531951.88356,185919.080645,5,298.5946\n704,532012.052858,185974.295815,532050.402192,185917.121587,2,68.84449\n705,531986.165178,185955.754619,532035.980691,185989.384765,3,60.104675\n706,531953.798994,186011.823186,531994.367226,185953.148707,2,71.333557\n707,531952.855903,186008.227366,531998.580495,186040.798082,3,56.139023\n708,531992.605316,186044.580718,532035.969035,185980.349295,3,77.498955\n709,532589.748562,185685.358288,532589.937528,185767.340375,3,81.982307\n710,532510.38591,185692.900503,532598.229233,185693.890033,3,87.848892\n711,532406.805014,185844.840392,532526.465631,185685.983256,3,198.88251\n712,532357.833442,185569.858724,532718.516981,185941.75964,8,518.07617\n713,532448.049865,185882.274065,532592.125576,185763.606342,3,186.65433\n714,532406.768075,185837.89583,532448.897161,185882.300344,3,61.209644\n715,532216.655799,186066.608479,532435.908691,185865.92431,5,297.2305\n716,532360.533068,186075.917366,532834.203129,185630.446297,10,650.23676\n717,532717.344509,185835.664778,532936.586571,185985.264456,3,265.41882\n718,532637.604753,185931.289811,532764.833452,185784.925963,3,193.93173\n719,532776.320648,185881.569492,532818.909457,185833.384027,3,64.308983\n720,532795.491271,185784.303954,532818.279437,185849.249739,3,68.827721\n721,532804.73701,185833.930912,533151.228306,186040.185318,3,403.23331\n722,532795.171858,186086.460447,532929.800941,185821.402824,6,297.28864\n723,532785.112019,186077.737108,532991.239789,186198.348525,3,238.82162\n724,532620.958109,186174.480555,532803.127064,186075.88363,5,207.13977\n725,532487.895562,185923.221154,532677.326666,186150.493242,2,295.86609\n726,532685.211549,185912.103741,533069.580712,186166.970325,5,461.19046\n727,532596.323721,186341.331993,532783.926762,186029.330587,5,364.06012\n728,532563.33634,186239.667079,532671.224339,186286.032017,4,117.42882\n729,532612.030176,186201.145396,532644.334769,186306.131177,3,109.84353\n730,532271.784777,185828.949967,532505.439737,186045.768275,4,318.7551\n731,532414.079667,186283.737681,532456.17094,185958.238507,5,328.20935\n732,532406.790925,186170.698068,532571.998535,186193.879467,4,166.82605\n733,532548.169142,186189.216154,532628.760769,186210.607084,3,83.382149\n734,532555.549979,186178.362848,532577.01348,186255.586328,4,80.15078\n735,532486.543697,186326.291197,532581.88812,186243.941337,3,125.98436\n736,532172.735117,185975.263057,532257.346144,186098.20954,5,149.24767\n737,532764.703896,186013.767825,532785.172178,185971.445734,2,47.011806\n738,532713.437395,185975.766818,532766.600805,186013.640945,1,65.274788\n739,532648.832971,186004.063285,532718.573845,185926.480081,3,104.32134\n740,532550.865026,185889.106499,532748.935524,186112.549577,4,298.5946\n741,532809.104823,186167.764747,532847.454156,186110.590519,2,68.84449\n742,532783.217143,186149.223551,532833.032655,186182.853696,1,60.104675\n743,532316.886414,185968.154353,532397.870761,186046.551458,2,112.71455\n744,532484.706693,186858.233085,532611.716116,186297.509083,5,574.92853\n745,532495.053707,186542.844571,532547.315567,186321.624765,2,227.30927\n746,532302.445571,186337.954854,532403.929434,186201.815503,3,169.80252\n747,532279.867123,186136.157785,533301.964636,186916.681637,8,1286.0408\n748,532220.466605,186717.486676,532406.996132,186319.880711,4,439.18533\n749,532299.880114,186256.408398,532464.657849,186358.671862,2,193.93173\n750,532371.082371,186385.421764,532425.442087,186419.782599,3,64.308983\n751,532409.678901,186421.690404,532470.160245,186388.838273,2,68.827721\n752,532274.274318,186780.824005,532422.642422,186405.878671,4,403.23331\n753,532171.81854,186436.70136,532559.699344,186561.040314,8,407.3226\n754,532092.624676,186648.101237,532178.826247,186425.3793,6,238.82162\n755,532057.146411,186278.751138,532183.528486,186442.868331,7,207.13977\n756,532089.81472,186330.573787,532143.045525,186263.807019,1,85.389229\n757,532433.590954,186711.557255,532517.844537,186743.548266,1,90.122643\n758,532091.272428,186645.308703,532528.645281,186823.221988,7,472.17386\n759,532153.918759,186687.75042,532326.411557,186300.346934,5,424.06982\n760,531805.981463,186360.120561,532160.850721,186688.525773,8,483.51025\n761,531638.584156,186248.397279,532019.187977,186551.221795,2,486.37634\n762,531822.388527,186393.090056,531850.957699,186279.189528,4,117.42882\n763,531798.259009,186369.749287,531896.750706,186321.11816,4,109.84353\n764,531876.694323,186328.286208,532045.128842,186439.807703,4,202.008\n765,531943.18184,186488.754835,532093.982912,186228.396289,7,300.87793\n766,531995.178958,186015.230887,532011.499862,186166.344763,4,151.99268\n767,532367.752182,186017.395091,532367.759246,186017.384856,1,0.012435302\n768,532023.011316,186341.976255,532159.436339,186124.137174,5,257.03241\n769,532005.204751,186340.939274,532025.083457,186354.888884,1,24.284863\n770,532030.47336,186576.266049,532059.917927,186541.810938,2,45.32259\n771,532052.35698,186546.04898,532074.808779,186537.385081,2,24.065462\n772,532067.105483,186535.251582,532130.013549,186569.956592,2,71.8461\n773,531792.763214,186130.980154,532091.292124,186316.102313,6,351.26874\n774,531936.680417,186133.867962,532070.915572,186278.089735,3,197.02538\n775,531769.516237,186138.516602,532468.845803,186177.575543,11,700.41949\n776,531879.493338,186285.839527,531938.482345,186213.506013,3,93.337242\n777,531890.077738,186339.143359,531898.344779,186256.172049,4,83.382149\n778,531837.422918,186295.229987,531910.236094,186261.727914,4,80.15078\n779,531710.480298,186186.429316,531849.69618,186298.185485,4,178.52312\n780,532238.723078,186395.032465,532283.767347,186408.490685,2,47.011806\n781,532239.150794,186396.884875,532268.06354,186338.36265,2,65.274788\n782,532138.690872,186395.216436,532327.693221,186164.052331,4,298.5946\n783,532006.439739,186419.175581,532156.333518,186492.162275,2,166.71893\n784,532359.977566,186772.190756,532443.278589,186521.044007,2,264.6011\n785,531690.869932,185858.91738,531813.409667,185746.421847,3,166.34673\n786,531532.648741,185734.155051,531602.657669,185904.88841,2,184.52948\n787,532171.469385,186298.572254,532274.102964,186355.110223,2,117.17591\n788,532180.862253,185533.543345,532356.687285,185442.166375,1,198.15195\n789,534574.657185,184195.402125,535121.140847,184069.916781,5,560.70575\n790,534563.562293,184974.129007,534591.680522,184183.57219,13,791.0567\n791,534583.836146,184321.202178,534730.488454,184302.472644,3,147.84348\n792,534698.25765,184297.281735,534772.712856,184331.596753,3,81.982307\n793,534702.482315,184308.545155,534738.166945,184228.270404,3,87.848892\n794,534723.371547,184240.220974,534917.631564,184197.591186,3,198.88251\n795,534720.705827,184117.649614,534877.736194,184521.135283,7,432.96561\n796,534768.406805,184332.030894,534936.296866,184250.466403,3,186.65433\n797,534913.143151,184194.45284,534935.967883,184251.247666,3,61.209644\n798,534926.488964,184232.619061,535200.253338,184116.864865,5,297.2305\n799,535135.896953,184140.101114,535172.737595,184247.061707,2,113.12737\n800,534562.260508,184461.164981,535247.561401,184214.840549,8,728.22595\n801,534781.768492,184475.883822,534855.733432,184908.796002,4,439.18533\n802,534715.861565,184497.92705,534901.915218,184443.21365,2,193.93173\n803,534737.396022,184567.271591,534798.940809,184548.619916,3,64.308983\n804,534702.527951,184525.540516,534752.082699,184573.306429,2,68.827721\n805,534743.795646,184554.614492,534787.00774,184955.52572,4,403.23331\n806,534570.382231,184667.696421,534977.366153,184651.089755,7,407.3226\n807,534973.624979,184638.310842,534997.432303,184875.942875,7,238.82162\n808,534964.437135,184653.917275,535129.944616,184529.361442,7,207.13977\n809,535051.122321,184492.091746,535084.660673,184570.618804,1,85.389229\n810,534553.928547,184777.71118,534643.657919,184769.301014,2,90.122643\n811,534530.528166,184928.685384,534999.479085,184873.611031,10,472.17386\n812,534864.645343,184478.50485,534927.795663,184897.846314,6,424.06982\n813,534920.9074,184896.748538,535350.389301,184674.650654,11,483.51025\n814,535094.007101,184802.106005,535583.637988,184575.767496,10,539.41406\n815,535325.798299,184702.06346,535328.577977,184584.667544,5,117.42882\n816,535273.276435,184612.894289,535355.270169,184685.987575,5,109.84353\n817,535098.658423,184687.806427,535290.701247,184625.142364,4,202.008\n818,535098.509015,184438.08928,535183.89869,184762.124056,9,335.09689\n819,535006.882355,184457.093469,535127.063137,184439.656582,3,121.43914\n820,534991.75315,184409.678765,535092.77961,184343.486731,2,120.77968\n821,534995.760614,184404.264446,535008.397438,184458.651315,2,55.835659\n822,534961.226757,184068.007254,535146.018893,184599.391705,10,562.59894\n823,535140.584411,184611.286922,535163.459076,184603.131906,1,24.284863\n824,535057.251555,184782.193123,535076.462555,184823.242784,2,45.32259\n825,535044.075999,184773.963275,535063.41164,184788.29085,2,24.065462\n826,534982.19293,184790.665242,535052.06928,184773.957217,2,71.8461\n827,535087.088601,184556.27616,535505.489654,184439.666367,6,434.34695\n828,535476.003253,184427.867158,535494.940716,184628.255992,4,201.28168\n829,535227.765574,184213.634501,535495.623878,184458.249491,5,362.74588\n830,535116.848257,184525.058811,535457.651802,184323.765899,3,395.81042\n831,535074.86778,184403.586458,535108.522419,184392.212847,1,35.524551\n832,535261.69466,184498.056288,535299.301714,184583.481985,3,93.337242\n833,535274.910697,184632.04541,535289.027295,184549.866922,4,83.382149\n834,535276.086116,184552.057106,535337.354799,184603.732014,4,80.15078\n835,535324.737621,184603.313977,535488.678393,184532.646259,3,178.52312\n836,535103.370078,184075.733181,535258.968139,183992.153113,2,176.62498\n837,535153.166046,184036.181063,535273.723864,184270.284958,4,263.32266\n838,534876.965263,184594.098185,534923.966796,184593.115427,2,47.011806\n839,534910.769279,184530.680211,534923.061435,184594.787158,1,65.274788\n840,534863.821121,184514.823476,534963.40089,184483.729864,3,104.32134\n841,534899.688958,184346.786186,535020.341176,184619.919439,2,298.5946\n842,534977.529877,184708.67163,535045.481163,184697.617833,2,68.84449\n843,535039.405946,184666.3602,535049.233996,184725.655911,3,60.104675\n844,535033.620864,184672.731791,535103.86021,184660.285498,2,71.333557\n845,535100.983846,184657.930531,535111.552469,184713.065765,3,56.139023\n846,535041.024265,184721.882297,535117.479941,184709.2088,2,77.498955\n847,535069.000684,184166.986037,535106.547618,184273.263025,2,112.71455\n848,534693.249139,184660.132058,534706.694412,184924.391352,2,264.6011\n849,534407.504716,185779.34208,534453.692303,184480.757033,15,1299.4061\n850,534427.77857,185126.415252,534574.430877,185107.685717,4,147.84348\n851,534481.481436,185472.577643,534499.988673,184978.470277,4,494.45386\n852,534542.200073,185102.494808,534616.65528,185136.809827,3,81.982307\n853,534546.424738,185113.758229,534582.109368,185033.483477,3,87.848892\n854,534569.123813,185045.221496,534763.38383,185002.591709,3,198.88251\n855,534533.779885,184843.547182,534721.678617,185326.348356,8,518.07617\n856,534612.349228,185137.243968,534780.239289,185055.679477,3,186.65433\n857,534757.085574,184999.665913,534779.910306,185056.46074,3,61.209644\n858,534770.431387,185037.832134,535044.195761,184922.077939,5,297.2305\n859,534979.839376,184945.314188,535016.680018,185052.274781,2,113.12737\n860,534390.468496,185301.871061,535091.503824,185020.053622,11,755.56042\n861,534625.710916,185281.096896,534699.675855,185714.009075,5,439.18533\n862,534559.803988,185303.140124,534745.857641,185248.426724,3,193.93173\n863,534581.338446,185372.484665,534642.883232,185353.832989,3,64.308983\n864,534546.470374,185330.75359,534596.025122,185378.519503,2,68.827721\n865,534587.738069,185359.827566,534630.950164,185760.738794,5,403.23331\n866,534157.732629,185538.915308,534848.842646,185522.308643,9,691.30951\n867,534817.567402,185443.523916,534841.374726,185681.155949,6,238.82162\n868,534808.379558,185459.130349,534973.88704,185334.574516,7,207.13977\n869,534895.064744,185297.30482,534928.603096,185375.831877,1,85.389229\n870,534406.08931,185659.974073,534495.818681,185651.563907,1,90.122643\n871,534374.470589,185733.898458,534843.421508,185678.824105,7,472.17386\n872,534708.587766,185283.717924,534771.738086,185703.059388,7,424.06982\n873,534764.849823,185701.961612,535078.992376,185538.201886,5,354.26373\n874,534942.451438,185243.302354,535027.841113,185567.33713,8,335.09689\n875,534850.824778,185262.306543,534971.005561,185244.869656,3,121.43914\n876,534835.695573,185214.891839,534936.722033,185148.699805,2,120.77968\n877,534839.703037,185209.47752,534852.339862,185263.864389,2,55.835659\n878,534805.16918,184873.220328,534989.961316,185404.604779,10,562.59894\n879,534984.526835,185416.499995,535007.401499,185408.344979,1,24.284863\n880,534901.193978,185587.406197,534920.404978,185628.455858,2,45.32259\n881,534888.018422,185579.176349,534907.354063,185593.503923,2,24.065462\n882,534826.135353,185595.878316,534896.011703,185579.170291,2,71.8461\n883,534931.031024,185361.489234,535274.748313,185272.538271,4,355.04062\n884,535071.707997,185018.847575,535225.342791,185153.097336,5,204.02609\n885,534960.790681,185330.271885,535237.788656,185124.593978,5,345.00909\n886,534918.810203,185208.799531,534952.464842,185197.425921,1,35.524551\n887,534979.440914,184844.104724,535117.666287,185075.498032,6,269.535\n888,534720.907686,185399.311258,534767.909219,185398.328501,2,47.011806\n889,534754.711702,185335.893285,534767.003858,185400.000231,1,65.274788\n890,534707.763545,185320.03655,534807.343313,185288.942937,3,104.32134\n891,534743.631381,185151.99926,534864.283599,185425.132512,3,298.5946\n892,534912.943107,184972.19911,534950.490041,185078.476099,2,112.71455\n893,534537.191562,185503.477633,534550.636835,185729.604425,2,226.52615\n894,535204.496158,185229.19193,535370.532227,185193.626199,4,169.80252\n895,535127.124245,184779.694198,535293.557118,185516.696029,9,755.56042\n896,535310.557793,185281.150834,535749.725,185277.1594,4,439.18533\n897,535297.462815,185157.332025,535321.810242,185349.729325,2,193.93173\n898,535385.101419,185275.79588,535393.701243,185339.52726,3,64.308983\n899,535346.944402,185367.295278,535402.000642,185325.990727,2,68.827721\n900,535382.226487,185331.191356,535784.898658,185352.456817,4,403.23331\n901,535466.211156,185520.41691,535514.709946,185115.991934,7,407.3226\n902,535501.497998,185117.647664,535739.885867,185132.035007,6,238.82162\n903,535418.867409,184945.95612,535515.439778,185129.206385,7,207.13977\n904,535369.506432,185017.827383,535452.376475,184997.239138,1,85.389229\n905,535717.506417,185601.375402,535737.910212,185129.642602,7,472.17386\n906,535326.359881,185199.752209,535750.405618,185204.273205,6,424.06982\n907,535597.447409,184751.497905,535748.223563,185210.898302,8,483.51025\n908,535547.180422,184541.770925,535682.392359,185024.922582,5,501.71484\n909,535505.137738,184758.682504,535620.588503,184780.145227,5,117.42882\n910,535524.185606,184817.777244,535609.417536,184748.487137,5,109.84353\n911,535539.055343,184802.528299,535570.296749,185002.105868,4,202.008\n912,535357.746004,184958.474606,535657.255012,184929.805982,8,300.87793\n913,535298.492212,184889.139347,535341.85494,185002.57276,2,121.43914\n914,535241.173485,185019.521066,535249.717782,184899.04399,2,120.77968\n915,535246.944008,184905.182458,535300.591002,184889.702767,2,55.835659\n916,534936.513858,185038.95319,534936.526105,185038.951031,1,0.012435302\n917,535080.652713,185013.536228,535490.564742,184941.253717,8,416.23627\n918,535497.037903,184924.633029,535501.441253,184948.515346,1,24.284863\n919,535656.87362,185058.032807,535700.461267,185045.612897,2,45.32259\n920,535646.648239,185069.727561,535663.87555,185052.923806,2,24.065462\n921,535647.916776,185061.835578,535653.26936,185133.482017,2,71.8461\n922,535394.629739,184644.050052,535438.604457,184992.555358,5,351.26874\n923,535304.007138,184686.46776,535412.531629,184958.198879,4,292.60104\n924,535280.057722,184945.236103,535285.919638,184980.273679,1,35.524551\n925,535408.970117,184810.900093,535499.299289,184787.395178,3,93.337242\n926,535464.476048,184792.178276,535543.352293,184819.21751,4,83.382149\n927,535464.574759,184805.30311,535525.357753,184753.057772,4,80.15078\n928,535479.309778,184592.335656,535522.933274,184765.446874,3,178.52312\n929,535442.438736,185206.021096,535448.962877,185159.464189,2,47.011806\n930,535385.222118,185162.537657,535450.468862,185160.624523,1,65.274788\n931,535347.264475,185103.093237,535362.082435,185206.356837,3,104.32134\n932,535201.914047,185144.154584,535490.790719,185068.596661,5,298.5946\n933,535571.503594,185056.167204,535571.581237,185125.01165,2,68.84449\n934,535539.677178,185057.180712,535599.781343,185056.933015,3,60.104675\n935,535543.957333,184992.582459,535545.04483,185063.907723,2,71.333557\n936,535541.173863,184995.046528,535597.288862,184993.404349,3,56.139023\n937,535594.426369,184986.937725,535594.746978,185064.436015,2,77.498955\n938,535478.334519,185397.915805,535741.356772,185426.778307,2,264.6011\n939,534386.096584,184657.946566,534391.276593,184519.650385,2,138.39316\n940,534150.45281,184882.379079,534256.595302,184456.212986,3,439.18533\n941,534215.490232,184934.119016,534288.572156,184537.563685,2,403.23331\n942,534104.300387,184622.785745,534453.040371,184663.301276,5,351.08557\n943,534358.410111,184835.358794,534447.258927,184850.457767,1,90.122643\n944,534009.742003,184836.539535,534473.259002,184926.540316,8,472.17386\n945,534079.411606,184866.069323,534173.754598,184452.626913,7,424.06982\n946,533755.439882,184661.626429,534086.362689,184865.489913,5,388.67752\n947,534106.025704,184562.478705,534152.822024,184566.974746,2,47.011806\n948,534106.803472,184564.213479,534123.856825,184501.205695,2,65.274788\n949,534252.89623,185308.789689,534476.385315,184841.397417,6,518.07617\n950,533961.524964,184881.525527,534304.335034,185057.781168,4,385.46698\n951,533907.020204,184975.687719,534585.009383,185309.157766,10,755.56042\n952,534245.837661,185697.010156,534351.980153,185270.844063,7,439.18533\n953,534234.614027,185229.277632,534416.053428,185297.755817,3,193.93173\n954,534329.414795,185342.091746,534389.391862,185365.295132,2,64.308983\n955,534374.294889,185370.214397,534427.284005,185326.289357,2,68.827721\n956,534310.875083,185748.750093,534354.077917,185514.323944,4,238.37387\n957,534042.849838,185342.655189,534082.168579,185266.85706,0,85.389229\n958,534231.245567,185651.170611,534438.433728,185715.179828,4,216.85043\n959,534174.796457,185680.7004,534269.139449,185267.25799,6,424.06982\n960,533929.563976,185526.200168,534038.954415,185209.461057,6,335.09689\n961,534010.363055,185208.887923,534128.902698,185235.266299,3,121.43914\n962,534127.275322,185236.706442,534143.945249,185183.417283,1,55.835659\n963,533979.51113,185366.757455,534203.536687,184850.685639,7,562.59894\n964,533961.840022,185369.18253,533984.040541,185379.025878,1,24.284863\n965,533705.401576,185213.756971,534041.501641,185328.171107,4,355.04062\n966,533763.603666,185098.346576,533926.850785,184975.965914,5,204.02609\n967,533753.32492,185068.992048,534014.160641,185294.815002,5,345.00909\n968,533876.783425,185029.019644,534031.931302,184808.614896,6,269.535\n969,534201.410555,185377.109782,534248.206875,185381.605823,2,47.011806\n970,534202.188323,185378.844555,534219.241676,185315.836772,1,65.274788\n971,534170.269744,185265.080771,534267.244479,185303.536511,3,104.32134\n972,534043.26847,185044.495295,534088.660447,184941.324859,3,112.71455\n973,533615.789208,185127.900715,533778.699491,185175.787428,2,169.80252\n974,533668.380798,185455.823582,533889.480123,184733.337119,10,755.56042\n975,533156.297039,185130.560588,533669.048154,185219.666608,6,520.43597\n976,533652.697092,185287.211184,533691.368935,185097.174328,3,193.93173\n977,533574.507192,185257.540309,533726.355444,185312.833746,4,161.60216\n978,533277.474126,185310.175594,533593.836898,185264.205608,4,319.68521\n979,533252.077925,185038.851914,533672.287457,185028.048537,5,420.34839\n980,533658.67825,184939.527857,533710.405074,184829.656108,2,121.43914\n981,533757.80975,184963.960338,533758.301905,184843.181661,2,120.77968\n982,533708.270017,184830.060946,533760.608708,184849.510427,2,55.835659\n983,534060.150026,185006.125573,534060.162077,185006.128643,1,0.012435302\n984,532885.238784,184800.028308,533918.328456,184970.000324,9,1046.9789\n985,533494.423246,185058.115469,533576.328783,184703.140253,4,364.30197\n986,533604.038896,184929.958876,533720.066825,184684.421651,4,271.57138\n987,533716.124948,184921.475601,533724.59149,184886.974711,0,35.524551\n988,533431.973449,185232.430222,533540.13387,185087.967275,2,180.46667\n989,533538.545304,185089.0117,533603.466114,185095.800376,2,65.274788\n990,533565.597126,185014.95322,533787.635743,185091.181513,5,234.75923\n991,533835.404973,184778.324266,533961.346126,184945.405928,2,209.23062\n992,533589.85843,185107.28022,533607.233213,184991.399632,3,117.17591\n993,534448.979216,184662.829463,534595.731555,184795.975785,2,198.15195\n994,531448.583794,186119.776035,531733.284027,186204.735111,1,297.10651\n995,531632.472108,185930.735816,531639.73935,186196.056148,3,265.41983\n996,531358.457914,185930.133858,531685.194977,186008.89228,4,336.09521\n997,531770.029234,185963.283155,531808.213662,186140.561203,1,181.34375\n998,532232.168083,186022.145713,532232.168083,186186.359762,3,164.21405\n999,531627.590761,186001.947005,531869.318273,185971.120775,5,243.68513\n1000,531611.397049,186201.937586,531901.096327,186217.113684,2,290.0965\n1001,533414.11404,185165.537038,533424.425402,184724.739221,5,440.9184\n1002,532990.64376,184514.529144,533322.717124,184642.932061,7,356.03375\n1003,533885.021829,184579.439517,534153.204805,184752.247218,3,319.03702\n1004,531510.629785,185399.989769,531550.244234,185166.880259,6,236.45158\n1005,532988.23624,186147.308367,533381.902938,186201.567533,5,397.38837\n1006,532778.64114,187622.18866,533427.582291,185080.181236,15,2623.5332\n1007,534248.581817,185619.448736,534493.593519,185630.183595,4,245.24675\n1008,534172.058872,185831.287567,534282.01837,185616.188519,7,241.57544\n1009,533826.182846,185498.185597,534504.172025,185831.655644,7,755.56042\n1010,534165.000303,186219.508034,534271.142795,185793.341941,5,439.18533\n1011,534153.776669,185751.775511,534335.21607,185820.253695,2,193.93173\n1012,534248.577437,185864.589624,534308.554504,185887.793011,2,64.308983\n1013,534230.037725,186271.247971,534303.11965,185874.692641,4,403.23331\n1014,534062.986586,185953.424909,534358.301923,185987.621186,5,297.28864\n1015,534026.156106,186176.146914,534067.673228,185940.961667,8,238.82162\n1016,533919.941754,185820.623758,534075.66786,185957.211685,7,207.13977\n1017,533962.01248,185865.153067,534001.331221,185789.354938,1,85.389229\n1018,534024.289496,186173.66849,534357.59637,186237.677706,6,339.39749\n1019,534093.959099,186203.198278,534188.302091,185789.755869,7,424.06982\n1020,533638.990935,185915.962748,534100.910183,186202.618868,11,543.63696\n1021,533711.71755,185978.190674,533717.72768,185860.915757,5,117.42882\n1022,533683.530845,185959.955135,533770.762715,185893.200346,4,109.84353\n1023,533752.470487,185904.110607,533939.287514,185980.965208,4,202.008\n1024,533848.726618,186048.698046,533958.117057,185731.958935,9,335.09689\n1025,533929.525697,185731.385802,534048.06534,185757.764177,3,121.43914\n1026,534046.437964,185759.20432,534063.107891,185705.915162,1,55.835659\n1027,533898.673772,185889.255333,534282.884006,185012.284988,11,957.44165\n1028,533881.002664,185891.680408,533903.203183,185901.523756,1,24.284863\n1029,533951.289622,186117.682482,533973.517589,186078.184954,2,45.32259\n1030,533966.918612,186083.804779,533987.271877,186070.963788,2,24.065462\n1031,533979.301445,186070.359795,534047.73213,186092.248234,2,71.8461\n1032,533624.564218,185736.254849,533960.664283,185850.668985,5,355.04062\n1033,533682.766308,185620.844455,533846.013427,185498.463792,5,204.02609\n1034,533672.487562,185591.489927,533933.323283,185817.31288,5,345.00909\n1035,533951.563582,185685.461975,533984.273098,185699.321315,1,35.524551\n1036,533747.0106,185861.923585,533790.902708,185779.550512,3,93.337242\n1037,533759.770868,185829.171307,533767.700397,185912.175553,4,83.382149\n1038,533707.549297,185879.270243,533772.511945,185832.323443,4,80.15078\n1039,533609.825733,185818.987034,533720.162394,185879.797228,3,125.98436\n1040,533795.946067,185551.517522,533892.357923,185253.367732,3,313.35052\n1041,534120.573197,185899.60766,534167.369517,185904.103701,2,47.011806\n1042,534121.350965,185901.342434,534138.404318,185838.33465,1,65.274788\n1043,534089.432386,185787.57865,534186.407121,185826.034389,3,104.32134\n1044,534022.463731,185919.127103,534163.210126,185655.784772,3,298.5946\n1045,533991.581812,185994.727147,534058.515802,186010.833193,3,68.84449\n1046,533985.742054,186022.405925,533999.978292,185964.011564,3,60.104675\n1047,533936.159056,185953.132262,534005.270526,185970.798066,2,71.333557\n1048,533924.540024,186005.189208,533939.203528,185950.999066,3,56.139023\n1049,533918.917688,186000.899634,533994.211074,186019.257029,2,77.498955\n1050,533962.431112,185566.993174,534007.823089,185463.822737,2,112.71455\n1051,533183.092197,185960.49207,533680.287998,185926.372386,7,498.36514\n1052,533409.706938,185902.175085,533635.307428,185874.355608,1,227.30927\n1053,533534.95185,185650.398593,533697.862133,185698.285306,2,169.80252\n1054,533587.54344,185978.32146,533771.907397,185375.875192,9,630.02509\n1055,533571.859734,185809.709063,533610.531577,185619.672206,1,193.93173\n1056,533500.933353,185794.157643,533514.276625,185731.248163,2,64.308983\n1057,533493.669834,185780.038188,533545.481945,185825.345589,2,68.827721\n1058,533196.636768,185832.673472,533512.99954,185786.703487,5,319.68521\n1059,533281.983386,185528.829642,533591.450099,185550.546415,4,310.22775\n1060,533979.312668,185528.623452,533979.324719,185528.626521,1,0.012435302\n1061,533497.55948,185639.260049,533592.716804,185246.129178,6,404.48337\n1062,533351.136091,185754.9281,533459.296512,185610.465153,2,180.46667\n1063,533457.707946,185611.509578,533522.628756,185618.298255,2,65.274788\n1064,533484.759768,185537.451098,533706.798385,185613.679391,5,234.75923\n1065,533355.262807,185733.492873,533365.642311,185989.503772,4,256.22122\n1066,533337.274479,186336.546903,533396.597693,186535.010094,2,207.13977\n1067,533550.079506,186180.281634,533609.196594,186660.164269,5,483.51025\n1068,533538.357132,185927.209678,533580.561497,186464.970143,9,539.41406\n1069,533458.122339,186169.484724,533567.245723,186212.862308,5,117.42882\n1070,533465.386238,186231.147074,533562.405872,186179.641817,5,109.84353\n1071,533474.991734,186420.912754,533482.923483,186219.060534,3,202.008\n1072,533054.755832,186318.143693,533574.287005,186366.788247,8,521.80353\n1073,533417.795746,186355.021615,533418.092568,186330.738566,1,24.284863\n1074,533347.630276,186386.082724,533383.586987,185953.226628,5,434.34695\n1075,533362.281749,185976.779886,533556.774495,186028.615048,4,201.28168\n1076,533258.286793,185940.551163,533328.69137,186347.333816,3,412.83038\n1077,533353.673905,186202.125381,533446.843096,186196.526984,4,93.337242\n1078,533411.752116,186194.487567,533483.912891,186236.265609,4,83.382149\n1079,533409.311578,186207.383876,533479.048304,186167.875185,4,80.15078\n1080,533464.941005,186001.282872,533474.274414,186179.56184,3,178.52312\n1081,533828.279945,186210.288684,534061.432071,186167.57164,7,237.03304\n1082,533878.534886,186281.537721,533888.008418,186196.675645,1,85.389229\n1083,533682.624134,186064.349101,533742.84632,185963.538308,4,117.42882\n1084,533709.279137,185963.01928,533744.655809,186067.010107,3,109.84353\n1085,533835.736436,186271.953259,533852.696011,186024.360057,5,248.17337\n1086,533733.194051,186303.439136,533854.626565,186302.170238,2,121.43914\n1087,533725.543114,186352.617487,533835.553856,186402.470947,2,120.77968\n1088,533730.336185,186357.350465,533734.4513,186301.666655,2,55.835659\n1089,533774.1936,186550.921799,533848.770307,186141.420947,7,416.23627\n1090,533536.74805,186128.167476,533878.833233,186207.963791,5,351.26874\n1091,533545.052813,186227.880808,533837.560288,186220.48194,3,292.60104\n1092,533779.396942,186340.208273,533814.289455,186346.879573,1,35.524551\n1093,533698.193044,186172.665752,533707.521963,186079.795889,3,93.337242\n1094,533699.913432,186114.112742,533752.662906,186049.536622,3,83.382149\n1095,533684.371802,186043.434219,533712.255609,186118.578354,4,80.15078\n1096,533517.661442,186030.798131,533695.147751,186050.010453,3,178.52312\n1097,533938.795137,186482.57123,533968.265425,186185.434504,0,298.5946\n1098,534035.7211,186002.464912,534367.794464,186130.867829,5,356.03375\n1099,532354.288274,183002.991897,532380.436592,183829.50734,4,826.92896\n"
  },
  {
    "path": "testdata/barnsbury_extended1_axial.tsv",
    "content": "Ref\tx1\ty1\tx2\ty2\tConnectivity\tLine Length\n0\t530635.696268\t184468.675646\t530732.377854\t183731.866556\t8\t743.12512\n1\t530655.080407\t184267.843134\t531386.664678\t184568.766995\t9\t791.0567\n2\t530781.419478\t184322.997346\t530814.78724\t184178.968574\t4\t147.84348\n3\t530667.76131\t184203.901437\t531124.686107\t184392.857349\t5\t494.45386\n4\t530798.725861\t184207.390438\t530856.762846\t184149.487013\t3\t81.982307\n5\t530747.870324\t184145.998012\t530810.755405\t184207.340453\t3\t87.848892\n6\t530753.938689\t184164.022852\t530781.427723\t183967.049235\t3\t198.88251\n7\t530638.070845\t184123.954322\t531070.977779\t184116.826362\t7\t432.96561\n8\t530837.494138\t183967.908989\t530855.674498\t184153.675814\t3\t186.65433\n9\t530776.925919\t183970.168342\t530838.112518\t183968.488823\t3\t61.209644\n10\t530803.879024\t183673.983124\t530817.351454\t183970.908131\t5\t297.2305\n11\t530803.31836\t183742.403539\t530916.415863\t183745.002795\t2\t113.12737\n12\t530912.186147\t183663.646083\t530932.996681\t184479.606956\t10\t816.2262\n13\t530995.213912\t184191.1051\t531426.867596\t184272.091918\t4\t439.18533\n14\t530992.995991\t184260.565217\t531006.303519\t184067.090599\t2\t193.93173\n15\t531065.503058\t184264.454104\t531069.386482\t184200.262479\t3\t64.308983\n16\t531014.260003\t184282.658893\t531076.262863\t184252.777446\t2\t68.827721\n17\t531055.856337\t184254.05708\t531446.820644\t184352.768824\t4\t403.23331\n18\t531101.674141\t184455.949289\t531227.444303\t184068.530187\t8\t407.3226\n19\t531214.16151\t184067.600453\t531445.270572\t184127.80322\t7\t238.82162\n20\t531166.28244\t183883.173244\t531225.605654\t184081.636435\t7\t207.13977\n21\t531103.958023\t183944.145791\t531189.244935\t183939.966987\t1\t85.389229\n22\t531199.126896\t184509.586323\t531222.402703\t184422.521245\t2\t90.122643\n23\t531332.577077\t184583.962646\t531443.794706\t184125.074001\t10\t472.17386\n24\t531026.454449\t184114.297086\t531441.626255\t184200.71235\t6\t424.06982\n25\t531379.087467\t183726.907975\t531438.204555\t184206.79061\t11\t483.51025\n26\t531367.365093\t183473.836019\t531409.569458\t184011.596484\t10\t539.41406\n27\t531287.1303\t183716.111065\t531396.253684\t183759.488649\t5\t117.42882\n28\t531294.394199\t183777.773415\t531391.413833\t183726.268158\t5\t109.84353\n29\t531303.999695\t183967.539095\t531311.931444\t183765.686875\t4\t202.008\n30\t531069.774\t183880.95388\t531403.294966\t183913.414588\t9\t335.09689\n31\t531055.773886\t183973.477395\t531081.160429\t183854.721389\t3\t121.43914\n32\t530979.070082\t183853.471746\t531006.056167\t183971.198048\t2\t120.77968\n33\t531002.370625\t183965.559662\t531057.760946\t183972.597647\t2\t55.835659\n34\t530675.049944\t183881.16382\t531237.536258\t183892.420597\t10\t562.59894\n35\t531246.803707\t183901.647956\t531247.100529\t183877.364907\t1\t24.284863\n36\t531378.13104\t184039.148597\t531423.297484\t184035.389673\t2\t45.32259\n37\t531365.837654\t184048.645878\t531385.988583\t184035.489644\t2\t24.065462\n38\t531360.008395\t184112.477607\t531368.607994\t184041.148025\t2\t71.8461\n39\t531176.638237\t183932.709065\t531212.594948\t183499.852969\t6\t434.34695\n40\t531191.28971\t183523.406227\t531385.782456\t183575.241389\t4\t201.28168\n41\t530904.180192\t183681.79089\t531226.595062\t183515.558473\t5\t362.74588\n42\t531087.294754\t183504.461649\t531157.699331\t183893.960157\t3\t395.81042\n43\t531029.208299\t183891.140964\t531030.230687\t183855.631128\t1\t35.524551\n44\t531182.681866\t183748.751722\t531275.851057\t183743.153325\t3\t93.337242\n45\t531240.760077\t183741.113908\t531312.920852\t183782.89195\t4\t83.382149\n46\t531238.319539\t183754.010217\t531308.056265\t183714.501526\t4\t80.15078\n47\t531293.948966\t183547.909213\t531303.282375\t183726.188181\t3\t178.52312\n48\t530707.321114\t183575.611283\t530731.660534\t183750.551207\t2\t176.62498\n49\t530711.864142\t183690.118506\t530973.265559\t183658.367594\t4\t263.32266\n50\t531139.131454\t184142.888902\t531154.533228\t184098.471616\t2\t47.011806\n51\t531091.400795\t184089.16428\t531155.786477\t184099.901207\t1\t65.274788\n52\t531060.226219\t184127.683254\t531065.651469\t184023.503075\t3\t104.32134\n53\t530915.104898\t184035.689587\t531213.139122\t184017.404821\t3\t298.5946\n54\t531281.498924\t184088.374506\t531294.732247\t184020.813845\t2\t68.84449\n55\t531263.310319\t184015.655322\t531322.328466\t184027.032065\t3\t60.104675\n56\t531267.276193\t184023.293136\t531279.998323\t183953.103227\t2\t71.333557\n57\t531276.790994\t183954.982689\t531332.164824\t183964.220045\t3\t56.139023\n58\t531315.938544\t184033.420237\t531330.606508\t183957.32202\t2\t77.498955\n59\t530805.297175\t183814.47291\t530917.998915\t183816.172423\t2\t112.71455\n60\t531137.25158\t184338.103022\t531389.731841\t184417.270361\t2\t264.6011\n61\t531482.315148\t184748.987159\t531515.68291\t184604.958387\t3\t147.84348\n62\t531368.65698\t184629.89125\t531825.581777\t184818.847162\t4\t494.45386\n63\t531499.621531\t184633.380251\t531557.658516\t184575.476826\t3\t81.982307\n64\t531448.765994\t184571.987825\t531511.651075\t184633.330266\t3\t87.848892\n65\t531455.263586\t184588.241656\t531482.75262\t184391.268039\t3\t198.88251\n66\t531253.867502\t184551.34532\t531771.873449\t184542.816175\t8\t518.07617\n67\t531538.389808\t184393.898802\t531556.570168\t184579.665627\t3\t186.65433\n68\t531477.821589\t184396.158155\t531539.008188\t184394.478636\t3\t61.209644\n69\t531504.774694\t184099.972937\t531518.247124\t184396.897944\t5\t297.2305\n70\t531504.21403\t184168.393352\t531617.311533\t184170.992608\t2\t113.12737\n71\t531613.081817\t184089.635896\t531633.892351\t184844.909702\t11\t755.56042\n72\t531696.109582\t184617.094913\t532336.825597\t184713.631764\t7\t647.94781\n73\t531693.891661\t184686.55503\t531707.199189\t184493.080412\t3\t193.93173\n74\t531766.398728\t184690.443917\t531770.282152\t184626.252292\t3\t64.308983\n75\t531715.155673\t184708.648706\t531777.158533\t184678.767259\t2\t68.827721\n76\t531756.752007\t184680.046893\t531893.049669\t184714.459702\t3\t140.57487\n77\t531802.569811\t184881.939102\t531928.339973\t184494.52\t7\t407.3226\n78\t531915.05718\t184493.590266\t532146.166242\t184553.793033\t5\t238.82162\n79\t531867.17811\t184309.163057\t531926.501324\t184507.626248\t7\t207.13977\n80\t531804.853693\t184370.135604\t531890.140605\t184365.9568\t1\t85.389229\n81\t531914.954989\t184937.248897\t531938.230796\t184850.183819\t1\t90.122643\n82\t531727.350119\t184540.286899\t532142.521925\t184626.702163\t5\t424.06982\n83\t531988.02597\t184142.100878\t532097.149354\t184185.478462\t4\t117.42882\n84\t531995.289869\t184203.763228\t532092.309503\t184152.257971\t4\t109.84353\n85\t532004.895365\t184393.528908\t532012.827114\t184191.676688\t4\t202.008\n86\t531770.66967\t184306.943693\t532197.700686\t184339.404401\t9\t428.263\n87\t531756.669556\t184399.467208\t531782.056099\t184280.711202\t3\t121.43914\n88\t531679.965752\t184279.461559\t531706.951837\t184397.187861\t2\t120.77968\n89\t531703.266295\t184391.549475\t531758.656616\t184398.58746\t2\t55.835659\n90\t531375.945614\t184307.153633\t531938.431928\t184318.41041\t10\t562.59894\n91\t531947.699377\t184327.637769\t531947.996199\t184303.35472\t1\t24.284863\n92\t532079.02671\t184465.13841\t532156.350838\t184461.379486\t1\t77.415443\n93\t532066.733324\t184474.635691\t532086.884253\t184461.479457\t2\t24.065462\n94\t532060.904065\t184538.46742\t532069.503664\t184467.137838\t2\t71.8461\n95\t531877.533907\t184358.698878\t531913.490618\t184005.483699\t5\t355.04062\n96\t531605.075862\t184107.780703\t531784.325886\t184010.332886\t5\t204.02609\n97\t531761.919063\t183988.762648\t531858.595001\t184319.94997\t5\t345.00909\n98\t531730.103969\t184317.130777\t531731.126357\t184281.620941\t1\t35.524551\n99\t531883.577536\t184174.741535\t531976.746727\t184169.143138\t3\t93.337242\n100\t531941.655747\t184167.103721\t532013.816522\t184208.881763\t4\t83.382149\n101\t531939.215209\t184180.00003\t532008.951935\t184140.491339\t4\t80.15078\n102\t531994.844636\t184026.539839\t532004.178045\t184152.177994\t3\t125.98436\n103\t531409.165843\t184133.61755\t531674.161229\t184084.357407\t7\t269.535\n104\t531840.027124\t184568.878715\t531855.428898\t184524.461429\t2\t47.011806\n105\t531792.296465\t184515.154093\t531856.682147\t184525.89102\t1\t65.274788\n106\t531761.121889\t184553.673067\t531766.547139\t184449.492888\t3\t104.32134\n107\t531616.000568\t184461.6794\t531914.034792\t184443.394634\t3\t298.5946\n108\t531982.394594\t184514.364319\t531995.627917\t184446.803658\t2\t68.84449\n109\t531964.205989\t184441.645135\t532023.224136\t184453.021878\t3\t60.104675\n110\t531968.171863\t184449.282949\t531980.893993\t184379.09304\t2\t71.333557\n111\t531977.686664\t184380.972502\t532033.060494\t184390.209858\t3\t56.139023\n112\t532016.834214\t184459.41005\t532031.502178\t184383.311833\t2\t77.498955\n113\t531506.192845\t184240.462723\t531618.894585\t184242.162236\t2\t112.71455\n114\t531838.14725\t184764.092835\t532090.627511\t184843.260174\t3\t264.6011\n115\t531898.14101\t185489.577346\t532384.945646\t183588.377395\t18\t1962.5341\n116\t532034.570496\t184072.765934\t532153.818761\t183879.247573\t2\t227.30927\n117\t531848.44415\t184056.30916\t531872.755533\t183888.256031\t4\t169.80252\n118\t531400.054039\t183972.757185\t532184.244392\t184077.342903\t11\t791.13379\n119\t531934.003528\t183974.894229\t532082.780772\t183561.676249\t4\t439.18533\n120\t531813.343861\t183944.172569\t532002.221345\t183988.159089\t2\t193.93173\n121\t531954.870458\t183903.130736\t532017.621625\t183917.199738\t3\t64.308983\n122\t532007.80999\t183904.715765\t532027.422876\t183970.689929\t2\t68.827721\n123\t532005.819462\t183925.065251\t532165.607001\t183554.842291\t4\t403.23331\n124\t531850.025607\t183726.090547\t532215.340633\t183914.50679\t8\t411.04227\n125\t531846.989846\t183739.055158\t531943.272396\t183520.502093\t6\t238.82162\n126\t531657.287906\t183756.915025\t531862.671007\t183729.995445\t7\t207.13977\n127\t531707.542847\t183828.164062\t531717.01638\t183743.301986\t1\t85.389229\n128\t531940.34277\t183521.523908\t532612.061879\t183803.786692\t10\t728.61432\n129\t531863.159436\t183931.80645\t532014.667663\t183535.72504\t6\t424.06982\n130\t531536.953309\t183521.916305\t532020.122575\t183540.072134\t8\t483.51025\n131\t531322.823096\t183496.217515\t531822.859891\t183537.217461\t5\t501.71484\n132\t531511.632096\t183610.975442\t531571.854282\t183510.164649\t5\t117.42882\n133\t531538.287099\t183509.645622\t531573.66377\t183613.636448\t5\t109.84353\n134\t531564.528151\t183594.396389\t531762.533216\t183634.411704\t4\t202.008\n135\t531647.800083\t183818.5796\t531724.933652\t183527.756719\t8\t300.87793\n136\t531562.202013\t183850.065477\t531683.634527\t183848.796579\t2\t121.43914\n137\t531554.551076\t183899.243828\t531664.561818\t183949.097288\t2\t120.77968\n138\t531559.344147\t183903.976806\t531563.459261\t183848.292996\t2\t55.835659\n139\t531576.977884\t184241.542411\t531576.980112\t184241.530177\t1\t0.012435302\n140\t531664.440206\t183676.204772\t531688.365256\t183680.369694\t1\t24.284863\n141\t531845.046699\t183572.646808\t531848.537589\t183527.458858\t2\t45.32259\n142\t531842.687431\t183564.306378\t531852.462311\t183586.297243\t2\t24.065462\n143\t531845.502111\t183582.366824\t531914.547926\t183602.2298\t2\t71.8461\n144\t531365.756011\t183674.793817\t531707.841194\t183754.590132\t5\t351.26874\n145\t531374.060775\t183774.507149\t531666.56825\t183767.108281\t4\t292.60104\n146\t531608.404903\t183886.834614\t531643.297417\t183893.505914\t1\t35.524551\n147\t531527.201005\t183719.292094\t531536.529925\t183626.42223\t3\t93.337242\n148\t531528.921394\t183660.739083\t531581.670868\t183596.162963\t4\t83.382149\n149\t531513.379763\t183590.060561\t531541.26357\t183665.204695\t4\t80.15078\n150\t531346.669404\t183577.424472\t531524.155712\t183596.636795\t3\t178.52312\n151\t531867.958408\t183802.842932\t531909.351639\t183825.129931\t2\t47.011806\n152\t531848.703773\t183863.683623\t531869.569538\t183801.833663\t1\t65.274788\n153\t531779.776929\t183878.633935\t531881.759204\t183900.601153\t3\t104.32134\n154\t531767.803098\t184029.197571\t531797.273386\t183732.060846\t5\t298.5946\n155\t531813.648701\t183652.055167\t531878.234973\t183675.891635\t2\t68.84449\n156\t531803.545994\t183682.252572\t531824.187543\t183625.803494\t3\t60.104675\n157\t531744.455054\t183655.80423\t531811.718445\t183679.555275\t2\t71.333557\n158\t531745.799066\t183659.270202\t531763.747518\t183606.077695\t3\t56.139023\n159\t531756.689274\t183606.516194\t531829.475123\t183633.130249\t2\t77.498955\n160\t532101.768494\t183858.112362\t532220.180595\t183621.485389\t2\t264.6011\n161\t531603.201562\t184097.54814\t531677.778268\t183688.047288\t9\t416.23627\n162\t530283.954463\t184816.224091\t530735.913127\t184226.335686\t8\t743.12512\n163\t530031.188827\t184139.955564\t532155.727239\t185032.528489\t15\t2304.4197\n164\t530658.07799\t184557.915926\t530736.182459\t184432.387497\t4\t147.84348\n165\t530571.605016\t184436.422319\t531028.529813\t184625.378231\t5\t494.45386\n166\t530666.7819\t184526.451467\t530666.970866\t184608.433553\t3\t81.982307\n167\t530587.419247\t184533.993682\t530675.26257\t184534.983211\t3\t87.848892\n168\t530484.78534\t184684.376675\t530604.445957\t184525.51954\t3\t198.88251\n169\t530494.120564\t184472.048499\t530795.550319\t184782.852818\t7\t432.96561\n170\t530525.083202\t184723.367243\t530669.158913\t184604.69952\t3\t186.65433\n171\t530483.801413\t184678.989008\t530525.930499\t184723.393522\t3\t61.209644\n172\t530293.689137\t184907.701657\t530512.942029\t184707.017488\t5\t297.2305\n173\t530341.616956\t184858.869376\t530423.516952\t184936.909058\t2\t113.12737\n174\t530363.061129\t184991.515821\t530950.638138\t184434.164686\t10\t809.86853\n175\t530794.377847\t184676.757956\t531157.155075\t184924.298761\t4\t439.18533\n176\t530714.63809\t184772.38299\t530841.86679\t184626.019141\t2\t193.93173\n177\t530853.353986\t184722.66267\t530895.942795\t184674.477205\t3\t64.308983\n178\t530872.524608\t184625.397132\t530895.312774\t184690.342917\t2\t68.827721\n179\t530881.770348\t184675.02409\t531228.261643\t184881.278496\t4\t403.23331\n180\t530872.205195\t184927.553625\t531056.800416\t184564.460939\t8\t407.3226\n181\t530862.145357\t184918.830286\t531068.273127\t185039.441704\t7\t238.82162\n182\t530697.991446\t185015.573733\t530880.160401\t184916.976808\t7\t207.13977\n183\t530696.935008\t184928.390774\t530754.360003\t184991.58642\t1\t85.389229\n184\t531185.28388\t184712.955635\t531230.299717\t184634.880893\t1\t90.122643\n185\t531065.300707\t185040.331386\t531310.676276\t184636.92219\t8\t472.17386\n186\t530762.244887\t184753.196919\t531117.1883\t184985.253807\t6\t424.06982\n187\t530857.793097\t185213.727228\t531119.059025\t184978.53416\t7\t351.53329\n188\t530551.230991\t185447.375269\t530733.983907\t185290.855505\t6\t240.61809\n189\t530348.818115\t184670.043145\t530754.964885\t185059.353265\t7\t562.59894\n190\t530751.101941\t185076.766671\t530768.042714\t185059.366534\t0\t24.284863\n191\t530958.127638\t185054.782177\t530999.561686\t185101.458496\t2\t62.413612\n192\t530956.132728\t185039.376138\t530961.105876\t185062.922141\t2\t24.065462\n193\t530952.798246\t185046.640697\t530997.089847\t184990.071126\t2\t71.8461\n194\t530292.86417\t185138.907267\t530369.446508\t185353.216185\t2\t227.58112\n195\t530279.260644\t185168.084421\t530370.209055\t184973.016186\t4\t215.22832\n196\t530155.854559\t184909.143223\t530296.643458\t184802.490186\t2\t176.62498\n197\t530239.94609\t184831.289787\t530402.572415\t185038.392418\t5\t263.32266\n198\t530841.737233\t184854.861003\t530862.205515\t184812.538912\t2\t47.011806\n199\t530790.470732\t184816.859996\t530843.634143\t184854.734123\t1\t65.274788\n200\t530725.866309\t184845.156464\t530795.607182\t184767.573259\t3\t104.32134\n201\t530627.898364\t184730.199677\t530825.968862\t184953.642755\t4\t298.5946\n202\t530886.13816\t185008.857925\t530924.487493\t184951.683697\t2\t68.84449\n203\t530860.25048\t184990.316729\t530910.065992\t185023.946875\t3\t60.104675\n204\t530827.884295\t185046.385296\t530868.452527\t184987.710817\t2\t71.333557\n205\t530826.941205\t185042.789476\t530872.665797\t185075.360191\t3\t56.139023\n206\t530866.690618\t185079.142828\t530910.054337\t185014.911405\t3\t77.498955\n207\t531280.890316\t184879.402502\t531418.783795\t184696.340072\t3\t229.18652\n208\t531365.823685\t184738.325775\t531592.602283\t184976.32175\t6\t328.74097\n209\t531322.135167\t184916.836174\t531466.210877\t184798.168452\t2\t186.65433\n210\t531280.853377\t184872.45794\t531322.982463\t184916.862454\t3\t61.209644\n211\t531090.741101\t185101.170589\t531309.993993\t184900.48642\t4\t297.2305\n212\t531234.61837\t185110.479476\t531708.28843\t184665.008406\t9\t650.23676\n213\t531591.429811\t184870.226888\t531810.671873\t185019.826566\t3\t265.41882\n214\t531511.690054\t184965.851921\t531638.918754\t184819.488073\t3\t193.93173\n215\t531650.40595\t184916.131602\t531692.994759\t184867.946136\t3\t64.308983\n216\t531669.576573\t184818.866063\t531692.364738\t184883.811849\t3\t68.827721\n217\t531678.822312\t184868.493022\t532025.313608\t185074.747427\t4\t403.23331\n218\t531669.25716\t185121.022557\t531803.886243\t184855.964934\t6\t297.28864\n219\t531659.197321\t185112.299218\t531865.325091\t185232.910635\t4\t238.82162\n220\t531525.017578\t185192.81948\t531677.212366\t185110.445739\t6\t173.05688\n221\t531361.980864\t184957.783264\t531551.411968\t185185.055352\t4\t295.86609\n222\t531559.296851\t184946.66585\t531914.240265\t185178.722739\t4\t424.06982\n223\t531495.587084\t185514.328262\t531683.190124\t185202.326857\t6\t364.06012\n224\t531462.599703\t185412.663349\t531570.487702\t185459.028287\t4\t117.42882\n225\t531511.293539\t185374.141666\t531543.598132\t185479.127446\t4\t109.84353\n226\t531145.870079\t184863.512077\t531379.525038\t185080.330385\t4\t318.7551\n227\t531313.34303\t185456.733951\t531364.882898\t185058.167136\t5\t401.88538\n228\t531306.054288\t185343.694337\t531471.261897\t185366.875736\t4\t166.82605\n229\t531447.432504\t185362.212424\t531528.024132\t185383.603353\t4\t83.382149\n230\t531454.813342\t185351.359118\t531476.276843\t185428.582597\t4\t80.15078\n231\t531385.807059\t185499.287467\t531481.151482\t185416.937606\t3\t125.98436\n232\t531046.820419\t185009.825167\t531131.431446\t185132.77165\t5\t149.24767\n233\t531638.789198\t185048.329935\t531659.257479\t185006.007844\t2\t47.011806\n234\t531587.522697\t185010.328928\t531640.686107\t185048.203055\t1\t65.274788\n235\t531522.918273\t185038.625395\t531592.659147\t184961.042191\t3\t104.32134\n236\t531424.950328\t184923.668608\t531623.020826\t185147.111687\t3\t298.5946\n237\t531683.190124\t185202.326857\t531721.539458\t185145.152628\t2\t68.84449\n238\t531522.475126\t185175.01268\t531707.117957\t185217.415806\t4\t189.4492\n239\t531190.971716\t185002.716462\t531271.956062\t185081.113568\t2\t112.71455\n240\t531383.970056\t186031.229354\t531510.979479\t185470.505352\t6\t574.92853\n241\t531394.31707\t185715.840841\t531446.57893\t185494.621034\t2\t227.30927\n242\t531201.708933\t185510.951124\t531303.192797\t185374.811772\t3\t169.80252\n243\t531179.130486\t185309.154054\t531945.523583\t185894.409458\t13\t964.30402\n244\t531119.729967\t185890.482946\t531306.259495\t185492.876981\t4\t439.18533\n245\t531199.143477\t185429.404668\t531363.921212\t185531.668132\t2\t193.93173\n246\t531270.345734\t185558.418033\t531324.705449\t185592.778869\t3\t64.308983\n247\t531308.942264\t185594.686673\t531369.423608\t185561.834543\t2\t68.827721\n248\t531173.537681\t185953.820275\t531321.905785\t185578.874941\t4\t403.23331\n249\t531071.081902\t185609.697629\t531458.962707\t185734.036583\t8\t407.3226\n250\t530991.888039\t185821.097506\t531078.08961\t185598.37557\t6\t238.82162\n251\t530956.409773\t185451.747407\t531082.791848\t185615.8646\t7\t207.13977\n252\t530989.078083\t185503.570056\t531042.308887\t185436.803289\t1\t85.389229\n253\t530990.535791\t185818.304973\t531427.908644\t185996.218258\t7\t472.17386\n254\t531053.182121\t185860.746689\t531225.67492\t185473.343204\t5\t424.06982\n255\t530705.244826\t185533.116831\t531060.114084\t185861.522043\t8\t483.51025\n256\t530721.65189\t185566.086325\t530750.221062\t185452.185798\t4\t117.42882\n257\t530697.522371\t185542.745556\t530796.014069\t185494.11443\t4\t109.84353\n258\t530775.957685\t185501.282477\t530944.392205\t185612.803972\t4\t202.008\n259\t530842.445203\t185661.751105\t530993.246275\t185401.392558\t7\t300.87793\n260\t530866.53772\t185054.496792\t530910.763225\t185339.341033\t5\t288.25708\n261\t531241.837484\t185051.9572\t531241.844548\t185051.946966\t1\t0.012435302\n262\t530922.274679\t185514.972524\t531058.699701\t185297.133443\t5\t257.03241\n263\t530904.468114\t185513.935543\t530924.34682\t185527.885154\t1\t24.284863\n264\t530929.736723\t185749.262318\t530959.18129\t185714.807208\t2\t45.32259\n265\t530951.620343\t185719.045249\t530974.072142\t185710.381351\t2\t24.065462\n266\t530966.368846\t185708.247852\t531029.276911\t185742.952862\t2\t71.8461\n267\t530692.026577\t185303.976423\t530990.555487\t185489.098583\t6\t351.26874\n268\t530835.94378\t185306.864232\t530970.178935\t185451.086004\t3\t197.02538\n269\t530668.7796\t185311.512872\t531368.109166\t185350.571812\t10\t700.41949\n270\t530778.756701\t185458.835796\t530837.745708\t185386.502282\t3\t93.337242\n271\t530789.341101\t185512.139628\t530797.608142\t185429.168318\t4\t83.382149\n272\t530736.68628\t185468.226257\t530809.499457\t185434.724184\t4\t80.15078\n273\t530609.743661\t185359.425586\t530748.959542\t185471.181754\t4\t178.52312\n274\t531137.98644\t185568.028734\t531183.03071\t185581.486954\t2\t47.011806\n275\t531138.414156\t185569.881144\t531167.326902\t185511.35892\t2\t65.274788\n276\t531037.954234\t185568.212706\t531226.956583\t185337.048601\t4\t298.5946\n277\t530905.703102\t185592.17185\t531055.596881\t185665.158545\t2\t166.71893\n278\t531259.240929\t185945.187025\t531342.541952\t185694.040277\t2\t264.6011\n279\t530564.955234\t184893.47949\t530687.494969\t184780.983957\t2\t166.34673\n280\t530406.734043\t184768.71716\t530476.74297\t184939.450519\t2\t184.52948\n281\t531070.732747\t185471.568523\t531173.366327\t185528.106492\t2\t117.17591\n282\t531054.947555\t184568.105455\t531230.772586\t184476.728485\t3\t198.15195\n283\t533270.701887\t183269.704674\t533995.226148\t183104.47889\t8\t743.12512\n284\t533457.921448\t183355.764288\t533604.573756\t183337.034753\t3\t147.84348\n285\t533511.624314\t183701.926679\t533530.131552\t183207.819313\t5\t494.45386\n286\t533572.342952\t183331.843845\t533646.798158\t183366.158863\t3\t81.982307\n287\t533576.567617\t183343.107265\t533612.252246\t183262.832514\t3\t87.848892\n288\t533597.456849\t183274.783083\t533791.716865\t183232.153296\t3\t198.88251\n289\t533594.791129\t183152.211723\t533751.821496\t183555.697392\t7\t432.96561\n290\t533642.492107\t183366.593004\t533810.382168\t183285.028513\t3\t186.65433\n291\t533787.228453\t183229.014949\t533810.053185\t183285.809776\t3\t61.209644\n292\t533800.574266\t183267.181171\t534074.33864\t183151.426975\t5\t297.2305\n293\t534009.982255\t183174.663224\t534046.822896\t183281.623817\t2\t113.12737\n294\t533363.7017\t183552.296365\t534121.646703\t183249.402658\t10\t816.2262\n295\t533655.853794\t183510.445932\t533729.818734\t183943.358112\t4\t439.18533\n296\t533589.946866\t183532.48916\t533776.00052\t183477.77576\t2\t193.93173\n297\t533611.481324\t183601.833701\t533673.02611\t183583.182025\t3\t64.308983\n298\t533576.613253\t183560.102626\t533626.168001\t183607.868539\t2\t68.827721\n299\t533617.880948\t183589.176602\t533661.093042\t183990.08783\t4\t403.23331\n300\t533444.467532\t183702.258531\t533851.451454\t183685.651865\t7\t407.3226\n301\t533847.710281\t183672.872952\t533871.517605\t183910.504985\t7\t238.82162\n302\t533838.522437\t183688.479385\t534004.029918\t183563.923552\t7\t207.13977\n303\t533925.207623\t183526.653856\t533958.745975\t183605.180913\t1\t85.389229\n304\t533207.325575\t183960.304964\t533517.743221\t183803.863123\t4\t347.61066\n305\t533404.613467\t183963.247494\t533873.564387\t183908.173141\t9\t472.17386\n306\t533738.730645\t183513.06696\t533801.880965\t183932.408424\t6\t424.06982\n307\t533794.992702\t183931.310648\t534224.474603\t183709.212763\t11\t483.51025\n308\t533968.092403\t183836.668115\t534457.72329\t183610.329606\t10\t539.41406\n309\t534199.883601\t183736.62557\t534202.663279\t183619.229654\t5\t117.42882\n310\t534147.361737\t183647.456398\t534229.355471\t183720.549685\t5\t109.84353\n311\t533972.743724\t183722.368537\t534164.786549\t183659.704473\t4\t202.008\n312\t533972.594317\t183472.65139\t534057.983991\t183796.686166\t9\t335.09689\n313\t533880.967657\t183491.655579\t534001.148439\t183474.218692\t3\t121.43914\n314\t533865.838452\t183444.240875\t533966.864912\t183378.048841\t2\t120.77968\n315\t533869.845916\t183438.826556\t533882.48274\t183493.213425\t2\t55.835659\n316\t533835.312059\t183102.569364\t534020.104195\t183633.953815\t10\t562.59894\n317\t534014.669713\t183645.849032\t534037.544378\t183637.694015\t1\t24.284863\n318\t533931.336857\t183816.755233\t533950.547856\t183857.804894\t2\t45.32259\n319\t533918.1613\t183808.525385\t533937.496942\t183822.85296\t2\t24.065462\n320\t533856.278232\t183825.227352\t533926.154582\t183808.519327\t2\t71.8461\n321\t533961.173903\t183590.83827\t534379.574955\t183474.228476\t6\t434.34695\n322\t534350.088555\t183462.429267\t534369.026017\t183662.818101\t4\t201.28168\n323\t534101.850875\t183248.196611\t534369.70918\t183492.811601\t5\t362.74588\n324\t533990.933559\t183559.620921\t534331.737103\t183358.328008\t3\t395.81042\n325\t533948.953082\t183438.148567\t533982.60772\t183426.774957\t1\t35.524551\n326\t534135.779962\t183532.618397\t534173.387016\t183618.044094\t3\t93.337242\n327\t534148.995999\t183666.60752\t534163.112597\t183584.429032\t4\t83.382149\n328\t534150.171418\t183586.619216\t534211.440101\t183638.294124\t4\t80.15078\n329\t534198.822923\t183637.876087\t534362.763695\t183567.208368\t3\t178.52312\n330\t533977.45538\t183110.29529\t534133.053441\t183026.715223\t2\t176.62498\n331\t534027.251348\t183070.743173\t534147.809166\t183304.847068\t4\t263.32266\n332\t533751.050565\t183628.660294\t533798.052098\t183627.677537\t2\t47.011806\n333\t533784.854581\t183565.242321\t533797.146736\t183629.349268\t1\t65.274788\n334\t533737.906423\t183549.385586\t533837.486192\t183518.291973\t3\t104.32134\n335\t533773.77426\t183381.348296\t533894.426477\t183654.481548\t3\t298.5946\n336\t533851.615179\t183743.233739\t533919.566465\t183732.179943\t2\t68.84449\n337\t533913.491248\t183700.922309\t533923.319298\t183760.218021\t3\t60.104675\n338\t533907.706166\t183707.293901\t533977.945511\t183694.847607\t2\t71.333557\n339\t533975.069147\t183692.492641\t533985.637771\t183747.627875\t3\t56.139023\n340\t533915.109567\t183756.444407\t533991.565242\t183743.77091\t2\t77.498955\n341\t533943.085985\t183201.548147\t533980.63292\t183307.825135\t2\t112.71455\n342\t533567.334441\t183694.694167\t533580.779713\t183958.953461\t2\t264.6011\n343\t533281.590018\t184813.90419\t533299.34\t184222.454929\t10\t591.71558\n344\t533203.504476\t184131.512968\t533448.516179\t184142.247827\t6\t245.24675\n345\t533355.566737\t184507.139752\t533425.55373\t183189.45307\t10\t1319.5439\n346\t533416.285375\t184137.056918\t533490.740581\t184171.371937\t3\t81.982307\n347\t533420.51004\t184148.320338\t533456.19467\t184068.045587\t3\t87.848892\n348\t533443.209115\t184079.783606\t533637.469131\t184037.153819\t3\t198.88251\n349\t533407.865187\t183878.109292\t533595.763919\t184360.910466\t7\t518.07617\n350\t533486.43453\t184171.806078\t533654.324591\t184090.241587\t3\t186.65433\n351\t533631.170876\t184034.228023\t533653.995608\t184091.022849\t3\t61.209644\n352\t533644.516689\t184072.394244\t533918.281063\t183956.640049\t5\t297.2305\n353\t533853.924678\t183979.876298\t533890.765319\t184086.836891\t2\t113.12737\n354\t533264.553798\t184336.433171\t533965.589126\t184054.615732\t11\t755.56042\n355\t533499.796217\t184315.659006\t533573.761157\t184748.571185\t5\t439.18533\n356\t533433.88929\t184337.702234\t533619.942943\t184282.988833\t3\t193.93173\n357\t533455.423747\t184407.046775\t533516.968533\t184388.395099\t3\t64.308983\n358\t533420.555676\t184365.315699\t533470.110424\t184413.081613\t2\t68.827721\n359\t533461.823371\t184394.389676\t533505.035465\t184795.300904\t4\t403.23331\n360\t533288.409955\t184507.471605\t533695.393878\t184490.864939\t8\t407.3226\n361\t533691.652704\t184478.086026\t533715.460028\t184715.718059\t7\t238.82162\n362\t533682.46486\t184493.692459\t533847.972341\t184369.136626\t7\t207.13977\n363\t533769.150046\t184331.86693\t533802.688398\t184410.393987\t1\t85.389229\n364\t533280.174611\t184638.111522\t533369.903983\t184629.701356\t2\t90.122643\n365\t533248.55589\t184768.460568\t533717.50681\t184713.386214\t11\t472.17386\n366\t533582.673068\t184318.280034\t533645.823388\t184737.621498\t6\t424.06982\n367\t533638.935125\t184736.523722\t534121.003937\t184485.225527\t11\t543.63696\n368\t534043.826024\t184541.838644\t534046.605702\t184424.442728\t4\t117.42882\n369\t533991.30416\t184452.669472\t534073.297894\t184525.762759\t4\t109.84353\n370\t533816.686147\t184527.581611\t534008.728972\t184464.917547\t4\t202.008\n371\t533816.53674\t184277.864464\t533901.926415\t184601.899239\t9\t335.09689\n372\t533724.91008\t184296.868652\t533845.090862\t184279.431766\t3\t121.43914\n373\t533709.780875\t184249.453948\t533810.807335\t184183.261915\t2\t120.77968\n374\t533713.788339\t184244.03963\t533726.425163\t184298.426499\t2\t55.835659\n375\t533679.254482\t183907.782438\t533864.046618\t184439.166889\t10\t562.59894\n376\t533858.612136\t184451.062105\t533881.486801\t184442.907089\t1\t24.284863\n377\t533775.27928\t184621.968307\t533794.490279\t184663.017968\t2\t45.32259\n378\t533762.103724\t184613.738458\t533781.439365\t184628.066033\t2\t24.065462\n379\t533700.220655\t184630.440425\t533770.097005\t184613.732401\t2\t71.8461\n380\t533805.116326\t184396.051343\t534148.833614\t184307.10038\t5\t355.04062\n381\t533945.793298\t184053.409685\t534099.428093\t184187.659445\t5\t204.02609\n382\t533834.875982\t184364.833995\t534111.873958\t184159.156088\t5\t345.00909\n383\t533792.895505\t184243.361641\t533826.550144\t184231.988031\t1\t35.524551\n384\t533979.722385\t184337.831471\t534017.329439\t184423.257168\t3\t93.337242\n385\t533992.938422\t184471.820594\t534007.05502\t184389.642106\t4\t83.382149\n386\t533994.113841\t184391.83229\t534055.382524\t184443.507198\t4\t80.15078\n387\t534042.765346\t184443.089161\t534157.341868\t184390.703292\t3\t125.98436\n388\t533853.526216\t183878.666834\t533991.751589\t184110.060142\t6\t269.535\n389\t533594.992988\t184433.873368\t533641.994521\t184432.89061\t2\t47.011806\n390\t533628.797004\t184370.455395\t533641.089159\t184434.562341\t1\t65.274788\n391\t533581.848846\t184354.59866\t533681.428615\t184323.505047\t3\t104.32134\n392\t533617.716683\t184186.56137\t533738.368901\t184459.694622\t3\t298.5946\n393\t533695.557602\t184548.446813\t533763.508888\t184537.393017\t2\t68.84449\n394\t533757.433671\t184506.135383\t533767.261721\t184565.431094\t3\t60.104675\n395\t533751.648589\t184512.506975\t533821.887935\t184500.060681\t2\t71.333557\n396\t533819.011571\t184497.705715\t533829.580194\t184552.840948\t3\t56.139023\n397\t533759.05199\t184561.657481\t533835.507666\t184548.983984\t2\t77.498955\n398\t533787.028409\t184006.76122\t533824.575343\t184113.038209\t3\t112.71455\n399\t533411.276864\t184499.907241\t533424.722136\t184764.166535\t3\t264.6011\n400\t534079.043875\t184492.516695\t534641.721189\t184610.571934\t10\t574.92853\n401\t534078.581459\t184263.75404\t534244.617529\t184228.188309\t4\t169.80252\n402\t534001.209547\t183814.256308\t534167.642419\t184551.258139\t11\t755.56042\n403\t534184.643095\t184315.712944\t534623.810302\t184321.836821\t4\t439.2099\n404\t534171.548117\t184191.894135\t534195.895544\t184384.291435\t2\t193.93173\n405\t534259.186721\t184310.35799\t534267.786545\t184374.08937\t3\t64.308983\n406\t534221.029704\t184401.857388\t534276.085944\t184360.552837\t2\t68.827721\n407\t534256.311788\t184365.753465\t534658.98396\t184387.018927\t4\t403.23331\n408\t534340.296458\t184554.97902\t534388.795247\t184150.554043\t7\t407.3226\n409\t534375.5833\t184152.209774\t534613.971169\t184166.597117\t5\t238.82162\n410\t534292.952711\t183980.51823\t534389.525079\t184163.768494\t7\t207.13977\n411\t534243.591734\t184052.389493\t534326.461777\t184031.801248\t1\t85.389229\n412\t534523.654664\t184592.936178\t534529.659313\t184503.013793\t1\t90.122643\n413\t534200.445183\t184234.314318\t534624.49092\t184238.835314\t5\t424.06982\n414\t534471.532711\t183786.060015\t534606.990485\t184209.222433\t7\t444.31436\n415\t534421.265724\t183576.333035\t534556.477661\t184059.484692\t5\t501.71484\n416\t534379.22304\t183793.244614\t534494.673805\t183814.707337\t5\t117.42882\n417\t534398.270908\t183852.339354\t534483.502838\t183783.049247\t5\t109.84353\n418\t534413.140645\t183837.090409\t534444.382051\t184036.667977\t4\t202.008\n419\t534231.831306\t183993.036716\t534531.340314\t183964.368091\t8\t300.87793\n420\t534172.577514\t183923.701456\t534215.940242\t184037.13487\t2\t121.43914\n421\t534115.258786\t184054.083176\t534123.803083\t183933.6061\t2\t120.77968\n422\t534121.029309\t183939.744568\t534174.676304\t183924.264876\t2\t55.835659\n423\t533810.59916\t184073.5153\t533810.611406\t184073.513141\t1\t0.012435302\n424\t533954.738015\t184048.098338\t534364.650043\t183975.815827\t8\t416.23627\n425\t534371.123204\t183959.195139\t534375.526555\t183983.077456\t1\t24.284863\n426\t534530.958921\t184092.594917\t534574.546569\t184080.175007\t2\t45.32259\n427\t534520.73354\t184104.289671\t534537.960852\t184087.485916\t2\t24.065462\n428\t534522.002078\t184096.397688\t534527.354661\t184168.044127\t2\t71.8461\n429\t534268.71504\t183678.612162\t534312.689759\t184027.117468\t5\t351.26874\n430\t534178.09244\t183721.02987\t534286.616931\t183992.760989\t4\t292.60104\n431\t534154.143024\t183979.798213\t534160.00494\t184014.835788\t1\t35.524551\n432\t534283.055419\t183845.462203\t534373.38459\t183821.957288\t3\t93.337242\n433\t534338.56135\t183826.740385\t534417.437595\t183853.779619\t4\t83.382149\n434\t534338.660061\t183839.865219\t534399.443055\t183787.619882\t4\t80.15078\n435\t534353.39508\t183626.897766\t534397.018576\t183800.008983\t3\t178.52312\n436\t534316.524037\t184240.583205\t534323.048179\t184194.026299\t2\t47.011806\n437\t534259.30742\t184197.099766\t534324.554163\t184195.186633\t1\t65.274788\n438\t534221.349777\t184137.655347\t534236.167736\t184240.918947\t3\t104.32134\n439\t534075.999349\t184178.716694\t534364.876021\t184103.158771\t5\t298.5946\n440\t534445.588895\t184090.729314\t534445.666539\t184159.57376\t2\t68.84449\n441\t534413.76248\t184091.742822\t534473.866644\t184091.495124\t3\t60.104675\n442\t534418.042635\t184027.144569\t534419.130132\t184098.469833\t2\t71.333557\n443\t534415.259165\t184029.608637\t534471.374163\t184027.966459\t3\t56.139023\n444\t534468.511671\t184021.499835\t534468.83228\t184098.998125\t2\t77.498955\n445\t534352.419821\t184432.477914\t534615.442074\t184461.340417\t3\t264.6011\n446\t532822.628275\t183060.558178\t533532.762428\t183279.520388\t8\t743.12512\n447\t533311.003242\t183772.13925\t533342.10287\t183213.502392\t5\t559.50183\n448\t533194.789303\t183321.685907\t533339.629599\t183351.33356\t4\t147.84348\n449\t533234.487353\t184185.811657\t533278.689124\t183198.40131\t9\t988.39923\n450\t533150.504528\t183347.569737\t533227.318113\t183318.920628\t3\t81.982307\n451\t533192.683163\t183247.117175\t533222.262704\t183329.836454\t3\t87.848892\n452\t533016.016412\t183203.098735\t533206.54312\t183260.141057\t3\t198.88251\n453\t533031.59668\t183528.720721\t533218.370549\t183138.112551\t7\t432.96561\n454\t532993.447981\t183254.429505\t533154.766037\t183348.324784\t3\t186.65433\n455\t532993.717598\t183255.233189\t533020.727019\t183200.304946\t3\t61.209644\n456\t532740.225415\t183101.456559\t533004.563505\t183237.365869\t5\t297.2305\n457\t532757.924444\t183233.346962\t532802.663245\t183129.442\t2\t113.12737\n458\t532685.720654\t183195.618751\t533412.442248\t183553.057914\t11\t809.86853\n459\t533024.538111\t183916.941189\t533130.680604\t183490.775096\t4\t439.18533\n460\t533013.314477\t183449.208665\t533194.753878\t183517.68685\t2\t193.93173\n461\t533108.115245\t183562.022779\t533168.092312\t183585.226165\t3\t64.308983\n462\t533152.99534\t183590.14543\t533205.984455\t183546.220389\t2\t68.827721\n463\t533089.575533\t183968.681125\t533162.657458\t183572.125795\t4\t403.23331\n464\t532922.524395\t183650.858063\t533327.125673\t183697.863386\t8\t407.3226\n465\t532885.693914\t183873.580068\t532927.211036\t183638.394822\t7\t238.82162\n466\t532779.479562\t183518.056912\t532935.205668\t183654.64484\t7\t207.13977\n467\t532821.550289\t183562.586222\t532860.869029\t183486.788093\t1\t85.389229\n468\t532883.827305\t183871.101644\t533293.632281\t183952.760517\t9\t417.86157\n469\t532953.496908\t183900.631433\t533047.8399\t183487.189023\t6\t424.06982\n470\t532548.783925\t183646.448256\t532960.447991\t183900.052022\t11\t483.51025\n471\t532323.585929\t183530.393563\t532794.913219\t183792.725629\t8\t539.41406\n472\t532571.255358\t183675.623828\t532577.265488\t183558.348912\t5\t117.42882\n473\t532543.068654\t183657.388289\t532630.300523\t183590.633501\t5\t109.84353\n474\t532612.008295\t183601.543762\t532798.825322\t183678.398363\t4\t202.008\n475\t532708.264427\t183746.1312\t532817.654866\t183429.39209\t8\t335.09689\n476\t532758.211581\t183586.688488\t532982.237138\t183070.616672\t8\t562.59894\n477\t532740.540472\t183589.113563\t532762.740992\t183598.956911\t1\t24.284863\n478\t532810.82743\t183815.115636\t532833.055397\t183775.618109\t2\t45.32259\n479\t532826.456421\t183781.237933\t532846.809685\t183768.396942\t2\t24.065462\n480\t532838.839254\t183767.79295\t532907.269939\t183789.681389\t2\t71.8461\n481\t532411.696593\t183400.519815\t532820.202092\t183548.10214\t5\t434.34695\n482\t532420.14458\t183419.788898\t532705.551235\t183195.896947\t4\t362.74588\n483\t532468.070555\t183288.522695\t532792.861092\t183514.746035\t3\t395.81042\n484\t532606.548409\t183559.356739\t532650.440517\t183476.983667\t3\t93.337242\n485\t532619.308676\t183526.604462\t532627.238206\t183609.608708\t4\t83.382149\n486\t532567.087105\t183576.703398\t532632.049753\t183529.756598\t4\t80.15078\n487\t532319.10546\t183440.943243\t532579.700202\t183577.230383\t3\t294.0813\n488\t532691.004424\t182972.701974\t532839.914144\t183067.687656\t2\t176.62498\n489\t532655.483875\t183248.950676\t532793.216472\t183024.521282\t4\t263.32266\n490\t532980.111006\t183597.040814\t533026.907326\t183601.536855\t2\t47.011806\n491\t532980.888774\t183598.775588\t532997.942126\t183535.767805\t1\t65.274788\n492\t532948.970195\t183485.011804\t533045.94493\t183523.467543\t3\t104.32134\n493\t532882.00154\t183616.560258\t533022.747935\t183353.217927\t4\t298.5946\n494\t532851.11962\t183692.160301\t532918.05361\t183708.266348\t2\t68.84449\n495\t532845.279862\t183719.83908\t532859.5161\t183661.444718\t3\t60.104675\n496\t532795.696864\t183650.565417\t532864.808334\t183668.231221\t2\t71.333557\n497\t532784.077833\t183702.622362\t532798.741337\t183648.432221\t3\t56.139023\n498\t532778.455497\t183698.332789\t532853.748882\t183716.690184\t2\t77.498955\n499\t533126.981531\t184343.351798\t533236.94103\t184128.252751\t5\t241.57544\n500\t532835.610266\t183916.087636\t533298.551877\t184154.108856\t5\t520.54688\n501\t532781.105505\t184010.249828\t533459.094685\t184343.719876\t10\t755.56042\n502\t533119.922963\t184731.572266\t533226.065455\t184305.406173\t5\t439.18533\n503\t533108.699328\t184263.839742\t533290.13873\t184332.317927\t3\t193.93173\n504\t533203.500097\t184376.653856\t533263.477163\t184399.857242\t3\t64.308983\n505\t533248.380191\t184404.776507\t533301.369306\t184360.851466\t3\t68.827721\n506\t533184.960385\t184783.312202\t533258.042309\t184386.756872\t5\t403.23331\n507\t533017.909246\t184465.48914\t533313.224583\t184499.685418\t6\t297.28864\n508\t532981.078765\t184688.211145\t533022.595887\t184453.025899\t8\t238.82162\n509\t532874.864413\t184332.687989\t533030.590519\t184469.275916\t7\t207.13977\n510\t532916.93514\t184377.217299\t532956.25388\t184301.41917\t1\t85.389229\n511\t532979.212156\t184685.732721\t533312.519029\t184749.741937\t8\t339.39749\n512\t533048.881759\t184715.26251\t533143.224751\t184301.8201\t7\t424.06982\n513\t532593.913595\t184428.026979\t533055.832842\t184714.683099\t11\t543.63696\n514\t532666.640209\t184490.254905\t532672.650339\t184372.979989\t5\t117.42882\n515\t532638.453505\t184472.019366\t532725.685375\t184405.264577\t4\t109.84353\n516\t532707.393146\t184416.174838\t532894.210173\t184493.02944\t4\t202.008\n517\t532803.649278\t184560.762277\t532913.039717\t184244.023167\t9\t335.09689\n518\t532884.448357\t184243.450033\t533002.988\t184269.828409\t3\t121.43914\n519\t533001.360624\t184271.268552\t533018.030551\t184217.979393\t1\t55.835659\n520\t532853.596432\t184401.319564\t533077.621989\t183885.247749\t9\t562.59894\n521\t532835.925323\t184403.74464\t532858.125843\t184413.587987\t1\t24.284863\n522\t532906.212281\t184629.746713\t532928.440249\t184590.249186\t2\t45.32259\n523\t532921.841272\t184595.86901\t532942.194537\t184583.028019\t2\t24.065462\n524\t532934.224105\t184582.424026\t533002.65479\t184604.312466\t2\t71.8461\n525\t532579.486878\t184248.319081\t532915.586943\t184362.733217\t5\t355.04062\n526\t532637.688968\t184132.908686\t532800.936086\t184010.528024\t5\t204.02609\n527\t532627.410222\t184103.554158\t532888.245943\t184329.377111\t5\t345.00909\n528\t532906.486242\t184197.526206\t532939.195758\t184211.385546\t1\t35.524551\n529\t532701.93326\t184373.987816\t532745.825368\t184291.614744\t3\t93.337242\n530\t532714.693527\t184341.235539\t532722.623057\t184424.239785\t4\t83.382149\n531\t532662.471957\t184391.334474\t532727.434605\t184344.387675\t4\t80.15078\n532\t532564.748392\t184331.051265\t532675.085054\t184391.86146\t3\t125.98436\n533\t532750.868727\t184063.581753\t532906.016604\t183843.177006\t7\t269.535\n534\t533075.495857\t184411.671891\t533122.292177\t184416.167932\t2\t47.011806\n535\t533076.273625\t184413.406665\t533093.326978\t184350.398881\t1\t65.274788\n536\t533044.355046\t184299.642881\t533141.329781\t184338.09862\t3\t104.32134\n537\t532977.386391\t184431.191335\t533118.132786\t184167.849003\t3\t298.5946\n538\t532946.504472\t184506.791378\t533013.438462\t184522.897425\t3\t68.84449\n539\t532940.664713\t184534.470157\t532954.900952\t184476.075795\t3\t60.104675\n540\t532891.081716\t184465.196494\t532960.193186\t184482.862298\t2\t71.333557\n541\t532879.462684\t184517.253439\t532894.126188\t184463.063297\t3\t56.139023\n542\t532873.840348\t184512.963866\t532949.133733\t184531.321261\t2\t77.498955\n543\t532917.353772\t184079.057405\t532962.745749\t183975.886969\t2\t112.71455\n544\t532065.2786\t184514.06895\t532635.210657\t184438.436618\t7\t574.92853\n545\t532364.629597\t184414.239317\t532590.230088\t184386.41984\t1\t227.30927\n546\t532489.874509\t184162.462824\t532652.784793\t184210.349538\t2\t169.80252\n547\t532542.4661\t184490.385692\t532763.565425\t183767.899229\t12\t755.56042\n548\t532030.38234\t184165.122698\t532543.133455\t184254.228718\t5\t520.43597\n549\t532526.782394\t184321.773294\t532565.454237\t184131.736438\t2\t193.93173\n550\t532455.856013\t184306.221875\t532469.199284\t184243.312394\t2\t64.308983\n551\t532448.592493\t184292.102419\t532500.404605\t184337.409821\t2\t68.827721\n552\t532151.559428\t184344.737703\t532467.9222\t184298.767718\t5\t319.68521\n553\t532126.163226\t184073.414024\t532546.372759\t184062.610646\t5\t420.34839\n554\t532532.763551\t183974.089967\t532584.490376\t183864.218218\t2\t121.43914\n555\t532631.895052\t183998.522448\t532632.387207\t183877.743771\t2\t120.77968\n556\t532582.355319\t183864.623056\t532634.69401\t183884.072537\t2\t55.835659\n557\t532934.235328\t184040.687683\t532934.247379\t184040.690753\t1\t0.012435302\n558\t532167.934598\t183901.818224\t532792.413758\t184004.562433\t7\t632.87488\n559\t532368.508548\t184092.677579\t532506.956582\t183612.623908\t4\t499.61923\n560\t532478.124198\t183964.520986\t532594.152127\t183661.701955\t4\t324.28668\n561\t532590.210249\t183956.03771\t532598.676791\t183921.536821\t0\t35.524551\n562\t532306.05875\t184266.992332\t532414.219172\t184122.529385\t3\t180.46667\n563\t532412.630606\t184123.573809\t532477.551415\t184130.362486\t2\t65.274788\n564\t532439.682428\t184049.515329\t532661.721044\t184125.743623\t5\t234.75923\n565\t532847.771489\t183350.898751\t532995.822217\t183426.742101\t2\t166.34673\n566\t532774.026261\t183284.142626\t532909.818834\t183159.196609\t2\t184.52948\n567\t532709.490275\t183812.886376\t532835.431428\t183979.968037\t2\t209.23062\n568\t532463.943732\t184141.842329\t532481.318515\t184025.961742\t3\t117.17591\n569\t533323.064517\t183697.391573\t533469.816857\t183830.537895\t3\t198.15195\n570\t529846.791844\t185094.627525\t532736.351417\t185388.776756\t16\t2904.4927\n571\t530347.847156\t185292.772305\t530632.54739\t185377.731381\t3\t297.10651\n572\t530537.847519\t185421.393549\t530918.45134\t185724.218064\t2\t486.37634\n573\t530524.468228\t184838.411754\t530539.002713\t185369.052417\t5\t530.83966\n574\t530335.169085\t184982.866758\t530559.280279\t185043.45439\t5\t232.1566\n575\t530707.024701\t184994.505864\t530707.477025\t185313.557473\t6\t319.05194\n576\t531131.431446\t185132.77165\t531131.431446\t185359.356031\t3\t226.58438\n577\t530501.676063\t185036.509115\t530743.403575\t185005.682885\t5\t243.68513\n578\t530485.48235\t185236.499696\t530775.181629\t185251.675793\t2\t290.0965\n579\t532544.992916\t185376.432414\t536042.612412\t185481.987222\t23\t3499.2119\n580\t532310.185466\t184245.557105\t532320.564971\t184501.568004\t4\t256.22122\n581\t532121.12861\t185156.54299\t532552.782294\t185237.529808\t4\t439.18533\n582\t532107.183652\t185396.499385\t532132.218217\t185032.528489\t3\t364.83084\n583\t532191.417756\t185229.891994\t532195.30118\t185165.700369\t1\t64.308983\n584\t532227.588839\t185421.387179\t532353.359001\t185033.968077\t5\t407.3226\n585\t532340.076208\t185033.038343\t532571.18527\t185093.24111\t7\t238.82162\n586\t532292.197138\t184848.611134\t532351.520352\t185047.074325\t6\t207.13977\n587\t532229.872721\t184909.583681\t532315.159633\t184905.404877\t1\t85.389229\n588\t532325.041594\t185475.024213\t532348.317401\t185387.959135\t1\t90.122643\n589\t532458.491775\t185549.400536\t532569.709404\t185090.511891\t8\t472.17386\n590\t532152.369147\t185079.734976\t532567.540953\t185166.15024\t5\t424.06982\n591\t532505.002165\t184692.345865\t532564.119253\t185172.2285\t11\t483.51025\n592\t532493.279792\t184439.273909\t532535.484156\t184977.034374\t10\t539.41406\n593\t532413.044998\t184681.548955\t532522.168382\t184724.926539\t5\t117.42882\n594\t532420.308897\t184743.211305\t532517.328531\t184691.706048\t5\t109.84353\n595\t532429.914393\t184932.976985\t532437.846142\t184731.124765\t4\t202.008\n596\t532009.678491\t184830.207924\t532529.209664\t184878.852478\t9\t521.80353\n597\t532372.718405\t184867.085846\t532373.015227\t184842.802797\t1\t24.284863\n598\t532504.045738\t185004.586487\t532549.212182\t185000.827563\t2\t45.32259\n599\t532491.752352\t185014.083768\t532511.903281\t185000.927534\t2\t24.065462\n600\t532485.923093\t185077.915497\t532494.522692\t185006.585915\t2\t71.8461\n601\t532302.552935\t184898.146955\t532338.509646\t184465.290859\t6\t434.34695\n602\t532317.204408\t184488.844117\t532511.697154\t184540.679279\t4\t201.28168\n603\t532213.209452\t184469.899539\t532283.614029\t184859.398047\t3\t395.81042\n604\t532308.596564\t184714.189612\t532401.765755\t184708.591215\t4\t93.337242\n605\t532366.674775\t184706.551798\t532438.83555\t184748.32984\t4\t83.382149\n606\t532364.234237\t184719.448107\t532433.970963\t184679.939416\t4\t80.15078\n607\t532419.863664\t184513.347103\t532429.197073\t184691.626071\t3\t178.52312\n608\t532265.046152\t185108.326792\t532280.447926\t185063.909506\t2\t47.011806\n609\t532217.315493\t185054.60217\t532281.701175\t185065.339097\t1\t65.274788\n610\t532186.140917\t185093.121144\t532191.566167\t184988.940965\t2\t104.32134\n611\t532041.019596\t185001.127477\t532339.05382\t184982.842711\t3\t298.5946\n612\t532407.413622\t185053.812396\t532420.646945\t184986.251735\t2\t68.84449\n613\t532389.225017\t184981.093212\t532448.243164\t184992.469955\t3\t60.104675\n614\t532393.190891\t184988.731026\t532405.913021\t184918.541117\t2\t71.333557\n615\t532402.705692\t184920.420579\t532458.079522\t184929.657935\t3\t56.139023\n616\t532441.853242\t184998.858127\t532456.521206\t184922.75991\t2\t77.498955\n617\t532481.890775\t185659.270838\t533213.475046\t185960.194699\t11\t791.0567\n618\t532608.229846\t185714.42505\t532641.597608\t185570.396278\t4\t147.84348\n619\t532494.571678\t185595.329141\t532951.496475\t185784.285053\t4\t494.45386\n620\t532625.536229\t185598.818142\t532683.573214\t185540.914717\t2\t81.982307\n621\t532574.680692\t185537.425716\t532637.565773\t185598.768157\t2\t87.848892\n622\t532379.782201\t185516.78321\t532897.788147\t185508.254066\t5\t518.07617\n623\t532630.128728\t185133.831243\t532743.226231\t185136.430499\t1\t113.12737\n624\t532738.996515\t185055.073787\t532759.807049\t185810.347593\t11\t755.56042\n625\t532822.02428\t185582.532804\t533308.048429\t185701.947063\t4\t500.479\n626\t532819.806359\t185651.992921\t532833.113887\t185458.518303\t3\t193.93173\n627\t532892.313426\t185655.881808\t532896.19685\t185591.690183\t3\t64.308983\n628\t532841.070371\t185674.086597\t532903.073231\t185644.20515\t2\t68.827721\n629\t532882.666705\t185645.484784\t533018.964367\t185679.897592\t3\t140.57487\n630\t532928.484509\t185847.376993\t533171.791246\t185088.690552\t12\t796.74542\n631\t533040.971878\t185459.028157\t533342.086167\t185539.229407\t3\t311.61203\n632\t533040.869687\t185902.686787\t533064.145494\t185815.621709\t1\t90.122643\n633\t532853.264817\t185505.72479\t533314.949235\t185601.821346\t5\t471.57932\n634\t532896.584368\t185272.381584\t533323.615384\t185304.842292\t5\t428.263\n635\t532501.860312\t185272.591524\t533064.346626\t185283.848301\t5\t562.59894\n636\t533003.448605\t185324.136769\t533056.976395\t184798.314821\t5\t528.53943\n637\t532730.99056\t185073.218594\t532910.240585\t184975.770777\t5\t204.02609\n638\t532887.833761\t184954.200538\t532984.509699\t185285.387861\t5\t345.00909\n639\t533009.492234\t185140.179426\t533223.840618\t185128.424782\t4\t214.67044\n640\t533120.759334\t184991.97773\t533164.669849\t185152.192991\t4\t166.12364\n641\t532535.080541\t185099.055441\t532800.075927\t185049.795298\t6\t269.535\n642\t532965.941822\t185534.316606\t532981.343596\t185489.89932\t2\t47.011806\n643\t532918.211163\t185480.591984\t532982.596845\t185491.328911\t1\t65.274788\n644\t532887.036587\t185519.110958\t532892.461837\t185414.930779\t2\t104.32134\n645\t532632.107543\t185205.900614\t532744.809283\t185207.600127\t2\t112.71455\n646\t532964.061948\t185729.530726\t533287.399961\t185848.0167\t3\t344.36377\n647\t533160.485194\t185038.203824\t533312.377108\t184720.549657\t5\t352.10129\n648\t532525.968737\t184938.195076\t533310.15909\t185042.780793\t10\t791.13379\n649\t532783.202604\t184722.352915\t533016.354731\t184679.635872\t7\t237.03304\n650\t532833.457546\t184793.601953\t532842.931078\t184708.739877\t1\t85.389229\n651\t532637.546794\t184576.413333\t532697.76898\t184475.60254\t4\t117.42882\n652\t532664.201797\t184475.083512\t532699.578469\t184579.074338\t3\t109.84353\n653\t532790.659095\t184784.017491\t532807.61867\t184536.424288\t5\t248.17337\n654\t532688.116711\t184815.503368\t532809.549225\t184814.234469\t2\t121.43914\n655\t532680.465774\t184864.681718\t532790.476516\t184914.535179\t2\t120.77968\n656\t532685.258845\t184869.414696\t532689.373959\t184813.730886\t2\t55.835659\n657\t532702.892582\t185206.980301\t532702.89481\t185206.968067\t1\t0.012435302\n658\t532729.11626\t185062.986031\t532803.692966\t184653.485179\t9\t416.23627\n659\t532491.67071\t184640.231707\t532833.755893\t184720.028022\t5\t351.26874\n660\t532499.975473\t184739.94504\t532792.482948\t184732.546172\t3\t292.60104\n661\t532734.319602\t184852.272505\t532769.212115\t184858.943804\t1\t35.524551\n662\t532653.115703\t184684.729984\t532662.444623\t184591.860121\t3\t93.337242\n663\t532654.836092\t184626.176973\t532707.585566\t184561.600854\t3\t83.382149\n664\t532639.294461\t184555.498451\t532667.178268\t184630.642585\t4\t80.15078\n665\t532472.584102\t184542.862363\t532650.07041\t184562.074685\t3\t178.52312\n666\t532893.717797\t184994.635461\t532923.188084\t184697.498736\t4\t298.5946\n667\t531538.538439\t185607.847884\t531861.827826\t185191.773577\t6\t526.90973\n668\t531733.704075\t185347.638093\t532464.148204\t185651.318997\t8\t791.0567\n669\t531783.992688\t185523.353816\t531862.097157\t185397.825387\t4\t147.84348\n670\t531697.519714\t185401.860209\t532154.444511\t185590.816121\t5\t494.45386\n671\t531792.696598\t185491.889357\t531792.885564\t185573.871444\t3\t81.982307\n672\t531713.333946\t185499.431572\t531801.177268\t185500.421101\t3\t87.848892\n673\t531610.700038\t185649.814566\t531730.360655\t185490.95743\t4\t198.88251\n674\t531620.035263\t185437.486389\t531921.465017\t185748.290708\t7\t432.96561\n675\t531650.997901\t185688.805133\t531795.073611\t185570.13741\t4\t186.65433\n676\t531609.716111\t185644.426899\t531651.845197\t185688.831412\t3\t61.209644\n677\t531419.603835\t185873.139547\t531638.856727\t185672.455379\t5\t297.2305\n678\t531467.531654\t185824.307266\t531549.43165\t185902.346948\t2\t113.12737\n679\t531488.975827\t185956.953711\t532119.186289\t185356.969123\t9\t870.14178\n680\t531920.292545\t185642.195846\t532283.069773\t185889.736651\t4\t439.18533\n681\t531840.552788\t185737.82088\t531967.781488\t185591.457031\t2\t193.93173\n682\t531979.268684\t185688.10056\t532021.857493\t185639.915095\t3\t64.308983\n683\t531998.439307\t185590.835022\t532021.227472\t185655.780807\t2\t68.827721\n684\t532007.685046\t185640.46198\t532354.176342\t185846.716386\t4\t403.23331\n685\t531998.119894\t185892.991515\t532182.715114\t185529.898829\t7\t407.3226\n686\t531988.060055\t185884.268177\t532194.187825\t186004.879594\t7\t238.82162\n687\t531823.906145\t185981.011624\t532006.0751\t185882.414698\t6\t207.13977\n688\t531822.849706\t185893.828664\t531880.274702\t185957.02431\t1\t85.389229\n689\t532311.198579\t185678.393526\t532356.214415\t185600.318783\t1\t90.122643\n690\t532191.215405\t186005.769276\t532436.590975\t185602.36008\t8\t472.17386\n691\t531888.159585\t185718.634809\t532243.102999\t185950.691698\t5\t424.06982\n692\t531983.707795\t186179.165119\t532196.631823\t185988.747422\t5\t285.64932\n693\t531651.967629\t186274.379\t531834.720544\t186117.859235\t5\t240.61809\n694\t531474.732813\t185635.481035\t531880.879584\t186024.791155\t5\t562.59894\n695\t532084.042336\t186020.220067\t532125.476384\t186066.896386\t2\t62.413612\n696\t532082.047427\t186004.814029\t532087.020575\t186028.360031\t2\t24.065462\n697\t532078.712944\t186012.078587\t532123.004546\t185955.509016\t2\t71.8461\n698\t531418.778869\t186104.345157\t531495.361206\t186318.654076\t1\t227.58112\n699\t531405.175343\t186133.522312\t531496.123753\t185938.454076\t2\t215.22832\n700\t531967.651931\t185820.298893\t531988.120213\t185777.976802\t2\t47.011806\n701\t531916.385431\t185782.297886\t531969.548841\t185820.172013\t1\t65.274788\n702\t531851.781007\t185810.594354\t531921.521881\t185733.01115\t3\t104.32134\n703\t531753.813062\t185695.637567\t531951.88356\t185919.080645\t5\t298.5946\n704\t532012.052858\t185974.295815\t532050.402192\t185917.121587\t2\t68.84449\n705\t531986.165178\t185955.754619\t532035.980691\t185989.384765\t3\t60.104675\n706\t531953.798994\t186011.823186\t531994.367226\t185953.148707\t2\t71.333557\n707\t531952.855903\t186008.227366\t531998.580495\t186040.798082\t3\t56.139023\n708\t531992.605316\t186044.580718\t532035.969035\t185980.349295\t3\t77.498955\n709\t532589.748562\t185685.358288\t532589.937528\t185767.340375\t3\t81.982307\n710\t532510.38591\t185692.900503\t532598.229233\t185693.890033\t3\t87.848892\n711\t532406.805014\t185844.840392\t532526.465631\t185685.983256\t3\t198.88251\n712\t532357.833442\t185569.858724\t532718.516981\t185941.75964\t8\t518.07617\n713\t532448.049865\t185882.274065\t532592.125576\t185763.606342\t3\t186.65433\n714\t532406.768075\t185837.89583\t532448.897161\t185882.300344\t3\t61.209644\n715\t532216.655799\t186066.608479\t532435.908691\t185865.92431\t5\t297.2305\n716\t532360.533068\t186075.917366\t532834.203129\t185630.446297\t10\t650.23676\n717\t532717.344509\t185835.664778\t532936.586571\t185985.264456\t3\t265.41882\n718\t532637.604753\t185931.289811\t532764.833452\t185784.925963\t3\t193.93173\n719\t532776.320648\t185881.569492\t532818.909457\t185833.384027\t3\t64.308983\n720\t532795.491271\t185784.303954\t532818.279437\t185849.249739\t3\t68.827721\n721\t532804.73701\t185833.930912\t533151.228306\t186040.185318\t3\t403.23331\n722\t532795.171858\t186086.460447\t532929.800941\t185821.402824\t6\t297.28864\n723\t532785.112019\t186077.737108\t532991.239789\t186198.348525\t3\t238.82162\n724\t532620.958109\t186174.480555\t532803.127064\t186075.88363\t5\t207.13977\n725\t532487.895562\t185923.221154\t532677.326666\t186150.493242\t2\t295.86609\n726\t532685.211549\t185912.103741\t533069.580712\t186166.970325\t5\t461.19046\n727\t532596.323721\t186341.331993\t532783.926762\t186029.330587\t5\t364.06012\n728\t532563.33634\t186239.667079\t532671.224339\t186286.032017\t4\t117.42882\n729\t532612.030176\t186201.145396\t532644.334769\t186306.131177\t3\t109.84353\n730\t532271.784777\t185828.949967\t532505.439737\t186045.768275\t4\t318.7551\n731\t532414.079667\t186283.737681\t532456.17094\t185958.238507\t5\t328.20935\n732\t532406.790925\t186170.698068\t532571.998535\t186193.879467\t4\t166.82605\n733\t532548.169142\t186189.216154\t532628.760769\t186210.607084\t3\t83.382149\n734\t532555.549979\t186178.362848\t532577.01348\t186255.586328\t4\t80.15078\n735\t532486.543697\t186326.291197\t532581.88812\t186243.941337\t3\t125.98436\n736\t532172.735117\t185975.263057\t532257.346144\t186098.20954\t5\t149.24767\n737\t532764.703896\t186013.767825\t532785.172178\t185971.445734\t2\t47.011806\n738\t532713.437395\t185975.766818\t532766.600805\t186013.640945\t1\t65.274788\n739\t532648.832971\t186004.063285\t532718.573845\t185926.480081\t3\t104.32134\n740\t532550.865026\t185889.106499\t532748.935524\t186112.549577\t4\t298.5946\n741\t532809.104823\t186167.764747\t532847.454156\t186110.590519\t2\t68.84449\n742\t532783.217143\t186149.223551\t532833.032655\t186182.853696\t1\t60.104675\n743\t532316.886414\t185968.154353\t532397.870761\t186046.551458\t2\t112.71455\n744\t532484.706693\t186858.233085\t532611.716116\t186297.509083\t5\t574.92853\n745\t532495.053707\t186542.844571\t532547.315567\t186321.624765\t2\t227.30927\n746\t532302.445571\t186337.954854\t532403.929434\t186201.815503\t3\t169.80252\n747\t532279.867123\t186136.157785\t533301.964636\t186916.681637\t8\t1286.0408\n748\t532220.466605\t186717.486676\t532406.996132\t186319.880711\t4\t439.18533\n749\t532299.880114\t186256.408398\t532464.657849\t186358.671862\t2\t193.93173\n750\t532371.082371\t186385.421764\t532425.442087\t186419.782599\t3\t64.308983\n751\t532409.678901\t186421.690404\t532470.160245\t186388.838273\t2\t68.827721\n752\t532274.274318\t186780.824005\t532422.642422\t186405.878671\t4\t403.23331\n753\t532171.81854\t186436.70136\t532559.699344\t186561.040314\t8\t407.3226\n754\t532092.624676\t186648.101237\t532178.826247\t186425.3793\t6\t238.82162\n755\t532057.146411\t186278.751138\t532183.528486\t186442.868331\t7\t207.13977\n756\t532089.81472\t186330.573787\t532143.045525\t186263.807019\t1\t85.389229\n757\t532433.590954\t186711.557255\t532517.844537\t186743.548266\t1\t90.122643\n758\t532091.272428\t186645.308703\t532528.645281\t186823.221988\t7\t472.17386\n759\t532153.918759\t186687.75042\t532326.411557\t186300.346934\t5\t424.06982\n760\t531805.981463\t186360.120561\t532160.850721\t186688.525773\t8\t483.51025\n761\t531638.584156\t186248.397279\t532019.187977\t186551.221795\t2\t486.37634\n762\t531822.388527\t186393.090056\t531850.957699\t186279.189528\t4\t117.42882\n763\t531798.259009\t186369.749287\t531896.750706\t186321.11816\t4\t109.84353\n764\t531876.694323\t186328.286208\t532045.128842\t186439.807703\t4\t202.008\n765\t531943.18184\t186488.754835\t532093.982912\t186228.396289\t7\t300.87793\n766\t531995.178958\t186015.230887\t532011.499862\t186166.344763\t4\t151.99268\n767\t532367.752182\t186017.395091\t532367.759246\t186017.384856\t1\t0.012435302\n768\t532023.011316\t186341.976255\t532159.436339\t186124.137174\t5\t257.03241\n769\t532005.204751\t186340.939274\t532025.083457\t186354.888884\t1\t24.284863\n770\t532030.47336\t186576.266049\t532059.917927\t186541.810938\t2\t45.32259\n771\t532052.35698\t186546.04898\t532074.808779\t186537.385081\t2\t24.065462\n772\t532067.105483\t186535.251582\t532130.013549\t186569.956592\t2\t71.8461\n773\t531792.763214\t186130.980154\t532091.292124\t186316.102313\t6\t351.26874\n774\t531936.680417\t186133.867962\t532070.915572\t186278.089735\t3\t197.02538\n775\t531769.516237\t186138.516602\t532468.845803\t186177.575543\t11\t700.41949\n776\t531879.493338\t186285.839527\t531938.482345\t186213.506013\t3\t93.337242\n777\t531890.077738\t186339.143359\t531898.344779\t186256.172049\t4\t83.382149\n778\t531837.422918\t186295.229987\t531910.236094\t186261.727914\t4\t80.15078\n779\t531710.480298\t186186.429316\t531849.69618\t186298.185485\t4\t178.52312\n780\t532238.723078\t186395.032465\t532283.767347\t186408.490685\t2\t47.011806\n781\t532239.150794\t186396.884875\t532268.06354\t186338.36265\t2\t65.274788\n782\t532138.690872\t186395.216436\t532327.693221\t186164.052331\t4\t298.5946\n783\t532006.439739\t186419.175581\t532156.333518\t186492.162275\t2\t166.71893\n784\t532359.977566\t186772.190756\t532443.278589\t186521.044007\t2\t264.6011\n785\t531690.869932\t185858.91738\t531813.409667\t185746.421847\t3\t166.34673\n786\t531532.648741\t185734.155051\t531602.657669\t185904.88841\t2\t184.52948\n787\t532171.469385\t186298.572254\t532274.102964\t186355.110223\t2\t117.17591\n788\t532180.862253\t185533.543345\t532356.687285\t185442.166375\t1\t198.15195\n789\t534574.657185\t184195.402125\t535121.140847\t184069.916781\t5\t560.70575\n790\t534563.562293\t184974.129007\t534591.680522\t184183.57219\t13\t791.0567\n791\t534583.836146\t184321.202178\t534730.488454\t184302.472644\t3\t147.84348\n792\t534698.25765\t184297.281735\t534772.712856\t184331.596753\t3\t81.982307\n793\t534702.482315\t184308.545155\t534738.166945\t184228.270404\t3\t87.848892\n794\t534723.371547\t184240.220974\t534917.631564\t184197.591186\t3\t198.88251\n795\t534720.705827\t184117.649614\t534877.736194\t184521.135283\t7\t432.96561\n796\t534768.406805\t184332.030894\t534936.296866\t184250.466403\t3\t186.65433\n797\t534913.143151\t184194.45284\t534935.967883\t184251.247666\t3\t61.209644\n798\t534926.488964\t184232.619061\t535200.253338\t184116.864865\t5\t297.2305\n799\t535135.896953\t184140.101114\t535172.737595\t184247.061707\t2\t113.12737\n800\t534562.260508\t184461.164981\t535247.561401\t184214.840549\t8\t728.22595\n801\t534781.768492\t184475.883822\t534855.733432\t184908.796002\t4\t439.18533\n802\t534715.861565\t184497.92705\t534901.915218\t184443.21365\t2\t193.93173\n803\t534737.396022\t184567.271591\t534798.940809\t184548.619916\t3\t64.308983\n804\t534702.527951\t184525.540516\t534752.082699\t184573.306429\t2\t68.827721\n805\t534743.795646\t184554.614492\t534787.00774\t184955.52572\t4\t403.23331\n806\t534570.382231\t184667.696421\t534977.366153\t184651.089755\t7\t407.3226\n807\t534973.624979\t184638.310842\t534997.432303\t184875.942875\t7\t238.82162\n808\t534964.437135\t184653.917275\t535129.944616\t184529.361442\t7\t207.13977\n809\t535051.122321\t184492.091746\t535084.660673\t184570.618804\t1\t85.389229\n810\t534553.928547\t184777.71118\t534643.657919\t184769.301014\t2\t90.122643\n811\t534530.528166\t184928.685384\t534999.479085\t184873.611031\t10\t472.17386\n812\t534864.645343\t184478.50485\t534927.795663\t184897.846314\t6\t424.06982\n813\t534920.9074\t184896.748538\t535350.389301\t184674.650654\t11\t483.51025\n814\t535094.007101\t184802.106005\t535583.637988\t184575.767496\t10\t539.41406\n815\t535325.798299\t184702.06346\t535328.577977\t184584.667544\t5\t117.42882\n816\t535273.276435\t184612.894289\t535355.270169\t184685.987575\t5\t109.84353\n817\t535098.658423\t184687.806427\t535290.701247\t184625.142364\t4\t202.008\n818\t535098.509015\t184438.08928\t535183.89869\t184762.124056\t9\t335.09689\n819\t535006.882355\t184457.093469\t535127.063137\t184439.656582\t3\t121.43914\n820\t534991.75315\t184409.678765\t535092.77961\t184343.486731\t2\t120.77968\n821\t534995.760614\t184404.264446\t535008.397438\t184458.651315\t2\t55.835659\n822\t534961.226757\t184068.007254\t535146.018893\t184599.391705\t10\t562.59894\n823\t535140.584411\t184611.286922\t535163.459076\t184603.131906\t1\t24.284863\n824\t535057.251555\t184782.193123\t535076.462555\t184823.242784\t2\t45.32259\n825\t535044.075999\t184773.963275\t535063.41164\t184788.29085\t2\t24.065462\n826\t534982.19293\t184790.665242\t535052.06928\t184773.957217\t2\t71.8461\n827\t535087.088601\t184556.27616\t535505.489654\t184439.666367\t6\t434.34695\n828\t535476.003253\t184427.867158\t535494.940716\t184628.255992\t4\t201.28168\n829\t535227.765574\t184213.634501\t535495.623878\t184458.249491\t5\t362.74588\n830\t535116.848257\t184525.058811\t535457.651802\t184323.765899\t3\t395.81042\n831\t535074.86778\t184403.586458\t535108.522419\t184392.212847\t1\t35.524551\n832\t535261.69466\t184498.056288\t535299.301714\t184583.481985\t3\t93.337242\n833\t535274.910697\t184632.04541\t535289.027295\t184549.866922\t4\t83.382149\n834\t535276.086116\t184552.057106\t535337.354799\t184603.732014\t4\t80.15078\n835\t535324.737621\t184603.313977\t535488.678393\t184532.646259\t3\t178.52312\n836\t535103.370078\t184075.733181\t535258.968139\t183992.153113\t2\t176.62498\n837\t535153.166046\t184036.181063\t535273.723864\t184270.284958\t4\t263.32266\n838\t534876.965263\t184594.098185\t534923.966796\t184593.115427\t2\t47.011806\n839\t534910.769279\t184530.680211\t534923.061435\t184594.787158\t1\t65.274788\n840\t534863.821121\t184514.823476\t534963.40089\t184483.729864\t3\t104.32134\n841\t534899.688958\t184346.786186\t535020.341176\t184619.919439\t2\t298.5946\n842\t534977.529877\t184708.67163\t535045.481163\t184697.617833\t2\t68.84449\n843\t535039.405946\t184666.3602\t535049.233996\t184725.655911\t3\t60.104675\n844\t535033.620864\t184672.731791\t535103.86021\t184660.285498\t2\t71.333557\n845\t535100.983846\t184657.930531\t535111.552469\t184713.065765\t3\t56.139023\n846\t535041.024265\t184721.882297\t535117.479941\t184709.2088\t2\t77.498955\n847\t535069.000684\t184166.986037\t535106.547618\t184273.263025\t2\t112.71455\n848\t534693.249139\t184660.132058\t534706.694412\t184924.391352\t2\t264.6011\n849\t534407.504716\t185779.34208\t534453.692303\t184480.757033\t15\t1299.4061\n850\t534427.77857\t185126.415252\t534574.430877\t185107.685717\t4\t147.84348\n851\t534481.481436\t185472.577643\t534499.988673\t184978.470277\t4\t494.45386\n852\t534542.200073\t185102.494808\t534616.65528\t185136.809827\t3\t81.982307\n853\t534546.424738\t185113.758229\t534582.109368\t185033.483477\t3\t87.848892\n854\t534569.123813\t185045.221496\t534763.38383\t185002.591709\t3\t198.88251\n855\t534533.779885\t184843.547182\t534721.678617\t185326.348356\t8\t518.07617\n856\t534612.349228\t185137.243968\t534780.239289\t185055.679477\t3\t186.65433\n857\t534757.085574\t184999.665913\t534779.910306\t185056.46074\t3\t61.209644\n858\t534770.431387\t185037.832134\t535044.195761\t184922.077939\t5\t297.2305\n859\t534979.839376\t184945.314188\t535016.680018\t185052.274781\t2\t113.12737\n860\t534390.468496\t185301.871061\t535091.503824\t185020.053622\t11\t755.56042\n861\t534625.710916\t185281.096896\t534699.675855\t185714.009075\t5\t439.18533\n862\t534559.803988\t185303.140124\t534745.857641\t185248.426724\t3\t193.93173\n863\t534581.338446\t185372.484665\t534642.883232\t185353.832989\t3\t64.308983\n864\t534546.470374\t185330.75359\t534596.025122\t185378.519503\t2\t68.827721\n865\t534587.738069\t185359.827566\t534630.950164\t185760.738794\t5\t403.23331\n866\t534157.732629\t185538.915308\t534848.842646\t185522.308643\t9\t691.30951\n867\t534817.567402\t185443.523916\t534841.374726\t185681.155949\t6\t238.82162\n868\t534808.379558\t185459.130349\t534973.88704\t185334.574516\t7\t207.13977\n869\t534895.064744\t185297.30482\t534928.603096\t185375.831877\t1\t85.389229\n870\t534406.08931\t185659.974073\t534495.818681\t185651.563907\t1\t90.122643\n871\t534374.470589\t185733.898458\t534843.421508\t185678.824105\t7\t472.17386\n872\t534708.587766\t185283.717924\t534771.738086\t185703.059388\t7\t424.06982\n873\t534764.849823\t185701.961612\t535078.992376\t185538.201886\t5\t354.26373\n874\t534942.451438\t185243.302354\t535027.841113\t185567.33713\t8\t335.09689\n875\t534850.824778\t185262.306543\t534971.005561\t185244.869656\t3\t121.43914\n876\t534835.695573\t185214.891839\t534936.722033\t185148.699805\t2\t120.77968\n877\t534839.703037\t185209.47752\t534852.339862\t185263.864389\t2\t55.835659\n878\t534805.16918\t184873.220328\t534989.961316\t185404.604779\t10\t562.59894\n879\t534984.526835\t185416.499995\t535007.401499\t185408.344979\t1\t24.284863\n880\t534901.193978\t185587.406197\t534920.404978\t185628.455858\t2\t45.32259\n881\t534888.018422\t185579.176349\t534907.354063\t185593.503923\t2\t24.065462\n882\t534826.135353\t185595.878316\t534896.011703\t185579.170291\t2\t71.8461\n883\t534931.031024\t185361.489234\t535274.748313\t185272.538271\t4\t355.04062\n884\t535071.707997\t185018.847575\t535225.342791\t185153.097336\t5\t204.02609\n885\t534960.790681\t185330.271885\t535237.788656\t185124.593978\t5\t345.00909\n886\t534918.810203\t185208.799531\t534952.464842\t185197.425921\t1\t35.524551\n887\t534979.440914\t184844.104724\t535117.666287\t185075.498032\t6\t269.535\n888\t534720.907686\t185399.311258\t534767.909219\t185398.328501\t2\t47.011806\n889\t534754.711702\t185335.893285\t534767.003858\t185400.000231\t1\t65.274788\n890\t534707.763545\t185320.03655\t534807.343313\t185288.942937\t3\t104.32134\n891\t534743.631381\t185151.99926\t534864.283599\t185425.132512\t3\t298.5946\n892\t534912.943107\t184972.19911\t534950.490041\t185078.476099\t2\t112.71455\n893\t534537.191562\t185503.477633\t534550.636835\t185729.604425\t2\t226.52615\n894\t535204.496158\t185229.19193\t535370.532227\t185193.626199\t4\t169.80252\n895\t535127.124245\t184779.694198\t535293.557118\t185516.696029\t9\t755.56042\n896\t535310.557793\t185281.150834\t535749.725\t185277.1594\t4\t439.18533\n897\t535297.462815\t185157.332025\t535321.810242\t185349.729325\t2\t193.93173\n898\t535385.101419\t185275.79588\t535393.701243\t185339.52726\t3\t64.308983\n899\t535346.944402\t185367.295278\t535402.000642\t185325.990727\t2\t68.827721\n900\t535382.226487\t185331.191356\t535784.898658\t185352.456817\t4\t403.23331\n901\t535466.211156\t185520.41691\t535514.709946\t185115.991934\t7\t407.3226\n902\t535501.497998\t185117.647664\t535739.885867\t185132.035007\t6\t238.82162\n903\t535418.867409\t184945.95612\t535515.439778\t185129.206385\t7\t207.13977\n904\t535369.506432\t185017.827383\t535452.376475\t184997.239138\t1\t85.389229\n905\t535717.506417\t185601.375402\t535737.910212\t185129.642602\t7\t472.17386\n906\t535326.359881\t185199.752209\t535750.405618\t185204.273205\t6\t424.06982\n907\t535597.447409\t184751.497905\t535748.223563\t185210.898302\t8\t483.51025\n908\t535547.180422\t184541.770925\t535682.392359\t185024.922582\t5\t501.71484\n909\t535505.137738\t184758.682504\t535620.588503\t184780.145227\t5\t117.42882\n910\t535524.185606\t184817.777244\t535609.417536\t184748.487137\t5\t109.84353\n911\t535539.055343\t184802.528299\t535570.296749\t185002.105868\t4\t202.008\n912\t535357.746004\t184958.474606\t535657.255012\t184929.805982\t8\t300.87793\n913\t535298.492212\t184889.139347\t535341.85494\t185002.57276\t2\t121.43914\n914\t535241.173485\t185019.521066\t535249.717782\t184899.04399\t2\t120.77968\n915\t535246.944008\t184905.182458\t535300.591002\t184889.702767\t2\t55.835659\n916\t534936.513858\t185038.95319\t534936.526105\t185038.951031\t1\t0.012435302\n917\t535080.652713\t185013.536228\t535490.564742\t184941.253717\t8\t416.23627\n918\t535497.037903\t184924.633029\t535501.441253\t184948.515346\t1\t24.284863\n919\t535656.87362\t185058.032807\t535700.461267\t185045.612897\t2\t45.32259\n920\t535646.648239\t185069.727561\t535663.87555\t185052.923806\t2\t24.065462\n921\t535647.916776\t185061.835578\t535653.26936\t185133.482017\t2\t71.8461\n922\t535394.629739\t184644.050052\t535438.604457\t184992.555358\t5\t351.26874\n923\t535304.007138\t184686.46776\t535412.531629\t184958.198879\t4\t292.60104\n924\t535280.057722\t184945.236103\t535285.919638\t184980.273679\t1\t35.524551\n925\t535408.970117\t184810.900093\t535499.299289\t184787.395178\t3\t93.337242\n926\t535464.476048\t184792.178276\t535543.352293\t184819.21751\t4\t83.382149\n927\t535464.574759\t184805.30311\t535525.357753\t184753.057772\t4\t80.15078\n928\t535479.309778\t184592.335656\t535522.933274\t184765.446874\t3\t178.52312\n929\t535442.438736\t185206.021096\t535448.962877\t185159.464189\t2\t47.011806\n930\t535385.222118\t185162.537657\t535450.468862\t185160.624523\t1\t65.274788\n931\t535347.264475\t185103.093237\t535362.082435\t185206.356837\t3\t104.32134\n932\t535201.914047\t185144.154584\t535490.790719\t185068.596661\t5\t298.5946\n933\t535571.503594\t185056.167204\t535571.581237\t185125.01165\t2\t68.84449\n934\t535539.677178\t185057.180712\t535599.781343\t185056.933015\t3\t60.104675\n935\t535543.957333\t184992.582459\t535545.04483\t185063.907723\t2\t71.333557\n936\t535541.173863\t184995.046528\t535597.288862\t184993.404349\t3\t56.139023\n937\t535594.426369\t184986.937725\t535594.746978\t185064.436015\t2\t77.498955\n938\t535478.334519\t185397.915805\t535741.356772\t185426.778307\t2\t264.6011\n939\t534386.096584\t184657.946566\t534391.276593\t184519.650385\t2\t138.39316\n940\t534150.45281\t184882.379079\t534256.595302\t184456.212986\t3\t439.18533\n941\t534215.490232\t184934.119016\t534288.572156\t184537.563685\t2\t403.23331\n942\t534104.300387\t184622.785745\t534453.040371\t184663.301276\t5\t351.08557\n943\t534358.410111\t184835.358794\t534447.258927\t184850.457767\t1\t90.122643\n944\t534009.742003\t184836.539535\t534473.259002\t184926.540316\t8\t472.17386\n945\t534079.411606\t184866.069323\t534173.754598\t184452.626913\t7\t424.06982\n946\t533755.439882\t184661.626429\t534086.362689\t184865.489913\t5\t388.67752\n947\t534106.025704\t184562.478705\t534152.822024\t184566.974746\t2\t47.011806\n948\t534106.803472\t184564.213479\t534123.856825\t184501.205695\t2\t65.274788\n949\t534252.89623\t185308.789689\t534476.385315\t184841.397417\t6\t518.07617\n950\t533961.524964\t184881.525527\t534304.335034\t185057.781168\t4\t385.46698\n951\t533907.020204\t184975.687719\t534585.009383\t185309.157766\t10\t755.56042\n952\t534245.837661\t185697.010156\t534351.980153\t185270.844063\t7\t439.18533\n953\t534234.614027\t185229.277632\t534416.053428\t185297.755817\t3\t193.93173\n954\t534329.414795\t185342.091746\t534389.391862\t185365.295132\t2\t64.308983\n955\t534374.294889\t185370.214397\t534427.284005\t185326.289357\t2\t68.827721\n956\t534310.875083\t185748.750093\t534354.077917\t185514.323944\t4\t238.37387\n957\t534042.849838\t185342.655189\t534082.168579\t185266.85706\t0\t85.389229\n958\t534231.245567\t185651.170611\t534438.433728\t185715.179828\t4\t216.85043\n959\t534174.796457\t185680.7004\t534269.139449\t185267.25799\t6\t424.06982\n960\t533929.563976\t185526.200168\t534038.954415\t185209.461057\t6\t335.09689\n961\t534010.363055\t185208.887923\t534128.902698\t185235.266299\t3\t121.43914\n962\t534127.275322\t185236.706442\t534143.945249\t185183.417283\t1\t55.835659\n963\t533979.51113\t185366.757455\t534203.536687\t184850.685639\t7\t562.59894\n964\t533961.840022\t185369.18253\t533984.040541\t185379.025878\t1\t24.284863\n965\t533705.401576\t185213.756971\t534041.501641\t185328.171107\t4\t355.04062\n966\t533763.603666\t185098.346576\t533926.850785\t184975.965914\t5\t204.02609\n967\t533753.32492\t185068.992048\t534014.160641\t185294.815002\t5\t345.00909\n968\t533876.783425\t185029.019644\t534031.931302\t184808.614896\t6\t269.535\n969\t534201.410555\t185377.109782\t534248.206875\t185381.605823\t2\t47.011806\n970\t534202.188323\t185378.844555\t534219.241676\t185315.836772\t1\t65.274788\n971\t534170.269744\t185265.080771\t534267.244479\t185303.536511\t3\t104.32134\n972\t534043.26847\t185044.495295\t534088.660447\t184941.324859\t3\t112.71455\n973\t533615.789208\t185127.900715\t533778.699491\t185175.787428\t2\t169.80252\n974\t533668.380798\t185455.823582\t533889.480123\t184733.337119\t10\t755.56042\n975\t533156.297039\t185130.560588\t533669.048154\t185219.666608\t6\t520.43597\n976\t533652.697092\t185287.211184\t533691.368935\t185097.174328\t3\t193.93173\n977\t533574.507192\t185257.540309\t533726.355444\t185312.833746\t4\t161.60216\n978\t533277.474126\t185310.175594\t533593.836898\t185264.205608\t4\t319.68521\n979\t533252.077925\t185038.851914\t533672.287457\t185028.048537\t5\t420.34839\n980\t533658.67825\t184939.527857\t533710.405074\t184829.656108\t2\t121.43914\n981\t533757.80975\t184963.960338\t533758.301905\t184843.181661\t2\t120.77968\n982\t533708.270017\t184830.060946\t533760.608708\t184849.510427\t2\t55.835659\n983\t534060.150026\t185006.125573\t534060.162077\t185006.128643\t1\t0.012435302\n984\t532885.238784\t184800.028308\t533918.328456\t184970.000324\t9\t1046.9789\n985\t533494.423246\t185058.115469\t533576.328783\t184703.140253\t4\t364.30197\n986\t533604.038896\t184929.958876\t533720.066825\t184684.421651\t4\t271.57138\n987\t533716.124948\t184921.475601\t533724.59149\t184886.974711\t0\t35.524551\n988\t533431.973449\t185232.430222\t533540.13387\t185087.967275\t2\t180.46667\n989\t533538.545304\t185089.0117\t533603.466114\t185095.800376\t2\t65.274788\n990\t533565.597126\t185014.95322\t533787.635743\t185091.181513\t5\t234.75923\n991\t533835.404973\t184778.324266\t533961.346126\t184945.405928\t2\t209.23062\n992\t533589.85843\t185107.28022\t533607.233213\t184991.399632\t3\t117.17591\n993\t534448.979216\t184662.829463\t534595.731555\t184795.975785\t2\t198.15195\n994\t531448.583794\t186119.776035\t531733.284027\t186204.735111\t1\t297.10651\n995\t531632.472108\t185930.735816\t531639.73935\t186196.056148\t3\t265.41983\n996\t531358.457914\t185930.133858\t531685.194977\t186008.89228\t4\t336.09521\n997\t531770.029234\t185963.283155\t531808.213662\t186140.561203\t1\t181.34375\n998\t532232.168083\t186022.145713\t532232.168083\t186186.359762\t3\t164.21405\n999\t531627.590761\t186001.947005\t531869.318273\t185971.120775\t5\t243.68513\n1000\t531611.397049\t186201.937586\t531901.096327\t186217.113684\t2\t290.0965\n1001\t533414.11404\t185165.537038\t533424.425402\t184724.739221\t5\t440.9184\n1002\t532990.64376\t184514.529144\t533322.717124\t184642.932061\t7\t356.03375\n1003\t533885.021829\t184579.439517\t534153.204805\t184752.247218\t3\t319.03702\n1004\t531510.629785\t185399.989769\t531550.244234\t185166.880259\t6\t236.45158\n1005\t532988.23624\t186147.308367\t533381.902938\t186201.567533\t5\t397.38837\n1006\t532778.64114\t187622.18866\t533427.582291\t185080.181236\t15\t2623.5332\n1007\t534248.581817\t185619.448736\t534493.593519\t185630.183595\t4\t245.24675\n1008\t534172.058872\t185831.287567\t534282.01837\t185616.188519\t7\t241.57544\n1009\t533826.182846\t185498.185597\t534504.172025\t185831.655644\t7\t755.56042\n1010\t534165.000303\t186219.508034\t534271.142795\t185793.341941\t5\t439.18533\n1011\t534153.776669\t185751.775511\t534335.21607\t185820.253695\t2\t193.93173\n1012\t534248.577437\t185864.589624\t534308.554504\t185887.793011\t2\t64.308983\n1013\t534230.037725\t186271.247971\t534303.11965\t185874.692641\t4\t403.23331\n1014\t534062.986586\t185953.424909\t534358.301923\t185987.621186\t5\t297.28864\n1015\t534026.156106\t186176.146914\t534067.673228\t185940.961667\t8\t238.82162\n1016\t533919.941754\t185820.623758\t534075.66786\t185957.211685\t7\t207.13977\n1017\t533962.01248\t185865.153067\t534001.331221\t185789.354938\t1\t85.389229\n1018\t534024.289496\t186173.66849\t534357.59637\t186237.677706\t6\t339.39749\n1019\t534093.959099\t186203.198278\t534188.302091\t185789.755869\t7\t424.06982\n1020\t533638.990935\t185915.962748\t534100.910183\t186202.618868\t11\t543.63696\n1021\t533711.71755\t185978.190674\t533717.72768\t185860.915757\t5\t117.42882\n1022\t533683.530845\t185959.955135\t533770.762715\t185893.200346\t4\t109.84353\n1023\t533752.470487\t185904.110607\t533939.287514\t185980.965208\t4\t202.008\n1024\t533848.726618\t186048.698046\t533958.117057\t185731.958935\t9\t335.09689\n1025\t533929.525697\t185731.385802\t534048.06534\t185757.764177\t3\t121.43914\n1026\t534046.437964\t185759.20432\t534063.107891\t185705.915162\t1\t55.835659\n1027\t533898.673772\t185889.255333\t534282.884006\t185012.284988\t11\t957.44165\n1028\t533881.002664\t185891.680408\t533903.203183\t185901.523756\t1\t24.284863\n1029\t533951.289622\t186117.682482\t533973.517589\t186078.184954\t2\t45.32259\n1030\t533966.918612\t186083.804779\t533987.271877\t186070.963788\t2\t24.065462\n1031\t533979.301445\t186070.359795\t534047.73213\t186092.248234\t2\t71.8461\n1032\t533624.564218\t185736.254849\t533960.664283\t185850.668985\t5\t355.04062\n1033\t533682.766308\t185620.844455\t533846.013427\t185498.463792\t5\t204.02609\n1034\t533672.487562\t185591.489927\t533933.323283\t185817.31288\t5\t345.00909\n1035\t533951.563582\t185685.461975\t533984.273098\t185699.321315\t1\t35.524551\n1036\t533747.0106\t185861.923585\t533790.902708\t185779.550512\t3\t93.337242\n1037\t533759.770868\t185829.171307\t533767.700397\t185912.175553\t4\t83.382149\n1038\t533707.549297\t185879.270243\t533772.511945\t185832.323443\t4\t80.15078\n1039\t533609.825733\t185818.987034\t533720.162394\t185879.797228\t3\t125.98436\n1040\t533795.946067\t185551.517522\t533892.357923\t185253.367732\t3\t313.35052\n1041\t534120.573197\t185899.60766\t534167.369517\t185904.103701\t2\t47.011806\n1042\t534121.350965\t185901.342434\t534138.404318\t185838.33465\t1\t65.274788\n1043\t534089.432386\t185787.57865\t534186.407121\t185826.034389\t3\t104.32134\n1044\t534022.463731\t185919.127103\t534163.210126\t185655.784772\t3\t298.5946\n1045\t533991.581812\t185994.727147\t534058.515802\t186010.833193\t3\t68.84449\n1046\t533985.742054\t186022.405925\t533999.978292\t185964.011564\t3\t60.104675\n1047\t533936.159056\t185953.132262\t534005.270526\t185970.798066\t2\t71.333557\n1048\t533924.540024\t186005.189208\t533939.203528\t185950.999066\t3\t56.139023\n1049\t533918.917688\t186000.899634\t533994.211074\t186019.257029\t2\t77.498955\n1050\t533962.431112\t185566.993174\t534007.823089\t185463.822737\t2\t112.71455\n1051\t533183.092197\t185960.49207\t533680.287998\t185926.372386\t7\t498.36514\n1052\t533409.706938\t185902.175085\t533635.307428\t185874.355608\t1\t227.30927\n1053\t533534.95185\t185650.398593\t533697.862133\t185698.285306\t2\t169.80252\n1054\t533587.54344\t185978.32146\t533771.907397\t185375.875192\t9\t630.02509\n1055\t533571.859734\t185809.709063\t533610.531577\t185619.672206\t1\t193.93173\n1056\t533500.933353\t185794.157643\t533514.276625\t185731.248163\t2\t64.308983\n1057\t533493.669834\t185780.038188\t533545.481945\t185825.345589\t2\t68.827721\n1058\t533196.636768\t185832.673472\t533512.99954\t185786.703487\t5\t319.68521\n1059\t533281.983386\t185528.829642\t533591.450099\t185550.546415\t4\t310.22775\n1060\t533979.312668\t185528.623452\t533979.324719\t185528.626521\t1\t0.012435302\n1061\t533497.55948\t185639.260049\t533592.716804\t185246.129178\t6\t404.48337\n1062\t533351.136091\t185754.9281\t533459.296512\t185610.465153\t2\t180.46667\n1063\t533457.707946\t185611.509578\t533522.628756\t185618.298255\t2\t65.274788\n1064\t533484.759768\t185537.451098\t533706.798385\t185613.679391\t5\t234.75923\n1065\t533355.262807\t185733.492873\t533365.642311\t185989.503772\t4\t256.22122\n1066\t533337.274479\t186336.546903\t533396.597693\t186535.010094\t2\t207.13977\n1067\t533550.079506\t186180.281634\t533609.196594\t186660.164269\t5\t483.51025\n1068\t533538.357132\t185927.209678\t533580.561497\t186464.970143\t9\t539.41406\n1069\t533458.122339\t186169.484724\t533567.245723\t186212.862308\t5\t117.42882\n1070\t533465.386238\t186231.147074\t533562.405872\t186179.641817\t5\t109.84353\n1071\t533474.991734\t186420.912754\t533482.923483\t186219.060534\t3\t202.008\n1072\t533054.755832\t186318.143693\t533574.287005\t186366.788247\t8\t521.80353\n1073\t533417.795746\t186355.021615\t533418.092568\t186330.738566\t1\t24.284863\n1074\t533347.630276\t186386.082724\t533383.586987\t185953.226628\t5\t434.34695\n1075\t533362.281749\t185976.779886\t533556.774495\t186028.615048\t4\t201.28168\n1076\t533258.286793\t185940.551163\t533328.69137\t186347.333816\t3\t412.83038\n1077\t533353.673905\t186202.125381\t533446.843096\t186196.526984\t4\t93.337242\n1078\t533411.752116\t186194.487567\t533483.912891\t186236.265609\t4\t83.382149\n1079\t533409.311578\t186207.383876\t533479.048304\t186167.875185\t4\t80.15078\n1080\t533464.941005\t186001.282872\t533474.274414\t186179.56184\t3\t178.52312\n1081\t533828.279945\t186210.288684\t534061.432071\t186167.57164\t7\t237.03304\n1082\t533878.534886\t186281.537721\t533888.008418\t186196.675645\t1\t85.389229\n1083\t533682.624134\t186064.349101\t533742.84632\t185963.538308\t4\t117.42882\n1084\t533709.279137\t185963.01928\t533744.655809\t186067.010107\t3\t109.84353\n1085\t533835.736436\t186271.953259\t533852.696011\t186024.360057\t5\t248.17337\n1086\t533733.194051\t186303.439136\t533854.626565\t186302.170238\t2\t121.43914\n1087\t533725.543114\t186352.617487\t533835.553856\t186402.470947\t2\t120.77968\n1088\t533730.336185\t186357.350465\t533734.4513\t186301.666655\t2\t55.835659\n1089\t533774.1936\t186550.921799\t533848.770307\t186141.420947\t7\t416.23627\n1090\t533536.74805\t186128.167476\t533878.833233\t186207.963791\t5\t351.26874\n1091\t533545.052813\t186227.880808\t533837.560288\t186220.48194\t3\t292.60104\n1092\t533779.396942\t186340.208273\t533814.289455\t186346.879573\t1\t35.524551\n1093\t533698.193044\t186172.665752\t533707.521963\t186079.795889\t3\t93.337242\n1094\t533699.913432\t186114.112742\t533752.662906\t186049.536622\t3\t83.382149\n1095\t533684.371802\t186043.434219\t533712.255609\t186118.578354\t4\t80.15078\n1096\t533517.661442\t186030.798131\t533695.147751\t186050.010453\t3\t178.52312\n1097\t533938.795137\t186482.57123\t533968.265425\t186185.434504\t0\t298.5946\n1098\t534035.7211\t186002.464912\t534367.794464\t186130.867829\t5\t356.03375\n1099\t532354.288274\t183002.991897\t532380.436592\t183829.50734\t4\t826.92896\n"
  },
  {
    "path": "testdata/barnsbury_extended2.dxf",
    "content": "  0\r\nSECTION\r\n  2\r\nHEADER\r\n  9\r\n$ACADVER\r\n  1\r\nAC1032\r\n  9\r\n$ACADMAINTVER\r\n 90\r\n       29\r\n  9\r\n$DWGCODEPAGE\r\n  3\r\nANSI_1252\r\n  9\r\n$LASTSAVEDBY\r\n  1\r\npetros\r\n  9\r\n$REQUIREDVERSIONS\r\n160\r\n                 0\r\n  9\r\n$INSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$EXTMIN\r\n 10\r\n519734.4698767327\r\n 20\r\n175043.3191102119\r\n 30\r\n0.0\r\n  9\r\n$EXTMAX\r\n 10\r\n553979.5277822344\r\n 20\r\n197652.3201767497\r\n 30\r\n0.0\r\n  9\r\n$LIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$LIMMAX\r\n 10\r\n12.0\r\n 20\r\n9.0\r\n  9\r\n$ORTHOMODE\r\n 70\r\n     0\r\n  9\r\n$REGENMODE\r\n 70\r\n     1\r\n  9\r\n$FILLMODE\r\n 70\r\n     1\r\n  9\r\n$QTEXTMODE\r\n 70\r\n     0\r\n  9\r\n$MIRRTEXT\r\n 70\r\n     0\r\n  9\r\n$LTSCALE\r\n 40\r\n1.0\r\n  9\r\n$ATTMODE\r\n 70\r\n     1\r\n  9\r\n$TEXTSIZE\r\n 40\r\n0.2\r\n  9\r\n$TRACEWID\r\n 40\r\n0.05\r\n  9\r\n$TEXTSTYLE\r\n  7\r\nStandard\r\n  9\r\n$CLAYER\r\n  8\r\n0\r\n  9\r\n$CELTYPE\r\n  6\r\nByLayer\r\n  9\r\n$CECOLOR\r\n 62\r\n   256\r\n  9\r\n$CELTSCALE\r\n 40\r\n1.0\r\n  9\r\n$DISPSILH\r\n 70\r\n     0\r\n  9\r\n$DIMSCALE\r\n 40\r\n1.0\r\n  9\r\n$DIMASZ\r\n 40\r\n0.18\r\n  9\r\n$DIMEXO\r\n 40\r\n0.0625\r\n  9\r\n$DIMDLI\r\n 40\r\n0.38\r\n  9\r\n$DIMRND\r\n 40\r\n0.0\r\n  9\r\n$DIMDLE\r\n 40\r\n0.0\r\n  9\r\n$DIMEXE\r\n 40\r\n0.18\r\n  9\r\n$DIMTP\r\n 40\r\n0.0\r\n  9\r\n$DIMTM\r\n 40\r\n0.0\r\n  9\r\n$DIMTXT\r\n 40\r\n0.18\r\n  9\r\n$DIMCEN\r\n 40\r\n0.09\r\n  9\r\n$DIMTSZ\r\n 40\r\n0.0\r\n  9\r\n$DIMTOL\r\n 70\r\n     0\r\n  9\r\n$DIMLIM\r\n 70\r\n     0\r\n  9\r\n$DIMTIH\r\n 70\r\n     1\r\n  9\r\n$DIMTOH\r\n 70\r\n     1\r\n  9\r\n$DIMSE1\r\n 70\r\n     0\r\n  9\r\n$DIMSE2\r\n 70\r\n     0\r\n  9\r\n$DIMTAD\r\n 70\r\n     0\r\n  9\r\n$DIMZIN\r\n 70\r\n     0\r\n  9\r\n$DIMBLK\r\n  1\r\n\r\n  9\r\n$DIMASO\r\n 70\r\n     1\r\n  9\r\n$DIMSHO\r\n 70\r\n     1\r\n  9\r\n$DIMPOST\r\n  1\r\n\r\n  9\r\n$DIMAPOST\r\n  1\r\n\r\n  9\r\n$DIMALT\r\n 70\r\n     0\r\n  9\r\n$DIMALTD\r\n 70\r\n     2\r\n  9\r\n$DIMALTF\r\n 40\r\n25.4\r\n  9\r\n$DIMLFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMTOFL\r\n 70\r\n     0\r\n  9\r\n$DIMTVP\r\n 40\r\n0.0\r\n  9\r\n$DIMTIX\r\n 70\r\n     0\r\n  9\r\n$DIMSOXD\r\n 70\r\n     0\r\n  9\r\n$DIMSAH\r\n 70\r\n     0\r\n  9\r\n$DIMBLK1\r\n  1\r\n\r\n  9\r\n$DIMBLK2\r\n  1\r\n\r\n  9\r\n$DIMSTYLE\r\n  2\r\nStandard\r\n  9\r\n$DIMCLRD\r\n 70\r\n     0\r\n  9\r\n$DIMCLRE\r\n 70\r\n     0\r\n  9\r\n$DIMCLRT\r\n 70\r\n     0\r\n  9\r\n$DIMTFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMGAP\r\n 40\r\n0.09\r\n  9\r\n$DIMJUST\r\n 70\r\n     0\r\n  9\r\n$DIMSD1\r\n 70\r\n     0\r\n  9\r\n$DIMSD2\r\n 70\r\n     0\r\n  9\r\n$DIMTOLJ\r\n 70\r\n     1\r\n  9\r\n$DIMTZIN\r\n 70\r\n     0\r\n  9\r\n$DIMALTZ\r\n 70\r\n     0\r\n  9\r\n$DIMALTTZ\r\n 70\r\n     0\r\n  9\r\n$DIMUPT\r\n 70\r\n     0\r\n  9\r\n$DIMDEC\r\n 70\r\n     4\r\n  9\r\n$DIMTDEC\r\n 70\r\n     4\r\n  9\r\n$DIMALTU\r\n 70\r\n     2\r\n  9\r\n$DIMALTTD\r\n 70\r\n     2\r\n  9\r\n$DIMTXSTY\r\n  7\r\nStandard\r\n  9\r\n$DIMAUNIT\r\n 70\r\n     0\r\n  9\r\n$DIMADEC\r\n 70\r\n     0\r\n  9\r\n$DIMALTRND\r\n 40\r\n0.0\r\n  9\r\n$DIMAZIN\r\n 70\r\n     0\r\n  9\r\n$DIMDSEP\r\n 70\r\n    46\r\n  9\r\n$DIMATFIT\r\n 70\r\n     3\r\n  9\r\n$DIMFRAC\r\n 70\r\n     0\r\n  9\r\n$DIMLDRBLK\r\n  1\r\n\r\n  9\r\n$DIMLUNIT\r\n 70\r\n     2\r\n  9\r\n$DIMLWD\r\n 70\r\n    -2\r\n  9\r\n$DIMLWE\r\n 70\r\n    -2\r\n  9\r\n$DIMTMOVE\r\n 70\r\n     0\r\n  9\r\n$DIMFXL\r\n 40\r\n1.0\r\n  9\r\n$DIMFXLON\r\n 70\r\n     0\r\n  9\r\n$DIMJOGANG\r\n 40\r\n0.7853981633974483\r\n  9\r\n$DIMTFILL\r\n 70\r\n     0\r\n  9\r\n$DIMTFILLCLR\r\n 70\r\n     0\r\n  9\r\n$DIMARCSYM\r\n 70\r\n     0\r\n  9\r\n$DIMLTYPE\r\n  6\r\n\r\n  9\r\n$DIMLTEX1\r\n  6\r\n\r\n  9\r\n$DIMLTEX2\r\n  6\r\n\r\n  9\r\n$DIMTXTDIRECTION\r\n 70\r\n     0\r\n  9\r\n$LUNITS\r\n 70\r\n     2\r\n  9\r\n$LUPREC\r\n 70\r\n     4\r\n  9\r\n$SKETCHINC\r\n 40\r\n0.1\r\n  9\r\n$FILLETRAD\r\n 40\r\n0.0\r\n  9\r\n$AUNITS\r\n 70\r\n     0\r\n  9\r\n$AUPREC\r\n 70\r\n     0\r\n  9\r\n$MENU\r\n  1\r\n.\r\n  9\r\n$ELEVATION\r\n 40\r\n0.0\r\n  9\r\n$PELEVATION\r\n 40\r\n0.0\r\n  9\r\n$THICKNESS\r\n 40\r\n0.0\r\n  9\r\n$LIMCHECK\r\n 70\r\n     0\r\n  9\r\n$CHAMFERA\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERB\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERC\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERD\r\n 40\r\n0.0\r\n  9\r\n$SKPOLY\r\n 70\r\n     0\r\n  9\r\n$TDCREATE\r\n 40\r\n2458404.565312500\r\n  9\r\n$TDUCREATE\r\n 40\r\n2458404.523645833\r\n  9\r\n$TDUPDATE\r\n 40\r\n2458404.657638889\r\n  9\r\n$TDUUPDATE\r\n 40\r\n2458404.615972222\r\n  9\r\n$TDINDWG\r\n 40\r\n0.0820949074\r\n  9\r\n$TDUSRTIMER\r\n 40\r\n0.0820949074\r\n  9\r\n$USRTIMER\r\n 70\r\n     1\r\n  9\r\n$ANGBASE\r\n 50\r\n0.0\r\n  9\r\n$ANGDIR\r\n 70\r\n     0\r\n  9\r\n$PDMODE\r\n 70\r\n     0\r\n  9\r\n$PDSIZE\r\n 40\r\n0.0\r\n  9\r\n$PLINEWID\r\n 40\r\n0.0\r\n  9\r\n$SPLFRAME\r\n 70\r\n     0\r\n  9\r\n$SPLINETYPE\r\n 70\r\n     6\r\n  9\r\n$SPLINESEGS\r\n 70\r\n     8\r\n  9\r\n$HANDSEED\r\n  5\r\n22F6\r\n  9\r\n$SURFTAB1\r\n 70\r\n     6\r\n  9\r\n$SURFTAB2\r\n 70\r\n     6\r\n  9\r\n$SURFTYPE\r\n 70\r\n     6\r\n  9\r\n$SURFU\r\n 70\r\n     6\r\n  9\r\n$SURFV\r\n 70\r\n     6\r\n  9\r\n$UCSBASE\r\n  2\r\n\r\n  9\r\n$UCSNAME\r\n  2\r\n\r\n  9\r\n$UCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORTHOREF\r\n  2\r\n\r\n  9\r\n$UCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$UCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSBASE\r\n  2\r\n\r\n  9\r\n$PUCSNAME\r\n  2\r\n\r\n  9\r\n$PUCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORTHOREF\r\n  2\r\n\r\n  9\r\n$PUCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$PUCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$USERI1\r\n 70\r\n     0\r\n  9\r\n$USERI2\r\n 70\r\n     0\r\n  9\r\n$USERI3\r\n 70\r\n     0\r\n  9\r\n$USERI4\r\n 70\r\n     0\r\n  9\r\n$USERI5\r\n 70\r\n     0\r\n  9\r\n$USERR1\r\n 40\r\n0.0\r\n  9\r\n$USERR2\r\n 40\r\n0.0\r\n  9\r\n$USERR3\r\n 40\r\n0.0\r\n  9\r\n$USERR4\r\n 40\r\n0.0\r\n  9\r\n$USERR5\r\n 40\r\n0.0\r\n  9\r\n$WORLDVIEW\r\n 70\r\n     1\r\n  9\r\n$SHADEDGE\r\n 70\r\n     3\r\n  9\r\n$SHADEDIF\r\n 70\r\n    70\r\n  9\r\n$TILEMODE\r\n 70\r\n     1\r\n  9\r\n$MAXACTVP\r\n 70\r\n    64\r\n  9\r\n$PINSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMCHECK\r\n 70\r\n     0\r\n  9\r\n$PEXTMIN\r\n 10\r\n1.000000000000000E+20\r\n 20\r\n1.000000000000000E+20\r\n 30\r\n1.000000000000000E+20\r\n  9\r\n$PEXTMAX\r\n 10\r\n-1.000000000000000E+20\r\n 20\r\n-1.000000000000000E+20\r\n 30\r\n-1.000000000000000E+20\r\n  9\r\n$PLIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$PLIMMAX\r\n 10\r\n12.0\r\n 20\r\n9.0\r\n  9\r\n$UNITMODE\r\n 70\r\n     0\r\n  9\r\n$VISRETAIN\r\n 70\r\n     1\r\n  9\r\n$PLINEGEN\r\n 70\r\n     0\r\n  9\r\n$PSLTSCALE\r\n 70\r\n     1\r\n  9\r\n$TREEDEPTH\r\n 70\r\n  3020\r\n  9\r\n$CMLSTYLE\r\n  2\r\nStandard\r\n  9\r\n$CMLJUST\r\n 70\r\n     0\r\n  9\r\n$CMLSCALE\r\n 40\r\n1.0\r\n  9\r\n$PROXYGRAPHICS\r\n 70\r\n     1\r\n  9\r\n$MEASUREMENT\r\n 70\r\n     0\r\n  9\r\n$CELWEIGHT\r\n370\r\n    -1\r\n  9\r\n$ENDCAPS\r\n280\r\n     0\r\n  9\r\n$JOINSTYLE\r\n280\r\n     0\r\n  9\r\n$LWDISPLAY\r\n290\r\n     0\r\n  9\r\n$INSUNITS\r\n 70\r\n     0\r\n  9\r\n$HYPERLINKBASE\r\n  1\r\n\r\n  9\r\n$STYLESHEET\r\n  1\r\n\r\n  9\r\n$XEDIT\r\n290\r\n     1\r\n  9\r\n$CEPSNTYPE\r\n380\r\n     0\r\n  9\r\n$PSTYLEMODE\r\n290\r\n     1\r\n  9\r\n$FINGERPRINTGUID\r\n  2\r\n{2B8CF25F-82C1-5146-94DB-BDE3530BDA2A}\r\n  9\r\n$VERSIONGUID\r\n  2\r\n{58F8BA06-8073-9041-99B1-34838A46B6E6}\r\n  9\r\n$EXTNAMES\r\n290\r\n     1\r\n  9\r\n$PSVPSCALE\r\n 40\r\n0.0\r\n  9\r\n$OLESTARTUP\r\n290\r\n     0\r\n  9\r\n$SORTENTS\r\n280\r\n   127\r\n  9\r\n$INDEXCTL\r\n280\r\n     0\r\n  9\r\n$HIDETEXT\r\n280\r\n     0\r\n  9\r\n$XCLIPFRAME\r\n280\r\n     2\r\n  9\r\n$HALOGAP\r\n280\r\n     0\r\n  9\r\n$OBSCOLOR\r\n 70\r\n   257\r\n  9\r\n$OBSLTYPE\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONDISPLAY\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONCOLOR\r\n 70\r\n   257\r\n  9\r\n$DIMASSOC\r\n280\r\n     1\r\n  9\r\n$PROJECTNAME\r\n  1\r\n\r\n  9\r\n$CAMERADISPLAY\r\n290\r\n     0\r\n  9\r\n$LENSLENGTH\r\n 40\r\n50.0\r\n  9\r\n$CAMERAHEIGHT\r\n 40\r\n0.0\r\n  9\r\n$STEPSPERSEC\r\n 40\r\n2.0\r\n  9\r\n$STEPSIZE\r\n 40\r\n6.0\r\n  9\r\n$3DDWFPREC\r\n 40\r\n2.0\r\n  9\r\n$PSOLWIDTH\r\n 40\r\n0.25\r\n  9\r\n$PSOLHEIGHT\r\n 40\r\n4.0\r\n  9\r\n$LOFTANG1\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTANG2\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTMAG1\r\n 40\r\n0.0\r\n  9\r\n$LOFTMAG2\r\n 40\r\n0.0\r\n  9\r\n$LOFTPARAM\r\n 70\r\n     7\r\n  9\r\n$LOFTNORMALS\r\n280\r\n     1\r\n  9\r\n$LATITUDE\r\n 40\r\n37.795\r\n  9\r\n$LONGITUDE\r\n 40\r\n-122.394\r\n  9\r\n$NORTHDIRECTION\r\n 40\r\n0.0\r\n  9\r\n$TIMEZONE\r\n 70\r\n -8000\r\n  9\r\n$LIGHTGLYPHDISPLAY\r\n280\r\n     1\r\n  9\r\n$TILEMODELIGHTSYNCH\r\n280\r\n     1\r\n  9\r\n$CMATERIAL\r\n347\r\n11\r\n  9\r\n$SOLIDHIST\r\n280\r\n     0\r\n  9\r\n$SHOWHIST\r\n280\r\n     1\r\n  9\r\n$DWFFRAME\r\n280\r\n     2\r\n  9\r\n$DGNFRAME\r\n280\r\n     0\r\n  9\r\n$REALWORLDSCALE\r\n290\r\n     1\r\n  9\r\n$INTERFERECOLOR\r\n 62\r\n     1\r\n  9\r\n$INTERFEREOBJVS\r\n345\r\n33\r\n  9\r\n$INTERFEREVPVS\r\n346\r\n30\r\n  9\r\n$CSHADOW\r\n280\r\n     0\r\n  9\r\n$SHADOWPLANELOCATION\r\n 40\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nCLASSES\r\n  0\r\nCLASS\r\n  1\r\nACDBDICTIONARYWDFLT\r\n  2\r\nAcDbDictionaryWithDefault\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMATERIAL\r\n  2\r\nAcDbMaterial\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nVISUALSTYLE\r\n  2\r\nAcDbVisualStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n       24\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSCALE\r\n  2\r\nAcDbScale\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n       17\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nTABLESTYLE\r\n  2\r\nAcDbTableStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMLEADERSTYLE\r\n  2\r\nAcDbMLeaderStyle\r\n  3\r\nACDB_MLEADERSTYLE_CLASS\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBSECTIONVIEWSTYLE\r\n  2\r\nAcDbSectionViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBDETAILVIEWSTYLE\r\n  2\r\nAcDbDetailViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSORTENTSTABLE\r\n  2\r\nAcDbSortentsTable\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nDICTIONARYVAR\r\n  2\r\nAcDbDictionaryVar\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        9\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nCELLSTYLEMAP\r\n  2\r\nAcDbCellStyleMap\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1152\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nTABLES\r\n  0\r\nTABLE\r\n  2\r\nVPORT\r\n  5\r\n8\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nVPORT\r\n  5\r\nB3\r\n330\r\n8\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbViewportTableRecord\r\n  2\r\n*Active\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n1.0\r\n 12\r\n530257.0980907157\r\n 22\r\n182183.4473277476\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 14\r\n1.0\r\n 24\r\n1.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 16\r\n0.0\r\n 26\r\n0.0\r\n 36\r\n1.0\r\n 17\r\n0.0\r\n 27\r\n0.0\r\n 37\r\n0.0\r\n 40\r\n22470.11987693544\r\n 41\r\n1.512419503219871\r\n 42\r\n50.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 50\r\n0.0\r\n 51\r\n0.0\r\n 71\r\n     0\r\n 72\r\n  1000\r\n 73\r\n     1\r\n 74\r\n     3\r\n 75\r\n     0\r\n 76\r\n     0\r\n 77\r\n     0\r\n 78\r\n     0\r\n281\r\n     0\r\n 65\r\n     1\r\n110\r\n0.0\r\n120\r\n0.0\r\n130\r\n0.0\r\n111\r\n1.0\r\n121\r\n0.0\r\n131\r\n0.0\r\n112\r\n0.0\r\n122\r\n1.0\r\n132\r\n0.0\r\n 79\r\n     0\r\n146\r\n0.0\r\n348\r\n2F\r\n 60\r\n     3\r\n 61\r\n     5\r\n292\r\n     1\r\n282\r\n     1\r\n141\r\n0.0\r\n142\r\n0.0\r\n 63\r\n   250\r\n421\r\n  3355443\r\n1001\r\nACAD_NAV_VCDISPLAY\r\n1070\r\n     1\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLTYPE\r\n  5\r\n5\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nLTYPE\r\n  5\r\n5A\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByBlock\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n5B\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByLayer\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n5C\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nContinuous\r\n 70\r\n     0\r\n  3\r\nSolid line\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLAYER\r\n  5\r\n2\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n345\r\n102\r\n}\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nLAYER\r\n  5\r\n54\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n340\r\n102\r\n}\r\n330\r\n2\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLayerTableRecord\r\n  2\r\n0\r\n 70\r\n     0\r\n 62\r\n     7\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n390\r\nF\r\n347\r\n21\r\n348\r\n0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nSTYLE\r\n  5\r\n3\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nSTYLE\r\n  5\r\n55\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n0.2\r\n  3\r\ntxt\r\n  4\r\n\r\n  0\r\nSTYLE\r\n  5\r\n59\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n0.2\r\n  3\r\ntxt\r\n  4\r\n\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nVIEW\r\n  5\r\n6\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nUCS\r\n  5\r\n7\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nAPPID\r\n  5\r\n9\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     4\r\n  0\r\nAPPID\r\n  5\r\n56\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n5D\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nAcadAnnotative\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\nB2\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_NAV_VCDISPLAY\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\nF2\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_EXEMPT_FROM_CAD_STANDARDS\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nDIMSTYLE\r\n  5\r\nA\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     3\r\n100\r\nAcDbDimStyleTable\r\n 71\r\n     1\r\n340\r\n57\r\n  0\r\nDIMSTYLE\r\n105\r\n57\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n340\r\n55\r\n  0\r\nDIMSTYLE\r\n105\r\n58\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n340\r\n55\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nBLOCK_RECORD\r\n  5\r\n1\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n6F\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n135\r\n102\r\n}\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Model_Space\r\n340\r\n72\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n6B\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space\r\n340\r\n6E\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nBLOCKS\r\n  0\r\nBLOCK\r\n  5\r\n70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Model_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Model_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\n6C\r\n330\r\n6B\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n6D\r\n330\r\n6B\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nENTITIES\r\n  0\r\nLINE\r\n  5\r\n73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530635.6962680001\r\n 20\r\n184468.675646\r\n 30\r\n0.0\r\n 11\r\n530732.3778539999\r\n 21\r\n183731.866556\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530655.0804069999\r\n 20\r\n184267.843134\r\n 30\r\n0.0\r\n 11\r\n531386.6646780001\r\n 21\r\n184568.766995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530781.419478\r\n 20\r\n184322.997346\r\n 30\r\n0.0\r\n 11\r\n530814.78724\r\n 21\r\n184178.968574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530667.7613100001\r\n 20\r\n184203.901437\r\n 30\r\n0.0\r\n 11\r\n531124.6861069999\r\n 21\r\n184392.857349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530798.725861\r\n 20\r\n184207.390438\r\n 30\r\n0.0\r\n 11\r\n530856.762846\r\n 21\r\n184149.487013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530747.8703240001\r\n 20\r\n184145.998012\r\n 30\r\n0.0\r\n 11\r\n530810.7554050001\r\n 21\r\n184207.340453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530753.9386890001\r\n 20\r\n184164.022852\r\n 30\r\n0.0\r\n 11\r\n530781.427723\r\n 21\r\n183967.049235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530638.0708449999\r\n 20\r\n184123.954322\r\n 30\r\n0.0\r\n 11\r\n531070.9777789999\r\n 21\r\n184116.826362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530837.4941380001\r\n 20\r\n183967.908989\r\n 30\r\n0.0\r\n 11\r\n530855.6744979999\r\n 21\r\n184153.675814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530776.9259189999\r\n 20\r\n183970.168342\r\n 30\r\n0.0\r\n 11\r\n530838.1125180001\r\n 21\r\n183968.488823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530803.8790240001\r\n 20\r\n183673.983124\r\n 30\r\n0.0\r\n 11\r\n530817.351454\r\n 21\r\n183970.908131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530803.31836\r\n 20\r\n183742.403539\r\n 30\r\n0.0\r\n 11\r\n530916.415863\r\n 21\r\n183745.002795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530912.1861470001\r\n 20\r\n183663.646083\r\n 30\r\n0.0\r\n 11\r\n530932.996681\r\n 21\r\n184479.6069563149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530995.2139119999\r\n 20\r\n184191.1051\r\n 30\r\n0.0\r\n 11\r\n531426.867596\r\n 21\r\n184272.091918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530992.995991\r\n 20\r\n184260.565217\r\n 30\r\n0.0\r\n 11\r\n531006.3035189999\r\n 21\r\n184067.090599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531065.5030580001\r\n 20\r\n184264.454104\r\n 30\r\n0.0\r\n 11\r\n531069.386482\r\n 21\r\n184200.262479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531014.2600029999\r\n 20\r\n184282.658893\r\n 30\r\n0.0\r\n 11\r\n531076.262863\r\n 21\r\n184252.777446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531055.8563370001\r\n 20\r\n184254.05708\r\n 30\r\n0.0\r\n 11\r\n531446.820644\r\n 21\r\n184352.768824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531101.674141\r\n 20\r\n184455.949289\r\n 30\r\n0.0\r\n 11\r\n531227.444303\r\n 21\r\n184068.530187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531214.16151\r\n 20\r\n184067.600453\r\n 30\r\n0.0\r\n 11\r\n531445.270572\r\n 21\r\n184127.80322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531166.2824399999\r\n 20\r\n183883.173244\r\n 30\r\n0.0\r\n 11\r\n531225.605654\r\n 21\r\n184081.636435\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531103.958023\r\n 20\r\n183944.145791\r\n 30\r\n0.0\r\n 11\r\n531189.2449350001\r\n 21\r\n183939.966987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531199.1268957056\r\n 20\r\n184509.5863229855\r\n 30\r\n0.0\r\n 11\r\n531222.4027027056\r\n 21\r\n184422.5212449855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531332.5770770001\r\n 20\r\n184583.962646\r\n 30\r\n0.0\r\n 11\r\n531443.794706\r\n 21\r\n184125.074001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531026.4544489999\r\n 20\r\n184114.297086\r\n 30\r\n0.0\r\n 11\r\n531441.626255\r\n 21\r\n184200.71235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531379.0874670001\r\n 20\r\n183726.907975\r\n 30\r\n0.0\r\n 11\r\n531438.2045550001\r\n 21\r\n184206.79061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531367.365093476\r\n 20\r\n183473.8360188434\r\n 30\r\n0.0\r\n 11\r\n531409.569458\r\n 21\r\n184011.596484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531287.1303\r\n 20\r\n183716.111065\r\n 30\r\n0.0\r\n 11\r\n531396.253684\r\n 21\r\n183759.488649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531294.394199\r\n 20\r\n183777.773415\r\n 30\r\n0.0\r\n 11\r\n531391.413833\r\n 21\r\n183726.268158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531303.999695\r\n 20\r\n183967.539095\r\n 30\r\n0.0\r\n 11\r\n531311.931444\r\n 21\r\n183765.686875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530639.1597319652\r\n 20\r\n183843.3318650589\r\n 30\r\n0.0\r\n 11\r\n531403.294966\r\n 21\r\n183913.414588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531055.773886\r\n 20\r\n183973.477395\r\n 30\r\n0.0\r\n 11\r\n531081.1604290001\r\n 21\r\n183854.721389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530979.070082\r\n 20\r\n183853.471746\r\n 30\r\n0.0\r\n 11\r\n531006.056167\r\n 21\r\n183971.198048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531002.3706249999\r\n 20\r\n183965.559662\r\n 30\r\n0.0\r\n 11\r\n531057.7609460001\r\n 21\r\n183972.597647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531378.13104\r\n 20\r\n184039.148597\r\n 30\r\n0.0\r\n 11\r\n531423.297484\r\n 21\r\n184035.389673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531365.8376540001\r\n 20\r\n184048.645878\r\n 30\r\n0.0\r\n 11\r\n531385.9885830001\r\n 21\r\n184035.489644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531360.008395\r\n 20\r\n184112.477607\r\n 30\r\n0.0\r\n 11\r\n531368.607994\r\n 21\r\n184041.148025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531176.638237\r\n 20\r\n183932.709065\r\n 30\r\n0.0\r\n 11\r\n531212.5949479999\r\n 21\r\n183499.852969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531191.28971\r\n 20\r\n183523.406227\r\n 30\r\n0.0\r\n 11\r\n531385.782456\r\n 21\r\n183575.241389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530904.180192\r\n 20\r\n183681.79089\r\n 30\r\n0.0\r\n 11\r\n531226.595062\r\n 21\r\n183515.558473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531087.294754\r\n 20\r\n183504.461649\r\n 30\r\n0.0\r\n 11\r\n531157.6993310001\r\n 21\r\n183893.960157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531029.2082989999\r\n 20\r\n183891.140964\r\n 30\r\n0.0\r\n 11\r\n531030.2306869999\r\n 21\r\n183855.631128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531182.681866\r\n 20\r\n183748.751722\r\n 30\r\n0.0\r\n 11\r\n531275.851057\r\n 21\r\n183743.153325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531240.7600770002\r\n 20\r\n183741.113908\r\n 30\r\n0.0\r\n 11\r\n531312.920852\r\n 21\r\n183782.89195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531238.3195390001\r\n 20\r\n183754.010217\r\n 30\r\n0.0\r\n 11\r\n531308.0562649999\r\n 21\r\n183714.501526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531293.948966\r\n 20\r\n183547.909213\r\n 30\r\n0.0\r\n 11\r\n531303.2823749999\r\n 21\r\n183726.188181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530707.321114\r\n 20\r\n183575.611283\r\n 30\r\n0.0\r\n 11\r\n530731.6605340001\r\n 21\r\n183750.551207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530711.864142\r\n 20\r\n183690.118506\r\n 30\r\n0.0\r\n 11\r\n530973.265559\r\n 21\r\n183658.367594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531139.131454\r\n 20\r\n184142.888902\r\n 30\r\n0.0\r\n 11\r\n531154.5332279999\r\n 21\r\n184098.471616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531091.4007950001\r\n 20\r\n184089.16428\r\n 30\r\n0.0\r\n 11\r\n531155.7864770001\r\n 21\r\n184099.901207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531060.2262189999\r\n 20\r\n184127.683254\r\n 30\r\n0.0\r\n 11\r\n531065.6514689999\r\n 21\r\n184023.503075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530915.1048979999\r\n 20\r\n184035.689587\r\n 30\r\n0.0\r\n 11\r\n531213.1391220001\r\n 21\r\n184017.404821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531281.4989239999\r\n 20\r\n184088.374506\r\n 30\r\n0.0\r\n 11\r\n531294.732247\r\n 21\r\n184020.813845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531263.3103189999\r\n 20\r\n184015.655322\r\n 30\r\n0.0\r\n 11\r\n531322.3284660001\r\n 21\r\n184027.032065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531267.276193\r\n 20\r\n184023.293136\r\n 30\r\n0.0\r\n 11\r\n531279.9983229999\r\n 21\r\n183953.103227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531276.7909939999\r\n 20\r\n183954.982689\r\n 30\r\n0.0\r\n 11\r\n531332.164824\r\n 21\r\n183964.220045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531315.9385439999\r\n 20\r\n184033.420237\r\n 30\r\n0.0\r\n 11\r\n531330.6065079999\r\n 21\r\n183957.32202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530805.297175\r\n 20\r\n183814.47291\r\n 30\r\n0.0\r\n 11\r\n530917.998915\r\n 21\r\n183816.172423\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531137.2515800001\r\n 20\r\n184338.103022\r\n 30\r\n0.0\r\n 11\r\n531389.731841\r\n 21\r\n184417.270361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531482.3151479505\r\n 20\r\n184748.9871594448\r\n 30\r\n0.0\r\n 11\r\n531515.6829099504\r\n 21\r\n184604.9583874448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531368.6569799505\r\n 20\r\n184629.8912504447\r\n 30\r\n0.0\r\n 11\r\n531825.5817769504\r\n 21\r\n184818.8471624447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531499.6215309505\r\n 20\r\n184633.3802514448\r\n 30\r\n0.0\r\n 11\r\n531557.6585159504\r\n 21\r\n184575.4768264448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531448.7659939505\r\n 20\r\n184571.9878254447\r\n 30\r\n0.0\r\n 11\r\n531511.6510749504\r\n 21\r\n184633.3302664447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531455.263586\r\n 20\r\n184588.2416564698\r\n 30\r\n0.0\r\n 11\r\n531482.7526199998\r\n 21\r\n184391.2680394698\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531253.86750234\r\n 20\r\n184551.3453196492\r\n 30\r\n0.0\r\n 11\r\n531771.8734489504\r\n 21\r\n184542.8161754447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531538.3898079505\r\n 20\r\n184393.8988024447\r\n 30\r\n0.0\r\n 11\r\n531556.5701679504\r\n 21\r\n184579.6656274448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531477.8215889504\r\n 20\r\n184396.1581554448\r\n 30\r\n0.0\r\n 11\r\n531539.0081879505\r\n 21\r\n184394.4786364447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531504.7746939504\r\n 20\r\n184099.9729374447\r\n 30\r\n0.0\r\n 11\r\n531518.2471239504\r\n 21\r\n184396.8979444447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531504.2140299504\r\n 20\r\n184168.3933524448\r\n 30\r\n0.0\r\n 11\r\n531617.3115329505\r\n 21\r\n184170.9926084448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531613.0818169503\r\n 20\r\n184089.6358964447\r\n 30\r\n0.0\r\n 11\r\n531633.8923509504\r\n 21\r\n184844.9097024448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531696.1095819504\r\n 20\r\n184617.0949134447\r\n 30\r\n0.0\r\n 11\r\n532336.8255974543\r\n 21\r\n184713.6317642464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531693.8916609504\r\n 20\r\n184686.5550304448\r\n 30\r\n0.0\r\n 11\r\n531707.1991889504\r\n 21\r\n184493.0804124447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531766.3987279504\r\n 20\r\n184690.4439174447\r\n 30\r\n0.0\r\n 11\r\n531770.2821519504\r\n 21\r\n184626.2522924448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531715.1556729503\r\n 20\r\n184708.6487064448\r\n 30\r\n0.0\r\n 11\r\n531777.1585329505\r\n 21\r\n184678.7672594447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531756.7520069505\r\n 20\r\n184680.0468934447\r\n 30\r\n0.0\r\n 11\r\n531893.0496688435\r\n 21\r\n184714.4597021531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531802.5698109504\r\n 20\r\n184881.9391024447\r\n 30\r\n0.0\r\n 11\r\n531928.3399729504\r\n 21\r\n184494.5200004447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531915.0571799504\r\n 20\r\n184493.5902664447\r\n 30\r\n0.0\r\n 11\r\n532146.1662419505\r\n 21\r\n184553.7930334447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531867.1781099504\r\n 20\r\n184309.1630574448\r\n 30\r\n0.0\r\n 11\r\n531926.5013239504\r\n 21\r\n184507.6262484447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531804.8536929503\r\n 20\r\n184370.1356044448\r\n 30\r\n0.0\r\n 11\r\n531890.1406049505\r\n 21\r\n184365.9568004447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531914.954988917\r\n 20\r\n184937.2488970258\r\n 30\r\n0.0\r\n 11\r\n531938.230795917\r\n 21\r\n184850.1838190259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531727.3501189504\r\n 20\r\n184540.2868994447\r\n 30\r\n0.0\r\n 11\r\n532142.5219249505\r\n 21\r\n184626.7021634447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531988.0259699504\r\n 20\r\n184142.1008784448\r\n 30\r\n0.0\r\n 11\r\n532097.1493539504\r\n 21\r\n184185.4784624447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531995.2898689503\r\n 20\r\n184203.7632284447\r\n 30\r\n0.0\r\n 11\r\n532092.3095029504\r\n 21\r\n184152.2579714447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532004.8953649504\r\n 20\r\n184393.5289084448\r\n 30\r\n0.0\r\n 11\r\n532012.8271139505\r\n 21\r\n184191.6766884448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531770.6696699504\r\n 20\r\n184306.9436934447\r\n 30\r\n0.0\r\n 11\r\n532197.7006858273\r\n 21\r\n184339.4044014448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531756.6695559503\r\n 20\r\n184399.4672084447\r\n 30\r\n0.0\r\n 11\r\n531782.0560989504\r\n 21\r\n184280.7112024448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531679.9657519504\r\n 20\r\n184279.4615594447\r\n 30\r\n0.0\r\n 11\r\n531706.9518369503\r\n 21\r\n184397.1878614447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531703.2662949504\r\n 20\r\n184391.5494754448\r\n 30\r\n0.0\r\n 11\r\n531758.6566159504\r\n 21\r\n184398.5874604448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531375.9456139504\r\n 20\r\n184307.1536334448\r\n 30\r\n0.0\r\n 11\r\n531938.4319279503\r\n 21\r\n184318.4104104447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531947.6993769504\r\n 20\r\n184327.6377694447\r\n 30\r\n0.0\r\n 11\r\n531947.9961989505\r\n 21\r\n184303.3547204447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532079.0267099504\r\n 20\r\n184465.1384104447\r\n 30\r\n0.0\r\n 11\r\n532156.3508382652\r\n 21\r\n184461.3794864448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532066.7333239505\r\n 20\r\n184474.6356914448\r\n 30\r\n0.0\r\n 11\r\n532086.8842529504\r\n 21\r\n184461.4794574448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532060.9040649504\r\n 20\r\n184538.4674204447\r\n 30\r\n0.0\r\n 11\r\n532069.5036639504\r\n 21\r\n184467.1378384447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531877.5339069504\r\n 20\r\n184358.6988784447\r\n 30\r\n0.0\r\n 11\r\n531913.4906179503\r\n 21\r\n184005.4836986493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531605.0758619504\r\n 20\r\n184107.7807034448\r\n 30\r\n0.0\r\n 11\r\n531784.3258864618\r\n 21\r\n184010.3328863243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531761.9190629788\r\n 20\r\n183988.7626476783\r\n 30\r\n0.0\r\n 11\r\n531858.5950009506\r\n 21\r\n184319.9499704448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531730.1039689503\r\n 20\r\n184317.1307774448\r\n 30\r\n0.0\r\n 11\r\n531731.1263569504\r\n 21\r\n184281.6209414447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531883.5775359503\r\n 20\r\n184174.7415354448\r\n 30\r\n0.0\r\n 11\r\n531976.7467269504\r\n 21\r\n184169.1431384447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531941.6557469504\r\n 20\r\n184167.1037214447\r\n 30\r\n0.0\r\n 11\r\n532013.8165219504\r\n 21\r\n184208.8817634447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531939.2152089505\r\n 20\r\n184180.0000304447\r\n 30\r\n0.0\r\n 11\r\n532008.9519349505\r\n 21\r\n184140.4913394448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531994.8446359504\r\n 20\r\n184026.5398393117\r\n 30\r\n0.0\r\n 11\r\n532004.1780449503\r\n 21\r\n184152.1779944448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531409.1658425192\r\n 20\r\n184133.617550475\r\n 30\r\n0.0\r\n 11\r\n531674.1612289504\r\n 21\r\n184084.3574074447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531840.0271239504\r\n 20\r\n184568.8787154448\r\n 30\r\n0.0\r\n 11\r\n531855.4288979504\r\n 21\r\n184524.4614294448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531792.2964649504\r\n 20\r\n184515.1540934448\r\n 30\r\n0.0\r\n 11\r\n531856.6821469506\r\n 21\r\n184525.8910204447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531761.1218889504\r\n 20\r\n184553.6730674448\r\n 30\r\n0.0\r\n 11\r\n531766.5471389503\r\n 21\r\n184449.4928884447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531616.0005679503\r\n 20\r\n184461.6794004447\r\n 30\r\n0.0\r\n 11\r\n531914.0347919505\r\n 21\r\n184443.3946344448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531982.3945939504\r\n 20\r\n184514.3643194447\r\n 30\r\n0.0\r\n 11\r\n531995.6279169504\r\n 21\r\n184446.8036584448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531964.2059889504\r\n 20\r\n184441.6451354448\r\n 30\r\n0.0\r\n 11\r\n532023.2241359505\r\n 21\r\n184453.0218784447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531968.1718629504\r\n 20\r\n184449.2829494447\r\n 30\r\n0.0\r\n 11\r\n531980.8939929504\r\n 21\r\n184379.0930404447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531977.6866639505\r\n 20\r\n184380.9725024447\r\n 30\r\n0.0\r\n 11\r\n532033.0604939504\r\n 21\r\n184390.2098584447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532016.8342139503\r\n 20\r\n184459.4100504447\r\n 30\r\n0.0\r\n 11\r\n532031.5021779503\r\n 21\r\n184383.3118334448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531506.1928449503\r\n 20\r\n184240.4627234447\r\n 30\r\n0.0\r\n 11\r\n531618.8945849504\r\n 21\r\n184242.1622364448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531838.1472499504\r\n 20\r\n184764.0928354447\r\n 30\r\n0.0\r\n 11\r\n532090.6275109504\r\n 21\r\n184843.2601744448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531898.1410099429\r\n 20\r\n185489.5773460393\r\n 30\r\n0.0\r\n 11\r\n532384.9456462926\r\n 21\r\n183588.3773949871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532034.5704961169\r\n 20\r\n184072.7659341317\r\n 30\r\n0.0\r\n 11\r\n532153.81876062\r\n 21\r\n183879.2475727824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531848.4441497004\r\n 20\r\n184056.3091599104\r\n 30\r\n0.0\r\n 11\r\n531872.7555329124\r\n 21\r\n183888.2560305589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531400.0540388189\r\n 20\r\n183972.7571852804\r\n 30\r\n0.0\r\n 11\r\n532184.2443917333\r\n 21\r\n184077.3429025231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531934.003528394\r\n 20\r\n183974.8942294735\r\n 30\r\n0.0\r\n 11\r\n532082.7807717206\r\n 21\r\n183561.6762489006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532002.2213451149\r\n 20\r\n183988.1590894068\r\n 30\r\n0.0\r\n 11\r\n531813.3438607319\r\n 21\r\n183944.1725686889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532017.6216248512\r\n 20\r\n183917.199737725\r\n 30\r\n0.0\r\n 11\r\n531954.8704583398\r\n 21\r\n183903.1307362112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532027.4228756862\r\n 20\r\n183970.6899285112\r\n 30\r\n0.0\r\n 11\r\n532007.8099904357\r\n 21\r\n183904.7157649685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532005.8194622598\r\n 20\r\n183925.0652505675\r\n 30\r\n0.0\r\n 11\r\n532165.6070012576\r\n 21\r\n183554.8422905387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532215.3406327096\r\n 20\r\n183914.506790095\r\n 30\r\n0.0\r\n 11\r\n531850.025606886\r\n 21\r\n183726.0905468235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531846.9898456826\r\n 20\r\n183739.0551582372\r\n 30\r\n0.0\r\n 11\r\n531943.2723962862\r\n 21\r\n183520.502093417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531657.2879060011\r\n 20\r\n183756.915025109\r\n 30\r\n0.0\r\n 11\r\n531862.6710068011\r\n 21\r\n183729.9954447442\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531707.5428474121\r\n 20\r\n183828.1640623365\r\n 30\r\n0.0\r\n 11\r\n531717.0163799135\r\n 21\r\n183743.3019863348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532612.0618786471\r\n 20\r\n183803.7866919309\r\n 30\r\n0.0\r\n 11\r\n531940.3427695725\r\n 21\r\n183521.5239075487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531863.1594357444\r\n 20\r\n183931.8064504249\r\n 30\r\n0.0\r\n 11\r\n532014.6676634007\r\n 21\r\n183535.7250404825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531536.9533087979\r\n 20\r\n183521.91630484\r\n 30\r\n0.0\r\n 11\r\n532020.1225745254\r\n 21\r\n183540.0721337803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531322.8230960095\r\n 20\r\n183496.2175151871\r\n 30\r\n0.0\r\n 11\r\n531822.8598906507\r\n 21\r\n183537.2174611747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531511.6320955303\r\n 20\r\n183610.9754424221\r\n 30\r\n0.0\r\n 11\r\n531571.8542817987\r\n 21\r\n183510.1646492979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531573.6637703916\r\n 20\r\n183613.6364478867\r\n 30\r\n0.0\r\n 11\r\n531538.2870985668\r\n 21\r\n183509.6456215089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531762.5332163358\r\n 20\r\n183634.4117035529\r\n 30\r\n0.0\r\n 11\r\n531564.5281508437\r\n 21\r\n183594.3963889772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531647.8000830325\r\n 20\r\n183818.5796003908\r\n 30\r\n0.0\r\n 11\r\n531724.9336515695\r\n 21\r\n183527.7567185295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531562.2020126962\r\n 20\r\n183850.0654772609\r\n 30\r\n0.0\r\n 11\r\n531683.6345265603\r\n 21\r\n183848.7965788212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531664.5618179023\r\n 20\r\n183949.0972884033\r\n 30\r\n0.0\r\n 11\r\n531554.5510755348\r\n 21\r\n183899.2438278418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531559.3441468585\r\n 20\r\n183903.9768061644\r\n 30\r\n0.0\r\n 11\r\n531563.4592611811\r\n 21\r\n183848.292995883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531576.9778841278\r\n 20\r\n184241.5424111468\r\n 30\r\n0.0\r\n 11\r\n531576.9801121507\r\n 21\r\n184241.5301770692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531688.3652557219\r\n 20\r\n183680.3696937222\r\n 30\r\n0.0\r\n 11\r\n531664.4402060374\r\n 21\r\n183676.2047723989\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531845.0466985964\r\n 20\r\n183572.6468079129\r\n 30\r\n0.0\r\n 11\r\n531848.5375890713\r\n 21\r\n183527.4588575618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531852.4623111796\r\n 20\r\n183586.2972429151\r\n 30\r\n0.0\r\n 11\r\n531842.6874311459\r\n 21\r\n183564.3063776991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531914.5479255571\r\n 20\r\n183602.2297999917\r\n 30\r\n0.0\r\n 11\r\n531845.5021105826\r\n 21\r\n183582.3668242385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531707.8411943864\r\n 20\r\n183754.5901321862\r\n 30\r\n0.0\r\n 11\r\n531365.7560113711\r\n 21\r\n183674.7938172478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531374.0607747642\r\n 20\r\n183774.5071494866\r\n 30\r\n0.0\r\n 11\r\n531666.5682496065\r\n 21\r\n183767.1082814454\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531643.2974167897\r\n 20\r\n183893.5059139139\r\n 30\r\n0.0\r\n 11\r\n531608.4049033558\r\n 21\r\n183886.834614473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531527.2010051643\r\n 20\r\n183719.29209353\r\n 30\r\n0.0\r\n 11\r\n531536.5299245022\r\n 21\r\n183626.4222304713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531528.9213936644\r\n 20\r\n183660.7390828553\r\n 30\r\n0.0\r\n 11\r\n531581.6708679228\r\n 21\r\n183596.1629633728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531541.263570164\r\n 20\r\n183665.2046948853\r\n 30\r\n0.0\r\n 11\r\n531513.379763223\r\n 21\r\n183590.0605605288\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531346.6694038719\r\n 20\r\n183577.4244724932\r\n 30\r\n0.0\r\n 11\r\n531524.155712167\r\n 21\r\n183596.6367946471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531909.3516392598\r\n 20\r\n183825.1299313012\r\n 30\r\n0.0\r\n 11\r\n531867.9584077485\r\n 21\r\n183802.8429323333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531848.70377308\r\n 20\r\n183863.6836230238\r\n 30\r\n0.0\r\n 11\r\n531869.5695376331\r\n 21\r\n183801.8336633017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531881.7592038701\r\n 20\r\n183900.6011533052\r\n 30\r\n0.0\r\n 11\r\n531779.7769291967\r\n 21\r\n183878.6339348538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531767.8030984371\r\n 20\r\n184029.1975708737\r\n 30\r\n0.0\r\n 11\r\n531797.2733862307\r\n 21\r\n183732.0608456437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531878.2349730312\r\n 20\r\n183675.8916353841\r\n 30\r\n0.0\r\n 11\r\n531813.6487009317\r\n 21\r\n183652.0551673432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531803.5459941819\r\n 20\r\n183682.2525717864\r\n 30\r\n0.0\r\n 11\r\n531824.1875434457\r\n 21\r\n183625.8034938436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531811.718444662\r\n 20\r\n183679.5552745401\r\n 30\r\n0.0\r\n 11\r\n531744.4550535487\r\n 21\r\n183655.8042296553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531745.7990662274\r\n 20\r\n183659.270202339\r\n 30\r\n0.0\r\n 11\r\n531763.7475182557\r\n 21\r\n183606.0776947413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531829.4751229565\r\n 20\r\n183633.1302494412\r\n 30\r\n0.0\r\n 11\r\n531756.6892737099\r\n 21\r\n183606.5161939831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532101.7684936581\r\n 20\r\n183858.112361732\r\n 30\r\n0.0\r\n 11\r\n532220.1805946465\r\n 21\r\n183621.4853892659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531603.2015619726\r\n 20\r\n184097.5481402789\r\n 30\r\n0.0\r\n 11\r\n531677.7782680864\r\n 21\r\n183688.04728826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530735.9131272892\r\n 20\r\n184226.3356863664\r\n 30\r\n0.0\r\n 11\r\n530283.9544628965\r\n 21\r\n184816.224090947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530031.1888274785\r\n 20\r\n184139.9555640059\r\n 30\r\n0.0\r\n 11\r\n532155.7272385915\r\n 21\r\n185032.5284892478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530736.1824591328\r\n 20\r\n184432.3874965597\r\n 30\r\n0.0\r\n 11\r\n530658.0779895487\r\n 21\r\n184557.9159257529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530571.6050156501\r\n 20\r\n184436.4223187819\r\n 30\r\n0.0\r\n 11\r\n531028.5298126501\r\n 21\r\n184625.3782307819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530666.7818999167\r\n 20\r\n184526.4514665502\r\n 30\r\n0.0\r\n 11\r\n530666.9708656795\r\n 21\r\n184608.4335532921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530587.4192474452\r\n 20\r\n184533.9936815043\r\n 30\r\n0.0\r\n 11\r\n530675.2625699671\r\n 21\r\n184534.9832109703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530604.4459568052\r\n 20\r\n184525.5195397091\r\n 30\r\n0.0\r\n 11\r\n530484.7853398737\r\n 21\r\n184684.3766753369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530525.0832024871\r\n 20\r\n184723.3672426156\r\n 30\r\n0.0\r\n 11\r\n530669.1589131753\r\n 21\r\n184604.6995201719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530483.8014128733\r\n 20\r\n184678.989008366\r\n 30\r\n0.0\r\n 11\r\n530525.9304985947\r\n 21\r\n184723.3935218478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530293.6891368918\r\n 20\r\n184907.7016572334\r\n 30\r\n0.0\r\n 11\r\n530512.942028526\r\n 21\r\n184707.017488296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530341.6169557605\r\n 20\r\n184858.8693757858\r\n 30\r\n0.0\r\n 11\r\n530423.5169519546\r\n 21\r\n184936.9090576151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530363.0611291585\r\n 20\r\n184991.515820703\r\n 30\r\n0.0\r\n 11\r\n530950.6381382885\r\n 21\r\n184434.1646856795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530794.3778468289\r\n 20\r\n184676.7579559348\r\n 30\r\n0.0\r\n 11\r\n531157.1550750989\r\n 21\r\n184924.2987611555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530895.9427945592\r\n 20\r\n184674.477204796\r\n 30\r\n0.0\r\n 11\r\n530853.3539856806\r\n 21\r\n184722.662670036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530872.5246082747\r\n 20\r\n184625.397131656\r\n 30\r\n0.0\r\n 11\r\n530895.3127741604\r\n 21\r\n184690.3429168817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530881.7703476819\r\n 20\r\n184675.0240901761\r\n 30\r\n0.0\r\n 11\r\n531228.261643328\r\n 21\r\n184881.2784956878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531056.8004158705\r\n 20\r\n184564.4609387729\r\n 30\r\n0.0\r\n 11\r\n530872.2051953306\r\n 21\r\n184927.5536250086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530862.1453565096\r\n 20\r\n184918.8302863079\r\n 30\r\n0.0\r\n 11\r\n531068.2731269009\r\n 21\r\n185039.441703539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530697.9914463482\r\n 20\r\n185015.5737333332\r\n 30\r\n0.0\r\n 11\r\n530880.1604013233\r\n 21\r\n184916.9768076993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530696.9350081967\r\n 20\r\n184928.3907741009\r\n 30\r\n0.0\r\n 11\r\n530754.3600034362\r\n 21\r\n184991.5864201783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531230.2997171692\r\n 20\r\n184634.8808927253\r\n 30\r\n0.0\r\n 11\r\n531185.2838804869\r\n 21\r\n184712.9556354173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531310.676276314\r\n 20\r\n184636.9221898522\r\n 30\r\n0.0\r\n 11\r\n531065.3007066001\r\n 21\r\n185040.3313857042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530762.244886776\r\n 20\r\n184753.1969188066\r\n 30\r\n0.0\r\n 11\r\n531117.1883003287\r\n 21\r\n184985.2538073602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530857.7930969276\r\n 20\r\n185213.7272284981\r\n 30\r\n0.0\r\n 11\r\n531119.0590254821\r\n 21\r\n184978.5341598309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530551.2309914298\r\n 20\r\n185447.3752691109\r\n 30\r\n0.0\r\n 11\r\n530733.9839065221\r\n 21\r\n185290.855504596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530348.8181148427\r\n 20\r\n184670.0431449962\r\n 30\r\n0.0\r\n 11\r\n530754.9648854495\r\n 21\r\n185059.3532645555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530768.0427135953\r\n 20\r\n185059.3665338815\r\n 30\r\n0.0\r\n 11\r\n530751.1019407378\r\n 21\r\n185076.7666714392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530958.1276376175\r\n 20\r\n185054.7821770324\r\n 30\r\n0.0\r\n 11\r\n530999.5616859051\r\n 21\r\n185101.4584959087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530956.1327284903\r\n 20\r\n185039.3761384984\r\n 30\r\n0.0\r\n 11\r\n530961.1058763477\r\n 21\r\n185062.9221409832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530997.0898474322\r\n 20\r\n184990.0711256135\r\n 30\r\n0.0\r\n 11\r\n530952.7982457301\r\n 21\r\n185046.6406968503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530292.8641702958\r\n 20\r\n185138.907267058\r\n 30\r\n0.0\r\n 11\r\n530369.4465080707\r\n 21\r\n185353.2161854958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530370.209055034\r\n 20\r\n184973.0161857821\r\n 30\r\n0.0\r\n 11\r\n530279.2606443146\r\n 21\r\n185168.0844213306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530103.8172967549\r\n 20\r\n184909.1432228739\r\n 30\r\n0.0\r\n 11\r\n530296.6434578779\r\n 21\r\n184802.4901862823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530239.946090109\r\n 20\r\n184831.2897865306\r\n 30\r\n0.0\r\n 11\r\n530402.572414678\r\n 21\r\n185038.3924175608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530862.2055151921\r\n 20\r\n184812.5389120712\r\n 30\r\n0.0\r\n 11\r\n530841.7372332033\r\n 21\r\n184854.8610028793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530790.4707324915\r\n 20\r\n184816.8599962522\r\n 30\r\n0.0\r\n 11\r\n530843.6341425299\r\n 21\r\n184854.7341230553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530795.6071824628\r\n 20\r\n184767.5732594106\r\n 30\r\n0.0\r\n 11\r\n530725.8663087268\r\n 21\r\n184845.1564635503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530627.8983637173\r\n 20\r\n184730.1996766032\r\n 30\r\n0.0\r\n 11\r\n530825.9688616006\r\n 21\r\n184953.6427548386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530924.4874933892\r\n 20\r\n184951.6836966566\r\n 30\r\n0.0\r\n 11\r\n530886.1381600594\r\n 21\r\n185008.8579249901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530860.2504800935\r\n 20\r\n184990.3167291071\r\n 30\r\n0.0\r\n 11\r\n530910.0659924778\r\n 21\r\n185023.9468745498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530868.4525274285\r\n 20\r\n184987.7108168294\r\n 30\r\n0.0\r\n 11\r\n530827.8842952691\r\n 21\r\n185046.3852955798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530826.9412049412\r\n 20\r\n185042.7894761519\r\n 30\r\n0.0\r\n 11\r\n530872.6657967761\r\n 21\r\n185075.3601914692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530910.0543372351\r\n 20\r\n185014.9114050643\r\n 30\r\n0.0\r\n 11\r\n530866.6906180778\r\n 21\r\n185079.1428277431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531418.7837954784\r\n 20\r\n184696.3400722527\r\n 30\r\n0.0\r\n 11\r\n531280.8903155291\r\n 21\r\n184879.4025017154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531365.823685466\r\n 20\r\n184738.3257753346\r\n 30\r\n0.0\r\n 11\r\n531592.6022829192\r\n 21\r\n184976.3217497332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531322.1351667875\r\n 20\r\n184916.8361742784\r\n 30\r\n0.0\r\n 11\r\n531466.2108774758\r\n 21\r\n184798.1684518348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531280.8533771736\r\n 20\r\n184872.4579400288\r\n 30\r\n0.0\r\n 11\r\n531322.982462895\r\n 21\r\n184916.8624535107\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531090.7411011921\r\n 20\r\n185101.1705888962\r\n 30\r\n0.0\r\n 11\r\n531309.9939928264\r\n 21\r\n184900.4864199589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531234.6183701311\r\n 20\r\n185110.4794756935\r\n 30\r\n0.0\r\n 11\r\n531708.2884303343\r\n 21\r\n184665.0084063687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531591.4298111294\r\n 20\r\n184870.2268875977\r\n 30\r\n0.0\r\n 11\r\n531810.6718730136\r\n 21\r\n185019.8265656036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531638.9187541661\r\n 20\r\n184819.4880729046\r\n 30\r\n0.0\r\n 11\r\n531511.6900544397\r\n 21\r\n184965.8519211652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531692.9947588596\r\n 20\r\n184867.9461364589\r\n 30\r\n0.0\r\n 11\r\n531650.4059499809\r\n 21\r\n184916.131601699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531669.5765725753\r\n 20\r\n184818.8660633189\r\n 30\r\n0.0\r\n 11\r\n531692.3647384609\r\n 21\r\n184883.8118485445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531678.8223119822\r\n 20\r\n184868.493021839\r\n 30\r\n0.0\r\n 11\r\n532025.3136076282\r\n 21\r\n185074.7474273507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531803.886242807\r\n 20\r\n184855.9649338027\r\n 30\r\n0.0\r\n 11\r\n531669.257159631\r\n 21\r\n185121.0225566715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531659.1973208101\r\n 20\r\n185112.2992179708\r\n 30\r\n0.0\r\n 11\r\n531865.3250912015\r\n 21\r\n185232.9106352019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531525.0175778789\r\n 20\r\n185192.8194795596\r\n 30\r\n0.0\r\n 11\r\n531677.2123656238\r\n 21\r\n185110.4457393622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531361.9808639693\r\n 20\r\n184957.7832641063\r\n 30\r\n0.0\r\n 11\r\n531551.4119677366\r\n 21\r\n185185.0553518411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531559.2968510764\r\n 20\r\n184946.6658504695\r\n 30\r\n0.0\r\n 11\r\n531914.240264629\r\n 21\r\n185178.722739023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531495.5870839868\r\n 20\r\n185514.328262188\r\n 30\r\n0.0\r\n 11\r\n531683.1901243598\r\n 21\r\n185202.3268566529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531462.5997031672\r\n 20\r\n185412.663348532\r\n 30\r\n0.0\r\n 11\r\n531570.4877017599\r\n 21\r\n185459.0282866746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531511.2935385215\r\n 20\r\n185374.1416658756\r\n 30\r\n0.0\r\n 11\r\n531543.5981320772\r\n 21\r\n185479.1274464145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531145.8700791432\r\n 20\r\n184863.5120766591\r\n 30\r\n0.0\r\n 11\r\n531379.525038466\r\n 21\r\n185080.3303849344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531364.8828980397\r\n 20\r\n185058.1671364388\r\n 30\r\n0.0\r\n 11\r\n531313.3430297857\r\n 21\r\n185456.7339505713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531306.0542879553\r\n 20\r\n185343.6943371587\r\n 30\r\n0.0\r\n 11\r\n531471.2618974372\r\n 21\r\n185366.875736194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531447.4325044233\r\n 20\r\n185362.2124236505\r\n 30\r\n0.0\r\n 11\r\n531528.0241316422\r\n 21\r\n185383.6033531333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531454.8133421622\r\n 20\r\n185351.359117895\r\n 30\r\n0.0\r\n 11\r\n531476.2768427921\r\n 21\r\n185428.5825972159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531385.8070593464\r\n 20\r\n185499.2874665739\r\n 30\r\n0.0\r\n 11\r\n531481.1514824921\r\n 21\r\n185416.9376060774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531046.8204185547\r\n 20\r\n185009.8251670371\r\n 30\r\n0.0\r\n 11\r\n531131.4314460383\r\n 21\r\n185132.7716499767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531659.2574794926\r\n 20\r\n185006.0078437341\r\n 30\r\n0.0\r\n 11\r\n531638.7891975036\r\n 21\r\n185048.3299345422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531587.5226967918\r\n 20\r\n185010.328927915\r\n 30\r\n0.0\r\n 11\r\n531640.6861068304\r\n 21\r\n185048.2030547182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531592.6591467632\r\n 20\r\n184961.0421910735\r\n 30\r\n0.0\r\n 11\r\n531522.9182730272\r\n 21\r\n185038.625395213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531424.9503280177\r\n 20\r\n184923.6686082661\r\n 30\r\n0.0\r\n 11\r\n531623.020825901\r\n 21\r\n185147.1116865014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531721.5394576896\r\n 20\r\n185145.1526283194\r\n 30\r\n0.0\r\n 11\r\n531683.1901243598\r\n 21\r\n185202.3268566529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531522.4751258036\r\n 20\r\n185175.0126803835\r\n 30\r\n0.0\r\n 11\r\n531707.1179567783\r\n 21\r\n185217.4158062127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531190.971715833\r\n 20\r\n185002.7164624653\r\n 30\r\n0.0\r\n 11\r\n531271.9560624464\r\n 21\r\n185081.1135679418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531510.9794785422\r\n 20\r\n185470.5053524346\r\n 30\r\n0.0\r\n 11\r\n531383.9700559601\r\n 21\r\n186031.2293542523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531446.5789296222\r\n 20\r\n185494.6210341629\r\n 30\r\n0.0\r\n 11\r\n531394.317069799\r\n 21\r\n185715.8408406318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531303.1927971798\r\n 20\r\n185374.8117721197\r\n 30\r\n0.0\r\n 11\r\n531201.7089334832\r\n 21\r\n185510.9511236965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531179.1304861695\r\n 20\r\n185309.1540542189\r\n 30\r\n0.0\r\n 11\r\n531945.5235833686\r\n 21\r\n185894.4094584342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531306.2594945883\r\n 20\r\n185492.8769809982\r\n 30\r\n0.0\r\n 11\r\n531119.7299674333\r\n 21\r\n185890.4829456162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531363.9212119025\r\n 20\r\n185531.6681318393\r\n 30\r\n0.0\r\n 11\r\n531199.1434766117\r\n 21\r\n185429.4046678644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531324.7054493229\r\n 20\r\n185592.7788688038\r\n 30\r\n0.0\r\n 11\r\n531270.3457337779\r\n 21\r\n185558.4180331335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531369.4236081366\r\n 20\r\n185561.8345429817\r\n 30\r\n0.0\r\n 11\r\n531308.9422635012\r\n 21\r\n185594.6866734165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531321.9057846517\r\n 20\r\n185578.8749408755\r\n 30\r\n0.0\r\n 11\r\n531173.5376807172\r\n 21\r\n185953.8202748729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531458.9627071512\r\n 20\r\n185734.036583085\r\n 30\r\n0.0\r\n 11\r\n531071.0819022518\r\n 21\r\n185609.6976292752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531078.0896100116\r\n 20\r\n185598.3755699595\r\n 30\r\n0.0\r\n 11\r\n530991.8880389454\r\n 21\r\n185821.0975061012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530956.4097734758\r\n 20\r\n185451.7474070975\r\n 30\r\n0.0\r\n 11\r\n531082.7918483163\r\n 21\r\n185615.8646001648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531042.3088874028\r\n 20\r\n185436.8032889021\r\n 30\r\n0.0\r\n 11\r\n530989.0780830457\r\n 21\r\n185503.5700563008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531427.9086440181\r\n 20\r\n185996.2182578582\r\n 30\r\n0.0\r\n 11\r\n530990.5357910721\r\n 21\r\n185818.3049727551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531225.67491972\r\n 20\r\n185473.3432035857\r\n 30\r\n0.0\r\n 11\r\n531053.182121386\r\n 21\r\n185860.7466894662\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530705.244826224\r\n 20\r\n185533.1168306179\r\n 30\r\n0.0\r\n 11\r\n531060.1140837643\r\n 21\r\n185861.5220430019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530750.2210620191\r\n 20\r\n185452.1857979919\r\n 30\r\n0.0\r\n 11\r\n530721.6518899537\r\n 21\r\n185566.0863253691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530796.0140686664\r\n 20\r\n185494.1144299564\r\n 30\r\n0.0\r\n 11\r\n530697.5223713036\r\n 21\r\n185542.7455561081\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530944.3922051936\r\n 20\r\n185612.8039722922\r\n 30\r\n0.0\r\n 11\r\n530775.9576853574\r\n 21\r\n185501.2824771057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530993.2462747479\r\n 20\r\n185401.3925582406\r\n 30\r\n0.0\r\n 11\r\n530842.445202569\r\n 21\r\n185661.7511045552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530910.7632248174\r\n 20\r\n185339.3410325321\r\n 30\r\n0.0\r\n 11\r\n530866.5377199338\r\n 21\r\n185054.4967921601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531241.8445475885\r\n 20\r\n185051.9469660791\r\n 30\r\n0.0\r\n 11\r\n531241.8374840348\r\n 21\r\n185051.9572004795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531058.6997013602\r\n 20\r\n185297.1334434182\r\n 30\r\n0.0\r\n 11\r\n530922.2746789083\r\n 21\r\n185514.9725242263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530924.3468199957\r\n 20\r\n185527.8851535635\r\n 30\r\n0.0\r\n 11\r\n530904.4681140504\r\n 21\r\n185513.935543462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530959.1812899459\r\n 20\r\n185714.807207831\r\n 30\r\n0.0\r\n 11\r\n530929.7367229487\r\n 21\r\n185749.2623184473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530974.0721419792\r\n 20\r\n185710.3813506865\r\n 30\r\n0.0\r\n 11\r\n530951.620342561\r\n 21\r\n185719.0452490875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531029.2769113626\r\n 20\r\n185742.952861627\r\n 30\r\n0.0\r\n 11\r\n530966.368846218\r\n 21\r\n185708.2478517434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530990.5554871495\r\n 20\r\n185489.0985828673\r\n 30\r\n0.0\r\n 11\r\n530692.0265768201\r\n 21\r\n185303.9764231624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530835.9437799745\r\n 20\r\n185306.8642317253\r\n 30\r\n0.0\r\n 11\r\n530970.1789346107\r\n 21\r\n185451.086004182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531368.1091655745\r\n 20\r\n185350.5718122836\r\n 30\r\n0.0\r\n 11\r\n530668.7795996761\r\n 21\r\n185311.5128716326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530837.7457079078\r\n 20\r\n185386.5022824307\r\n 30\r\n0.0\r\n 11\r\n530778.7567006423\r\n 21\r\n185458.8357962565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530797.6081421722\r\n 20\r\n185429.1683182495\r\n 30\r\n0.0\r\n 11\r\n530789.3411006597\r\n 21\r\n185512.1396281498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530809.4994571749\r\n 20\r\n185434.7241835344\r\n 30\r\n0.0\r\n 11\r\n530736.6862803595\r\n 21\r\n185468.2262566015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530609.7436608612\r\n 20\r\n185359.4255856905\r\n 30\r\n0.0\r\n 11\r\n530748.9595424861\r\n 21\r\n185471.1817544603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531183.0307102225\r\n 20\r\n185581.4869541878\r\n 30\r\n0.0\r\n 11\r\n531137.9864403011\r\n 21\r\n185568.0287342017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531167.3269023387\r\n 20\r\n185511.358919597\r\n 30\r\n0.0\r\n 11\r\n531138.4141562844\r\n 21\r\n185569.8811441243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531226.956583333\r\n 20\r\n185337.0486008117\r\n 30\r\n0.0\r\n 11\r\n531037.9542343994\r\n 21\r\n185568.2127058122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531055.5968811997\r\n 20\r\n185665.1585449819\r\n 30\r\n0.0\r\n 11\r\n530905.7031021065\r\n 21\r\n185592.1718504262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531342.5419517839\r\n 20\r\n185694.0402766141\r\n 30\r\n0.0\r\n 11\r\n531259.2409286286\r\n 21\r\n185945.1870251501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530564.9552335094\r\n 20\r\n184893.4794901465\r\n 30\r\n0.0\r\n 11\r\n530687.4949689912\r\n 21\r\n184780.9839569827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530476.7429703215\r\n 20\r\n184939.4505193447\r\n 30\r\n0.0\r\n 11\r\n530406.7340426724\r\n 21\r\n184768.7171604471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531173.3663268639\r\n 20\r\n185528.1064924517\r\n 30\r\n0.0\r\n 11\r\n531070.7327473465\r\n 21\r\n185471.5685231011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531054.9475551248\r\n 20\r\n184568.1054545053\r\n 30\r\n0.0\r\n 11\r\n531230.7725863386\r\n 21\r\n184476.7284847849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533270.7018874835\r\n 20\r\n183269.704674172\r\n 30\r\n0.0\r\n 11\r\n533995.2261483039\r\n 21\r\n183104.4788902862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533457.9214482086\r\n 20\r\n183355.7642878445\r\n 30\r\n0.0\r\n 11\r\n533604.5737555198\r\n 21\r\n183337.0347532795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533530.1315517867\r\n 20\r\n183207.8193128204\r\n 30\r\n0.0\r\n 11\r\n533511.6243141418\r\n 21\r\n183701.9266786306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533572.3429516997\r\n 20\r\n183331.8438445227\r\n 30\r\n0.0\r\n 11\r\n533646.7981581808\r\n 21\r\n183366.1588628451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533612.2522464815\r\n 20\r\n183262.8325135418\r\n 30\r\n0.0\r\n 11\r\n533576.567616609\r\n 21\r\n183343.107264685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533597.4568488472\r\n 20\r\n183274.7830833879\r\n 30\r\n0.0\r\n 11\r\n533791.7168653864\r\n 21\r\n183232.1532961663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533594.7911288029\r\n 20\r\n183152.2117233308\r\n 30\r\n0.0\r\n 11\r\n533751.8214958982\r\n 21\r\n183555.6973923812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533810.3821678945\r\n 20\r\n183285.0285129525\r\n 30\r\n0.0\r\n 11\r\n533642.492107029\r\n 21\r\n183366.5930041412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533787.2284528753\r\n 20\r\n183229.0149493306\r\n 30\r\n0.0\r\n 11\r\n533810.0531847598\r\n 21\r\n183285.8097756414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534074.3386399248\r\n 20\r\n183151.4269752421\r\n 30\r\n0.0\r\n 11\r\n533800.5742660043\r\n 21\r\n183267.181170518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534009.9822550737\r\n 20\r\n183174.6632241171\r\n 30\r\n0.0\r\n 11\r\n534046.8228962965\r\n 21\r\n183281.6238171917\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.646702763\r\n 20\r\n183249.4026584481\r\n 30\r\n0.0\r\n 11\r\n533363.7016999166\r\n 21\r\n183552.296365491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533655.8537941067\r\n 20\r\n183510.4459319125\r\n 30\r\n0.0\r\n 11\r\n533729.8187339051\r\n 21\r\n183943.3581115531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533589.946866456\r\n 20\r\n183532.4891602347\r\n 30\r\n0.0\r\n 11\r\n533776.0005197917\r\n 21\r\n183477.7757597539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533611.4813241646\r\n 20\r\n183601.8337010309\r\n 30\r\n0.0\r\n 11\r\n533673.0261102665\r\n 21\r\n183583.1820253481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533576.6132530237\r\n 20\r\n183560.1026257608\r\n 30\r\n0.0\r\n 11\r\n533626.1680009311\r\n 21\r\n183607.8685391599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533617.8809475537\r\n 20\r\n183589.176602051\r\n 30\r\n0.0\r\n 11\r\n533661.0930421482\r\n 21\r\n183990.087829921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533444.4675323084\r\n 20\r\n183702.2585308958\r\n 30\r\n0.0\r\n 11\r\n533851.4514544708\r\n 21\r\n183685.6518652057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533847.7102810031\r\n 20\r\n183672.8729522521\r\n 30\r\n0.0\r\n 11\r\n533871.5176046772\r\n 21\r\n183910.5049850937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534004.0299181535\r\n 20\r\n183563.9235520484\r\n 30\r\n0.0\r\n 11\r\n533838.5224367574\r\n 21\r\n183688.479384923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533925.2076230635\r\n 20\r\n183526.6538560638\r\n 30\r\n0.0\r\n 11\r\n533958.7459745272\r\n 21\r\n183605.1809134549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533207.3255747524\r\n 20\r\n183960.3049635265\r\n 30\r\n0.0\r\n 11\r\n533517.743220695\r\n 21\r\n183803.8631234574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533404.6134673158\r\n 20\r\n183963.2474941249\r\n 30\r\n0.0\r\n 11\r\n533873.5643870204\r\n 21\r\n183908.1731405794\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533738.7306447869\r\n 20\r\n183513.0669599583\r\n 30\r\n0.0\r\n 11\r\n533801.8809645518\r\n 21\r\n183932.4084239981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534224.47460254\r\n 20\r\n183709.2127634093\r\n 30\r\n0.0\r\n 11\r\n533794.9927018023\r\n 21\r\n183931.3106481514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534457.7232899407\r\n 20\r\n183610.3296057948\r\n 30\r\n0.0\r\n 11\r\n533968.0924029948\r\n 21\r\n183836.668115154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534202.6632789289\r\n 20\r\n183619.2296539358\r\n 30\r\n0.0\r\n 11\r\n534199.8836010037\r\n 21\r\n183736.6255700483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534147.3617370868\r\n 20\r\n183647.456398454\r\n 30\r\n0.0\r\n 11\r\n534229.3554706404\r\n 21\r\n183720.5496849997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533972.7437243368\r\n 20\r\n183722.3685368734\r\n 30\r\n0.0\r\n 11\r\n534164.7865490214\r\n 21\r\n183659.7044734213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533972.5943166301\r\n 20\r\n183472.651390221\r\n 30\r\n0.0\r\n 11\r\n534057.9839914489\r\n 21\r\n183796.6861657618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533880.9676565471\r\n 20\r\n183491.6555787594\r\n 30\r\n0.0\r\n 11\r\n534001.1484391712\r\n 21\r\n183474.2186921551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533966.8649116843\r\n 20\r\n183378.0488408435\r\n 30\r\n0.0\r\n 11\r\n533865.8384516585\r\n 21\r\n183444.2408746609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533869.8459157255\r\n 20\r\n183438.8265558422\r\n 30\r\n0.0\r\n 11\r\n533882.4827401662\r\n 21\r\n183493.2134252263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.3120588305\r\n 20\r\n183102.5693639709\r\n 30\r\n0.0\r\n 11\r\n534020.1041949208\r\n 21\r\n183633.953815103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534014.6697131808\r\n 20\r\n183645.8490315072\r\n 30\r\n0.0\r\n 11\r\n534037.5443778956\r\n 21\r\n183637.6940154909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533931.3368567337\r\n 20\r\n183816.7552329881\r\n 30\r\n0.0\r\n 11\r\n533950.5478562621\r\n 21\r\n183857.8048940144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.1613004711\r\n 20\r\n183808.5253846964\r\n 30\r\n0.0\r\n 11\r\n533937.4969419636\r\n 21\r\n183822.8529595328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533856.2782318214\r\n 20\r\n183825.2273517097\r\n 30\r\n0.0\r\n 11\r\n533926.1545818143\r\n 21\r\n183808.5193272029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533961.1739025831\r\n 20\r\n183590.8382696407\r\n 30\r\n0.0\r\n 11\r\n534379.5749554228\r\n 21\r\n183474.2284763425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534350.0885551939\r\n 20\r\n183462.4292674622\r\n 30\r\n0.0\r\n 11\r\n534369.0260173707\r\n 21\r\n183662.8181014637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534101.8508752668\r\n 20\r\n183248.1966110715\r\n 30\r\n0.0\r\n 11\r\n534369.7091801646\r\n 21\r\n183492.8116011192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534331.7371032914\r\n 20\r\n183358.3280084779\r\n 30\r\n0.0\r\n 11\r\n533990.9335592428\r\n 21\r\n183559.6209208238\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533948.9530815789\r\n 20\r\n183438.1485673899\r\n 30\r\n0.0\r\n 11\r\n533982.607720473\r\n 21\r\n183426.774957106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534135.7799619498\r\n 20\r\n183532.6183973673\r\n 30\r\n0.0\r\n 11\r\n534173.3870155533\r\n 21\r\n183618.0440944372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534163.1125968062\r\n 20\r\n183584.4290320622\r\n 30\r\n0.0\r\n 11\r\n534148.9959986748\r\n 21\r\n183666.607520118\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534150.1714181212\r\n 20\r\n183586.619216026\r\n 30\r\n0.0\r\n 11\r\n534211.4401009357\r\n 21\r\n183638.2941240943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534362.7636945454\r\n 20\r\n183567.208368469\r\n 30\r\n0.0\r\n 11\r\n534198.8229231334\r\n 21\r\n183637.8760868667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534133.0534407664\r\n 20\r\n183026.7152225984\r\n 30\r\n0.0\r\n 11\r\n533977.4553795874\r\n 21\r\n183110.2952903923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534027.2513479877\r\n 20\r\n183070.7431726557\r\n 30\r\n0.0\r\n 11\r\n534147.8091657108\r\n 21\r\n183304.8470679847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533751.0505647677\r\n 20\r\n183628.6602944098\r\n 30\r\n0.0\r\n 11\r\n533798.0520979916\r\n 21\r\n183627.6775367849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533784.854580768\r\n 20\r\n183565.2423212487\r\n 30\r\n0.0\r\n 11\r\n533797.1467362854\r\n 21\r\n183629.3492675242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533737.9064232347\r\n 20\r\n183549.3855860542\r\n 30\r\n0.0\r\n 11\r\n533837.4861916935\r\n 21\r\n183518.2919734023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533773.7742595558\r\n 20\r\n183381.3482958636\r\n 30\r\n0.0\r\n 11\r\n533894.426477489\r\n 21\r\n183654.4815484178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533851.6151786993\r\n 20\r\n183743.2337394579\r\n 30\r\n0.0\r\n 11\r\n533919.5664651833\r\n 21\r\n183732.1799429354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533913.4912480489\r\n 20\r\n183700.922309379\r\n 30\r\n0.0\r\n 11\r\n533923.3192982251\r\n 21\r\n183760.2180207445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533907.7061656309\r\n 20\r\n183707.2939010718\r\n 30\r\n0.0\r\n 11\r\n533977.9455113938\r\n 21\r\n183694.8476074883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533975.0691473797\r\n 20\r\n183692.4926410805\r\n 30\r\n0.0\r\n 11\r\n533985.6377707644\r\n 21\r\n183747.6278747745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533915.1095672107\r\n 20\r\n183756.444406914\r\n 30\r\n0.0\r\n 11\r\n533991.5652424396\r\n 21\r\n183743.7709100099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533943.085985443\r\n 20\r\n183201.5481465576\r\n 30\r\n0.0\r\n 11\r\n533980.6329200526\r\n 21\r\n183307.8251348707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533567.3344408618\r\n 20\r\n183694.6941674654\r\n 30\r\n0.0\r\n 11\r\n533580.779713257\r\n 21\r\n183958.953461359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533299.3400004697\r\n 20\r\n184222.45492858\r\n 30\r\n0.0\r\n 11\r\n533281.5900181469\r\n 21\r\n184813.9041900183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533203.5044763441\r\n 20\r\n184131.5129678913\r\n 30\r\n0.0\r\n 11\r\n533448.5161786756\r\n 21\r\n184142.2478269584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533425.5537299617\r\n 20\r\n183189.4530703633\r\n 30\r\n0.0\r\n 11\r\n533355.5667372975\r\n 21\r\n184507.1397523095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533416.2853748554\r\n 20\r\n184137.0569182016\r\n 30\r\n0.0\r\n 11\r\n533490.7405813366\r\n 21\r\n184171.371936524\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533456.1946696371\r\n 20\r\n184068.0455872208\r\n 30\r\n0.0\r\n 11\r\n533420.510039765\r\n 21\r\n184148.3203383639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533443.2091147539\r\n 20\r\n184079.7836062105\r\n 30\r\n0.0\r\n 11\r\n533637.4691312929\r\n 21\r\n184037.1538189889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533407.8651870973\r\n 20\r\n183878.1092921243\r\n 30\r\n0.0\r\n 11\r\n533595.763919054\r\n 21\r\n184360.9104660599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533654.3245910503\r\n 20\r\n184090.2415866314\r\n 30\r\n0.0\r\n 11\r\n533486.4345301848\r\n 21\r\n184171.8060778201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533631.1708760309\r\n 20\r\n184034.2280230095\r\n 30\r\n0.0\r\n 11\r\n533653.9956079153\r\n 21\r\n184091.0228493203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.2810630807\r\n 20\r\n183956.640048921\r\n 30\r\n0.0\r\n 11\r\n533644.51668916\r\n 21\r\n184072.3942441969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533853.9246782293\r\n 20\r\n183979.876297796\r\n 30\r\n0.0\r\n 11\r\n533890.7653194523\r\n 21\r\n184086.8368908706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533965.5891259187\r\n 20\r\n184054.615732127\r\n 30\r\n0.0\r\n 11\r\n533264.55379769\r\n 21\r\n184336.4331711375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533499.7962172624\r\n 20\r\n184315.6590055914\r\n 30\r\n0.0\r\n 11\r\n533573.761157061\r\n 21\r\n184748.571185232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533433.8892896117\r\n 20\r\n184337.7022339136\r\n 30\r\n0.0\r\n 11\r\n533619.9429429473\r\n 21\r\n184282.9888334328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533455.4237473202\r\n 20\r\n184407.0467747098\r\n 30\r\n0.0\r\n 11\r\n533516.9685334222\r\n 21\r\n184388.3950990269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533420.5556761794\r\n 20\r\n184365.3156994397\r\n 30\r\n0.0\r\n 11\r\n533470.1104240868\r\n 21\r\n184413.0816128387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533461.8233707093\r\n 20\r\n184394.3896757299\r\n 30\r\n0.0\r\n 11\r\n533505.0354653038\r\n 21\r\n184795.3009035999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n230\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533288.409955464\r\n 20\r\n184507.4716045747\r\n 30\r\n0.0\r\n 11\r\n533695.3938776265\r\n 21\r\n184490.8649388846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n231\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533691.6527041588\r\n 20\r\n184478.0860259309\r\n 30\r\n0.0\r\n 11\r\n533715.4600278328\r\n 21\r\n184715.7180587726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n232\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533847.9723413094\r\n 20\r\n184369.1366257273\r\n 30\r\n0.0\r\n 11\r\n533682.4648599131\r\n 21\r\n184493.6924586019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n233\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533769.1500462192\r\n 20\r\n184331.8669297427\r\n 30\r\n0.0\r\n 11\r\n533802.6883976829\r\n 21\r\n184410.3939871337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n234\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533280.1746114135\r\n 20\r\n184638.1115223118\r\n 30\r\n0.0\r\n 11\r\n533369.903982884\r\n 21\r\n184629.7013561934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n235\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533248.5558904716\r\n 20\r\n184768.4605678038\r\n 30\r\n0.0\r\n 11\r\n533717.5068101762\r\n 21\r\n184713.3862142584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n236\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533582.6730679426\r\n 20\r\n184318.2800336372\r\n 30\r\n0.0\r\n 11\r\n533645.8233877078\r\n 21\r\n184737.6214976771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n237\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.0039373072\r\n 20\r\n184485.2255270968\r\n 30\r\n0.0\r\n 11\r\n533638.9351249582\r\n 21\r\n184736.5237218303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n238\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534046.6057020844\r\n 20\r\n184424.4427276146\r\n 30\r\n0.0\r\n 11\r\n534043.8260241596\r\n 21\r\n184541.8386437273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n239\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533991.3041602425\r\n 20\r\n184452.6694721329\r\n 30\r\n0.0\r\n 11\r\n534073.2978937961\r\n 21\r\n184525.7627586786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533816.6861474925\r\n 20\r\n184527.5816105521\r\n 30\r\n0.0\r\n 11\r\n534008.728972177\r\n 21\r\n184464.9175471002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533816.5367397858\r\n 20\r\n184277.8644638999\r\n 30\r\n0.0\r\n 11\r\n533901.9264146046\r\n 21\r\n184601.8992394407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533724.9100797029\r\n 20\r\n184296.8686524383\r\n 30\r\n0.0\r\n 11\r\n533845.0908623268\r\n 21\r\n184279.431765834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533810.80733484\r\n 20\r\n184183.2619145225\r\n 30\r\n0.0\r\n 11\r\n533709.7808748143\r\n 21\r\n184249.4539483398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533713.7883388813\r\n 20\r\n184244.0396295211\r\n 30\r\n0.0\r\n 11\r\n533726.4251633219\r\n 21\r\n184298.4264989052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n23F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533679.2544819863\r\n 20\r\n183907.7824376498\r\n 30\r\n0.0\r\n 11\r\n533864.0466180764\r\n 21\r\n184439.1668887819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n240\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533858.6121363364\r\n 20\r\n184451.062105186\r\n 30\r\n0.0\r\n 11\r\n533881.4868010512\r\n 21\r\n184442.9070891699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n241\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533775.2792798895\r\n 20\r\n184621.968306667\r\n 30\r\n0.0\r\n 11\r\n533794.4902794179\r\n 21\r\n184663.0179676933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n242\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533762.1037236266\r\n 20\r\n184613.7384583753\r\n 30\r\n0.0\r\n 11\r\n533781.4393651193\r\n 21\r\n184628.0660332116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n243\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533700.2206549769\r\n 20\r\n184630.4404253886\r\n 30\r\n0.0\r\n 11\r\n533770.09700497\r\n 21\r\n184613.7324008818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n244\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533805.1163257389\r\n 20\r\n184396.0513433196\r\n 30\r\n0.0\r\n 11\r\n534148.8336143433\r\n 21\r\n184307.1003803216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n245\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533945.7932984225\r\n 20\r\n184053.4096847504\r\n 30\r\n0.0\r\n 11\r\n534099.4280930914\r\n 21\r\n184187.6594453309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n246\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534111.8739580623\r\n 20\r\n184159.1560880029\r\n 30\r\n0.0\r\n 11\r\n533834.8759823985\r\n 21\r\n184364.8339945026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n247\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533792.8955047349\r\n 20\r\n184243.3616410688\r\n 30\r\n0.0\r\n 11\r\n533826.5501436286\r\n 21\r\n184231.9880307849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n248\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533979.7223851057\r\n 20\r\n184337.8314710463\r\n 30\r\n0.0\r\n 11\r\n534017.3294387088\r\n 21\r\n184423.2571681159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n249\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534007.0550199618\r\n 20\r\n184389.6421057411\r\n 30\r\n0.0\r\n 11\r\n533992.9384218304\r\n 21\r\n184471.8205937969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533994.1138412768\r\n 20\r\n184391.8322897049\r\n 30\r\n0.0\r\n 11\r\n534055.3825240914\r\n 21\r\n184443.5071977732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534157.3418682092\r\n 20\r\n184390.7032924748\r\n 30\r\n0.0\r\n 11\r\n534042.765346289\r\n 21\r\n184443.0891605456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533853.5262160743\r\n 20\r\n183878.666833987\r\n 30\r\n0.0\r\n 11\r\n533991.7515888664\r\n 21\r\n184110.0601416636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533594.9929879234\r\n 20\r\n184433.8733680887\r\n 30\r\n0.0\r\n 11\r\n533641.9945211472\r\n 21\r\n184432.8906104638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533628.7970039238\r\n 20\r\n184370.4553949276\r\n 30\r\n0.0\r\n 11\r\n533641.0891594411\r\n 21\r\n184434.5623412031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n24F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533581.8488463905\r\n 20\r\n184354.5986597329\r\n 30\r\n0.0\r\n 11\r\n533681.4286148493\r\n 21\r\n184323.5050470813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n250\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533617.7166827114\r\n 20\r\n184186.5613695425\r\n 30\r\n0.0\r\n 11\r\n533738.3689006447\r\n 21\r\n184459.6946220967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n251\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533695.557601855\r\n 20\r\n184548.4468131368\r\n 30\r\n0.0\r\n 11\r\n533763.508888339\r\n 21\r\n184537.3930166142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n252\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533757.4336712046\r\n 20\r\n184506.1353830579\r\n 30\r\n0.0\r\n 11\r\n533767.2617213808\r\n 21\r\n184565.4310944234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n253\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533751.6485887866\r\n 20\r\n184512.5069747506\r\n 30\r\n0.0\r\n 11\r\n533821.8879345495\r\n 21\r\n184500.0606811671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n254\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533819.0115705354\r\n 20\r\n184497.7057147594\r\n 30\r\n0.0\r\n 11\r\n533829.5801939202\r\n 21\r\n184552.8409484534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n255\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533759.0519903664\r\n 20\r\n184561.6574805929\r\n 30\r\n0.0\r\n 11\r\n533835.5076655954\r\n 21\r\n184548.9839836887\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n256\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533787.0284085987\r\n 20\r\n184006.7612202365\r\n 30\r\n0.0\r\n 11\r\n533824.5753432083\r\n 21\r\n184113.0382085496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n257\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533411.2768640178\r\n 20\r\n184499.9072411442\r\n 30\r\n0.0\r\n 11\r\n533424.7221364126\r\n 21\r\n184764.1665350379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n258\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534079.0438751079\r\n 20\r\n184492.5166948246\r\n 30\r\n0.0\r\n 11\r\n534641.721189493\r\n 21\r\n184610.5719340789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534078.5814593011\r\n 20\r\n184263.7540395752\r\n 30\r\n0.0\r\n 11\r\n534244.6175290032\r\n 21\r\n184228.1883089295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534001.2095466687\r\n 20\r\n183814.2563075048\r\n 30\r\n0.0\r\n 11\r\n534167.6424192836\r\n 21\r\n184551.2581387564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534184.6430945557\r\n 20\r\n184315.7129436011\r\n 30\r\n0.0\r\n 11\r\n534623.810301958\r\n 21\r\n184321.8368213024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534195.8955435099\r\n 20\r\n184384.2914345422\r\n 30\r\n0.0\r\n 11\r\n534171.5481171157\r\n 21\r\n184191.8941348217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534267.7865448688\r\n 20\r\n184374.0893695216\r\n 30\r\n0.0\r\n 11\r\n534259.1867207303\r\n 21\r\n184310.3579900692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534221.0297037694\r\n 20\r\n184401.8573877923\r\n 30\r\n0.0\r\n 11\r\n534276.0859439502\r\n 21\r\n184360.5528367094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n260\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534256.3117883924\r\n 20\r\n184365.7534653767\r\n 30\r\n0.0\r\n 11\r\n534658.9839601197\r\n 21\r\n184387.0189272303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n261\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534340.2964578094\r\n 20\r\n184554.9790199963\r\n 30\r\n0.0\r\n 11\r\n534388.795247378\r\n 21\r\n184150.5540434503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n262\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534375.5833000987\r\n 20\r\n184152.2097741889\r\n 30\r\n0.0\r\n 11\r\n534613.971169032\r\n 21\r\n184166.5971171824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n263\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534292.9527107282\r\n 20\r\n183980.5182296566\r\n 30\r\n0.0\r\n 11\r\n534389.5250794471\r\n 21\r\n184163.7684943256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n264\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534243.591734117\r\n 20\r\n184052.3894925513\r\n 30\r\n0.0\r\n 11\r\n534326.4617765393\r\n 21\r\n184031.8012475966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n265\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534523.654663655\r\n 20\r\n184592.9361776223\r\n 30\r\n0.0\r\n 11\r\n534529.6593127575\r\n 21\r\n184503.01379338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n267\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534200.4451829229\r\n 20\r\n184234.3143184903\r\n 30\r\n0.0\r\n 11\r\n534624.4909197793\r\n 21\r\n184238.8353143359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n268\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534471.5327107409\r\n 20\r\n183786.0600145884\r\n 30\r\n0.0\r\n 11\r\n534606.9904846774\r\n 21\r\n184209.2224334297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n269\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534421.2657241103\r\n 20\r\n183576.3330352236\r\n 30\r\n0.0\r\n 11\r\n534556.4776611428\r\n 21\r\n184059.4846922112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534379.2230397164\r\n 20\r\n183793.2446136424\r\n 30\r\n0.0\r\n 11\r\n534494.6738051587\r\n 21\r\n183814.7073368633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534398.2709077693\r\n 20\r\n183852.3393541769\r\n 30\r\n0.0\r\n 11\r\n534483.5028377962\r\n 21\r\n183783.049246773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534444.3820505485\r\n 20\r\n184036.6679774855\r\n 30\r\n0.0\r\n 11\r\n534413.140644698\r\n 21\r\n183837.0904088021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534231.8313058096\r\n 20\r\n183993.0367155942\r\n 30\r\n0.0\r\n 11\r\n534531.3403140241\r\n 21\r\n183964.3680914949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534172.5775135222\r\n 20\r\n183923.7014562585\r\n 30\r\n0.0\r\n 11\r\n534215.9402417578\r\n 21\r\n184037.1348698832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534115.2587862786\r\n 20\r\n184054.0831760169\r\n 30\r\n0.0\r\n 11\r\n534123.8030832675\r\n 21\r\n183933.6060995451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n270\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.0293094167\r\n 20\r\n183939.744568014\r\n 30\r\n0.0\r\n 11\r\n534174.6763040911\r\n 21\r\n183924.2648762933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n271\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533810.5991600926\r\n 20\r\n184073.5153000436\r\n 30\r\n0.0\r\n 11\r\n533810.6114064546\r\n 21\r\n184073.5131405614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n272\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533954.7380145801\r\n 20\r\n184048.098338197\r\n 30\r\n0.0\r\n 11\r\n534364.6500434818\r\n 21\r\n183975.815826753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n273\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534375.5265551551\r\n 20\r\n183983.0774559717\r\n 30\r\n0.0\r\n 11\r\n534371.123204419\r\n 21\r\n183959.1951387822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n274\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534530.9589212817\r\n 20\r\n184092.5949168104\r\n 30\r\n0.0\r\n 11\r\n534574.5465687242\r\n 21\r\n184080.1750068405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n275\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534520.7335404321\r\n 20\r\n184104.2896708572\r\n 30\r\n0.0\r\n 11\r\n534537.9608515989\r\n 21\r\n184087.4859158428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n276\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534527.3546613447\r\n 20\r\n184168.0441267445\r\n 30\r\n0.0\r\n 11\r\n534522.0020775037\r\n 21\r\n184096.3976877718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n277\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534312.6897586476\r\n 20\r\n184027.1174682027\r\n 30\r\n0.0\r\n 11\r\n534268.715040369\r\n 21\r\n183678.6121619755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n278\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534178.0924395927\r\n 20\r\n183721.0298699493\r\n 30\r\n0.0\r\n 11\r\n534286.6169309787\r\n 21\r\n183992.7609886244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n279\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534160.0049395611\r\n 20\r\n184014.8357883496\r\n 30\r\n0.0\r\n 11\r\n534154.1430236581\r\n 21\r\n183979.7982132065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534283.0554192325\r\n 20\r\n183845.4622028715\r\n 30\r\n0.0\r\n 11\r\n534373.3845904289\r\n 21\r\n183821.9572878209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534338.5613499616\r\n 20\r\n183826.740385397\r\n 30\r\n0.0\r\n 11\r\n534417.4375952255\r\n 21\r\n183853.7796193919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534338.6600611481\r\n 20\r\n183839.8652194019\r\n 30\r\n0.0\r\n 11\r\n534399.4430551204\r\n 21\r\n183787.6198821797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534353.3950801142\r\n 20\r\n183626.8977659865\r\n 30\r\n0.0\r\n 11\r\n534397.018575538\r\n 21\r\n183800.0089834212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534316.5240373919\r\n 20\r\n184240.583205404\r\n 30\r\n0.0\r\n 11\r\n534323.0481789416\r\n 21\r\n184194.0262992032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534259.3074196166\r\n 20\r\n184197.0997663956\r\n 30\r\n0.0\r\n 11\r\n534324.554163355\r\n 21\r\n184195.1866329612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n280\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534236.1677363386\r\n 20\r\n184240.9189471798\r\n 30\r\n0.0\r\n 11\r\n534221.3497769107\r\n 21\r\n184137.6553470467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n281\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534075.9993490205\r\n 20\r\n184178.7166941591\r\n 30\r\n0.0\r\n 11\r\n534364.8760209383\r\n 21\r\n184103.158770916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n282\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534445.6665385903\r\n 20\r\n184159.5737598459\r\n 30\r\n0.0\r\n 11\r\n534445.5888953305\r\n 21\r\n184090.7293139994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n283\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534413.7624798858\r\n 20\r\n184091.7428221283\r\n 30\r\n0.0\r\n 11\r\n534473.8666444875\r\n 21\r\n184091.4951244661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n284\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534419.1301320043\r\n 20\r\n184098.4698326099\r\n 30\r\n0.0\r\n 11\r\n534418.0426346746\r\n 21\r\n184027.1445687356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n285\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534415.2591650874\r\n 20\r\n184029.6086372781\r\n 30\r\n0.0\r\n 11\r\n534471.3741634863\r\n 21\r\n184027.9664590178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n286\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534468.8322797114\r\n 20\r\n184098.9981249308\r\n 30\r\n0.0\r\n 11\r\n534468.5116705245\r\n 21\r\n184021.4998345739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n287\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534352.4198206242\r\n 20\r\n184432.4779143455\r\n 30\r\n0.0\r\n 11\r\n534615.4420738622\r\n 21\r\n184461.3404170194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n288\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533532.7624275796\r\n 20\r\n183279.5203883841\r\n 30\r\n0.0\r\n 11\r\n532822.6282750719\r\n 21\r\n183060.5581778998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n289\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533342.1028701529\r\n 20\r\n183213.5023917251\r\n 30\r\n0.0\r\n 11\r\n533311.0032423038\r\n 21\r\n183772.1392497893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533339.6295991045\r\n 20\r\n183351.3335597998\r\n 30\r\n0.0\r\n 11\r\n533194.7893030568\r\n 21\r\n183321.6859065113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533278.6891237384\r\n 20\r\n183198.401309585\r\n 30\r\n0.0\r\n 11\r\n533234.487352922\r\n 21\r\n184185.8116573112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533227.3181130724\r\n 20\r\n183318.9206275791\r\n 30\r\n0.0\r\n 11\r\n533150.504528331\r\n 21\r\n183347.5697367062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533192.6831632028\r\n 20\r\n183247.1171745893\r\n 30\r\n0.0\r\n 11\r\n533222.2627044432\r\n 21\r\n183329.8364542056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533206.543120186\r\n 20\r\n183260.1410566229\r\n 30\r\n0.0\r\n 11\r\n533016.016412499\r\n 21\r\n183203.0987351212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533218.3705491292\r\n 20\r\n183138.1125505508\r\n 30\r\n0.0\r\n 11\r\n533031.596680065\r\n 21\r\n183528.7207214253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n290\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532993.44798064\r\n 20\r\n183254.429505146\r\n 30\r\n0.0\r\n 11\r\n533154.7660373612\r\n 21\r\n183348.3247837068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n291\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533020.7270185264\r\n 20\r\n183200.3049458331\r\n 30\r\n0.0\r\n 11\r\n532993.7175981719\r\n 21\r\n183255.2331889633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n292\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532740.2254147078\r\n 20\r\n183101.4565594727\r\n 30\r\n0.0\r\n 11\r\n533004.5635047808\r\n 21\r\n183237.3658685307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n293\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532802.6632449139\r\n 20\r\n183129.4420001883\r\n 30\r\n0.0\r\n 11\r\n532757.9244439029\r\n 21\r\n183233.3469615745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n294\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.7206542239\r\n 20\r\n183195.6187514277\r\n 30\r\n0.0\r\n 11\r\n533412.4422479266\r\n 21\r\n183553.0579135474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n295\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533130.6806038581\r\n 20\r\n183490.7750957559\r\n 30\r\n0.0\r\n 11\r\n533024.5381114682\r\n 21\r\n183916.9411888579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n296\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533194.7538784246\r\n 20\r\n183517.6868499452\r\n 30\r\n0.0\r\n 11\r\n533013.3144771753\r\n 21\r\n183449.2086651994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n297\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533168.0923122618\r\n 20\r\n183585.2261651385\r\n 30\r\n0.0\r\n 11\r\n533108.1152453137\r\n 21\r\n183562.0227786959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n298\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533205.9844550757\r\n 20\r\n183546.2203893963\r\n 30\r\n0.0\r\n 11\r\n533152.9953396826\r\n 21\r\n183590.1454297818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n299\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533162.6574581374\r\n 20\r\n183572.125795115\r\n 30\r\n0.0\r\n 11\r\n533089.5755333647\r\n 21\r\n183968.6811254574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533327.1256725954\r\n 20\r\n183697.8633855617\r\n 30\r\n0.0\r\n 11\r\n532922.5243948965\r\n 21\r\n183650.8580632188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532927.2110360585\r\n 20\r\n183638.3948216737\r\n 30\r\n0.0\r\n 11\r\n532885.6939141481\r\n 21\r\n183873.5800684076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532779.4795621642\r\n 20\r\n183518.0569124989\r\n 30\r\n0.0\r\n 11\r\n532935.2056681789\r\n 21\r\n183654.6448395154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532860.8690292618\r\n 20\r\n183486.7880927641\r\n 30\r\n0.0\r\n 11\r\n532821.5502885538\r\n 21\r\n183562.5862219661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533293.6322814212\r\n 20\r\n183952.7605173787\r\n 30\r\n0.0\r\n 11\r\n532883.8273047613\r\n 21\r\n183871.1016442716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533047.8398997946\r\n 20\r\n183487.189023119\r\n 30\r\n0.0\r\n 11\r\n532953.4969078967\r\n 21\r\n183900.6314329289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532548.7839254298\r\n 20\r\n183646.44825568\r\n 30\r\n0.0\r\n 11\r\n532960.4479911811\r\n 21\r\n183900.052022287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532323.5859293173\r\n 20\r\n183530.3935634832\r\n 30\r\n0.0\r\n 11\r\n532794.9132185243\r\n 21\r\n183792.7256292301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532577.2654881728\r\n 20\r\n183558.3489116874\r\n 30\r\n0.0\r\n 11\r\n532571.2553581126\r\n 21\r\n183675.6238282977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532630.3005233718\r\n 20\r\n183590.633500544\r\n 30\r\n0.0\r\n 11\r\n532543.0686538527\r\n 21\r\n183657.3882892886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532798.8253221348\r\n 20\r\n183678.3983628817\r\n 30\r\n0.0\r\n 11\r\n532612.008295049\r\n 21\r\n183601.5437615102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532817.6548659477\r\n 20\r\n183429.3920899996\r\n 30\r\n0.0\r\n 11\r\n532708.2644265074\r\n 21\r\n183746.131200443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532982.2371375846\r\n 20\r\n183070.6166723318\r\n 30\r\n0.0\r\n 11\r\n532758.2115810168\r\n 21\r\n183586.6884875571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532762.7409918191\r\n 20\r\n183598.9569105556\r\n 30\r\n0.0\r\n 11\r\n532740.5404720749\r\n 21\r\n183589.1135627954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532833.0553973926\r\n 20\r\n183775.6181090037\r\n 30\r\n0.0\r\n 11\r\n532810.8274301857\r\n 21\r\n183815.1156361047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532846.8096853747\r\n 20\r\n183768.3969423502\r\n 30\r\n0.0\r\n 11\r\n532826.4564207106\r\n 21\r\n183781.2379333611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532907.2699385936\r\n 20\r\n183789.6813889798\r\n 30\r\n0.0\r\n 11\r\n532838.8392540151\r\n 21\r\n183767.7929495795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532820.202091548\r\n 20\r\n183548.1021399771\r\n 30\r\n0.0\r\n 11\r\n532411.6965931075\r\n 21\r\n183400.5198149712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532705.5512352486\r\n 20\r\n183195.8969469713\r\n 30\r\n0.0\r\n 11\r\n532420.1445797267\r\n 21\r\n183419.7888982393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532468.0705552293\r\n 20\r\n183288.5226947296\r\n 30\r\n0.0\r\n 11\r\n532792.8610919387\r\n 21\r\n183514.7460345087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532650.440516718\r\n 20\r\n183476.9836669457\r\n 30\r\n0.0\r\n 11\r\n532606.5484086562\r\n 21\r\n183559.3567393084\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532619.308676055\r\n 20\r\n183526.6044619072\r\n 30\r\n0.0\r\n 11\r\n532627.2382057076\r\n 21\r\n183609.6087075904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532632.0497533188\r\n 20\r\n183529.7565979628\r\n 30\r\n0.0\r\n 11\r\n532567.0871053734\r\n 21\r\n183576.7033975304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532319.1054598828\r\n 20\r\n183440.943242896\r\n 30\r\n0.0\r\n 11\r\n532579.7002024197\r\n 21\r\n183577.2303830341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532691.0044244704\r\n 20\r\n182972.7019742909\r\n 30\r\n0.0\r\n 11\r\n532839.9141442266\r\n 21\r\n183067.6876560392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532793.2164716504\r\n 20\r\n183024.5212818305\r\n 30\r\n0.0\r\n 11\r\n532655.4838754236\r\n 21\r\n183248.9506764272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533026.9073257412\r\n 20\r\n183601.5368553743\r\n 30\r\n0.0\r\n 11\r\n532980.1110058653\r\n 21\r\n183597.0408144468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532997.9421264003\r\n 20\r\n183535.767804562\r\n 30\r\n0.0\r\n 11\r\n532980.888773864\r\n 21\r\n183598.7755883294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533045.9449296638\r\n 20\r\n183523.46754336\r\n 30\r\n0.0\r\n 11\r\n532948.9701949887\r\n 21\r\n183485.011804273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533022.747934971\r\n 20\r\n183353.2179265787\r\n 30\r\n0.0\r\n 11\r\n532882.0015395169\r\n 21\r\n183616.5602579835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532918.0536104154\r\n 20\r\n183708.2663477616\r\n 30\r\n0.0\r\n 11\r\n532851.1196203771\r\n 21\r\n183692.1603013838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532859.5161003121\r\n 20\r\n183661.4447183112\r\n 30\r\n0.0\r\n 11\r\n532845.2798621558\r\n 21\r\n183719.8390800234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532864.808334425\r\n 20\r\n183668.2312208995\r\n 30\r\n0.0\r\n 11\r\n532795.6968644821\r\n 21\r\n183650.5654166575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532798.7413366781\r\n 20\r\n183648.4322205175\r\n 30\r\n0.0\r\n 11\r\n532784.0778326244\r\n 21\r\n183702.6223620896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532853.7488820336\r\n 20\r\n183716.6901838713\r\n 30\r\n0.0\r\n 11\r\n532778.4554968875\r\n 21\r\n183698.3327888569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533236.9410300952\r\n 20\r\n184128.2527506047\r\n 30\r\n0.0\r\n 11\r\n533126.981531269\r\n 21\r\n184343.3517983396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532835.6102659117\r\n 20\r\n183916.0876363871\r\n 30\r\n0.0\r\n 11\r\n533298.551877255\r\n 21\r\n184154.1088557825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532781.1055054279\r\n 20\r\n184010.2498283422\r\n 30\r\n0.0\r\n 11\r\n533459.0946851481\r\n 21\r\n184343.719875779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533226.0654550621\r\n 20\r\n184305.4061726703\r\n 30\r\n0.0\r\n 11\r\n533119.9229626722\r\n 21\r\n184731.5722657724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533290.1387296285\r\n 20\r\n184332.3179268596\r\n 30\r\n0.0\r\n 11\r\n533108.6993283792\r\n 21\r\n184263.8397421138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533263.4771634658\r\n 20\r\n184399.8572420528\r\n 30\r\n0.0\r\n 11\r\n533203.5000965176\r\n 21\r\n184376.6538556104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533301.3693062795\r\n 20\r\n184360.8514663108\r\n 30\r\n0.0\r\n 11\r\n533248.3801908866\r\n 21\r\n184404.7765066962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533258.0423093414\r\n 20\r\n184386.7568720294\r\n 30\r\n0.0\r\n 11\r\n533184.9603845684\r\n 21\r\n184783.3122023718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533313.2245827507\r\n 20\r\n184499.6854179535\r\n 30\r\n0.0\r\n 11\r\n533017.9092461005\r\n 21\r\n184465.4891401333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533022.5958872625\r\n 20\r\n184453.0258985883\r\n 30\r\n0.0\r\n 11\r\n532981.0787653522\r\n 21\r\n184688.211145322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532874.8644133682\r\n 20\r\n184332.6879894133\r\n 30\r\n0.0\r\n 11\r\n533030.5905193829\r\n 21\r\n184469.2759164299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532956.2538804658\r\n 20\r\n184301.4191696784\r\n 30\r\n0.0\r\n 11\r\n532916.9351397578\r\n 21\r\n184377.2172988805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533312.5190293062\r\n 20\r\n184749.7419374041\r\n 30\r\n0.0\r\n 11\r\n532979.2121559653\r\n 21\r\n184685.7327211861\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533143.2247509987\r\n 20\r\n184301.8201000335\r\n 30\r\n0.0\r\n 11\r\n533048.8817591007\r\n 21\r\n184715.2625098432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532593.9135947571\r\n 20\r\n184428.0269791083\r\n 30\r\n0.0\r\n 11\r\n533055.8328423851\r\n 21\r\n184714.6830992013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532672.6503393768\r\n 20\r\n184372.9799886018\r\n 30\r\n0.0\r\n 11\r\n532666.6402093166\r\n 21\r\n184490.254905212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532725.6853745756\r\n 20\r\n184405.2645774584\r\n 30\r\n0.0\r\n 11\r\n532638.4535050566\r\n 21\r\n184472.0193662031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532894.2101733389\r\n 20\r\n184493.0294397962\r\n 30\r\n0.0\r\n 11\r\n532707.3931462528\r\n 21\r\n184416.1748384246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532913.0397171517\r\n 20\r\n184244.0231669139\r\n 30\r\n0.0\r\n 11\r\n532803.6492777113\r\n 21\r\n184560.7622773574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533002.9879995437\r\n 20\r\n184269.8284089141\r\n 30\r\n0.0\r\n 11\r\n532884.4483571425\r\n 21\r\n184243.4500331875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533018.0305508438\r\n 20\r\n184217.9793931889\r\n 30\r\n0.0\r\n 11\r\n533001.3606235288\r\n 21\r\n184271.2685517172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533077.6219887886\r\n 20\r\n183885.2477492463\r\n 30\r\n0.0\r\n 11\r\n532853.5964322206\r\n 21\r\n184401.3195644716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532858.1258430229\r\n 20\r\n184413.5879874701\r\n 30\r\n0.0\r\n 11\r\n532835.9253232789\r\n 21\r\n184403.7446397097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532928.4402485964\r\n 20\r\n184590.2491859182\r\n 30\r\n0.0\r\n 11\r\n532906.2122813898\r\n 21\r\n184629.7467130191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532942.1945365787\r\n 20\r\n184583.0280192646\r\n 30\r\n0.0\r\n 11\r\n532921.8412719146\r\n 21\r\n184595.8690102754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533002.6547897976\r\n 20\r\n184604.3124658941\r\n 30\r\n0.0\r\n 11\r\n532934.2241052192\r\n 21\r\n184582.424026494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532915.586942752\r\n 20\r\n184362.7332168916\r\n 30\r\n0.0\r\n 11\r\n532579.4868776007\r\n 21\r\n184248.3190809244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532800.9360864524\r\n 20\r\n184010.5280238858\r\n 30\r\n0.0\r\n 11\r\n532637.6889675159\r\n 21\r\n184132.908686197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532627.4102219\r\n 20\r\n184103.5541580553\r\n 30\r\n0.0\r\n 11\r\n532888.2459431427\r\n 21\r\n184329.3771114232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532939.1957581605\r\n 20\r\n184211.3855460326\r\n 30\r\n0.0\r\n 11\r\n532906.4862421954\r\n 21\r\n184197.5262063909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532745.8253679221\r\n 20\r\n184291.6147438601\r\n 30\r\n0.0\r\n 11\r\n532701.9332598602\r\n 21\r\n184373.9878162229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532714.6935272589\r\n 20\r\n184341.2355388216\r\n 30\r\n0.0\r\n 11\r\n532722.6230569118\r\n 21\r\n184424.2397845048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532727.4346045228\r\n 20\r\n184344.3876748772\r\n 30\r\n0.0\r\n 11\r\n532662.4719565772\r\n 21\r\n184391.3344744447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532564.7483924605\r\n 20\r\n184331.0512654725\r\n 30\r\n0.0\r\n 11\r\n532675.0850536235\r\n 21\r\n184391.8614599485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532906.0166036281\r\n 20\r\n183843.1770056994\r\n 30\r\n0.0\r\n 11\r\n532750.8687266275\r\n 21\r\n184063.5817533417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533122.292176945\r\n 20\r\n184416.1679322887\r\n 30\r\n0.0\r\n 11\r\n533075.4958570691\r\n 21\r\n184411.6718913614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533093.3269776042\r\n 20\r\n184350.3988814763\r\n 30\r\n0.0\r\n 11\r\n533076.273625068\r\n 21\r\n184413.4066652438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533141.3297808676\r\n 20\r\n184338.0986202742\r\n 30\r\n0.0\r\n 11\r\n533044.3550461925\r\n 21\r\n184299.6428811874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533118.132786175\r\n 20\r\n184167.8490034932\r\n 30\r\n0.0\r\n 11\r\n532977.3863907207\r\n 21\r\n184431.1913348979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533013.4384616195\r\n 20\r\n184522.897424676\r\n 30\r\n0.0\r\n 11\r\n532946.5044715811\r\n 21\r\n184506.7913782983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532954.9009515162\r\n 20\r\n184476.0757952258\r\n 30\r\n0.0\r\n 11\r\n532940.6647133597\r\n 21\r\n184534.470156938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532960.1931856289\r\n 20\r\n184482.8622978139\r\n 30\r\n0.0\r\n 11\r\n532891.0817156861\r\n 21\r\n184465.196493572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532894.1261878822\r\n 20\r\n184463.0632974319\r\n 30\r\n0.0\r\n 11\r\n532879.4626838282\r\n 21\r\n184517.2534390039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532949.1337332375\r\n 20\r\n184531.3212607857\r\n 30\r\n0.0\r\n 11\r\n532873.8403480914\r\n 21\r\n184512.9638657713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532962.7457486525\r\n 20\r\n183975.8869687485\r\n 30\r\n0.0\r\n 11\r\n532917.3537715828\r\n 21\r\n184079.0574052173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532635.2106572713\r\n 20\r\n184438.4366176368\r\n 30\r\n0.0\r\n 11\r\n532065.2785999623\r\n 21\r\n184514.0689499459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532590.2300880724\r\n 20\r\n184386.4198395649\r\n 30\r\n0.0\r\n 11\r\n532364.6295972854\r\n 21\r\n184414.239316967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532652.7847925186\r\n 20\r\n184210.3495376971\r\n 30\r\n0.0\r\n 11\r\n532489.8745094785\r\n 21\r\n184162.4628243181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532763.565424586\r\n 20\r\n183767.8992291204\r\n 30\r\n0.0\r\n 11\r\n532542.4660997646\r\n 21\r\n184490.3856919131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532543.1334552761\r\n 20\r\n184254.2287175145\r\n 30\r\n0.0\r\n 11\r\n532030.3823403246\r\n 21\r\n184165.1226977185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532526.7823938887\r\n 20\r\n184321.7732940453\r\n 30\r\n0.0\r\n 11\r\n532565.4542369875\r\n 21\r\n184131.7364379803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532455.8560125364\r\n 20\r\n184306.2218749684\r\n 30\r\n0.0\r\n 11\r\n532469.199284479\r\n 21\r\n184243.3123939978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532500.404604757\r\n 20\r\n184337.4098207074\r\n 30\r\n0.0\r\n 11\r\n532448.5924934926\r\n 21\r\n184292.102419002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532467.9222000074\r\n 20\r\n184298.7677181402\r\n 30\r\n0.0\r\n 11\r\n532151.5594281791\r\n 21\r\n184344.7377033163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532546.3727587354\r\n 20\r\n184062.6106464354\r\n 30\r\n0.0\r\n 11\r\n532126.1632264118\r\n 21\r\n184073.4140238009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n307\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532584.4903761105\r\n 20\r\n183864.2182182287\r\n 30\r\n0.0\r\n 11\r\n532532.7635513458\r\n 21\r\n183974.0899667647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n308\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532631.8950520743\r\n 20\r\n183998.5224476362\r\n 30\r\n0.0\r\n 11\r\n532632.3872072136\r\n 21\r\n183877.743770919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n309\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532634.6940095361\r\n 20\r\n183884.0725369571\r\n 30\r\n0.0\r\n 11\r\n532582.3553185839\r\n 21\r\n183864.6230556592\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532934.2473785581\r\n 20\r\n184040.6907525797\r\n 30\r\n0.0\r\n 11\r\n532934.235328054\r\n 21\r\n184040.6876830364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532792.4137581561\r\n 20\r\n184004.5624334069\r\n 30\r\n0.0\r\n 11\r\n532167.9345982127\r\n 21\r\n183901.8182242516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n310\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532368.5085479771\r\n 20\r\n184092.6775787239\r\n 30\r\n0.0\r\n 11\r\n532506.9565822644\r\n 21\r\n183612.623907776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n311\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532594.1521268948\r\n 20\r\n183661.7019549843\r\n 30\r\n0.0\r\n 11\r\n532478.1241977714\r\n 21\r\n183964.5209857737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n312\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532590.2102493453\r\n 20\r\n183956.0377104505\r\n 30\r\n0.0\r\n 11\r\n532598.6767912577\r\n 21\r\n183921.5368206355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n317\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532306.0587504182\r\n 20\r\n184266.992331815\r\n 30\r\n0.0\r\n 11\r\n532414.2191715132\r\n 21\r\n184122.5293847503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n318\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532477.551415465\r\n 20\r\n184130.3624860479\r\n 30\r\n0.0\r\n 11\r\n532412.6306058845\r\n 21\r\n184123.5738093414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n319\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532661.721044324\r\n 20\r\n184125.7436229359\r\n 30\r\n0.0\r\n 11\r\n532439.6824280089\r\n 21\r\n184049.5153294456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532847.7714891929\r\n 20\r\n183350.8987513204\r\n 30\r\n0.0\r\n 11\r\n532995.8222172223\r\n 21\r\n183426.7421009539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532774.0262611857\r\n 20\r\n183284.1426261447\r\n 30\r\n0.0\r\n 11\r\n532909.8188335092\r\n 21\r\n183159.1966094306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532709.4902750978\r\n 20\r\n183812.8863756505\r\n 30\r\n0.0\r\n 11\r\n532835.4314276548\r\n 21\r\n183979.9680373762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532463.9437321764\r\n 20\r\n184141.8423292799\r\n 30\r\n0.0\r\n 11\r\n532481.318514892\r\n 21\r\n184025.9617418272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n320\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533323.0645174747\r\n 20\r\n183697.3915731477\r\n 30\r\n0.0\r\n 11\r\n533469.8168568623\r\n 21\r\n183830.5378952181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n322\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530605.199969855\r\n 20\r\n185171.8313899503\r\n 30\r\n0.0\r\n 11\r\n532736.3514167985\r\n 21\r\n185388.7767557458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n323\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530632.5473901829\r\n 20\r\n185377.7313809267\r\n 30\r\n0.0\r\n 11\r\n530347.847156352\r\n 21\r\n185292.772304566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n324\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530537.8475188889\r\n 20\r\n185421.3935488612\r\n 30\r\n0.0\r\n 11\r\n530918.4513398055\r\n 21\r\n185724.2180642567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n325\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530524.4682282156\r\n 20\r\n184838.4117535552\r\n 30\r\n0.0\r\n 11\r\n530539.0027126899\r\n 21\r\n185369.0524173398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n326\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530335.1690853607\r\n 20\r\n184982.8667579243\r\n 30\r\n0.0\r\n 11\r\n530559.2802786548\r\n 21\r\n185043.4543895813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n327\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530707.0247008471\r\n 20\r\n184994.505863614\r\n 30\r\n0.0\r\n 11\r\n530707.477024887\r\n 21\r\n185313.5574728215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n332\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531131.4314460383\r\n 20\r\n185132.7716499767\r\n 30\r\n0.0\r\n 11\r\n531131.4314460383\r\n 21\r\n185359.3560314326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n333\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530501.6760625544\r\n 20\r\n185036.5091148205\r\n 30\r\n0.0\r\n 11\r\n530743.4035747344\r\n 21\r\n185005.6828851596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n334\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530485.4823504737\r\n 20\r\n185236.4996961124\r\n 30\r\n0.0\r\n 11\r\n530775.1816292018\r\n 21\r\n185251.6757933341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n335\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532544.9929155682\r\n 20\r\n185376.4324141973\r\n 30\r\n0.0\r\n 11\r\n536042.6124124007\r\n 21\r\n185481.9872221566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n358\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532320.5649707108\r\n 20\r\n184501.5680036159\r\n 30\r\n0.0\r\n 11\r\n532310.185466446\r\n 21\r\n184245.5571047196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n366\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532121.1286102474\r\n 20\r\n185156.5429902478\r\n 30\r\n0.0\r\n 11\r\n532552.7822942476\r\n 21\r\n185237.5298082478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n367\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532107.1836522989\r\n 20\r\n185396.4993852853\r\n 30\r\n0.0\r\n 11\r\n532132.2182172474\r\n 21\r\n185032.5284892478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n368\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532191.4177562475\r\n 20\r\n185229.8919942478\r\n 30\r\n0.0\r\n 11\r\n532195.3011802475\r\n 21\r\n185165.7003692478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532227.5888392475\r\n 20\r\n185421.3871792478\r\n 30\r\n0.0\r\n 11\r\n532353.3590012474\r\n 21\r\n185033.9680772478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532340.0762082474\r\n 20\r\n185033.0383432478\r\n 30\r\n0.0\r\n 11\r\n532571.1852702475\r\n 21\r\n185093.2411102478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532292.1971382474\r\n 20\r\n184848.6111342478\r\n 30\r\n0.0\r\n 11\r\n532351.5203522474\r\n 21\r\n185047.0743252478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532229.8727212474\r\n 20\r\n184909.5836812478\r\n 30\r\n0.0\r\n 11\r\n532315.1596332476\r\n 21\r\n184905.4048772478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532325.0415939529\r\n 20\r\n185475.0242132333\r\n 30\r\n0.0\r\n 11\r\n532348.3174009531\r\n 21\r\n185387.9591352333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n370\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532458.4917752475\r\n 20\r\n185549.4005362478\r\n 30\r\n0.0\r\n 11\r\n532569.7094042475\r\n 21\r\n185090.5118912478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n371\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532152.3691472474\r\n 20\r\n185079.7349762478\r\n 30\r\n0.0\r\n 11\r\n532567.5409532475\r\n 21\r\n185166.1502402478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n372\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532505.0021652475\r\n 20\r\n184692.3458652478\r\n 30\r\n0.0\r\n 11\r\n532564.1192532476\r\n 21\r\n185172.2285002478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n373\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532493.2797917234\r\n 20\r\n184439.2739090913\r\n 30\r\n0.0\r\n 11\r\n532535.4841562475\r\n 21\r\n184977.0343742478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n374\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532413.0449982474\r\n 20\r\n184681.5489552478\r\n 30\r\n0.0\r\n 11\r\n532522.1683822475\r\n 21\r\n184724.9265392478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n375\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532420.3088972474\r\n 20\r\n184743.2113052478\r\n 30\r\n0.0\r\n 11\r\n532517.3285312475\r\n 21\r\n184691.7060482478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n376\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532429.9143932474\r\n 20\r\n184932.9769852478\r\n 30\r\n0.0\r\n 11\r\n532437.8461422474\r\n 21\r\n184731.1247652478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n377\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532009.6784914185\r\n 20\r\n184830.2079244615\r\n 30\r\n0.0\r\n 11\r\n532529.2096642474\r\n 21\r\n184878.8524782478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532372.7184052476\r\n 20\r\n184867.0858462478\r\n 30\r\n0.0\r\n 11\r\n532373.0152272474\r\n 21\r\n184842.8027972478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532504.0457382474\r\n 20\r\n185004.5864872478\r\n 30\r\n0.0\r\n 11\r\n532549.2121822474\r\n 21\r\n185000.8275632478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532491.7523522475\r\n 20\r\n185014.0837682478\r\n 30\r\n0.0\r\n 11\r\n532511.9032812475\r\n 21\r\n185000.9275342478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532485.9230932474\r\n 20\r\n185077.9154972478\r\n 30\r\n0.0\r\n 11\r\n532494.5226922474\r\n 21\r\n185006.5859152478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n380\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532302.5529352474\r\n 20\r\n184898.1469552478\r\n 30\r\n0.0\r\n 11\r\n532338.5096462474\r\n 21\r\n184465.2908592478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n381\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532317.2044082475\r\n 20\r\n184488.8441172478\r\n 30\r\n0.0\r\n 11\r\n532511.6971542474\r\n 21\r\n184540.6792792478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n383\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532213.2094522475\r\n 20\r\n184469.8995392478\r\n 30\r\n0.0\r\n 11\r\n532283.6140292475\r\n 21\r\n184859.3980472478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n385\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532308.5965642474\r\n 20\r\n184714.1896122478\r\n 30\r\n0.0\r\n 11\r\n532401.7657552476\r\n 21\r\n184708.5912152478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n386\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532366.6747752475\r\n 20\r\n184706.5517982478\r\n 30\r\n0.0\r\n 11\r\n532438.8355502475\r\n 21\r\n184748.3298402478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n387\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532364.2342372475\r\n 20\r\n184719.4481072478\r\n 30\r\n0.0\r\n 11\r\n532433.9709632472\r\n 21\r\n184679.9394162478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n388\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532419.8636642474\r\n 20\r\n184513.3471032478\r\n 30\r\n0.0\r\n 11\r\n532429.1970732474\r\n 21\r\n184691.6260712478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532265.0461522474\r\n 20\r\n185108.3267922478\r\n 30\r\n0.0\r\n 11\r\n532280.4479262474\r\n 21\r\n185063.9095062478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532217.3154932475\r\n 20\r\n185054.6021702478\r\n 30\r\n0.0\r\n 11\r\n532281.7011752476\r\n 21\r\n185065.3390972478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532186.1409172473\r\n 20\r\n185093.1211442478\r\n 30\r\n0.0\r\n 11\r\n532191.5661672472\r\n 21\r\n184988.9409652478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532041.0195962473\r\n 20\r\n185001.1274772478\r\n 30\r\n0.0\r\n 11\r\n532339.0538202476\r\n 21\r\n184982.8427112478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532407.4136222474\r\n 20\r\n185053.8123962478\r\n 30\r\n0.0\r\n 11\r\n532420.6469452474\r\n 21\r\n184986.2517352478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n390\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532389.2250172473\r\n 20\r\n184981.0932122478\r\n 30\r\n0.0\r\n 11\r\n532448.2431642476\r\n 21\r\n184992.4699552478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n391\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532393.1908912475\r\n 20\r\n184988.7310262478\r\n 30\r\n0.0\r\n 11\r\n532405.9130212474\r\n 21\r\n184918.5411172478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n392\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532402.7056922474\r\n 20\r\n184920.4205792478\r\n 30\r\n0.0\r\n 11\r\n532458.0795222474\r\n 21\r\n184929.6579352478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n393\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532441.8532422473\r\n 20\r\n184998.8581272478\r\n 30\r\n0.0\r\n 11\r\n532456.5212062474\r\n 21\r\n184922.7599102478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n396\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532481.8907751978\r\n 20\r\n185659.2708376926\r\n 30\r\n0.0\r\n 11\r\n533213.4750461979\r\n 21\r\n185960.1946986926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n397\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532608.229846198\r\n 20\r\n185714.4250496926\r\n 30\r\n0.0\r\n 11\r\n532641.5976081978\r\n 21\r\n185570.3962776926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n398\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532494.571678198\r\n 20\r\n185595.3291406926\r\n 30\r\n0.0\r\n 11\r\n532951.4964751979\r\n 21\r\n185784.2850526926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n399\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532625.5362291979\r\n 20\r\n185598.8181416926\r\n 30\r\n0.0\r\n 11\r\n532683.5732141979\r\n 21\r\n185540.9147166926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532574.6806921979\r\n 20\r\n185537.4257156926\r\n 30\r\n0.0\r\n 11\r\n532637.5657731979\r\n 21\r\n185598.7681566926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532379.7822005875\r\n 20\r\n185516.783209897\r\n 30\r\n0.0\r\n 11\r\n532897.7881471978\r\n 21\r\n185508.2540656925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532630.1287281979\r\n 20\r\n185133.8312426926\r\n 30\r\n0.0\r\n 11\r\n532743.226231198\r\n 21\r\n185136.4304986926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532738.9965151979\r\n 20\r\n185055.0737866926\r\n 30\r\n0.0\r\n 11\r\n532759.8070491979\r\n 21\r\n185810.3475926926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532822.0242801978\r\n 20\r\n185582.5328036926\r\n 30\r\n0.0\r\n 11\r\n533308.048428696\r\n 21\r\n185701.9470633644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532819.806359198\r\n 20\r\n185651.9929206926\r\n 30\r\n0.0\r\n 11\r\n532833.1138871978\r\n 21\r\n185458.5183026926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532892.3134261978\r\n 20\r\n185655.8818076926\r\n 30\r\n0.0\r\n 11\r\n532896.1968501978\r\n 21\r\n185591.6901826926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532841.0703711978\r\n 20\r\n185674.0865966926\r\n 30\r\n0.0\r\n 11\r\n532903.0732311979\r\n 21\r\n185644.2051496926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532882.6667051979\r\n 20\r\n185645.4847836926\r\n 30\r\n0.0\r\n 11\r\n533018.9643670911\r\n 21\r\n185679.8975924009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532928.4845091979\r\n 20\r\n185847.3769926925\r\n 30\r\n0.0\r\n 11\r\n533171.7912461943\r\n 21\r\n185088.6905515849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533040.9718781979\r\n 20\r\n185459.0281566926\r\n 30\r\n0.0\r\n 11\r\n533342.0861666041\r\n 21\r\n185539.2294065369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533040.8696871645\r\n 20\r\n185902.6867872737\r\n 30\r\n0.0\r\n 11\r\n533064.1454941646\r\n 21\r\n185815.6217092737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532853.2648171979\r\n 20\r\n185505.7247896926\r\n 30\r\n0.0\r\n 11\r\n533314.949234796\r\n 21\r\n185601.8213459973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532896.5843681978\r\n 20\r\n185272.3815836926\r\n 30\r\n0.0\r\n 11\r\n533323.6153840747\r\n 21\r\n185304.8422916926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532501.8603121979\r\n 20\r\n185272.5915236926\r\n 30\r\n0.0\r\n 11\r\n533064.3466261978\r\n 21\r\n185283.8483006926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533003.4486051978\r\n 20\r\n185324.1367686926\r\n 30\r\n0.0\r\n 11\r\n533056.9763947938\r\n 21\r\n184798.3148205676\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532730.9905601978\r\n 20\r\n185073.2185936926\r\n 30\r\n0.0\r\n 11\r\n532910.2405847092\r\n 21\r\n184975.7707765721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532887.8337612262\r\n 20\r\n184954.2005379262\r\n 30\r\n0.0\r\n 11\r\n532984.509699198\r\n 21\r\n185285.3878606926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533009.4922341978\r\n 20\r\n185140.1794256926\r\n 30\r\n0.0\r\n 11\r\n533223.8406176101\r\n 21\r\n185128.4247817856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533120.7593341979\r\n 20\r\n184991.9777295595\r\n 30\r\n0.0\r\n 11\r\n533164.6698493871\r\n 21\r\n185152.1929908819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532535.0805407667\r\n 20\r\n185099.0554407228\r\n 30\r\n0.0\r\n 11\r\n532800.0759271978\r\n 21\r\n185049.7952976926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532965.9418221979\r\n 20\r\n185534.3166056926\r\n 30\r\n0.0\r\n 11\r\n532981.3435961978\r\n 21\r\n185489.8993196926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532918.2111631979\r\n 20\r\n185480.5919836926\r\n 30\r\n0.0\r\n 11\r\n532982.596845198\r\n 21\r\n185491.3289106925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532887.0365871978\r\n 20\r\n185519.1109576926\r\n 30\r\n0.0\r\n 11\r\n532892.4618371978\r\n 21\r\n185414.9307786926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532632.1075431978\r\n 20\r\n185205.9006136926\r\n 30\r\n0.0\r\n 11\r\n532744.8092831978\r\n 21\r\n185207.6001266926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532964.0619481979\r\n 20\r\n185729.5307256926\r\n 30\r\n0.0\r\n 11\r\n533287.3999608604\r\n 21\r\n185848.0166997513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533160.4851943644\r\n 20\r\n185038.2038243795\r\n 30\r\n0.0\r\n 11\r\n533312.3771077996\r\n 21\r\n184720.5496568575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532525.9687370664\r\n 20\r\n184938.1950755283\r\n 30\r\n0.0\r\n 11\r\n533310.1590899808\r\n 21\r\n185042.7807927709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532783.2026042486\r\n 20\r\n184722.3529153568\r\n 30\r\n0.0\r\n 11\r\n533016.3547312032\r\n 21\r\n184679.6358716281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532833.4575456594\r\n 20\r\n184793.6019525844\r\n 30\r\n0.0\r\n 11\r\n532842.931078161\r\n 21\r\n184708.7398765826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532637.5467937776\r\n 20\r\n184576.4133326699\r\n 30\r\n0.0\r\n 11\r\n532697.7689800461\r\n 21\r\n184475.6025395458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532699.5784686391\r\n 20\r\n184579.0743381345\r\n 30\r\n0.0\r\n 11\r\n532664.2017968141\r\n 21\r\n184475.0835117567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532790.6590954802\r\n 20\r\n184784.0174906387\r\n 30\r\n0.0\r\n 11\r\n532807.6186704129\r\n 21\r\n184536.4242881813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532688.1167109437\r\n 20\r\n184815.5033675087\r\n 30\r\n0.0\r\n 11\r\n532809.5492248078\r\n 21\r\n184814.234469069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532790.4765161498\r\n 20\r\n184914.5351786511\r\n 30\r\n0.0\r\n 11\r\n532680.4657737823\r\n 21\r\n184864.6817180896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.2588451061\r\n 20\r\n184869.4146964122\r\n 30\r\n0.0\r\n 11\r\n532689.3739594284\r\n 21\r\n184813.7308861308\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532702.8925823753\r\n 20\r\n185206.9803013947\r\n 30\r\n0.0\r\n 11\r\n532702.8948103981\r\n 21\r\n185206.968067317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532729.1162602199\r\n 20\r\n185062.9860305268\r\n 30\r\n0.0\r\n 11\r\n532803.6929663337\r\n 21\r\n184653.4851785078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532833.7558926337\r\n 20\r\n184720.028022434\r\n 30\r\n0.0\r\n 11\r\n532491.6707096186\r\n 21\r\n184640.2317074956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532499.9754730116\r\n 20\r\n184739.9450397345\r\n 30\r\n0.0\r\n 11\r\n532792.482947854\r\n 21\r\n184732.5461716932\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532769.2121150372\r\n 20\r\n184858.9438041617\r\n 30\r\n0.0\r\n 11\r\n532734.3196016032\r\n 21\r\n184852.2725047208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532653.1157034118\r\n 20\r\n184684.7299837778\r\n 30\r\n0.0\r\n 11\r\n532662.4446227496\r\n 21\r\n184591.8601207191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532654.8360919118\r\n 20\r\n184626.1769731031\r\n 30\r\n0.0\r\n 11\r\n532707.5855661703\r\n 21\r\n184561.6008536206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532667.1782684115\r\n 20\r\n184630.6425851331\r\n 30\r\n0.0\r\n 11\r\n532639.2944614704\r\n 21\r\n184555.4984507766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532472.5841021193\r\n 20\r\n184542.862362741\r\n 30\r\n0.0\r\n 11\r\n532650.0704104144\r\n 21\r\n184562.0746848949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532893.7177966846\r\n 20\r\n184994.6354611215\r\n 30\r\n0.0\r\n 11\r\n532923.1880844783\r\n 21\r\n184697.4987358915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531861.8278255367\r\n 20\r\n185191.7735766143\r\n 30\r\n0.0\r\n 11\r\n531538.5384386285\r\n 21\r\n185607.8478836246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531733.7040754842\r\n 20\r\n185347.6380927605\r\n 30\r\n0.0\r\n 11\r\n532464.1482035561\r\n 21\r\n185651.3189967688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531862.0971573802\r\n 20\r\n185397.8253868076\r\n 30\r\n0.0\r\n 11\r\n531783.9926877962\r\n 21\r\n185523.3538160008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531697.5197138976\r\n 20\r\n185401.8602090297\r\n 30\r\n0.0\r\n 11\r\n532154.4445108975\r\n 21\r\n185590.8161210297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n400\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531792.6965981643\r\n 20\r\n185491.8893567981\r\n 30\r\n0.0\r\n 11\r\n531792.885563927\r\n 21\r\n185573.87144354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n401\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531713.3339456926\r\n 20\r\n185499.4315717521\r\n 30\r\n0.0\r\n 11\r\n531801.1772682144\r\n 21\r\n185500.4211012181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n402\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531730.3606550528\r\n 20\r\n185490.9574299569\r\n 30\r\n0.0\r\n 11\r\n531610.7000381212\r\n 21\r\n185649.8145655846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n403\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531620.0352627024\r\n 20\r\n185437.4863894554\r\n 30\r\n0.0\r\n 11\r\n531921.4650168662\r\n 21\r\n185748.2907083182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n404\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531650.9979007347\r\n 20\r\n185688.8051328634\r\n 30\r\n0.0\r\n 11\r\n531795.0736114228\r\n 21\r\n185570.1374104197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n405\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531609.7161111208\r\n 20\r\n185644.4268986138\r\n 30\r\n0.0\r\n 11\r\n531651.8451968421\r\n 21\r\n185688.8314120956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n406\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531419.6038351391\r\n 20\r\n185873.1395474812\r\n 30\r\n0.0\r\n 11\r\n531638.8567267734\r\n 21\r\n185672.4553785438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n407\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531467.5316540078\r\n 20\r\n185824.3072660336\r\n 30\r\n0.0\r\n 11\r\n531549.4316502019\r\n 21\r\n185902.346947863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n408\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531488.9758274058\r\n 20\r\n185956.9537109508\r\n 30\r\n0.0\r\n 11\r\n532119.1862890298\r\n 21\r\n185356.9691234335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n409\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531920.2925450763\r\n 20\r\n185642.1958461826\r\n 30\r\n0.0\r\n 11\r\n532283.0697733463\r\n 21\r\n185889.7366514033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531967.7814881132\r\n 20\r\n185591.4570314894\r\n 30\r\n0.0\r\n 11\r\n531840.5527883868\r\n 21\r\n185737.8208797502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532021.8574928065\r\n 20\r\n185639.9150950438\r\n 30\r\n0.0\r\n 11\r\n531979.268683928\r\n 21\r\n185688.1005602838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531998.4393065221\r\n 20\r\n185590.8350219038\r\n 30\r\n0.0\r\n 11\r\n532021.2274724078\r\n 21\r\n185655.7808071295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532007.6850459294\r\n 20\r\n185640.4619804239\r\n 30\r\n0.0\r\n 11\r\n532354.1763415755\r\n 21\r\n185846.7163859356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532182.715114118\r\n 20\r\n185529.8988290208\r\n 30\r\n0.0\r\n 11\r\n531998.1198935781\r\n 21\r\n185892.9915152565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n40F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531988.0600547572\r\n 20\r\n185884.2681765558\r\n 30\r\n0.0\r\n 11\r\n532194.1878251482\r\n 21\r\n186004.8795937868\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n410\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531823.9061445957\r\n 20\r\n185981.011623581\r\n 30\r\n0.0\r\n 11\r\n532006.0750995708\r\n 21\r\n185882.4146979472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n411\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531822.8497064442\r\n 20\r\n185893.8286643487\r\n 30\r\n0.0\r\n 11\r\n531880.2747016837\r\n 21\r\n185957.0243104261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n412\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532356.2144154167\r\n 20\r\n185600.3187829731\r\n 30\r\n0.0\r\n 11\r\n532311.1985787343\r\n 21\r\n185678.3935256651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n413\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532436.5909745613\r\n 20\r\n185602.3600801\r\n 30\r\n0.0\r\n 11\r\n532191.2154048476\r\n 21\r\n186005.769275952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n414\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531888.1595850236\r\n 20\r\n185718.6348090544\r\n 30\r\n0.0\r\n 11\r\n532243.1029985761\r\n 21\r\n185950.691697608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n415\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531983.707795175\r\n 20\r\n186179.1651187459\r\n 30\r\n0.0\r\n 11\r\n532196.6318225811\r\n 21\r\n185988.747421823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n416\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531651.967628694\r\n 20\r\n186274.3789995667\r\n 30\r\n0.0\r\n 11\r\n531834.7205437863\r\n 21\r\n186117.8592350517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n417\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531474.7328130902\r\n 20\r\n185635.481035244\r\n 30\r\n0.0\r\n 11\r\n531880.8795836971\r\n 21\r\n186024.7911548032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n419\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532084.0423358651\r\n 20\r\n186020.2200672802\r\n 30\r\n0.0\r\n 11\r\n532125.4763841526\r\n 21\r\n186066.8963861565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532082.0474267376\r\n 20\r\n186004.8140287462\r\n 30\r\n0.0\r\n 11\r\n532087.0205745952\r\n 21\r\n186028.360031231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532123.0045456797\r\n 20\r\n185955.5090158614\r\n 30\r\n0.0\r\n 11\r\n532078.7129439776\r\n 21\r\n186012.0785870981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531418.7788685433\r\n 20\r\n186104.3451573058\r\n 30\r\n0.0\r\n 11\r\n531495.3612063181\r\n 21\r\n186318.6540757437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531496.1237532815\r\n 20\r\n185938.45407603\r\n 30\r\n0.0\r\n 11\r\n531405.175342562\r\n 21\r\n186133.5223115784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531988.1202134396\r\n 20\r\n185777.976802319\r\n 30\r\n0.0\r\n 11\r\n531967.6519314506\r\n 21\r\n185820.2988931271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n420\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531916.3854307389\r\n 20\r\n185782.2978865\r\n 30\r\n0.0\r\n 11\r\n531969.5488407774\r\n 21\r\n185820.1720133031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n421\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531921.5218807102\r\n 20\r\n185733.0111496584\r\n 30\r\n0.0\r\n 11\r\n531851.7810069742\r\n 21\r\n185810.5943537981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n422\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531753.8130619647\r\n 20\r\n185695.637566851\r\n 30\r\n0.0\r\n 11\r\n531951.8835598482\r\n 21\r\n185919.0806450864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n423\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532050.4021916367\r\n 20\r\n185917.1215869044\r\n 30\r\n0.0\r\n 11\r\n532012.0528583068\r\n 21\r\n185974.2958152379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n424\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531986.1651783409\r\n 20\r\n185955.7546193549\r\n 30\r\n0.0\r\n 11\r\n532035.9806907252\r\n 21\r\n185989.3847647976\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n425\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531994.3672256759\r\n 20\r\n185953.1487070773\r\n 30\r\n0.0\r\n 11\r\n531953.7989935165\r\n 21\r\n186011.8231858276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n426\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531952.8559031887\r\n 20\r\n186008.2273663998\r\n 30\r\n0.0\r\n 11\r\n531998.5804950235\r\n 21\r\n186040.7980817171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n427\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532035.9690354825\r\n 20\r\n185980.3492953121\r\n 30\r\n0.0\r\n 11\r\n531992.6053163253\r\n 21\r\n186044.5807179909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n428\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532589.7485624646\r\n 20\r\n185685.3582884609\r\n 30\r\n0.0\r\n 11\r\n532589.9375282275\r\n 21\r\n185767.3403752028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n429\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532510.3859099931\r\n 20\r\n185692.900503415\r\n 30\r\n0.0\r\n 11\r\n532598.229232515\r\n 21\r\n185693.8900328809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532526.4656307082\r\n 20\r\n185685.9832563354\r\n 30\r\n0.0\r\n 11\r\n532406.8050137765\r\n 21\r\n185844.8403919632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532357.8334418678\r\n 20\r\n185569.8587237367\r\n 30\r\n0.0\r\n 11\r\n532718.5169811667\r\n 21\r\n185941.7596399811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532448.049865035\r\n 20\r\n185882.2740645263\r\n 30\r\n0.0\r\n 11\r\n532592.1255757233\r\n 21\r\n185763.6063420826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532406.7680754211\r\n 20\r\n185837.8958302767\r\n 30\r\n0.0\r\n 11\r\n532448.8971611424\r\n 21\r\n185882.3003437585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532216.6557994395\r\n 20\r\n186066.608479144\r\n 30\r\n0.0\r\n 11\r\n532435.9086910739\r\n 21\r\n185865.9243102067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532360.5330683786\r\n 20\r\n186075.9173659413\r\n 30\r\n0.0\r\n 11\r\n532834.2031285817\r\n 21\r\n185630.4462966165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n430\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532717.3445093768\r\n 20\r\n185835.6647778455\r\n 30\r\n0.0\r\n 11\r\n532936.5865712611\r\n 21\r\n185985.2644558515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n431\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532764.8334524136\r\n 20\r\n185784.9259631524\r\n 30\r\n0.0\r\n 11\r\n532637.6047526871\r\n 21\r\n185931.289811413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n432\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532818.9094571071\r\n 20\r\n185833.3840267067\r\n 30\r\n0.0\r\n 11\r\n532776.3206482284\r\n 21\r\n185881.5694919468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n433\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532795.4912708226\r\n 20\r\n185784.3039535667\r\n 30\r\n0.0\r\n 11\r\n532818.2794367084\r\n 21\r\n185849.2497387923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n434\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532804.7370102297\r\n 20\r\n185833.9309120868\r\n 30\r\n0.0\r\n 11\r\n533151.2283058758\r\n 21\r\n186040.1853175985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n435\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532929.8009410545\r\n 20\r\n185821.4028240506\r\n 30\r\n0.0\r\n 11\r\n532795.1718578784\r\n 21\r\n186086.4604469193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n436\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532785.1120190575\r\n 20\r\n186077.7371082186\r\n 30\r\n0.0\r\n 11\r\n532991.2397894489\r\n 21\r\n186198.3485254497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n438\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532487.8955622168\r\n 20\r\n185923.2211543541\r\n 30\r\n0.0\r\n 11\r\n532719.6710319343\r\n 21\r\n186201.2963692519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n439\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.2115493238\r\n 20\r\n185912.1037407173\r\n 30\r\n0.0\r\n 11\r\n533069.5807117685\r\n 21\r\n186166.970324897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532596.3237212511\r\n 20\r\n186341.3319926437\r\n 30\r\n0.0\r\n 11\r\n532804.5149513248\r\n 21\r\n186072.8212737525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532563.3363404315\r\n 20\r\n186239.6670789878\r\n 30\r\n0.0\r\n 11\r\n532671.2243390242\r\n 21\r\n186286.0320171303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532612.0301757858\r\n 20\r\n186201.1453963313\r\n 30\r\n0.0\r\n 11\r\n532644.3347693412\r\n 21\r\n186306.1311768702\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532271.7847773906\r\n 20\r\n185828.9499669069\r\n 30\r\n0.0\r\n 11\r\n532505.4397367133\r\n 21\r\n186045.7682751822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532456.1709398957\r\n 20\r\n185958.2385074901\r\n 30\r\n0.0\r\n 11\r\n532414.07966705\r\n 21\r\n186283.737681027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532406.7909252194\r\n 20\r\n186170.6980676144\r\n 30\r\n0.0\r\n 11\r\n532571.9985347014\r\n 21\r\n186193.8794666497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n440\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532548.1691416875\r\n 20\r\n186189.2161541062\r\n 30\r\n0.0\r\n 11\r\n532628.7607689065\r\n 21\r\n186210.607083589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n441\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532555.5499794265\r\n 20\r\n186178.3628483507\r\n 30\r\n0.0\r\n 11\r\n532577.0134800563\r\n 21\r\n186255.5863276716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n442\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532486.5436966105\r\n 20\r\n186326.2911970296\r\n 30\r\n0.0\r\n 11\r\n532581.8881197563\r\n 21\r\n186243.9413365331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n443\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532172.7351168023\r\n 20\r\n185975.263057285\r\n 30\r\n0.0\r\n 11\r\n532257.3461442857\r\n 21\r\n186098.2095402245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n444\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532785.17217774\r\n 20\r\n185971.4457339819\r\n 30\r\n0.0\r\n 11\r\n532764.7038957511\r\n 21\r\n186013.76782479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n445\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532713.4373950393\r\n 20\r\n185975.7668181629\r\n 30\r\n0.0\r\n 11\r\n532766.6008050778\r\n 21\r\n186013.640944966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n446\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532718.5738450106\r\n 20\r\n185926.4800813213\r\n 30\r\n0.0\r\n 11\r\n532648.8329712746\r\n 21\r\n186004.063285461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n447\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532550.865026265\r\n 20\r\n185889.1064985139\r\n 30\r\n0.0\r\n 11\r\n532766.6531342508\r\n 21\r\n186130.2671868515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n448\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532847.4541559371\r\n 20\r\n186110.5905185672\r\n 30\r\n0.0\r\n 11\r\n532809.1048226073\r\n 21\r\n186167.7647469007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n449\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532783.2171426415\r\n 20\r\n186149.2235510178\r\n 30\r\n0.0\r\n 11\r\n532833.0326550259\r\n 21\r\n186182.8536964605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532316.8864140805\r\n 20\r\n185968.1543527131\r\n 30\r\n0.0\r\n 11\r\n532397.8707606938\r\n 21\r\n186046.5514581896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532611.7161158065\r\n 20\r\n186297.5090828903\r\n 30\r\n0.0\r\n 11\r\n532545.1449756013\r\n 21\r\n186591.4088218426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532547.3155668865\r\n 20\r\n186321.6247646187\r\n 30\r\n0.0\r\n 11\r\n532495.053707063\r\n 21\r\n186542.8445710875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532403.9294344441\r\n 20\r\n186201.8155025754\r\n 30\r\n0.0\r\n 11\r\n532302.4455707475\r\n 21\r\n186337.9548541522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532279.8671234338\r\n 20\r\n186136.1577846746\r\n 30\r\n0.0\r\n 11\r\n533406.1995619062\r\n 21\r\n186996.2805453936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532406.9961318524\r\n 20\r\n186319.8807114539\r\n 30\r\n0.0\r\n 11\r\n532220.4666046975\r\n 21\r\n186717.4866760719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n450\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532464.6578491668\r\n 20\r\n186358.671862295\r\n 30\r\n0.0\r\n 11\r\n532299.8801138759\r\n 21\r\n186256.40839832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n451\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532425.4420865872\r\n 20\r\n186419.7825992595\r\n 30\r\n0.0\r\n 11\r\n532371.082371042\r\n 21\r\n186385.4217635892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n452\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532470.160245401\r\n 20\r\n186388.8382734374\r\n 30\r\n0.0\r\n 11\r\n532409.6789007655\r\n 21\r\n186421.6904038722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n453\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532422.6424219159\r\n 20\r\n186405.8786713312\r\n 30\r\n0.0\r\n 11\r\n532274.2743179815\r\n 21\r\n186780.8240053286\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n454\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532644.1853054258\r\n 20\r\n186588.1231077161\r\n 30\r\n0.0\r\n 11\r\n532171.8185395161\r\n 21\r\n186436.7013597309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n455\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532178.8262472758\r\n 20\r\n186425.3793004152\r\n 30\r\n0.0\r\n 11\r\n532092.6246762097\r\n 21\r\n186648.1012365569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n456\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532057.1464107401\r\n 20\r\n186278.7511375533\r\n 30\r\n0.0\r\n 11\r\n532183.5284855803\r\n 21\r\n186442.8683306205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n457\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532143.045524667\r\n 20\r\n186263.8070193578\r\n 30\r\n0.0\r\n 11\r\n532089.8147203099\r\n 21\r\n186330.5737867564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n459\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532428.4229887346\r\n 20\r\n186782.4538492132\r\n 30\r\n0.0\r\n 11\r\n532091.2724283363\r\n 21\r\n186645.3087032108\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532326.4115569843\r\n 20\r\n186300.3469340414\r\n 30\r\n0.0\r\n 11\r\n532153.9187586503\r\n 21\r\n186687.7504199219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531805.9814634882\r\n 20\r\n186360.1205610736\r\n 30\r\n0.0\r\n 11\r\n532160.8507210284\r\n 21\r\n186688.5257734576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531638.584156153\r\n 20\r\n186248.3972793169\r\n 30\r\n0.0\r\n 11\r\n532019.1879770698\r\n 21\r\n186551.2217947124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531850.9576992835\r\n 20\r\n186279.1895284476\r\n 30\r\n0.0\r\n 11\r\n531822.388527218\r\n 21\r\n186393.0900558247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531896.7507059305\r\n 20\r\n186321.1181604121\r\n 30\r\n0.0\r\n 11\r\n531798.2590085679\r\n 21\r\n186369.7492865638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532045.128842458\r\n 20\r\n186439.807702748\r\n 30\r\n0.0\r\n 11\r\n531876.6943226217\r\n 21\r\n186328.2862075614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n460\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532093.9829120121\r\n 20\r\n186228.3962886964\r\n 30\r\n0.0\r\n 11\r\n531943.1818398332\r\n 21\r\n186488.7548350109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n461\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532011.4998620817\r\n 20\r\n186166.3447629878\r\n 30\r\n0.0\r\n 11\r\n531995.1789584217\r\n 21\r\n186015.2308868018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n462\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532367.7592458358\r\n 20\r\n186017.384856327\r\n 30\r\n0.0\r\n 11\r\n532367.7521822822\r\n 21\r\n186017.3950907273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n463\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532159.4363386243\r\n 20\r\n186124.1371738739\r\n 30\r\n0.0\r\n 11\r\n532023.0113161725\r\n 21\r\n186341.976254682\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n464\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532025.08345726\r\n 20\r\n186354.8888840192\r\n 30\r\n0.0\r\n 11\r\n532005.2047513147\r\n 21\r\n186340.9392739177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n465\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532059.9179272102\r\n 20\r\n186541.8109382867\r\n 30\r\n0.0\r\n 11\r\n532030.473360213\r\n 21\r\n186576.266048903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n466\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532074.8087792434\r\n 20\r\n186537.3850811423\r\n 30\r\n0.0\r\n 11\r\n532052.356979825\r\n 21\r\n186546.0489795433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n467\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532130.0135486268\r\n 20\r\n186569.9565920827\r\n 30\r\n0.0\r\n 11\r\n532067.1054834822\r\n 21\r\n186535.2515821992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n468\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532091.2921244135\r\n 20\r\n186316.102313323\r\n 30\r\n0.0\r\n 11\r\n531792.7632140843\r\n 21\r\n186130.9801536181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n469\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531936.6804172386\r\n 20\r\n186133.8679621811\r\n 30\r\n0.0\r\n 11\r\n532070.9155718749\r\n 21\r\n186278.0897346377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532468.8458028386\r\n 20\r\n186177.5755427393\r\n 30\r\n0.0\r\n 11\r\n531769.5162369404\r\n 21\r\n186138.5166020882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531938.4823451721\r\n 20\r\n186213.5060128864\r\n 30\r\n0.0\r\n 11\r\n531879.4933379066\r\n 21\r\n186285.8395267122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531898.3447794365\r\n 20\r\n186256.1720487052\r\n 30\r\n0.0\r\n 11\r\n531890.077737924\r\n 21\r\n186339.1433586055\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531910.2360944391\r\n 20\r\n186261.7279139901\r\n 30\r\n0.0\r\n 11\r\n531837.4229176238\r\n 21\r\n186295.2299870572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531710.4802981255\r\n 20\r\n186186.4293161462\r\n 30\r\n0.0\r\n 11\r\n531849.6961797504\r\n 21\r\n186298.185484916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532283.7673474868\r\n 20\r\n186408.4906846435\r\n 30\r\n0.0\r\n 11\r\n532238.7230775654\r\n 21\r\n186395.0324646574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n470\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532268.0635396029\r\n 20\r\n186338.3626500527\r\n 30\r\n0.0\r\n 11\r\n532239.1507935487\r\n 21\r\n186396.88487458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n471\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532327.6932205972\r\n 20\r\n186164.0523312674\r\n 30\r\n0.0\r\n 11\r\n532138.6908716636\r\n 21\r\n186395.2164362678\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n472\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532156.333518464\r\n 20\r\n186492.1622754376\r\n 30\r\n0.0\r\n 11\r\n532006.4397393707\r\n 21\r\n186419.1755808819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n473\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532443.2785890483\r\n 20\r\n186521.0440070698\r\n 30\r\n0.0\r\n 11\r\n532392.4614716871\r\n 21\r\n186789.2089363239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n474\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531690.8699317568\r\n 20\r\n185858.9173803943\r\n 30\r\n0.0\r\n 11\r\n531813.4096672386\r\n 21\r\n185746.4218472305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n475\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531602.6576685688\r\n 20\r\n185904.8884095925\r\n 30\r\n0.0\r\n 11\r\n531532.6487409198\r\n 21\r\n185734.1550506949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n476\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532274.1029641282\r\n 20\r\n186355.1102229073\r\n 30\r\n0.0\r\n 11\r\n532171.4693846109\r\n 21\r\n186298.5722535568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n477\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532180.8622533723\r\n 20\r\n185533.5433447531\r\n 30\r\n0.0\r\n 11\r\n532356.6872845859\r\n 21\r\n185442.1663750327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n478\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534574.6571852977\r\n 20\r\n184195.4021252921\r\n 30\r\n0.0\r\n 11\r\n535121.1408465514\r\n 21\r\n184069.916780534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n479\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534591.6805218133\r\n 20\r\n184183.5721895806\r\n 30\r\n0.0\r\n 11\r\n534563.5622932388\r\n 21\r\n184974.1290065872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534583.8361464561\r\n 20\r\n184321.2021780923\r\n 30\r\n0.0\r\n 11\r\n534730.4884537673\r\n 21\r\n184302.4726435274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534698.2576499472\r\n 20\r\n184297.2817347705\r\n 30\r\n0.0\r\n 11\r\n534772.7128564283\r\n 21\r\n184331.596753093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534738.1669447289\r\n 20\r\n184228.2704037896\r\n 30\r\n0.0\r\n 11\r\n534702.4823148565\r\n 21\r\n184308.5451549328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534723.3715470947\r\n 20\r\n184240.2209736357\r\n 30\r\n0.0\r\n 11\r\n534917.6315636337\r\n 21\r\n184197.5911864141\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534720.7058270503\r\n 20\r\n184117.6496135786\r\n 30\r\n0.0\r\n 11\r\n534877.7361941458\r\n 21\r\n184521.135282629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n480\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534936.2968661421\r\n 20\r\n184250.4664032003\r\n 30\r\n0.0\r\n 11\r\n534768.4068052764\r\n 21\r\n184332.030894389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n481\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534913.1431511226\r\n 20\r\n184194.4528395783\r\n 30\r\n0.0\r\n 11\r\n534935.9678830071\r\n 21\r\n184251.2476658892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n482\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535200.2533381722\r\n 20\r\n184116.8648654899\r\n 30\r\n0.0\r\n 11\r\n534926.4889642517\r\n 21\r\n184232.6190607658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n483\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535135.8969533211\r\n 20\r\n184140.101114365\r\n 30\r\n0.0\r\n 11\r\n535172.7375945441\r\n 21\r\n184247.0617074395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n484\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535247.5614010104\r\n 20\r\n184214.8405486959\r\n 30\r\n0.0\r\n 11\r\n534562.2605079586\r\n 21\r\n184461.1649807091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n485\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534781.7684923542\r\n 20\r\n184475.8838221603\r\n 30\r\n0.0\r\n 11\r\n534855.7334321526\r\n 21\r\n184908.796001801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n486\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534715.8615647035\r\n 20\r\n184497.9270504825\r\n 30\r\n0.0\r\n 11\r\n534901.9152180392\r\n 21\r\n184443.2136500017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n487\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534737.396022412\r\n 20\r\n184567.2715912787\r\n 30\r\n0.0\r\n 11\r\n534798.940808514\r\n 21\r\n184548.6199155959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n488\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534702.5279512712\r\n 20\r\n184525.5405160086\r\n 30\r\n0.0\r\n 11\r\n534752.0826991785\r\n 21\r\n184573.3064294077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n489\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534743.7956458011\r\n 20\r\n184554.6144922988\r\n 30\r\n0.0\r\n 11\r\n534787.0077403957\r\n 21\r\n184955.5257201689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534570.3822305559\r\n 20\r\n184667.6964211436\r\n 30\r\n0.0\r\n 11\r\n534977.3661527182\r\n 21\r\n184651.0897554535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534973.6249792506\r\n 20\r\n184638.3108424999\r\n 30\r\n0.0\r\n 11\r\n534997.4323029246\r\n 21\r\n184875.9428753415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535129.9446164009\r\n 20\r\n184529.3614422962\r\n 30\r\n0.0\r\n 11\r\n534964.4371350048\r\n 21\r\n184653.9172751708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535051.1223213111\r\n 20\r\n184492.0917463117\r\n 30\r\n0.0\r\n 11\r\n535084.6606727746\r\n 21\r\n184570.6188037027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534553.9285474718\r\n 20\r\n184777.7111798236\r\n 30\r\n0.0\r\n 11\r\n534643.6579189425\r\n 21\r\n184769.3010137052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534530.5281655633\r\n 20\r\n184928.6853843727\r\n 30\r\n0.0\r\n 11\r\n534999.4790852679\r\n 21\r\n184873.6110308273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n490\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534864.6453430343\r\n 20\r\n184478.5048502061\r\n 30\r\n0.0\r\n 11\r\n534927.7956627994\r\n 21\r\n184897.846314246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n491\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535350.3893007875\r\n 20\r\n184674.6506536572\r\n 30\r\n0.0\r\n 11\r\n534920.9074000498\r\n 21\r\n184896.7485383992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n492\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535583.6379881881\r\n 20\r\n184575.7674960427\r\n 30\r\n0.0\r\n 11\r\n535094.0071012423\r\n 21\r\n184802.1060054018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n493\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535328.5779771762\r\n 20\r\n184584.6675441836\r\n 30\r\n0.0\r\n 11\r\n535325.7982992511\r\n 21\r\n184702.0634602962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n494\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535273.2764353342\r\n 20\r\n184612.8942887018\r\n 30\r\n0.0\r\n 11\r\n535355.2701688879\r\n 21\r\n184685.9875752475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n495\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535098.6584225843\r\n 20\r\n184687.8064271212\r\n 30\r\n0.0\r\n 11\r\n535290.7012472688\r\n 21\r\n184625.1423636691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n496\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535098.5090148775\r\n 20\r\n184438.0892804688\r\n 30\r\n0.0\r\n 11\r\n535183.8986896964\r\n 21\r\n184762.1240560096\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n497\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535006.8823547946\r\n 20\r\n184457.0934690072\r\n 30\r\n0.0\r\n 11\r\n535127.0631374186\r\n 21\r\n184439.6565824029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n498\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535092.7796099318\r\n 20\r\n184343.4867310913\r\n 30\r\n0.0\r\n 11\r\n534991.7531499059\r\n 21\r\n184409.6787649087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n499\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534995.7606139729\r\n 20\r\n184404.26444609\r\n 30\r\n0.0\r\n 11\r\n535008.3974384137\r\n 21\r\n184458.6513154741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534961.226757078\r\n 20\r\n184068.0072542187\r\n 30\r\n0.0\r\n 11\r\n535146.0188931681\r\n 21\r\n184599.3917053508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535140.5844114282\r\n 20\r\n184611.286921755\r\n 30\r\n0.0\r\n 11\r\n535163.459076143\r\n 21\r\n184603.1319057388\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535057.2515549811\r\n 20\r\n184782.193123236\r\n 30\r\n0.0\r\n 11\r\n535076.4625545096\r\n 21\r\n184823.2427842622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535044.0759987184\r\n 20\r\n184773.9632749442\r\n 30\r\n0.0\r\n 11\r\n535063.411640211\r\n 21\r\n184788.2908497806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534982.1929300688\r\n 20\r\n184790.6652419575\r\n 30\r\n0.0\r\n 11\r\n535052.0692800618\r\n 21\r\n184773.9572174507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535087.0886008305\r\n 20\r\n184556.2761598885\r\n 30\r\n0.0\r\n 11\r\n535505.4896536701\r\n 21\r\n184439.6663665903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535227.7655735143\r\n 20\r\n184213.6345013193\r\n 30\r\n0.0\r\n 11\r\n535495.623878412\r\n 21\r\n184458.2494913671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535457.6518015389\r\n 20\r\n184323.7658987257\r\n 30\r\n0.0\r\n 11\r\n535116.8482574903\r\n 21\r\n184525.0588110716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535074.8677798265\r\n 20\r\n184403.5864576378\r\n 30\r\n0.0\r\n 11\r\n535108.5224187205\r\n 21\r\n184392.2128473538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535261.6946601973\r\n 20\r\n184498.0562876151\r\n 30\r\n0.0\r\n 11\r\n535299.3017138008\r\n 21\r\n184583.481984685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535289.0272950536\r\n 20\r\n184549.86692231\r\n 30\r\n0.0\r\n 11\r\n535274.9106969223\r\n 21\r\n184632.0454103658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535276.0861163686\r\n 20\r\n184552.0571062738\r\n 30\r\n0.0\r\n 11\r\n535337.3547991832\r\n 21\r\n184603.7320143421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535404.9953774325\r\n 20\r\n184001.071612279\r\n 30\r\n0.0\r\n 11\r\n535103.3700778348\r\n 21\r\n184075.7331806402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535153.1660462351\r\n 20\r\n184036.1810629035\r\n 30\r\n0.0\r\n 11\r\n535273.7238639583\r\n 21\r\n184270.2849582326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534876.9652630151\r\n 20\r\n184594.0981846576\r\n 30\r\n0.0\r\n 11\r\n534923.966796239\r\n 21\r\n184593.1154270327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534910.7692790155\r\n 20\r\n184530.6802114966\r\n 30\r\n0.0\r\n 11\r\n534923.0614345329\r\n 21\r\n184594.787157772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534863.8211214823\r\n 20\r\n184514.823476302\r\n 30\r\n0.0\r\n 11\r\n534963.400889941\r\n 21\r\n184483.7298636502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534899.6889578032\r\n 20\r\n184346.7861861114\r\n 30\r\n0.0\r\n 11\r\n535020.3411757364\r\n 21\r\n184619.9194386656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534977.5298769468\r\n 20\r\n184708.6716297057\r\n 30\r\n0.0\r\n 11\r\n535045.4811634307\r\n 21\r\n184697.6178331832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535039.4059462963\r\n 20\r\n184666.3601996268\r\n 30\r\n0.0\r\n 11\r\n535049.2339964726\r\n 21\r\n184725.6559109923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535033.6208638784\r\n 20\r\n184672.7317913196\r\n 30\r\n0.0\r\n 11\r\n535103.8602096413\r\n 21\r\n184660.2854977361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535100.983845627\r\n 20\r\n184657.9305313283\r\n 30\r\n0.0\r\n 11\r\n535111.5524690118\r\n 21\r\n184713.0657650223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535041.0242654582\r\n 20\r\n184721.8822971619\r\n 30\r\n0.0\r\n 11\r\n535117.4799406871\r\n 21\r\n184709.2088002577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535069.0006836904\r\n 20\r\n184166.9860368055\r\n 30\r\n0.0\r\n 11\r\n535106.5476183001\r\n 21\r\n184273.2630251185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534693.2491391094\r\n 20\r\n184660.1320577132\r\n 30\r\n0.0\r\n 11\r\n534706.6944115045\r\n 21\r\n184924.3913516068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534453.6923026645\r\n 20\r\n184480.7570328502\r\n 30\r\n0.0\r\n 11\r\n534405.8297581176\r\n 21\r\n185826.4342959219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534427.7785696117\r\n 20\r\n185126.4152517712\r\n 30\r\n0.0\r\n 11\r\n534574.430876923\r\n 21\r\n185107.6857172062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534499.9886731898\r\n 20\r\n184978.4702767471\r\n 30\r\n0.0\r\n 11\r\n534481.4814355449\r\n 21\r\n185472.5776425573\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534542.2000731028\r\n 20\r\n185102.4948084494\r\n 30\r\n0.0\r\n 11\r\n534616.655279584\r\n 21\r\n185136.8098267719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534582.1093678846\r\n 20\r\n185033.4834774686\r\n 30\r\n0.0\r\n 11\r\n534546.4247380123\r\n 21\r\n185113.7582286117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534569.1238130012\r\n 20\r\n185045.2214964583\r\n 30\r\n0.0\r\n 11\r\n534763.3838295403\r\n 21\r\n185002.5917092368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534533.7798853447\r\n 20\r\n184843.5471823721\r\n 30\r\n0.0\r\n 11\r\n534721.6786173013\r\n 21\r\n185326.3483563077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534780.2392892977\r\n 20\r\n185055.6794768792\r\n 30\r\n0.0\r\n 11\r\n534612.3492284322\r\n 21\r\n185137.243968068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534757.0855742783\r\n 20\r\n184999.6659132573\r\n 30\r\n0.0\r\n 11\r\n534779.9103061629\r\n 21\r\n185056.460739568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535044.1957613281\r\n 20\r\n184922.0779391688\r\n 30\r\n0.0\r\n 11\r\n534770.4313874075\r\n 21\r\n185037.8321344448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534979.8393764768\r\n 20\r\n184945.3141880438\r\n 30\r\n0.0\r\n 11\r\n535016.6800176997\r\n 21\r\n185052.2747811184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535091.5038241661\r\n 20\r\n185020.0536223748\r\n 30\r\n0.0\r\n 11\r\n534390.4684959374\r\n 21\r\n185301.8710613853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534625.7109155097\r\n 20\r\n185281.0968958392\r\n 30\r\n0.0\r\n 11\r\n534699.6758553083\r\n 21\r\n185714.0090754798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534559.803987859\r\n 20\r\n185303.1401241614\r\n 30\r\n0.0\r\n 11\r\n534745.8576411947\r\n 21\r\n185248.4267236806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534581.3384455677\r\n 20\r\n185372.4846649576\r\n 30\r\n0.0\r\n 11\r\n534642.8832316696\r\n 21\r\n185353.8329892748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534546.4703744269\r\n 20\r\n185330.7535896875\r\n 30\r\n0.0\r\n 11\r\n534596.0251223342\r\n 21\r\n185378.5195030866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534587.7380689568\r\n 20\r\n185359.8275659777\r\n 30\r\n0.0\r\n 11\r\n534630.9501635514\r\n 21\r\n185760.7387938477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534157.7326287101\r\n 20\r\n185538.9153082807\r\n 30\r\n0.0\r\n 11\r\n534848.8426457485\r\n 21\r\n185522.3086425906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534817.5674024061\r\n 20\r\n185443.5239161787\r\n 30\r\n0.0\r\n 11\r\n534840.6786983336\r\n 21\r\n185674.2085705321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534973.8870395568\r\n 20\r\n185334.5745159751\r\n 30\r\n0.0\r\n 11\r\n534808.3795581604\r\n 21\r\n185459.1303488497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534895.0647444666\r\n 20\r\n185297.3048199906\r\n 30\r\n0.0\r\n 11\r\n534928.6030959303\r\n 21\r\n185375.8318773816\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534406.089309661\r\n 20\r\n185659.9740734423\r\n 30\r\n0.0\r\n 11\r\n534495.8186811316\r\n 21\r\n185651.5639073239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534374.470588719\r\n 20\r\n185733.8984580516\r\n 30\r\n0.0\r\n 11\r\n534808.8712390222\r\n 21\r\n185692.4860401358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534708.5877661901\r\n 20\r\n185283.717923885\r\n 30\r\n0.0\r\n 11\r\n534771.7380859553\r\n 21\r\n185703.0593879249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535078.9923763787\r\n 20\r\n185538.2018863312\r\n 30\r\n0.0\r\n 11\r\n534764.8498232055\r\n 21\r\n185701.9616120782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534942.4514380332\r\n 20\r\n185243.3023541477\r\n 30\r\n0.0\r\n 11\r\n535027.841112852\r\n 21\r\n185567.3371296885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534850.8247779503\r\n 20\r\n185262.3065426861\r\n 30\r\n0.0\r\n 11\r\n534971.0055605743\r\n 21\r\n185244.8696560818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534936.7220330874\r\n 20\r\n185148.6998047703\r\n 30\r\n0.0\r\n 11\r\n534835.6955730616\r\n 21\r\n185214.8918385876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534839.7030371286\r\n 20\r\n185209.4775197689\r\n 30\r\n0.0\r\n 11\r\n534852.3398615693\r\n 21\r\n185263.864389153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534805.1691802337\r\n 20\r\n184873.2203278976\r\n 30\r\n0.0\r\n 11\r\n534989.9613163239\r\n 21\r\n185404.6047790297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534984.5268345839\r\n 20\r\n185416.4999954338\r\n 30\r\n0.0\r\n 11\r\n535007.4014992987\r\n 21\r\n185408.3449794178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534901.1939781368\r\n 20\r\n185587.4061969149\r\n 30\r\n0.0\r\n 11\r\n535027.7864360749\r\n 21\r\n185783.166830838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534888.0184218741\r\n 20\r\n185579.1763486232\r\n 30\r\n0.0\r\n 11\r\n534907.3540633668\r\n 21\r\n185593.5039234594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534826.1353532244\r\n 20\r\n185595.8783156365\r\n 30\r\n0.0\r\n 11\r\n534896.0117032174\r\n 21\r\n185579.1702911296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534931.0310239862\r\n 20\r\n185361.4892335674\r\n 30\r\n0.0\r\n 11\r\n535274.7483125908\r\n 21\r\n185272.5382705694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535071.7079966699\r\n 20\r\n185018.8475749982\r\n 30\r\n0.0\r\n 11\r\n535225.3427913389\r\n 21\r\n185153.0973355788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535237.7886563097\r\n 20\r\n185124.5939782508\r\n 30\r\n0.0\r\n 11\r\n534960.7906806459\r\n 21\r\n185330.2718847505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534918.8102029823\r\n 20\r\n185208.7995313166\r\n 30\r\n0.0\r\n 11\r\n534952.4648418761\r\n 21\r\n185197.4259210327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534979.4409143216\r\n 20\r\n184844.1047242348\r\n 30\r\n0.0\r\n 11\r\n535117.6662871139\r\n 21\r\n185075.4980319115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534720.9076861708\r\n 20\r\n185399.3112583365\r\n 30\r\n0.0\r\n 11\r\n534767.9092193946\r\n 21\r\n185398.3285007116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534754.7117021711\r\n 20\r\n185335.8932851755\r\n 30\r\n0.0\r\n 11\r\n534767.0038576885\r\n 21\r\n185400.0002314509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534707.7635446379\r\n 20\r\n185320.0365499808\r\n 30\r\n0.0\r\n 11\r\n534807.3433130968\r\n 21\r\n185288.9429373291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534743.6313809589\r\n 20\r\n185151.9992597903\r\n 30\r\n0.0\r\n 11\r\n534864.2835988922\r\n 21\r\n185425.1325123446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534912.9431068461\r\n 20\r\n184972.1991104843\r\n 30\r\n0.0\r\n 11\r\n534950.4900414558\r\n 21\r\n185078.4760987974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534537.1915622653\r\n 20\r\n185503.4776332377\r\n 30\r\n0.0\r\n 11\r\n534550.6368346601\r\n 21\r\n185729.6044252857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535204.4961575484\r\n 20\r\n185229.1919298231\r\n 30\r\n0.0\r\n 11\r\n535370.5322272507\r\n 21\r\n185193.6261991774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535127.1242449161\r\n 20\r\n184779.6941977527\r\n 30\r\n0.0\r\n 11\r\n535293.5571175311\r\n 21\r\n185516.6960290042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535310.5577928031\r\n 20\r\n185281.1508338489\r\n 30\r\n0.0\r\n 11\r\n535749.7250002055\r\n 21\r\n185277.1594001404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535321.8102417574\r\n 20\r\n185349.72932479\r\n 30\r\n0.0\r\n 11\r\n535297.4628153631\r\n 21\r\n185157.3320250695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535393.7012431163\r\n 20\r\n185339.5272597694\r\n 30\r\n0.0\r\n 11\r\n535385.1014189776\r\n 21\r\n185275.795880317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535346.9444020168\r\n 20\r\n185367.2952780401\r\n 30\r\n0.0\r\n 11\r\n535402.0006421976\r\n 21\r\n185325.9907269572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535382.2264866398\r\n 20\r\n185331.1913556245\r\n 30\r\n0.0\r\n 11\r\n535784.8986583672\r\n 21\r\n185352.4568174781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535466.2111560569\r\n 20\r\n185520.4169102442\r\n 30\r\n0.0\r\n 11\r\n535514.7099456254\r\n 21\r\n185115.9919336981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535501.4979983462\r\n 20\r\n185117.6476644367\r\n 30\r\n0.0\r\n 11\r\n535720.675878737\r\n 21\r\n185130.8756334432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535418.8674089755\r\n 20\r\n184945.9561199044\r\n 30\r\n0.0\r\n 11\r\n535515.4397776947\r\n 21\r\n185129.2063845734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535369.5064323646\r\n 20\r\n185017.8273827992\r\n 30\r\n0.0\r\n 11\r\n535452.3764747868\r\n 21\r\n184997.2391378445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535717.5064167423\r\n 20\r\n185601.3754019604\r\n 30\r\n0.0\r\n 11\r\n535737.9102122855\r\n 21\r\n185175.1889393928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535326.3598811705\r\n 20\r\n185199.7522087382\r\n 30\r\n0.0\r\n 11\r\n535750.4056180268\r\n 21\r\n185204.2732045837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535281.2005158721\r\n 20\r\n183938.4377093622\r\n 30\r\n0.0\r\n 11\r\n535738.3484018436\r\n 21\r\n185214.8857648657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n502\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535570.296748796\r\n 20\r\n185002.1058677334\r\n 30\r\n0.0\r\n 11\r\n535539.0553429453\r\n 21\r\n184802.52829905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n503\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535357.746004057\r\n 20\r\n184958.474605842\r\n 30\r\n0.0\r\n 11\r\n535657.2550122715\r\n 21\r\n184929.8059817427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n504\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535298.4922117697\r\n 20\r\n184889.1393465063\r\n 30\r\n0.0\r\n 11\r\n535341.8549400053\r\n 21\r\n185002.5727601311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n505\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535241.173484526\r\n 20\r\n185019.5210662647\r\n 30\r\n0.0\r\n 11\r\n535249.717781515\r\n 21\r\n184899.043989793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n506\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535246.9440076642\r\n 20\r\n184905.1824582619\r\n 30\r\n0.0\r\n 11\r\n535300.5910023385\r\n 21\r\n184889.7027665412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n507\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534936.51385834\r\n 20\r\n185038.9531902914\r\n 30\r\n0.0\r\n 11\r\n534936.5261047019\r\n 21\r\n185038.9510308092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n508\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535080.6527128276\r\n 20\r\n185013.5362284448\r\n 30\r\n0.0\r\n 11\r\n535490.5647417293\r\n 21\r\n184941.2537170008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n509\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535501.4412534025\r\n 20\r\n184948.5153462196\r\n 30\r\n0.0\r\n 11\r\n535497.0379026665\r\n 21\r\n184924.6330290301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535438.6044568951\r\n 20\r\n184992.5553584505\r\n 30\r\n0.0\r\n 11\r\n535394.6297386166\r\n 21\r\n184644.0500522233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535304.00713784\r\n 20\r\n184686.4677601972\r\n 30\r\n0.0\r\n 11\r\n535412.5316292262\r\n 21\r\n184958.1988788722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n50F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535285.9196378086\r\n 20\r\n184980.2736785974\r\n 30\r\n0.0\r\n 11\r\n535280.0577219055\r\n 21\r\n184945.2361034543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n510\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535408.97011748\r\n 20\r\n184810.9000931193\r\n 30\r\n0.0\r\n 11\r\n535499.2992886764\r\n 21\r\n184787.3951780687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n511\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535464.4760482091\r\n 20\r\n184792.1782756448\r\n 30\r\n0.0\r\n 11\r\n535543.352293473\r\n 21\r\n184819.2175096397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n512\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535464.5747593957\r\n 20\r\n184805.3031096497\r\n 30\r\n0.0\r\n 11\r\n535525.357753368\r\n 21\r\n184753.0577724275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n513\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535479.3097783617\r\n 20\r\n184592.3356562343\r\n 30\r\n0.0\r\n 11\r\n535522.9332737854\r\n 21\r\n184765.446873669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n514\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535442.4387356393\r\n 20\r\n185206.0210956518\r\n 30\r\n0.0\r\n 11\r\n535448.962877189\r\n 21\r\n185159.464189451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n515\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535385.2221178641\r\n 20\r\n185162.5376566434\r\n 30\r\n0.0\r\n 11\r\n535450.4688616026\r\n 21\r\n185160.624523209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n516\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535362.082434586\r\n 20\r\n185206.3568374276\r\n 30\r\n0.0\r\n 11\r\n535347.2644751583\r\n 21\r\n185103.0932372945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n517\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535201.914047268\r\n 20\r\n185144.1545844069\r\n 30\r\n0.0\r\n 11\r\n535490.7907191858\r\n 21\r\n185068.5966611639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n518\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535571.5812368377\r\n 20\r\n185125.0116500937\r\n 30\r\n0.0\r\n 11\r\n535571.5035935779\r\n 21\r\n185056.1672042472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n519\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535539.6771781332\r\n 20\r\n185057.1807123762\r\n 30\r\n0.0\r\n 11\r\n535599.7813427349\r\n 21\r\n185056.9330147139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535545.0448302518\r\n 20\r\n185063.9077228577\r\n 30\r\n0.0\r\n 11\r\n535543.9573329221\r\n 21\r\n184992.5824589834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535541.1738633348\r\n 20\r\n184995.0465275259\r\n 30\r\n0.0\r\n 11\r\n535597.2888617337\r\n 21\r\n184993.4043492656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n51C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535594.7469779589\r\n 20\r\n185064.4360151786\r\n 30\r\n0.0\r\n 11\r\n535594.4263687718\r\n 21\r\n184986.9377248218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n521\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534391.2765926996\r\n 20\r\n184519.6503847673\r\n 30\r\n0.0\r\n 11\r\n534386.096584341\r\n 21\r\n184657.946565643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n52B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534256.5953021054\r\n 20\r\n184456.2129860037\r\n 30\r\n0.0\r\n 11\r\n534150.4528097157\r\n 21\r\n184882.3790791057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n52F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534288.5721563849\r\n 20\r\n184537.5636853628\r\n 30\r\n0.0\r\n 11\r\n534215.4902316121\r\n 21\r\n184934.1190157052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n530\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534453.0403708429\r\n 20\r\n184663.3012758095\r\n 30\r\n0.0\r\n 11\r\n534104.3003871109\r\n 21\r\n184622.7857454523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n534\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534447.258926724\r\n 20\r\n184850.4577674675\r\n 30\r\n0.0\r\n 11\r\n534358.4101113065\r\n 21\r\n184835.3587940743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n535\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534473.2590024992\r\n 20\r\n184926.5403161469\r\n 30\r\n0.0\r\n 11\r\n534009.7420030087\r\n 21\r\n184836.5395345194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n536\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534173.7545980421\r\n 20\r\n184452.6269133669\r\n 30\r\n0.0\r\n 11\r\n534079.4116061442\r\n 21\r\n184866.0693231767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n537\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533755.4398820817\r\n 20\r\n184661.6264292206\r\n 30\r\n0.0\r\n 11\r\n534086.3626894285\r\n 21\r\n184865.4899125348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n54B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534152.8220239885\r\n 20\r\n184566.9747456222\r\n 30\r\n0.0\r\n 11\r\n534106.0257041126\r\n 21\r\n184562.4787046947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n54C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534123.8568246478\r\n 20\r\n184501.2056948098\r\n 30\r\n0.0\r\n 11\r\n534106.8034721114\r\n 21\r\n184564.2134785772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n557\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534476.3853151561\r\n 20\r\n184841.3974169092\r\n 30\r\n0.0\r\n 11\r\n534252.8962295165\r\n 21\r\n185308.7896885875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533961.5249641592\r\n 20\r\n184881.5255266349\r\n 30\r\n0.0\r\n 11\r\n534304.3350339336\r\n 21\r\n185057.7811684468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533907.0202036754\r\n 20\r\n184975.68771859\r\n 30\r\n0.0\r\n 11\r\n534585.0093833957\r\n 21\r\n185309.1577660268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534351.9801533095\r\n 20\r\n185270.8440629181\r\n 30\r\n0.0\r\n 11\r\n534245.8376609196\r\n 21\r\n185697.0101560202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534416.053427876\r\n 20\r\n185297.7558171074\r\n 30\r\n0.0\r\n 11\r\n534234.6140266268\r\n 21\r\n185229.2776323616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534389.3918617133\r\n 20\r\n185365.2951323006\r\n 30\r\n0.0\r\n 11\r\n534329.4147947651\r\n 21\r\n185342.0917458582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n55F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534427.284004527\r\n 20\r\n185326.2893565586\r\n 30\r\n0.0\r\n 11\r\n534374.294889134\r\n 21\r\n185370.214396944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n564\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534082.1685787133\r\n 20\r\n185266.8570599263\r\n 30\r\n0.0\r\n 11\r\n534042.8498380052\r\n 21\r\n185342.6551891283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n565\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534438.4337275536\r\n 20\r\n185715.179827652\r\n 30\r\n0.0\r\n 11\r\n534231.2455671621\r\n 21\r\n185651.1706114339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n566\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534269.1394492462\r\n 20\r\n185267.2579902813\r\n 30\r\n0.0\r\n 11\r\n534174.7964573482\r\n 21\r\n185680.700400091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534038.9544153993\r\n 20\r\n185209.4610571617\r\n 30\r\n0.0\r\n 11\r\n533929.5639759587\r\n 21\r\n185526.2001676052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534128.9026977911\r\n 20\r\n185235.266299162\r\n 30\r\n0.0\r\n 11\r\n534010.36305539\r\n 21\r\n185208.8879234353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534143.9452490914\r\n 20\r\n185183.4172834368\r\n 30\r\n0.0\r\n 11\r\n534127.2753217763\r\n 21\r\n185236.706441965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534203.536687036\r\n 20\r\n184850.6856394941\r\n 30\r\n0.0\r\n 11\r\n533979.511130468\r\n 21\r\n185366.7574547194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n56F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533984.0405412705\r\n 20\r\n185379.0258777179\r\n 30\r\n0.0\r\n 11\r\n533961.8400215265\r\n 21\r\n185369.1825299575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n573\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534041.5016409996\r\n 20\r\n185328.1711071394\r\n 30\r\n0.0\r\n 11\r\n533705.4015758481\r\n 21\r\n185213.7569711722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n574\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533926.8507846999\r\n 20\r\n184975.9659141336\r\n 30\r\n0.0\r\n 11\r\n533763.6036657633\r\n 21\r\n185098.3465764448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n575\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533753.3249201474\r\n 20\r\n185068.9920483031\r\n 30\r\n0.0\r\n 11\r\n534014.1606413901\r\n 21\r\n185294.815001671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534031.9313018756\r\n 20\r\n184808.6148959472\r\n 30\r\n0.0\r\n 11\r\n533876.783424875\r\n 21\r\n185029.0196435895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534248.2068751925\r\n 20\r\n185381.6058225365\r\n 30\r\n0.0\r\n 11\r\n534201.4105553166\r\n 21\r\n185377.1097816092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534219.2416758518\r\n 20\r\n185315.8367717241\r\n 30\r\n0.0\r\n 11\r\n534202.1883233154\r\n 21\r\n185378.8445554916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n57E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534267.2444791151\r\n 20\r\n185303.536510522\r\n 30\r\n0.0\r\n 11\r\n534170.26974444\r\n 21\r\n185265.0807714352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n585\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534088.6604468999\r\n 20\r\n184941.3248589964\r\n 30\r\n0.0\r\n 11\r\n534043.2684698303\r\n 21\r\n185044.4952954651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n588\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533778.699490766\r\n 20\r\n185175.787427945\r\n 30\r\n0.0\r\n 11\r\n533615.7892077258\r\n 21\r\n185127.9007145659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n589\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533889.4801228333\r\n 20\r\n184733.3371193682\r\n 30\r\n0.0\r\n 11\r\n533668.380798012\r\n 21\r\n185455.8235821609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533669.0481535236\r\n 20\r\n185219.6666077623\r\n 30\r\n0.0\r\n 11\r\n533156.2970385719\r\n 21\r\n185130.5605879663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533652.6970921362\r\n 20\r\n185287.2111842932\r\n 30\r\n0.0\r\n 11\r\n533691.368935235\r\n 21\r\n185097.1743282281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533726.3554435947\r\n 20\r\n185312.8337458587\r\n 30\r\n0.0\r\n 11\r\n533574.50719174\r\n 21\r\n185257.5403092498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533593.8368982549\r\n 20\r\n185264.2056083881\r\n 30\r\n0.0\r\n 11\r\n533277.4741264265\r\n 21\r\n185310.1755935641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n58F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533672.2874569829\r\n 20\r\n185028.0485366832\r\n 30\r\n0.0\r\n 11\r\n533252.0779246593\r\n 21\r\n185038.8519140487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n590\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533710.405074358\r\n 20\r\n184829.6561084765\r\n 30\r\n0.0\r\n 11\r\n533658.6782495932\r\n 21\r\n184939.5278570125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n591\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533757.8097503218\r\n 20\r\n184963.9603378841\r\n 30\r\n0.0\r\n 11\r\n533758.301905461\r\n 21\r\n184843.1816611668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n592\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533760.6087077835\r\n 20\r\n184849.5104272049\r\n 30\r\n0.0\r\n 11\r\n533708.2700168314\r\n 21\r\n184830.060945907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n593\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534060.1620768055\r\n 20\r\n185006.1286428275\r\n 30\r\n0.0\r\n 11\r\n534060.1500263014\r\n 21\r\n185006.1255732843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n594\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.3284564037\r\n 20\r\n184970.0003236548\r\n 30\r\n0.0\r\n 11\r\n532885.2387837082\r\n 21\r\n184800.028308228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n595\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533494.4232462246\r\n 20\r\n185058.1154689717\r\n 30\r\n0.0\r\n 11\r\n533576.3287827944\r\n 21\r\n184703.1402534146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n596\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533720.0668251423\r\n 20\r\n184684.4216508722\r\n 30\r\n0.0\r\n 11\r\n533604.0388960189\r\n 21\r\n184929.9588760215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n597\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533716.1249475926\r\n 20\r\n184921.4756006983\r\n 30\r\n0.0\r\n 11\r\n533724.5914895053\r\n 21\r\n184886.9747108834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n598\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533431.9734486657\r\n 20\r\n185232.4302220629\r\n 30\r\n0.0\r\n 11\r\n533540.1338697607\r\n 21\r\n185087.9672749981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n599\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533603.4661137124\r\n 20\r\n185095.8003762957\r\n 30\r\n0.0\r\n 11\r\n533538.5453041319\r\n 21\r\n185089.0116995892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533787.6357425715\r\n 20\r\n185091.1815131837\r\n 30\r\n0.0\r\n 11\r\n533565.5971262563\r\n 21\r\n185014.9532196935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.4049733451\r\n 20\r\n184778.3242658983\r\n 30\r\n0.0\r\n 11\r\n533961.3461259023\r\n 21\r\n184945.405927624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533589.8584304239\r\n 20\r\n185107.2802195277\r\n 30\r\n0.0\r\n 11\r\n533607.2332131394\r\n 21\r\n184991.399632075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n59F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534448.9792157222\r\n 20\r\n184662.8294633956\r\n 30\r\n0.0\r\n 11\r\n534595.7315551097\r\n 21\r\n184795.9757854659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531733.2840274471\r\n 20\r\n186204.7351113824\r\n 30\r\n0.0\r\n 11\r\n531448.5837936163\r\n 21\r\n186119.7760350217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531632.4721077171\r\n 20\r\n185930.7358159032\r\n 30\r\n0.0\r\n 11\r\n531639.7393499542\r\n 21\r\n186196.0561477955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531358.4579136721\r\n 20\r\n185930.1338576855\r\n 30\r\n0.0\r\n 11\r\n531685.1949769023\r\n 21\r\n186008.8922798291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531770.0292339276\r\n 20\r\n185963.2831550198\r\n 30\r\n0.0\r\n 11\r\n531808.2136621511\r\n 21\r\n186140.5612032772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532232.1680833026\r\n 20\r\n186022.1457130604\r\n 30\r\n0.0\r\n 11\r\n532232.1680833026\r\n 21\r\n186186.3597618883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531627.5907608017\r\n 20\r\n186001.9470050684\r\n 30\r\n0.0\r\n 11\r\n531869.3182729818\r\n 21\r\n185971.1207754074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531611.397048721\r\n 20\r\n186201.9375863602\r\n 30\r\n0.0\r\n 11\r\n531901.0963274493\r\n 21\r\n186217.1136835819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533414.1140397175\r\n 20\r\n185165.5370379062\r\n 30\r\n0.0\r\n 11\r\n533424.4254015407\r\n 21\r\n184724.7392205304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533322.7171241251\r\n 20\r\n184642.9320605513\r\n 30\r\n0.0\r\n 11\r\n532990.6437599907\r\n 21\r\n184514.5291438661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534153.2048046347\r\n 20\r\n184752.2472177889\r\n 30\r\n0.0\r\n 11\r\n533885.0218290623\r\n 21\r\n184579.4395168853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531550.2442337178\r\n 20\r\n185166.8802593773\r\n 30\r\n0.0\r\n 11\r\n531510.6297846931\r\n 21\r\n185399.9897693373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532988.2362401025\r\n 20\r\n186147.3083667564\r\n 30\r\n0.0\r\n 11\r\n533381.9029377306\r\n 21\r\n186201.5675327487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532850.8247731416\r\n 20\r\n187339.4336963453\r\n 30\r\n0.0\r\n 11\r\n533427.582290831\r\n 21\r\n185080.1812356924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534248.5818166204\r\n 20\r\n185619.4487363936\r\n 30\r\n0.0\r\n 11\r\n534493.593518952\r\n 21\r\n185630.1835954607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534282.0183703715\r\n 20\r\n185616.188519107\r\n 30\r\n0.0\r\n 11\r\n534172.0588715453\r\n 21\r\n185831.2875668419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533826.1828457042\r\n 20\r\n185498.1855968445\r\n 30\r\n0.0\r\n 11\r\n534909.8834741084\r\n 21\r\n186031.2054602447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534271.1427953386\r\n 20\r\n185793.3419411726\r\n 30\r\n0.0\r\n 11\r\n534165.0003029485\r\n 21\r\n186219.5080342747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534335.216069905\r\n 20\r\n185820.2536953619\r\n 30\r\n0.0\r\n 11\r\n534153.7766686557\r\n 21\r\n185751.7755106161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534308.5545037421\r\n 20\r\n185887.7930105551\r\n 30\r\n0.0\r\n 11\r\n534248.577436794\r\n 21\r\n185864.5896241127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534570.7220163379\r\n 20\r\n186012.2185426509\r\n 30\r\n0.0\r\n 11\r\n534062.9865863768\r\n 21\r\n185953.4249086355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534067.6732275388\r\n 20\r\n185940.9616670905\r\n 30\r\n0.0\r\n 11\r\n534026.1561056284\r\n 21\r\n186176.1469138242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533919.9417536444\r\n 20\r\n185820.6237579156\r\n 30\r\n0.0\r\n 11\r\n534075.6678596591\r\n 21\r\n185957.2116849322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534001.3312207422\r\n 20\r\n185789.3549381808\r\n 30\r\n0.0\r\n 11\r\n533962.012480034\r\n 21\r\n185865.1530673827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534357.5963695824\r\n 20\r\n186237.6777059064\r\n 30\r\n0.0\r\n 11\r\n534024.2894962416\r\n 21\r\n186173.6684896884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534188.3020912749\r\n 20\r\n185789.7558685358\r\n 30\r\n0.0\r\n 11\r\n534093.959099377\r\n 21\r\n186203.1982783455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533638.9909350334\r\n 20\r\n185915.9627476106\r\n 30\r\n0.0\r\n 11\r\n534100.9101826614\r\n 21\r\n186202.6188677036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533717.7276796531\r\n 20\r\n185860.915757104\r\n 30\r\n0.0\r\n 11\r\n533711.7175495929\r\n 21\r\n185978.1906737143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533770.762714852\r\n 20\r\n185893.2003459607\r\n 30\r\n0.0\r\n 11\r\n533683.5308453329\r\n 21\r\n185959.9551347054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533939.2875136152\r\n 20\r\n185980.9652082985\r\n 30\r\n0.0\r\n 11\r\n533752.4704865293\r\n 21\r\n185904.110606927\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533958.117057428\r\n 20\r\n185731.9589354162\r\n 30\r\n0.0\r\n 11\r\n533848.7266179877\r\n 21\r\n186048.6980458597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534048.06533982\r\n 20\r\n185757.7641774165\r\n 30\r\n0.0\r\n 11\r\n533929.525697419\r\n 21\r\n185731.3858016898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534063.1078911201\r\n 20\r\n185705.9151616913\r\n 30\r\n0.0\r\n 11\r\n534046.4379638053\r\n 21\r\n185759.2043202194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534282.8840061187\r\n 20\r\n185012.2849875451\r\n 30\r\n0.0\r\n 11\r\n533898.6737724969\r\n 21\r\n185889.2553329739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533903.2031832994\r\n 20\r\n185901.5237559724\r\n 30\r\n0.0\r\n 11\r\n533881.0026635552\r\n 21\r\n185891.680408212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533973.5175888728\r\n 20\r\n186078.1849544206\r\n 30\r\n0.0\r\n 11\r\n533951.289621666\r\n 21\r\n186117.6824815214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533987.2718768551\r\n 20\r\n186070.9637877669\r\n 30\r\n0.0\r\n 11\r\n533966.918612191\r\n 21\r\n186083.8047787778\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534047.7321300739\r\n 20\r\n186092.2482343965\r\n 30\r\n0.0\r\n 11\r\n533979.3014454953\r\n 21\r\n186070.3597949963\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533960.6642830283\r\n 20\r\n185850.6689853939\r\n 30\r\n0.0\r\n 11\r\n533624.564217877\r\n 21\r\n185736.2548494267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533846.0134267288\r\n 20\r\n185498.4637923881\r\n 30\r\n0.0\r\n 11\r\n533682.7663077922\r\n 21\r\n185620.8444546993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533672.4875621763\r\n 20\r\n185591.4899265576\r\n 30\r\n0.0\r\n 11\r\n533933.323283419\r\n 21\r\n185817.3128799255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533984.2730984368\r\n 20\r\n185699.3213145349\r\n 30\r\n0.0\r\n 11\r\n533951.5635824718\r\n 21\r\n185685.4619748932\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533790.9027081983\r\n 20\r\n185779.5505123624\r\n 30\r\n0.0\r\n 11\r\n533747.0106001366\r\n 21\r\n185861.9235847253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533759.7708675354\r\n 20\r\n185829.171307324\r\n 30\r\n0.0\r\n 11\r\n533767.7003971879\r\n 21\r\n185912.175553007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533772.511944799\r\n 20\r\n185832.3234433795\r\n 30\r\n0.0\r\n 11\r\n533707.5492968536\r\n 21\r\n185879.270242947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533609.8257327368\r\n 20\r\n185818.9870339748\r\n 30\r\n0.0\r\n 11\r\n533720.1623939\r\n 21\r\n185879.7972284508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533892.3579233192\r\n 20\r\n185253.3677321921\r\n 30\r\n0.0\r\n 11\r\n533795.9460669039\r\n 21\r\n185551.517521844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n5FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534167.3695172214\r\n 20\r\n185904.103700791\r\n 30\r\n0.0\r\n 11\r\n534120.5731973455\r\n 21\r\n185899.6076598636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n600\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534138.4043178805\r\n 20\r\n185838.3346499785\r\n 30\r\n0.0\r\n 11\r\n534121.3509653443\r\n 21\r\n185901.3424337461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n601\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534186.407121144\r\n 20\r\n185826.0343887765\r\n 30\r\n0.0\r\n 11\r\n534089.4323864689\r\n 21\r\n185787.5786496897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n602\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534163.2101264513\r\n 20\r\n185655.7847719955\r\n 30\r\n0.0\r\n 11\r\n534022.4637309971\r\n 21\r\n185919.1271034002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n603\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534058.515801896\r\n 20\r\n186010.8331931783\r\n 30\r\n0.0\r\n 11\r\n533991.5818118574\r\n 21\r\n185994.7271468006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n604\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533999.9782917924\r\n 20\r\n185964.0115637281\r\n 30\r\n0.0\r\n 11\r\n533985.742053636\r\n 21\r\n186022.4059254402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n605\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534005.2705259052\r\n 20\r\n185970.7980663162\r\n 30\r\n0.0\r\n 11\r\n533936.1590559625\r\n 21\r\n185953.1322620743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n606\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533939.2035281585\r\n 20\r\n185950.9990659342\r\n 30\r\n0.0\r\n 11\r\n533924.5400241045\r\n 21\r\n186005.1892075063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n607\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533994.211073514\r\n 20\r\n186019.257029288\r\n 30\r\n0.0\r\n 11\r\n533918.9176883678\r\n 21\r\n186000.8996342736\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n608\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534007.823088929\r\n 20\r\n185463.8227372508\r\n 30\r\n0.0\r\n 11\r\n533962.4311118591\r\n 21\r\n185566.9931737196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n609\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533680.2879975476\r\n 20\r\n185926.3723861391\r\n 30\r\n0.0\r\n 11\r\n533183.0921970396\r\n 21\r\n185960.4920697405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533635.3074283488\r\n 20\r\n185874.3556080671\r\n 30\r\n0.0\r\n 11\r\n533409.7069375618\r\n 21\r\n185902.1750854693\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533697.8621327951\r\n 20\r\n185698.2853061994\r\n 30\r\n0.0\r\n 11\r\n533534.9518497547\r\n 21\r\n185650.3985928204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533771.9073970045\r\n 20\r\n185375.8751922475\r\n 30\r\n0.0\r\n 11\r\n533587.5434400409\r\n 21\r\n185978.3214604154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533571.859734165\r\n 20\r\n185809.7090625476\r\n 30\r\n0.0\r\n 11\r\n533610.5315772639\r\n 21\r\n185619.6722064826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n60F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533500.9333528128\r\n 20\r\n185794.1576434707\r\n 30\r\n0.0\r\n 11\r\n533514.2766247555\r\n 21\r\n185731.2481625001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n610\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533545.4819450334\r\n 20\r\n185825.3455892097\r\n 30\r\n0.0\r\n 11\r\n533493.6698337688\r\n 21\r\n185780.0381875042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n611\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533512.9995402838\r\n 20\r\n185786.7034866426\r\n 30\r\n0.0\r\n 11\r\n533196.6367684554\r\n 21\r\n185832.6734718186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n612\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533591.4500990117\r\n 20\r\n185550.5464149377\r\n 30\r\n0.0\r\n 11\r\n533281.9833857183\r\n 21\r\n185528.8296416967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n616\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533979.3247188342\r\n 20\r\n185528.626521082\r\n 30\r\n0.0\r\n 11\r\n533979.3126683303\r\n 21\r\n185528.6234515387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n619\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533592.716804391\r\n 20\r\n185246.1291783604\r\n 30\r\n0.0\r\n 11\r\n533497.5594804018\r\n 21\r\n185639.2600493747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n61B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533351.1360906946\r\n 20\r\n185754.9281003174\r\n 30\r\n0.0\r\n 11\r\n533459.2965117895\r\n 21\r\n185610.4651532526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n61C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533522.6287557413\r\n 20\r\n185618.2982545502\r\n 30\r\n0.0\r\n 11\r\n533457.707946161\r\n 21\r\n185611.5095778437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n61D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533706.7983846004\r\n 20\r\n185613.6793914381\r\n 30\r\n0.0\r\n 11\r\n533484.7597682852\r\n 21\r\n185537.451097948\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n620\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533365.6423109871\r\n 20\r\n185989.5037721182\r\n 30\r\n0.0\r\n 11\r\n533355.2628067224\r\n 21\r\n185733.4928732219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n623\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533538.3571319998\r\n 20\r\n185927.2096775935\r\n 30\r\n0.0\r\n 11\r\n533580.5614965238\r\n 21\r\n186464.9701427501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n624\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533458.1223385239\r\n 20\r\n186169.4847237501\r\n 30\r\n0.0\r\n 11\r\n533567.2457225238\r\n 21\r\n186212.8623077501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n625\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533465.3862375239\r\n 20\r\n186231.1470737501\r\n 30\r\n0.0\r\n 11\r\n533562.4058715238\r\n 21\r\n186179.6418167501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n626\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533474.9917335238\r\n 20\r\n186420.9127537501\r\n 30\r\n0.0\r\n 11\r\n533482.9234825239\r\n 21\r\n186219.0605337501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n629\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533360.3675759997\r\n 20\r\n186232.7478384316\r\n 30\r\n0.0\r\n 11\r\n533383.5869865237\r\n 21\r\n185953.2266277501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533362.2817485238\r\n 20\r\n185976.7798857501\r\n 30\r\n0.0\r\n 11\r\n533556.7744945239\r\n 21\r\n186028.6150477501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533258.2867925238\r\n 20\r\n185940.5511634717\r\n 30\r\n0.0\r\n 11\r\n533382.6655621308\r\n 21\r\n186525.8843834039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533353.6739045237\r\n 20\r\n186202.1253807501\r\n 30\r\n0.0\r\n 11\r\n533446.8430955237\r\n 21\r\n186196.5269837501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533411.7521155238\r\n 20\r\n186194.4875667501\r\n 30\r\n0.0\r\n 11\r\n533483.9128905238\r\n 21\r\n186236.2656087501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533409.3115775239\r\n 20\r\n186207.3838757501\r\n 30\r\n0.0\r\n 11\r\n533479.0483035237\r\n 21\r\n186167.8751847501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n62F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533464.9410045238\r\n 20\r\n186001.2828717501\r\n 30\r\n0.0\r\n 11\r\n533474.2744135237\r\n 21\r\n186179.5618397501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n631\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533828.2799445249\r\n 20\r\n186210.2886838591\r\n 30\r\n0.0\r\n 11\r\n534061.4320714794\r\n 21\r\n186167.5716401304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n633\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533682.6241340539\r\n 20\r\n186064.3491011722\r\n 30\r\n0.0\r\n 11\r\n533742.8463203225\r\n 21\r\n185963.5383080481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n634\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533744.6558089154\r\n 20\r\n186067.0101066368\r\n 30\r\n0.0\r\n 11\r\n533709.2791370904\r\n 21\r\n185963.019280259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n635\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533835.7364357564\r\n 20\r\n186271.9532591409\r\n 30\r\n0.0\r\n 11\r\n533852.6960106894\r\n 21\r\n186024.3600566836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533878.8332329101\r\n 20\r\n186207.9637909363\r\n 30\r\n0.0\r\n 11\r\n533536.7480498949\r\n 21\r\n186128.1674759979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533545.052813288\r\n 20\r\n186227.8808082367\r\n 30\r\n0.0\r\n 11\r\n533837.5602881303\r\n 21\r\n186220.4819401955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533698.1930436881\r\n 20\r\n186172.6657522801\r\n 30\r\n0.0\r\n 11\r\n533707.5219630261\r\n 21\r\n186079.7958892214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533699.9134321882\r\n 20\r\n186114.1127416054\r\n 30\r\n0.0\r\n 11\r\n533752.6629064465\r\n 21\r\n186049.5366221229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n63F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533712.2556086878\r\n 20\r\n186118.5783536354\r\n 30\r\n0.0\r\n 11\r\n533684.3718017468\r\n 21\r\n186043.434219279\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n640\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533517.6614423957\r\n 20\r\n186030.7981312432\r\n 30\r\n0.0\r\n 11\r\n533695.1477506907\r\n 21\r\n186050.0104533972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n641\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533938.7951369609\r\n 20\r\n186482.5712296237\r\n 30\r\n0.0\r\n 11\r\n533968.2654247546\r\n 21\r\n186185.4345043938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n643\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534367.7944644015\r\n 20\r\n186130.8678290536\r\n 30\r\n0.0\r\n 11\r\n534035.7211002672\r\n 21\r\n186002.4649123684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n64E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532380.4365915808\r\n 20\r\n183829.5073398477\r\n 30\r\n0.0\r\n 11\r\n532354.2882743065\r\n 21\r\n183002.9918967023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n666\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536721.8421223054\r\n 20\r\n187156.3816589114\r\n 30\r\n0.0\r\n 11\r\n536115.335826082\r\n 21\r\n187063.9140026928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n667\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536616.706362917\r\n 20\r\n187155.7945168107\r\n 30\r\n0.0\r\n 11\r\n536886.3043911481\r\n 21\r\n186412.0959092634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n668\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536666.447967984\r\n 20\r\n187027.2281110592\r\n 30\r\n0.0\r\n 11\r\n536521.132606101\r\n 21\r\n187000.0042188773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n669\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536552.2840148339\r\n 20\r\n187145.8392677637\r\n 30\r\n0.0\r\n 11\r\n536721.6738765864\r\n 21\r\n186681.3054352729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n66A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536550.2106325194\r\n 20\r\n187014.8446578274\r\n 30\r\n0.0\r\n 11\r\n536489.8958197851\r\n 21\r\n186959.3178929346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n66B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536491.0322792968\r\n 20\r\n187068.2603682839\r\n 30\r\n0.0\r\n 11\r\n536549.6500574119\r\n 21\r\n187002.8280783266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n66C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536508.7832802601\r\n 20\r\n187061.4323469309\r\n 30\r\n0.0\r\n 11\r\n536310.8203374363\r\n 21\r\n187042.3293091405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n66D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536473.6692727942\r\n 20\r\n187178.8966004267\r\n 30\r\n0.0\r\n 11\r\n536448.1715212629\r\n 21\r\n186746.6824336228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n66E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536309.2993856575\r\n 20\r\n186986.2769338689\r\n 30\r\n0.0\r\n 11\r\n536494.1270439047\r\n 21\r\n186960.2274519697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n66F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536314.1277275352\r\n 20\r\n187046.694654312\r\n 30\r\n0.0\r\n 11\r\n536309.8524477744\r\n 21\r\n186985.6344982014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n672\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536127.4745693341\r\n 20\r\n186916.0368669632\r\n 30\r\n0.0\r\n 11\r\n536816.4822066296\r\n 21\r\n186869.139699889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n673\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536525.5993654336\r\n 20\r\n186819.2249963617\r\n 30\r\n0.0\r\n 11\r\n536588.1901689714\r\n 21\r\n186384.522616666\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n674\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536595.0910224655\r\n 20\r\n186818.4924458963\r\n 30\r\n0.0\r\n 11\r\n536401.2259074044\r\n 21\r\n186813.4096047542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n675\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536595.8985936714\r\n 20\r\n186745.8856553338\r\n 30\r\n0.0\r\n 11\r\n536531.5999819602\r\n 21\r\n186744.7305648122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n676\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536616.2621607849\r\n 20\r\n186796.3097583272\r\n 30\r\n0.0\r\n 11\r\n536583.7757235719\r\n 21\r\n186735.6312042886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n677\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536585.9204290146\r\n 20\r\n186755.9650186167\r\n 30\r\n0.0\r\n 11\r\n536667.9473822077\r\n 21\r\n186361.1629457988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n678\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536785.6857709126\r\n 20\r\n186701.6185063583\r\n 30\r\n0.0\r\n 11\r\n536393.2771205099\r\n 21\r\n186592.4070356544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n679\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536392.9120581205\r\n 20\r\n186605.7173220767\r\n 30\r\n0.0\r\n 11\r\n536443.2503469226\r\n 21\r\n186372.2610555652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n67A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536210.6834718002\r\n 20\r\n186661.3818807413\r\n 30\r\n0.0\r\n 11\r\n536406.449603067\r\n 21\r\n186593.6876878588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n67B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536274.2466349336\r\n 20\r\n186721.0619338121\r\n 30\r\n0.0\r\n 11\r\n536266.4513026214\r\n 21\r\n186636.0292779937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n67C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536835.1377440049\r\n 20\r\n186601.9767823079\r\n 30\r\n0.0\r\n 11\r\n536747.1631200043\r\n 21\r\n186582.4177299131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n67D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536903.7822790087\r\n 20\r\n186465.4897275121\r\n 30\r\n0.0\r\n 11\r\n536440.586236061\r\n 21\r\n186373.8514423475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n67E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536447.5344701054\r\n 20\r\n186791.2729967184\r\n 30\r\n0.0\r\n 11\r\n536516.2484564788\r\n 21\r\n186372.8072102721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n67F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536045.525813408\r\n 20\r\n186455.4018776182\r\n 30\r\n0.0\r\n 11\r\n536522.4664836628\r\n 21\r\n186375.9678136094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n681\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536038.6420717368\r\n 20\r\n186547.7344716945\r\n 30\r\n0.0\r\n 11\r\n536077.3484423033\r\n 21\r\n186436.8681350233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n682\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536099.9405019144\r\n 20\r\n186537.8596504822\r\n 30\r\n0.0\r\n 11\r\n536044.3633383144\r\n 21\r\n186443.113781093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n683\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536289.1274002778\r\n 20\r\n186520.2075586261\r\n 30\r\n0.0\r\n 11\r\n536087.1204276245\r\n 21\r\n186520.8512670621\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n684\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536212.562739197\r\n 20\r\n186757.897542278\r\n 30\r\n0.0\r\n 11\r\n536230.836750314\r\n 21\r\n186423.2992863901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n685\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536305.597141756\r\n 20\r\n186767.9575601927\r\n 30\r\n0.0\r\n 11\r\n536185.8705566588\r\n 21\r\n186747.6349041769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n686\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536188.9556141511\r\n 20\r\n186849.6862783888\r\n 30\r\n0.0\r\n 11\r\n536305.430287944\r\n 21\r\n186817.7272212837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n687\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536299.9534294918\r\n 20\r\n186821.6487819443\r\n 30\r\n0.0\r\n 11\r\n536304.633839147\r\n 21\r\n186766.0096351245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n688\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536229.5279032986\r\n 20\r\n187152.256905888\r\n 30\r\n0.0\r\n 11\r\n536216.8978776463\r\n 21\r\n186589.7997511483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n689\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536225.7235310675\r\n 20\r\n186580.1489684459\r\n 30\r\n0.0\r\n 11\r\n536201.4497697369\r\n 21\r\n186580.8831910964\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n68A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536357.5255991142\r\n 20\r\n186443.1033208429\r\n 30\r\n0.0\r\n 11\r\n536351.8528189064\r\n 21\r\n186398.1371475795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n68B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536367.5361546681\r\n 20\r\n186454.9824817241\r\n 30\r\n0.0\r\n 11\r\n536353.5364037751\r\n 21\r\n186435.4081769457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n68C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536431.5577923935\r\n 20\r\n186458.0969304032\r\n 30\r\n0.0\r\n 11\r\n536359.9274632249\r\n 21\r\n186452.5329107725\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n68D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536259.7350569179\r\n 20\r\n186648.932700403\r\n 30\r\n0.0\r\n 11\r\n535923.953342475\r\n 21\r\n186656.2281362882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n68E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535865.5521283698\r\n 20\r\n186582.2711223863\r\n 30\r\n0.0\r\n 11\r\n535909.5661554791\r\n 21\r\n186409.5705157149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n690\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535965.3597747557\r\n 20\r\n186727.1967157956\r\n 30\r\n0.0\r\n 11\r\n536221.8250015524\r\n 21\r\n186669.4993660018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n691\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536224.4625911634\r\n 20\r\n186797.9942541284\r\n 30\r\n0.0\r\n 11\r\n536188.9413628585\r\n 21\r\n186798.4801241541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n692\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536077.8143043649\r\n 20\r\n186671.3894402389\r\n 30\r\n0.0\r\n 11\r\n536066.1387435208\r\n 21\r\n186557.85564699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n693\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536065.5907214598\r\n 20\r\n186593.0015681029\r\n 30\r\n0.0\r\n 11\r\n536104.2679961856\r\n 21\r\n186519.1324225704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n694\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536078.5790034816\r\n 20\r\n186594.8924783798\r\n 30\r\n0.0\r\n 11\r\n536036.145709285\r\n 21\r\n186526.8956905047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n695\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535870.3023852617\r\n 20\r\n186548.0618548403\r\n 30\r\n0.0\r\n 11\r\n536048.0244747275\r\n 21\r\n186531.1691975403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n698\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536471.3175540789\r\n 20\r\n186677.4838745904\r\n 30\r\n0.0\r\n 11\r\n536426.2865221732\r\n 21\r\n186663.981426536\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n699\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536419.667447414\r\n 20\r\n186727.4520374456\r\n 30\r\n0.0\r\n 11\r\n536427.6616261824\r\n 21\r\n186662.6686232577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n69A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536459.4750142634\r\n 20\r\n186756.9634448726\r\n 30\r\n0.0\r\n 11\r\n536355.1584437736\r\n 21\r\n186755.9653690792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n69B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536373.7244359636\r\n 20\r\n186905.8589481565\r\n 30\r\n0.0\r\n 11\r\n536342.8050682326\r\n 21\r\n186608.8695139299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n69C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536410.8090196552\r\n 20\r\n186537.5587762437\r\n 30\r\n0.0\r\n 11\r\n536342.7475201335\r\n 21\r\n186527.2052244266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n69D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536338.9274579809\r\n 20\r\n186558.8178017327\r\n 30\r\n0.0\r\n 11\r\n536347.7887194486\r\n 21\r\n186499.3699253886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n69E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536346.3900426166\r\n 20\r\n186554.5312891829\r\n 30\r\n0.0\r\n 11\r\n536275.7233642788\r\n 21\r\n186544.8000770359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n69F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536277.7372782987\r\n 20\r\n186547.9247349442\r\n 30\r\n0.0\r\n 11\r\n536284.6157765886\r\n 21\r\n186492.208704432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536354.4423756366\r\n 20\r\n186505.4829200722\r\n 30\r\n0.0\r\n 11\r\n536277.790117113\r\n 21\r\n186494.0584261355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536666.4355173762\r\n 20\r\n186671.0755228247\r\n 30\r\n0.0\r\n 11\r\n536734.8141109666\r\n 21\r\n186415.4623038834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537062.3019043448\r\n 20\r\n186308.8815913478\r\n 30\r\n0.0\r\n 11\r\n536916.986542462\r\n 21\r\n186281.6576991659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536948.1379511946\r\n 20\r\n186427.4927480521\r\n 30\r\n0.0\r\n 11\r\n537117.5278129472\r\n 21\r\n185962.9589155613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536946.0645688802\r\n 20\r\n186296.4981381159\r\n 30\r\n0.0\r\n 11\r\n536885.7497561461\r\n 21\r\n186240.971373223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536886.8862156576\r\n 20\r\n186349.9138485724\r\n 30\r\n0.0\r\n 11\r\n536945.5039937727\r\n 21\r\n186284.4815586153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536902.8495839172\r\n 20\r\n186342.7321635861\r\n 30\r\n0.0\r\n 11\r\n536704.8866410933\r\n 21\r\n186323.6291257958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536874.5354492202\r\n 20\r\n186545.5129120825\r\n 30\r\n0.0\r\n 11\r\n536844.0254576235\r\n 21\r\n186028.3359139113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536705.1533220182\r\n 20\r\n186267.9304141575\r\n 30\r\n0.0\r\n 11\r\n536889.9809802655\r\n 21\r\n186241.8809322582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536709.981663896\r\n 20\r\n186328.3481346005\r\n 30\r\n0.0\r\n 11\r\n536705.7063841352\r\n 21\r\n186267.2879784899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536412.9192928441\r\n 20\r\n186313.9919186686\r\n 30\r\n0.0\r\n 11\r\n536709.0047859222\r\n 21\r\n186287.9276338956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536481.3018370568\r\n 20\r\n186311.6477386654\r\n 30\r\n0.0\r\n 11\r\n536479.0979397001\r\n 21\r\n186198.5418407067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536397.9941025675\r\n 20\r\n186206.2212083415\r\n 30\r\n0.0\r\n 11\r\n537151.7037753856\r\n 21\r\n186153.369250425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536921.4533017945\r\n 20\r\n186100.8784766501\r\n 30\r\n0.0\r\n 11\r\n536990.7057561739\r\n 21\r\n185456.6421274363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536990.9449588264\r\n 20\r\n186100.1459261849\r\n 30\r\n0.0\r\n 11\r\n536797.0798437653\r\n 21\r\n186095.0630850427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536991.7525300322\r\n 20\r\n186027.5391356223\r\n 30\r\n0.0\r\n 11\r\n536927.453918321\r\n 21\r\n186026.3840451008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537012.1160971457\r\n 20\r\n186077.9632386158\r\n 30\r\n0.0\r\n 11\r\n536979.6296599327\r\n 21\r\n186017.2846845772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536981.7743653753\r\n 20\r\n186037.6184989052\r\n 30\r\n0.0\r\n 11\r\n537010.3705357475\r\n 21\r\n185899.982918183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537181.5397072733\r\n 20\r\n185983.2719866468\r\n 30\r\n0.0\r\n 11\r\n536789.1310568708\r\n 21\r\n185874.0605159429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536788.7659944812\r\n 20\r\n185887.3708023651\r\n 30\r\n0.0\r\n 11\r\n536839.1042832833\r\n 21\r\n185653.9145358537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536606.537408161\r\n 20\r\n185943.0353610298\r\n 30\r\n0.0\r\n 11\r\n536802.3035394278\r\n 21\r\n185875.3411681474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536670.1005712944\r\n 20\r\n186002.7154141007\r\n 30\r\n0.0\r\n 11\r\n536662.3052389822\r\n 21\r\n185917.6827582823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537232.0290754295\r\n 20\r\n185868.6402924852\r\n 30\r\n0.0\r\n 11\r\n537144.0544514289\r\n 21\r\n185849.0812400903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536843.3884064661\r\n 20\r\n186072.926477007\r\n 30\r\n0.0\r\n 11\r\n536912.1023928396\r\n 21\r\n185654.4606905605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536434.4960080977\r\n 20\r\n185829.387951983\r\n 30\r\n0.0\r\n 11\r\n536473.2023786641\r\n 21\r\n185718.5216153119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536495.7944382751\r\n 20\r\n185819.5131307709\r\n 30\r\n0.0\r\n 11\r\n536440.2172746752\r\n 21\r\n185724.7672613815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536684.9813366386\r\n 20\r\n185801.8610389146\r\n 30\r\n0.0\r\n 11\r\n536482.9743639853\r\n 21\r\n185802.5047473506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536608.4166755578\r\n 20\r\n186039.5510225665\r\n 30\r\n0.0\r\n 11\r\n536622.7213326102\r\n 21\r\n185611.5270011947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536701.4510781167\r\n 20\r\n186049.6110404813\r\n 30\r\n0.0\r\n 11\r\n536581.7244930196\r\n 21\r\n186029.2883844655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536584.8095505118\r\n 20\r\n186131.3397586772\r\n 30\r\n0.0\r\n 11\r\n536701.2842243047\r\n 21\r\n186099.3807015723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536695.8073658528\r\n 20\r\n186103.3022622328\r\n 30\r\n0.0\r\n 11\r\n536700.4877755078\r\n 21\r\n186047.6631154132\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536625.3818396596\r\n 20\r\n186433.9103861764\r\n 30\r\n0.0\r\n 11\r\n536612.7518140071\r\n 21\r\n185871.4532314369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536621.5774674283\r\n 20\r\n185861.8024487344\r\n 30\r\n0.0\r\n 11\r\n536597.3037060976\r\n 21\r\n185862.5366713851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536753.379535475\r\n 20\r\n185724.7568011315\r\n 30\r\n0.0\r\n 11\r\n536746.3417123108\r\n 21\r\n185647.6619285755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536763.3900910289\r\n 20\r\n185736.6359620126\r\n 30\r\n0.0\r\n 11\r\n536749.3903401359\r\n 21\r\n185717.0616572342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536827.4117287541\r\n 20\r\n185739.7504106917\r\n 30\r\n0.0\r\n 11\r\n536755.7813995857\r\n 21\r\n185734.186391061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536655.5889932786\r\n 20\r\n185930.5861806915\r\n 30\r\n0.0\r\n 11\r\n536301.1658749766\r\n 21\r\n185909.6553059632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536416.4623950756\r\n 20\r\n186213.4497288245\r\n 30\r\n0.0\r\n 11\r\n536311.4935309209\r\n 21\r\n186038.497775686\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536290.8938687045\r\n 20\r\n186061.8000255862\r\n 30\r\n0.0\r\n 11\r\n536617.6789379133\r\n 21\r\n185951.1528462902\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536620.3165275241\r\n 20\r\n186079.647734417\r\n 30\r\n0.0\r\n 11\r\n536584.7952992191\r\n 21\r\n186080.1336044426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536471.5409159631\r\n 20\r\n185932.356697997\r\n 30\r\n0.0\r\n 11\r\n536461.9926798815\r\n 21\r\n185839.5091272786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536461.4446578205\r\n 20\r\n185874.6550483916\r\n 30\r\n0.0\r\n 11\r\n536500.1219325463\r\n 21\r\n185800.785902859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536474.4329398423\r\n 20\r\n185876.5459586684\r\n 30\r\n0.0\r\n 11\r\n536431.9996456458\r\n 21\r\n185808.5491707931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536318.7496871943\r\n 20\r\n185827.4808156863\r\n 30\r\n0.0\r\n 11\r\n536443.8784110883\r\n 21\r\n185812.8226778289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536450.5920255018\r\n 20\r\n186408.0864332379\r\n 30\r\n0.0\r\n 11\r\n536390.1276466231\r\n 21\r\n186145.4209132169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536867.1714904397\r\n 20\r\n185959.137354879\r\n 30\r\n0.0\r\n 11\r\n536822.1404585341\r\n 21\r\n185945.6349068246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536815.5213837749\r\n 20\r\n186009.1055177341\r\n 30\r\n0.0\r\n 11\r\n536823.5155625431\r\n 21\r\n185944.3221035461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536855.3289506244\r\n 20\r\n186038.6169251611\r\n 30\r\n0.0\r\n 11\r\n536751.0123801345\r\n 21\r\n186037.6188493678\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536769.5783723245\r\n 20\r\n186187.512428445\r\n 30\r\n0.0\r\n 11\r\n536738.6590045934\r\n 21\r\n185890.5229942185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536806.6629560161\r\n 20\r\n185819.2122565322\r\n 30\r\n0.0\r\n 11\r\n536738.6014564944\r\n 21\r\n185808.8587047152\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536734.7813943418\r\n 20\r\n185840.471282021\r\n 30\r\n0.0\r\n 11\r\n536743.6426558093\r\n 21\r\n185781.0234056772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536742.2439789774\r\n 20\r\n185836.1847694715\r\n 30\r\n0.0\r\n 11\r\n536671.5773006395\r\n 21\r\n185826.4535573242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536673.5912146595\r\n 20\r\n185829.5782152326\r\n 30\r\n0.0\r\n 11\r\n536680.4697129492\r\n 21\r\n185773.8621847206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536750.2963119973\r\n 20\r\n185787.1364003606\r\n 30\r\n0.0\r\n 11\r\n536673.6440534738\r\n 21\r\n185775.711906424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536553.2222514413\r\n 20\r\n186306.6114761733\r\n 30\r\n0.0\r\n 11\r\n536550.1362215744\r\n 21\r\n186193.939177168\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537062.2894537369\r\n 20\r\n185952.7290031131\r\n 30\r\n0.0\r\n 11\r\n537130.6680473274\r\n 21\r\n185697.1157841719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537784.5734153324\r\n 20\r\n185861.9936452161\r\n 30\r\n0.0\r\n 11\r\n535864.4230040797\r\n 21\r\n185456.3307235448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536363.2478164847\r\n 20\r\n185785.8285372621\r\n 30\r\n0.0\r\n 11\r\n536164.8419804048\r\n 21\r\n185674.9023051266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536354.7066451306\r\n 20\r\n185972.485684567\r\n 30\r\n0.0\r\n 11\r\n536185.7730090109\r\n 21\r\n185955.3298043531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536290.2634319545\r\n 20\r\n186424.0182927763\r\n 30\r\n0.0\r\n 11\r\n536361.4672387756\r\n 21\r\n185636.0952636998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536269.7332366472\r\n 20\r\n185890.4593593341\r\n 30\r\n0.0\r\n 11\r\n535793.3462899222\r\n 21\r\n185739.96058906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536280.0904017486\r\n 20\r\n185821.7399577195\r\n 30\r\n0.0\r\n 11\r\n536244.1610790384\r\n 21\r\n186012.3143575776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536208.5412910284\r\n 20\r\n185809.3656713885\r\n 30\r\n0.0\r\n 11\r\n536197.1486584764\r\n 21\r\n185872.657484648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536261.5672213085\r\n 20\r\n185797.3026806227\r\n 30\r\n0.0\r\n 11\r\n536196.4850589806\r\n 21\r\n185819.6983871253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536216.9006975449\r\n 20\r\n185820.8233176042\r\n 30\r\n0.0\r\n 11\r\n535801.6962948423\r\n 21\r\n185660.6602255008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536197.4579107648\r\n 20\r\n185611.9391870522\r\n 30\r\n0.0\r\n 11\r\n536024.7185410833\r\n 21\r\n185984.9229118754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536037.8003302407\r\n 20\r\n185987.4056095272\r\n 30\r\n0.0\r\n 11\r\n535815.3572137982\r\n 21\r\n185900.4870750231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536063.6966472942\r\n 20\r\n186176.1784400052\r\n 30\r\n0.0\r\n 11\r\n536028.0831420887\r\n 21\r\n185972.1231530161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536132.7482219166\r\n 20\r\n186122.944386203\r\n 30\r\n0.0\r\n 11\r\n536047.5604990329\r\n 21\r\n186117.0816537993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536069.9974182161\r\n 20\r\n185220.2754154892\r\n 30\r\n0.0\r\n 11\r\n535816.5024649587\r\n 21\r\n185903.3706867481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536229.6915143036\r\n 20\r\n185963.0686055666\r\n 30\r\n0.0\r\n 11\r\n535827.5358233733\r\n 21\r\n185828.5099692703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535834.0177546548\r\n 20\r\n186166.9563758262\r\n 30\r\n0.0\r\n 11\r\n535831.6474460902\r\n 21\r\n185822.8754476268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535817.4316180108\r\n 20\r\n186521.407981259\r\n 30\r\n0.0\r\n 11\r\n535837.1688361796\r\n 21\r\n186020.0815070079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535936.8362455865\r\n 20\r\n186076.2280642266\r\n 30\r\n0.0\r\n 11\r\n535905.2620010249\r\n 21\r\n186275.7532467011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536125.7083849122\r\n 20\r\n186183.0401472969\r\n 30\r\n0.0\r\n 11\r\n535831.8734352128\r\n 21\r\n186118.321074803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536160.7993853049\r\n 20\r\n186267.2245388372\r\n 30\r\n0.0\r\n 11\r\n536154.3770119736\r\n 21\r\n186145.9553397494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536255.3969228534\r\n 20\r\n186160.7532505492\r\n 30\r\n0.0\r\n 11\r\n536210.2581796578\r\n 21\r\n186272.7810365171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536214.7834336409\r\n 20\r\n186267.7913779211\r\n 30\r\n0.0\r\n 11\r\n536158.9751333219\r\n 21\r\n186266.0436625988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536551.2962527581\r\n 20\r\n186235.8444073774\r\n 30\r\n0.0\r\n 11\r\n536551.2839351317\r\n 21\r\n186235.84270068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536406.3186160096\r\n 20\r\n186215.75669558\r\n 30\r\n0.0\r\n 11\r\n535994.0212001858\r\n 21\r\n186158.6298734732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535985.9011248552\r\n 20\r\n186148.3783300915\r\n 30\r\n0.0\r\n 11\r\n535982.7555381509\r\n 21\r\n186172.4586094986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535871.6244540257\r\n 20\r\n185996.4107770663\r\n 30\r\n0.0\r\n 11\r\n535826.3290506108\r\n 21\r\n185994.8411902611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535884.9478042856\r\n 20\r\n185988.4224090485\r\n 30\r\n0.0\r\n 11\r\n535863.3916885597\r\n 21\r\n185999.1219561155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535898.2305643401\r\n 20\r\n185925.7164430408\r\n 30\r\n0.0\r\n 11\r\n535881.3163777869\r\n 21\r\n185995.543176206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536059.2279425693\r\n 20\r\n186125.769405381\r\n 30\r\n0.0\r\n 11\r\n535994.0245275108\r\n 21\r\n186470.9334808305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536093.2954599856\r\n 20\r\n186458.4035292444\r\n 30\r\n0.0\r\n 11\r\n536073.4867800939\r\n 21\r\n186166.4737735018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536200.7582953935\r\n 20\r\n186184.3582513239\r\n 30\r\n0.0\r\n 11\r\n536195.5741412019\r\n 21\r\n186219.5025008576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535897.5531420586\r\n 20\r\n186494.1360598406\r\n 30\r\n0.0\r\n 11\r\n535909.2141336433\r\n 21\r\n186315.9941943792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536121.1503608934\r\n 20\r\n185921.4462868624\r\n 30\r\n0.0\r\n 11\r\n536100.6405274615\r\n 21\r\n185963.7482569175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n6FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536162.2437088341\r\n 20\r\n185980.402945287\r\n 30\r\n0.0\r\n 11\r\n536099.5637782036\r\n 21\r\n185962.1814210873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n700\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536197.7248129734\r\n 20\r\n185945.8102177876\r\n 30\r\n0.0\r\n 11\r\n536180.1063811039\r\n 21\r\n186048.6330454697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n701\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536331.0425782463\r\n 20\r\n186054.2048949611\r\n 30\r\n0.0\r\n 11\r\n536032.9227071588\r\n 21\r\n186037.3741550549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n702\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535973.3674328742\r\n 20\r\n185958.8698365539\r\n 30\r\n0.0\r\n 11\r\n535952.2940349445\r\n 21\r\n186024.4097148881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n703\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535982.8930652049\r\n 20\r\n186033.2214834902\r\n 30\r\n0.0\r\n 11\r\n535925.6186659056\r\n 21\r\n186014.9947135762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n704\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535979.8512915146\r\n 20\r\n186025.1708951824\r\n 30\r\n0.0\r\n 11\r\n535958.9768792235\r\n 21\r\n186093.3818534568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n705\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535962.3826766682\r\n 20\r\n186091.8919271197\r\n 30\r\n0.0\r\n 11\r\n535908.4762301635\r\n 21\r\n186076.2175907711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n706\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535932.7143681951\r\n 20\r\n186009.4008907609\r\n 30\r\n0.0\r\n 11\r\n535909.2139455117\r\n 21\r\n186083.2508598345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n707\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536145.9352710763\r\n 20\r\n185727.8028134352\r\n 30\r\n0.0\r\n 11\r\n535904.4951732374\r\n 21\r\n185619.541883666\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n708\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536656.4544441961\r\n 20\r\n187136.1251621236\r\n 30\r\n0.0\r\n 11\r\n537180.346752627\r\n 21\r\n187503.3080437654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n709\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536515.4172762577\r\n 20\r\n187784.5523831475\r\n 30\r\n0.0\r\n 11\r\n537317.0023862222\r\n 21\r\n185624.0405922396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n70A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536777.6597608433\r\n 20\r\n187067.7809166893\r\n 30\r\n0.0\r\n 11\r\n536906.3904576726\r\n 21\r\n187140.4865038101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n70B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536788.6769991006\r\n 20\r\n187232.0387480244\r\n 30\r\n0.0\r\n 11\r\n536958.0668608531\r\n 21\r\n186767.5049155334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n70C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536874.5848913998\r\n 20\r\n187133.126055273\r\n 30\r\n0.0\r\n 11\r\n536956.4850630701\r\n 21\r\n187129.4572496127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n70D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536885.4891276186\r\n 20\r\n187212.0970198499\r\n 30\r\n0.0\r\n 11\r\n536882.7489547515\r\n 21\r\n187124.2908701058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n70E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536876.2998669652\r\n 20\r\n187195.4453712998\r\n 30\r\n0.0\r\n 11\r\n537040.0932225991\r\n 21\r\n187308.2548985325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n70F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536827.560160896\r\n 20\r\n187307.9410842041\r\n 30\r\n0.0\r\n 11\r\n537125.289121818\r\n 21\r\n186993.5898679707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n710\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537077.3380654208\r\n 20\r\n187266.3382699572\r\n 30\r\n0.0\r\n 11\r\n536952.6615164215\r\n 21\r\n187127.4296781066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n711\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537034.7521778992\r\n 20\r\n187309.4666366411\r\n 30\r\n0.0\r\n 11\r\n537077.3283545836\r\n 21\r\n187265.49062204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n712\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537271.3286449298\r\n 20\r\n187489.6990656824\r\n 30\r\n0.0\r\n 11\r\n537061.5184214732\r\n 21\r\n187279.1625218589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n713\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537220.5059177099\r\n 20\r\n187443.88729939\r\n 30\r\n0.0\r\n 11\r\n537294.9987336095\r\n 21\r\n187358.7484616252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n714\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537352.1225316942\r\n 20\r\n187416.831822214\r\n 30\r\n0.0\r\n 11\r\n536770.3320429272\r\n 21\r\n186853.4430962436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n715\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537019.3396568531\r\n 20\r\n186999.2648424513\r\n 30\r\n0.0\r\n 11\r\n537251.2580226249\r\n 21\r\n186626.306883402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n716\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536966.6307444098\r\n 20\r\n186953.9724857423\r\n 30\r\n0.0\r\n 11\r\n537118.2633265551\r\n 21\r\n187074.8735946857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n717\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537012.7496896793\r\n 20\r\n186897.8882536064\r\n 30\r\n0.0\r\n 11\r\n537062.6995511437\r\n 21\r\n186938.3932785016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n718\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536964.7079194511\r\n 20\r\n186923.3687037914\r\n 30\r\n0.0\r\n 11\r\n537028.6278447282\r\n 21\r\n186897.8442316993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n719\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537013.8976801362\r\n 20\r\n186912.0247118622\r\n 30\r\n0.0\r\n 11\r\n537205.2581714437\r\n 21\r\n186557.0905487869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n71A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536896.0044335675\r\n 20\r\n186741.8456366742\r\n 30\r\n0.0\r\n 11\r\n537266.6056255017\r\n 21\r\n186910.8617624756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n71B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537258.3171737836\r\n 20\r\n186921.2828259197\r\n 30\r\n0.0\r\n 11\r\n537370.0700804652\r\n 21\r\n186710.2210824861\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n71C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537361.9414964869\r\n 20\r\n187081.1821708461\r\n 30\r\n0.0\r\n 11\r\n537255.7006555645\r\n 21\r\n186903.3626960374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n71D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537274.8819629169\r\n 20\r\n187085.9384358377\r\n 30\r\n0.0\r\n 11\r\n537335.5830477656\r\n 21\r\n187025.8826446133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n71E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536958.9961435952\r\n 20\r\n186565.5135013908\r\n 30\r\n0.0\r\n 11\r\n537038.9113655967\r\n 21\r\n186607.1746138472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n71F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536957.6237427116\r\n 20\r\n186485.1227390502\r\n 30\r\n0.0\r\n 11\r\n537371.0851352754\r\n 21\r\n186713.1530580203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n720\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537097.0737156445\r\n 20\r\n187028.1241264085\r\n 30\r\n0.0\r\n 11\r\n537313.8546541034\r\n 21\r\n186663.650188972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n721\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537553.1330599754\r\n 20\r\n186913.1132527656\r\n 30\r\n0.0\r\n 11\r\n537307.0616539335\r\n 21\r\n186662.0663884133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n722\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537799.5835817962\r\n 20\r\n187209.4810507865\r\n 30\r\n0.0\r\n 11\r\n537635.4473220064\r\n 21\r\n187033.5368753194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n723\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537031.5442058048\r\n 20\r\n187444.7080065458\r\n 30\r\n0.0\r\n 11\r\n537403.263134856\r\n 21\r\n187022.4017121923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n724\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537402.7212590529\r\n 20\r\n187009.3351083603\r\n 30\r\n0.0\r\n 11\r\n537420.8248222389\r\n 21\r\n187025.5220034305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n725\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537390.0722291867\r\n 20\r\n186819.6161142883\r\n 30\r\n0.0\r\n 11\r\n537434.9476668381\r\n 21\r\n186776.2380761014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n726\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537374.7647574835\r\n 20\r\n186822.2631873493\r\n 30\r\n0.0\r\n 11\r\n537398.078434724\r\n 21\r\n186816.2950313399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n727\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537323.7656201309\r\n 20\r\n186783.4359047135\r\n 30\r\n0.0\r\n 11\r\n537382.1643115266\r\n 21\r\n186825.2862955662\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n728\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537502.3608783106\r\n 20\r\n187480.7089753924\r\n 30\r\n0.0\r\n 11\r\n537713.225832049\r\n 21\r\n187395.0985889557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n729\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537333.3361530685\r\n 20\r\n187410.4756193646\r\n 30\r\n0.0\r\n 11\r\n537532.0891822454\r\n 21\r\n187493.0617158058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n72A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537278.6197715838\r\n 20\r\n187627.3482159066\r\n 30\r\n0.0\r\n 11\r\n537166.0865990719\r\n 21\r\n187491.2134684705\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n72B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537197.2669548719\r\n 20\r\n187546.6372350203\r\n 30\r\n0.0\r\n 11\r\n537397.2796850536\r\n 21\r\n187375.3663122469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n72C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537152.1190506236\r\n 20\r\n186925.7346225763\r\n 30\r\n0.0\r\n 11\r\n537195.271841091\r\n 21\r\n186944.3879497008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n72D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537159.4812683694\r\n 20\r\n186997.2213246088\r\n 30\r\n0.0\r\n 11\r\n537195.0645548211\r\n 21\r\n186942.4981359836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n72E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537110.0209214624\r\n 20\r\n186994.1816485354\r\n 30\r\n0.0\r\n 11\r\n537190.4945867636\r\n 21\r\n187060.5663774045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n72F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537079.7999997003\r\n 20\r\n187163.3257541517\r\n 30\r\n0.0\r\n 11\r\n537294.6338995522\r\n 21\r\n186955.9489791322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n730\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537288.4946466848\r\n 20\r\n186857.6023051026\r\n 30\r\n0.0\r\n 11\r\n537347.2452102594\r\n 21\r\n186893.4901168504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n731\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537329.8196174723\r\n 20\r\n186920.1415077109\r\n 30\r\n0.0\r\n 11\r\n537361.3048608085\r\n 21\r\n186868.9433494563\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n732\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537326.8678900417\r\n 20\r\n186912.0574700774\r\n 30\r\n0.0\r\n 11\r\n537387.2115405508\r\n 21\r\n186950.0984974087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n733\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537383.6589948769\r\n 20\r\n186951.1933745518\r\n 30\r\n0.0\r\n 11\r\n537414.259416117\r\n 21\r\n186904.1274206714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n734\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537352.2780301041\r\n 20\r\n186869.3385356161\r\n 30\r\n0.0\r\n 11\r\n537418.292279855\r\n 21\r\n186909.9366467582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n735\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537012.3990757676\r\n 20\r\n186374.590466218\r\n 30\r\n0.0\r\n 11\r\n537201.1498642903\r\n 21\r\n186504.5889459221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n736\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537056.5950085385\r\n 20\r\n186425.7206142945\r\n 30\r\n0.0\r\n 11\r\n537284.7500739119\r\n 21\r\n186189.0438679987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n737\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537236.7990175147\r\n 20\r\n186461.792269985\r\n 30\r\n0.0\r\n 11\r\n537112.1224685155\r\n 21\r\n186322.8836781344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n738\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537194.2131299931\r\n 20\r\n186504.9206366692\r\n 30\r\n0.0\r\n 11\r\n537236.7893066778\r\n 21\r\n186460.944622068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n739\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537430.7895970239\r\n 20\r\n186685.1530657104\r\n 30\r\n0.0\r\n 11\r\n537220.9793735673\r\n 21\r\n186474.6165218867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n73A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537433.9827303069\r\n 20\r\n186541.0103316215\r\n 30\r\n0.0\r\n 11\r\n536968.8066354515\r\n 21\r\n186086.6767533849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n73B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537178.8006089473\r\n 20\r\n186194.7188424793\r\n 30\r\n0.0\r\n 11\r\n537318.9589671305\r\n 21\r\n185969.3241220662\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n73C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537126.0916965039\r\n 20\r\n186149.4264857703\r\n 30\r\n0.0\r\n 11\r\n537277.724278649\r\n 21\r\n186270.3275947137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n73D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537172.2106417733\r\n 20\r\n186093.3422536341\r\n 30\r\n0.0\r\n 11\r\n537222.1605032379\r\n 21\r\n186133.8472785297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n73E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537124.1688715451\r\n 20\r\n186118.8227038192\r\n 30\r\n0.0\r\n 11\r\n537188.0887968223\r\n 21\r\n186093.2982317269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n73F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537173.3586322302\r\n 20\r\n186107.4787118903\r\n 30\r\n0.0\r\n 11\r\n537364.7191235379\r\n 21\r\n185752.5445488149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n740\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537155.5330697457\r\n 20\r\n185983.0593038168\r\n 30\r\n0.0\r\n 11\r\n537426.066577596\r\n 21\r\n186106.3157625034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n741\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537417.7781258776\r\n 20\r\n186116.7368259474\r\n 30\r\n0.0\r\n 11\r\n537529.5310325594\r\n 21\r\n185905.6750825138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n742\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537503.9215296564\r\n 20\r\n186247.3776691965\r\n 30\r\n0.0\r\n 11\r\n537415.1616076585\r\n 21\r\n186098.816696065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n743\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537276.0178131017\r\n 20\r\n186420.2443479916\r\n 30\r\n0.0\r\n 11\r\n537495.0439998595\r\n 21\r\n186221.3366446411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n744\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537256.5346677385\r\n 20\r\n186223.5781264364\r\n 30\r\n0.0\r\n 11\r\n537473.3156061973\r\n 21\r\n185859.104189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n745\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537826.3898014322\r\n 20\r\n186263.1340956899\r\n 30\r\n0.0\r\n 11\r\n537506.7061623534\r\n 21\r\n186088.9441168782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n746\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537726.2167847417\r\n 20\r\n186300.4072588124\r\n 30\r\n0.0\r\n 11\r\n537767.9602569887\r\n 21\r\n186190.6483855762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n747\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537685.6628467619\r\n 20\r\n186253.3924978269\r\n 30\r\n0.0\r\n 11\r\n537789.1827203455\r\n 21\r\n186216.6605409855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n748\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537191.005157899\r\n 20\r\n186640.1620065737\r\n 30\r\n0.0\r\n 11\r\n537397.7097547258\r\n 21\r\n186397.5140548614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n749\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537376.1880186199\r\n 20\r\n186413.0837926604\r\n 30\r\n0.0\r\n 11\r\n537776.5833744317\r\n 21\r\n186447.6586735969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537663.9550437875\r\n 20\r\n186459.7391990096\r\n 30\r\n0.0\r\n 11\r\n537680.1027461536\r\n 21\r\n186293.6964840227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537676.4551569747\r\n 20\r\n186317.7023488992\r\n 30\r\n0.0\r\n 11\r\n537694.4058185397\r\n 21\r\n186236.2753509728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537665.2983288273\r\n 20\r\n186310.7888695116\r\n 30\r\n0.0\r\n 11\r\n537741.541111767\r\n 21\r\n186286.0666999599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537816.0225515165\r\n 20\r\n186373.4536291914\r\n 30\r\n0.0\r\n 11\r\n537729.6996959669\r\n 21\r\n186281.6907654688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537341.3908721648\r\n 20\r\n186732.9116298796\r\n 30\r\n0.0\r\n 11\r\n537460.6349338569\r\n 21\r\n186643.1579815403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n74F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537311.5800027175\r\n 20\r\n186121.188622604\r\n 30\r\n0.0\r\n 11\r\n537354.732793185\r\n 21\r\n186139.8419497287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n750\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537318.9422204634\r\n 20\r\n186192.6753246367\r\n 30\r\n0.0\r\n 11\r\n537354.5255069153\r\n 21\r\n186137.9521360115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n751\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537269.4818735563\r\n 20\r\n186189.6356485634\r\n 30\r\n0.0\r\n 11\r\n537349.9555388575\r\n 21\r\n186256.0203774324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n752\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537239.2609517944\r\n 20\r\n186358.7797541795\r\n 30\r\n0.0\r\n 11\r\n537454.0948516461\r\n 21\r\n186151.40297916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n753\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537447.955598779\r\n 20\r\n186053.0563051304\r\n 30\r\n0.0\r\n 11\r\n537506.7061623534\r\n 21\r\n186088.9441168782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n754\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537486.2387035479\r\n 20\r\n186250.673700184\r\n 30\r\n0.0\r\n 11\r\n537520.7658129026\r\n 21\r\n186064.3973494842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n755\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537328.1695798477\r\n 20\r\n186589.1920152922\r\n 30\r\n0.0\r\n 11\r\n537403.0583651141\r\n 21\r\n186504.9528297262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n756\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537781.9530081804\r\n 20\r\n186249.6157882923\r\n 30\r\n0.0\r\n 11\r\n538347.5629563361\r\n 21\r\n186352.7088830488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n757\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537808.7806551505\r\n 20\r\n186312.9346177544\r\n 30\r\n0.0\r\n 11\r\n538032.0195007378\r\n 21\r\n186355.7589401335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n758\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537695.1658971131\r\n 20\r\n186461.2772245947\r\n 30\r\n0.0\r\n 11\r\n537835.4903706611\r\n 21\r\n186556.8907161218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n759\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537634.8336085112\r\n 20\r\n186588.0147797442\r\n 30\r\n0.0\r\n 11\r\n538187.0293206833\r\n 21\r\n185797.4692952484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537812.9945125742\r\n 20\r\n186453.201609507\r\n 30\r\n0.0\r\n 11\r\n538218.1599829396\r\n 21\r\n186622.6852642468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537849.3030504672\r\n 20\r\n186393.945241889\r\n 30\r\n0.0\r\n 11\r\n537754.1263155464\r\n 21\r\n186562.9153790184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537912.0233530926\r\n 20\r\n186430.531603359\r\n 30\r\n0.0\r\n 11\r\n537880.0009723833\r\n 21\r\n186486.3008855473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537879.2087033646\r\n 20\r\n186387.1672886349\r\n 30\r\n0.0\r\n 11\r\n537914.5985604886\r\n 21\r\n186446.1995978881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537898.2507986851\r\n 20\r\n186433.9189443802\r\n 30\r\n0.0\r\n 11\r\n538279.1561711739\r\n 21\r\n186566.2374803479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n75F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538047.4547373327\r\n 20\r\n186290.3991899553\r\n 30\r\n0.0\r\n 11\r\n537939.6927833727\r\n 21\r\n186683.2083745763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n760\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537928.0834629505\r\n 20\r\n186676.6875866997\r\n 30\r\n0.0\r\n 11\r\n538154.263771468\r\n 21\r\n186753.3572660519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n761\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537786.7525790449\r\n 20\r\n186804.481882418\r\n 30\r\n0.0\r\n 11\r\n537945.3571269888\r\n 21\r\n186671.247204977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n762\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537768.1756487449\r\n 20\r\n186719.2945470756\r\n 30\r\n0.0\r\n 11\r\n537837.1418002041\r\n 21\r\n186769.6432284317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n763\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538310.7182931293\r\n 20\r\n186310.2960644154\r\n 30\r\n0.0\r\n 11\r\n538151.5311559336\r\n 21\r\n186754.8268337236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n764\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537796.8990297919\r\n 20\r\n186534.5427282644\r\n 30\r\n0.0\r\n 11\r\n538191.2753803375\r\n 21\r\n186690.4353851786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n765\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537878.7102166998\r\n 20\r\n187051.9664409037\r\n 30\r\n0.0\r\n 11\r\n538191.7557841509\r\n 21\r\n186683.4767583245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n766\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537774.1933872137\r\n 20\r\n187223.955343289\r\n 30\r\n0.0\r\n 11\r\n538060.5889229859\r\n 21\r\n186830.8401531596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n767\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537795.9429602493\r\n 20\r\n187010.4661386416\r\n 30\r\n0.0\r\n 11\r\n537910.9535407448\r\n 21\r\n187034.1746624962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n768\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537835.8899593667\r\n 20\r\n186962.9346028185\r\n 30\r\n0.0\r\n 11\r\n537888.6580694558\r\n 21\r\n187059.2732110594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n769\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537948.1741042493\r\n 20\r\n186809.6520217234\r\n 30\r\n0.0\r\n 11\r\n537843.9029074889\r\n 21\r\n186982.6686362065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537734.8794656979\r\n 20\r\n186769.8160672527\r\n 30\r\n0.0\r\n 11\r\n538001.4046078766\r\n 21\r\n186909.4294068588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537676.3851448579\r\n 20\r\n186854.8587612249\r\n 30\r\n0.0\r\n 11\r\n537393.6749490265\r\n 21\r\n186911.1355924097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537375.1962385819\r\n 20\r\n186536.2752800831\r\n 30\r\n0.0\r\n 11\r\n537375.2067635943\r\n 21\r\n186536.2819028361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537627.9359291571\r\n 20\r\n186708.8472713734\r\n 30\r\n0.0\r\n 11\r\n537851.369689718\r\n 21\r\n186835.902403186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537864.1827212604\r\n 20\r\n186833.2840090631\r\n 30\r\n0.0\r\n 11\r\n537851.0895042071\r\n 21\r\n186853.7369364632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n76F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538049.4576268318\r\n 20\r\n186790.5463905774\r\n 30\r\n0.0\r\n 11\r\n538085.1315570698\r\n 21\r\n186818.5018529167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n770\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538044.4036657193\r\n 20\r\n186775.8568309237\r\n 30\r\n0.0\r\n 11\r\n538054.0127984559\r\n 21\r\n186797.9206248104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n771\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538074.6024632878\r\n 20\r\n186719.3192105897\r\n 30\r\n0.0\r\n 11\r\n538042.5990825349\r\n 21\r\n186783.6437470564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n772\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537822.6206570225\r\n 20\r\n186768.7814471842\r\n 30\r\n0.0\r\n 11\r\n537650.3374365978\r\n 21\r\n187074.8994248929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n773\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537647.1135840797\r\n 20\r\n186930.989357222\r\n 30\r\n0.0\r\n 11\r\n537785.5072931152\r\n 21\r\n186790.7532074953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n774\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537668.1921883292\r\n 20\r\n186397.4483159966\r\n 30\r\n0.0\r\n 11\r\n537658.8538896595\r\n 21\r\n187097.8055382497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n775\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537726.6033647893\r\n 20\r\n186925.8085438502\r\n 30\r\n0.0\r\n 11\r\n537801.3756717691\r\n 21\r\n186981.6739384116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n776\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537770.9347203141\r\n 20\r\n186964.0988260768\r\n 30\r\n0.0\r\n 11\r\n537854.1821676819\r\n 21\r\n186968.8364149881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n777\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537775.9808103146\r\n 20\r\n186951.9823914832\r\n 30\r\n0.0\r\n 11\r\n537812.5434910686\r\n 21\r\n187023.3078286975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n778\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537709.2294004969\r\n 20\r\n187154.7544464749\r\n 30\r\n0.0\r\n 11\r\n537814.9753444068\r\n 21\r\n187010.9201727383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n779\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537906.755485458\r\n 20\r\n186572.5579692403\r\n 30\r\n0.0\r\n 11\r\n537895.2214540916\r\n 21\r\n186618.1329191403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537837.3572619683\r\n 20\r\n186591.2244470575\r\n 30\r\n0.0\r\n 11\r\n537897.0540384935\r\n 21\r\n186617.6269567964\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537660.6728702619\r\n 20\r\n186539.0477106908\r\n 30\r\n0.0\r\n 11\r\n537899.6514691774\r\n 21\r\n186718.0671526615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537995.7610246206\r\n 20\r\n186696.325209994\r\n 30\r\n0.0\r\n 11\r\n537929.2028703271\r\n 21\r\n186849.182053773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538012.4363585128\r\n 20\r\n186408.4127906819\r\n 30\r\n0.0\r\n 11\r\n538266.8927353087\r\n 21\r\n186480.9779480708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537245.604479096\r\n 20\r\n187219.2811807284\r\n 30\r\n0.0\r\n 11\r\n537128.0087242979\r\n 21\r\n187101.6271531425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n77F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537295.2785441242\r\n 20\r\n187305.4625369827\r\n 30\r\n0.0\r\n 11\r\n537127.6708426229\r\n 21\r\n187382.6557244311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n780\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537853.8333755165\r\n 20\r\n186584.479558069\r\n 30\r\n0.0\r\n 11\r\n537801.7029996276\r\n 21\r\n186689.4205773728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n781\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536899.7243153653\r\n 20\r\n186743.5421234196\r\n 30\r\n0.0\r\n 11\r\n536800.9662122712\r\n 21\r\n186571.7543786009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n783\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535586.4734308382\r\n 20\r\n184394.1960974984\r\n 30\r\n0.0\r\n 11\r\n535561.5356189229\r\n 21\r\n184248.4710130359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n784\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535435.5965996541\r\n 20\r\n184328.331110552\r\n 30\r\n0.0\r\n 11\r\n535930.0442095312\r\n 21\r\n184325.8475888641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n785\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535557.7175357064\r\n 20\r\n184280.8931118137\r\n 30\r\n0.0\r\n 11\r\n535588.8411184842\r\n 21\r\n184205.0483964429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n786\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535487.0743208422\r\n 20\r\n184243.9492109997\r\n 30\r\n0.0\r\n 11\r\n535568.7914733332\r\n 21\r\n184276.1941403529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n787\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535499.6421604393\r\n 20\r\n184258.2239901103\r\n 30\r\n0.0\r\n 11\r\n535448.8047659976\r\n 21\r\n184065.9486351876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n788\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535377.2944345197\r\n 20\r\n184266.0902682582\r\n 30\r\n0.0\r\n 11\r\n535773.7507343056\r\n 21\r\n184092.074109011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n789\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535500.8400115718\r\n 20\r\n184045.0556869529\r\n 30\r\n0.0\r\n 11\r\n535589.4576535479\r\n 21\r\n184209.3321377636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535445.8597739096\r\n 20\r\n184070.5662199818\r\n 30\r\n0.0\r\n 11\r\n535501.6345348921\r\n 21\r\n184045.3512101935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535356.1543586029\r\n 20\r\n183787.0083040362\r\n 30\r\n0.0\r\n 11\r\n535483.4250856285\r\n 21\r\n184055.6123401087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535382.1014906933\r\n 20\r\n183850.3203397732\r\n 30\r\n0.0\r\n 11\r\n535487.4018487683\r\n 21\r\n183808.9725961122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535452.0335797415\r\n 20\r\n183735.5839687168\r\n 30\r\n0.0\r\n 11\r\n535786.827845811\r\n 21\r\n184479.9884451362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535732.6137383202\r\n 20\r\n184189.8761643216\r\n 30\r\n0.0\r\n 11\r\n536161.9960217083\r\n 21\r\n184097.6014531979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n78F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535757.4347432706\r\n 20\r\n184254.7879871313\r\n 30\r\n0.0\r\n 11\r\n535694.8729741883\r\n 21\r\n184071.2245290002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n790\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535825.8026772756\r\n 20\r\n184230.3293729652\r\n 30\r\n0.0\r\n 11\r\n535804.5553340466\r\n 21\r\n184169.6317938717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n791\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535785.5893105132\r\n 20\r\n184266.9374343987\r\n 30\r\n0.0\r\n 11\r\n535831.2086497067\r\n 21\r\n184215.3997645391\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n792\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535812.8853327367\r\n 20\r\n184224.4727916954\r\n 30\r\n0.0\r\n 11\r\n536211.6009178603\r\n 21\r\n184164.2815968987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n793\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535933.2264621044\r\n 20\r\n184392.9297529669\r\n 30\r\n0.0\r\n 11\r\n535899.3589393718\r\n 21\r\n183987.0175886406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n794\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535886.7503514801\r\n 20\r\n183991.2978347278\r\n 30\r\n0.0\r\n 11\r\n536123.1576136287\r\n 21\r\n183957.4248647315\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n795\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535771.2636298454\r\n 20\r\n183839.7438249173\r\n 30\r\n0.0\r\n 11\r\n535902.732726932\r\n 21\r\n183999.8149291566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n796\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535737.3734085965\r\n 20\r\n183920.0771140679\r\n 30\r\n0.0\r\n 11\r\n535814.406036274\r\n 21\r\n183883.2356424019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n797\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536201.106608945\r\n 20\r\n184618.9043009928\r\n 30\r\n0.0\r\n 11\r\n536031.6290369863\r\n 21\r\n184315.407156295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n798\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536195.6719275892\r\n 20\r\n184421.6693262116\r\n 30\r\n0.0\r\n 11\r\n536120.7409882194\r\n 21\r\n183955.4789103561\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n799\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535731.7144123902\r\n 20\r\n184106.9627553966\r\n 30\r\n0.0\r\n 11\r\n536147.9972755684\r\n 21\r\n184026.0689721152\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535907.0643571541\r\n 20\r\n183613.3305384817\r\n 30\r\n0.0\r\n 11\r\n536147.1928850759\r\n 21\r\n184032.9976250471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535798.3692882026\r\n 20\r\n183384.4895215734\r\n 30\r\n0.0\r\n 11\r\n536045.2878480483\r\n 21\r\n183864.0713718078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535818.0882093698\r\n 20\r\n183638.9418436739\r\n 30\r\n0.0\r\n 11\r\n535935.4963047334\r\n 21\r\n183636.7357447668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535848.6369751698\r\n 20\r\n183692.9953592331\r\n 30\r\n0.0\r\n 11\r\n535918.1838751691\r\n 21\r\n183607.9728352728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535930.8938513525\r\n 20\r\n183864.276079631\r\n 30\r\n0.0\r\n 11\r\n535860.13435468\r\n 21\r\n183675.0663415311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n79F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535681.4081269931\r\n 20\r\n183875.025451509\r\n 30\r\n0.0\r\n 11\r\n536001.5261799184\r\n 21\r\n183775.9579769436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535704.284593427\r\n 20\r\n183965.7628269584\r\n 30\r\n0.0\r\n 11\r\n535681.7619388092\r\n 21\r\n183846.4305364603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535587.1340509217\r\n 20\r\n183884.7654212547\r\n 30\r\n0.0\r\n 11\r\n535657.5548369951\r\n 21\r\n183982.8910746541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535651.975287795\r\n 20\r\n183979.1170519671\r\n 30\r\n0.0\r\n 11\r\n535705.7767228348\r\n 21\r\n183964.1829808213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535317.4870858738\r\n 20\r\n184027.8933693026\r\n 30\r\n0.0\r\n 11\r\n535840.5484441047\r\n 21\r\n183820.7113623827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535852.6636240436\r\n 20\r\n183825.6360126378\r\n 30\r\n0.0\r\n 11\r\n535843.5449650507\r\n 21\r\n183803.1281333459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536026.9531291101\r\n 20\r\n183901.6390592341\r\n 30\r\n0.0\r\n 11\r\n536067.1503137992\r\n 21\r\n183880.7028820203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536019.289980287\r\n 20\r\n183915.1520839083\r\n 30\r\n0.0\r\n 11\r\n536032.7838736293\r\n 21\r\n183895.2256874684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536038.6037317582\r\n 20\r\n183976.2704026984\r\n 30\r\n0.0\r\n 11\r\n536018.9446260733\r\n 21\r\n183907.1662643642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535799.9732583504\r\n 20\r\n183881.4187253341\r\n 30\r\n0.0\r\n 11\r\n535665.7081056945\r\n 21\r\n183468.3446960213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535655.1711830809\r\n 20\r\n183498.3053767629\r\n 30\r\n0.0\r\n 11\r\n535854.5755331281\r\n 21\r\n183470.8787938838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535451.6689210649\r\n 20\r\n183755.4131482404\r\n 30\r\n0.0\r\n 11\r\n535684.6932673409\r\n 21\r\n183477.412754533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535551.9427449507\r\n 20\r\n183521.0592219379\r\n 30\r\n0.0\r\n 11\r\n535767.5207965271\r\n 21\r\n183853.0110194557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535647.9399360763\r\n 20\r\n183900.109968144\r\n 30\r\n0.0\r\n 11\r\n535635.1479909715\r\n 21\r\n183866.968455348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535734.3941103009\r\n 20\r\n183709.4413871868\r\n 30\r\n0.0\r\n 11\r\n535818.1464496484\r\n 21\r\n183668.2420442983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535784.997818753\r\n 20\r\n183679.9341086515\r\n 30\r\n0.0\r\n 11\r\n535867.701463327\r\n 21\r\n183690.5496357759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535787.7353612302\r\n 20\r\n183692.7706530751\r\n 30\r\n0.0\r\n 11\r\n535836.7629337048\r\n 21\r\n183629.3636758962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535759.317802778\r\n 20\r\n183481.1939545241\r\n 30\r\n0.0\r\n 11\r\n535836.8808525597\r\n 21\r\n183641.9872263462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535229.0626630619\r\n 20\r\n183733.640242334\r\n 30\r\n0.0\r\n 11\r\n535319.1722889316\r\n 21\r\n183885.5502146886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535277.5420608356\r\n 20\r\n183837.4780543974\r\n 30\r\n0.0\r\n 11\r\n535506.3174597182\r\n 21\r\n183707.0915593584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535846.6805967275\r\n 20\r\n184089.7471852094\r\n 30\r\n0.0\r\n 11\r\n535843.7035839816\r\n 21\r\n184042.8297328804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535781.8848576137\r\n 20\r\n184058.6656310285\r\n 30\r\n0.0\r\n 11\r\n535845.4122390982\r\n 21\r\n184043.6633162154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535768.0352899427\r\n 20\r\n184106.2445656752\r\n 30\r\n0.0\r\n 11\r\n535732.7426991815\r\n 21\r\n184008.0744272857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535598.6269255083\r\n 20\r\n184077.5419763038\r\n 30\r\n0.0\r\n 11\r\n535866.3924957366\r\n 21\r\n183945.4044315131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535956.8819629148\r\n 20\r\n183984.4097522817\r\n 30\r\n0.0\r\n 11\r\n535942.9537047379\r\n 21\r\n183916.9889292629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535911.9821283329\r\n 20\r\n183924.3855077801\r\n 30\r\n0.0\r\n 11\r\n535970.8072088518\r\n 21\r\n183912.0493066405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535918.5935446724\r\n 20\r\n183929.8949118557\r\n 30\r\n0.0\r\n 11\r\n535903.1769200424\r\n 21\r\n183860.2472011814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535900.9461733749\r\n 20\r\n183863.2209372202\r\n 30\r\n0.0\r\n 11\r\n535955.5830900649\r\n 21\r\n183850.3214360929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535967.3854864592\r\n 20\r\n183920.4118218448\r\n 30\r\n0.0\r\n 11\r\n535951.4779899194\r\n 21\r\n183844.563029156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535411.801821753\r\n 20\r\n183916.0150905535\r\n 30\r\n0.0\r\n 11\r\n535516.3892101873\r\n 21\r\n183873.9907080598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535920.4534103485\r\n 20\r\n184270.4946846228\r\n 30\r\n0.0\r\n 11\r\n536183.9037860471\r\n 21\r\n184245.8441409534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536459.1144204453\r\n 20\r\n184515.8449592403\r\n 30\r\n0.0\r\n 11\r\n537050.7840434664\r\n 21\r\n184508.4728549048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536372.3224962037\r\n 20\r\n184615.45444566\r\n 30\r\n0.0\r\n 11\r\n536372.6473193558\r\n 21\r\n184370.2079044642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535421.6860749543\r\n 20\r\n184433.5942901648\r\n 30\r\n0.0\r\n 11\r\n536741.1559099641\r\n 21\r\n184447.5844802925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536368.8292361395\r\n 20\r\n184402.6300032422\r\n 30\r\n0.0\r\n 11\r\n536399.9528189172\r\n 21\r\n184326.7852878713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536298.1860212753\r\n 20\r\n184365.686102428\r\n 30\r\n0.0\r\n 11\r\n536379.9031737661\r\n 21\r\n184397.9310317812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536310.4646766277\r\n 20\r\n184378.1616925207\r\n 30\r\n0.0\r\n 11\r\n536259.6272821861\r\n 21\r\n184185.886337598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536110.4724337224\r\n 20\r\n184422.0345196693\r\n 30\r\n0.0\r\n 11\r\n536584.8624347385\r\n 21\r\n184213.8110004394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536311.9517120049\r\n 20\r\n184166.7925783813\r\n 30\r\n0.0\r\n 11\r\n536400.5693539809\r\n 21\r\n184331.069029192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536256.9714743426\r\n 20\r\n184192.3031114103\r\n 30\r\n0.0\r\n 11\r\n536312.7462353251\r\n 21\r\n184167.0881016221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536167.266059036\r\n 20\r\n183908.7451954644\r\n 30\r\n0.0\r\n 11\r\n536294.5367860616\r\n 21\r\n184177.349231537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536193.2131911263\r\n 20\r\n183972.0572312018\r\n 30\r\n0.0\r\n 11\r\n536298.5135492011\r\n 21\r\n183930.7094875404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536263.1452801746\r\n 20\r\n183857.3208601452\r\n 30\r\n0.0\r\n 11\r\n536574.4665492171\r\n 21\r\n184545.7616112611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536543.7254387533\r\n 20\r\n184311.6130557499\r\n 30\r\n0.0\r\n 11\r\n536973.1077221413\r\n 21\r\n184219.3383446261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536568.5464437036\r\n 20\r\n184376.5248785597\r\n 30\r\n0.0\r\n 11\r\n536505.9846746213\r\n 21\r\n184192.9614204287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536636.9143777085\r\n 20\r\n184352.0662643937\r\n 30\r\n0.0\r\n 11\r\n536615.6670344794\r\n 21\r\n184291.3686853001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536596.7010109462\r\n 20\r\n184388.6743258272\r\n 30\r\n0.0\r\n 11\r\n536642.3203501395\r\n 21\r\n184337.1366559674\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536623.9970331696\r\n 20\r\n184346.2096831239\r\n 30\r\n0.0\r\n 11\r\n537022.7126182932\r\n 21\r\n184286.0184883272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536744.3381625373\r\n 20\r\n184514.6666443953\r\n 30\r\n0.0\r\n 11\r\n536710.4706398047\r\n 21\r\n184108.7544800689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536697.8620519129\r\n 20\r\n184113.0347261562\r\n 30\r\n0.0\r\n 11\r\n536934.2693140616\r\n 21\r\n184079.16175616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536582.3753302783\r\n 20\r\n183961.4807163454\r\n 30\r\n0.0\r\n 11\r\n536713.8444273649\r\n 21\r\n184121.5518205851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536548.4851090295\r\n 20\r\n184041.8140054961\r\n 30\r\n0.0\r\n 11\r\n536625.517736707\r\n 21\r\n184004.9725338305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536875.2099065892\r\n 20\r\n184517.34910723\r\n 30\r\n0.0\r\n 11\r\n536862.9984506618\r\n 21\r\n184428.0576107547\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537006.7836280222\r\n 20\r\n184543.4062176398\r\n 30\r\n0.0\r\n 11\r\n536931.8526886525\r\n 21\r\n184077.2158017846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536542.8261128231\r\n 20\r\n184228.6996468251\r\n 30\r\n0.0\r\n 11\r\n536959.1089760015\r\n 21\r\n184147.8058635433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536686.7698355978\r\n 20\r\n183683.7674240936\r\n 30\r\n0.0\r\n 11\r\n536958.3045855089\r\n 21\r\n184154.7345164754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536629.1999098027\r\n 20\r\n183760.6787351024\r\n 30\r\n0.0\r\n 11\r\n536746.6080051664\r\n 21\r\n183758.472636195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536659.7486756028\r\n 20\r\n183814.7322506615\r\n 30\r\n0.0\r\n 11\r\n536729.295575602\r\n 21\r\n183729.7097267011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536742.0055517852\r\n 20\r\n183986.0129710593\r\n 30\r\n0.0\r\n 11\r\n536671.246055113\r\n 21\r\n183796.8032329595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536492.5198274261\r\n 20\r\n183996.7623429372\r\n 30\r\n0.0\r\n 11\r\n536812.6378803514\r\n 21\r\n183897.694868372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536515.3962938599\r\n 20\r\n184087.4997183867\r\n 30\r\n0.0\r\n 11\r\n536492.8736392421\r\n 21\r\n183968.1674278886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536398.2457513548\r\n 20\r\n184006.5023126832\r\n 30\r\n0.0\r\n 11\r\n536468.666537428\r\n 21\r\n184104.6279660823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536463.0869882278\r\n 20\r\n184100.8539433953\r\n 30\r\n0.0\r\n 11\r\n536516.8884232679\r\n 21\r\n184085.9198722496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536128.598786307\r\n 20\r\n184149.630260731\r\n 30\r\n0.0\r\n 11\r\n536651.6601445378\r\n 21\r\n183942.4482538111\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536663.7753244765\r\n 20\r\n183947.3729040663\r\n 30\r\n0.0\r\n 11\r\n536654.6566654839\r\n 21\r\n183924.8650247745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536838.0648295431\r\n 20\r\n184023.3759506626\r\n 30\r\n0.0\r\n 11\r\n536878.262014232\r\n 21\r\n184002.4397734485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536830.40168072\r\n 20\r\n184036.8889753371\r\n 30\r\n0.0\r\n 11\r\n536843.8955740622\r\n 21\r\n184016.9625788967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536849.7154321912\r\n 20\r\n184098.007294127\r\n 30\r\n0.0\r\n 11\r\n536830.0563265061\r\n 21\r\n184028.9031557928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536611.0849587833\r\n 20\r\n184003.1556167623\r\n 30\r\n0.0\r\n 11\r\n536507.6239143502\r\n 21\r\n183663.5239624828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536262.780621498\r\n 20\r\n183877.1500396689\r\n 30\r\n0.0\r\n 11\r\n536390.3878227272\r\n 21\r\n183717.9550317594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536361.3818492996\r\n 20\r\n183706.7303072926\r\n 30\r\n0.0\r\n 11\r\n536578.6324969599\r\n 21\r\n183974.7479108842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536459.0516365094\r\n 20\r\n184021.8468595721\r\n 30\r\n0.0\r\n 11\r\n536446.2596914044\r\n 21\r\n183988.7053467764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536545.505810734\r\n 20\r\n183831.1782786151\r\n 30\r\n0.0\r\n 11\r\n536629.2581500811\r\n 21\r\n183789.9789357268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536596.1095191861\r\n 20\r\n183801.67100008\r\n 30\r\n0.0\r\n 11\r\n536678.81316376\r\n 21\r\n183812.2865272042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536598.8470616633\r\n 20\r\n183814.5075445035\r\n 30\r\n0.0\r\n 11\r\n536647.8746341377\r\n 21\r\n183751.1005673246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536590.7903098636\r\n 20\r\n183651.4745657494\r\n 30\r\n0.0\r\n 11\r\n536647.9925529926\r\n 21\r\n183763.7241177747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536092.1118655931\r\n 20\r\n183976.7515162437\r\n 30\r\n0.0\r\n 11\r\n536317.4291601512\r\n 21\r\n183828.8284507869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536657.7922971604\r\n 20\r\n184211.4840766378\r\n 30\r\n0.0\r\n 11\r\n536654.8152844146\r\n 21\r\n184164.5666243088\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536592.9965580466\r\n 20\r\n184180.4025224566\r\n 30\r\n0.0\r\n 11\r\n536656.5239395312\r\n 21\r\n184165.4002076438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536579.1469903754\r\n 20\r\n184227.9814571035\r\n 30\r\n0.0\r\n 11\r\n536543.8543996145\r\n 21\r\n184129.8113187139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536409.7386259413\r\n 20\r\n184199.2788677323\r\n 30\r\n0.0\r\n 11\r\n536677.5041961697\r\n 21\r\n184067.1413229414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536767.9936633479\r\n 20\r\n184106.1466437101\r\n 30\r\n0.0\r\n 11\r\n536754.0654051708\r\n 21\r\n184038.7258206911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536723.0938287659\r\n 20\r\n184046.1223992084\r\n 30\r\n0.0\r\n 11\r\n536781.9189092848\r\n 21\r\n184033.786198069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536729.7052451053\r\n 20\r\n184051.6318032842\r\n 30\r\n0.0\r\n 11\r\n536714.2886204753\r\n 21\r\n183981.9840926098\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536712.0578738078\r\n 20\r\n183984.9578286487\r\n 30\r\n0.0\r\n 11\r\n536766.6947904981\r\n 21\r\n183972.0583275212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536778.4971868923\r\n 20\r\n184042.148713273\r\n 30\r\n0.0\r\n 11\r\n536762.5896903524\r\n 21\r\n183966.2999205845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536222.9135221859\r\n 20\r\n184037.7519819821\r\n 30\r\n0.0\r\n 11\r\n536327.5009106202\r\n 21\r\n183995.7275994882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536731.5651107815\r\n 20\r\n184392.2315760508\r\n 30\r\n0.0\r\n 11\r\n536995.0154864801\r\n 21\r\n184367.5810323819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536695.8355699313\r\n 20\r\n183725.3801674254\r\n 30\r\n0.0\r\n 11\r\n536789.8996370914\r\n 21\r\n183158.1987582552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536467.2987365435\r\n 20\r\n183735.5527801813\r\n 30\r\n0.0\r\n 11\r\n536424.7170935654\r\n 21\r\n183571.1760746548\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536021.4904705762\r\n 20\r\n183831.9354238264\r\n 30\r\n0.0\r\n 11\r\n536750.7631994243\r\n 21\r\n183634.3679990988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536514.7086588478\r\n 20\r\n183627.3811690832\r\n 30\r\n0.0\r\n 11\r\n536502.1850618724\r\n 21\r\n183188.349851915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536582.7476885168\r\n 20\r\n183613.2278136884\r\n 30\r\n0.0\r\n 11\r\n536391.5573141017\r\n 21\r\n183645.7202565448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536569.5031594619\r\n 20\r\n183541.8346721609\r\n 30\r\n0.0\r\n 11\r\n536506.194272646\r\n 21\r\n183553.1320414237\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536599.2309034192\r\n 20\r\n183587.3706608673\r\n 30\r\n0.0\r\n 11\r\n536555.6265312794\r\n 21\r\n183534.1173581218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536561.6618541108\r\n 20\r\n183553.6529319524\r\n 30\r\n0.0\r\n 11\r\n536565.8153502428\r\n 21\r\n183150.4410196515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n7FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536747.1518353845\r\n 20\r\n183461.7116351087\r\n 30\r\n0.0\r\n 11\r\n536341.0326863496\r\n 21\r\n183430.4237615611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n800\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536343.2477510256\r\n 20\r\n183443.5535172205\r\n 30\r\n0.0\r\n 11\r\n536347.5029372484\r\n 21\r\n183204.7697969143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n801\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536175.2184971649\r\n 20\r\n183533.3976634438\r\n 30\r\n0.0\r\n 11\r\n536354.2042462857\r\n 21\r\n183429.1336547311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n802\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536249.1202751502\r\n 20\r\n183579.663327307\r\n 30\r\n0.0\r\n 11\r\n536225.0328846765\r\n 21\r\n183497.7419175195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n803\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536777.2915141768\r\n 20\r\n183276.9074759882\r\n 30\r\n0.0\r\n 11\r\n536687.1952927396\r\n 21\r\n183274.7253024385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n804\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536432.7126278959\r\n 20\r\n183615.0485669723\r\n 30\r\n0.0\r\n 11\r\n536419.2294763712\r\n 21\r\n183191.193130562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n805\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535973.3551159433\r\n 20\r\n183363.2330692008\r\n 30\r\n0.0\r\n 11\r\n536390.3861526087\r\n 21\r\n183209.9348118807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n806\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535765.9509262584\r\n 20\r\n183422.3573275007\r\n 30\r\n0.0\r\n 11\r\n536242.9275657301\r\n 21\r\n183266.7582370015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n807\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535984.4516391039\r\n 20\r\n183455.1545628895\r\n 30\r\n0.0\r\n 11\r\n536000.9943142841\r\n 21\r\n183338.8967991611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n808\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536042.6845632144\r\n 20\r\n183433.6153849628\r\n 30\r\n0.0\r\n 11\r\n535969.8389488495\r\n 21\r\n183351.4015336484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n809\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536224.8896984233\r\n 20\r\n183379.7213448218\r\n 30\r\n0.0\r\n 11\r\n536026.8181654621\r\n 21\r\n183419.4063443993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536190.3202068777\r\n 20\r\n183593.9325871916\r\n 30\r\n0.0\r\n 11\r\n536148.9637381762\r\n 21\r\n183295.9104764247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536123.5626722017\r\n 20\r\n183656.0761439899\r\n 30\r\n0.0\r\n 11\r\n536235.0531643094\r\n 21\r\n183607.9374309185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536256.2599631653\r\n 20\r\n183707.8087092746\r\n 30\r\n0.0\r\n 11\r\n536135.528785634\r\n 21\r\n183704.3861753978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536141.7794635759\r\n 20\r\n183706.8968808336\r\n 30\r\n0.0\r\n 11\r\n536124.0364940552\r\n 21\r\n183653.9553288545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536288.6068926312\r\n 20\r\n184011.3688704059\r\n 30\r\n0.0\r\n 11\r\n536288.6042152567\r\n 21\r\n184011.3567267488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n80F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536257.0943731896\r\n 20\r\n183868.4388440262\r\n 30\r\n0.0\r\n 11\r\n536167.4768940855\r\n 21\r\n183461.9645639813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n810\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536174.2702873457\r\n 20\r\n183450.7896110464\r\n 30\r\n0.0\r\n 11\r\n536150.5964115458\r\n 21\r\n183456.202759544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n811\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536277.091176984\r\n 20\r\n183290.848499001\r\n 30\r\n0.0\r\n 11\r\n536262.8322347262\r\n 21\r\n183247.8273444499\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n812\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536289.2094413577\r\n 20\r\n183300.5682394452\r\n 30\r\n0.0\r\n 11\r\n536271.6895600724\r\n 21\r\n183284.0697488365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n813\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536352.6253766384\r\n 20\r\n183291.2468103648\r\n 30\r\n0.0\r\n 11\r\n536281.2707242392\r\n 21\r\n183299.6358479864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n814\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536220.9379273907\r\n 20\r\n183511.7003411787\r\n 30\r\n0.0\r\n 11\r\n535874.6134005037\r\n 21\r\n183570.4289235953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n815\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535920.839662087\r\n 20\r\n183659.1692777822\r\n 30\r\n0.0\r\n 11\r\n536187.7191650914\r\n 21\r\n183539.2080466986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n816\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536215.1485471566\r\n 20\r\n183664.7688771879\r\n 30\r\n0.0\r\n 11\r\n536180.3913818786\r\n 21\r\n183672.1127992867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n817\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536040.7043262499\r\n 20\r\n183549.0189493377\r\n 30\r\n0.0\r\n 11\r\n536013.3862663467\r\n 21\r\n183459.7689420341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n818\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536019.6432443323\r\n 20\r\n183494.3577599607\r\n 30\r\n0.0\r\n 11\r\n536043.3099346213\r\n 21\r\n183414.4048362322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n819\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536032.7520582591\r\n 20\r\n183493.7020092531\r\n 30\r\n0.0\r\n 11\r\n535977.9736696914\r\n 21\r\n183435.1915335789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535819.3510827251\r\n 20\r\n183488.0204039051\r\n 30\r\n0.0\r\n 11\r\n535990.454519467\r\n 21\r\n183437.0879300813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536434.0485002005\r\n 20\r\n183498.8082347155\r\n 30\r\n0.0\r\n 11\r\n536387.2566181096\r\n 21\r\n183494.2662408433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536393.0330097161\r\n 20\r\n183557.8190842093\r\n 30\r\n0.0\r\n 11\r\n536388.3519793497\r\n 21\r\n183492.7123594973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536437.7949375415\r\n 20\r\n183579.0778556736\r\n 30\r\n0.0\r\n 11\r\n536335.2534120668\r\n 21\r\n183598.2658359574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536382.4476452358\r\n 20\r\n183741.7422642311\r\n 30\r\n0.0\r\n 11\r\n536294.6954665122\r\n 21\r\n183456.3332831664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n81F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536347.6301763369\r\n 20\r\n183373.220858017\r\n 30\r\n0.0\r\n 11\r\n536278.8510786098\r\n 21\r\n183376.2207693881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n820\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536281.2146543384\r\n 20\r\n183407.9754765754\r\n 30\r\n0.0\r\n 11\r\n536278.4158529892\r\n 21\r\n183347.936000665\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n821\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536287.7077531305\r\n 20\r\n183402.327111559\r\n 30\r\n0.0\r\n 11\r\n536216.4929401491\r\n 21\r\n183406.4412735882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n822\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536219.0729416188\r\n 20\r\n183409.1176385002\r\n 30\r\n0.0\r\n 11\r\n536215.050250384\r\n 21\r\n183353.1229266965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n823\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536286.1257915368\r\n 20\r\n183352.6473372339\r\n 30\r\n0.0\r\n 11\r\n536208.7109628799\r\n 21\r\n183356.2573375812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n824\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536624.2465273168\r\n 20\r\n183454.7991782079\r\n 30\r\n0.0\r\n 11\r\n536641.9181354303\r\n 21\r\n183190.7888298772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n832\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535735.2534055224\r\n 20\r\n184715.4109906729\r\n 30\r\n0.0\r\n 11\r\n536165.5409591916\r\n 21\r\n184803.3677343476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n836\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535509.6257709515\r\n 20\r\n184600.3551137814\r\n 30\r\n0.0\r\n 11\r\n536214.4735245573\r\n 21\r\n184667.7356093472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n837\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535933.8162550799\r\n 20\r\n184510.3524146965\r\n 30\r\n0.0\r\n 11\r\n535889.0382171611\r\n 21\r\n185121.0044603166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n838\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535891.3770378981\r\n 20\r\n184912.4309386843\r\n 30\r\n0.0\r\n 11\r\n536128.1126389638\r\n 21\r\n184943.9273969149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n83A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535720.2179529596\r\n 20\r\n184854.8705574998\r\n 30\r\n0.0\r\n 11\r\n535798.7532048145\r\n 21\r\n185134.6910814056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n83B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536189.9053794\r\n 20\r\n184532.9956358863\r\n 30\r\n0.0\r\n 11\r\n536125.7156833548\r\n 21\r\n184945.8975290452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n83C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535735.1870223283\r\n 20\r\n184798.3292501815\r\n 30\r\n0.0\r\n 11\r\n536152.2614908992\r\n 21\r\n184875.0372290103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n83D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535789.271791806\r\n 20\r\n185515.9908257694\r\n 30\r\n0.0\r\n 11\r\n536151.3875399865\r\n 21\r\n184868.1170060862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n842\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535694.3790202402\r\n 20\r\n185135.4241570543\r\n 30\r\n0.0\r\n 11\r\n536071.6732173155\r\n 21\r\n185063.2439938016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n845\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536032.473398615\r\n 20\r\n185000.676799044\r\n 30\r\n0.0\r\n 11\r\n536072.8788671299\r\n 21\r\n185021.2081235834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n846\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536024.6748928699\r\n 20\r\n184987.2414354884\r\n 30\r\n0.0\r\n 11\r\n536038.3682737447\r\n 21\r\n185007.031275125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n847\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536043.3737126193\r\n 20\r\n184925.9321863689\r\n 30\r\n0.0\r\n 11\r\n536024.4097767367\r\n 21\r\n184995.2303213156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n851\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535850.3203429926\r\n 20\r\n184814.3890718129\r\n 30\r\n0.0\r\n 11\r\n535847.8147844659\r\n 21\r\n184861.3340621145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n852\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535785.8400994945\r\n 20\r\n184846.119956075\r\n 30\r\n0.0\r\n 11\r\n535849.5149797025\r\n 21\r\n184860.4833567355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n853\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535771.5132817625\r\n 20\r\n184389.55211422\r\n 30\r\n0.0\r\n 11\r\n535737.208628857\r\n 21\r\n184897.2022592253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n854\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535602.4017936732\r\n 20\r\n184829.0854602525\r\n 30\r\n0.0\r\n 11\r\n535923.2220377361\r\n 21\r\n184983.4165245147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536367.6458885368\r\n 20\r\n184582.1864207075\r\n 30\r\n0.0\r\n 11\r\n536587.2186660103\r\n 21\r\n184682.9161934223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536172.7078649907\r\n 20\r\n184992.1615235455\r\n 30\r\n0.0\r\n 11\r\n536390.8634053164\r\n 21\r\n184519.5335550324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536269.0988258286\r\n 20\r\n185042.6201202157\r\n 30\r\n0.0\r\n 11\r\n536573.4887323567\r\n 21\r\n184351.0867622647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536545.101286052\r\n 20\r\n184585.5323099143\r\n 30\r\n0.0\r\n 11\r\n536975.3888397213\r\n 21\r\n184673.4890535888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536569.2689741861\r\n 20\r\n184520.3744256831\r\n 30\r\n0.0\r\n 11\r\n536508.5543278837\r\n 21\r\n184704.5570791448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n85F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536637.8791548743\r\n 20\r\n184544.1450233398\r\n 30\r\n0.0\r\n 11\r\n536617.2426144353\r\n 21\r\n184605.0529776709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n860\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536597.3000749455\r\n 20\r\n184507.9427678797\r\n 30\r\n0.0\r\n 11\r\n536643.4348282493\r\n 21\r\n184559.0195733847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n861\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536625.0212937263\r\n 20\r\n184550.1310688461\r\n 30\r\n0.0\r\n 11\r\n537024.321405087\r\n 21\r\n184606.3139738869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n862\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536735.5056521489\r\n 20\r\n184490.2048948725\r\n 30\r\n0.0\r\n 11\r\n536713.875866871\r\n 21\r\n184786.7056298909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n863\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536701.2249184277\r\n 20\r\n184782.5522579256\r\n 30\r\n0.0\r\n 11\r\n536937.9605194933\r\n 21\r\n184814.0487161564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n864\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536587.2664426376\r\n 20\r\n184935.2587298225\r\n 30\r\n0.0\r\n 11\r\n536717.1209299521\r\n 21\r\n184773.8750440749\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n865\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536552.5709523043\r\n 20\r\n184855.2699344034\r\n 30\r\n0.0\r\n 11\r\n536629.9697800855\r\n 21\r\n184891.3357245587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n866\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536985.3667351677\r\n 20\r\n184480.2953076949\r\n 30\r\n0.0\r\n 11\r\n536935.5635638845\r\n 21\r\n184816.0188482864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n867\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536545.0349028581\r\n 20\r\n184668.4505694229\r\n 30\r\n0.0\r\n 11\r\n536962.1093714287\r\n 21\r\n184745.1585482518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n868\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536694.4454183708\r\n 20\r\n185211.9093264152\r\n 30\r\n0.0\r\n 11\r\n536961.235420516\r\n 21\r\n184738.2383253276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n869\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536636.1057933771\r\n 20\r\n185135.5802082968\r\n 30\r\n0.0\r\n 11\r\n536753.5301258957\r\n 21\r\n185136.6067860254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536666.1100292685\r\n 20\r\n185081.2225458677\r\n 30\r\n0.0\r\n 11\r\n536736.5075044353\r\n 21\r\n185165.5421543244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536746.6421737969\r\n 20\r\n184909.1241654075\r\n 30\r\n0.0\r\n 11\r\n536677.7869326034\r\n 21\r\n185099.0351633024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536497.061055924\r\n 20\r\n184900.8815167933\r\n 30\r\n0.0\r\n 11\r\n536818.1581281305\r\n 21\r\n184996.7282827578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536519.0248759599\r\n 20\r\n184809.918916625\r\n 30\r\n0.0\r\n 11\r\n536497.7020969032\r\n 21\r\n184929.4714348748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536466.5840612846\r\n 20\r\n184797.0908326885\r\n 30\r\n0.0\r\n 11\r\n536520.5328002478\r\n 21\r\n184811.4836940305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n86F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536131.6227593306\r\n 20\r\n184751.6770401758\r\n 30\r\n0.0\r\n 11\r\n536656.7389495195\r\n 21\r\n184953.5942392125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n870\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536668.8040481505\r\n 20\r\n184948.548135754\r\n 30\r\n0.0\r\n 11\r\n536659.91194963\r\n 21\r\n184971.1464798513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n871\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536842.3212791448\r\n 20\r\n184870.7981182857\r\n 30\r\n0.0\r\n 11\r\n536882.7267476596\r\n 21\r\n184891.3294428248\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n872\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536834.5227733995\r\n 20\r\n184857.3627547297\r\n 30\r\n0.0\r\n 11\r\n536848.2161542742\r\n 21\r\n184877.1525943664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n873\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536853.2215931489\r\n 20\r\n184796.0535056102\r\n 30\r\n0.0\r\n 11\r\n536834.2576572664\r\n 21\r\n184865.3516405568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n874\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536615.5559820213\r\n 20\r\n184893.2975328055\r\n 30\r\n0.0\r\n 11\r\n536515.5118895682\r\n 21\r\n185233.9513568983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n875\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536268.5349937502\r\n 20\r\n185022.7956043346\r\n 30\r\n0.0\r\n 11\r\n536397.7349320228\r\n 21\r\n185180.7007160287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n876\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536368.8431788377\r\n 20\r\n185192.2162503954\r\n 30\r\n0.0\r\n 11\r\n536583.390524052\r\n 21\r\n184922.0298029087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n877\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536463.342569983\r\n 20\r\n184876.1344667894\r\n 30\r\n0.0\r\n 11\r\n536450.8841896643\r\n 21\r\n184909.4028074425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n878\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536551.7077219273\r\n 20\r\n185065.9249616169\r\n 30\r\n0.0\r\n 11\r\n536635.8696988342\r\n 21\r\n185106.2809010026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n879\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536602.6052891701\r\n 20\r\n185094.9224174441\r\n 30\r\n0.0\r\n 11\r\n536685.1981237456\r\n 21\r\n185083.4766357432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536605.2137454526\r\n 20\r\n185082.0590210273\r\n 30\r\n0.0\r\n 11\r\n536654.875791868\r\n 21\r\n185144.9702979461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536598.7951296876\r\n 20\r\n185245.1647069569\r\n 30\r\n0.0\r\n 11\r\n536654.8668963114\r\n 21\r\n185132.3461998914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536096.8743136659\r\n 20\r\n184924.9135871356\r\n 30\r\n0.0\r\n 11\r\n536323.666184154\r\n 21\r\n185070.5657893215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536660.1682235223\r\n 20\r\n184684.5103910543\r\n 30\r\n0.0\r\n 11\r\n536657.6626649958\r\n 21\r\n184731.455381356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536595.6879800242\r\n 20\r\n184716.2412753165\r\n 30\r\n0.0\r\n 11\r\n536659.362860232\r\n 21\r\n184730.6046759769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n87F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536581.3611622921\r\n 20\r\n184668.8038656017\r\n 30\r\n0.0\r\n 11\r\n536547.0565093866\r\n 21\r\n184767.3235784669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n880\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536412.2496742029\r\n 20\r\n184699.2067794937\r\n 30\r\n0.0\r\n 11\r\n536681.3291069041\r\n 21\r\n184828.6478480936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n881\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536771.4221847498\r\n 20\r\n184788.7354935804\r\n 30\r\n0.0\r\n 11\r\n536758.1718976634\r\n 21\r\n184856.292829559\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n882\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536727.1275824649\r\n 20\r\n184849.2077457455\r\n 30\r\n0.0\r\n 11\r\n536786.0736168213\r\n 21\r\n184860.9524036919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n883\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536733.6833211163\r\n 20\r\n184843.6322054112\r\n 30\r\n0.0\r\n 11\r\n536718.9671126245\r\n 21\r\n184913.4312679034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n884\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536716.7066061798\r\n 20\r\n184910.4800906235\r\n 30\r\n0.0\r\n 11\r\n536771.4703465928\r\n 21\r\n184922.8300918665\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n885\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536782.5680623663\r\n 20\r\n184852.6246829575\r\n 30\r\n0.0\r\n 11\r\n536767.4232990065\r\n 21\r\n184928.6294455796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n886\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536227.0565971623\r\n 20\r\n184862.6022458617\r\n 30\r\n0.0\r\n 11\r\n536332.060859742\r\n 21\r\n184903.5738870732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n887\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536703.092679131\r\n 20\r\n185170.207613885\r\n 30\r\n0.0\r\n 11\r\n536802.8495574758\r\n 21\r\n185736.4154951988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n888\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536653.0321400727\r\n 20\r\n185217.3556704263\r\n 30\r\n0.0\r\n 11\r\n536690.4029275054\r\n 21\r\n185441.5719254414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n889\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536474.4651889979\r\n 20\r\n185162.3312555545\r\n 30\r\n0.0\r\n 11\r\n536433.5369223055\r\n 21\r\n185327.1274163836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536027.7112157658\r\n 20\r\n185070.4317919967\r\n 30\r\n0.0\r\n 11\r\n536758.9317897254\r\n 21\r\n185260.6634207374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536522.959344978\r\n 20\r\n185270.0211576637\r\n 30\r\n0.0\r\n 11\r\n536455.699115787\r\n 21\r\n185786.0925192186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536591.1371176031\r\n 20\r\n185283.4903204848\r\n 30\r\n0.0\r\n 11\r\n536399.6299907303\r\n 21\r\n185252.9200985578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536578.6104286209\r\n 20\r\n185355.0129062195\r\n 30\r\n0.0\r\n 11\r\n536515.1912496727\r\n 21\r\n185344.3520693082\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536607.879245957\r\n 20\r\n185309.1805883639\r\n 30\r\n0.0\r\n 11\r\n536564.8120240138\r\n 21\r\n185362.8692269859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n88F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536570.6507999075\r\n 20\r\n185343.2740116868\r\n 30\r\n0.0\r\n 11\r\n536630.0084509401\r\n 21\r\n185657.4002796109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n890\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536331.3764837016\r\n 20\r\n185274.9186586766\r\n 30\r\n0.0\r\n 11\r\n536360.0073551307\r\n 21\r\n185694.2908528184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n891\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536131.5448419101\r\n 20\r\n185245.2568437803\r\n 30\r\n0.0\r\n 11\r\n536243.5132806817\r\n 21\r\n185292.273162709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n892\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536263.7157637863\r\n 20\r\n185192.1938929543\r\n 30\r\n0.0\r\n 11\r\n536143.0250585699\r\n 21\r\n185196.8290456603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n893\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536149.2502001165\r\n 20\r\n185194.2556764203\r\n 30\r\n0.0\r\n 11\r\n536132.0399442671\r\n 21\r\n185247.3727921829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n894\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536293.0116815622\r\n 20\r\n184888.3241108541\r\n 30\r\n0.0\r\n 11\r\n536293.0091263105\r\n 21\r\n184888.3362807939\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n895\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536262.9365396879\r\n 20\r\n185031.563481014\r\n 30\r\n0.0\r\n 11\r\n536186.7930930003\r\n 21\r\n185659.8411021697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n896\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536368.966370536\r\n 20\r\n185451.3462593905\r\n 30\r\n0.0\r\n 11\r\n535883.4684907984\r\n 21\r\n185333.4005347594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n897\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535705.8904213834\r\n 20\r\n185192.8603974879\r\n 30\r\n0.0\r\n 11\r\n536236.2722789427\r\n 21\r\n185347.2694557663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n898\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536223.0387739137\r\n 20\r\n185235.6445335389\r\n 30\r\n0.0\r\n 11\r\n536188.2095898026\r\n 21\r\n185228.6501311959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n899\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536545.7749020496\r\n 20\r\n185506.3403822074\r\n 30\r\n0.0\r\n 11\r\n536396.8509260806\r\n 21\r\n185404.4096746278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n89A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536401.9886132652\r\n 20\r\n185340.8020118011\r\n 30\r\n0.0\r\n 11\r\n536397.9618413939\r\n 21\r\n185405.9524742422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n89B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536389.5562031839\r\n 20\r\n185156.9944459336\r\n 30\r\n0.0\r\n 11\r\n536322.8218062403\r\n 21\r\n185382.0687006323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n89E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536074.9532183286\r\n 20\r\n185122.5485679805\r\n 30\r\n0.0\r\n 11\r\n536236.5382793906\r\n 21\r\n184989.6285783852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n89F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536414.0357339334\r\n 20\r\n185353.9101287031\r\n 30\r\n0.0\r\n 11\r\n536297.5220622345\r\n 21\r\n185341.469954668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535933.5172575562\r\n 20\r\n184514.429937026\r\n 30\r\n0.0\r\n 11\r\n536060.3141642157\r\n 21\r\n184362.1580201859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537477.0561138507\r\n 20\r\n187928.2588438897\r\n 30\r\n0.0\r\n 11\r\n537648.2829715595\r\n 21\r\n185028.8175773283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537726.5507136519\r\n 20\r\n187131.1942189549\r\n 30\r\n0.0\r\n 11\r\n537653.7532900338\r\n 21\r\n187419.2442196735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537192.3049867737\r\n 20\r\n187262.0692319707\r\n 30\r\n0.0\r\n 11\r\n537721.8503967186\r\n 21\r\n187225.0229891532\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537344.6652379133\r\n 20\r\n187445.065864851\r\n 30\r\n0.0\r\n 11\r\n537395.6850929626\r\n 21\r\n187218.5848226858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537340.5091686917\r\n 20\r\n187073.0513562111\r\n 30\r\n0.0\r\n 11\r\n537659.2540033284\r\n 21\r\n187059.0562025004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537460.6349338569\r\n 20\r\n186643.1579815403\r\n 30\r\n0.0\r\n 11\r\n537687.0150856387\r\n 21\r\n186633.5398320825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537391.191286337\r\n 20\r\n187276.4319337291\r\n 30\r\n0.0\r\n 11\r\n537350.1318901424\r\n 21\r\n187036.2308251472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537591.6890055485\r\n 20\r\n187284.1217651576\r\n 30\r\n0.0\r\n 11\r\n537594.5541466836\r\n 21\r\n186994.0394027349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537644.0726228921\r\n 20\r\n185220.5275972164\r\n 30\r\n0.0\r\n 11\r\n537601.0638613992\r\n 21\r\n181721.5800113643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536779.5233751413\r\n 20\r\n185481.8898698351\r\n 30\r\n0.0\r\n 11\r\n536524.1838228082\r\n 21\r\n185503.1272773228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537442.3737651119\r\n 20\r\n185653.3438155586\r\n 30\r\n0.0\r\n 11\r\n537504.9645686496\r\n 21\r\n185218.641435863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537682.705819199\r\n 20\r\n185657.090434018\r\n 30\r\n0.0\r\n 11\r\n537318.0003070827\r\n 21\r\n185647.5284239513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537512.6729933498\r\n 20\r\n185580.0044745308\r\n 30\r\n0.0\r\n 11\r\n537448.3743816385\r\n 21\r\n185578.8493840094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537702.4601705908\r\n 20\r\n185535.7373255553\r\n 30\r\n0.0\r\n 11\r\n537310.0515201883\r\n 21\r\n185426.5258548515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537309.6864577988\r\n 20\r\n185439.8361412739\r\n 30\r\n0.0\r\n 11\r\n537360.0247466008\r\n 21\r\n185206.3798747624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537127.4578714785\r\n 20\r\n185495.5006999384\r\n 30\r\n0.0\r\n 11\r\n537323.2240027454\r\n 21\r\n185427.806507056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537191.0210346118\r\n 20\r\n185555.1807530092\r\n 30\r\n0.0\r\n 11\r\n537183.2257022997\r\n 21\r\n185470.1480971908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537751.9121436832\r\n 20\r\n185436.0956015051\r\n 30\r\n0.0\r\n 11\r\n537663.9375196824\r\n 21\r\n185416.53654911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537820.5566786869\r\n 20\r\n185299.6085467093\r\n 30\r\n0.0\r\n 11\r\n537357.3606357392\r\n 21\r\n185207.9702615446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537364.3088697837\r\n 20\r\n185625.3918159156\r\n 30\r\n0.0\r\n 11\r\n537433.0228561571\r\n 21\r\n185206.9260294692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536962.3002130862\r\n 20\r\n185289.5206968154\r\n 30\r\n0.0\r\n 11\r\n537439.2408833411\r\n 21\r\n185210.0866328064\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536709.953957186\r\n 20\r\n185311.975009698\r\n 30\r\n0.0\r\n 11\r\n537245.4382083907\r\n 21\r\n185246.98160248\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536955.4164714151\r\n 20\r\n185381.8532908917\r\n 30\r\n0.0\r\n 11\r\n536994.1228419815\r\n 21\r\n185270.9869542205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537016.7149015927\r\n 20\r\n185371.9784696792\r\n 30\r\n0.0\r\n 11\r\n536961.1377379927\r\n 21\r\n185277.2326002901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537205.9017999561\r\n 20\r\n185354.3263778232\r\n 30\r\n0.0\r\n 11\r\n537003.8948273027\r\n 21\r\n185354.9700862593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537121.0637200125\r\n 20\r\n185778.5458884923\r\n 30\r\n0.0\r\n 11\r\n537147.6111499923\r\n 21\r\n185257.4181055872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537142.4979307457\r\n 20\r\n185414.2677876428\r\n 30\r\n0.0\r\n 11\r\n537118.2241694152\r\n 21\r\n185415.0020102937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537274.2999987925\r\n 20\r\n185277.2221400399\r\n 30\r\n0.0\r\n 11\r\n537268.6272185847\r\n 21\r\n185232.2559667765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537284.3105543463\r\n 20\r\n185289.1013009212\r\n 30\r\n0.0\r\n 11\r\n537270.3108034533\r\n 21\r\n185269.5269961427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537348.3321920717\r\n 20\r\n185292.2157496004\r\n 30\r\n0.0\r\n 11\r\n537276.7018629033\r\n 21\r\n185286.6517299696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537176.5094565962\r\n 20\r\n185483.0515196001\r\n 30\r\n0.0\r\n 11\r\n536742.5172056709\r\n 21\r\n185465.5012760965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536766.9536079009\r\n 20\r\n185485.7875121864\r\n 30\r\n0.0\r\n 11\r\n536810.4861386002\r\n 21\r\n185289.2697495361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536752.440527201\r\n 20\r\n185590.4929007661\r\n 30\r\n0.0\r\n 11\r\n537138.5994012306\r\n 21\r\n185503.6181851989\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536992.4613792804\r\n 20\r\n185484.8220369056\r\n 30\r\n0.0\r\n 11\r\n536982.9131431991\r\n 21\r\n185391.9744661871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536982.365121138\r\n 20\r\n185427.1203873002\r\n 30\r\n0.0\r\n 11\r\n537021.0423958639\r\n 21\r\n185353.2512417675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536995.3534031598\r\n 20\r\n185429.011297577\r\n 30\r\n0.0\r\n 11\r\n536952.9201089633\r\n 21\r\n185361.0145097018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536787.0767849401\r\n 20\r\n185382.1806740374\r\n 30\r\n0.0\r\n 11\r\n536964.7988744056\r\n 21\r\n185365.2880167373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537388.0919537572\r\n 20\r\n185511.6026937876\r\n 30\r\n0.0\r\n 11\r\n537343.0609218514\r\n 21\r\n185498.100245733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537336.4418470921\r\n 20\r\n185561.5708566427\r\n 30\r\n0.0\r\n 11\r\n537344.4360258606\r\n 21\r\n185496.7874424549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537376.2494139416\r\n 20\r\n185591.0822640697\r\n 30\r\n0.0\r\n 11\r\n537271.932843452\r\n 21\r\n185590.0841882765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537290.498835642\r\n 20\r\n185739.9777673537\r\n 30\r\n0.0\r\n 11\r\n537259.5794679108\r\n 21\r\n185442.9883331271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537327.5834193336\r\n 20\r\n185371.6775954408\r\n 30\r\n0.0\r\n 11\r\n537259.5219198117\r\n 21\r\n185361.3240436236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537255.7018576593\r\n 20\r\n185392.9366209298\r\n 30\r\n0.0\r\n 11\r\n537264.5631191268\r\n 21\r\n185333.4887445855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537263.1644422948\r\n 20\r\n185388.65010838\r\n 30\r\n0.0\r\n 11\r\n537192.497763957\r\n 21\r\n185378.918896233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537194.511677977\r\n 20\r\n185382.0435541413\r\n 30\r\n0.0\r\n 11\r\n537201.3901762668\r\n 21\r\n185326.3275236292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537271.2167753149\r\n 20\r\n185339.6017392693\r\n 30\r\n0.0\r\n 11\r\n537194.5645167913\r\n 21\r\n185328.1772453325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537929.3346989562\r\n 20\r\n185271.5668162964\r\n 30\r\n0.0\r\n 11\r\n538198.9327271872\r\n 21\r\n184527.868208749\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537979.076304023\r\n 20\r\n185143.0004105447\r\n 30\r\n0.0\r\n 11\r\n537833.7609421401\r\n 21\r\n185115.7765183631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537864.912350873\r\n 20\r\n185261.6115672493\r\n 30\r\n0.0\r\n 11\r\n538034.3022126254\r\n 21\r\n184797.0777347585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537862.8389685585\r\n 20\r\n185130.6169573129\r\n 30\r\n0.0\r\n 11\r\n537802.5241558244\r\n 21\r\n185075.0901924201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537803.6606153359\r\n 20\r\n185184.0326677696\r\n 30\r\n0.0\r\n 11\r\n537862.278393451\r\n 21\r\n185118.6003778122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537791.3098488985\r\n 20\r\n185379.6317312794\r\n 30\r\n0.0\r\n 11\r\n537760.7998573019\r\n 21\r\n184862.4547331083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537398.0762367352\r\n 20\r\n185145.7665578626\r\n 30\r\n0.0\r\n 11\r\n537395.8723393784\r\n 21\r\n185032.6606599039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537314.7685022459\r\n 20\r\n185040.3400275386\r\n 30\r\n0.0\r\n 11\r\n538068.478175064\r\n 21\r\n184987.488069622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537838.2277014728\r\n 20\r\n184934.9972958472\r\n 30\r\n0.0\r\n 11\r\n537936.9033700488\r\n 21\r\n184444.3422736906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537907.7193585047\r\n 20\r\n184934.2647453819\r\n 30\r\n0.0\r\n 11\r\n537713.8542434436\r\n 21\r\n184929.1819042397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537908.5269297106\r\n 20\r\n184861.6579548194\r\n 30\r\n0.0\r\n 11\r\n537844.2283179992\r\n 21\r\n184860.5028642978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537928.8904968241\r\n 20\r\n184912.0820578129\r\n 30\r\n0.0\r\n 11\r\n537896.4040596111\r\n 21\r\n184851.4035037743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537898.5487650536\r\n 20\r\n184871.7373181024\r\n 30\r\n0.0\r\n 11\r\n537927.1449354257\r\n 21\r\n184734.1017373799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538098.3141069516\r\n 20\r\n184817.3908058439\r\n 30\r\n0.0\r\n 11\r\n537329.9835135775\r\n 21\r\n184606.5084133261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537705.5403941596\r\n 20\r\n184721.4896215623\r\n 30\r\n0.0\r\n 11\r\n537772.8875289665\r\n 21\r\n184417.2423231482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538148.8034751078\r\n 20\r\n184702.7591116822\r\n 30\r\n0.0\r\n 11\r\n538060.8288511072\r\n 21\r\n184683.2000592873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537760.1628061444\r\n 20\r\n184907.0452962041\r\n 30\r\n0.0\r\n 11\r\n537836.5749717135\r\n 21\r\n184441.6978662771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537525.1910752361\r\n 20\r\n184873.6698417635\r\n 30\r\n0.0\r\n 11\r\n537539.4957322885\r\n 21\r\n184445.6458203916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537542.1562393378\r\n 20\r\n185268.0292053734\r\n 30\r\n0.0\r\n 11\r\n537529.5262136854\r\n 21\r\n184705.572050634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537572.3633929569\r\n 20\r\n184764.7049998887\r\n 30\r\n0.0\r\n 11\r\n537044.7432192317\r\n 21\r\n184733.545769042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537333.2367947538\r\n 20\r\n185047.5685480215\r\n 30\r\n0.0\r\n 11\r\n537228.2679305992\r\n 21\r\n184872.616594883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537207.6682683828\r\n 20\r\n184895.9188447834\r\n 30\r\n0.0\r\n 11\r\n537534.4533375916\r\n 21\r\n184785.2716654875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537388.3153156413\r\n 20\r\n184766.4755171942\r\n 30\r\n0.0\r\n 11\r\n537367.4725160221\r\n 21\r\n184552.8193007415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537235.5240868724\r\n 20\r\n184661.5996348834\r\n 30\r\n0.0\r\n 11\r\n537393.7310076131\r\n 21\r\n184610.9278129846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537367.36642518\r\n 20\r\n185242.2052524351\r\n 30\r\n0.0\r\n 11\r\n537306.9020463016\r\n 21\r\n184979.539732414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537783.945890118\r\n 20\r\n184793.256174076\r\n 30\r\n0.0\r\n 11\r\n537738.9148582124\r\n 21\r\n184779.7537260216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537732.2957834531\r\n 20\r\n184843.2243369311\r\n 30\r\n0.0\r\n 11\r\n537740.2899622214\r\n 21\r\n184778.4409227434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537772.1033503026\r\n 20\r\n184872.7357443583\r\n 30\r\n0.0\r\n 11\r\n537667.7867798128\r\n 21\r\n184871.7376685649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537469.9966511197\r\n 20\r\n185140.7302953704\r\n 30\r\n0.0\r\n 11\r\n537466.9106212527\r\n 21\r\n185028.057996365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537979.0638534152\r\n 20\r\n184786.8478223103\r\n 30\r\n0.0\r\n 11\r\n538083.7178428379\r\n 21\r\n184458.7717046499\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537280.0222161629\r\n 20\r\n184619.9473564593\r\n 30\r\n0.0\r\n 11\r\n536956.2067911491\r\n 21\r\n184481.6762675277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537207.0378316328\r\n 20\r\n185258.1371119735\r\n 30\r\n0.0\r\n 11\r\n537278.2416384539\r\n 21\r\n184470.2140828968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536980.4710469725\r\n 20\r\n185010.2972592024\r\n 30\r\n0.0\r\n 11\r\n536927.8955659535\r\n 21\r\n184779.1685527982\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537049.5226215949\r\n 20\r\n184957.0632054001\r\n 30\r\n0.0\r\n 11\r\n536964.3348987111\r\n 21\r\n184951.2004729965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536840.8458648577\r\n 20\r\n185162.016689198\r\n 30\r\n0.0\r\n 11\r\n536737.5695998013\r\n 21\r\n185106.128042719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536840.8713251344\r\n 20\r\n185099.9279705128\r\n 30\r\n0.0\r\n 11\r\n536738.4759137944\r\n 21\r\n185139.6870024007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537041.7635251898\r\n 20\r\n185000.2299248898\r\n 30\r\n0.0\r\n 11\r\n536793.6735813123\r\n 21\r\n184993.7955770673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537077.5737849831\r\n 20\r\n185101.3433580342\r\n 30\r\n0.0\r\n 11\r\n537071.1514116518\r\n 21\r\n184980.0741589464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537172.1713225316\r\n 20\r\n184994.8720697461\r\n 30\r\n0.0\r\n 11\r\n537127.032579336\r\n 21\r\n185106.8998557143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537131.5578333191\r\n 20\r\n185101.9101971182\r\n 30\r\n0.0\r\n 11\r\n537075.7495330001\r\n 21\r\n185100.162481796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537468.0706524365\r\n 20\r\n185069.9632265745\r\n 30\r\n0.0\r\n 11\r\n537468.0583348098\r\n 21\r\n185069.9615198771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537323.0930156879\r\n 20\r\n185049.8755147771\r\n 30\r\n0.0\r\n 11\r\n536910.7955998639\r\n 21\r\n184992.7486926704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536976.0023422475\r\n 20\r\n184959.8882245781\r\n 30\r\n0.0\r\n 11\r\n536910.7989271889\r\n 21\r\n185305.0523000277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537010.069859664\r\n 20\r\n185292.5223484414\r\n 30\r\n0.0\r\n 11\r\n536990.2611797721\r\n 21\r\n185000.592592699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537117.5326950717\r\n 20\r\n185018.477070521\r\n 30\r\n0.0\r\n 11\r\n537112.3485408801\r\n 21\r\n185053.6213200548\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536948.4040101366\r\n 20\r\n185141.8639415291\r\n 30\r\n0.0\r\n 11\r\n536855.2218565389\r\n 21\r\n185136.4856098683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536889.8307478832\r\n 20\r\n185142.6305865953\r\n 30\r\n0.0\r\n 11\r\n536823.0737015237\r\n 21\r\n185092.6698119482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536893.7684289591\r\n 20\r\n185130.1099764146\r\n 30\r\n0.0\r\n 11\r\n536819.8756486581\r\n 21\r\n185161.1584004829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n8FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536814.3275417369\r\n 20\r\n185328.2548790376\r\n 30\r\n0.0\r\n 11\r\n536825.9885333216\r\n 21\r\n185150.1130135764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n900\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537247.8169779245\r\n 20\r\n184888.3237141581\r\n 30\r\n0.0\r\n 11\r\n536949.6971068369\r\n 21\r\n184871.492974252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n901\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537488.5795058766\r\n 20\r\n185910.915399177\r\n 30\r\n0.0\r\n 11\r\n537918.0019126186\r\n 21\r\n186216.2516944803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n902\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537649.7421860449\r\n 20\r\n186032.3074633412\r\n 30\r\n0.0\r\n 11\r\n537922.143169518\r\n 21\r\n185289.6309389398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n903\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537694.4341605217\r\n 20\r\n185901.8997358865\r\n 30\r\n0.0\r\n 11\r\n537823.164857351\r\n 21\r\n185974.605323007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n904\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537705.4513987788\r\n 20\r\n186066.1575672213\r\n 30\r\n0.0\r\n 11\r\n537874.8412605314\r\n 21\r\n185601.6237347305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n905\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537791.3592910779\r\n 20\r\n185967.24487447\r\n 30\r\n0.0\r\n 11\r\n537873.2594627485\r\n 21\r\n185963.5760688097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n906\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537802.2635272968\r\n 20\r\n186046.215839047\r\n 30\r\n0.0\r\n 11\r\n537799.5233544297\r\n 21\r\n185958.4096893029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n907\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537793.0742666434\r\n 20\r\n186029.5641904967\r\n 30\r\n0.0\r\n 11\r\n537956.8676222774\r\n 21\r\n186142.3737177295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n908\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537744.3345605741\r\n 20\r\n186142.0599034011\r\n 30\r\n0.0\r\n 11\r\n538042.0635214961\r\n 21\r\n185827.7086871679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n909\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537994.112465099\r\n 20\r\n186100.4570891543\r\n 30\r\n0.0\r\n 11\r\n537869.4359160997\r\n 21\r\n185961.5484973036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537951.5265775774\r\n 20\r\n186143.5854558382\r\n 30\r\n0.0\r\n 11\r\n537994.1027542618\r\n 21\r\n186099.6094412371\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538188.1030446081\r\n 20\r\n186323.8178848796\r\n 30\r\n0.0\r\n 11\r\n537978.2928211513\r\n 21\r\n186113.281341056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538137.2803173881\r\n 20\r\n186278.0061185872\r\n 30\r\n0.0\r\n 11\r\n538211.7731332879\r\n 21\r\n186192.8672808224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538268.8969313724\r\n 20\r\n186250.9506414111\r\n 30\r\n0.0\r\n 11\r\n537642.7016945823\r\n 21\r\n185646.7766129888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537936.1140565315\r\n 20\r\n185833.3836616485\r\n 30\r\n0.0\r\n 11\r\n538168.0324223031\r\n 21\r\n185460.4257025991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n90F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537883.405144088\r\n 20\r\n185788.0913049394\r\n 30\r\n0.0\r\n 11\r\n538035.0377262333\r\n 21\r\n185908.9924138828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n910\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537929.5240893575\r\n 20\r\n185732.0070728036\r\n 30\r\n0.0\r\n 11\r\n537979.4739508218\r\n 21\r\n185772.5120976989\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n911\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537881.4823191293\r\n 20\r\n185757.4875229886\r\n 30\r\n0.0\r\n 11\r\n537945.4022444065\r\n 21\r\n185731.9630508963\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n912\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537930.6720798144\r\n 20\r\n185746.1435310593\r\n 30\r\n0.0\r\n 11\r\n538122.0325711219\r\n 21\r\n185391.209367984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n913\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537812.7788332458\r\n 20\r\n185575.9644558714\r\n 30\r\n0.0\r\n 11\r\n538183.3800251802\r\n 21\r\n185744.9805816725\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n914\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538175.0915734619\r\n 20\r\n185755.4016451168\r\n 30\r\n0.0\r\n 11\r\n538286.8444801435\r\n 21\r\n185544.3399016834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n915\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538278.7158961651\r\n 20\r\n185915.3009900432\r\n 30\r\n0.0\r\n 11\r\n538172.4750552428\r\n 21\r\n185737.4815152343\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n916\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538191.6563625952\r\n 20\r\n185920.0572550347\r\n 30\r\n0.0\r\n 11\r\n538252.3574474437\r\n 21\r\n185860.0014638102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n917\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537875.7705432734\r\n 20\r\n185399.632320588\r\n 30\r\n0.0\r\n 11\r\n537955.6857652751\r\n 21\r\n185441.2934330443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n918\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537874.3981423898\r\n 20\r\n185319.2415582475\r\n 30\r\n0.0\r\n 11\r\n538287.8595349536\r\n 21\r\n185547.2718772174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n919\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538013.8481153227\r\n 20\r\n185862.2429456056\r\n 30\r\n0.0\r\n 11\r\n538230.6290537816\r\n 21\r\n185497.7690081691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538469.9074596536\r\n 20\r\n185747.2320719628\r\n 30\r\n0.0\r\n 11\r\n538270.6231049247\r\n 21\r\n185542.5828923688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538579.1173669532\r\n 20\r\n186074.6315486046\r\n 30\r\n0.0\r\n 11\r\n538414.9811071633\r\n 21\r\n185898.6873731377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537948.318605483\r\n 20\r\n186278.8268257429\r\n 30\r\n0.0\r\n 11\r\n538320.0375345342\r\n 21\r\n185856.5205313893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538306.8466288651\r\n 20\r\n185653.7349334854\r\n 30\r\n0.0\r\n 11\r\n538351.7220665163\r\n 21\r\n185610.3568952985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538291.5391571618\r\n 20\r\n185656.3820065465\r\n 30\r\n0.0\r\n 11\r\n538314.8528344023\r\n 21\r\n185650.4138505369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n91F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538240.5400198092\r\n 20\r\n185617.5547239104\r\n 30\r\n0.0\r\n 11\r\n538298.9387112047\r\n 21\r\n185659.4051147633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n920\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538419.1352779886\r\n 20\r\n186314.8277945895\r\n 30\r\n0.0\r\n 11\r\n538630.0002317273\r\n 21\r\n186229.2174081527\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n921\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538250.1105527468\r\n 20\r\n186244.5944385616\r\n 30\r\n0.0\r\n 11\r\n538448.8635819237\r\n 21\r\n186327.1805350029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n922\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538068.8934503017\r\n 20\r\n185759.8534417735\r\n 30\r\n0.0\r\n 11\r\n538112.0462407692\r\n 21\r\n185778.5067688979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n923\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538076.2556680476\r\n 20\r\n185831.3401438057\r\n 30\r\n0.0\r\n 11\r\n538111.8389544994\r\n 21\r\n185776.6169551807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n924\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538026.7953211405\r\n 20\r\n185828.3004677325\r\n 30\r\n0.0\r\n 11\r\n538107.2689864418\r\n 21\r\n185894.6851966017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n925\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537996.5743993786\r\n 20\r\n185997.4445733489\r\n 30\r\n0.0\r\n 11\r\n538211.4082992304\r\n 21\r\n185790.0677983291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n926\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538205.2690463632\r\n 20\r\n185691.7211242995\r\n 30\r\n0.0\r\n 11\r\n538264.0196099377\r\n 21\r\n185727.6089360475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n927\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538246.5940171504\r\n 20\r\n185754.2603269081\r\n 30\r\n0.0\r\n 11\r\n538278.0792604868\r\n 21\r\n185703.0621686534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n928\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538243.6422897201\r\n 20\r\n185746.1762892745\r\n 30\r\n0.0\r\n 11\r\n538303.985940229\r\n 21\r\n185784.2173166059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n929\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538300.4333945551\r\n 20\r\n185785.3121937489\r\n 30\r\n0.0\r\n 11\r\n538331.0338157953\r\n 21\r\n185738.2462398686\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538269.0524297824\r\n 20\r\n185703.4573548131\r\n 30\r\n0.0\r\n 11\r\n538335.0666795332\r\n 21\r\n185744.0554659552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537950.820243172\r\n 20\r\n185162.6988744979\r\n 30\r\n0.0\r\n 11\r\n538032.7204148425\r\n 21\r\n185159.0300688376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537961.7244793911\r\n 20\r\n185241.6698390747\r\n 30\r\n0.0\r\n 11\r\n537958.9843065237\r\n 21\r\n185153.8636893305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537954.1309083346\r\n 20\r\n185225.8982378864\r\n 30\r\n0.0\r\n 11\r\n538117.9242639685\r\n 21\r\n185338.7077651193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537845.2692138033\r\n 20\r\n185399.3077348817\r\n 30\r\n0.0\r\n 11\r\n538201.5244735902\r\n 21\r\n185023.1626871957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n92F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538153.573417193\r\n 20\r\n185295.9110891822\r\n 30\r\n0.0\r\n 11\r\n538028.8968681939\r\n 21\r\n185157.0024973315\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n930\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538110.9875296714\r\n 20\r\n185339.0394558662\r\n 30\r\n0.0\r\n 11\r\n538153.563706356\r\n 21\r\n185295.063441265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n931\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538347.5639967021\r\n 20\r\n185519.2718849074\r\n 30\r\n0.0\r\n 11\r\n538137.7537732455\r\n 21\r\n185308.7353410838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n932\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538350.7571299851\r\n 20\r\n185375.1291508186\r\n 30\r\n0.0\r\n 11\r\n537885.5810351296\r\n 21\r\n184920.7955725819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n933\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538095.5750086255\r\n 20\r\n185028.8376616764\r\n 30\r\n0.0\r\n 11\r\n538235.7333668089\r\n 21\r\n184803.4429412633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n934\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538042.8660961822\r\n 20\r\n184983.5453049674\r\n 30\r\n0.0\r\n 11\r\n538194.4986783272\r\n 21\r\n185104.4464139107\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n935\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538088.9850414515\r\n 20\r\n184927.4610728313\r\n 30\r\n0.0\r\n 11\r\n538138.9349029161\r\n 21\r\n184967.9660977267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n936\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538040.9432712235\r\n 20\r\n184952.9415230164\r\n 30\r\n0.0\r\n 11\r\n538104.8631965004\r\n 21\r\n184927.417050924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n937\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538090.1330319084\r\n 20\r\n184941.5975310872\r\n 30\r\n0.0\r\n 11\r\n538281.4935232161\r\n 21\r\n184586.6633680119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n938\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538072.307469424\r\n 20\r\n184817.178123014\r\n 30\r\n0.0\r\n 11\r\n538342.8409772741\r\n 21\r\n184940.4345817006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n939\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538334.5525255559\r\n 20\r\n184950.8556451446\r\n 30\r\n0.0\r\n 11\r\n538446.3054322376\r\n 21\r\n184739.793901711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538438.1768482592\r\n 20\r\n185110.754990071\r\n 30\r\n0.0\r\n 11\r\n538331.9360073368\r\n 21\r\n184932.9355152621\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538192.79221278\r\n 20\r\n185254.3631671886\r\n 30\r\n0.0\r\n 11\r\n538411.8183995378\r\n 21\r\n185055.4554638381\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538173.3090674167\r\n 20\r\n185057.6969456334\r\n 30\r\n0.0\r\n 11\r\n538411.6300655914\r\n 21\r\n184662.8555463364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538605.9235865892\r\n 20\r\n185128.2845935083\r\n 30\r\n0.0\r\n 11\r\n538286.2399475104\r\n 21\r\n184954.0946146965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538505.7505698988\r\n 20\r\n185165.5577566305\r\n 30\r\n0.0\r\n 11\r\n538547.4940421457\r\n 21\r\n185055.7988833945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n93F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538465.1966319189\r\n 20\r\n185118.542995645\r\n 30\r\n0.0\r\n 11\r\n538568.7165055024\r\n 21\r\n185081.811038804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n940\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538107.7795575772\r\n 20\r\n185474.2808257707\r\n 30\r\n0.0\r\n 11\r\n538314.4841544041\r\n 21\r\n185231.6328740587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n941\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538229.1246635165\r\n 20\r\n185284.572763438\r\n 30\r\n0.0\r\n 11\r\n538556.1171595886\r\n 21\r\n185312.809171415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n942\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538443.4888289444\r\n 20\r\n185324.8896968279\r\n 30\r\n0.0\r\n 11\r\n538459.6365313105\r\n 21\r\n185158.8469818409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n943\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538455.9889421318\r\n 20\r\n185182.8528467175\r\n 30\r\n0.0\r\n 11\r\n538473.9396036967\r\n 21\r\n185101.4258487909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n944\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538444.8321139844\r\n 20\r\n185175.9393673298\r\n 30\r\n0.0\r\n 11\r\n538521.074896924\r\n 21\r\n185151.2171977781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n945\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538595.5563366735\r\n 20\r\n185238.6041270096\r\n 30\r\n0.0\r\n 11\r\n538509.233481124\r\n 21\r\n185146.8412632869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n946\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538258.1652718431\r\n 20\r\n185567.0304490767\r\n 30\r\n0.0\r\n 11\r\n538377.4093335351\r\n 21\r\n185477.2768007374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n947\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538228.3544023958\r\n 20\r\n184955.3074418012\r\n 30\r\n0.0\r\n 11\r\n538271.5071928632\r\n 21\r\n184973.9607689259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n948\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538235.7166201418\r\n 20\r\n185026.7941438338\r\n 30\r\n0.0\r\n 11\r\n538271.2999065937\r\n 21\r\n184972.0709552085\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n949\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538186.2562732346\r\n 20\r\n185023.7544677603\r\n 30\r\n0.0\r\n 11\r\n538266.7299385358\r\n 21\r\n185090.1391966294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538156.0353514726\r\n 20\r\n185192.8985733767\r\n 30\r\n0.0\r\n 11\r\n538370.8692513245\r\n 21\r\n184985.521798357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538364.7299984572\r\n 20\r\n184887.1751243276\r\n 30\r\n0.0\r\n 11\r\n538423.4805620318\r\n 21\r\n184923.0629360754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538406.0549692446\r\n 20\r\n184949.7143269358\r\n 30\r\n0.0\r\n 11\r\n538437.5402125808\r\n 21\r\n184898.5161686812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538244.943979526\r\n 20\r\n185423.3108344892\r\n 30\r\n0.0\r\n 11\r\n538319.8327647924\r\n 21\r\n185339.0716489233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538561.4867933374\r\n 20\r\n185114.7662861104\r\n 30\r\n0.0\r\n 11\r\n539127.0967414929\r\n 21\r\n185217.8593808671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n94F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538588.3144403077\r\n 20\r\n185178.0851155726\r\n 30\r\n0.0\r\n 11\r\n538811.5532858948\r\n 21\r\n185220.909437952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n950\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538474.6996822701\r\n 20\r\n185326.427722413\r\n 30\r\n0.0\r\n 11\r\n538615.0241558182\r\n 21\r\n185422.04121394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n951\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538414.3673936683\r\n 20\r\n185453.1652775622\r\n 30\r\n0.0\r\n 11\r\n539150.8013019747\r\n 21\r\n184398.8570169071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n952\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538592.5282977311\r\n 20\r\n185318.3521073253\r\n 30\r\n0.0\r\n 11\r\n538997.6937680966\r\n 21\r\n185487.835762065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n953\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538628.8368356242\r\n 20\r\n185259.0957397071\r\n 30\r\n0.0\r\n 11\r\n538533.6601007033\r\n 21\r\n185428.0658768367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n954\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538691.5571382496\r\n 20\r\n185295.6821011772\r\n 30\r\n0.0\r\n 11\r\n538659.5347575402\r\n 21\r\n185351.4513833656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n955\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538658.7424885215\r\n 20\r\n185252.317786453\r\n 30\r\n0.0\r\n 11\r\n538694.1323456457\r\n 21\r\n185311.3500957061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n956\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538677.7845838421\r\n 20\r\n185299.0694421985\r\n 30\r\n0.0\r\n 11\r\n539058.6899563309\r\n 21\r\n185431.387978166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n957\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538826.9885224897\r\n 20\r\n185155.5496877736\r\n 30\r\n0.0\r\n 11\r\n538719.2265685296\r\n 21\r\n185548.3588723946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n958\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538707.6172481076\r\n 20\r\n185541.838084518\r\n 30\r\n0.0\r\n 11\r\n538933.7975566249\r\n 21\r\n185618.5077638701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n959\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538566.286364202\r\n 20\r\n185669.632380236\r\n 30\r\n0.0\r\n 11\r\n538724.8909121459\r\n 21\r\n185536.3977027955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538547.7094339019\r\n 20\r\n185584.4450448938\r\n 30\r\n0.0\r\n 11\r\n538616.6755853611\r\n 21\r\n185634.7937262498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n539011.1086433176\r\n 20\r\n185189.6195949093\r\n 30\r\n0.0\r\n 11\r\n538982.7228988433\r\n 21\r\n185275.1552045073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n539090.2520782862\r\n 20\r\n185175.4465622335\r\n 30\r\n0.0\r\n 11\r\n538931.0649410907\r\n 21\r\n185619.9773315418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538576.4328149488\r\n 20\r\n185399.6932260825\r\n 30\r\n0.0\r\n 11\r\n538970.8091654945\r\n 21\r\n185555.5858829968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538658.2440018568\r\n 20\r\n185917.1169387221\r\n 30\r\n0.0\r\n 11\r\n538971.2895693079\r\n 21\r\n185548.6272561428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n95F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538553.7271723706\r\n 20\r\n186089.1058411073\r\n 30\r\n0.0\r\n 11\r\n538840.1227081429\r\n 21\r\n185695.9906509777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n960\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538575.4767454062\r\n 20\r\n185875.6166364597\r\n 30\r\n0.0\r\n 11\r\n538690.4873259018\r\n 21\r\n185899.3251603142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n961\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538615.4237445238\r\n 20\r\n185828.0851006367\r\n 30\r\n0.0\r\n 11\r\n538668.1918546128\r\n 21\r\n185924.4237088775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n962\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538727.7078894064\r\n 20\r\n185674.8025195414\r\n 30\r\n0.0\r\n 11\r\n538623.4366926458\r\n 21\r\n185847.8191340247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n963\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538514.4132508551\r\n 20\r\n185634.9665650709\r\n 30\r\n0.0\r\n 11\r\n538780.9383930338\r\n 21\r\n185774.579904677\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n964\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538455.918930015\r\n 20\r\n185720.009259043\r\n 30\r\n0.0\r\n 11\r\n538305.634055489\r\n 21\r\n185742.7299976086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n965\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538291.9706382603\r\n 20\r\n185370.3940992804\r\n 30\r\n0.0\r\n 11\r\n538291.9811632725\r\n 21\r\n185370.4007220331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n966\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538407.4697143141\r\n 20\r\n185573.9977691916\r\n 30\r\n0.0\r\n 11\r\n538630.9034748751\r\n 21\r\n185701.0529010041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n967\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538643.7165064174\r\n 20\r\n185698.4345068811\r\n 30\r\n0.0\r\n 11\r\n538630.6232893641\r\n 21\r\n185718.8874342814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n968\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538828.9914119887\r\n 20\r\n185655.6968883955\r\n 30\r\n0.0\r\n 11\r\n538864.6653422267\r\n 21\r\n185683.6523507348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n969\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538823.9374508764\r\n 20\r\n185641.007328742\r\n 30\r\n0.0\r\n 11\r\n538833.5465836131\r\n 21\r\n185663.0711226288\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538854.1362484448\r\n 20\r\n185584.4697084079\r\n 30\r\n0.0\r\n 11\r\n538822.132867692\r\n 21\r\n185648.7942448745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538602.1544421794\r\n 20\r\n185633.9319450027\r\n 30\r\n0.0\r\n 11\r\n538429.8712217547\r\n 21\r\n185940.049922711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538426.6473692368\r\n 20\r\n185796.1398550403\r\n 30\r\n0.0\r\n 11\r\n538565.0410782722\r\n 21\r\n185655.9037053136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538447.7259734861\r\n 20\r\n185262.5988138148\r\n 30\r\n0.0\r\n 11\r\n538438.3876748164\r\n 21\r\n185962.9560360679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538506.1371499462\r\n 20\r\n185790.9590416683\r\n 30\r\n0.0\r\n 11\r\n538580.909456926\r\n 21\r\n185846.8244362297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n96F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538550.468505471\r\n 20\r\n185829.2493238951\r\n 30\r\n0.0\r\n 11\r\n538633.7159528389\r\n 21\r\n185833.9869128063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n970\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538555.5145954715\r\n 20\r\n185817.1328893014\r\n 30\r\n0.0\r\n 11\r\n538592.0772762257\r\n 21\r\n185888.4583265156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n971\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538488.7631856539\r\n 20\r\n186019.9049442931\r\n 30\r\n0.0\r\n 11\r\n538594.5091295639\r\n 21\r\n185876.0706705564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n972\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538686.2892706148\r\n 20\r\n185437.7084670585\r\n 30\r\n0.0\r\n 11\r\n538674.7552392485\r\n 21\r\n185483.2834169584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n973\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538616.8910471252\r\n 20\r\n185456.3749448757\r\n 30\r\n0.0\r\n 11\r\n538676.5878236505\r\n 21\r\n185482.7774546147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n974\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538440.206655419\r\n 20\r\n185404.1982085089\r\n 30\r\n0.0\r\n 11\r\n538679.1852543343\r\n 21\r\n185583.2176504797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n975\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538775.2948097776\r\n 20\r\n185561.4757078123\r\n 30\r\n0.0\r\n 11\r\n538708.736655484\r\n 21\r\n185714.3325515911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n976\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538791.9701436699\r\n 20\r\n185273.5632884998\r\n 30\r\n0.0\r\n 11\r\n539046.4265204657\r\n 21\r\n185346.1284458889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n977\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538162.3788787743\r\n 20\r\n186053.3999999256\r\n 30\r\n0.0\r\n 11\r\n538044.7831239762\r\n 21\r\n185935.7459723394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n978\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538212.0529438026\r\n 20\r\n186139.58135618\r\n 30\r\n0.0\r\n 11\r\n538044.4452423011\r\n 21\r\n186216.7745436283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n979\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538633.3671606733\r\n 20\r\n185449.6300558871\r\n 30\r\n0.0\r\n 11\r\n538581.2367847845\r\n 21\r\n185554.5710751908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537816.4987150436\r\n 20\r\n185577.6609426168\r\n 30\r\n0.0\r\n 11\r\n537717.7406119495\r\n 21\r\n185405.8731977982\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536377.950798813\r\n 20\r\n183242.8256182219\r\n 30\r\n0.0\r\n 11\r\n536229.3811899697\r\n 21\r\n182702.1611796888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536365.4089121279\r\n 20\r\n183226.3197876327\r\n 30\r\n0.0\r\n 11\r\n537156.4467427117\r\n 21\r\n183220.8547826734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536503.2478305164\r\n 20\r\n183228.3149166955\r\n 30\r\n0.0\r\n 11\r\n536478.3100186013\r\n 21\r\n183082.589832233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536474.4919353847\r\n 20\r\n183115.0119310109\r\n 30\r\n0.0\r\n 11\r\n536505.6155181625\r\n 21\r\n183039.1672156401\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n97F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536403.8487205204\r\n 20\r\n183078.0680301967\r\n 30\r\n0.0\r\n 11\r\n536485.5658730114\r\n 21\r\n183110.3129595501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n980\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536416.4165601175\r\n 20\r\n183092.3428093075\r\n 30\r\n0.0\r\n 11\r\n536365.5791656758\r\n 21\r\n182900.0674543847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n981\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536294.0688341979\r\n 20\r\n183100.2090874555\r\n 30\r\n0.0\r\n 11\r\n536690.5251339838\r\n 21\r\n182926.1929282078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n982\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536417.6144112501\r\n 20\r\n182879.17450615\r\n 30\r\n0.0\r\n 11\r\n536506.2320532261\r\n 21\r\n183043.4509569607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n983\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536362.6341735878\r\n 20\r\n182904.685039179\r\n 30\r\n0.0\r\n 11\r\n536418.4089345704\r\n 21\r\n182879.4700293907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n984\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536272.9287582812\r\n 20\r\n182621.1271232333\r\n 30\r\n0.0\r\n 11\r\n536400.1994853068\r\n 21\r\n182889.7311593058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n985\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536298.8758903715\r\n 20\r\n182684.4391589704\r\n 30\r\n0.0\r\n 11\r\n536404.1762484465\r\n 21\r\n182643.0914153091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n986\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536368.8079794198\r\n 20\r\n182569.702787914\r\n 30\r\n0.0\r\n 11\r\n536644.0003308036\r\n 21\r\n183243.9299080776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n987\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536649.3881379984\r\n 20\r\n183023.9949835186\r\n 30\r\n0.0\r\n 11\r\n537078.7704213867\r\n 21\r\n182931.720272395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n988\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536674.2091429489\r\n 20\r\n183088.9068063282\r\n 30\r\n0.0\r\n 11\r\n536611.6473738665\r\n 21\r\n182905.3433481972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n989\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536742.5770769539\r\n 20\r\n183064.4481921625\r\n 30\r\n0.0\r\n 11\r\n536721.3297337248\r\n 21\r\n183003.7506130688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536702.3637101915\r\n 20\r\n183101.0562535959\r\n 30\r\n0.0\r\n 11\r\n536747.9830493849\r\n 21\r\n183049.5185837362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536729.6597324148\r\n 20\r\n183058.5916108926\r\n 30\r\n0.0\r\n 11\r\n537128.3753175386\r\n 21\r\n182998.4004160958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536850.0008617826\r\n 20\r\n183227.0485721637\r\n 30\r\n0.0\r\n 11\r\n536816.1333390501\r\n 21\r\n182821.1364078377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536803.5247511583\r\n 20\r\n182825.4166539249\r\n 30\r\n0.0\r\n 11\r\n537039.9320133069\r\n 21\r\n182791.5436839286\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536688.0380295237\r\n 20\r\n182673.8626441143\r\n 30\r\n0.0\r\n 11\r\n536819.5071266102\r\n 21\r\n182833.9337483539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n98F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536654.1478082748\r\n 20\r\n182754.1959332648\r\n 30\r\n0.0\r\n 11\r\n536731.1804359523\r\n 21\r\n182717.354461599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n990\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536960.6148925918\r\n 20\r\n183238.8174719675\r\n 30\r\n0.0\r\n 11\r\n536948.4034366646\r\n 21\r\n183149.5259754921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n991\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537112.4463272675\r\n 20\r\n183255.7881454086\r\n 30\r\n0.0\r\n 11\r\n537037.5153878978\r\n 21\r\n182789.5977295533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n992\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536648.4888120684\r\n 20\r\n182941.0815745938\r\n 30\r\n0.0\r\n 11\r\n537064.7716752467\r\n 21\r\n182860.1877913121\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n993\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536823.8387568325\r\n 20\r\n182447.4493576788\r\n 30\r\n0.0\r\n 11\r\n537063.9672847543\r\n 21\r\n182867.1164442443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n994\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536715.143687881\r\n 20\r\n182218.6083407707\r\n 30\r\n0.0\r\n 11\r\n536962.0622477265\r\n 21\r\n182698.1901910048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n995\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536734.862609048\r\n 20\r\n182473.0606628711\r\n 30\r\n0.0\r\n 11\r\n536852.2707044117\r\n 21\r\n182470.854563964\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n996\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536765.411374848\r\n 20\r\n182527.1141784302\r\n 30\r\n0.0\r\n 11\r\n536834.9582748474\r\n 21\r\n182442.0916544697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n997\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536847.6682510308\r\n 20\r\n182698.3948988279\r\n 30\r\n0.0\r\n 11\r\n536776.9087543582\r\n 21\r\n182509.1851607281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n998\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536598.1825266714\r\n 20\r\n182709.144270706\r\n 30\r\n0.0\r\n 11\r\n536918.3005795967\r\n 21\r\n182610.0767961406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n999\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536621.0589931053\r\n 20\r\n182799.8816461554\r\n 30\r\n0.0\r\n 11\r\n536598.5363384874\r\n 21\r\n182680.5493556573\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536503.9084506\r\n 20\r\n182718.8842404519\r\n 30\r\n0.0\r\n 11\r\n536574.3292366733\r\n 21\r\n182817.0098938511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536568.7496874731\r\n 20\r\n182813.2358711641\r\n 30\r\n0.0\r\n 11\r\n536622.5511225131\r\n 21\r\n182798.3018000183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536234.2614855521\r\n 20\r\n182862.0121884998\r\n 30\r\n0.0\r\n 11\r\n536757.322843783\r\n 21\r\n182654.8301815798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536769.4380237217\r\n 20\r\n182659.7548318349\r\n 30\r\n0.0\r\n 11\r\n536760.3193647292\r\n 21\r\n182637.2469525432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536943.7275287886\r\n 20\r\n182735.7578784313\r\n 30\r\n0.0\r\n 11\r\n536983.9247134773\r\n 21\r\n182714.8217012172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n99F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536936.0643799653\r\n 20\r\n182749.2709031056\r\n 30\r\n0.0\r\n 11\r\n536949.5582733074\r\n 21\r\n182729.3445066654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536955.3781314365\r\n 20\r\n182810.3892218956\r\n 30\r\n0.0\r\n 11\r\n536935.7190257515\r\n 21\r\n182741.2850835613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536716.7476580286\r\n 20\r\n182715.5375445312\r\n 30\r\n0.0\r\n 11\r\n536582.4825053728\r\n 21\r\n182302.4635152185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536571.9455827591\r\n 20\r\n182332.4241959598\r\n 30\r\n0.0\r\n 11\r\n536771.3499328064\r\n 21\r\n182304.9976130809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536368.4433207431\r\n 20\r\n182589.5319674376\r\n 30\r\n0.0\r\n 11\r\n536601.4676670191\r\n 21\r\n182311.5315737302\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536468.717144629\r\n 20\r\n182355.1780411351\r\n 30\r\n0.0\r\n 11\r\n536684.2951962053\r\n 21\r\n182687.1298386529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536564.7143357547\r\n 20\r\n182734.2287873409\r\n 30\r\n0.0\r\n 11\r\n536551.9223906497\r\n 21\r\n182701.0872745451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536651.1685099792\r\n 20\r\n182543.560206384\r\n 30\r\n0.0\r\n 11\r\n536734.9208493266\r\n 21\r\n182502.3608634954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536701.7722184314\r\n 20\r\n182514.0529278487\r\n 30\r\n0.0\r\n 11\r\n536784.4758630052\r\n 21\r\n182524.6684549728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536704.5097609086\r\n 20\r\n182526.8894722722\r\n 30\r\n0.0\r\n 11\r\n536753.5373333831\r\n 21\r\n182463.4824950933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536676.0922024562\r\n 20\r\n182315.3127737212\r\n 30\r\n0.0\r\n 11\r\n536753.655252238\r\n 21\r\n182476.1060455431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536145.8370627403\r\n 20\r\n182567.7590615311\r\n 30\r\n0.0\r\n 11\r\n536235.94668861\r\n 21\r\n182719.6690338856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536194.3164605139\r\n 20\r\n182671.5968735944\r\n 30\r\n0.0\r\n 11\r\n536423.0918593966\r\n 21\r\n182541.2103785556\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536763.4549964057\r\n 20\r\n182923.8660044065\r\n 30\r\n0.0\r\n 11\r\n536760.47798366\r\n 21\r\n182876.9485520774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536698.659257292\r\n 20\r\n182892.7844502254\r\n 30\r\n0.0\r\n 11\r\n536762.1866387764\r\n 21\r\n182877.7821354124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536684.8096896209\r\n 20\r\n182940.3633848721\r\n 30\r\n0.0\r\n 11\r\n536649.5170988597\r\n 21\r\n182842.1932464827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536515.4013251864\r\n 20\r\n182911.6607955009\r\n 30\r\n0.0\r\n 11\r\n536783.1668954148\r\n 21\r\n182779.5232507103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536873.6563625932\r\n 20\r\n182818.5285714787\r\n 30\r\n0.0\r\n 11\r\n536859.7281044162\r\n 21\r\n182751.1077484599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536828.7565280112\r\n 20\r\n182758.5043269772\r\n 30\r\n0.0\r\n 11\r\n536887.58160853\r\n 21\r\n182746.1681258376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536835.3679443507\r\n 20\r\n182764.0137310528\r\n 30\r\n0.0\r\n 11\r\n536819.9513197208\r\n 21\r\n182694.3660203783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536817.7205730532\r\n 20\r\n182697.3397564173\r\n 30\r\n0.0\r\n 11\r\n536872.3574897433\r\n 21\r\n182684.44025529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536884.1598861377\r\n 20\r\n182754.5306410416\r\n 30\r\n0.0\r\n 11\r\n536868.2523895976\r\n 21\r\n182678.6818483531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536328.5762214313\r\n 20\r\n182750.1339097506\r\n 30\r\n0.0\r\n 11\r\n536433.1636098655\r\n 21\r\n182708.109527257\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536837.2278100268\r\n 20\r\n183104.6135038196\r\n 30\r\n0.0\r\n 11\r\n537100.6781857253\r\n 21\r\n183079.9629601505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536668.1832728364\r\n 20\r\n183351.5686047555\r\n 30\r\n0.0\r\n 11\r\n537967.5584431446\r\n 21\r\n183342.5916741019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537314.3595309493\r\n 20\r\n183350.051808124\r\n 30\r\n0.0\r\n 11\r\n537289.4217190342\r\n 21\r\n183204.3267236614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537163.4826997652\r\n 20\r\n183284.1868211775\r\n 30\r\n0.0\r\n 11\r\n537657.9303096423\r\n 21\r\n183281.7032994896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537285.6036358177\r\n 20\r\n183236.7488224393\r\n 30\r\n0.0\r\n 11\r\n537316.7272185955\r\n 21\r\n183160.9041070683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537214.9604209535\r\n 20\r\n183199.8049216252\r\n 30\r\n0.0\r\n 11\r\n537296.6775734443\r\n 21\r\n183232.0498509783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537227.239076306\r\n 20\r\n183212.280511718\r\n 30\r\n0.0\r\n 11\r\n537176.4016818643\r\n 21\r\n183020.0051567952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537027.2468334006\r\n 20\r\n183256.1533388664\r\n 30\r\n0.0\r\n 11\r\n537501.6368344167\r\n 21\r\n183047.9298196365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537228.7261116832\r\n 20\r\n183000.9113975783\r\n 30\r\n0.0\r\n 11\r\n537317.3437536592\r\n 21\r\n183165.187848389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537173.7458740209\r\n 20\r\n183026.4219306075\r\n 30\r\n0.0\r\n 11\r\n537229.5206350034\r\n 21\r\n183001.206920819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537084.0404587141\r\n 20\r\n182742.8640146615\r\n 30\r\n0.0\r\n 11\r\n537211.3111857398\r\n 21\r\n183011.4680507342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537109.9875908043\r\n 20\r\n182806.1760503987\r\n 30\r\n0.0\r\n 11\r\n537215.2879488794\r\n 21\r\n182764.8283067376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537179.9196798528\r\n 20\r\n182691.4396793422\r\n 30\r\n0.0\r\n 11\r\n537491.2409488954\r\n 21\r\n183379.880430458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537460.4998384315\r\n 20\r\n183145.7318749472\r\n 30\r\n0.0\r\n 11\r\n537889.8821218196\r\n 21\r\n183053.4571638233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537485.3208433818\r\n 20\r\n183210.643697757\r\n 30\r\n0.0\r\n 11\r\n537422.7590742995\r\n 21\r\n183027.0802396259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537553.6887773869\r\n 20\r\n183186.1850835907\r\n 30\r\n0.0\r\n 11\r\n537532.4414341579\r\n 21\r\n183125.4875044973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537513.4754106245\r\n 20\r\n183222.7931450241\r\n 30\r\n0.0\r\n 11\r\n537559.0947498179\r\n 21\r\n183171.2554751645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537540.7714328479\r\n 20\r\n183180.328502321\r\n 30\r\n0.0\r\n 11\r\n537939.4870179715\r\n 21\r\n183120.1373075241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537737.9508085389\r\n 20\r\n183602.3443691874\r\n 30\r\n0.0\r\n 11\r\n537692.0225814107\r\n 21\r\n182912.5622043346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537614.6364515911\r\n 20\r\n182947.1535453535\r\n 30\r\n0.0\r\n 11\r\n537851.0437137399\r\n 21\r\n182913.2805753571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537499.1497299565\r\n 20\r\n182795.5995355427\r\n 30\r\n0.0\r\n 11\r\n537630.6188270431\r\n 21\r\n182955.6706397822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537465.2595087079\r\n 20\r\n182875.9328246934\r\n 30\r\n0.0\r\n 11\r\n537542.2921363853\r\n 21\r\n182839.0913530274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537848.3581093194\r\n 20\r\n183349.0727886068\r\n 30\r\n0.0\r\n 11\r\n537836.146653392\r\n 21\r\n183259.7812921317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537923.5580277004\r\n 20\r\n183377.525036837\r\n 30\r\n0.0\r\n 11\r\n537848.6270883307\r\n 21\r\n182911.3346209815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537459.6005125013\r\n 20\r\n183062.8184660221\r\n 30\r\n0.0\r\n 11\r\n537875.8833756796\r\n 21\r\n182981.9246827404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537698.132007023\r\n 20\r\n182681.9452738537\r\n 30\r\n0.0\r\n 11\r\n537875.0789851874\r\n 21\r\n182988.8533356727\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537409.2942271043\r\n 20\r\n182830.8811621344\r\n 30\r\n0.0\r\n 11\r\n537729.4122800297\r\n 21\r\n182731.8136875691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537432.1706935382\r\n 20\r\n182921.6185375839\r\n 30\r\n0.0\r\n 11\r\n537409.6480389204\r\n 21\r\n182802.2862470857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537315.020151033\r\n 20\r\n182840.6211318802\r\n 30\r\n0.0\r\n 11\r\n537385.4409371062\r\n 21\r\n182938.7467852796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537379.8613879062\r\n 20\r\n182934.9727625926\r\n 30\r\n0.0\r\n 11\r\n537433.662822946\r\n 21\r\n182920.0386914467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537045.3731859852\r\n 20\r\n182983.7490799281\r\n 30\r\n0.0\r\n 11\r\n537568.434544216\r\n 21\r\n182776.567073008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537580.5497241547\r\n 20\r\n182781.4917232632\r\n 30\r\n0.0\r\n 11\r\n537571.4310651623\r\n 21\r\n182758.9838439715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537754.8392292213\r\n 20\r\n182857.4947698596\r\n 30\r\n0.0\r\n 11\r\n537795.0364139103\r\n 21\r\n182836.5585926457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537747.1760803985\r\n 20\r\n182871.0077945341\r\n 30\r\n0.0\r\n 11\r\n537760.6699737404\r\n 21\r\n182851.0813980939\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537766.4898318695\r\n 20\r\n182932.1261133241\r\n 30\r\n0.0\r\n 11\r\n537746.8307261844\r\n 21\r\n182863.0219749897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537527.8593584616\r\n 20\r\n182837.2744359597\r\n 30\r\n0.0\r\n 11\r\n537424.3983140284\r\n 21\r\n182497.6427816799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537179.5550211762\r\n 20\r\n182711.268858866\r\n 30\r\n0.0\r\n 11\r\n537307.1622224056\r\n 21\r\n182552.0738509563\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537278.1562489779\r\n 20\r\n182540.8491264896\r\n 30\r\n0.0\r\n 11\r\n537495.4068966384\r\n 21\r\n182808.8667300813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537375.8260361876\r\n 20\r\n182855.9656787693\r\n 30\r\n0.0\r\n 11\r\n537363.0340910828\r\n 21\r\n182822.8241659735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537008.8862652714\r\n 20\r\n182810.8703354409\r\n 30\r\n0.0\r\n 11\r\n537234.2035598295\r\n 21\r\n182662.9472699839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537574.5666968386\r\n 20\r\n183045.6028958351\r\n 30\r\n0.0\r\n 11\r\n537571.5896840929\r\n 21\r\n182998.685443506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537509.770957725\r\n 20\r\n183014.5213416539\r\n 30\r\n0.0\r\n 11\r\n537573.2983392094\r\n 21\r\n182999.5190268409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537495.9213900537\r\n 20\r\n183062.1002763007\r\n 30\r\n0.0\r\n 11\r\n537460.6287992928\r\n 21\r\n182963.930137911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537326.5130256195\r\n 20\r\n183033.3976869292\r\n 30\r\n0.0\r\n 11\r\n537594.2785958478\r\n 21\r\n182901.2601421385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537139.6879218641\r\n 20\r\n182871.870801179\r\n 30\r\n0.0\r\n 11\r\n537244.2753102984\r\n 21\r\n182829.8464186852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537686.437641938\r\n 20\r\n183224.7317307152\r\n 30\r\n0.0\r\n 11\r\n537911.7898861585\r\n 21\r\n183201.699851579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537384.0731362219\r\n 20\r\n182569.6715993786\r\n 30\r\n0.0\r\n 11\r\n537341.4914932436\r\n 21\r\n182405.2948938519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536938.2648702544\r\n 20\r\n182666.0542430234\r\n 30\r\n0.0\r\n 11\r\n537667.5375991025\r\n 21\r\n182468.4868182959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537431.4830585261\r\n 20\r\n182461.4999882802\r\n 30\r\n0.0\r\n 11\r\n537408.8532674805\r\n 21\r\n182022.8980501202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537499.522088195\r\n 20\r\n182447.3466328855\r\n 30\r\n0.0\r\n 11\r\n537308.3317137799\r\n 21\r\n182479.8390757421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537486.27755914\r\n 20\r\n182375.9534913579\r\n 30\r\n0.0\r\n 11\r\n537422.9686723243\r\n 21\r\n182387.250860621\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537516.0053030976\r\n 20\r\n182421.4894800645\r\n 30\r\n0.0\r\n 11\r\n537472.4009309577\r\n 21\r\n182368.2361773191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537478.4362537891\r\n 20\r\n182387.7717511494\r\n 30\r\n0.0\r\n 11\r\n537482.5897499209\r\n 21\r\n181984.5598388484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537663.9262350628\r\n 20\r\n182295.8304543059\r\n 30\r\n0.0\r\n 11\r\n537257.8070860278\r\n 21\r\n182264.5425807582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537260.0221507038\r\n 20\r\n182277.6723364173\r\n 30\r\n0.0\r\n 11\r\n537264.2773369267\r\n 21\r\n182038.8886161115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537091.9928968431\r\n 20\r\n182367.516482641\r\n 30\r\n0.0\r\n 11\r\n537270.978645964\r\n 21\r\n182263.2524739281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537165.8946748286\r\n 20\r\n182413.7821465039\r\n 30\r\n0.0\r\n 11\r\n537141.8072843549\r\n 21\r\n182331.8607367166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537734.1446683246\r\n 20\r\n182041.325135984\r\n 30\r\n0.0\r\n 11\r\n537261.9709512213\r\n 21\r\n182040.9640442066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537349.4870275742\r\n 20\r\n182449.1673861692\r\n 30\r\n0.0\r\n 11\r\n537336.0038760495\r\n 21\r\n182025.3119497591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536890.1295156216\r\n 20\r\n182197.3518883977\r\n 30\r\n0.0\r\n 11\r\n537342.7156265724\r\n 21\r\n182027.2108126912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536682.7253259366\r\n 20\r\n182256.4761466977\r\n 30\r\n0.0\r\n 11\r\n537159.7019654085\r\n 21\r\n182100.8770561987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536901.2260387822\r\n 20\r\n182289.2733820865\r\n 30\r\n0.0\r\n 11\r\n536917.7687139625\r\n 21\r\n182173.0156183581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536959.4589628925\r\n 20\r\n182267.73420416\r\n 30\r\n0.0\r\n 11\r\n536886.6133485277\r\n 21\r\n182185.5203528457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537141.6640981017\r\n 20\r\n182213.8401640188\r\n 30\r\n0.0\r\n 11\r\n536943.5925651405\r\n 21\r\n182253.5251635965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537107.0946065559\r\n 20\r\n182428.0514063887\r\n 30\r\n0.0\r\n 11\r\n537065.7381378544\r\n 21\r\n182130.0292956218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537040.3370718799\r\n 20\r\n182490.194963187\r\n 30\r\n0.0\r\n 11\r\n537151.8275639878\r\n 21\r\n182442.0562501154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537173.0343628435\r\n 20\r\n182541.9275284717\r\n 30\r\n0.0\r\n 11\r\n537052.3031853124\r\n 21\r\n182538.504994595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537058.5538632543\r\n 20\r\n182541.0157000306\r\n 30\r\n0.0\r\n 11\r\n537040.8108937336\r\n 21\r\n182488.0741480516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537205.3812923094\r\n 20\r\n182845.4876896032\r\n 30\r\n0.0\r\n 11\r\n537205.378614935\r\n 21\r\n182845.4755459459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537173.8687728678\r\n 20\r\n182702.5576632234\r\n 30\r\n0.0\r\n 11\r\n537084.2512937638\r\n 21\r\n182296.0833831784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537091.0446870241\r\n 20\r\n182284.9084302434\r\n 30\r\n0.0\r\n 11\r\n537067.3708112243\r\n 21\r\n182290.3215787412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537193.8655766623\r\n 20\r\n182124.9673181983\r\n 30\r\n0.0\r\n 11\r\n537179.6066344044\r\n 21\r\n182081.9461636468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537205.983841036\r\n 20\r\n182134.6870586424\r\n 30\r\n0.0\r\n 11\r\n537188.4639597507\r\n 21\r\n182118.1885680334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n9FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537269.3997763168\r\n 20\r\n182125.365629562\r\n 30\r\n0.0\r\n 11\r\n537198.0451239174\r\n 21\r\n182133.7546671835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537137.7123270689\r\n 20\r\n182345.8191603759\r\n 30\r\n0.0\r\n 11\r\n536791.3878001819\r\n 21\r\n182404.5477427922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536837.6140617653\r\n 20\r\n182493.2880969794\r\n 30\r\n0.0\r\n 11\r\n537104.4935647696\r\n 21\r\n182373.3268658957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537131.9229468348\r\n 20\r\n182498.8876963849\r\n 30\r\n0.0\r\n 11\r\n537097.1657815568\r\n 21\r\n182506.2316184839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536957.4787259281\r\n 20\r\n182383.1377685347\r\n 30\r\n0.0\r\n 11\r\n536930.1606660249\r\n 21\r\n182293.8877612312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536936.4176440107\r\n 20\r\n182328.4765791578\r\n 30\r\n0.0\r\n 11\r\n536960.0843342996\r\n 21\r\n182248.5236554292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536949.5264579374\r\n 20\r\n182327.82082845\r\n 30\r\n0.0\r\n 11\r\n536894.7480693696\r\n 21\r\n182269.3103527759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536736.1254824033\r\n 20\r\n182322.1392231021\r\n 30\r\n0.0\r\n 11\r\n536907.2289191453\r\n 21\r\n182271.2067492784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537350.8228998787\r\n 20\r\n182332.9270539126\r\n 30\r\n0.0\r\n 11\r\n537304.0310177877\r\n 21\r\n182328.3850600403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537309.8074093944\r\n 20\r\n182391.9379034063\r\n 30\r\n0.0\r\n 11\r\n537305.126379028\r\n 21\r\n182326.8311786943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537354.5693372198\r\n 20\r\n182413.1966748707\r\n 30\r\n0.0\r\n 11\r\n537252.0278117451\r\n 21\r\n182432.3846551545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537299.2220449141\r\n 20\r\n182575.8610834282\r\n 30\r\n0.0\r\n 11\r\n537211.4698661906\r\n 21\r\n182290.4521023634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537264.4045760152\r\n 20\r\n182207.3396772141\r\n 30\r\n0.0\r\n 11\r\n537195.625478288\r\n 21\r\n182210.3395885852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537197.9890540169\r\n 20\r\n182242.0942957727\r\n 30\r\n0.0\r\n 11\r\n537195.1902526674\r\n 21\r\n182182.054819862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537204.4821528088\r\n 20\r\n182236.4459307558\r\n 30\r\n0.0\r\n 11\r\n537133.2673398275\r\n 21\r\n182240.5600927853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537135.8473412971\r\n 20\r\n182243.2364576972\r\n 30\r\n0.0\r\n 11\r\n537131.8246500621\r\n 21\r\n182187.2417458936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537202.9001912149\r\n 20\r\n182186.7661564309\r\n 30\r\n0.0\r\n 11\r\n537125.4853625582\r\n 21\r\n182190.3761567784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537541.020926995\r\n 20\r\n182288.917997405\r\n 30\r\n0.0\r\n 11\r\n537558.6925351086\r\n 21\r\n182024.9076490744\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536709.6910170015\r\n 20\r\n183412.2770954969\r\n 30\r\n0.0\r\n 11\r\n536848.0824291129\r\n 21\r\n183411.5819802481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536652.0278052007\r\n 20\r\n183549.5298098701\r\n 30\r\n0.0\r\n 11\r\n537082.31535887\r\n 21\r\n183637.4865535445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536731.9478128749\r\n 20\r\n183514.1285688017\r\n 30\r\n0.0\r\n 11\r\n537131.2479242355\r\n 21\r\n183570.3114738424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536850.5906547582\r\n 20\r\n183344.4712338936\r\n 30\r\n0.0\r\n 11\r\n536824.9151047095\r\n 21\r\n183694.6167044956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537037.8238678751\r\n 20\r\n183342.3029692122\r\n 30\r\n0.0\r\n 11\r\n537026.5099958148\r\n 21\r\n183431.7126291917\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537112.7341780836\r\n 20\r\n183313.0967442194\r\n 30\r\n0.0\r\n 11\r\n537042.4900830331\r\n 21\r\n183780.0163482421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536651.9614220067\r\n 20\r\n183632.4480693786\r\n 30\r\n0.0\r\n 11\r\n537069.0358905775\r\n 21\r\n183709.1560482073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536878.5293577574\r\n 20\r\n184041.5140416933\r\n 30\r\n0.0\r\n 11\r\n537068.1619396648\r\n 21\r\n183702.2358252833\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536767.0947426709\r\n 20\r\n183648.50789101\r\n 30\r\n0.0\r\n 11\r\n536764.5891841443\r\n 21\r\n183695.4528813116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536702.6144991729\r\n 20\r\n183680.2387752721\r\n 30\r\n0.0\r\n 11\r\n536766.2893793806\r\n 21\r\n183694.6021759327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537027.5353145481\r\n 20\r\n183313.5874311575\r\n 30\r\n0.0\r\n 11\r\n537503.9930656886\r\n 21\r\n183517.0350126194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537089.482264669\r\n 20\r\n183826.2803427426\r\n 30\r\n0.0\r\n 11\r\n537251.0272936064\r\n 21\r\n183476.297487684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537185.8732255069\r\n 20\r\n183876.7389394128\r\n 30\r\n0.0\r\n 11\r\n537490.2631320349\r\n 21\r\n183185.2055814617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537461.8756857302\r\n 20\r\n183419.6511291113\r\n 30\r\n0.0\r\n 11\r\n537892.1632393996\r\n 21\r\n183507.607872786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537486.0433738643\r\n 20\r\n183354.4932448803\r\n 30\r\n0.0\r\n 11\r\n537425.3287275618\r\n 21\r\n183538.6758983417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537554.6535545524\r\n 20\r\n183378.2638425367\r\n 30\r\n0.0\r\n 11\r\n537534.0170141136\r\n 21\r\n183439.1717968681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537514.0744746237\r\n 20\r\n183342.0615870769\r\n 30\r\n0.0\r\n 11\r\n537560.2092279274\r\n 21\r\n183393.1383925819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537705.0470616232\r\n 20\r\n183407.2199194994\r\n 30\r\n0.0\r\n 11\r\n537941.0958047653\r\n 21\r\n183440.4327930841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537469.3453519826\r\n 20\r\n183689.3887536004\r\n 30\r\n0.0\r\n 11\r\n537546.7441797636\r\n 21\r\n183725.4545437557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537902.141134846\r\n 20\r\n183314.4141268921\r\n 30\r\n0.0\r\n 11\r\n537846.9844232049\r\n 21\r\n183524.1326304348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537461.8093025364\r\n 20\r\n183502.5693886199\r\n 30\r\n0.0\r\n 11\r\n537878.883771107\r\n 21\r\n183579.2773674488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537413.8354556022\r\n 20\r\n183735.0003359903\r\n 30\r\n0.0\r\n 11\r\n537734.9325278087\r\n 21\r\n183830.847101955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537435.7992756382\r\n 20\r\n183644.037735822\r\n 30\r\n0.0\r\n 11\r\n537414.4764965815\r\n 21\r\n183763.5902540719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537383.3584609629\r\n 20\r\n183631.2096518854\r\n 30\r\n0.0\r\n 11\r\n537437.3071999261\r\n 21\r\n183645.6025132274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537048.3971590088\r\n 20\r\n183585.795859373\r\n 30\r\n0.0\r\n 11\r\n537573.5133491979\r\n 21\r\n183787.7130584098\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537585.5784478287\r\n 20\r\n183782.666954951\r\n 30\r\n0.0\r\n 11\r\n537576.6863493082\r\n 21\r\n183805.2652990483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537532.3303816995\r\n 20\r\n183727.4163520024\r\n 30\r\n0.0\r\n 11\r\n537432.2862892464\r\n 21\r\n184068.0701760955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537185.3093934284\r\n 20\r\n183856.9144235318\r\n 30\r\n0.0\r\n 11\r\n537314.5093317011\r\n 21\r\n184014.8195352259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537285.6175785159\r\n 20\r\n184026.3350695925\r\n 30\r\n0.0\r\n 11\r\n537500.1649237304\r\n 21\r\n183756.1486221057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537013.6487133441\r\n 20\r\n183759.0324063326\r\n 30\r\n0.0\r\n 11\r\n537240.4405838322\r\n 21\r\n183904.6846085185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537576.9426232004\r\n 20\r\n183518.6292102514\r\n 30\r\n0.0\r\n 11\r\n537574.4370646741\r\n 21\r\n183565.574200553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537512.4623797024\r\n 20\r\n183550.3600945134\r\n 30\r\n0.0\r\n 11\r\n537576.1372599103\r\n 21\r\n183564.723495174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537498.1355619702\r\n 20\r\n183502.9226847985\r\n 30\r\n0.0\r\n 11\r\n537463.8309090649\r\n 21\r\n183601.4423976639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537143.8309968407\r\n 20\r\n183696.7210650589\r\n 30\r\n0.0\r\n 11\r\n537248.8352594203\r\n 21\r\n183737.6927062702\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537391.2395886763\r\n 20\r\n183996.4500747515\r\n 30\r\n0.0\r\n 11\r\n537350.3113219837\r\n 21\r\n184161.2462355808\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536944.4856154441\r\n 20\r\n183904.550611194\r\n 30\r\n0.0\r\n 11\r\n537675.7061894037\r\n 21\r\n184094.7822399344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537439.7337446563\r\n 20\r\n184104.1399768607\r\n 30\r\n0.0\r\n 11\r\n537372.4735154652\r\n 21\r\n184620.2113384158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537507.9115172814\r\n 20\r\n184117.6091396818\r\n 30\r\n0.0\r\n 11\r\n537316.4043904086\r\n 21\r\n184087.038917755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537530.3843034036\r\n 20\r\n184042.9295421691\r\n 30\r\n0.0\r\n 11\r\n537481.5864236921\r\n 21\r\n184196.9880461829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537487.4251995858\r\n 20\r\n184177.3928308839\r\n 30\r\n0.0\r\n 11\r\n537546.7828506184\r\n 21\r\n184491.519098808\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537248.15088338\r\n 20\r\n184109.0374778735\r\n 30\r\n0.0\r\n 11\r\n537276.7817548089\r\n 21\r\n184528.4096720155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537048.3192415882\r\n 20\r\n184079.3756629772\r\n 30\r\n0.0\r\n 11\r\n537160.2876803599\r\n 21\r\n184126.3919819062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537180.4901634646\r\n 20\r\n184026.3127121513\r\n 30\r\n0.0\r\n 11\r\n537059.7994582482\r\n 21\r\n184030.9478648575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537066.0245997946\r\n 20\r\n184028.3744956174\r\n 30\r\n0.0\r\n 11\r\n537048.8143439454\r\n 21\r\n184081.4916113799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537209.7860812404\r\n 20\r\n183722.4429300512\r\n 30\r\n0.0\r\n 11\r\n537209.7835259888\r\n 21\r\n183722.4550999909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537179.7109393662\r\n 20\r\n183865.6823002111\r\n 30\r\n0.0\r\n 11\r\n537053.7451530563\r\n 21\r\n184905.0558512203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537285.7407702143\r\n 20\r\n184285.4650785877\r\n 30\r\n0.0\r\n 11\r\n536927.6087474007\r\n 21\r\n184218.7015045664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536902.8055636038\r\n 20\r\n184075.8875942751\r\n 30\r\n0.0\r\n 11\r\n537153.0466786208\r\n 21\r\n184181.3882749635\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537139.813173592\r\n 20\r\n184069.7633527361\r\n 30\r\n0.0\r\n 11\r\n537104.983989481\r\n 21\r\n184062.768950393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537462.5493017278\r\n 20\r\n184340.4592014045\r\n 30\r\n0.0\r\n 11\r\n537313.6253257588\r\n 21\r\n184238.528493825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537318.7630129435\r\n 20\r\n184174.9208309981\r\n 30\r\n0.0\r\n 11\r\n537314.7362410721\r\n 21\r\n184240.0712934394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537306.3306028621\r\n 20\r\n183991.1132651308\r\n 30\r\n0.0\r\n 11\r\n537239.5962059187\r\n 21\r\n184216.1875198294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536991.7276180069\r\n 20\r\n183956.6673871777\r\n 30\r\n0.0\r\n 11\r\n537153.3126790687\r\n 21\r\n183823.7473975823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537330.8101336117\r\n 20\r\n184188.0289479002\r\n 30\r\n0.0\r\n 11\r\n537214.2964619126\r\n 21\r\n184175.5887738653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536850.2916572344\r\n 20\r\n183348.5487562232\r\n 30\r\n0.0\r\n 11\r\n536977.0885638939\r\n 21\r\n183196.2768393831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538506.0844988089\r\n 20\r\n185996.3447167731\r\n 30\r\n0.0\r\n 11\r\n538433.2870751908\r\n 21\r\n186284.3947174916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538236.611476903\r\n 20\r\n186108.6966083801\r\n 30\r\n0.0\r\n 11\r\n538501.3841818756\r\n 21\r\n186090.1734869714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538247.6415314158\r\n 20\r\n186382.4893745176\r\n 30\r\n0.0\r\n 11\r\n538312.4594926409\r\n 21\r\n186052.7036418829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538263.2903968339\r\n 20\r\n185969.8818847871\r\n 30\r\n0.0\r\n 11\r\n538438.7877884853\r\n 21\r\n185924.2067003186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538302.4828347366\r\n 20\r\n185505.6609571547\r\n 30\r\n0.0\r\n 11\r\n538466.5488707956\r\n 21\r\n185498.6903299007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538307.9656860152\r\n 20\r\n186110.5507529264\r\n 30\r\n0.0\r\n 11\r\n538266.9062898205\r\n 21\r\n185870.3496443443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538508.4634052267\r\n 20\r\n186118.2405843548\r\n 30\r\n0.0\r\n 11\r\n538511.3285463617\r\n 21\r\n185828.1582219318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537396.4745148345\r\n 20\r\n184361.1420230591\r\n 30\r\n0.0\r\n 11\r\n536955.6363053342\r\n 21\r\n184369.5511270819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536878.220237347\r\n 20\r\n184474.6403155652\r\n 30\r\n0.0\r\n 11\r\n536764.0290457257\r\n 21\r\n184811.8648697378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536952.1839728251\r\n 20\r\n183640.2609312836\r\n 30\r\n0.0\r\n 11\r\n536790.915974635\r\n 21\r\n183915.5375969097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537476.9348578087\r\n 20\r\n186223.2748301299\r\n 30\r\n0.0\r\n 11\r\n537711.5158275844\r\n 21\r\n186252.9584421817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538395.4387740356\r\n 20\r\n184744.9613180355\r\n 30\r\n0.0\r\n 11\r\n538432.9385039107\r\n 21\r\n184349.3462321565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n539877.8866788756\r\n 20\r\n184891.7611603959\r\n 30\r\n0.0\r\n 11\r\n537310.6239412522\r\n 21\r\n184351.3091305436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537814.5552439405\r\n 20\r\n183508.1585503803\r\n 30\r\n0.0\r\n 11\r\n537814.8800670928\r\n 21\r\n183262.9120091844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537809.8786362737\r\n 20\r\n183474.8905254279\r\n 30\r\n0.0\r\n 11\r\n538029.4514137471\r\n 21\r\n183575.6202981426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537711.3315735654\r\n 20\r\n183935.324224936\r\n 30\r\n0.0\r\n 11\r\n538015.7214800934\r\n 21\r\n183243.7908669849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537987.3340337887\r\n 20\r\n183478.2364146344\r\n 30\r\n0.0\r\n 11\r\n538417.6215874582\r\n 21\r\n183566.1931583092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538011.5017219228\r\n 20\r\n183413.0785304034\r\n 30\r\n0.0\r\n 11\r\n537950.7870756203\r\n 21\r\n183597.2611838649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538080.1119026109\r\n 20\r\n183436.8491280599\r\n 30\r\n0.0\r\n 11\r\n538059.475362172\r\n 21\r\n183497.7570823913\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538067.254041463\r\n 20\r\n183442.8351735665\r\n 30\r\n0.0\r\n 11\r\n538466.5541528236\r\n 21\r\n183499.0180786073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538177.7383998855\r\n 20\r\n183382.9089995929\r\n 30\r\n0.0\r\n 11\r\n538156.1086146076\r\n 21\r\n183679.4097346112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538143.4576661646\r\n 20\r\n183675.2563626459\r\n 30\r\n0.0\r\n 11\r\n538380.1932672301\r\n 21\r\n183706.7528208766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538029.4991903743\r\n 20\r\n183827.9628345427\r\n 30\r\n0.0\r\n 11\r\n538159.3536776889\r\n 21\r\n183666.5791487954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537994.8037000412\r\n 20\r\n183747.9740391237\r\n 30\r\n0.0\r\n 11\r\n538072.202527822\r\n 21\r\n183784.0398292791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538427.5994829046\r\n 20\r\n183372.9994124152\r\n 30\r\n0.0\r\n 11\r\n538377.7963116212\r\n 21\r\n183708.7229530068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537987.2676505948\r\n 20\r\n183561.1546741433\r\n 30\r\n0.0\r\n 11\r\n538404.3421191655\r\n 21\r\n183637.8626529719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538136.6781661074\r\n 20\r\n184104.6134311353\r\n 30\r\n0.0\r\n 11\r\n538403.4681682527\r\n 21\r\n183630.9424300478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538078.3385411136\r\n 20\r\n184028.2843130171\r\n 30\r\n0.0\r\n 11\r\n538195.7628736324\r\n 21\r\n184029.3108907458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538108.3427770053\r\n 20\r\n183973.9266505879\r\n 30\r\n0.0\r\n 11\r\n538178.740252172\r\n 21\r\n184058.2462590448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538188.8749215336\r\n 20\r\n183801.8282701278\r\n 30\r\n0.0\r\n 11\r\n538120.0196803401\r\n 21\r\n183991.7392680226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537939.2938036606\r\n 20\r\n183793.5856215137\r\n 30\r\n0.0\r\n 11\r\n538260.3908758672\r\n 21\r\n183889.432387478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537961.2576236966\r\n 20\r\n183702.6230213453\r\n 30\r\n0.0\r\n 11\r\n537939.9348446399\r\n 21\r\n183822.175539595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537908.8168090213\r\n 20\r\n183689.7949374087\r\n 30\r\n0.0\r\n 11\r\n537962.7655479845\r\n 21\r\n183704.1877987506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537206.4826825364\r\n 20\r\n183499.6604219087\r\n 30\r\n0.0\r\n 11\r\n538098.9716972564\r\n 21\r\n183846.2983439329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538111.0367958871\r\n 20\r\n183841.2522404741\r\n 30\r\n0.0\r\n 11\r\n538102.1446973668\r\n 21\r\n183863.8505845716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538284.5540268816\r\n 20\r\n183763.5022230059\r\n 30\r\n0.0\r\n 11\r\n538324.9594953962\r\n 21\r\n183784.0335475451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538276.7555211362\r\n 20\r\n183750.06685945\r\n 30\r\n0.0\r\n 11\r\n538290.4489020112\r\n 21\r\n183769.8566990866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538295.4543408857\r\n 20\r\n183688.7576103305\r\n 30\r\n0.0\r\n 11\r\n538276.4904050032\r\n 21\r\n183758.0557452773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538057.7887297581\r\n 20\r\n183786.0016375257\r\n 30\r\n0.0\r\n 11\r\n537957.7446373048\r\n 21\r\n184126.6554616186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537710.7677414869\r\n 20\r\n183915.499709055\r\n 30\r\n0.0\r\n 11\r\n537839.9676797596\r\n 21\r\n184073.4048207491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537811.0759265745\r\n 20\r\n184084.9203551157\r\n 30\r\n0.0\r\n 11\r\n538025.6232717888\r\n 21\r\n183814.7339076289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537905.5753177196\r\n 20\r\n183768.8385715097\r\n 30\r\n0.0\r\n 11\r\n537893.116937401\r\n 21\r\n183802.1069121628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537993.940469664\r\n 20\r\n183958.6290663373\r\n 30\r\n0.0\r\n 11\r\n538078.1024465711\r\n 21\r\n183998.9850057228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538044.8380369068\r\n 20\r\n183987.6265221644\r\n 30\r\n0.0\r\n 11\r\n538127.4308714822\r\n 21\r\n183976.1807404638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538047.4464931892\r\n 20\r\n183974.7631257476\r\n 30\r\n0.0\r\n 11\r\n538097.1085396048\r\n 21\r\n184037.6744026663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538041.0278774243\r\n 20\r\n184137.8688116774\r\n 30\r\n0.0\r\n 11\r\n538097.0996440481\r\n 21\r\n184025.0503046117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537463.9253455385\r\n 20\r\n183879.6009256452\r\n 30\r\n0.0\r\n 11\r\n537765.8989318906\r\n 21\r\n183963.2698940417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538102.4009712589\r\n 20\r\n183577.2144957746\r\n 30\r\n0.0\r\n 11\r\n538099.8954127324\r\n 21\r\n183624.1594860762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538037.9207277609\r\n 20\r\n183608.9453800368\r\n 30\r\n0.0\r\n 11\r\n538101.5956079687\r\n 21\r\n183623.3087806971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538023.5939100288\r\n 20\r\n183561.5079703217\r\n 30\r\n0.0\r\n 11\r\n537989.2892571234\r\n 21\r\n183660.0276831871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537854.4824219396\r\n 20\r\n183591.9108842141\r\n 30\r\n0.0\r\n 11\r\n538123.5618546408\r\n 21\r\n183721.3519528138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538213.6549324865\r\n 20\r\n183681.4395983006\r\n 30\r\n0.0\r\n 11\r\n538200.4046453999\r\n 21\r\n183748.9969342792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538169.3603302017\r\n 20\r\n183741.9118504657\r\n 30\r\n0.0\r\n 11\r\n538228.306364558\r\n 21\r\n183753.6565084122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538175.916068853\r\n 20\r\n183736.3363101316\r\n 30\r\n0.0\r\n 11\r\n538161.1998603613\r\n 21\r\n183806.1353726237\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538158.9393539165\r\n 20\r\n183803.1841953439\r\n 30\r\n0.0\r\n 11\r\n538213.7030943297\r\n 21\r\n183815.5341965869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538224.8008101031\r\n 20\r\n183745.3287876775\r\n 30\r\n0.0\r\n 11\r\n538209.6560467433\r\n 21\r\n183821.3335502998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537669.289344899\r\n 20\r\n183755.306350582\r\n 30\r\n0.0\r\n 11\r\n537774.2936074787\r\n 21\r\n183796.2779917936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538145.3254268677\r\n 20\r\n184062.9117186055\r\n 30\r\n0.0\r\n 11\r\n538200.5195342072\r\n 21\r\n184558.2110496839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538095.2648878094\r\n 20\r\n184110.0597751467\r\n 30\r\n0.0\r\n 11\r\n538132.635675242\r\n 21\r\n184334.2760301617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537916.6979367347\r\n 20\r\n184055.0353602746\r\n 30\r\n0.0\r\n 11\r\n537875.7696700422\r\n 21\r\n184219.831521104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537591.4353194408\r\n 20\r\n183994.7426366546\r\n 30\r\n0.0\r\n 11\r\n538201.1645374622\r\n 21\r\n184153.3675254576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538033.3698653398\r\n 20\r\n184176.194425205\r\n 30\r\n0.0\r\n 11\r\n537841.8627384671\r\n 21\r\n184145.6242032781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538020.8431763577\r\n 20\r\n184247.7170109398\r\n 30\r\n0.0\r\n 11\r\n537957.4239974094\r\n 21\r\n184237.0561740283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538050.1119936939\r\n 20\r\n184201.8846930842\r\n 30\r\n0.0\r\n 11\r\n538007.0447717504\r\n 21\r\n184255.5733317061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538012.8835476444\r\n 20\r\n184235.978116407\r\n 30\r\n0.0\r\n 11\r\n538072.241198677\r\n 21\r\n184550.104384331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537773.6092314384\r\n 20\r\n184167.6227633967\r\n 30\r\n0.0\r\n 11\r\n537765.0484060659\r\n 21\r\n184477.7323845723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537735.2444292989\r\n 20\r\n183781.0282155746\r\n 30\r\n0.0\r\n 11\r\n537735.2418740472\r\n 21\r\n183781.0403855143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537469.4126087932\r\n 20\r\n184179.279231093\r\n 30\r\n0.0\r\n 11\r\n537866.2284132929\r\n 21\r\n184257.6630007943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537988.0076497864\r\n 20\r\n184399.0444869277\r\n 30\r\n0.0\r\n 11\r\n537839.0836738173\r\n 21\r\n184297.1137793482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537844.221361002\r\n 20\r\n184233.5061165213\r\n 30\r\n0.0\r\n 11\r\n537840.1945891305\r\n 21\r\n184298.6565789625\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n537831.7889509204\r\n 20\r\n184049.6985506539\r\n 30\r\n0.0\r\n 11\r\n537765.0545539771\r\n 21\r\n184274.7728053526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538221.7561228781\r\n 20\r\n184374.5939745554\r\n 30\r\n0.0\r\n 11\r\n537966.4165705449\r\n 21\r\n184395.8313820429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538569.6906192152\r\n 20\r\n184388.2048046587\r\n 30\r\n0.0\r\n 11\r\n538765.456750482\r\n 21\r\n184320.5106117761\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538404.532960823\r\n 20\r\n184182.2248015356\r\n 30\r\n0.0\r\n 11\r\n538881.4736310778\r\n 21\r\n184102.7907375266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538152.1867049226\r\n 20\r\n184204.6791144183\r\n 30\r\n0.0\r\n 11\r\n538687.6709561274\r\n 21\r\n184139.6857072004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538397.6492191518\r\n 20\r\n184274.5573956118\r\n 30\r\n0.0\r\n 11\r\n538436.3555897182\r\n 21\r\n184163.6910589407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538458.9476493293\r\n 20\r\n184264.6825743995\r\n 30\r\n0.0\r\n 11\r\n538403.3704857294\r\n 21\r\n184169.9367050105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538648.1345476928\r\n 20\r\n184247.0304825434\r\n 30\r\n0.0\r\n 11\r\n538446.1275750394\r\n 21\r\n184247.6741909795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538563.296467749\r\n 20\r\n184671.2499932127\r\n 30\r\n0.0\r\n 11\r\n538589.843897729\r\n 21\r\n184150.1222103075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538584.7306784826\r\n 20\r\n184306.9718923631\r\n 30\r\n0.0\r\n 11\r\n538560.4569171519\r\n 21\r\n184307.7061150138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538618.7422043328\r\n 20\r\n184375.7556243205\r\n 30\r\n0.0\r\n 11\r\n538184.7499534075\r\n 21\r\n184358.2053808167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538209.1863556376\r\n 20\r\n184378.4916169066\r\n 30\r\n0.0\r\n 11\r\n538252.7188863369\r\n 21\r\n184181.9738542562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538177.4047095581\r\n 20\r\n184483.9306901377\r\n 30\r\n0.0\r\n 11\r\n538580.8321489674\r\n 21\r\n184396.3222899192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538434.6941270173\r\n 20\r\n184377.5261416259\r\n 30\r\n0.0\r\n 11\r\n538425.1458909358\r\n 21\r\n184284.6785709076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538424.5978688746\r\n 20\r\n184319.8244920206\r\n 30\r\n0.0\r\n 11\r\n538463.2751436005\r\n 21\r\n184245.9553464877\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538437.5861508965\r\n 20\r\n184321.7154022971\r\n 30\r\n0.0\r\n 11\r\n538395.1528567\r\n 21\r\n184253.718614422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538229.3095326769\r\n 20\r\n184274.8847787577\r\n 30\r\n0.0\r\n 11\r\n538407.0316221425\r\n 21\r\n184257.9921214577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nA9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538422.7037947091\r\n 20\r\n183903.0013639225\r\n 30\r\n0.0\r\n 11\r\n538370.1283136902\r\n 21\r\n183671.8726575186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538491.7553693318\r\n 20\r\n183849.7673101204\r\n 30\r\n0.0\r\n 11\r\n538406.5676464476\r\n 21\r\n183843.9045777167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538283.0786125945\r\n 20\r\n184054.7207939183\r\n 30\r\n0.0\r\n 11\r\n538179.8023475381\r\n 21\r\n183998.8321474391\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538283.104072871\r\n 20\r\n183992.6320752329\r\n 30\r\n0.0\r\n 11\r\n538180.7086615311\r\n 21\r\n184032.3911071209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538483.9962729265\r\n 20\r\n183892.9340296101\r\n 30\r\n0.0\r\n 11\r\n538235.9063290492\r\n 21\r\n183886.4996817873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538519.8065327198\r\n 20\r\n183994.0474627546\r\n 30\r\n0.0\r\n 11\r\n538513.3841593884\r\n 21\r\n183872.7782636668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538614.4040702685\r\n 20\r\n183887.5761744664\r\n 30\r\n0.0\r\n 11\r\n538569.2653270726\r\n 21\r\n183999.6039604346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538573.7905810559\r\n 20\r\n183994.6143018384\r\n 30\r\n0.0\r\n 11\r\n538517.9822807369\r\n 21\r\n183992.8665865164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538765.3257634245\r\n 20\r\n183942.5796194973\r\n 30\r\n0.0\r\n 11\r\n538353.0283476007\r\n 21\r\n183885.4527973906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538418.2350899841\r\n 20\r\n183852.5923292984\r\n 30\r\n0.0\r\n 11\r\n538353.0316749258\r\n 21\r\n184197.756404748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538452.3026074006\r\n 20\r\n184185.2264531618\r\n 30\r\n0.0\r\n 11\r\n538432.4939275087\r\n 21\r\n183893.2966974193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538559.7654428084\r\n 20\r\n183911.1811752413\r\n 30\r\n0.0\r\n 11\r\n538554.581288617\r\n 21\r\n183946.3254247748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538390.6367578734\r\n 20\r\n184034.5680462495\r\n 30\r\n0.0\r\n 11\r\n538297.4546042756\r\n 21\r\n184029.1897145885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538332.0634956199\r\n 20\r\n184035.3346913154\r\n 30\r\n0.0\r\n 11\r\n538265.3064492604\r\n 21\r\n183985.3739166687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538336.0011766956\r\n 20\r\n184022.814081135\r\n 30\r\n0.0\r\n 11\r\n538262.108396395\r\n 21\r\n184053.8625052031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538256.5602894736\r\n 20\r\n184220.9589837579\r\n 30\r\n0.0\r\n 11\r\n538268.2212810583\r\n 21\r\n184042.8171182967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538690.0497256613\r\n 20\r\n183781.0278188786\r\n 30\r\n0.0\r\n 11\r\n538391.9298545738\r\n 21\r\n183764.1970789722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n538320.4529850837\r\n 20\r\n183367.3444202856\r\n 30\r\n0.0\r\n 11\r\n538206.2617934625\r\n 21\r\n183704.568974458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535649.0581230556\r\n 20\r\n184628.1294401782\r\n 30\r\n0.0\r\n 11\r\n535631.7063125931\r\n 21\r\n184416.4013498721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nABA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536044.1049790082\r\n 20\r\n186337.1683777391\r\n 30\r\n0.0\r\n 11\r\n535278.8738929772\r\n 21\r\n186537.6480541799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nABC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536072.4992580615\r\n 20\r\n186395.8464045735\r\n 30\r\n0.0\r\n 11\r\n535593.9523860775\r\n 21\r\n186520.2549979555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535947.4422199873\r\n 20\r\n186595.5290238438\r\n 30\r\n0.0\r\n 11\r\n535803.0955322193\r\n 21\r\n186708.2359403478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536202.8271529145\r\n 20\r\n186974.3219773433\r\n 30\r\n0.0\r\n 11\r\n535694.707314849\r\n 21\r\n186335.5423163722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535818.8285570935\r\n 20\r\n186603.307553388\r\n 30\r\n0.0\r\n 11\r\n535425.4906564561\r\n 21\r\n186798.6765978215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535778.7584118029\r\n 20\r\n186546.5271828044\r\n 30\r\n0.0\r\n 11\r\n535884.678955602\r\n 21\r\n186708.9782724068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535718.5393726928\r\n 20\r\n186587.098916015\r\n 30\r\n0.0\r\n 11\r\n535754.1065128451\r\n 21\r\n186640.6771228112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535748.4765621386\r\n 20\r\n186541.7003508794\r\n 30\r\n0.0\r\n 11\r\n535716.9843364775\r\n 21\r\n186602.9008022333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nACA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535732.5023976116\r\n 20\r\n186589.5871421354\r\n 30\r\n0.0\r\n 11\r\n535360.9665969115\r\n 21\r\n186746.2978518829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nACB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535574.3164212192\r\n 20\r\n186456.0321643507\r\n 30\r\n0.0\r\n 11\r\n535707.2930778238\r\n 21\r\n186841.0372332034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nACC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535718.4556937626\r\n 20\r\n186833.7782387417\r\n 30\r\n0.0\r\n 11\r\n535497.7159083774\r\n 21\r\n186924.9358979981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nACD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535867.7666592935\r\n 20\r\n186952.1506862782\r\n 30\r\n0.0\r\n 11\r\n535700.8659413488\r\n 21\r\n186829.4680377467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nACE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535880.7872831714\r\n 20\r\n186865.9390409171\r\n 30\r\n0.0\r\n 11\r\n535815.2268489009\r\n 21\r\n186920.6487221414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nACF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535464.218589661\r\n 20\r\n186471.9204713913\r\n 30\r\n0.0\r\n 11\r\n535498.0845958487\r\n 21\r\n186555.4380421386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535312.8942598835\r\n 20\r\n186492.9379767162\r\n 30\r\n0.0\r\n 11\r\n535500.5379656564\r\n 21\r\n186926.2253977131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535840.1584424718\r\n 20\r\n186683.4354396475\r\n 30\r\n0.0\r\n 11\r\n535456.7067650441\r\n 21\r\n186864.5432457396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535792.0308519474\r\n 20\r\n187205.0714274164\r\n 30\r\n0.0\r\n 11\r\n535455.7766825467\r\n 21\r\n186857.6303431607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535953.8302439406\r\n 20\r\n187400.0170244034\r\n 30\r\n0.0\r\n 11\r\n535596.2123914296\r\n 21\r\n186996.1890934282\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535871.9364952116\r\n 20\r\n187158.2976954422\r\n 30\r\n0.0\r\n 11\r\n535758.7029100819\r\n 21\r\n187189.4052978565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535828.9949065974\r\n 20\r\n187113.4531907232\r\n 30\r\n0.0\r\n 11\r\n535782.5771207934\r\n 21\r\n187213.0071461503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535707.0189022852\r\n 20\r\n186967.7647106319\r\n 30\r\n0.0\r\n 11\r\n535822.2768904915\r\n 21\r\n187133.664763422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535946.1383772131\r\n 20\r\n186895.7886565231\r\n 30\r\n0.0\r\n 11\r\n535660.3624120137\r\n 21\r\n187070.7801707167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nADB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536093.3785918208\r\n 20\r\n186779.22303751\r\n 30\r\n0.0\r\n 11\r\n535805.3202201372\r\n 21\r\n186987.6902748207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nADC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535792.3645056573\r\n 20\r\n186985.9072360099\r\n 30\r\n0.0\r\n 11\r\n535806.7549013131\r\n 21\r\n187005.4692166076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nADD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535604.7106224969\r\n 20\r\n186955.2589929417\r\n 30\r\n0.0\r\n 11\r\n535570.922175215\r\n 21\r\n186985.4662437851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nADE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535608.8025781208\r\n 20\r\n186940.2729466015\r\n 30\r\n0.0\r\n 11\r\n535600.642619605\r\n 21\r\n186962.912767927\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nADF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535575.0054296454\r\n 20\r\n186885.809907368\r\n 30\r\n0.0\r\n 11\r\n535611.107705352\r\n 21\r\n186947.9266366771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535829.6616892381\r\n 20\r\n186918.8482636828\r\n 30\r\n0.0\r\n 11\r\n536061.6989027946\r\n 21\r\n187286.0212698194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536064.5174208748\r\n 20\r\n187254.3870307029\r\n 30\r\n0.0\r\n 11\r\n535878.0458398946\r\n 21\r\n187330.167382727\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536198.2878103921\r\n 20\r\n186955.0159237332\r\n 30\r\n0.0\r\n 11\r\n536041.0632611067\r\n 21\r\n187281.9180588759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536158.9397449123\r\n 20\r\n187206.8657446049\r\n 30\r\n0.0\r\n 11\r\n535868.1201696403\r\n 21\r\n186938.3701825645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535935.6475141795\r\n 20\r\n187069.3269479096\r\n 30\r\n0.0\r\n 11\r\n535864.6504141312\r\n 21\r\n187129.9178051844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535893.8891706733\r\n 20\r\n187110.4080328917\r\n 30\r\n0.0\r\n 11\r\n535811.1233449206\r\n 21\r\n187120.5273376794\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535888.0689337474\r\n 20\r\n187098.643856181\r\n 30\r\n0.0\r\n 11\r\n535856.2025322552\r\n 21\r\n187172.1875851703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535967.8130721198\r\n 20\r\n187296.6669088628\r\n 30\r\n0.0\r\n 11\r\n535852.9734771124\r\n 21\r\n187159.9834410502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535732.9947596506\r\n 20\r\n186728.4859055958\r\n 30\r\n0.0\r\n 11\r\n535747.4563138236\r\n 21\r\n186773.2181466402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535803.4562431559\r\n 20\r\n186742.6184977095\r\n 30\r\n0.0\r\n 11\r\n535745.5948075422\r\n 21\r\n186772.8319370493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535805.1377876865\r\n 20\r\n186693.0933732292\r\n 30\r\n0.0\r\n 11\r\n535863.5620270077\r\n 21\r\n186779.5199391322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535976.3903589083\r\n 20\r\n186679.1080442436\r\n 30\r\n0.0\r\n 11\r\n535749.5080107486\r\n 21\r\n186873.2294790124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535652.1920898013\r\n 20\r\n186857.7578841165\r\n 30\r\n0.0\r\n 11\r\n535682.3253639074\r\n 21\r\n186919.6573957788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535710.5142631384\r\n 20\r\n186904.8474707648\r\n 30\r\n0.0\r\n 11\r\n535656.5518900161\r\n 21\r\n186931.3169672393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535702.7478557151\r\n 20\r\n186901.1397389758\r\n 30\r\n0.0\r\n 11\r\n535734.8729477382\r\n 21\r\n186964.8300394907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535736.3009706147\r\n 20\r\n186961.3978262998\r\n 30\r\n0.0\r\n 11\r\n535686.5362572322\r\n 21\r\n186987.3798026816\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535657.8044169427\r\n 20\r\n186922.3687260173\r\n 30\r\n0.0\r\n 11\r\n535691.9352817553\r\n 21\r\n186991.9472562233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535616.9046285221\r\n 20\r\n186571.529962643\r\n 30\r\n0.0\r\n 11\r\n535367.6823060016\r\n 21\r\n186660.4230653926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535093.9650888768\r\n 20\r\n186451.4096970502\r\n 30\r\n0.0\r\n 11\r\n535154.0885972468\r\n 21\r\n186586.4758232478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535256.4286973283\r\n 20\r\n186478.0102726568\r\n 30\r\n0.0\r\n 11\r\n534777.8818253441\r\n 21\r\n186602.4188660389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535149.7886778084\r\n 20\r\n186554.1141029375\r\n 30\r\n0.0\r\n 11\r\n535138.3416224898\r\n 21\r\n186635.2933070427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535227.3633349829\r\n 20\r\n186572.484954252\r\n 30\r\n0.0\r\n 11\r\n535140.2165797861\r\n 21\r\n186561.4002107324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535212.3860523695\r\n 20\r\n186563.4247814637\r\n 30\r\n0.0\r\n 11\r\n535309.0943364181\r\n 21\r\n186737.2113188613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535395.3693409279\r\n 20\r\n186471.5616316553\r\n 30\r\n0.0\r\n 11\r\n534987.024971486\r\n 21\r\n186790.399808431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535263.0990040753\r\n 20\r\n186768.6254398828\r\n 30\r\n0.0\r\n 11\r\n535136.6871637996\r\n 21\r\n186631.2941419262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535310.0847298305\r\n 20\r\n186730.337642818\r\n 30\r\n0.0\r\n 11\r\n535262.2561282982\r\n 21\r\n186768.5350976643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535466.9826670145\r\n 20\r\n186982.9939123589\r\n 30\r\n0.0\r\n 11\r\n535277.370685492\r\n 21\r\n186754.098166188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nAFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535426.2159510503\r\n 20\r\n186928.0417294869\r\n 30\r\n0.0\r\n 11\r\n535334.3736976055\r\n 21\r\n186994.0932381661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535386.7565921814\r\n 20\r\n187056.4858454265\r\n 30\r\n0.0\r\n 11\r\n534915.1926836778\r\n 21\r\n186466.1477384471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535002.7579963602\r\n 20\r\n186685.4714214713\r\n 30\r\n0.0\r\n 11\r\n534433.1757887198\r\n 21\r\n186994.3605355972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534962.6878510696\r\n 20\r\n186628.6910508876\r\n 30\r\n0.0\r\n 11\r\n535068.6083948688\r\n 21\r\n186791.1421404901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534902.4688119596\r\n 20\r\n186669.2627840982\r\n 30\r\n0.0\r\n 11\r\n534938.0359521117\r\n 21\r\n186722.8409908944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534932.4060014054\r\n 20\r\n186623.8642189625\r\n 30\r\n0.0\r\n 11\r\n534900.9137757443\r\n 21\r\n186685.0646703165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534916.4318368784\r\n 20\r\n186671.7510102187\r\n 30\r\n0.0\r\n 11\r\n534786.9073252073\r\n 21\r\n186726.3833716639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534758.2458604859\r\n 20\r\n186538.196032434\r\n 30\r\n0.0\r\n 11\r\n534891.2225170906\r\n 21\r\n186923.2011012866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534902.3851330294\r\n 20\r\n186915.9421068249\r\n 30\r\n0.0\r\n 11\r\n534681.6453476442\r\n 21\r\n187007.0997660814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535051.6960985602\r\n 20\r\n187034.3145543616\r\n 30\r\n0.0\r\n 11\r\n534884.7953806155\r\n 21\r\n186911.63190583\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535064.716722438\r\n 20\r\n186948.1029090003\r\n 30\r\n0.0\r\n 11\r\n534999.1562881677\r\n 21\r\n187002.8125902247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534635.2210719854\r\n 20\r\n186561.7439201856\r\n 30\r\n0.0\r\n 11\r\n534669.0870781731\r\n 21\r\n186645.2614909329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535024.0878817386\r\n 20\r\n186765.5993077308\r\n 30\r\n0.0\r\n 11\r\n534640.636204311\r\n 21\r\n186946.7071138229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535055.8659344782\r\n 20\r\n187240.4615635254\r\n 30\r\n0.0\r\n 11\r\n534942.6323493486\r\n 21\r\n187271.5691659399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535012.9243458644\r\n 20\r\n187195.6170588064\r\n 30\r\n0.0\r\n 11\r\n534966.5065600603\r\n 21\r\n187295.1710142336\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534890.9483415519\r\n 20\r\n187049.9285787151\r\n 30\r\n0.0\r\n 11\r\n535006.2063297581\r\n 21\r\n187215.8286315053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535130.06781648\r\n 20\r\n186977.9525246064\r\n 30\r\n0.0\r\n 11\r\n534769.6503777293\r\n 21\r\n187209.2714730936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535085.5097921989\r\n 20\r\n186895.6653051118\r\n 30\r\n0.0\r\n 11\r\n535136.7805609917\r\n 21\r\n187005.7506074639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535219.0237330307\r\n 20\r\n186945.2521677223\r\n 30\r\n0.0\r\n 11\r\n535126.5684119001\r\n 21\r\n186867.5363742124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535132.9066622104\r\n 20\r\n186869.8169880601\r\n 30\r\n0.0\r\n 11\r\n535084.4536154681\r\n 21\r\n186897.5644772211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535445.0174913342\r\n 20\r\n186740.0159221909\r\n 30\r\n0.0\r\n 11\r\n534989.2496594038\r\n 21\r\n187069.854142904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534976.2939449241\r\n 20\r\n187068.0711040932\r\n 30\r\n0.0\r\n 11\r\n534990.68434058\r\n 21\r\n187087.6330846908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534788.6400617637\r\n 20\r\n187037.422861025\r\n 30\r\n0.0\r\n 11\r\n534729.1827484464\r\n 21\r\n187087.0008624204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534792.7320173874\r\n 20\r\n187022.4368146847\r\n 30\r\n0.0\r\n 11\r\n534784.5720588717\r\n 21\r\n187045.0766360102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534758.9348689123\r\n 20\r\n186967.9737754513\r\n 30\r\n0.0\r\n 11\r\n534795.0371446187\r\n 21\r\n187030.0905047604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535013.5911285049\r\n 20\r\n187001.0121317661\r\n 30\r\n0.0\r\n 11\r\n535197.6552260111\r\n 21\r\n187304.6142666616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535382.2172496589\r\n 20\r\n187037.1797918165\r\n 30\r\n0.0\r\n 11\r\n535297.8359402907\r\n 21\r\n187222.9388911312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535328.7147017309\r\n 20\r\n187226.6595128224\r\n 30\r\n0.0\r\n 11\r\n535052.049608907\r\n 21\r\n187020.5340506478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535156.3117485155\r\n 20\r\n186945.3855350409\r\n 30\r\n0.0\r\n 11\r\n535176.8856377365\r\n 21\r\n186974.3460048628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535119.5769534462\r\n 20\r\n187151.4908159928\r\n 30\r\n0.0\r\n 11\r\n535048.579853398\r\n 21\r\n187212.0816732677\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535077.8186099403\r\n 20\r\n187192.5719009749\r\n 30\r\n0.0\r\n 11\r\n534995.0527841873\r\n 21\r\n187202.6912057627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535071.9983730142\r\n 20\r\n187180.8077242643\r\n 30\r\n0.0\r\n 11\r\n535040.1319715219\r\n 21\r\n187254.3514532537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535120.0333856632\r\n 20\r\n187336.8118939866\r\n 30\r\n0.0\r\n 11\r\n535036.9029163791\r\n 21\r\n187242.1473091334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535523.0330148909\r\n 20\r\n186898.5464673954\r\n 30\r\n0.0\r\n 11\r\n535341.1814526257\r\n 21\r\n187097.4914995595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534916.9241989173\r\n 20\r\n186810.649773679\r\n 30\r\n0.0\r\n 11\r\n534931.3857530902\r\n 21\r\n186855.3820147234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534987.3856824226\r\n 20\r\n186824.7823657927\r\n 30\r\n0.0\r\n 11\r\n534929.5242468087\r\n 21\r\n186854.9958051326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534989.0672269532\r\n 20\r\n186775.2572413124\r\n 30\r\n0.0\r\n 11\r\n535047.4914662743\r\n 21\r\n186861.6838072155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535160.319798175\r\n 20\r\n186761.2719123269\r\n 30\r\n0.0\r\n 11\r\n534933.4374500154\r\n 21\r\n186955.3933470955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534836.1215290681\r\n 20\r\n186939.9217521998\r\n 30\r\n0.0\r\n 11\r\n534866.254803174\r\n 21\r\n187001.821263862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534894.4437024051\r\n 20\r\n186987.011338848\r\n 30\r\n0.0\r\n 11\r\n534840.4813292829\r\n 21\r\n187013.4808353226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534886.6772949818\r\n 20\r\n186983.3036070591\r\n 30\r\n0.0\r\n 11\r\n534918.8023870048\r\n 21\r\n187046.9939075741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534920.2304098814\r\n 20\r\n187043.5616943832\r\n 30\r\n0.0\r\n 11\r\n534870.465696499\r\n 21\r\n187069.5436707649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534841.7338562095\r\n 20\r\n187004.5325941006\r\n 30\r\n0.0\r\n 11\r\n534875.864721022\r\n 21\r\n187074.1111243065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535381.2241621185\r\n 20\r\n186871.7065817206\r\n 30\r\n0.0\r\n 11\r\n535290.2397902417\r\n 21\r\n186938.2378872666\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534800.8340677889\r\n 20\r\n186653.6938307262\r\n 30\r\n0.0\r\n 11\r\n534551.6117452683\r\n 21\r\n186742.5869334758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534315.9374838286\r\n 20\r\n186110.7368073677\r\n 30\r\n0.0\r\n 11\r\n535072.5823581115\r\n 21\r\n187921.5456161805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535060.4783531628\r\n 20\r\n187323.8429344235\r\n 30\r\n0.0\r\n 11\r\n535081.8613660606\r\n 21\r\n187550.1442192757\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535218.9609189549\r\n 20\r\n187224.8625394553\r\n 30\r\n0.0\r\n 11\r\n535300.7848955697\r\n 21\r\n187373.6500876221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535627.2033165716\r\n 20\r\n187021.4595680193\r\n 30\r\n0.0\r\n 11\r\n534938.2488278624\r\n 21\r\n187410.3482337611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535199.7075450184\r\n 20\r\n187341.3876688161\r\n 30\r\n0.0\r\n 11\r\n535329.8599296329\r\n 21\r\n187760.8446086559\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535137.264482519\r\n 20\r\n187371.8916189357\r\n 30\r\n0.0\r\n 11\r\n535314.5260884354\r\n 21\r\n187293.2287866729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535167.7153126758\r\n 20\r\n187437.8093339281\r\n 30\r\n0.0\r\n 11\r\n535226.2791814901\r\n 21\r\n187411.2401982319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535127.6710070983\r\n 20\r\n187401.0164185898\r\n 30\r\n0.0\r\n 11\r\n535183.0670851085\r\n 21\r\n187441.8640631253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535172.3980890155\r\n 20\r\n187424.4216926175\r\n 30\r\n0.0\r\n 11\r\n535267.8630374448\r\n 21\r\n187816.1914481792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535011.5144413881\r\n 20\r\n187559.0584404998\r\n 30\r\n0.0\r\n 11\r\n535416.6115988639\r\n 21\r\n187489.4018411997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535411.2253370809\r\n 20\r\n187477.224600987\r\n 30\r\n0.0\r\n 11\r\n535466.0201099505\r\n 21\r\n187709.6752507155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535551.890772004\r\n 20\r\n187348.698198324\r\n 30\r\n0.0\r\n 11\r\n535404.165619358\r\n 21\r\n187493.9020590748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535468.8582171794\r\n 20\r\n187322.0978358947\r\n 30\r\n0.0\r\n 11\r\n535512.4144401708\r\n 21\r\n187395.5428847416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534761.5383226473\r\n 20\r\n187886.4093640894\r\n 30\r\n0.0\r\n 11\r\n535467.7430850394\r\n 21\r\n187707.0949070089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535282.211313556\r\n 20\r\n187333.1069476038\r\n 30\r\n0.0\r\n 11\r\n535399.8612585677\r\n 21\r\n187740.5302125117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535789.4997419352\r\n 20\r\n187463.7929037642\r\n 30\r\n0.0\r\n 11\r\n535392.8884976999\r\n 21\r\n187740.3461435108\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535975.9026101069\r\n 20\r\n187355.3210338819\r\n 30\r\n0.0\r\n 11\r\n535552.0668299141\r\n 21\r\n187623.8001261673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535756.0652602497\r\n 20\r\n187377.4515506207\r\n 30\r\n0.0\r\n 11\r\n535768.7199492786\r\n 21\r\n187494.1965144302\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535704.9475115667\r\n 20\r\n187412.6933639361\r\n 30\r\n0.0\r\n 11\r\n535795.8265493328\r\n 21\r\n187474.3910249521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535541.6740385804\r\n 20\r\n187509.8790206878\r\n 30\r\n0.0\r\n 11\r\n535723.8293243902\r\n 21\r\n187422.5481371889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535522.3193812402\r\n 20\r\n187293.7612209985\r\n 30\r\n0.0\r\n 11\r\n535635.9322342677\r\n 21\r\n187572.3642641195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535571.6792890632\r\n 20\r\n187217.0670909279\r\n 30\r\n0.0\r\n 11\r\n535475.5139251245\r\n 21\r\n187291.2269743228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535430.3202100606\r\n 20\r\n187199.6762852104\r\n 30\r\n0.0\r\n 11\r\n535548.1629601752\r\n 21\r\n187173.2033327564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535541.4860475573\r\n 20\r\n187172.3125721767\r\n 30\r\n0.0\r\n 11\r\n535571.743415313\r\n 21\r\n187219.2392446545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535324.0718488141\r\n 20\r\n186913.4833764857\r\n 30\r\n0.0\r\n 11\r\n535324.0774397778\r\n 21\r\n186913.4944840446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535389.8771166202\r\n 20\r\n187044.2185976446\r\n 30\r\n0.0\r\n 11\r\n535577.0186818464\r\n 21\r\n187416.0124484055\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535573.1926850023\r\n 20\r\n187428.5181076536\r\n 30\r\n0.0\r\n 11\r\n535594.7989219584\r\n 21\r\n187417.4309485659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535513.0154098396\r\n 20\r\n187608.8843745172\r\n 30\r\n0.0\r\n 11\r\n535537.4486776886\r\n 21\r\n187647.0570426904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535498.8735477308\r\n 20\r\n187602.4552671278\r\n 30\r\n0.0\r\n 11\r\n535519.9226271356\r\n 21\r\n187614.120715633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535439.7183894071\r\n 20\r\n187627.1359707509\r\n 30\r\n0.0\r\n 11\r\n535506.7968675183\r\n 21\r\n187601.4000008731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535512.9386306098\r\n 20\r\n187381.005639796\r\n 30\r\n0.0\r\n 11\r\n535834.0641552604\r\n 21\r\n187238.6394860438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535767.3710462818\r\n 20\r\n187164.0489575836\r\n 30\r\n0.0\r\n 11\r\n535538.3429394452\r\n 21\r\n187346.1519294588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535480.7803021392\r\n 20\r\n187231.2413731987\r\n 30\r\n0.0\r\n 11\r\n535512.650735354\r\n 21\r\n187215.5484060904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535678.3914122045\r\n 20\r\n187300.3693789839\r\n 30\r\n0.0\r\n 11\r\n535726.886700457\r\n 21\r\n187380.1192831711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535712.2886086333\r\n 20\r\n187348.143795463\r\n 30\r\n0.0\r\n 11\r\n535709.0815591129\r\n 21\r\n187431.4642435856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535699.7469116659\r\n 20\r\n187352.0137888389\r\n 30\r\n0.0\r\n 11\r\n535767.2686885993\r\n 21\r\n187395.19893973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535907.9515918173\r\n 20\r\n187304.8643650759\r\n 30\r\n0.0\r\n 11\r\n535754.7058132201\r\n 21\r\n187396.4407501155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535309.5983215623\r\n 20\r\n187446.0828352542\r\n 30\r\n0.0\r\n 11\r\n535356.0641428375\r\n 21\r\n187438.9387893999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535334.7850856074\r\n 20\r\n187378.7762402243\r\n 30\r\n0.0\r\n 11\r\n535355.3860598539\r\n 21\r\n187440.7148994615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535286.161693467\r\n 20\r\n187369.219500009\r\n 30\r\n0.0\r\n 11\r\n535380.7981985624\r\n 21\r\n187325.3233163779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535299.6612624473\r\n 20\r\n187197.9279525986\r\n 30\r\n0.0\r\n 11\r\n535455.1230943988\r\n 21\r\n187452.8600026617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535424.3325575165\r\n 20\r\n187546.4639638863\r\n 30\r\n0.0\r\n 11\r\n535490.2448484002\r\n 21\r\n187526.585994603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535480.1190769222\r\n 20\r\n187496.3963163875\r\n 30\r\n0.0\r\n 11\r\n535497.6457072415\r\n 21\r\n187553.8888305634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535475.2204386095\r\n 20\r\n187503.472169832\r\n 30\r\n0.0\r\n 11\r\n535543.2181998905\r\n 21\r\n187481.9134041444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535540.0575937758\r\n 20\r\n187479.9563896547\r\n 30\r\n0.0\r\n 11\r\n535557.7722519484\r\n 21\r\n187533.2272135696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535489.0116612563\r\n 20\r\n187551.2255441356\r\n 30\r\n0.0\r\n 11\r\n535563.1421371856\r\n 21\r\n187528.6255366802\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535136.1400328259\r\n 20\r\n187535.6613407249\r\n 30\r\n0.0\r\n 11\r\n535184.1577223208\r\n 21\r\n187795.8690486325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536619.1422674942\r\n 20\r\n186063.4384918894\r\n 30\r\n0.0\r\n 11\r\n534385.6388024107\r\n 21\r\n186630.7233926483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536009.1899432151\r\n 20\r\n186152.3224343746\r\n 30\r\n0.0\r\n 11\r\n535530.6430712309\r\n 21\r\n186276.7310277567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535789.7596570048\r\n 20\r\n186038.0820289988\r\n 30\r\n0.0\r\n 11\r\n535621.7540618088\r\n 21\r\n186010.6925386679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535841.2831803683\r\n 20\r\n185583.6162998391\r\n 30\r\n0.0\r\n 11\r\n535707.9985295088\r\n 21\r\n186382.4418322399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535686.5980695482\r\n 20\r\n186094.6731859741\r\n 30\r\n0.0\r\n 11\r\n535247.9119028322\r\n 21\r\n186115.6067650437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535679.254929043\r\n 20\r\n186163.7796640695\r\n 30\r\n0.0\r\n 11\r\n535692.6464049468\r\n 21\r\n185970.3108384543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535606.9008764697\r\n 20\r\n186157.6731688996\r\n 30\r\n0.0\r\n 11\r\n535611.8706933489\r\n 21\r\n186093.5565047453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535655.1579625586\r\n 20\r\n186182.7434435389\r\n 30\r\n0.0\r\n 11\r\n535597.8467779507\r\n 21\r\n186144.6293563551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535617.8841629698\r\n 20\r\n186148.6996104211\r\n 30\r\n0.0\r\n 11\r\n535217.06732667\r\n 21\r\n186192.7786472781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535544.7715556255\r\n 20\r\n186342.3856498398\r\n 30\r\n0.0\r\n 11\r\n535473.4036100022\r\n 21\r\n185941.3640661544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535486.6882193292\r\n 20\r\n185942.2674764811\r\n 30\r\n0.0\r\n 11\r\n535249.5007487831\r\n 21\r\n185970.1578961421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535559.443817224\r\n 20\r\n185766.1640303519\r\n 30\r\n0.0\r\n 11\r\n535473.4247487389\r\n 21\r\n185954.5986390577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535612.8032851592\r\n 20\r\n185835.1187373975\r\n 30\r\n0.0\r\n 11\r\n535528.8985618088\r\n 21\r\n185819.265751531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535363.8624569724\r\n 20\r\n186390.6854996359\r\n 30\r\n0.0\r\n 11\r\n535352.7652373983\r\n 21\r\n186301.2486911264\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535298.4747702867\r\n 20\r\n186437.4723416302\r\n 30\r\n0.0\r\n 11\r\n535251.3374745445\r\n 21\r\n185967.6572451714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535666.2028374502\r\n 20\r\n186014.3023164108\r\n 30\r\n0.0\r\n 11\r\n535243.0967797666\r\n 21\r\n186042.8766108213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535312.5258796923\r\n 20\r\n185704.2535522482\r\n 30\r\n0.0\r\n 11\r\n535245.6512305763\r\n 21\r\n186049.3672237799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535416.487460791\r\n 20\r\n185333.088196827\r\n 30\r\n0.0\r\n 11\r\n535364.8931120207\r\n 21\r\n185568.1096593225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n536046.2969796299\r\n 20\r\n185831.6422799202\r\n 30\r\n0.0\r\n 11\r\n535487.5951750196\r\n 21\r\n185765.5373482527\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535477.148214591\r\n 20\r\n185773.4044177763\r\n 30\r\n0.0\r\n 11\r\n535480.189375884\r\n 21\r\n185749.310727523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535328.1803358655\r\n 20\r\n185891.5647570459\r\n 30\r\n0.0\r\n 11\r\n535266.9905951748\r\n 21\r\n185879.2653775681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535339.0528098024\r\n 20\r\n185902.6604767717\r\n 30\r\n0.0\r\n 11\r\n535320.899798502\r\n 21\r\n185886.861280167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535336.0598177444\r\n 20\r\n185966.6879075037\r\n 30\r\n0.0\r\n 11\r\n535337.3385210526\r\n 21\r\n185894.8531854739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535550.6666908782\r\n 20\r\n186027.1474802185\r\n 30\r\n0.0\r\n 11\r\n535541.5113962165\r\n 21\r\n185981.0357624278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535605.323856681\r\n 20\r\n185980.4875933348\r\n 30\r\n0.0\r\n 11\r\n535540.0736759655\r\n 21\r\n185982.279677201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535630.9125847318\r\n 20\r\n186022.9232215679\r\n 30\r\n0.0\r\n 11\r\n535639.8474398627\r\n 21\r\n185918.985204472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535787.2935449371\r\n 20\r\n185951.7331389566\r\n 30\r\n0.0\r\n 11\r\n535494.595068434\r\n 21\r\n185892.687959679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535417.1357243587\r\n 20\r\n185953.5961589125\r\n 30\r\n0.0\r\n 11\r\n535413.306971826\r\n 21\r\n185884.8582188327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535445.1396205757\r\n 20\r\n185884.0642463102\r\n 30\r\n0.0\r\n 11\r\n535385.1182318035\r\n 21\r\n185887.2272901695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535440.162310145\r\n 20\r\n185891.0849827503\r\n 30\r\n0.0\r\n 11\r\n535437.201021822\r\n 21\r\n185819.8129216839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535440.1198196912\r\n 20\r\n185822.1150849543\r\n 30\r\n0.0\r\n 11\r\n535384.0020468323\r\n 21\r\n185823.6595473568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535390.570210269\r\n 20\r\n185894.4325504339\r\n 30\r\n0.0\r\n 11\r\n535386.493008466\r\n 21\r\n185817.0409215329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535176.3899097375\r\n 20\r\n186455.1643532043\r\n 30\r\n0.0\r\n 11\r\n535176.1881728044\r\n 21\r\n186225.9779133883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535193.3728299822\r\n 20\r\n186389.7491184667\r\n 30\r\n0.0\r\n 11\r\n534868.9928159219\r\n 21\r\n186336.3803769501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535120.7169243895\r\n 20\r\n186220.9422211613\r\n 30\r\n0.0\r\n 11\r\n535077.1945969464\r\n 21\r\n186402.45157567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535180.4008373886\r\n 20\r\n186231.4989421477\r\n 30\r\n0.0\r\n 11\r\n535120.0247670033\r\n 21\r\n186221.4316283989\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535194.3829037004\r\n 20\r\n185934.4187256195\r\n 30\r\n0.0\r\n 11\r\n535140.2568009018\r\n 21\r\n186226.6794502267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535073.9299995649\r\n 20\r\n186013.6552183236\r\n 30\r\n0.0\r\n 11\r\n534964.1750705812\r\n 21\r\n186654.5621188186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534933.8368236612\r\n 20\r\n186420.3610242562\r\n 30\r\n0.0\r\n 11\r\n534668.7196878103\r\n 21\r\n186433.0120968159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534926.4936831563\r\n 20\r\n186489.4675023514\r\n 30\r\n0.0\r\n 11\r\n534939.8851590602\r\n 21\r\n186295.9986767365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534854.1396305828\r\n 20\r\n186483.3610071817\r\n 30\r\n0.0\r\n 11\r\n534859.1094474623\r\n 21\r\n186419.2443430274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534902.3967166717\r\n 20\r\n186508.4312818211\r\n 30\r\n0.0\r\n 11\r\n534845.0855320638\r\n 21\r\n186470.3171946374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534865.122917083\r\n 20\r\n186474.3874487032\r\n 30\r\n0.0\r\n 11\r\n534464.3060807833\r\n 21\r\n186518.4664855602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534772.8410603143\r\n 20\r\n186559.7220764609\r\n 30\r\n0.0\r\n 11\r\n534720.6423641154\r\n 21\r\n186267.0519044365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534733.9269734424\r\n 20\r\n186267.9553147632\r\n 30\r\n0.0\r\n 11\r\n534496.7395028962\r\n 21\r\n186295.8457344243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534861.5969108653\r\n 20\r\n185960.9438478748\r\n 30\r\n0.0\r\n 11\r\n534720.663502852\r\n 21\r\n186280.2864773399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535064.2461378692\r\n 20\r\n186212.2592482234\r\n 30\r\n0.0\r\n 11\r\n534776.1373159221\r\n 21\r\n186144.9535898132\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534913.4415915634\r\n 20\r\n186339.9901546929\r\n 30\r\n0.0\r\n 11\r\n534490.33553388\r\n 21\r\n186368.5644491034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534622.3544160384\r\n 20\r\n185848.4946772513\r\n 30\r\n0.0\r\n 11\r\n534660.5457259393\r\n 21\r\n186210.5460571149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535293.5357337432\r\n 20\r\n186157.3301182024\r\n 30\r\n0.0\r\n 11\r\n534976.4236209976\r\n 21\r\n186125.0078848395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535001.4616769477\r\n 20\r\n186133.8790524274\r\n 30\r\n0.0\r\n 11\r\n534802.517987515\r\n 21\r\n185784.6896027268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nB9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534876.4274104778\r\n 20\r\n185870.5294370419\r\n 30\r\n0.0\r\n 11\r\n534730.5918755537\r\n 21\r\n185951.5413389166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535284.4647476339\r\n 20\r\n185980.8759516614\r\n 30\r\n0.0\r\n 11\r\n535142.8676494943\r\n 21\r\n185933.7047163851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534797.9054449913\r\n 20\r\n186352.8353185006\r\n 30\r\n0.0\r\n 11\r\n534788.7501503297\r\n 21\r\n186306.7236007099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534852.5626107943\r\n 20\r\n186306.1754316169\r\n 30\r\n0.0\r\n 11\r\n534787.3124300786\r\n 21\r\n186307.9675154832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534878.151338845\r\n 20\r\n186348.61105985\r\n 30\r\n0.0\r\n 11\r\n534887.086193976\r\n 21\r\n186244.6730427542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535034.5322990501\r\n 20\r\n186277.4209772388\r\n 30\r\n0.0\r\n 11\r\n534741.8338225472\r\n 21\r\n186218.3757979611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534664.374478472\r\n 20\r\n186279.2839971947\r\n 30\r\n0.0\r\n 11\r\n534660.5457259393\r\n 21\r\n186210.5460571149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535173.6825358063\r\n 20\r\n186073.3823391721\r\n 30\r\n0.0\r\n 11\r\n535061.815428612\r\n 21\r\n186059.5866560993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535194.578432252\r\n 20\r\n185635.8937551822\r\n 30\r\n0.0\r\n 11\r\n535401.461030561\r\n 21\r\n185836.6217479292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535103.4200229305\r\n 20\r\n186064.72977994\r\n 30\r\n0.0\r\n 11\r\n535103.419496319\r\n 21\r\n186064.7173557932\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535101.9172540151\r\n 20\r\n185758.6967996004\r\n 30\r\n0.0\r\n 11\r\n535079.5950350825\r\n 21\r\n185502.6355365788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534987.1535696143\r\n 20\r\n185571.4007763362\r\n 30\r\n0.0\r\n 11\r\n535390.4806209565\r\n 21\r\n185532.3625558564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535273.8636907524\r\n 20\r\n185616.7485285761\r\n 30\r\n0.0\r\n 11\r\n535079.8401373477\r\n 21\r\n185582.4869303215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534822.7512757593\r\n 20\r\n185902.4195618786\r\n 30\r\n0.0\r\n 11\r\n535404.497080421\r\n 21\r\n185512.3435931971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535224.4539681542\r\n 20\r\n185554.265367827\r\n 30\r\n0.0\r\n 11\r\n535175.1006113234\r\n 21\r\n185446.6389761997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535739.1814437658\r\n 20\r\n185783.4852240454\r\n 30\r\n0.0\r\n 11\r\n535709.1316076679\r\n 21\r\n185947.0952454507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535544.0552051991\r\n 20\r\n186338.3604256307\r\n 30\r\n0.0\r\n 11\r\n535458.7509072162\r\n 21\r\n186517.2105554664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534557.5132893847\r\n 20\r\n188709.4671073466\r\n 30\r\n0.0\r\n 11\r\n534078.7111282838\r\n 21\r\n189277.7834406533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534356.231596675\r\n 20\r\n188753.5477289792\r\n 30\r\n0.0\r\n 11\r\n534250.4530444998\r\n 21\r\n188856.8366083633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534387.7094145916\r\n 20\r\n188915.137214011\r\n 30\r\n0.0\r\n 11\r\n534104.8479175942\r\n 21\r\n188509.583296129\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534279.3071116973\r\n 20\r\n188841.5652935944\r\n 30\r\n0.0\r\n 11\r\n534199.2053122115\r\n 21\r\n188859.023815117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534289.0209621512\r\n 20\r\n188920.691501156\r\n 30\r\n0.0\r\n 11\r\n534269.1501844531\r\n 21\r\n188835.1194223341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534293.6322883562\r\n 20\r\n188902.2400626908\r\n 30\r\n0.0\r\n 11\r\n534164.2491112132\r\n 21\r\n189053.2839180996\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534369.5931450922\r\n 20\r\n188998.4730747685\r\n 30\r\n0.0\r\n 11\r\n534001.2018272664\r\n 21\r\n188770.9932772706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534117.4997940166\r\n 20\r\n189022.3213050065\r\n 30\r\n0.0\r\n 11\r\n534202.3809702101\r\n 21\r\n188856.0834492446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534169.7222849479\r\n 20\r\n189053.0853305843\r\n 30\r\n0.0\r\n 11\r\n534117.2917871034\r\n 21\r\n189021.4995176764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533987.2820451778\r\n 20\r\n189287.9634099007\r\n 30\r\n0.0\r\n 11\r\n534136.0793077706\r\n 21\r\n189030.6594247062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534024.6557512186\r\n 20\r\n189230.6495928087\r\n 30\r\n0.0\r\n 11\r\n533930.8192540997\r\n 21\r\n189167.463256271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533890.5024755896\r\n 20\r\n189238.254233489\r\n 30\r\n0.0\r\n 11\r\n534313.0549878999\r\n 21\r\n188539.9172092332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534105.0630630806\r\n 20\r\n188749.3059962787\r\n 30\r\n0.0\r\n 11\r\n533785.2505457025\r\n 21\r\n188448.3014758329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534144.393078485\r\n 20\r\n188692.0104736309\r\n 30\r\n0.0\r\n 11\r\n534028.8391525893\r\n 21\r\n188847.7564473246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534085.4329589249\r\n 20\r\n188649.6300240285\r\n 30\r\n0.0\r\n 11\r\n534047.5419248361\r\n 21\r\n188701.5907326242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534138.4027586058\r\n 20\r\n188661.9371500156\r\n 30\r\n0.0\r\n 11\r\n534070.0745867984\r\n 21\r\n188653.6596829845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534087.9488873361\r\n 20\r\n188663.5880840061\r\n 30\r\n0.0\r\n 11\r\n533811.9602070268\r\n 21\r\n188369.6028019041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534158.2538218248\r\n 20\r\n188468.8653287749\r\n 30\r\n0.0\r\n 11\r\n533843.3949501841\r\n 21\r\n188727.2750522629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533854.0788294193\r\n 20\r\n188735.2218578901\r\n 30\r\n0.0\r\n 11\r\n533691.9335150255\r\n 21\r\n188559.8802806386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533794.9291670263\r\n 20\r\n188916.3492114355\r\n 30\r\n0.0\r\n 11\r\n533852.0119277566\r\n 21\r\n188717.2300503069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533880.2966608565\r\n 20\r\n188898.6185758231\r\n 30\r\n0.0\r\n 11\r\n533806.2235569675\r\n 21\r\n188856.1392274093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534192.1061369314\r\n 20\r\n188120.0411750974\r\n 30\r\n0.0\r\n 11\r\n534038.560469262\r\n 21\r\n188431.9015479835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534032.8547598519\r\n 20\r\n188236.5322474452\r\n 30\r\n0.0\r\n 11\r\n533691.7043628487\r\n 21\r\n188562.9745181988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534037.3303856688\r\n 20\r\n188797.1361810715\r\n 30\r\n0.0\r\n 11\r\n533734.3248614275\r\n 21\r\n188500.4496821728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533531.4485612727\r\n 20\r\n188933.1654001786\r\n 30\r\n0.0\r\n 11\r\n533740.4844665125\r\n 21\r\n188497.1766803831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533404.8291103822\r\n 20\r\n189152.5972658912\r\n 30\r\n0.0\r\n 11\r\n533659.3226478687\r\n 21\r\n188676.9917932062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533603.0616876657\r\n 20\r\n188991.8531668461\r\n 30\r\n0.0\r\n 11\r\n533534.5649698983\r\n 21\r\n188896.4711591908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533630.2015349752\r\n 20\r\n188936.0101876615\r\n 30\r\n0.0\r\n 11\r\n533520.7235654619\r\n 21\r\n188927.0561343128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533724.4602508802\r\n 20\r\n188771.0296635525\r\n 30\r\n0.0\r\n 11\r\n533608.9148788381\r\n 21\r\n188936.7296887813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533875.0010558523\r\n 20\r\n188970.2685696257\r\n 30\r\n0.0\r\n 11\r\n533611.6533331736\r\n 21\r\n188763.0539241843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533936.6916629213\r\n 20\r\n188899.906129223\r\n 30\r\n0.0\r\n 11\r\n533851.2645282592\r\n 21\r\n188986.217601172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533936.5598949222\r\n 20\r\n189042.3308882265\r\n 30\r\n0.0\r\n 11\r\n533977.3291642509\r\n 21\r\n188928.6400898097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533977.39174217\r\n 20\r\n188935.3758674577\r\n 30\r\n0.0\r\n 11\r\n533934.5438983906\r\n 21\r\n188899.5752644348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534207.5077871861\r\n 20\r\n189182.9805769916\r\n 30\r\n0.0\r\n 11\r\n533739.9144092359\r\n 21\r\n188870.1323688091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533737.0870201404\r\n 20\r\n188857.3638279377\r\n 30\r\n0.0\r\n 11\r\n533723.7403525454\r\n 21\r\n188877.652273816\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533700.6564906054\r\n 20\r\n188670.7462746741\r\n 30\r\n0.0\r\n 11\r\n533660.5949207275\r\n 21\r\n188649.5517519813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533716.1308612756\r\n 20\r\n188669.3789641419\r\n 30\r\n0.0\r\n 11\r\n533692.0663216224\r\n 21\r\n188669.5895915292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533755.4663603712\r\n 20\r\n188618.7707790478\r\n 30\r\n0.0\r\n 11\r\n533709.7541232065\r\n 21\r\n188674.198693898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533812.9250847721\r\n 20\r\n188869.0502998399\r\n 30\r\n0.0\r\n 11\r\n533549.1915001816\r\n 21\r\n189214.1617039826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533579.8355596115\r\n 20\r\n189205.818398264\r\n 30\r\n0.0\r\n 11\r\n533444.0115601664\r\n 21\r\n189057.2715927079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533907.0303599279\r\n 20\r\n189227.2925558879\r\n 30\r\n0.0\r\n 11\r\n533545.8726725557\r\n 21\r\n189193.3854812484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533657.1912689352\r\n 20\r\n189277.8596513352\r\n 30\r\n0.0\r\n 11\r\n533807.9746921486\r\n 21\r\n188911.8948285983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nBFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533914.6553188072\r\n 20\r\n188983.5686526164\r\n 30\r\n0.0\r\n 11\r\n533894.642651127\r\n 21\r\n189012.9197490576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533708.6210282044\r\n 20\r\n189020.69954408\r\n 30\r\n0.0\r\n 11\r\n533627.1446922855\r\n 21\r\n188975.1644270182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533655.5945538338\r\n 20\r\n188995.8076214645\r\n 30\r\n0.0\r\n 11\r\n533617.3610195242\r\n 21\r\n188921.7078299929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533664.6051489978\r\n 20\r\n188986.2640274697\r\n 30\r\n0.0\r\n 11\r\n533584.572042754\r\n 21\r\n188981.9224237718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533506.6024791567\r\n 20\r\n189129.8168516188\r\n 30\r\n0.0\r\n 11\r\n533594.8951225617\r\n 21\r\n188974.6559284607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534015.5371236648\r\n 20\r\n189422.8785670367\r\n 30\r\n0.0\r\n 11\r\n534089.3924771831\r\n 21\r\n189262.4361439317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534073.4693208243\r\n 20\r\n189324.0028685315\r\n 30\r\n0.0\r\n 11\r\n533836.2211857393\r\n 21\r\n189209.7568899539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533957.8667029707\r\n 20\r\n188712.2885380282\r\n 30\r\n0.0\r\n 11\r\n533920.9411801206\r\n 21\r\n188741.3851993519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533969.0846431969\r\n 20\r\n188783.2723998186\r\n 30\r\n0.0\r\n 11\r\n533920.6568601831\r\n 21\r\n188739.5054319043\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534016.1111272417\r\n 20\r\n188767.6494889127\r\n 30\r\n0.0\r\n 11\r\n533955.3544787583\r\n 21\r\n188852.4526297691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534088.7009854969\r\n 20\r\n188923.3856281208\r\n 30\r\n0.0\r\n 11\r\n533827.8674739919\r\n 21\r\n188778.0425491007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533808.5788008996\r\n 20\r\n188681.410743732\r\n 30\r\n0.0\r\n 11\r\n533760.9972611464\r\n 21\r\n188731.1657517926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533784.675202312\r\n 20\r\n188752.4566658391\r\n 30\r\n0.0\r\n 11\r\n533741.112446881\r\n 21\r\n188711.0458182762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533785.4549223951\r\n 20\r\n188743.8859951609\r\n 30\r\n0.0\r\n 11\r\n533736.8858061241\r\n 21\r\n188796.1307734819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533740.600329478\r\n 20\r\n188796.2779229899\r\n 30\r\n0.0\r\n 11\r\n533698.9525720323\r\n 21\r\n188758.6341440286\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533749.9387110799\r\n 20\r\n188709.1127106841\r\n 30\r\n0.0\r\n 11\r\n533696.5444641208\r\n 21\r\n188765.2833630762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534061.8589977427\r\n 20\r\n189168.8933915557\r\n 30\r\n0.0\r\n 11\r\n533967.8705054438\r\n 21\r\n189106.6781694724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534064.7356819831\r\n 20\r\n188548.9144032987\r\n 30\r\n0.0\r\n 11\r\n533894.8221488595\r\n 21\r\n188346.0766823975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533960.747825353\r\n 20\r\n187966.2146806913\r\n 30\r\n0.0\r\n 11\r\n533618.6462585406\r\n 21\r\n187483.4167843487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534092.0260363118\r\n 20\r\n187981.0780324602\r\n 30\r\n0.0\r\n 11\r\n533889.9867732282\r\n 21\r\n188120.0964040922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534482.2486223949\r\n 20\r\n188866.8031900984\r\n 30\r\n0.0\r\n 11\r\n533744.3816463227\r\n 21\r\n187772.8430918578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533918.8408404258\r\n 20\r\n188104.8250893232\r\n 30\r\n0.0\r\n 11\r\n533838.7390409401\r\n 21\r\n188122.2836108459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533928.5546908797\r\n 20\r\n188183.9512968847\r\n 30\r\n0.0\r\n 11\r\n533908.6839131813\r\n 21\r\n188098.379218063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533931.8494004686\r\n 20\r\n188166.7597113222\r\n 30\r\n0.0\r\n 11\r\n533802.4662233257\r\n 21\r\n188317.803566731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534081.5436796952\r\n 20\r\n188306.4498861776\r\n 30\r\n0.0\r\n 11\r\n533640.7355559948\r\n 21\r\n188034.2530729997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533757.033522745\r\n 20\r\n188285.5811007354\r\n 30\r\n0.0\r\n 11\r\n533841.9146989385\r\n 21\r\n188119.3432449735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533809.2560136765\r\n 20\r\n188316.345126313\r\n 30\r\n0.0\r\n 11\r\n533756.825515832\r\n 21\r\n188284.759313405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533626.8157739061\r\n 20\r\n188551.2232056296\r\n 30\r\n0.0\r\n 11\r\n533775.613036499\r\n 21\r\n188293.9192204351\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533664.1894799472\r\n 20\r\n188493.9093885375\r\n 30\r\n0.0\r\n 11\r\n533570.3529828282\r\n 21\r\n188430.723052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533530.0362043181\r\n 20\r\n188501.5140292179\r\n 30\r\n0.0\r\n 11\r\n533919.8580114896\r\n 21\r\n187854.2810271168\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533744.5967918091\r\n 20\r\n188012.5657920076\r\n 30\r\n0.0\r\n 11\r\n533424.7842744307\r\n 21\r\n187711.5612715618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533783.9268072136\r\n 20\r\n187955.2702693596\r\n 30\r\n0.0\r\n 11\r\n533668.372881318\r\n 21\r\n188111.0162430533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533724.9666876536\r\n 20\r\n187912.8898197572\r\n 30\r\n0.0\r\n 11\r\n533687.0756535645\r\n 21\r\n187964.8505283531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533777.9364873344\r\n 20\r\n187925.1969457444\r\n 30\r\n0.0\r\n 11\r\n533709.6083155268\r\n 21\r\n187916.9194787134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533727.4826160646\r\n 20\r\n187926.8478797349\r\n 30\r\n0.0\r\n 11\r\n533451.4939357553\r\n 21\r\n187632.8625976329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533797.7875505533\r\n 20\r\n187732.1251245037\r\n 30\r\n0.0\r\n 11\r\n533482.9286789124\r\n 21\r\n187990.5348479918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533493.6125581479\r\n 20\r\n187998.481653619\r\n 30\r\n0.0\r\n 11\r\n533331.4672437539\r\n 21\r\n187823.1400763673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533434.4628957546\r\n 20\r\n188179.6090071645\r\n 30\r\n0.0\r\n 11\r\n533491.5456564852\r\n 21\r\n187980.4898460357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533519.8303895849\r\n 20\r\n188161.878371552\r\n 30\r\n0.0\r\n 11\r\n533445.757285696\r\n 21\r\n188119.3990231381\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533725.6678888035\r\n 20\r\n187622.8851895573\r\n 30\r\n0.0\r\n 11\r\n533659.1102360578\r\n 21\r\n187683.6484174145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533672.3884885803\r\n 20\r\n187499.7920431741\r\n 30\r\n0.0\r\n 11\r\n533331.2380915771\r\n 21\r\n187826.2343139276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533676.8641143972\r\n 20\r\n188060.3959768004\r\n 30\r\n0.0\r\n 11\r\n533373.8585901557\r\n 21\r\n187763.7094779017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533146.5957557968\r\n 20\r\n188251.4100877043\r\n 30\r\n0.0\r\n 11\r\n533380.0181952408\r\n 21\r\n187760.4364761121\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533242.5954163944\r\n 20\r\n188255.1129625749\r\n 30\r\n0.0\r\n 11\r\n533174.0986986265\r\n 21\r\n188159.7309549197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533269.7352637037\r\n 20\r\n188199.2699833903\r\n 30\r\n0.0\r\n 11\r\n533160.2572941904\r\n 21\r\n188190.3159300416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533363.9939796087\r\n 20\r\n188034.2894592814\r\n 30\r\n0.0\r\n 11\r\n533248.4486075667\r\n 21\r\n188199.9894845101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533514.5347845807\r\n 20\r\n188233.5283653546\r\n 30\r\n0.0\r\n 11\r\n533251.187061902\r\n 21\r\n188026.3137199132\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533576.2253916496\r\n 20\r\n188163.1659249519\r\n 30\r\n0.0\r\n 11\r\n533490.7982569877\r\n 21\r\n188249.4773969008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533576.0936236506\r\n 20\r\n188305.5906839552\r\n 30\r\n0.0\r\n 11\r\n533616.8628929792\r\n 21\r\n188191.8998855386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533616.9254708984\r\n 20\r\n188198.6356631866\r\n 30\r\n0.0\r\n 11\r\n533574.077627119\r\n 21\r\n188162.8350601635\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533847.0415159145\r\n 20\r\n188446.2403727204\r\n 30\r\n0.0\r\n 11\r\n533379.4481379644\r\n 21\r\n188133.3921645379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533376.620748869\r\n 20\r\n188120.6236236665\r\n 30\r\n0.0\r\n 11\r\n533363.2740812741\r\n 21\r\n188140.9120695446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533340.1902193338\r\n 20\r\n187934.006070403\r\n 30\r\n0.0\r\n 11\r\n533300.128649456\r\n 21\r\n187912.8115477102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533355.6645900042\r\n 20\r\n187932.6387598706\r\n 30\r\n0.0\r\n 11\r\n533331.6000503509\r\n 21\r\n187932.8493872581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533395.0000890999\r\n 20\r\n187882.0305747765\r\n 30\r\n0.0\r\n 11\r\n533349.2878519349\r\n 21\r\n187937.4584896269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533452.4588135006\r\n 20\r\n188132.3100955687\r\n 30\r\n0.0\r\n 11\r\n533231.6784224093\r\n 21\r\n188410.3566154416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533546.5640886565\r\n 20\r\n188490.5523516167\r\n 30\r\n0.0\r\n 11\r\n533343.0621970856\r\n 21\r\n188475.9363167254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533350.297176501\r\n 20\r\n188506.1852176427\r\n 30\r\n0.0\r\n 11\r\n533447.508420877\r\n 21\r\n188175.1546243272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533554.1890475354\r\n 20\r\n188246.8284483454\r\n 30\r\n0.0\r\n 11\r\n533534.1763798556\r\n 21\r\n188276.1795447865\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533348.1547569327\r\n 20\r\n188283.9593398089\r\n 30\r\n0.0\r\n 11\r\n533266.6784210141\r\n 21\r\n188238.4242227471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533295.1282825622\r\n 20\r\n188259.0674171934\r\n 30\r\n0.0\r\n 11\r\n533256.8947482528\r\n 21\r\n188184.9676257218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533304.1388777264\r\n 20\r\n188249.5238231985\r\n 30\r\n0.0\r\n 11\r\n533224.1057714826\r\n 21\r\n188245.1822195005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533174.5272803235\r\n 20\r\n188348.7483021824\r\n 30\r\n0.0\r\n 11\r\n533234.4288512903\r\n 21\r\n188237.9157241895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533725.4728525103\r\n 20\r\n188574.456657789\r\n 30\r\n0.0\r\n 11\r\n533475.7549144679\r\n 21\r\n188473.0166856827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533597.4004316991\r\n 20\r\n187975.548333757\r\n 30\r\n0.0\r\n 11\r\n533560.4749088491\r\n 21\r\n188004.6449950807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533608.6183719253\r\n 20\r\n188046.5321955475\r\n 30\r\n0.0\r\n 11\r\n533560.1905889117\r\n 21\r\n188002.7652276331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533655.6448559702\r\n 20\r\n188030.9092846418\r\n 30\r\n0.0\r\n 11\r\n533594.8882074865\r\n 21\r\n188115.712425498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533728.2347142254\r\n 20\r\n188186.6454238496\r\n 30\r\n0.0\r\n 11\r\n533467.4012027203\r\n 21\r\n188041.3023448295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533448.112529628\r\n 20\r\n187944.6705394609\r\n 30\r\n0.0\r\n 11\r\n533400.5309898749\r\n 21\r\n187994.4255475215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533424.2089310404\r\n 20\r\n188015.7164615679\r\n 30\r\n0.0\r\n 11\r\n533380.6461756096\r\n 21\r\n187974.305614005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533424.9886511237\r\n 20\r\n188007.1457908898\r\n 30\r\n0.0\r\n 11\r\n533376.4195348527\r\n 21\r\n188059.3905692107\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533380.1340582064\r\n 20\r\n188059.5377187187\r\n 30\r\n0.0\r\n 11\r\n533338.4863007607\r\n 21\r\n188021.8939397574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533389.4724398083\r\n 20\r\n187972.3725064129\r\n 30\r\n0.0\r\n 11\r\n533336.0781928492\r\n 21\r\n188028.543158805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533701.3927264713\r\n 20\r\n188432.1531872845\r\n 30\r\n0.0\r\n 11\r\n533607.4042341724\r\n 21\r\n188369.9379652012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533704.2694107114\r\n 20\r\n187812.1741990278\r\n 30\r\n0.0\r\n 11\r\n533534.3558775881\r\n 21\r\n187609.3364781263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533175.6970995059\r\n 20\r\n188220.3147545992\r\n 30\r\n0.0\r\n 11\r\n532655.4448627076\r\n 21\r\n188465.0194945314\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533313.8654444766\r\n 20\r\n188402.6388471191\r\n 30\r\n0.0\r\n 11\r\n533202.7559908635\r\n 21\r\n188531.0428461079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533646.388072575\r\n 20\r\n188714.8300158017\r\n 30\r\n0.0\r\n 11\r\n533069.5921329468\r\n 21\r\n188226.7951355077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533197.9066944875\r\n 20\r\n188425.0523805634\r\n 30\r\n0.0\r\n 11\r\n532843.6663763799\r\n 21\r\n188684.704330224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533147.6153106242\r\n 20\r\n188377.0898562728\r\n 30\r\n0.0\r\n 11\r\n533282.943802676\r\n 21\r\n188515.9988817203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533096.3759611031\r\n 20\r\n188428.5381533069\r\n 30\r\n0.0\r\n 11\r\n533141.6302267151\r\n 21\r\n188474.2294779323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533116.9715900882\r\n 20\r\n188378.2083897967\r\n 30\r\n0.0\r\n 11\r\n533097.9051955084\r\n 21\r\n188444.3425573709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533110.5566061437\r\n 20\r\n188428.28000541\r\n 30\r\n0.0\r\n 11\r\n532776.3265078583\r\n 21\r\n188653.8622280066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532929.5351063394\r\n 20\r\n188327.8262756299\r\n 30\r\n0.0\r\n 11\r\n533134.4350096063\r\n 21\r\n188679.8599727173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533143.9836746984\r\n 20\r\n188670.5798870416\r\n 30\r\n0.0\r\n 11\r\n532945.0315411522\r\n 21\r\n188802.6927942477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533313.3624009986\r\n 20\r\n188757.8532955949\r\n 30\r\n0.0\r\n 11\r\n533125.8924855081\r\n 21\r\n188669.7515777499\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533309.4703294126\r\n 20\r\n188670.7508488964\r\n 30\r\n0.0\r\n 11\r\n533255.7236030304\r\n 21\r\n188737.1030091067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532760.3109855633\r\n 20\r\n188407.9772233068\r\n 30\r\n0.0\r\n 11\r\n532809.6843025367\r\n 21\r\n188483.3719616491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533234.3250746628\r\n 20\r\n188499.5449557109\r\n 30\r\n0.0\r\n 11\r\n532893.1205218853\r\n 21\r\n188751.3676701617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533287.9518486706\r\n 20\r\n189020.6443107427\r\n 30\r\n0.0\r\n 11\r\n532924.927540181\r\n 21\r\n188764.4635294863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533454.4086586428\r\n 20\r\n189157.773105065\r\n 30\r\n0.0\r\n 11\r\n533055.445001969\r\n 21\r\n188853.5597059197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533357.3073868794\r\n 20\r\n188959.3050643503\r\n 30\r\n0.0\r\n 11\r\n533252.2239717797\r\n 21\r\n189011.7169294218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533306.5062584413\r\n 20\r\n188923.6083560199\r\n 30\r\n0.0\r\n 11\r\n533280.2106583208\r\n 21\r\n189030.2579799969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533158.6658703738\r\n 20\r\n188804.2496591633\r\n 30\r\n0.0\r\n 11\r\n533303.8224281221\r\n 21\r\n188944.7373992113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533354.609919737\r\n 20\r\n188711.0432451002\r\n 30\r\n0.0\r\n 11\r\n533132.8052719798\r\n 21\r\n188914.3416323113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533443.6727279084\r\n 20\r\n188730.6953770002\r\n 30\r\n0.0\r\n 11\r\n533340.7311606862\r\n 21\r\n188666.2710084394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533410.8878722348\r\n 20\r\n188592.0952955483\r\n 30\r\n0.0\r\n 11\r\n533476.6391545755\r\n 21\r\n188693.4091634875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533475.1556176507\r\n 20\r\n188686.8384911694\r\n 30\r\n0.0\r\n 11\r\n533441.6580479251\r\n 21\r\n188731.5098882355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533642.3676091107\r\n 20\r\n188393.0670897887\r\n 30\r\n0.0\r\n 11\r\n533642.3591346374\r\n 21\r\n188393.0761903409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533542.6236322993\r\n 20\r\n188500.1799760925\r\n 30\r\n0.0\r\n 11\r\n533258.9648225294\r\n 21\r\n188804.7949995876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533245.9088162212\r\n 20\r\n188805.550290505\r\n 30\r\n0.0\r\n 11\r\n533263.8095899025\r\n 21\r\n188821.9611671926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533055.8700081143\r\n 20\r\n188811.7588395784\r\n 30\r\n0.0\r\n 11\r\n533028.5588840766\r\n 21\r\n188847.9284356091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533056.9875564872\r\n 20\r\n188796.2644286064\r\n 30\r\n0.0\r\n 11\r\n533053.3584333629\r\n 21\r\n188820.0546765659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533013.2988283583\r\n 20\r\n188749.362777014\r\n 30\r\n0.0\r\n 11\r\n533060.7288621851\r\n 21\r\n188803.3280831137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533269.5380431569\r\n 20\r\n188732.5458707275\r\n 30\r\n0.0\r\n 11\r\n533514.5678291421\r\n 21\r\n188984.2403845657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533561.3534292562\r\n 20\r\n188895.7936472422\r\n 30\r\n0.0\r\n 11\r\n533311.0450964412\r\n 21\r\n188744.2644269236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533398.812013349\r\n 20\r\n188650.3769333467\r\n 30\r\n0.0\r\n 11\r\n533424.5966082207\r\n 21\r\n188674.8135533515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533402.6159936026\r\n 20\r\n188859.6957374214\r\n 30\r\n0.0\r\n 11\r\n533344.6721587765\r\n 21\r\n188932.869176634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533369.5875381494\r\n 20\r\n188908.0748230476\r\n 30\r\n0.0\r\n 11\r\n533290.3394802066\r\n 21\r\n188934.0041029116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533361.6027688713\r\n 20\r\n188897.6577951062\r\n 30\r\n0.0\r\n 11\r\n533344.5555483907\r\n 21\r\n188975.9747146804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533478.1257172051\r\n 20\r\n189076.5283055594\r\n 30\r\n0.0\r\n 11\r\n533339.0280189092\r\n 21\r\n188964.6250737764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533137.8925834676\r\n 20\r\n188564.4631660981\r\n 30\r\n0.0\r\n 11\r\n533160.729268282\r\n 21\r\n188605.555692969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533209.7569790573\r\n 20\r\n188564.7070188652\r\n 30\r\n0.0\r\n 11\r\n533158.8282157264\r\n 21\r\n188605.536649204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533201.8322482928\r\n 20\r\n188515.7911299423\r\n 30\r\n0.0\r\n 11\r\n533275.8628790885\r\n 21\r\n188589.2922097849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533367.1502840121\r\n 20\r\n188468.961869401\r\n 30\r\n0.0\r\n 11\r\n533182.077165856\r\n 21\r\n188703.2835975423\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533083.6060937013\r\n 20\r\n188706.9176953847\r\n 30\r\n0.0\r\n 11\r\n533125.1377409663\r\n 21\r\n188761.8238519414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533149.9316774165\r\n 20\r\n188741.8436458843\r\n 30\r\n0.0\r\n 11\r\n533102.1046123628\r\n 21\r\n188778.24617059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533141.594983066\r\n 20\r\n188739.7073203964\r\n 30\r\n0.0\r\n 11\r\n533185.4270794335\r\n 21\r\n188795.9854088964\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533186.1646216841\r\n 20\r\n188792.3418710342\r\n 30\r\n0.0\r\n 11\r\n533142.361773903\r\n 21\r\n188827.4545513793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533101.6035714538\r\n 20\r\n188769.2245962995\r\n 30\r\n0.0\r\n 11\r\n533148.5419551448\r\n 21\r\n188830.8920588301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532993.6487211053\r\n 20\r\n188432.9116752496\r\n 30\r\n0.0\r\n 11\r\n532766.313591787\r\n 21\r\n188568.3091964116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534342.418987797\r\n 20\r\n188859.4888269258\r\n 30\r\n0.0\r\n 11\r\n535041.1571359639\r\n 21\r\n188606.5066843258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534534.3741274379\r\n 20\r\n188797.3384682259\r\n 30\r\n0.0\r\n 11\r\n534222.6936299359\r\n 21\r\n188332.6906515765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534453.323294102\r\n 20\r\n188685.8292292451\r\n 30\r\n0.0\r\n 11\r\n534586.7963206439\r\n 21\r\n188622.2474245328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534594.0885719828\r\n 20\r\n188771.1940418831\r\n 30\r\n0.0\r\n 11\r\n534034.5871467995\r\n 21\r\n187956.3988856886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534562.4969298503\r\n 20\r\n188644.0490266683\r\n 30\r\n0.0\r\n 11\r\n534606.5536739899\r\n 21\r\n188574.9107481938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534633.395276966\r\n 20\r\n188680.5009126278\r\n 30\r\n0.0\r\n 11\r\n534559.9569102708\r\n 21\r\n188632.2905944648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534614.4868337088\r\n 20\r\n188678.4537965122\r\n 30\r\n0.0\r\n 11\r\n534800.9292733384\r\n 21\r\n188609.2189101521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534678.5519897104\r\n 20\r\n188782.9836972875\r\n 30\r\n0.0\r\n 11\r\n534592.3486427728\r\n 21\r\n188358.6863907961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534788.0238202058\r\n 20\r\n188554.6512333887\r\n 30\r\n0.0\r\n 11\r\n534602.6972417204\r\n 21\r\n188576.8750509549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534798.8520678092\r\n 20\r\n188614.2864820481\r\n 30\r\n0.0\r\n 11\r\n534787.3244932632\r\n 21\r\n188554.1721268046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535082.2967784591\r\n 20\r\n188524.2240079788\r\n 30\r\n0.0\r\n 11\r\n534789.4297842628\r\n 21\r\n188574.967380576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535015.6002069867\r\n 20\r\n188539.4960375335\r\n 30\r\n0.0\r\n 11\r\n534988.7225627527\r\n 21\r\n188429.6079419225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535069.0832357024\r\n 20\r\n188416.2300748297\r\n 30\r\n0.0\r\n 11\r\n534273.6906374572\r\n 21\r\n188568.6690594344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534536.1152181576\r\n 20\r\n188448.6602559888\r\n 30\r\n0.0\r\n 11\r\n534364.1314518119\r\n 21\r\n188044.5496873147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534468.7599584501\r\n 20\r\n188465.7744611111\r\n 30\r\n0.0\r\n 11\r\n534654.8373345632\r\n 21\r\n188411.1417949609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534449.3582176149\r\n 20\r\n188395.8032480332\r\n 30\r\n0.0\r\n 11\r\n534511.2100066913\r\n 21\r\n188378.1963774951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534442.607819061\r\n 20\r\n188449.7633920994\r\n 30\r\n0.0\r\n 11\r\n534458.44569778\r\n 21\r\n188382.7826700915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534461.5876598364\r\n 20\r\n188402.9864281824\r\n 30\r\n0.0\r\n 11\r\n534281.0508963453\r\n 21\r\n188042.4263433427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534254.5657860476\r\n 20\r\n188401.6906691855\r\n 30\r\n0.0\r\n 11\r\n534605.8405935904\r\n 21\r\n188195.4924542807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534609.6070830462\r\n 20\r\n188208.2639284466\r\n 30\r\n0.0\r\n 11\r\n534501.0788297879\r\n 21\r\n187995.5260852271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534800.0167833604\r\n 20\r\n188215.3312327294\r\n 30\r\n0.0\r\n 11\r\n534593.4371319426\r\n 21\r\n188200.108568007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534753.8855132741\r\n 20\r\n188289.3169770472\r\n 30\r\n0.0\r\n 11\r\n534739.6121234155\r\n 21\r\n188205.1291507104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534127.7590375945\r\n 20\r\n188178.051666309\r\n 30\r\n0.0\r\n 11\r\n534504.061715031\r\n 21\r\n187996.3800245856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534604.40035436\r\n 20\r\n188401.6221614216\r\n 30\r\n0.0\r\n 11\r\n534430.6623416044\r\n 21\r\n188014.7755131572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534906.8235633151\r\n 20\r\n187973.8832557906\r\n 30\r\n0.0\r\n 11\r\n534425.4628749706\r\n 21\r\n188019.4251176826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535156.488421269\r\n 20\r\n187930.8682847123\r\n 30\r\n0.0\r\n 11\r\n534622.2457847449\r\n 21\r\n188005.3822538067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534937.1572461826\r\n 20\r\n188061.3621761767\r\n 30\r\n0.0\r\n 11\r\n534871.3120220185\r\n 21\r\n187964.1308325468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534875.3764938226\r\n 20\r\n188067.5386050841\r\n 30\r\n0.0\r\n 11\r\n534904.7956771976\r\n 21\r\n187961.70802099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534687.9901235956\r\n 20\r\n188098.9969443977\r\n 30\r\n0.0\r\n 11\r\n534883.405704264\r\n 21\r\n188047.8111827726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534822.953366526\r\n 20\r\n188309.1007252122\r\n 30\r\n0.0\r\n 11\r\n534719.4774529505\r\n 21\r\n187990.380365594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534907.6954397033\r\n 20\r\n188694.6210301165\r\n 30\r\n0.0\r\n 11\r\n534775.6518398568\r\n 21\r\n188147.7370788022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534764.6462774784\r\n 20\r\n188140.6725645359\r\n 30\r\n0.0\r\n 11\r\n534788.2964630404\r\n 21\r\n188135.1568329503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534602.1050007739\r\n 20\r\n188042.0134137412\r\n 30\r\n0.0\r\n 11\r\n534596.0557457803\r\n 21\r\n187997.0963380654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534595.4758680417\r\n 20\r\n188056.0626231478\r\n 30\r\n0.0\r\n 11\r\n534603.9872268712\r\n 21\r\n188033.5525542118\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534534.3942980067\r\n 20\r\n188075.4922831983\r\n 30\r\n0.0\r\n 11\r\n534602.2018414045\r\n 21\r\n188051.743611033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534749.4130227723\r\n 20\r\n188215.8785059482\r\n 30\r\n0.0\r\n 11\r\n535164.3885908858\r\n 21\r\n188087.6109622003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535053.0865184272\r\n 20\r\n188427.9533155489\r\n 30\r\n0.0\r\n 11\r\n535146.0381762112\r\n 21\r\n188077.3188132905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535186.8532867293\r\n 20\r\n188210.9670159163\r\n 30\r\n0.0\r\n 11\r\n534791.3297615979\r\n 21\r\n188226.0346389663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534927.7593634743\r\n 20\r\n188170.3877128874\r\n 30\r\n0.0\r\n 11\r\n534913.1759876781\r\n 21\r\n188078.1967949456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nC9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534922.7194174261\r\n 20\r\n188112.0266493305\r\n 30\r\n0.0\r\n 11\r\n534866.3908411974\r\n 21\r\n188050.5475980855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534910.6505059065\r\n 20\r\n188117.1853687731\r\n 30\r\n0.0\r\n 11\r\n534934.2256724622\r\n 21\r\n188040.5801526349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535213.9468003766\r\n 20\r\n187999.5703161947\r\n 30\r\n0.0\r\n 11\r\n534923.8402230674\r\n 21\r\n188047.7572252753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535199.1434991289\r\n 20\r\n188597.3491948433\r\n 30\r\n0.0\r\n 11\r\n535023.064663989\r\n 21\r\n188611.2282506775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535086.3416508714\r\n 20\r\n188617.5552892779\r\n 30\r\n0.0\r\n 11\r\n535061.093369618\r\n 21\r\n188355.4458741167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534552.2296856262\r\n 20\r\n188297.7384729914\r\n 30\r\n0.0\r\n 11\r\n534592.291654657\r\n 21\r\n188273.1387052013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534614.9674026566\r\n 20\r\n188332.7888607126\r\n 30\r\n0.0\r\n 11\r\n534590.6258539049\r\n 21\r\n188272.2224785161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534584.0599459788\r\n 20\r\n188371.5224981418\r\n 30\r\n0.0\r\n 11\r\n534684.631491202\r\n 21\r\n188343.804140949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534705.1290929152\r\n 20\r\n188493.4458110767\r\n 30\r\n0.0\r\n 11\r\n534658.8465861588\r\n 21\r\n188198.4599454638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534574.828360812\r\n 20\r\n188146.9750299248\r\n 30\r\n0.0\r\n 11\r\n534637.9580877661\r\n 21\r\n188119.5123037841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534649.7579355233\r\n 20\r\n188149.0878259552\r\n 30\r\n0.0\r\n 11\r\n534625.9466897634\r\n 21\r\n188093.9009023957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534641.4456051139\r\n 20\r\n188146.8585833822\r\n 30\r\n0.0\r\n 11\r\n534707.2529850864\r\n 21\r\n188119.3292416115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534706.1077988136\r\n 20\r\n188122.8658904667\r\n 30\r\n0.0\r\n 11\r\n534685.170091141\r\n 21\r\n188070.7774830026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534621.083352799\r\n 20\r\n188101.5158743744\r\n 30\r\n0.0\r\n 11\r\n534692.2418452411\r\n 21\r\n188070.8147872303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534067.3002023453\r\n 20\r\n188003.8214991741\r\n 30\r\n0.0\r\n 11\r\n534025.5032141101\r\n 21\r\n187765.8893586528\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534515.4513497963\r\n 20\r\n187931.4269758353\r\n 30\r\n0.0\r\n 11\r\n534002.546387197\r\n 21\r\n188020.2950563631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534502.2378070394\r\n 20\r\n187823.4330426864\r\n 30\r\n0.0\r\n 11\r\n533760.1825551896\r\n 21\r\n187965.6497911978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533969.2697894947\r\n 20\r\n187855.8632238454\r\n 30\r\n0.0\r\n 11\r\n533797.2860231489\r\n 21\r\n187451.7526551713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533901.9145297874\r\n 20\r\n187872.9774289677\r\n 30\r\n0.0\r\n 11\r\n534087.9919059005\r\n 21\r\n187818.3447628175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533882.512788952\r\n 20\r\n187803.0062158899\r\n 30\r\n0.0\r\n 11\r\n533944.3645780285\r\n 21\r\n187785.3993453517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533875.7623903983\r\n 20\r\n187856.9663599559\r\n 30\r\n0.0\r\n 11\r\n533891.6002691171\r\n 21\r\n187789.9856379482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533894.7422311735\r\n 20\r\n187810.1893960391\r\n 30\r\n0.0\r\n 11\r\n533714.2054676827\r\n 21\r\n187449.6293111992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533782.6701975751\r\n 20\r\n187753.2877346548\r\n 30\r\n0.0\r\n 11\r\n534038.9951649274\r\n 21\r\n187602.6954221372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534042.7616543834\r\n 20\r\n187615.4668963031\r\n 30\r\n0.0\r\n 11\r\n533934.233401125\r\n 21\r\n187402.7290530838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534233.1713546975\r\n 20\r\n187622.5342005861\r\n 30\r\n0.0\r\n 11\r\n534026.5917032798\r\n 21\r\n187607.3115358635\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534187.0400846114\r\n 20\r\n187696.519944904\r\n 30\r\n0.0\r\n 11\r\n534172.7666947527\r\n 21\r\n187612.332118567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533632.607411396\r\n 20\r\n187553.2629338686\r\n 30\r\n0.0\r\n 11\r\n533937.2162863679\r\n 21\r\n187403.5829924421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534037.5549256969\r\n 20\r\n187808.8251292782\r\n 30\r\n0.0\r\n 11\r\n533863.8169129417\r\n 21\r\n187421.9784810139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534400.0024326341\r\n 20\r\n187377.1971327206\r\n 30\r\n0.0\r\n 11\r\n533858.6174463078\r\n 21\r\n187426.6280855392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534370.3118175198\r\n 20\r\n187468.5651440334\r\n 30\r\n0.0\r\n 11\r\n534304.4665933558\r\n 21\r\n187371.3338004034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534308.5310651599\r\n 20\r\n187474.7415729406\r\n 30\r\n0.0\r\n 11\r\n534337.9502485348\r\n 21\r\n187368.9109888465\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534121.1446949326\r\n 20\r\n187506.1999122544\r\n 30\r\n0.0\r\n 11\r\n534316.5602756013\r\n 21\r\n187455.0141506292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534256.1079378633\r\n 20\r\n187716.303693069\r\n 30\r\n0.0\r\n 11\r\n534152.6320242878\r\n 21\r\n187397.5833334506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534168.7652893984\r\n 20\r\n187749.8874060726\r\n 30\r\n0.0\r\n 11\r\n534279.2753342777\r\n 21\r\n187699.5386671871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534187.9902158508\r\n 20\r\n187800.3354088496\r\n 30\r\n0.0\r\n 11\r\n534169.1967959018\r\n 21\r\n187747.7575783508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534340.8500110405\r\n 20\r\n188101.8239979731\r\n 30\r\n0.0\r\n 11\r\n534208.8064111941\r\n 21\r\n187554.9400466588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534197.8008488156\r\n 20\r\n187547.8755323925\r\n 30\r\n0.0\r\n 11\r\n534221.4510343777\r\n 21\r\n187542.3598008071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534035.2595721112\r\n 20\r\n187449.2163815976\r\n 30\r\n0.0\r\n 11\r\n534029.2103171174\r\n 21\r\n187404.2993059221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534028.6304393789\r\n 20\r\n187463.2655910044\r\n 30\r\n0.0\r\n 11\r\n534037.1417982083\r\n 21\r\n187440.7555220685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533967.5488693438\r\n 20\r\n187482.695251055\r\n 30\r\n0.0\r\n 11\r\n534035.3564127415\r\n 21\r\n187458.9465788896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534182.5675941095\r\n 20\r\n187623.0814738048\r\n 30\r\n0.0\r\n 11\r\n534519.7683430233\r\n 21\r\n187511.9531550208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534486.2410897645\r\n 20\r\n187835.1562834054\r\n 30\r\n0.0\r\n 11\r\n534542.8298393397\r\n 21\r\n187639.1349535193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534568.7167464405\r\n 20\r\n187656.3747033612\r\n 30\r\n0.0\r\n 11\r\n534224.4843329351\r\n 21\r\n187633.2376068228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534254.8895447855\r\n 20\r\n187758.1112079001\r\n 30\r\n0.0\r\n 11\r\n534289.3473118174\r\n 21\r\n187749.4708363137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534360.9139348114\r\n 20\r\n187577.5906807442\r\n 30\r\n0.0\r\n 11\r\n534346.3305590152\r\n 21\r\n187485.3997628022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCCC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534355.8739887633\r\n 20\r\n187519.2296171871\r\n 30\r\n0.0\r\n 11\r\n534299.5454125343\r\n 21\r\n187457.7505659422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534343.8050772437\r\n 20\r\n187524.3883366297\r\n 30\r\n0.0\r\n 11\r\n534367.3802437997\r\n 21\r\n187447.7831204914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534481.6976816879\r\n 20\r\n187437.0367879853\r\n 30\r\n0.0\r\n 11\r\n534356.9947944047\r\n 21\r\n187454.9601931319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534503.1707014955\r\n 20\r\n188032.0361112815\r\n 30\r\n0.0\r\n 11\r\n534494.2479409549\r\n 21\r\n187762.6488419732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533985.3842569635\r\n 20\r\n187704.941440848\r\n 30\r\n0.0\r\n 11\r\n534025.4462259941\r\n 21\r\n187680.3416730576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534048.121973994\r\n 20\r\n187739.9918285693\r\n 30\r\n0.0\r\n 11\r\n534023.7804252421\r\n 21\r\n187679.4254463728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534017.2145173163\r\n 20\r\n187778.7254659985\r\n 30\r\n0.0\r\n 11\r\n534117.7860625391\r\n 21\r\n187751.0071088056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534138.2836642524\r\n 20\r\n187900.6487789333\r\n 30\r\n0.0\r\n 11\r\n534092.0011574961\r\n 21\r\n187605.6629133204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534007.9829321491\r\n 20\r\n187554.1779977815\r\n 30\r\n0.0\r\n 11\r\n534071.1126591032\r\n 21\r\n187526.7152716407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534082.9125068603\r\n 20\r\n187556.2907938117\r\n 30\r\n0.0\r\n 11\r\n534059.1012611005\r\n 21\r\n187501.103870252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534074.6001764511\r\n 20\r\n187554.0615512388\r\n 30\r\n0.0\r\n 11\r\n534140.4075564234\r\n 21\r\n187526.5322094681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534139.2623701508\r\n 20\r\n187530.0688583234\r\n 30\r\n0.0\r\n 11\r\n534118.3246624784\r\n 21\r\n187477.9804508591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534054.2379241361\r\n 20\r\n187508.718842231\r\n 30\r\n0.0\r\n 11\r\n534125.3964165783\r\n 21\r\n187478.0177550869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534377.9482391282\r\n 20\r\n187960.2763376868\r\n 30\r\n0.0\r\n 11\r\n534352.0344263502\r\n 21\r\n187850.5811014604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534360.7679136229\r\n 20\r\n187393.7639810799\r\n 30\r\n0.0\r\n 11\r\n534770.1398838371\r\n 21\r\n186990.0841702868\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534428.0054739007\r\n 20\r\n187408.1899054635\r\n 30\r\n0.0\r\n 11\r\n534591.3264570555\r\n 21\r\n187250.0894271984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534484.1322009104\r\n 20\r\n187586.4134526264\r\n 30\r\n0.0\r\n 11\r\n534643.0156503759\r\n 21\r\n187526.5056307297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534662.2228028087\r\n 20\r\n188006.316252708\r\n 30\r\n0.0\r\n 11\r\n534403.5059120892\r\n 21\r\n187296.4309304117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534545.2265514975\r\n 20\r\n187485.3378447537\r\n 30\r\n0.0\r\n 11\r\n535008.1886856977\r\n 21\r\n187247.5992257941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534517.5916033422\r\n 20\r\n187421.5731470936\r\n 30\r\n0.0\r\n 11\r\n534601.1950789026\r\n 21\r\n187596.5587950364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534583.5740422579\r\n 20\r\n187391.2628194515\r\n 30\r\n0.0\r\n 11\r\n534610.8178324108\r\n 21\r\n187449.5159017755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534529.2279100611\r\n 20\r\n187393.2026502444\r\n 30\r\n0.0\r\n 11\r\n534597.8770235372\r\n 21\r\n187398.1579243974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534578.4327287344\r\n 20\r\n187404.4811487468\r\n 30\r\n0.0\r\n 11\r\n534803.2685851388\r\n 21\r\n187177.2203280783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534658.0654168236\r\n 20\r\n187640.2422304982\r\n 30\r\n0.0\r\n 11\r\n534986.9769317319\r\n 21\r\n187378.4981200029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534747.144412568\r\n 20\r\n187821.5636049725\r\n 30\r\n0.0\r\n 11\r\n534722.2505399106\r\n 21\r\n187702.7033482393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534628.4045815115\r\n 20\r\n187742.9144990611\r\n 30\r\n0.0\r\n 11\r\n534700.7649085668\r\n 21\r\n187839.6187597465\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534695.1113314549\r\n 20\r\n187835.9565633617\r\n 30\r\n0.0\r\n 11\r\n534748.6047944875\r\n 21\r\n187819.9543664458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534361.6604653533\r\n 20\r\n187891.3822456155\r\n 30\r\n0.0\r\n 11\r\n534361.6719332852\r\n 21\r\n187891.3774369479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534496.6372509165\r\n 20\r\n187834.7845541287\r\n 30\r\n0.0\r\n 11\r\n535056.9980084965\r\n 21\r\n187540.6308271714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534781.928612762\r\n 20\r\n187509.102585166\r\n 30\r\n0.0\r\n 11\r\n534960.5856270645\r\n 21\r\n187975.6870431467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534861.4214791478\r\n 20\r\n187989.0358067275\r\n 30\r\n0.0\r\n 11\r\n534771.6287406363\r\n 21\r\n187677.4285060179\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534687.2696056447\r\n 20\r\n187751.7170331342\r\n 30\r\n0.0\r\n 11\r\n534701.2936751604\r\n 21\r\n187784.3562611305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534726.7756330002\r\n 20\r\n187332.3435424447\r\n 30\r\n0.0\r\n 11\r\n534727.4597728151\r\n 21\r\n187512.8089178462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534672.1883820148\r\n 20\r\n187544.7056881982\r\n 30\r\n0.0\r\n 11\r\n534728.0986680131\r\n 21\r\n187511.0183379375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534527.9629881593\r\n 20\r\n187659.3303882316\r\n 30\r\n0.0\r\n 11\r\n534751.1158335205\r\n 21\r\n187586.4283479941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534846.1955660799\r\n 20\r\n188389.8968598512\r\n 30\r\n0.0\r\n 11\r\n534682.3331169241\r\n 21\r\n188418.5382548995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534945.2721225843\r\n 20\r\n188398.7611056485\r\n 30\r\n0.0\r\n 11\r\n534912.1433930747\r\n 21\r\n188580.2924171957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534678.2877958446\r\n 20\r\n187937.8335458117\r\n 30\r\n0.0\r\n 11\r\n534477.114611199\r\n 21\r\n187880.3287166929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534676.1352028901\r\n 20\r\n187527.3454333013\r\n 30\r\n0.0\r\n 11\r\n534732.0690495518\r\n 21\r\n187630.3094970343\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534258.091680705\r\n 20\r\n188399.6209699965\r\n 30\r\n0.0\r\n 11\r\n534060.7481695947\r\n 21\r\n188381.7399515909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535780.3901278204\r\n 20\r\n185439.4290383135\r\n 30\r\n0.0\r\n 11\r\n533707.5812551458\r\n 21\r\n186696.108607327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535804.6699560423\r\n 20\r\n185803.0532584575\r\n 30\r\n0.0\r\n 11\r\n535577.8025029244\r\n 21\r\n185518.9490408467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535564.9239086284\r\n 20\r\n185788.4221394258\r\n 30\r\n0.0\r\n 11\r\n535372.3764689632\r\n 21\r\n185534.021633504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535142.8676494943\r\n 20\r\n185933.7047163851\r\n 30\r\n0.0\r\n 11\r\n535006.3805352725\r\n 21\r\n185752.840818464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535703.5356364426\r\n 20\r\n185631.1989691456\r\n 30\r\n0.0\r\n 11\r\n535529.1529331644\r\n 21\r\n185801.4138902812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n535595.9938929793\r\n 20\r\n185461.8081714932\r\n 30\r\n0.0\r\n 11\r\n535355.6089108344\r\n 21\r\n185624.1998165417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533867.7630282873\r\n 20\r\n186590.6939104643\r\n 30\r\n0.0\r\n 11\r\n531012.3148168298\r\n 21\r\n188613.2911204371\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534573.8956867553\r\n 20\r\n187153.838925518\r\n 30\r\n0.0\r\n 11\r\n534736.3934995475\r\n 21\r\n187351.9393427316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534338.5537451374\r\n 20\r\n186510.8915983567\r\n 30\r\n0.0\r\n 11\r\n533945.2158445\r\n 21\r\n186706.2606427902\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nCFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534205.142888429\r\n 20\r\n186310.9539163557\r\n 30\r\n0.0\r\n 11\r\n534404.4041436459\r\n 21\r\n186616.5623173755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534238.2645607369\r\n 20\r\n186494.6829609836\r\n 30\r\n0.0\r\n 11\r\n534273.831700889\r\n 21\r\n186548.2611677799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534094.0416092633\r\n 20\r\n186363.6162093194\r\n 30\r\n0.0\r\n 11\r\n534227.0182658679\r\n 21\r\n186748.621278172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534238.1808818067\r\n 20\r\n186741.3622837103\r\n 30\r\n0.0\r\n 11\r\n534017.4410964214\r\n 21\r\n186832.5199429668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534387.4918473375\r\n 20\r\n186859.734731247\r\n 30\r\n0.0\r\n 11\r\n534220.5911293927\r\n 21\r\n186737.0520827154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534400.5124712154\r\n 20\r\n186773.5230858858\r\n 30\r\n0.0\r\n 11\r\n534334.9520369448\r\n 21\r\n186828.2327671101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533983.943777705\r\n 20\r\n186379.5045163599\r\n 30\r\n0.0\r\n 11\r\n534017.8097838926\r\n 21\r\n186463.0220871074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533832.6194479275\r\n 20\r\n186400.5220216849\r\n 30\r\n0.0\r\n 11\r\n534020.2631537003\r\n 21\r\n186833.8094426817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534359.8836305158\r\n 20\r\n186591.0194846162\r\n 30\r\n0.0\r\n 11\r\n533976.4319530882\r\n 21\r\n186772.1272907083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534311.7560399915\r\n 20\r\n187112.655472385\r\n 30\r\n0.0\r\n 11\r\n533975.5018705906\r\n 21\r\n186765.2143881295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534473.5554319845\r\n 20\r\n187307.601069372\r\n 30\r\n0.0\r\n 11\r\n534115.9375794735\r\n 21\r\n186903.7731383969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534391.6616832556\r\n 20\r\n187065.8817404109\r\n 30\r\n0.0\r\n 11\r\n534278.4280981259\r\n 21\r\n187096.9893428252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534348.7200946414\r\n 20\r\n187021.0372356918\r\n 30\r\n0.0\r\n 11\r\n534302.3023088374\r\n 21\r\n187120.591191119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534226.7440903293\r\n 20\r\n186875.3487556006\r\n 30\r\n0.0\r\n 11\r\n534342.0020785355\r\n 21\r\n187041.2488083907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534624.0890229793\r\n 20\r\n186704.244408671\r\n 30\r\n0.0\r\n 11\r\n534180.0876000576\r\n 21\r\n186978.3642156855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534312.0896937012\r\n 20\r\n186893.4912809786\r\n 30\r\n0.0\r\n 11\r\n534326.4800893573\r\n 21\r\n186913.0532615762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534124.4358105409\r\n 20\r\n186862.8430379104\r\n 30\r\n0.0\r\n 11\r\n534090.647363259\r\n 21\r\n186893.0502887538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534128.5277661647\r\n 20\r\n186847.8569915702\r\n 30\r\n0.0\r\n 11\r\n534120.367807649\r\n 21\r\n186870.4968128956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534094.7306176895\r\n 20\r\n186793.3939523367\r\n 30\r\n0.0\r\n 11\r\n534130.8328933959\r\n 21\r\n186855.5106816458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534349.3868772822\r\n 20\r\n186826.4323086515\r\n 30\r\n0.0\r\n 11\r\n534581.4240908384\r\n 21\r\n187193.605314788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534584.2426089188\r\n 20\r\n187161.9710756716\r\n 30\r\n0.0\r\n 11\r\n534397.7710279386\r\n 21\r\n187237.7514276956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534678.6649329562\r\n 20\r\n187114.4497895736\r\n 30\r\n0.0\r\n 11\r\n534387.8453576843\r\n 21\r\n186845.9542275332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534455.3727022235\r\n 20\r\n186976.9109928783\r\n 30\r\n0.0\r\n 11\r\n534384.375602175\r\n 21\r\n187037.5018501531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534413.6143587174\r\n 20\r\n187017.9920778603\r\n 30\r\n0.0\r\n 11\r\n534330.8485329645\r\n 21\r\n187028.1113826482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534407.7941217914\r\n 20\r\n187006.2279011498\r\n 30\r\n0.0\r\n 11\r\n534375.9277202994\r\n 21\r\n187079.771630139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534487.5382601636\r\n 20\r\n187204.2509538315\r\n 30\r\n0.0\r\n 11\r\n534372.6986651564\r\n 21\r\n187067.5674860189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534252.7199476946\r\n 20\r\n186636.0699505644\r\n 30\r\n0.0\r\n 11\r\n534267.1815018675\r\n 21\r\n186680.8021916089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534323.1814311998\r\n 20\r\n186650.2025426782\r\n 30\r\n0.0\r\n 11\r\n534265.3199955861\r\n 21\r\n186680.415982018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534324.8629757305\r\n 20\r\n186600.6774181978\r\n 30\r\n0.0\r\n 11\r\n534383.2872150517\r\n 21\r\n186687.1039841008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534496.1155469523\r\n 20\r\n186586.6920892123\r\n 30\r\n0.0\r\n 11\r\n534269.2331987927\r\n 21\r\n186780.813523981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534171.9172778454\r\n 20\r\n186765.3419290852\r\n 30\r\n0.0\r\n 11\r\n534202.0505519514\r\n 21\r\n186827.2414407475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534230.2394511825\r\n 20\r\n186812.4315157334\r\n 30\r\n0.0\r\n 11\r\n534176.27707806\r\n 21\r\n186838.901012208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534222.4730437592\r\n 20\r\n186808.7237839446\r\n 30\r\n0.0\r\n 11\r\n534254.5981357822\r\n 21\r\n186872.4140844594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534256.0261586587\r\n 20\r\n186868.9818712686\r\n 30\r\n0.0\r\n 11\r\n534206.2614452762\r\n 21\r\n186894.9638476503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534177.5296049868\r\n 20\r\n186829.9527709859\r\n 30\r\n0.0\r\n 11\r\n534211.6604697993\r\n 21\r\n186899.531301192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534302.1858237155\r\n 20\r\n186200.0906309843\r\n 30\r\n0.0\r\n 11\r\n532982.5285202879\r\n 21\r\n186527.3959672318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533613.6902769207\r\n 20\r\n186358.993742019\r\n 30\r\n0.0\r\n 11\r\n533673.8137852908\r\n 21\r\n186494.0598682165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533776.1538853722\r\n 20\r\n186385.5943176254\r\n 30\r\n0.0\r\n 11\r\n533297.6070133881\r\n 21\r\n186510.0029110075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533669.5138658524\r\n 20\r\n186461.6981479062\r\n 30\r\n0.0\r\n 11\r\n533658.0668105337\r\n 21\r\n186542.8773520114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533747.0885230267\r\n 20\r\n186480.0689992206\r\n 30\r\n0.0\r\n 11\r\n533659.94176783\r\n 21\r\n186468.984255701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533915.0945289718\r\n 20\r\n186379.145676624\r\n 30\r\n0.0\r\n 11\r\n533506.7501595299\r\n 21\r\n186697.9838533997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533945.9411390942\r\n 20\r\n186835.6257744556\r\n 30\r\n0.0\r\n 11\r\n533854.0988856495\r\n 21\r\n186901.6772831347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533906.4817802253\r\n 20\r\n186964.0698903952\r\n 30\r\n0.0\r\n 11\r\n533434.9178717218\r\n 21\r\n186373.7317834158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533522.483184404\r\n 20\r\n186593.0554664399\r\n 30\r\n0.0\r\n 11\r\n533062.5983105609\r\n 21\r\n186790.5020190729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533482.4130391135\r\n 20\r\n186536.2750958563\r\n 30\r\n0.0\r\n 11\r\n533588.3335829126\r\n 21\r\n186698.7261854587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533422.1940000035\r\n 20\r\n186576.8468290668\r\n 30\r\n0.0\r\n 11\r\n533457.7611401558\r\n 21\r\n186630.4250358631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533452.1311894492\r\n 20\r\n186531.4482639312\r\n 30\r\n0.0\r\n 11\r\n533420.6389637881\r\n 21\r\n186592.6487152852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533436.1570249224\r\n 20\r\n186579.3350551873\r\n 30\r\n0.0\r\n 11\r\n533306.6325132512\r\n 21\r\n186633.9674166327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533277.9710485301\r\n 20\r\n186445.7800774027\r\n 30\r\n0.0\r\n 11\r\n533540.7672647548\r\n 21\r\n187197.9379284728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533422.1103210733\r\n 20\r\n186823.5261517935\r\n 30\r\n0.0\r\n 11\r\n533238.7604418549\r\n 21\r\n186898.0710717438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533154.9462600293\r\n 20\r\n186469.3279651543\r\n 30\r\n0.0\r\n 11\r\n533188.812266217\r\n 21\r\n186552.8455359016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533543.8130697824\r\n 20\r\n186673.1833526995\r\n 30\r\n0.0\r\n 11\r\n533159.1539992682\r\n 21\r\n186854.8614218153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533649.7930045239\r\n 20\r\n186885.536569575\r\n 30\r\n0.0\r\n 11\r\n533289.3755657732\r\n 21\r\n187116.8555180623\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533964.7426793781\r\n 20\r\n186647.5999671596\r\n 30\r\n0.0\r\n 11\r\n533508.9748474477\r\n 21\r\n186977.4381878725\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533533.3163165489\r\n 20\r\n186908.5961767348\r\n 30\r\n0.0\r\n 11\r\n533807.3275931497\r\n 21\r\n187360.5605178996\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533901.9424377028\r\n 20\r\n186944.7638367852\r\n 30\r\n0.0\r\n 11\r\n533817.5611283347\r\n 21\r\n187130.5229360999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533848.4398897749\r\n 20\r\n187134.243557791\r\n 30\r\n0.0\r\n 11\r\n533571.7747969511\r\n 21\r\n186928.1180956163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533639.3021414902\r\n 20\r\n187059.0748609615\r\n 30\r\n0.0\r\n 11\r\n533475.2858643194\r\n 21\r\n187197.5741820712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533639.7585737072\r\n 20\r\n187244.3959389553\r\n 30\r\n0.0\r\n 11\r\n533508.199878366\r\n 21\r\n187142.9593923612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534042.758202935\r\n 20\r\n186806.130512364\r\n 30\r\n0.0\r\n 11\r\n533860.9066406696\r\n 21\r\n187005.0755445281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533436.6493869612\r\n 20\r\n186718.2338186477\r\n 30\r\n0.0\r\n 11\r\n533451.1109411342\r\n 21\r\n186762.966059692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533507.1108704664\r\n 20\r\n186732.3664107614\r\n 30\r\n0.0\r\n 11\r\n533449.2494348529\r\n 21\r\n186762.5798501013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533508.7924149971\r\n 20\r\n186682.8412862811\r\n 30\r\n0.0\r\n 11\r\n533567.2166543183\r\n 21\r\n186769.2678521841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533900.9493501624\r\n 20\r\n186779.2906266893\r\n 30\r\n0.0\r\n 11\r\n533809.9649782856\r\n 21\r\n186845.8219322354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533320.5592558329\r\n 20\r\n186561.2778756949\r\n 30\r\n0.0\r\n 11\r\n532991.0926725162\r\n 21\r\n186707.4178168395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533580.2035412068\r\n 20\r\n187231.4269793923\r\n 30\r\n0.0\r\n 11\r\n533650.3051828861\r\n 21\r\n187576.4792701323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534146.9285046155\r\n 20\r\n186929.0436129879\r\n 30\r\n0.0\r\n 11\r\n533457.9740159064\r\n 21\r\n187317.9322787298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534071.615960048\r\n 20\r\n187256.2822432926\r\n 30\r\n0.0\r\n 11\r\n533911.2409323012\r\n 21\r\n187430.823099838\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533988.5834052235\r\n 20\r\n187229.6818808633\r\n 30\r\n0.0\r\n 11\r\n534032.1396282146\r\n 21\r\n187303.1269297103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534275.7904482939\r\n 20\r\n187285.0355955895\r\n 30\r\n0.0\r\n 11\r\n534288.4451373226\r\n 21\r\n187401.7805593987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534224.6726996108\r\n 20\r\n187320.2774089048\r\n 30\r\n0.0\r\n 11\r\n534315.5517373769\r\n 21\r\n187381.9750699207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534028.5193002688\r\n 20\r\n187211.5519736528\r\n 30\r\n0.0\r\n 11\r\n534164.1239993988\r\n 21\r\n187419.4014063171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534091.4044771071\r\n 20\r\n187124.6511358966\r\n 30\r\n0.0\r\n 11\r\n533995.2391131685\r\n 21\r\n187198.8110192915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533950.0453981045\r\n 20\r\n187107.2603301792\r\n 30\r\n0.0\r\n 11\r\n534067.888148219\r\n 21\r\n187080.787377725\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534061.2112356012\r\n 20\r\n187079.8966171456\r\n 30\r\n0.0\r\n 11\r\n534091.4686033571\r\n 21\r\n187126.8232896232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533843.797036858\r\n 20\r\n186821.0674214544\r\n 30\r\n0.0\r\n 11\r\n533843.8026278218\r\n 21\r\n186821.0785290134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533909.6023046641\r\n 20\r\n186951.8026426131\r\n 30\r\n0.0\r\n 11\r\n534096.7438698906\r\n 21\r\n187323.5964933741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534032.6638186539\r\n 20\r\n187288.5896847648\r\n 30\r\n0.0\r\n 11\r\n534353.7893433044\r\n 21\r\n187146.2235310125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534287.0962343258\r\n 20\r\n187071.6330025523\r\n 30\r\n0.0\r\n 11\r\n534058.0681274892\r\n 21\r\n187253.7359744275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534000.5054901832\r\n 20\r\n187138.8254181675\r\n 30\r\n0.0\r\n 11\r\n534032.3759233981\r\n 21\r\n187123.1324510591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534198.1166002486\r\n 20\r\n187207.9534239526\r\n 30\r\n0.0\r\n 11\r\n534246.6118885009\r\n 21\r\n187287.7033281399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534232.0137966773\r\n 20\r\n187255.7278404318\r\n 30\r\n0.0\r\n 11\r\n534228.8067471569\r\n 21\r\n187339.0482885543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534219.4720997099\r\n 20\r\n187259.5978338077\r\n 30\r\n0.0\r\n 11\r\n534286.9938766432\r\n 21\r\n187302.7829846988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534427.6767798613\r\n 20\r\n187212.4484100446\r\n 30\r\n0.0\r\n 11\r\n534274.4310012642\r\n 21\r\n187304.0247950843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533819.3864504914\r\n 20\r\n187105.5119975673\r\n 30\r\n0.0\r\n 11\r\n533974.8482824426\r\n 21\r\n187360.4440476305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534524.3107215045\r\n 20\r\n186326.5754653182\r\n 30\r\n0.0\r\n 11\r\n534531.7366402564\r\n 21\r\n185799.7180724953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534573.6321587367\r\n 20\r\n186048.281322406\r\n 30\r\n0.0\r\n 11\r\n534050.3682592749\r\n 21\r\n186184.3150727255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534302.7168493062\r\n 20\r\n186154.8844698029\r\n 30\r\n0.0\r\n 11\r\n534471.8062822185\r\n 21\r\n185786.7375415203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nD60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534361.0083684124\r\n 20\r\n185491.2003448077\r\n 30\r\n0.0\r\n 11\r\n534219.3739121182\r\n 21\r\n186349.7377126543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533623.1452109745\r\n 20\r\n185972.3138249086\r\n 30\r\n0.0\r\n 11\r\n533623.1446843631\r\n 21\r\n185972.3014007619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534063.780393243\r\n 20\r\n186245.9444705994\r\n 30\r\n0.0\r\n 11\r\n533978.4760952603\r\n 21\r\n186424.7946004351\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532959.0614927691\r\n 20\r\n188756.0186229439\r\n 30\r\n0.0\r\n 11\r\n532598.4363163279\r\n 21\r\n189185.367485622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532952.5991179057\r\n 20\r\n188775.7158074176\r\n 30\r\n0.0\r\n 11\r\n532498.8377178559\r\n 21\r\n188127.7410335887\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532875.956784719\r\n 20\r\n188661.1317739479\r\n 30\r\n0.0\r\n 11\r\n532770.1782325437\r\n 21\r\n188764.4206533319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532799.0322997413\r\n 20\r\n188749.1493385631\r\n 30\r\n0.0\r\n 11\r\n532718.9305002555\r\n 21\r\n188766.6078600857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532808.7461501953\r\n 20\r\n188828.2755461247\r\n 30\r\n0.0\r\n 11\r\n532788.875372497\r\n 21\r\n188742.7034673028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532813.3574764001\r\n 20\r\n188809.8241076595\r\n 30\r\n0.0\r\n 11\r\n532683.9742992572\r\n 21\r\n188960.8679630683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532889.3183331362\r\n 20\r\n188906.0571197371\r\n 30\r\n0.0\r\n 11\r\n532520.9270153102\r\n 21\r\n188678.5773222394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532637.2249820604\r\n 20\r\n188929.9053499753\r\n 30\r\n0.0\r\n 11\r\n532722.1061582541\r\n 21\r\n188763.6674942133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532689.4474729919\r\n 20\r\n188960.6693755529\r\n 30\r\n0.0\r\n 11\r\n532637.0169751474\r\n 21\r\n188929.0835626449\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532507.0072332216\r\n 20\r\n189195.5474548694\r\n 30\r\n0.0\r\n 11\r\n532655.8044958146\r\n 21\r\n188938.243469675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532544.3809392626\r\n 20\r\n189138.2336377773\r\n 30\r\n0.0\r\n 11\r\n532450.5444421437\r\n 21\r\n189075.0473012399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532410.2276636336\r\n 20\r\n189145.8382784577\r\n 30\r\n0.0\r\n 11\r\n532808.8697911184\r\n 21\r\n188536.4143750713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532624.7882511244\r\n 20\r\n188656.8900412475\r\n 30\r\n0.0\r\n 11\r\n532304.9757337464\r\n 21\r\n188355.8855208015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532664.118266529\r\n 20\r\n188599.5945185996\r\n 30\r\n0.0\r\n 11\r\n532548.5643406334\r\n 21\r\n188755.3404922934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532605.1581469689\r\n 20\r\n188557.2140689971\r\n 30\r\n0.0\r\n 11\r\n532567.26711288\r\n 21\r\n188609.174777593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532658.1279466498\r\n 20\r\n188569.5211949843\r\n 30\r\n0.0\r\n 11\r\n532589.7997748422\r\n 21\r\n188561.2437279531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532607.6740753801\r\n 20\r\n188571.1721289748\r\n 30\r\n0.0\r\n 11\r\n532331.6853950706\r\n 21\r\n188277.1868468728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532677.9790098687\r\n 20\r\n188376.4493737437\r\n 30\r\n0.0\r\n 11\r\n532363.1201382281\r\n 21\r\n188634.8590972316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532373.8040174633\r\n 20\r\n188642.8059028588\r\n 30\r\n0.0\r\n 11\r\n532211.6587030695\r\n 21\r\n188467.4643256072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532314.6543550703\r\n 20\r\n188823.9332564042\r\n 30\r\n0.0\r\n 11\r\n532371.7371158007\r\n 21\r\n188624.8140952755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532400.0218489002\r\n 20\r\n188806.2026207918\r\n 30\r\n0.0\r\n 11\r\n532325.9487450115\r\n 21\r\n188763.723272378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532624.8433100517\r\n 20\r\n188278.722365095\r\n 30\r\n0.0\r\n 11\r\n532558.2856573059\r\n 21\r\n188339.4855929523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532552.579947896\r\n 20\r\n188144.1162924139\r\n 30\r\n0.0\r\n 11\r\n532211.4295508927\r\n 21\r\n188470.5585631675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532557.0555737129\r\n 20\r\n188704.7202260402\r\n 30\r\n0.0\r\n 11\r\n532254.0500494715\r\n 21\r\n188408.0337271415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532051.1737493166\r\n 20\r\n188840.7494451472\r\n 30\r\n0.0\r\n 11\r\n532260.2096545565\r\n 21\r\n188404.7607253519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531924.5542984262\r\n 20\r\n189060.1813108598\r\n 30\r\n0.0\r\n 11\r\n532179.0478359127\r\n 21\r\n188584.5758381749\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532122.7868757098\r\n 20\r\n188899.4372118148\r\n 30\r\n0.0\r\n 11\r\n532054.2901579421\r\n 21\r\n188804.0552041594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532149.9267230192\r\n 20\r\n188843.5942326302\r\n 30\r\n0.0\r\n 11\r\n532040.4487535058\r\n 21\r\n188834.6401792815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532244.1854389241\r\n 20\r\n188678.6137085213\r\n 30\r\n0.0\r\n 11\r\n532128.6400668821\r\n 21\r\n188844.31373375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532394.7262438962\r\n 20\r\n188877.8526145944\r\n 30\r\n0.0\r\n 11\r\n532131.3785212176\r\n 21\r\n188670.6379691531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532456.4168509652\r\n 20\r\n188807.4901741918\r\n 30\r\n0.0\r\n 11\r\n532370.9897163031\r\n 21\r\n188893.8016461407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532456.2850829661\r\n 20\r\n188949.9149331953\r\n 30\r\n0.0\r\n 11\r\n532497.0543522947\r\n 21\r\n188836.2241347784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532497.116930214\r\n 20\r\n188842.9599124264\r\n 30\r\n0.0\r\n 11\r\n532454.2690864345\r\n 21\r\n188807.1593094035\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532727.23297523\r\n 20\r\n189090.5646219603\r\n 30\r\n0.0\r\n 11\r\n532259.6395972801\r\n 21\r\n188777.7164137778\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532256.8122081843\r\n 20\r\n188764.9478729063\r\n 30\r\n0.0\r\n 11\r\n532243.4655405895\r\n 21\r\n188785.2363187846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532220.3816786492\r\n 20\r\n188578.3303196427\r\n 30\r\n0.0\r\n 11\r\n532180.3201087714\r\n 21\r\n188557.1357969501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532235.8560493197\r\n 20\r\n188576.9630091105\r\n 30\r\n0.0\r\n 11\r\n532211.7915096664\r\n 21\r\n188577.1736364979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532275.1915484151\r\n 20\r\n188526.3548240165\r\n 30\r\n0.0\r\n 11\r\n532229.4793112505\r\n 21\r\n188581.7827388668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532332.6502728161\r\n 20\r\n188776.6343448085\r\n 30\r\n0.0\r\n 11\r\n532068.9166882257\r\n 21\r\n189121.7457489512\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532426.7555479719\r\n 20\r\n189134.8766008566\r\n 30\r\n0.0\r\n 11\r\n532065.5978605995\r\n 21\r\n189100.9695262171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532176.9164569791\r\n 20\r\n189185.4436963039\r\n 30\r\n0.0\r\n 11\r\n532327.6998801924\r\n 21\r\n188819.4788735671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532434.3805068511\r\n 20\r\n188891.152697585\r\n 30\r\n0.0\r\n 11\r\n532414.3678391711\r\n 21\r\n188920.5037940263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532228.3462162483\r\n 20\r\n188928.2835890487\r\n 30\r\n0.0\r\n 11\r\n532146.8698803295\r\n 21\r\n188882.7484719869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532175.3197418778\r\n 20\r\n188903.3916664333\r\n 30\r\n0.0\r\n 11\r\n532137.0862075681\r\n 21\r\n188829.2918749616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532184.3303370418\r\n 20\r\n188893.8480724385\r\n 30\r\n0.0\r\n 11\r\n532104.2972307981\r\n 21\r\n188889.5064687405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532413.3284184004\r\n 20\r\n189411.3057914018\r\n 30\r\n0.0\r\n 11\r\n532609.1176652272\r\n 21\r\n189170.0201889003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532593.1945088682\r\n 20\r\n189231.5869135002\r\n 30\r\n0.0\r\n 11\r\n532355.9463737834\r\n 21\r\n189117.3409349225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532477.5918910147\r\n 20\r\n188619.8725829968\r\n 30\r\n0.0\r\n 11\r\n532440.6663681646\r\n 21\r\n188648.9692443206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532488.8098312406\r\n 20\r\n188690.8564447874\r\n 30\r\n0.0\r\n 11\r\n532440.3820482271\r\n 21\r\n188647.0894768731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nDFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532535.8363152857\r\n 20\r\n188675.2335338815\r\n 30\r\n0.0\r\n 11\r\n532475.0796668022\r\n 21\r\n188760.0366747378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532608.426173541\r\n 20\r\n188830.9696730895\r\n 30\r\n0.0\r\n 11\r\n532347.592662036\r\n 21\r\n188685.6265940694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532328.3039889435\r\n 20\r\n188588.9947887008\r\n 30\r\n0.0\r\n 11\r\n532280.7224491903\r\n 21\r\n188638.7497967613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532304.400390356\r\n 20\r\n188660.0407108078\r\n 30\r\n0.0\r\n 11\r\n532260.8376349251\r\n 21\r\n188618.629863245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532305.1801104391\r\n 20\r\n188651.4700401296\r\n 30\r\n0.0\r\n 11\r\n532256.6109941681\r\n 21\r\n188703.7148184506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532260.325517522\r\n 20\r\n188703.8619679585\r\n 30\r\n0.0\r\n 11\r\n532218.6777600764\r\n 21\r\n188666.2181889972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532269.6638991237\r\n 20\r\n188616.6967556528\r\n 30\r\n0.0\r\n 11\r\n532216.2696521647\r\n 21\r\n188672.8674080448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532581.5841857867\r\n 20\r\n189076.4774365243\r\n 30\r\n0.0\r\n 11\r\n532487.5956934878\r\n 21\r\n189014.2622144411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532584.4608700269\r\n 20\r\n188456.4984482675\r\n 30\r\n0.0\r\n 11\r\n532414.5473369034\r\n 21\r\n188253.6607273663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532883.7293468934\r\n 20\r\n188455.3776511924\r\n 30\r\n0.0\r\n 11\r\n532138.3714465846\r\n 21\r\n187391.0008293174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532515.4905134476\r\n 20\r\n187924.3915696767\r\n 30\r\n0.0\r\n 11\r\n532409.7119612722\r\n 21\r\n188027.6804490609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532546.9683313642\r\n 20\r\n188085.9810547085\r\n 30\r\n0.0\r\n 11\r\n532264.1068343666\r\n 21\r\n187680.4271368265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532438.5660284698\r\n 20\r\n188012.4091342919\r\n 30\r\n0.0\r\n 11\r\n532358.464228984\r\n 21\r\n188029.8676558145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532448.2798789237\r\n 20\r\n188091.5353418534\r\n 30\r\n0.0\r\n 11\r\n532428.4091012255\r\n 21\r\n188005.9632630317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532451.5745885126\r\n 20\r\n188074.3437562909\r\n 30\r\n0.0\r\n 11\r\n532322.1914113697\r\n 21\r\n188225.3876116995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532601.2688677392\r\n 20\r\n188214.0339311463\r\n 30\r\n0.0\r\n 11\r\n532160.4607440389\r\n 21\r\n187941.8371179683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532276.758710789\r\n 20\r\n188193.1651457041\r\n 30\r\n0.0\r\n 11\r\n532361.6398869824\r\n 21\r\n188026.9272899421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532328.9812017204\r\n 20\r\n188223.9291712816\r\n 30\r\n0.0\r\n 11\r\n532276.5507038758\r\n 21\r\n188192.3433583738\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532146.5409619501\r\n 20\r\n188458.8072505983\r\n 30\r\n0.0\r\n 11\r\n532295.338224543\r\n 21\r\n188201.5032654037\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532183.9146679911\r\n 20\r\n188401.4934335063\r\n 30\r\n0.0\r\n 11\r\n532090.0781708722\r\n 21\r\n188338.3070969686\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532049.761392362\r\n 20\r\n188409.0980741865\r\n 30\r\n0.0\r\n 11\r\n532439.5831995335\r\n 21\r\n187761.8650720854\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532264.3219798531\r\n 20\r\n187920.1498369762\r\n 30\r\n0.0\r\n 11\r\n531944.5094624748\r\n 21\r\n187619.1453165304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532303.6519952577\r\n 20\r\n187862.8543143283\r\n 30\r\n0.0\r\n 11\r\n532188.098069362\r\n 21\r\n188018.6002880221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532244.6918756974\r\n 20\r\n187820.473864726\r\n 30\r\n0.0\r\n 11\r\n532206.8008416085\r\n 21\r\n187872.4345733218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532297.6616753782\r\n 20\r\n187832.7809907131\r\n 30\r\n0.0\r\n 11\r\n532229.3335035706\r\n 21\r\n187824.503523682\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532247.2078041085\r\n 20\r\n187834.4319247036\r\n 30\r\n0.0\r\n 11\r\n531971.2191237991\r\n 21\r\n187540.4466426017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532482.5695292557\r\n 20\r\n187432.4593430259\r\n 30\r\n0.0\r\n 11\r\n531940.9158861035\r\n 21\r\n187862.0174506855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532013.337746192\r\n 20\r\n187906.0656985876\r\n 30\r\n0.0\r\n 11\r\n531851.1924317979\r\n 21\r\n187730.7241213361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531954.1880837988\r\n 20\r\n188087.193052133\r\n 30\r\n0.0\r\n 11\r\n532011.2708445293\r\n 21\r\n187888.0738910043\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532039.5555776289\r\n 20\r\n188069.4624165206\r\n 30\r\n0.0\r\n 11\r\n531965.48247374\r\n 21\r\n188026.9830681068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532211.4046832727\r\n 20\r\n187485.430013197\r\n 30\r\n0.0\r\n 11\r\n532144.847030527\r\n 21\r\n187546.1932410541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532192.1136766243\r\n 20\r\n187407.3760881427\r\n 30\r\n0.0\r\n 11\r\n531850.963279621\r\n 21\r\n187733.8183588964\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532196.5893024412\r\n 20\r\n187967.980021769\r\n 30\r\n0.0\r\n 11\r\n531893.5837781998\r\n 21\r\n187671.2935228705\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531747.632482898\r\n 20\r\n187987.965931228\r\n 30\r\n0.0\r\n 11\r\n531899.7433832848\r\n 21\r\n187668.0205210807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532034.2599726247\r\n 20\r\n188141.1124103233\r\n 30\r\n0.0\r\n 11\r\n531770.9122499461\r\n 21\r\n187933.8977648818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532095.9505796936\r\n 20\r\n188070.7499699206\r\n 30\r\n0.0\r\n 11\r\n532010.5234450315\r\n 21\r\n188157.0614418696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532095.8188116946\r\n 20\r\n188213.1747289239\r\n 30\r\n0.0\r\n 11\r\n532136.5880810233\r\n 21\r\n188099.4839305072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532136.6506589425\r\n 20\r\n188106.2197081552\r\n 30\r\n0.0\r\n 11\r\n532093.8028151631\r\n 21\r\n188070.4191051323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532366.7667039584\r\n 20\r\n188353.8244176891\r\n 30\r\n0.0\r\n 11\r\n531899.1733260084\r\n 21\r\n188040.9762095067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531896.3459369127\r\n 20\r\n188028.2076686353\r\n 30\r\n0.0\r\n 11\r\n531882.999269318\r\n 21\r\n188048.4961145133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531859.9154073778\r\n 20\r\n187841.5901153716\r\n 30\r\n0.0\r\n 11\r\n531819.8538374999\r\n 21\r\n187820.3955926789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531875.3897780482\r\n 20\r\n187840.2228048392\r\n 30\r\n0.0\r\n 11\r\n531851.3252383947\r\n 21\r\n187840.4334322268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531914.7252771438\r\n 20\r\n187789.6146197452\r\n 30\r\n0.0\r\n 11\r\n531869.0130399789\r\n 21\r\n187845.0425345955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531972.1840015447\r\n 20\r\n188039.8941405374\r\n 30\r\n0.0\r\n 11\r\n531751.4036104533\r\n 21\r\n188317.9406604103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532066.2892767004\r\n 20\r\n188398.1363965854\r\n 30\r\n0.0\r\n 11\r\n531862.7873851295\r\n 21\r\n188383.5203616941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531870.022364545\r\n 20\r\n188413.7692626113\r\n 30\r\n0.0\r\n 11\r\n531967.2336089209\r\n 21\r\n188082.7386692958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532073.9142355794\r\n 20\r\n188154.412493314\r\n 30\r\n0.0\r\n 11\r\n532053.9015678996\r\n 21\r\n188183.7635897552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532245.1980405545\r\n 20\r\n188482.0407027577\r\n 30\r\n0.0\r\n 11\r\n531995.480102512\r\n 21\r\n188380.6007306513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532117.1256197433\r\n 20\r\n187883.1323787257\r\n 30\r\n0.0\r\n 11\r\n532080.2000968932\r\n 21\r\n187912.2290400493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532128.3435599692\r\n 20\r\n187954.1162405161\r\n 30\r\n0.0\r\n 11\r\n532079.9157769556\r\n 21\r\n187910.3492726018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532175.3700440142\r\n 20\r\n187938.4933296104\r\n 30\r\n0.0\r\n 11\r\n532114.6133955306\r\n 21\r\n188023.2964704667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532247.9599022693\r\n 20\r\n188094.2294688184\r\n 30\r\n0.0\r\n 11\r\n531987.1263907643\r\n 21\r\n187948.8863897982\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532221.1179145153\r\n 20\r\n188339.7372322532\r\n 30\r\n0.0\r\n 11\r\n532127.1294222164\r\n 21\r\n188277.52201017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532201.0248110695\r\n 20\r\n187689.3201666808\r\n 30\r\n0.0\r\n 11\r\n532054.0810656321\r\n 21\r\n187516.920523095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531833.5906325206\r\n 20\r\n188310.2228920877\r\n 30\r\n0.0\r\n 11\r\n531722.4811789076\r\n 21\r\n188438.6268910766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532166.1132606188\r\n 20\r\n188622.4140607703\r\n 30\r\n0.0\r\n 11\r\n531589.3173209907\r\n 21\r\n188134.3791804765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531717.6318825316\r\n 20\r\n188332.6364255321\r\n 30\r\n0.0\r\n 11\r\n531369.4847013599\r\n 21\r\n188600.3626062518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531667.3404986682\r\n 20\r\n188284.6739012414\r\n 30\r\n0.0\r\n 11\r\n531802.6689907199\r\n 21\r\n188423.5829266889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531616.1011491471\r\n 20\r\n188336.1221982756\r\n 30\r\n0.0\r\n 11\r\n531661.3554147592\r\n 21\r\n188381.813522901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531636.6967781323\r\n 20\r\n188285.7924347655\r\n 30\r\n0.0\r\n 11\r\n531617.6303835526\r\n 21\r\n188351.9266023396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531630.2817941878\r\n 20\r\n188335.8640503788\r\n 30\r\n0.0\r\n 11\r\n531296.0516959023\r\n 21\r\n188561.4462729754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531449.2602943833\r\n 20\r\n188235.4103205985\r\n 30\r\n0.0\r\n 11\r\n531654.1601976503\r\n 21\r\n188587.4440176861\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531663.7088627422\r\n 20\r\n188578.1639320104\r\n 30\r\n0.0\r\n 11\r\n531480.7888713644\r\n 21\r\n188699.6307965083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531833.0875890426\r\n 20\r\n188665.4373405636\r\n 30\r\n0.0\r\n 11\r\n531645.617673552\r\n 21\r\n188577.3356227187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531829.1955174565\r\n 20\r\n188578.3348938651\r\n 30\r\n0.0\r\n 11\r\n531775.4487910742\r\n 21\r\n188644.6870540753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531199.9049287589\r\n 20\r\n188322.1598857742\r\n 30\r\n0.0\r\n 11\r\n531440.339198993\r\n 21\r\n188674.6404915461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531754.0502627065\r\n 20\r\n188407.1290006797\r\n 30\r\n0.0\r\n 11\r\n531412.845709929\r\n 21\r\n188658.9517151305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532549.8724364265\r\n 20\r\n189386.7313191874\r\n 30\r\n0.0\r\n 11\r\n531416.0773421576\r\n 21\r\n188643.2176930456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531678.3910584178\r\n 20\r\n188711.833704132\r\n 30\r\n0.0\r\n 11\r\n531823.547616166\r\n 21\r\n188852.3214441798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531874.3351077811\r\n 20\r\n188618.6272900689\r\n 30\r\n0.0\r\n 11\r\n531652.5304600238\r\n 21\r\n188821.9256772801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531963.3979159524\r\n 20\r\n188638.2794219689\r\n 30\r\n0.0\r\n 11\r\n531860.4563487301\r\n 21\r\n188573.8550534082\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531930.6130602789\r\n 20\r\n188499.6793405171\r\n 30\r\n0.0\r\n 11\r\n531996.3643426193\r\n 21\r\n188600.9932084562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531994.8808056946\r\n 20\r\n188594.422536138\r\n 30\r\n0.0\r\n 11\r\n531961.383235969\r\n 21\r\n188639.0939332041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532162.0927971547\r\n 20\r\n188300.6511347574\r\n 30\r\n0.0\r\n 11\r\n532162.0843226814\r\n 21\r\n188300.6602353095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532062.3488203431\r\n 20\r\n188407.7640210612\r\n 30\r\n0.0\r\n 11\r\n531778.6900105733\r\n 21\r\n188712.3790445563\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531765.6340042651\r\n 20\r\n188713.1343354736\r\n 30\r\n0.0\r\n 11\r\n531783.5347779464\r\n 21\r\n188729.5452121612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531789.263231201\r\n 20\r\n188640.1299156961\r\n 30\r\n0.0\r\n 11\r\n532034.293017186\r\n 21\r\n188891.8244295344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532081.0786173002\r\n 20\r\n188803.3776922108\r\n 30\r\n0.0\r\n 11\r\n531830.7702844852\r\n 21\r\n188651.8484718924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531918.5372013929\r\n 20\r\n188557.9609783154\r\n 30\r\n0.0\r\n 11\r\n531944.3217962647\r\n 21\r\n188582.3975983202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531922.3411816466\r\n 20\r\n188767.2797823902\r\n 30\r\n0.0\r\n 11\r\n531864.3973468203\r\n 21\r\n188840.4532216027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531889.3127261933\r\n 20\r\n188815.6588680163\r\n 30\r\n0.0\r\n 11\r\n531810.0646682506\r\n 21\r\n188841.5881478804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531881.3279569153\r\n 20\r\n188805.241840075\r\n 30\r\n0.0\r\n 11\r\n531864.2807364346\r\n 21\r\n188883.5587596492\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531997.8509052491\r\n 20\r\n188984.1123505281\r\n 30\r\n0.0\r\n 11\r\n531858.7532069532\r\n 21\r\n188872.2091187451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531657.6177715115\r\n 20\r\n188472.0472110668\r\n 30\r\n0.0\r\n 11\r\n531680.4544563258\r\n 21\r\n188513.1397379377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531729.4821671011\r\n 20\r\n188472.2910638339\r\n 30\r\n0.0\r\n 11\r\n531678.5534037705\r\n 21\r\n188513.1206941728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531721.5574363368\r\n 20\r\n188423.3751749109\r\n 30\r\n0.0\r\n 11\r\n531795.5880671324\r\n 21\r\n188496.8762547536\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531886.875472056\r\n 20\r\n188376.5459143697\r\n 30\r\n0.0\r\n 11\r\n531701.8023538999\r\n 21\r\n188610.867642511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531603.3312817452\r\n 20\r\n188614.5017403534\r\n 30\r\n0.0\r\n 11\r\n531644.8629290103\r\n 21\r\n188669.4078969101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531669.6568654605\r\n 20\r\n188649.4276908528\r\n 30\r\n0.0\r\n 11\r\n531621.8298004068\r\n 21\r\n188685.8302155587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531661.3201711099\r\n 20\r\n188647.2913653651\r\n 30\r\n0.0\r\n 11\r\n531705.1522674773\r\n 21\r\n188703.5694538651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531705.889809728\r\n 20\r\n188699.9259160029\r\n 30\r\n0.0\r\n 11\r\n531662.0869619471\r\n 21\r\n188735.038596348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531621.3287594976\r\n 20\r\n188676.8086412682\r\n 30\r\n0.0\r\n 11\r\n531668.2671431887\r\n 21\r\n188738.4761037986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532910.1226366329\r\n 20\r\n188386.7350410256\r\n 30\r\n0.0\r\n 11\r\n532830.9522630293\r\n 21\r\n188273.2241689699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533055.8404062017\r\n 20\r\n188356.2443009575\r\n 30\r\n0.0\r\n 11\r\n532883.8566398558\r\n 21\r\n187952.1337322834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532981.3128478802\r\n 20\r\n188310.5704731512\r\n 30\r\n0.0\r\n 11\r\n532800.7760843893\r\n 21\r\n187950.0103883114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532774.2909740916\r\n 20\r\n188309.2747141542\r\n 30\r\n0.0\r\n 11\r\n533077.067009216\r\n 21\r\n188131.5452652497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532666.1688044262\r\n 20\r\n188156.400341244\r\n 30\r\n0.0\r\n 11\r\n532746.1847272879\r\n 21\r\n188114.9329674759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532599.5853865142\r\n 20\r\n188111.3314316386\r\n 30\r\n0.0\r\n 11\r\n533023.7869030749\r\n 21\r\n187903.9640695543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533124.1255424038\r\n 20\r\n188309.2062063903\r\n 30\r\n0.0\r\n 11\r\n532950.3875296483\r\n 21\r\n187922.3595581259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533332.1376259856\r\n 20\r\n187890.3996014996\r\n 30\r\n0.0\r\n 11\r\n532945.1880630145\r\n 21\r\n187927.0091626512\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533071.9548736702\r\n 20\r\n188205.32251796\r\n 30\r\n0.0\r\n 11\r\n533112.0168427009\r\n 21\r\n188180.7227501699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533134.6925907006\r\n 20\r\n188240.3729056813\r\n 30\r\n0.0\r\n 11\r\n533110.351041949\r\n 21\r\n188179.8065234848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532648.3772381376\r\n 20\r\n188181.1772785917\r\n 30\r\n0.0\r\n 11\r\n532545.2284021539\r\n 21\r\n187673.4734036214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533035.17653784\r\n 20\r\n187839.0110208041\r\n 30\r\n0.0\r\n 11\r\n532655.3684114847\r\n 21\r\n187904.8181812321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533021.9629950835\r\n 20\r\n187731.017087655\r\n 30\r\n0.0\r\n 11\r\n532279.9077432335\r\n 21\r\n187873.2338361666\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532488.9949775387\r\n 20\r\n187763.4472688142\r\n 30\r\n0.0\r\n 11\r\n532317.0112111929\r\n 21\r\n187359.33670014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532421.6397178314\r\n 20\r\n187780.5614739364\r\n 30\r\n0.0\r\n 11\r\n532607.7170939442\r\n 21\r\n187725.9288077863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532402.237976996\r\n 20\r\n187710.5902608587\r\n 30\r\n0.0\r\n 11\r\n532464.0897660724\r\n 21\r\n187692.9833903204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532395.4875784423\r\n 20\r\n187764.5504049247\r\n 30\r\n0.0\r\n 11\r\n532411.3254571612\r\n 21\r\n187697.5696829169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532340.656085799\r\n 20\r\n187570.3606917988\r\n 30\r\n0.0\r\n 11\r\n532233.9306557266\r\n 21\r\n187357.2133561679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532706.7652726552\r\n 20\r\n187604.1039898727\r\n 30\r\n0.0\r\n 11\r\n532692.4918827968\r\n 21\r\n187519.9161635358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532152.33259944\r\n 20\r\n187460.8469788372\r\n 30\r\n0.0\r\n 11\r\n532356.271155133\r\n 21\r\n187387.1368772966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532557.2801137408\r\n 20\r\n187716.409174247\r\n 30\r\n0.0\r\n 11\r\n532383.5421009857\r\n 21\r\n187329.5625259826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532775.8331259071\r\n 20\r\n187623.8877380377\r\n 30\r\n0.0\r\n 11\r\n532672.357212332\r\n 21\r\n187305.1673784193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532688.4904774424\r\n 20\r\n187657.4714510412\r\n 30\r\n0.0\r\n 11\r\n532799.0005223217\r\n 21\r\n187607.1227121558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532707.7154038946\r\n 20\r\n187707.9194538183\r\n 30\r\n0.0\r\n 11\r\n532688.9219839458\r\n 21\r\n187655.3416233195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532860.5751990845\r\n 20\r\n188009.4080429418\r\n 30\r\n0.0\r\n 11\r\n532728.5315992382\r\n 21\r\n187462.5240916274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532717.5260368595\r\n 20\r\n187455.4595773613\r\n 30\r\n0.0\r\n 11\r\n532741.1762224215\r\n 21\r\n187449.9438457759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532702.2927821534\r\n 20\r\n187530.6655187736\r\n 30\r\n0.0\r\n 11\r\n533039.4935310675\r\n 21\r\n187419.5371999896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533005.9662778086\r\n 20\r\n187742.7403283741\r\n 30\r\n0.0\r\n 11\r\n533062.5550273837\r\n 21\r\n187546.7189984879\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533088.4419344846\r\n 20\r\n187563.95874833\r\n 30\r\n0.0\r\n 11\r\n532744.2095209789\r\n 21\r\n187540.8216517915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533022.8958895394\r\n 20\r\n187939.6201562503\r\n 30\r\n0.0\r\n 11\r\n533013.973128999\r\n 21\r\n187670.232886942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532505.1094450074\r\n 20\r\n187612.5254858167\r\n 30\r\n0.0\r\n 11\r\n532545.1714140379\r\n 21\r\n187587.9257180264\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532567.8471620379\r\n 20\r\n187647.5758735381\r\n 30\r\n0.0\r\n 11\r\n532543.5056132862\r\n 21\r\n187587.0094913414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532536.9397053601\r\n 20\r\n187686.3095109673\r\n 30\r\n0.0\r\n 11\r\n532637.5112505831\r\n 21\r\n187658.5911537743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532897.6734271721\r\n 20\r\n187867.8603826554\r\n 30\r\n0.0\r\n 11\r\n532871.7596143943\r\n 21\r\n187758.1651464291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533003.8573889543\r\n 20\r\n187493.997497595\r\n 30\r\n0.0\r\n 11\r\n533162.7408384199\r\n 21\r\n187434.0896756984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533181.9479908528\r\n 20\r\n187913.9002976766\r\n 30\r\n0.0\r\n 11\r\n532923.2311001333\r\n 21\r\n187204.0149753805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533064.9517395415\r\n 20\r\n187392.9218897224\r\n 30\r\n0.0\r\n 11\r\n533527.9138737417\r\n 21\r\n187155.1832707628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533037.3167913862\r\n 20\r\n187329.1571920623\r\n 30\r\n0.0\r\n 11\r\n533120.9202669467\r\n 21\r\n187504.1428400051\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532963.087111749\r\n 20\r\n187353.074195673\r\n 30\r\n0.0\r\n 11\r\n533117.6022115812\r\n 21\r\n187305.7419693661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533098.1579167783\r\n 20\r\n187312.0651937155\r\n 30\r\n0.0\r\n 11\r\n533322.9937731828\r\n 21\r\n187084.8043730471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533177.7906048676\r\n 20\r\n187547.8262754669\r\n 30\r\n0.0\r\n 11\r\n533506.7021197757\r\n 21\r\n187286.0821649716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533266.8696006119\r\n 20\r\n187729.1476499413\r\n 30\r\n0.0\r\n 11\r\n533241.9757279544\r\n 21\r\n187610.2873932081\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533148.1297695554\r\n 20\r\n187650.4985440298\r\n 30\r\n0.0\r\n 11\r\n533220.4900966108\r\n 21\r\n187747.2028047152\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533214.8365194989\r\n 20\r\n187743.5406083304\r\n 30\r\n0.0\r\n 11\r\n533268.3299825314\r\n 21\r\n187727.5384114146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532881.3856533973\r\n 20\r\n187798.9662905841\r\n 30\r\n0.0\r\n 11\r\n532881.3971213293\r\n 21\r\n187798.9614819165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533016.3624389602\r\n 20\r\n187742.3685990975\r\n 30\r\n0.0\r\n 11\r\n533943.3796218751\r\n 21\r\n187255.7435890138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533301.653800806\r\n 20\r\n187416.6866301347\r\n 30\r\n0.0\r\n 11\r\n533450.1008736807\r\n 21\r\n187749.3717472283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533346.6419572953\r\n 20\r\n187850.8964413646\r\n 30\r\n0.0\r\n 11\r\n533291.3539286802\r\n 21\r\n187585.0125509866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533206.9947936887\r\n 20\r\n187659.3010781028\r\n 30\r\n0.0\r\n 11\r\n533221.0188632043\r\n 21\r\n187691.9403060992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533246.5008210441\r\n 20\r\n187239.9275874134\r\n 30\r\n0.0\r\n 11\r\n533247.1849608591\r\n 21\r\n187420.3929628149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533191.9135700587\r\n 20\r\n187452.2897331669\r\n 30\r\n0.0\r\n 11\r\n533247.8238560572\r\n 21\r\n187418.6023829063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533047.6881762032\r\n 20\r\n187566.9144332003\r\n 30\r\n0.0\r\n 11\r\n533270.8410215643\r\n 21\r\n187494.0123929628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533198.0129838886\r\n 20\r\n187845.4175907803\r\n 30\r\n0.0\r\n 11\r\n532996.8397992431\r\n 21\r\n187787.9127616617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533195.8603909342\r\n 20\r\n187434.92947827\r\n 30\r\n0.0\r\n 11\r\n533251.7942375957\r\n 21\r\n187537.893542003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532777.816868749\r\n 20\r\n188307.2050149652\r\n 30\r\n0.0\r\n 11\r\n532580.4733576386\r\n 21\r\n188289.3239965596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533301.0508297613\r\n 20\r\n187282.5650489181\r\n 30\r\n0.0\r\n 11\r\n533558.3424779411\r\n 21\r\n187640.6293556604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533688.8059216369\r\n 20\r\n187644.6635814481\r\n 30\r\n0.0\r\n 11\r\n534031.2188721263\r\n 21\r\n187547.1269241443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532960.0471768222\r\n 20\r\n188057.6651346364\r\n 30\r\n0.0\r\n 11\r\n533278.2096303262\r\n 21\r\n188034.0587147734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nE9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532361.5412691713\r\n 20\r\n187422.9006690331\r\n 30\r\n0.0\r\n 11\r\n532159.5020060875\r\n 21\r\n187561.9190406652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532336.8154352048\r\n 20\r\n187445.644135747\r\n 30\r\n0.0\r\n 11\r\n532295.0184469695\r\n 21\r\n187207.7119952258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532771.7530398989\r\n 20\r\n187265.2556792592\r\n 30\r\n0.0\r\n 11\r\n532029.6977880492\r\n 21\r\n187407.4724277708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532238.7850223542\r\n 20\r\n187297.6858604184\r\n 30\r\n0.0\r\n 11\r\n532066.8012560086\r\n 21\r\n186893.5752917443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532171.4297626468\r\n 20\r\n187314.8000655407\r\n 30\r\n0.0\r\n 11\r\n532357.5071387598\r\n 21\r\n187260.1673993905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532152.0280218115\r\n 20\r\n187244.8288524629\r\n 30\r\n0.0\r\n 11\r\n532213.8798108879\r\n 21\r\n187227.2219819246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532164.257464033\r\n 20\r\n187252.012032612\r\n 30\r\n0.0\r\n 11\r\n531983.7207005421\r\n 21\r\n186891.4519477722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532052.1854304346\r\n 20\r\n187195.1103712278\r\n 30\r\n0.0\r\n 11\r\n532308.5103977871\r\n 21\r\n187044.5180587102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532312.276887243\r\n 20\r\n187057.2895328762\r\n 30\r\n0.0\r\n 11\r\n532203.7486339846\r\n 21\r\n186844.5516896567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532502.6865875572\r\n 20\r\n187064.356837159\r\n 30\r\n0.0\r\n 11\r\n532296.1069361393\r\n 21\r\n187049.1341724364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532456.5553174708\r\n 20\r\n187138.342581477\r\n 30\r\n0.0\r\n 11\r\n532442.2819276124\r\n 21\r\n187054.1547551401\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531902.1226442555\r\n 20\r\n186995.0855704415\r\n 30\r\n0.0\r\n 11\r\n532206.7315192275\r\n 21\r\n186845.4056290151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532307.0701585566\r\n 20\r\n187250.6477658511\r\n 30\r\n0.0\r\n 11\r\n532133.3321458012\r\n 21\r\n186863.8011175869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532669.5176654935\r\n 20\r\n186819.0197692934\r\n 30\r\n0.0\r\n 11\r\n532128.1326791673\r\n 21\r\n186868.4507221122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532639.8270503792\r\n 20\r\n186910.3877806064\r\n 30\r\n0.0\r\n 11\r\n532573.9818262154\r\n 21\r\n186813.1564369764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532578.0462980195\r\n 20\r\n186916.5642095136\r\n 30\r\n0.0\r\n 11\r\n532607.4654813943\r\n 21\r\n186810.7336254195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532390.6599277922\r\n 20\r\n186948.0225488274\r\n 30\r\n0.0\r\n 11\r\n532586.0755084608\r\n 21\r\n186896.8367872021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532525.6231707228\r\n 20\r\n187158.1263296419\r\n 30\r\n0.0\r\n 11\r\n532389.8328575555\r\n 21\r\n186741.9088822389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532438.280522258\r\n 20\r\n187191.7100426455\r\n 30\r\n0.0\r\n 11\r\n532548.7905671371\r\n 21\r\n187141.3613037601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532457.5054487103\r\n 20\r\n187242.1580454225\r\n 30\r\n0.0\r\n 11\r\n532438.7120287613\r\n 21\r\n187189.5802149239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532699.8964538836\r\n 20\r\n187928.212678685\r\n 30\r\n0.0\r\n 11\r\n532478.3216440537\r\n 21\r\n186996.7626832316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532467.316081675\r\n 20\r\n186989.6981689655\r\n 30\r\n0.0\r\n 11\r\n532490.9662672371\r\n 21\r\n186984.18243738\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532304.7748049706\r\n 20\r\n186891.0390181706\r\n 30\r\n0.0\r\n 11\r\n532298.725549977\r\n 21\r\n186846.121942495\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532298.1456722383\r\n 20\r\n186905.0882275774\r\n 30\r\n0.0\r\n 11\r\n532306.6570310679\r\n 21\r\n186882.5781586414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532237.0641022033\r\n 20\r\n186924.5178876279\r\n 30\r\n0.0\r\n 11\r\n532304.8716456011\r\n 21\r\n186900.7692154624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532452.0828269688\r\n 20\r\n187064.9041103778\r\n 30\r\n0.0\r\n 11\r\n532789.2835758827\r\n 21\r\n186953.7757915938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532755.7563226241\r\n 20\r\n187276.9789199783\r\n 30\r\n0.0\r\n 11\r\n532812.3450721992\r\n 21\r\n187080.9575900921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532838.2319793\r\n 20\r\n187098.1973399342\r\n 30\r\n0.0\r\n 11\r\n532493.9995657945\r\n 21\r\n187075.0602433957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532524.4047776451\r\n 20\r\n187199.933844473\r\n 30\r\n0.0\r\n 11\r\n532558.8625446769\r\n 21\r\n187191.2934728867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532630.429167671\r\n 20\r\n187019.4133173171\r\n 30\r\n0.0\r\n 11\r\n532615.8457918745\r\n 21\r\n186927.2223993751\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532625.3892216226\r\n 20\r\n186961.05225376\r\n 30\r\n0.0\r\n 11\r\n532569.0606453941\r\n 21\r\n186899.5732025151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532613.3203101034\r\n 20\r\n186966.2109732026\r\n 30\r\n0.0\r\n 11\r\n532636.8954766592\r\n 21\r\n186889.6057570645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532751.2129145473\r\n 20\r\n186878.8594245582\r\n 30\r\n0.0\r\n 11\r\n532626.5100272641\r\n 21\r\n186896.7828297049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532866.401228957\r\n 20\r\n187500.5356147793\r\n 30\r\n0.0\r\n 11\r\n532763.7631738145\r\n 21\r\n187204.4714785462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532254.8994898229\r\n 20\r\n187146.7640774209\r\n 30\r\n0.0\r\n 11\r\n532294.9614588535\r\n 21\r\n187122.1643096307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532317.6372068535\r\n 20\r\n187181.8144651424\r\n 30\r\n0.0\r\n 11\r\n532293.2956581016\r\n 21\r\n187121.2480829457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532286.7297501757\r\n 20\r\n187220.5481025715\r\n 30\r\n0.0\r\n 11\r\n532387.3012953987\r\n 21\r\n187192.8297453785\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532407.7988971119\r\n 20\r\n187342.4714155062\r\n 30\r\n0.0\r\n 11\r\n532361.5163903555\r\n 21\r\n187047.4855498933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532277.4981650085\r\n 20\r\n186996.0006343546\r\n 30\r\n0.0\r\n 11\r\n532340.6278919628\r\n 21\r\n186968.5379082136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532352.42773972\r\n 20\r\n186998.1134303847\r\n 30\r\n0.0\r\n 11\r\n532328.6164939601\r\n 21\r\n186942.9265068251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532344.1154093107\r\n 20\r\n186995.8841878118\r\n 30\r\n0.0\r\n 11\r\n532409.922789283\r\n 21\r\n186968.3548460411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532408.7776030103\r\n 20\r\n186971.8914948963\r\n 30\r\n0.0\r\n 11\r\n532387.8398953379\r\n 21\r\n186919.803087432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532323.7531569956\r\n 20\r\n186950.541478804\r\n 30\r\n0.0\r\n 11\r\n532394.9116494379\r\n 21\r\n186919.8403916598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nECA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532647.4634719876\r\n 20\r\n187402.0989742598\r\n 30\r\n0.0\r\n 11\r\n532621.5496592099\r\n 21\r\n187292.4037380333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nECB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532630.2831464825\r\n 20\r\n186835.5866176528\r\n 30\r\n0.0\r\n 11\r\n533006.6015529368\r\n 21\r\n186508.8569529216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nECC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532697.5207067601\r\n 20\r\n186850.0125420364\r\n 30\r\n0.0\r\n 11\r\n532860.8416899149\r\n 21\r\n186691.9120637713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nECD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532753.6474337698\r\n 20\r\n187028.2360891994\r\n 30\r\n0.0\r\n 11\r\n532868.0969839297\r\n 21\r\n187045.2654694289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nECE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532888.7525577194\r\n 20\r\n187354.0892509376\r\n 30\r\n0.0\r\n 11\r\n532600.956481905\r\n 21\r\n186546.2740326586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532853.0892751174\r\n 20\r\n186833.0854560245\r\n 30\r\n0.0\r\n 11\r\n532880.3330652703\r\n 21\r\n186891.3385383485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532798.7431429207\r\n 20\r\n186835.0252868174\r\n 30\r\n0.0\r\n 11\r\n532867.3922563968\r\n 21\r\n186839.9805609704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532847.9479615937\r\n 20\r\n186846.3037853197\r\n 30\r\n0.0\r\n 11\r\n533024.8768349366\r\n 21\r\n186688.6722408888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532631.1756982129\r\n 20\r\n187333.2048821884\r\n 30\r\n0.0\r\n 11\r\n532631.1871661447\r\n 21\r\n187333.2000735208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n533109.9406543836\r\n 20\r\n187325.8194304203\r\n 30\r\n0.0\r\n 11\r\n533029.5141630925\r\n 21\r\n187140.257367994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nED9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532767.8763670437\r\n 20\r\n186595.6615620909\r\n 30\r\n0.0\r\n 11\r\n532930.3741798359\r\n 21\r\n186793.7619793046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532826.7197102416\r\n 20\r\n186614.8899640539\r\n 30\r\n0.0\r\n 11\r\n532625.451864467\r\n 21\r\n186697.4888187418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532312.7807578225\r\n 20\r\n186709.8782579019\r\n 30\r\n0.0\r\n 11\r\n532180.7561651608\r\n 21\r\n186872.6457364109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531958.3211544966\r\n 20\r\n187086.486218021\r\n 30\r\n0.0\r\n 11\r\n532300.7341049858\r\n 21\r\n186988.9495607173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n534930.9326781594\r\n 20\r\n187726.3550681194\r\n 30\r\n0.0\r\n 11\r\n535449.6709668517\r\n 21\r\n188370.3442761802\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529378.4635770085\r\n 20\r\n187735.7500589992\r\n 30\r\n0.0\r\n 11\r\n530008.689649875\r\n 21\r\n187341.9860925706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529545.8148094653\r\n 20\r\n187623.0424385107\r\n 30\r\n0.0\r\n 11\r\n529778.5966375779\r\n 21\r\n188379.0737448694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529583.5543794686\r\n 20\r\n187755.629288607\r\n 30\r\n0.0\r\n 11\r\n529715.9466170403\r\n 21\r\n187689.826628057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nEFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529603.2346550776\r\n 20\r\n187592.1829627211\r\n 30\r\n0.0\r\n 11\r\n529747.8446735596\r\n 21\r\n188065.0175525596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529683.7965904536\r\n 20\r\n187695.4963757663\r\n 30\r\n0.0\r\n 11\r\n529765.3885338919\r\n 21\r\n187703.4871842719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529698.8579615868\r\n 20\r\n187617.2118261202\r\n 30\r\n0.0\r\n 11\r\n529691.4824514415\r\n 21\r\n187704.7505622906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529688.8017596487\r\n 20\r\n187633.3547104158\r\n 30\r\n0.0\r\n 11\r\n529858.3265421476\r\n 21\r\n187529.3566291689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529646.0737452123\r\n 20\r\n187518.4409986492\r\n 30\r\n0.0\r\n 11\r\n529926.7783845801\r\n 21\r\n187848.0834212173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529893.3047350945\r\n 20\r\n187573.1825129142\r\n 30\r\n0.0\r\n 11\r\n529761.4632025456\r\n 21\r\n187705.3099099803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529853.056978453\r\n 20\r\n187527.8643938651\r\n 30\r\n0.0\r\n 11\r\n529893.2502530519\r\n 21\r\n187574.0284638578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530098.8254488125\r\n 20\r\n187360.3830151751\r\n 30\r\n0.0\r\n 11\r\n529878.1847450631\r\n 21\r\n187559.5403549869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530045.6532793329\r\n 20\r\n187403.4456199002\r\n 30\r\n0.0\r\n 11\r\n530115.5438118516\r\n 21\r\n187492.4013098859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530175.6566109118\r\n 20\r\n187437.4171624065\r\n 30\r\n0.0\r\n 11\r\n529559.0215932507\r\n 21\r\n187972.1942001524\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529821.2767317422\r\n 20\r\n187836.8186216117\r\n 30\r\n0.0\r\n 11\r\n530033.1662553697\r\n 21\r\n188221.5088832217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529766.2484540445\r\n 20\r\n187879.2628871941\r\n 30\r\n0.0\r\n 11\r\n529924.0569599557\r\n 21\r\n187766.5420214515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529809.3398214984\r\n 20\r\n187937.7054423915\r\n 30\r\n0.0\r\n 11\r\n529861.3599671114\r\n 21\r\n187899.8960500067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529762.7113894739\r\n 20\r\n187909.7223340005\r\n 30\r\n0.0\r\n 11\r\n529825.1934736707\r\n 21\r\n187938.5883118542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529811.2330965048\r\n 20\r\n187923.6493816397\r\n 30\r\n0.0\r\n 11\r\n529983.5736650277\r\n 21\r\n188288.1981797348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529684.5132423182\r\n 20\r\n188087.3619766751\r\n 30\r\n0.0\r\n 11\r\n530063.5266412746\r\n 21\r\n187938.1623196526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530055.8003542056\r\n 20\r\n187927.3178978922\r\n 30\r\n0.0\r\n 11\r\n530156.2459049511\r\n 21\r\n188143.9892227795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530167.72809298\r\n 20\r\n187773.1167887638\r\n 30\r\n0.0\r\n 11\r\n530052.2406954039\r\n 21\r\n187945.0747571812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530081.0414487262\r\n 20\r\n187763.7674492108\r\n 30\r\n0.0\r\n 11\r\n530138.4847548853\r\n 21\r\n187826.9464515684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529705.0607078073\r\n 20\r\n188196.6861390384\r\n 30\r\n0.0\r\n 11\r\n529787.0654422633\r\n 21\r\n188159.3054685596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529732.4827482234\r\n 20\r\n188346.9819141357\r\n 30\r\n0.0\r\n 11\r\n530157.4144505093\r\n 21\r\n188141.1149719069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529900.4269755176\r\n 20\r\n187812.1066593871\r\n 30\r\n0.0\r\n 11\r\n530097.6484604593\r\n 21\r\n188187.5249757049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530423.635731933\r\n 20\r\n187838.048245992\r\n 30\r\n0.0\r\n 11\r\n530090.7812692937\r\n 21\r\n188188.7476616877\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530611.5374876814\r\n 20\r\n187668.1195573589\r\n 30\r\n0.0\r\n 11\r\n530223.2538567075\r\n 21\r\n188042.5569328811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530373.5122905457\r\n 20\r\n187760.2000960348\r\n 30\r\n0.0\r\n 11\r\n530409.3984414326\r\n 21\r\n187872.0111505144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530330.5310086717\r\n 20\r\n187805.0065581208\r\n 30\r\n0.0\r\n 11\r\n530431.9655938526\r\n 21\r\n187847.1565973773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530190.1515324173\r\n 20\r\n187933.0568666163\r\n 30\r\n0.0\r\n 11\r\n530351.0095330452\r\n 21\r\n187810.8605696383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530108.0901088432\r\n 20\r\n187697.2081896732\r\n 30\r\n0.0\r\n 11\r\n530295.0546348895\r\n 21\r\n187975.2984597758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530027.7684759713\r\n 20\r\n187745.2190146273\r\n 30\r\n0.0\r\n 11\r\n530135.5781907513\r\n 21\r\n187689.321510876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530071.6431878232\r\n 20\r\n187609.7205312413\r\n 30\r\n0.0\r\n 11\r\n529997.9220251973\r\n 21\r\n187705.391431453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529999.9315347111\r\n 20\r\n187698.9620856049\r\n 30\r\n0.0\r\n 11\r\n530029.7107693157\r\n 21\r\n187746.1936225241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529856.9988515898\r\n 20\r\n187392.642425033\r\n 30\r\n0.0\r\n 11\r\n530205.8864010586\r\n 21\r\n187833.9983429626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530204.6549190094\r\n 20\r\n187847.0180671165\r\n 30\r\n0.0\r\n 11\r\n530223.5884180138\r\n 21\r\n187831.8102668979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530181.9999116782\r\n 20\r\n188035.803779794\r\n 30\r\n0.0\r\n 11\r\n530213.6142017748\r\n 21\r\n188068.2795220475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530166.8536758086\r\n 20\r\n188032.3516464356\r\n 30\r\n0.0\r\n 11\r\n530189.8194683097\r\n 21\r\n188039.5432253593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530113.8743619398\r\n 20\r\n188068.4302022495\r\n 30\r\n0.0\r\n 11\r\n530174.4026182898\r\n 21\r\n188029.7237098421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530136.0731830577\r\n 20\r\n187812.6010485576\r\n 30\r\n0.0\r\n 11\r\n530493.065627726\r\n 21\r\n187565.1870647974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530461.3402601847\r\n 20\r\n187563.7139106953\r\n 30\r\n0.0\r\n 11\r\n530544.9677326832\r\n 21\r\n187746.8006609251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530156.5606465565\r\n 20\r\n187442.7719249477\r\n 30\r\n0.0\r\n 11\r\n530489.8420656007\r\n 21\r\n187585.978281576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530409.853728282\r\n 20\r\n187471.3938969297\r\n 30\r\n0.0\r\n 11\r\n530153.9450042355\r\n 21\r\n187773.3485576881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530074.4384597199\r\n 20\r\n187672.3703296743\r\n 30\r\n0.0\r\n 11\r\n530102.4994971649\r\n 21\r\n187650.5856582863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530281.9173037256\r\n 20\r\n187700.3231702298\r\n 30\r\n0.0\r\n 11\r\n530345.4672628766\r\n 21\r\n187768.6842914354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530324.7339364529\r\n 20\r\n187740.3000480166\r\n 30\r\n0.0\r\n 11\r\n530338.357399006\r\n 21\r\n187822.5617250599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530313.2274231444\r\n 20\r\n187746.6144096657\r\n 30\r\n0.0\r\n 11\r\n530388.0575426544\r\n 21\r\n187775.3302734317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530507.6869767908\r\n 20\r\n187658.5363817937\r\n 30\r\n0.0\r\n 11\r\n530376.0014669189\r\n 21\r\n187779.0744647571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530113.378969668\r\n 20\r\n187223.3113400704\r\n 30\r\n0.0\r\n 11\r\n529993.8104067042\r\n 21\r\n187353.3103520891\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530027.8754812543\r\n 20\r\n187299.6113839214\r\n 30\r\n0.0\r\n 11\r\n530218.5598977485\r\n 21\r\n187481.2105979304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529949.985764896\r\n 20\r\n187917.2614300507\r\n 30\r\n0.0\r\n 11\r\n529994.0638168057\r\n 21\r\n187900.9140976139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529961.1146399412\r\n 20\r\n187846.2635500974\r\n 30\r\n0.0\r\n 11\r\n529993.7569733256\r\n 21\r\n187902.7903200321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529911.5627755482\r\n 20\r\n187846.6857845978\r\n 30\r\n0.0\r\n 11\r\n529995.4314249195\r\n 21\r\n187784.6455340611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529890.3206506824\r\n 20\r\n187676.1812253975\r\n 30\r\n0.0\r\n 11\r\n530093.8979136191\r\n 21\r\n187894.6189267182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530082.5711711842\r\n 20\r\n187992.5038776773\r\n 30\r\n0.0\r\n 11\r\n530143.1357803735\r\n 21\r\n187959.7702273141\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530127.1426298523\r\n 20\r\n187932.2353938265\r\n 30\r\n0.0\r\n 11\r\n530155.8788858883\r\n 21\r\n187985.0255401197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530123.7679117324\r\n 20\r\n187940.1521884365\r\n 30\r\n0.0\r\n 11\r\n530186.0371461363\r\n 21\r\n187905.3524993013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530182.5474092204\r\n 20\r\n187904.0714555937\r\n 30\r\n0.0\r\n 11\r\n530210.6184005529\r\n 21\r\n187952.6884201263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530146.8855422867\r\n 20\r\n187984.1539808663\r\n 30\r\n0.0\r\n 11\r\n530214.9525571921\r\n 21\r\n187947.1003807667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529991.2787391617\r\n 20\r\n187450.7881940411\r\n 30\r\n0.0\r\n 11\r\n530061.612220368\r\n 21\r\n187538.8664090824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529798.0991355714\r\n 20\r\n188039.9094565575\r\n 30\r\n0.0\r\n 11\r\n529897.4912097044\r\n 21\r\n188285.1337729669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529700.2850975303\r\n 20\r\n188567.4765653622\r\n 30\r\n0.0\r\n 11\r\n529832.6773351021\r\n 21\r\n188501.6739048121\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529719.9653731394\r\n 20\r\n188404.0302394763\r\n 30\r\n0.0\r\n 11\r\n529864.5753916216\r\n 21\r\n188876.8648293147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529800.5273085154\r\n 20\r\n188507.3436525215\r\n 30\r\n0.0\r\n 11\r\n529882.1192519538\r\n 21\r\n188515.3344610271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529815.5886796486\r\n 20\r\n188429.0591028753\r\n 30\r\n0.0\r\n 11\r\n529808.2131695032\r\n 21\r\n188516.5978390456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529807.1724351745\r\n 20\r\n188444.4074758961\r\n 30\r\n0.0\r\n 11\r\n529976.6972176732\r\n 21\r\n188340.409394649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529707.6247334772\r\n 20\r\n188265.4885633374\r\n 30\r\n0.0\r\n 11\r\n530043.5091026421\r\n 21\r\n188659.9306979724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530010.0354531563\r\n 20\r\n188385.0297896692\r\n 30\r\n0.0\r\n 11\r\n529878.1939206073\r\n 21\r\n188517.1571867354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529969.7876965147\r\n 20\r\n188339.7116706202\r\n 30\r\n0.0\r\n 11\r\n530009.9809711138\r\n 21\r\n188385.875740613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530215.5561668745\r\n 20\r\n188172.2302919301\r\n 30\r\n0.0\r\n 11\r\n529994.9154631249\r\n 21\r\n188371.3876317421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530162.3839973947\r\n 20\r\n188215.2928966554\r\n 30\r\n0.0\r\n 11\r\n530232.2745299135\r\n 21\r\n188304.2485866411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530292.3873289736\r\n 20\r\n188249.2644391616\r\n 30\r\n0.0\r\n 11\r\n529722.5984614438\r\n 21\r\n188745.4622291548\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529938.0074498041\r\n 20\r\n188648.6658983669\r\n 30\r\n0.0\r\n 11\r\n530270.7960156209\r\n 21\r\n189204.6228630211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529882.9791721063\r\n 20\r\n188691.1101639493\r\n 30\r\n0.0\r\n 11\r\n530040.7876780177\r\n 21\r\n188578.3892982067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529926.0705395602\r\n 20\r\n188749.5527191465\r\n 30\r\n0.0\r\n 11\r\n529978.090685173\r\n 21\r\n188711.7433267618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529879.4421075356\r\n 20\r\n188721.5696107556\r\n 30\r\n0.0\r\n 11\r\n529941.9241917324\r\n 21\r\n188750.4355886093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529927.9638145668\r\n 20\r\n188735.4966583948\r\n 30\r\n0.0\r\n 11\r\n529988.0450447927\r\n 21\r\n188862.5853668438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529801.2439603802\r\n 20\r\n188899.2092534301\r\n 30\r\n0.0\r\n 11\r\n530180.2573593365\r\n 21\r\n188750.0095964078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530172.5310722675\r\n 20\r\n188739.1651746473\r\n 30\r\n0.0\r\n 11\r\n530272.9766230131\r\n 21\r\n188955.8364995346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530284.4588110418\r\n 20\r\n188584.964065519\r\n 30\r\n0.0\r\n 11\r\n530168.9714134656\r\n 21\r\n188756.9220339363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530197.772166788\r\n 20\r\n188575.6147259658\r\n 30\r\n0.0\r\n 11\r\n530255.2154729472\r\n 21\r\n188638.7937283235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529829.9928316144\r\n 20\r\n189021.1235840313\r\n 30\r\n0.0\r\n 11\r\n529911.9975660703\r\n 21\r\n188983.7429135527\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530017.1576935793\r\n 20\r\n188623.9539361422\r\n 30\r\n0.0\r\n 11\r\n530214.3791785211\r\n 21\r\n188999.3722524601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530490.2430086076\r\n 20\r\n188572.0473727899\r\n 30\r\n0.0\r\n 11\r\n530526.1291594945\r\n 21\r\n188683.8584272694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530447.2617267332\r\n 20\r\n188616.8538348757\r\n 30\r\n0.0\r\n 11\r\n530548.6963119143\r\n 21\r\n188659.0038741323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530306.882250479\r\n 20\r\n188744.9041433715\r\n 30\r\n0.0\r\n 11\r\n530467.7402511069\r\n 21\r\n188622.7078463936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530224.820826905\r\n 20\r\n188509.0554664283\r\n 30\r\n0.0\r\n 11\r\n530471.2304298216\r\n 21\r\n188859.3289219959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530144.4991940331\r\n 20\r\n188557.0662913824\r\n 30\r\n0.0\r\n 11\r\n530252.3089088132\r\n 21\r\n188501.1687876312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530188.3739058851\r\n 20\r\n188421.5678079964\r\n 30\r\n0.0\r\n 11\r\n530114.6527432591\r\n 21\r\n188517.238708208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530116.6622527729\r\n 20\r\n188510.8093623602\r\n 30\r\n0.0\r\n 11\r\n530146.4414873774\r\n 21\r\n188558.0408992791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529973.7295696518\r\n 20\r\n188204.4897017882\r\n 30\r\n0.0\r\n 11\r\n530322.6171191205\r\n 21\r\n188645.8456197177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530321.3856370711\r\n 20\r\n188658.8653438716\r\n 30\r\n0.0\r\n 11\r\n530340.3191360755\r\n 21\r\n188643.6575436529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530298.7306297399\r\n 20\r\n188847.6510565491\r\n 30\r\n0.0\r\n 11\r\n530350.7878136068\r\n 21\r\n188904.950270655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530283.5843938705\r\n 20\r\n188844.1989231907\r\n 30\r\n0.0\r\n 11\r\n530306.5501863716\r\n 21\r\n188851.3905021144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530230.6050800018\r\n 20\r\n188880.2774790045\r\n 30\r\n0.0\r\n 11\r\n530291.1333363518\r\n 21\r\n188841.5709865972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530252.8039011196\r\n 20\r\n188624.4483253126\r\n 30\r\n0.0\r\n 11\r\n530548.3191566242\r\n 21\r\n188427.6627006649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530273.2913646184\r\n 20\r\n188254.619201703\r\n 30\r\n0.0\r\n 11\r\n530462.4648851728\r\n 21\r\n188331.039274131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530464.8713986185\r\n 20\r\n188300.0304104486\r\n 30\r\n0.0\r\n 11\r\n530270.6757222974\r\n 21\r\n188585.1958344434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530191.1691777817\r\n 20\r\n188484.2176064294\r\n 30\r\n0.0\r\n 11\r\n530219.2302152268\r\n 21\r\n188462.4329350414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530398.6480217873\r\n 20\r\n188512.1704469851\r\n 30\r\n0.0\r\n 11\r\n530462.1979809385\r\n 21\r\n188580.5315681904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530441.4646545147\r\n 20\r\n188552.1473247715\r\n 30\r\n0.0\r\n 11\r\n530455.0881170677\r\n 21\r\n188634.4090018151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530429.9581412063\r\n 20\r\n188558.4616864207\r\n 30\r\n0.0\r\n 11\r\n530504.7882607162\r\n 21\r\n188587.177550187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530583.7826875651\r\n 20\r\n188503.8478388322\r\n 30\r\n0.0\r\n 11\r\n530492.7321849806\r\n 21\r\n188590.9217415122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530128.8055889876\r\n 20\r\n188119.8151252872\r\n 30\r\n0.0\r\n 11\r\n530335.2906158104\r\n 21\r\n188293.0578746854\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530066.7164829579\r\n 20\r\n188729.1087068058\r\n 30\r\n0.0\r\n 11\r\n530110.7945348675\r\n 21\r\n188712.761374369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530077.8453580029\r\n 20\r\n188658.1108268526\r\n 30\r\n0.0\r\n 11\r\n530110.4876913875\r\n 21\r\n188714.6375967872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530028.2934936099\r\n 20\r\n188658.5330613529\r\n 30\r\n0.0\r\n 11\r\n530112.1621429813\r\n 21\r\n188596.4928108161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530007.0513687442\r\n 20\r\n188488.0285021525\r\n 30\r\n0.0\r\n 11\r\n530210.6286316809\r\n 21\r\n188706.4662034733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530199.301889246\r\n 20\r\n188804.3511544324\r\n 30\r\n0.0\r\n 11\r\n530259.8664984353\r\n 21\r\n188771.6175040693\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530243.8733479142\r\n 20\r\n188744.0826705819\r\n 30\r\n0.0\r\n 11\r\n530272.6096039502\r\n 21\r\n188796.8728168748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530240.4986297941\r\n 20\r\n188751.9994651915\r\n 30\r\n0.0\r\n 11\r\n530302.7678641983\r\n 21\r\n188717.1997760565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530299.2781272823\r\n 20\r\n188715.9187323489\r\n 30\r\n0.0\r\n 11\r\n530327.3491186148\r\n 21\r\n188764.5356968813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530263.6162603486\r\n 20\r\n188796.0012576215\r\n 30\r\n0.0\r\n 11\r\n530331.6832752539\r\n 21\r\n188758.9476575219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530108.0094572235\r\n 20\r\n188262.6354707962\r\n 30\r\n0.0\r\n 11\r\n530178.3429384298\r\n 21\r\n188350.7136858376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529914.8298536334\r\n 20\r\n188851.7567333126\r\n 30\r\n0.0\r\n 11\r\n530014.2219277663\r\n 21\r\n189096.9810497221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529392.945314271\r\n 20\r\n189359.2639292472\r\n 30\r\n0.0\r\n 11\r\n531170.003586833\r\n 21\r\n188526.4350730158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530573.3534346061\r\n 20\r\n188563.8997038407\r\n 30\r\n0.0\r\n 11\r\n530798.5430697939\r\n 21\r\n188532.9298318643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530467.7349198311\r\n 20\r\n188409.7615463817\r\n 30\r\n0.0\r\n 11\r\n530612.9150610638\r\n 21\r\n188321.695524386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530247.1860381263\r\n 20\r\n188010.521249343\r\n 30\r\n0.0\r\n 11\r\n530664.9692136952\r\n 21\r\n188682.3470452653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530584.9722957194\r\n 20\r\n188424.0512586005\r\n 30\r\n0.0\r\n 11\r\n530998.5263986866\r\n 21\r\n188276.210900377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530618.0993608664\r\n 20\r\n188485.143194091\r\n 30\r\n0.0\r\n 11\r\n530531.9829551339\r\n 21\r\n188311.3804743395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530682.6650718633\r\n 20\r\n188451.9217075121\r\n 30\r\n0.0\r\n 11\r\n530653.6339401833\r\n 21\r\n188394.5384425692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530647.6051370533\r\n 20\r\n188493.4917207355\r\n 30\r\n0.0\r\n 11\r\n530686.0644878534\r\n 21\r\n188436.411655397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530669.0907209093\r\n 20\r\n188447.811436197\r\n 30\r\n0.0\r\n 11\r\n531056.4550221097\r\n 21\r\n188335.8025262527\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530810.4353722193\r\n 20\r\n188602.8349553812\r\n 30\r\n0.0\r\n 11\r\n530723.6458221129\r\n 21\r\n188201.0597410968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530711.7081960532\r\n 20\r\n188206.9580526561\r\n 30\r\n0.0\r\n 11\r\n530941.6233769567\r\n 21\r\n188142.3455052437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530577.3266136871\r\n 20\r\n188071.87514817\r\n 30\r\n0.0\r\n 11\r\n530728.6702959506\r\n 21\r\n188213.3034753897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530554.2748281737\r\n 20\r\n188155.9620058036\r\n 30\r\n0.0\r\n 11\r\n530625.8047850881\r\n 21\r\n188109.327415367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531148.102332967\r\n 20\r\n188838.6902303597\r\n 30\r\n0.0\r\n 11\r\n530938.9722214446\r\n 21\r\n188140.7336146608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530573.1968834673\r\n 20\r\n188341.973357598\r\n 30\r\n0.0\r\n 11\r\n530975.258866774\r\n 21\r\n188207.1349805347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530682.2314537685\r\n 20\r\n187829.5947561866\r\n 30\r\n0.0\r\n 11\r\n530975.3709463781\r\n 21\r\n188214.1092700097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530565.94484635\r\n 20\r\n187647.9643601798\r\n 30\r\n0.0\r\n 11\r\n530852.1731076476\r\n 21\r\n188060.0216062034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530597.3871645713\r\n 20\r\n187866.6641562202\r\n 30\r\n0.0\r\n 11\r\n530713.4897298386\r\n 21\r\n187849.065233877\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530634.7670807852\r\n 20\r\n187916.2398710416\r\n 30\r\n0.0\r\n 11\r\n530692.55145945\r\n 21\r\n187822.8237778752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530738.7958414644\r\n 20\r\n188075.2408012614\r\n 30\r\n0.0\r\n 11\r\n530643.8114683718\r\n 21\r\n187896.9567575858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530523.6944121592\r\n 20\r\n188103.751873043\r\n 30\r\n0.0\r\n 11\r\n530797.2236527434\r\n 21\r\n187978.4151643149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530444.9741594119\r\n 20\r\n188057.692000106\r\n 30\r\n0.0\r\n 11\r\n530523.1492674589\r\n 21\r\n188150.6227162792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530433.5994985798\r\n 20\r\n188199.6618787103\r\n 30\r\n0.0\r\n 11\r\n530402.148168475\r\n 21\r\n188083.0490800954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530401.5416351788\r\n 20\r\n188089.7577859227\r\n 30\r\n0.0\r\n 11\r\n530447.1416332303\r\n 21\r\n188057.5357271576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530152.1746223897\r\n 20\r\n188317.9629113906\r\n 30\r\n0.0\r\n 11\r\n530152.1854826093\r\n 21\r\n188317.9568539679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530279.9986768201\r\n 20\r\n188246.6674526891\r\n 30\r\n0.0\r\n 11\r\n530643.5135505878\r\n 21\r\n188043.9125034311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530656.1703455079\r\n 20\r\n188047.2042062475\r\n 30\r\n0.0\r\n 11\r\n530644.17602906\r\n 21\r\n188026.0880762758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530838.9284713299\r\n 20\r\n188099.6709777739\r\n 30\r\n0.0\r\n 11\r\n530876.0295792661\r\n 21\r\n188073.6393630881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530833.1054584868\r\n 20\r\n188114.0729987142\r\n 30\r\n0.0\r\n 11\r\n530843.8668922444\r\n 21\r\n188092.5477118147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530860.2749595206\r\n 20\r\n188172.1271811749\r\n 30\r\n0.0\r\n 11\r\n530831.7148109637\r\n 21\r\n188106.2016149227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530611.2583920929\r\n 20\r\n188109.420780511\r\n 30\r\n0.0\r\n 11\r\n530455.3892869106\r\n 21\r\n187794.6279178761\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530383.6970071517\r\n 20\r\n187864.4271638903\r\n 30\r\n0.0\r\n 11\r\n530575.3577239918\r\n 21\r\n188085.5188546145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530462.9941843908\r\n 20\r\n188147.9073801776\r\n 30\r\n0.0\r\n 11\r\n530445.9625123882\r\n 21\r\n188116.7318147655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530523.6716025012\r\n 20\r\n187947.540010238\r\n 30\r\n0.0\r\n 11\r\n530601.2910764078\r\n 21\r\n187895.7031751591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530569.9640754642\r\n 20\r\n187911.6454181296\r\n 30\r\n0.0\r\n 11\r\n530653.3455576861\r\n 21\r\n187911.3127554578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530574.3629559046\r\n 20\r\n187924.0115356457\r\n 30\r\n0.0\r\n 11\r\n530614.6429893853\r\n 21\r\n187854.7174773109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530518.4180696863\r\n 20\r\n187717.9959374398\r\n 30\r\n0.0\r\n 11\r\n530616.4169547133\r\n 21\r\n187867.2163163705\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530684.9084061024\r\n 20\r\n188309.815386448\r\n 30\r\n0.0\r\n 11\r\n530675.7983986727\r\n 21\r\n188263.694700172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530616.5933388403\r\n 20\r\n188287.5083830064\r\n 30\r\n0.0\r\n 11\r\n530677.6016914072\r\n 21\r\n188264.2967789023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530609.1091987736\r\n 20\r\n188336.4936174578\r\n 30\r\n0.0\r\n 11\r\n530561.2354102382\r\n 21\r\n188243.8057358047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530437.3990079661\r\n 20\r\n188330.2772720863\r\n 30\r\n0.0\r\n 11\r\n530685.5021679961\r\n 21\r\n188164.1341009169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530780.328769887\r\n 20\r\n188190.9235445889\r\n 30\r\n0.0\r\n 11\r\n530757.6708446792\r\n 21\r\n188125.9144515507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530727.9382006641\r\n 20\r\n188137.312600464\r\n 30\r\n0.0\r\n 11\r\n530784.6349167087\r\n 21\r\n188117.3613010984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530735.215615822\r\n 20\r\n188141.9064646223\r\n 30\r\n0.0\r\n 11\r\n530710.7898842521\r\n 21\r\n188074.8851280609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530708.9687964411\r\n 20\r\n188078.1259575703\r\n 30\r\n0.0\r\n 11\r\n530761.4396459194\r\n 21\r\n188058.1660039187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530782.340532437\r\n 20\r\n188126.1006171749\r\n 30\r\n0.0\r\n 11\r\n530756.6141735527\r\n 21\r\n188052.9962926993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530781.7692014918\r\n 20\r\n188479.3148639996\r\n 30\r\n0.0\r\n 11\r\n531039.7040985098\r\n 21\r\n188420.2950481815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529629.2416397601\r\n 20\r\n187659.0530045348\r\n 30\r\n0.0\r\n 11\r\n528886.575565366\r\n 21\r\n187685.1694001948\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nF9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529247.9222219149\r\n 20\r\n187060.1428561345\r\n 30\r\n0.0\r\n 11\r\n529909.5045036059\r\n 21\r\n189267.5528252435\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529470.3553425334\r\n 20\r\n187790.2496720883\r\n 30\r\n0.0\r\n 11\r\n529323.8045910156\r\n 21\r\n187809.7579250679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529362.617563407\r\n 20\r\n187665.7724225901\r\n 30\r\n0.0\r\n 11\r\n529507.2275818894\r\n 21\r\n188138.6070124287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529353.6260863388\r\n 20\r\n187796.4745269601\r\n 30\r\n0.0\r\n 11\r\n529290.4618051137\r\n 21\r\n187848.7370549503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529297.3525618934\r\n 20\r\n187740.0067834225\r\n 30\r\n0.0\r\n 11\r\n529352.4314082598\r\n 21\r\n187808.4447053898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529314.7180172402\r\n 20\r\n187747.7631273677\r\n 30\r\n0.0\r\n 11\r\n529116.0222761967\r\n 21\r\n187756.3802774495\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529285.8591790829\r\n 20\r\n187628.6077169585\r\n 30\r\n0.0\r\n 11\r\n529237.5613662758\r\n 21\r\n188058.8710579453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529111.5419683684\r\n 20\r\n187812.2740061647\r\n 30\r\n0.0\r\n 11\r\n529294.735175274\r\n 21\r\n187848.0523194833\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529119.5556862255\r\n 20\r\n187752.1957725445\r\n 30\r\n0.0\r\n 11\r\n529112.0603154724\r\n 21\r\n187812.9447651166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528822.1497234687\r\n 20\r\n187750.8368952536\r\n 30\r\n0.0\r\n 11\r\n529116.4445893118\r\n 21\r\n187792.5082054131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528890.3129050055\r\n 20\r\n187756.7907356661\r\n 30\r\n0.0\r\n 11\r\n528882.1362303199\r\n 21\r\n187869.6222175659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528801.5514038664\r\n 20\r\n187857.6685223063\r\n 30\r\n0.0\r\n 11\r\n529605.3146455969\r\n 21\r\n187956.9241549581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529318.7137926164\r\n 20\r\n187990.5206507724\r\n 30\r\n0.0\r\n 11\r\n529358.2500389636\r\n 21\r\n188427.9228144905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529388.0696869734\r\n 20\r\n187994.9237116579\r\n 30\r\n0.0\r\n 11\r\n529194.2067956202\r\n 21\r\n187989.7567523999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529385.0400111967\r\n 20\r\n188067.4717596795\r\n 30\r\n0.0\r\n 11\r\n529320.7701771024\r\n 21\r\n188065.2280735188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529408.0392518247\r\n 20\r\n188018.1939760562\r\n 30\r\n0.0\r\n 11\r\n529372.3922877637\r\n 21\r\n188077.0713866332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529375.6083177687\r\n 20\r\n188056.8792862579\r\n 30\r\n0.0\r\n 11\r\n529436.6616666444\r\n 21\r\n188455.4637645589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529572.2232949353\r\n 20\r\n188121.7043275001\r\n 30\r\n0.0\r\n 11\r\n529174.5926249127\r\n 21\r\n188210.0306797475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529174.9313102554\r\n 20\r\n188196.7196960337\r\n 30\r\n0.0\r\n 11\r\n529212.8648250112\r\n 21\r\n188432.5094756071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528995.8982329628\r\n 20\r\n188131.504989113\r\n 30\r\n0.0\r\n 11\r\n529187.8143716537\r\n 21\r\n188209.4477733275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529062.5257631239\r\n 20\r\n188075.2665977178\r\n 30\r\n0.0\r\n 11\r\n529050.2486893053\r\n 21\r\n188159.76862858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529628.1589158975\r\n 20\r\n188300.4001130504\r\n 30\r\n0.0\r\n 11\r\n529539.2737798636\r\n 21\r\n188315.283781647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529677.6791911395\r\n 20\r\n188363.7428355513\r\n 30\r\n0.0\r\n 11\r\n529210.288461868\r\n 21\r\n188430.7805540487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529239.2811099911\r\n 20\r\n188014.3091164152\r\n 30\r\n0.0\r\n 11\r\n529285.7898337491\r\n 21\r\n188435.8208777742\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528944.5248341071\r\n 20\r\n188380.8283716183\r\n 30\r\n0.0\r\n 11\r\n529292.1661640495\r\n 21\r\n188432.9932131161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528569.2810199707\r\n 20\r\n188292.7158789641\r\n 30\r\n0.0\r\n 11\r\n528806.2807468023\r\n 21\r\n188334.287433425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529040.6513158122\r\n 20\r\n187642.311198794\r\n 30\r\n0.0\r\n 11\r\n528998.3219772069\r\n 21\r\n188203.3154728942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529006.6254128079\r\n 20\r\n188213.419072367\r\n 30\r\n0.0\r\n 11\r\n528982.4243466746\r\n 21\r\n188211.4033913288\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529131.0027007718\r\n 20\r\n188357.2369603609\r\n 30\r\n0.0\r\n 11\r\n529121.3118151613\r\n 21\r\n188418.8936375129\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529141.6269001136\r\n 20\r\n188345.903290431\r\n 30\r\n0.0\r\n 11\r\n529126.6125106496\r\n 21\r\n188364.7105906532\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529205.7236681208\r\n 20\r\n188346.1757213804\r\n 30\r\n0.0\r\n 11\r\n529133.8994146958\r\n 21\r\n188347.9474412191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528643.1508068893\r\n 20\r\n187897.179310321\r\n 30\r\n0.0\r\n 11\r\n528526.4033827907\r\n 21\r\n188092.533363126\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528820.3758145471\r\n 20\r\n187851.4258546835\r\n 30\r\n0.0\r\n 11\r\n528611.9802258696\r\n 21\r\n187905.2264917811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528733.4144066438\r\n 20\r\n187645.3547041817\r\n 30\r\n0.0\r\n 11\r\n528905.2436686549\r\n 21\r\n187686.2336607713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528846.9694373976\r\n 20\r\n187660.7754114646\r\n 30\r\n0.0\r\n 11\r\n528790.4836022626\r\n 21\r\n187917.9682800507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529257.0190230463\r\n 20\r\n188129.1958686471\r\n 30\r\n0.0\r\n 11\r\n529211.3374954253\r\n 21\r\n188140.3002809301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529208.0810821642\r\n 20\r\n188076.5686061319\r\n 30\r\n0.0\r\n 11\r\n529212.6413179638\r\n 21\r\n188141.6839030864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529249.3922603196\r\n 20\r\n188049.2016167797\r\n 30\r\n0.0\r\n 11\r\n529145.1686562638\r\n 21\r\n188044.6868198139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529171.6282192092\r\n 20\r\n187895.9835157372\r\n 30\r\n0.0\r\n 11\r\n529125.0608482104\r\n 21\r\n188190.9245459472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529189.2021753491\r\n 20\r\n188265.7286158319\r\n 30\r\n0.0\r\n 11\r\n529120.6887160605\r\n 21\r\n188272.4717344477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529118.5442134677\r\n 20\r\n188240.7014806336\r\n 30\r\n0.0\r\n 11\r\n529124.2522195913\r\n 21\r\n188300.534503478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529125.769900808\r\n 20\r\n188245.3762856292\r\n 30\r\n0.0\r\n 11\r\n529054.6877821515\r\n 21\r\n188251.3602913529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529056.8639720252\r\n 20\r\n188248.3464011163\r\n 30\r\n0.0\r\n 11\r\n529060.7891532491\r\n 21\r\n188304.3480327632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529131.21955758\r\n 20\r\n188294.7815871724\r\n 30\r\n0.0\r\n 11\r\n529054.0707556696\r\n 21\r\n188302.1402665566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529700.5375658763\r\n 20\r\n188484.9666580997\r\n 30\r\n0.0\r\n 11\r\n529471.5662644893\r\n 21\r\n188494.8968159285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFCC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529634.4603943709\r\n 20\r\n188470.7758187421\r\n 30\r\n0.0\r\n 11\r\n529594.9091760079\r\n 21\r\n188797.1288748313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529468.8897781007\r\n 20\r\n188550.5318230509\r\n 30\r\n0.0\r\n 11\r\n529652.0829850063\r\n 21\r\n188586.3101363694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529476.9034959577\r\n 20\r\n188490.4535894304\r\n 30\r\n0.0\r\n 11\r\n529469.4081252046\r\n 21\r\n188551.2025820028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529179.497533201\r\n 20\r\n188489.0947121396\r\n 30\r\n0.0\r\n 11\r\n529473.7923990441\r\n 21\r\n188530.7660222994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529263.7756425611\r\n 20\r\n188606.075583112\r\n 30\r\n0.0\r\n 11\r\n529908.763791275\r\n 21\r\n188688.5260989179\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529676.0616023485\r\n 20\r\n188728.7784676585\r\n 30\r\n0.0\r\n 11\r\n529699.9550760643\r\n 21\r\n188993.1196246366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529745.4174967054\r\n 20\r\n188733.181528544\r\n 30\r\n0.0\r\n 11\r\n529551.5546053525\r\n 21\r\n188728.0145692858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529742.387820929\r\n 20\r\n188805.7295765657\r\n 30\r\n0.0\r\n 11\r\n529678.1179868345\r\n 21\r\n188803.4858904049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529765.3870615571\r\n 20\r\n188756.4517929425\r\n 30\r\n0.0\r\n 11\r\n529729.7400974962\r\n 21\r\n188815.3292035195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529732.9561275008\r\n 20\r\n188795.1371031438\r\n 30\r\n0.0\r\n 11\r\n529794.0094763765\r\n 21\r\n189193.721581445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529822.1310589099\r\n 20\r\n188883.713462244\r\n 30\r\n0.0\r\n 11\r\n529531.9404346449\r\n 21\r\n188948.2884966338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529532.2791199877\r\n 20\r\n188934.97751292\r\n 30\r\n0.0\r\n 11\r\n529570.2126347435\r\n 21\r\n189170.7672924934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529384.8240162092\r\n 20\r\n188882.5875490996\r\n 30\r\n0.0\r\n 11\r\n529545.1621813861\r\n 21\r\n188947.7055902138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529462.6117272585\r\n 20\r\n188607.3202886658\r\n 30\r\n0.0\r\n 11\r\n529407.5964990378\r\n 21\r\n188898.026445466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529596.6289197234\r\n 20\r\n188752.5669333013\r\n 30\r\n0.0\r\n 11\r\n529643.1376434814\r\n 21\r\n189174.0786946602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529117.932638334\r\n 20\r\n189064.2549476437\r\n 30\r\n0.0\r\n 11\r\n529478.0365257928\r\n 21\r\n189010.7295513338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529175.4404670244\r\n 20\r\n188974.1618202624\r\n 30\r\n0.0\r\n 11\r\n529208.2352462457\r\n 21\r\n189086.918328656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529236.1315537773\r\n 20\r\n188987.2615005996\r\n 30\r\n0.0\r\n 11\r\n529175.6261960312\r\n 21\r\n189078.9386655001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529397.9991255444\r\n 20\r\n188380.5690156801\r\n 30\r\n0.0\r\n 11\r\n529379.1669343232\r\n 21\r\n188698.7673302471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529386.967280002\r\n 20\r\n188673.3752750442\r\n 30\r\n0.0\r\n 11\r\n529046.5374145823\r\n 21\r\n188886.9621896196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529129.1625395999\r\n 20\r\n188809.4756186941\r\n 30\r\n0.0\r\n 11\r\n529216.2919105073\r\n 21\r\n188951.7408787446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529204.7431267487\r\n 20\r\n188930.3817577657\r\n 30\r\n0.0\r\n 11\r\n529239.4635664156\r\n 21\r\n189006.191211736\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529217.8131727024\r\n 20\r\n188929.1797135396\r\n 30\r\n0.0\r\n 11\r\n529171.8465916677\r\n 21\r\n188994.8396027087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529059.7550470335\r\n 20\r\n188969.9509328124\r\n 30\r\n0.0\r\n 11\r\n529183.9345532104\r\n 21\r\n188991.1996691156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529222.0890533329\r\n 20\r\n188397.1220266792\r\n 30\r\n0.0\r\n 11\r\n529180.9709087853\r\n 21\r\n188540.5938421276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529614.3668327786\r\n 20\r\n188867.4536855333\r\n 30\r\n0.0\r\n 11\r\n529568.6853051575\r\n 21\r\n188878.5580978163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529565.4288918965\r\n 20\r\n188814.8264230181\r\n 30\r\n0.0\r\n 11\r\n529569.989127696\r\n 21\r\n188879.9417199727\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529606.7400700518\r\n 20\r\n188787.4594336657\r\n 30\r\n0.0\r\n 11\r\n529502.5164659961\r\n 21\r\n188782.9446366999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529528.9760289416\r\n 20\r\n188634.2413326233\r\n 30\r\n0.0\r\n 11\r\n529482.4086579428\r\n 21\r\n188929.1823628333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529546.5499850815\r\n 20\r\n189003.9864327182\r\n 30\r\n0.0\r\n 11\r\n529478.0365257928\r\n 21\r\n189010.7295513338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529396.9533566374\r\n 20\r\n188869.3050320101\r\n 30\r\n0.0\r\n 11\r\n529481.6000293236\r\n 21\r\n189038.7923203641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529319.2145911773\r\n 20\r\n188503.8776358344\r\n 30\r\n0.0\r\n 11\r\n529310.1799248937\r\n 21\r\n188616.229517655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529161.5459109745\r\n 20\r\n189048.278224607\r\n 30\r\n0.0\r\n 11\r\n528647.9655036306\r\n 21\r\n189306.6925524445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529101.9903625048\r\n 20\r\n189013.8960569484\r\n 30\r\n0.0\r\n 11\r\n528898.0009451259\r\n 21\r\n189114.1847520432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529103.3229948528\r\n 20\r\n188827.0483480004\r\n 30\r\n0.0\r\n 11\r\n528933.7188917285\r\n 21\r\n188835.2547992389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529075.138747387\r\n 20\r\n188689.541834962\r\n 30\r\n0.0\r\n 11\r\n529110.5648560599\r\n 21\r\n189653.1949148731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529014.134476429\r\n 20\r\n188904.4706081191\r\n 30\r\n0.0\r\n 11\r\n528588.6323275295\r\n 21\r\n189013.2441751404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529020.8464435756\r\n 20\r\n188973.6412415138\r\n 30\r\n0.0\r\n 11\r\n528995.036142355\r\n 21\r\n188781.4347211701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528948.7434804165\r\n 20\r\n188982.2180072632\r\n 30\r\n0.0\r\n 11\r\n528940.7107299657\r\n 21\r\n188918.4126734558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529001.0580113628\r\n 20\r\n188997.0657303256\r\n 30\r\n0.0\r\n 11\r\n528937.2500076989\r\n 21\r\n188971.2627422923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528957.6965665056\r\n 20\r\n188971.2180261912\r\n 30\r\n0.0\r\n 11\r\n528573.9463495623\r\n 21\r\n189095.0439877157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528925.0508529476\r\n 20\r\n189175.6538170998\r\n 30\r\n0.0\r\n 11\r\n528774.4528956277\r\n 21\r\n188797.1938463038\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528787.6475847067\r\n 20\r\n188795.4057816234\r\n 30\r\n0.0\r\n 11\r\n528560.9228864532\r\n 21\r\n188870.450321031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528823.4813869797\r\n 20\r\n188608.2648203714\r\n 30\r\n0.0\r\n 11\r\n528777.1365327426\r\n 21\r\n188810.1534936224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528889.6239405762\r\n 20\r\n188665.0728043687\r\n 30\r\n0.0\r\n 11\r\n528804.2454468054\r\n 21\r\n188666.4265262114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528702.9237163125\r\n 20\r\n189318.3532235257\r\n 30\r\n0.0\r\n 11\r\n528562.2188912551\r\n 21\r\n188867.6312452332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528977.9849291424\r\n 20\r\n188829.8472042992\r\n 30\r\n0.0\r\n 11\r\n528569.281635989\r\n 21\r\n188942.9703430246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528601.002372018\r\n 20\r\n188466.1103209222\r\n 30\r\n0.0\r\n 11\r\n528573.0898207653\r\n 21\r\n188948.8142290799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528580.829102545\r\n 20\r\n188265.8679942571\r\n 30\r\n0.0\r\n 11\r\n528589.0227163259\r\n 21\r\n188752.1753253903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528692.0671885087\r\n 20\r\n188449.3803171656\r\n 30\r\n0.0\r\n 11\r\n528585.9823395023\r\n 21\r\n188499.7343889034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528688.812207707\r\n 20\r\n188511.3836617221\r\n 30\r\n0.0\r\n 11\r\n528588.6604472116\r\n 21\r\n188466.2701853558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\nFFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528691.5173766687\r\n 20\r\n188701.3730322669\r\n 30\r\n0.0\r\n 11\r\n528670.5289779729\r\n 21\r\n188500.4583277746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1000\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528885.7690453813\r\n 20\r\n188604.6890351129\r\n 30\r\n0.0\r\n 11\r\n528588.9251168373\r\n 21\r\n188653.7931906997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1001\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528881.2333355238\r\n 20\r\n188501.5712737685\r\n 30\r\n0.0\r\n 11\r\n529072.9985641551\r\n 21\r\n188286.3545605624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1002\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529313.5523636491\r\n 20\r\n188574.4441057497\r\n 30\r\n0.0\r\n 11\r\n529313.5399730545\r\n 21\r\n188574.4451592718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1003\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529007.8590133908\r\n 20\r\n188588.9361372746\r\n 30\r\n0.0\r\n 11\r\n528752.9760917203\r\n 21\r\n188622.1076328554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1004\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528744.3257259774\r\n 20\r\n188631.9158405206\r\n 30\r\n0.0\r\n 11\r\n528742.4567941343\r\n 21\r\n188607.7029995927\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1005\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528622.1795868\r\n 20\r\n188777.6334281767\r\n 30\r\n0.0\r\n 11\r\n528576.8645196604\r\n 21\r\n188776.8076779879\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1006\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528635.0622695969\r\n 20\r\n188786.3145669094\r\n 30\r\n0.0\r\n 11\r\n528614.1015629134\r\n 21\r\n188774.4910645538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1007\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528645.013460359\r\n 20\r\n188849.6347350237\r\n 30\r\n0.0\r\n 11\r\n528631.8121348874\r\n 21\r\n188779.0118819444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1008\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528816.3556045137\r\n 20\r\n188658.3673484307\r\n 30\r\n0.0\r\n 11\r\n528769.4797142685\r\n 21\r\n188310.2403956821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1009\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528858.739831169\r\n 20\r\n188423.1701629402\r\n 30\r\n0.0\r\n 11\r\n528832.7451079655\r\n 21\r\n188618.4731858466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n100A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529163.3023877976\r\n 20\r\n188861.749687461\r\n 30\r\n0.0\r\n 11\r\n528748.8838189233\r\n 21\r\n188297.0863431962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n100B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528798.4103537806\r\n 20\r\n188475.1876621353\r\n 30\r\n0.0\r\n 11\r\n528705.0741880239\r\n 21\r\n188475.6352807375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n100C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528739.9594058419\r\n 20\r\n188471.3274185242\r\n 30\r\n0.0\r\n 11\r\n528670.6559632971\r\n 21\r\n188517.691360261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n100D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528743.2300711934\r\n 20\r\n188484.0385852572\r\n 30\r\n0.0\r\n 11\r\n528671.0809144397\r\n 21\r\n188449.1294632764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n100E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528674.3689592359\r\n 20\r\n188281.9732387523\r\n 30\r\n0.0\r\n 11\r\n528676.6016874598\r\n 21\r\n188460.4823922414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n100F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528867.3962947459\r\n 20\r\n188865.6767080673\r\n 30\r\n0.0\r\n 11\r\n528849.1500965991\r\n 21\r\n188822.3502012712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1010\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528911.5471733497\r\n 20\r\n188808.9735270618\r\n 30\r\n0.0\r\n 11\r\n528847.9920687762\r\n 21\r\n188823.8579595558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1011\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529084.0095456938\r\n 20\r\n188744.1930036312\r\n 30\r\n0.0\r\n 11\r\n528785.4168205069\r\n 21\r\n188745.2493220176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1012\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528721.7970170586\r\n 20\r\n188820.4974404503\r\n 30\r\n0.0\r\n 11\r\n528682.848956227\r\n 21\r\n188658.3917614921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1013\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528881.9155969028\r\n 20\r\n189060.359209691\r\n 30\r\n0.0\r\n 11\r\n528635.0928427313\r\n 21\r\n189155.7126458224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1014\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529005.5742357306\r\n 20\r\n187951.1941100283\r\n 30\r\n0.0\r\n 11\r\n529170.3123569273\r\n 21\r\n187974.2718737496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1015\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528914.0106005493\r\n 20\r\n187912.3245896476\r\n 30\r\n0.0\r\n 11\r\n529001.2995244179\r\n 21\r\n187749.7460745823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1016\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528902.4585341773\r\n 20\r\n188824.2821025381\r\n 30\r\n0.0\r\n 11\r\n528880.8568956467\r\n 21\r\n188709.114560081\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1017\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529568.232106769\r\n 20\r\n188122.590896667\r\n 30\r\n0.0\r\n 11\r\n529750.5420645888\r\n 21\r\n188200.2264006352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1018\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532031.6637419214\r\n 20\r\n189206.8229816716\r\n 30\r\n0.0\r\n 11\r\n532139.3496554863\r\n 21\r\n189308.1217414095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1019\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532191.7713961092\r\n 20\r\n189168.5143173241\r\n 30\r\n0.0\r\n 11\r\n531798.5900445994\r\n 21\r\n189468.3359836828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n101A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532122.8672957487\r\n 20\r\n189279.9419247654\r\n 30\r\n0.0\r\n 11\r\n532143.7102761921\r\n 21\r\n189359.2304385668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n101B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532201.5098460327\r\n 20\r\n189266.8780471429\r\n 30\r\n0.0\r\n 11\r\n532116.8583799476\r\n 21\r\n189290.3633142239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n101C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532182.879295075\r\n 20\r\n189263.0541117607\r\n 30\r\n0.0\r\n 11\r\n532339.2791202549\r\n 21\r\n189385.9090972841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n101D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532275.8011499364\r\n 20\r\n189183.076782106\r\n 30\r\n0.0\r\n 11\r\n532064.1640193323\r\n 21\r\n189560.7922123821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n101E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532310.3288497661\r\n 20\r\n189433.9305914979\r\n 30\r\n0.0\r\n 11\r\n532140.6377589193\r\n 21\r\n189356.1824568091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n101F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532338.8483841458\r\n 20\r\n189380.4492864692\r\n 30\r\n0.0\r\n 11\r\n532309.5166327113\r\n 21\r\n189434.1732945015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1020\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532581.2590586423\r\n 20\r\n189552.7548816218\r\n 30\r\n0.0\r\n 11\r\n532317.8707829392\r\n 21\r\n189415.0138841873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1021\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532522.4104459652\r\n 20\r\n189517.8477431132\r\n 30\r\n0.0\r\n 11\r\n532463.2642730652\r\n 21\r\n189614.2818218812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1022\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532535.7028271408\r\n 20\r\n189651.5572959675\r\n 30\r\n0.0\r\n 11\r\n531820.0585549223\r\n 21\r\n189259.0289520904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1023\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532038.0875403904\r\n 20\r\n189457.9451817606\r\n 30\r\n0.0\r\n 11\r\n531750.9298642218\r\n 21\r\n189790.2466061002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1024\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531979.1741634221\r\n 20\r\n189421.0827206187\r\n 30\r\n0.0\r\n 11\r\n532139.6848387839\r\n 21\r\n189529.9213222574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1025\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531939.3346770747\r\n 20\r\n189481.7886802488\r\n 30\r\n0.0\r\n 11\r\n531992.8569659881\r\n 21\r\n189517.4399115257\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1026\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531949.3822257373\r\n 20\r\n189428.3442063141\r\n 30\r\n0.0\r\n 11\r\n531944.0126425981\r\n 21\r\n189496.9621565889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1027\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531953.1733588967\r\n 20\r\n189478.6825219247\r\n 30\r\n0.0\r\n 11\r\n531671.1683416162\r\n 21\r\n189766.9016538019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1028\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531755.6417816337\r\n 20\r\n189416.7066298191\r\n 30\r\n0.0\r\n 11\r\n532027.1838522537\r\n 21\r\n189720.312621406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1029\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532034.6699812882\r\n 20\r\n189709.3010426241\r\n 30\r\n0.0\r\n 11\r\n531866.3692592388\r\n 21\r\n189878.7431821604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n102A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532218.144887253\r\n 20\r\n189760.7088206811\r\n 30\r\n0.0\r\n 11\r\n532016.7821271637\r\n 21\r\n189712.1298051467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n102B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532196.8065175713\r\n 20\r\n189676.1709095325\r\n 30\r\n0.0\r\n 11\r\n532157.5097438913\r\n 21\r\n189751.9804296455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n102C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531405.6950599251\r\n 20\r\n189397.6918620768\r\n 30\r\n0.0\r\n 11\r\n531723.7921117423\r\n 21\r\n189537.8611520869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n102D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531528.8411038234\r\n 20\r\n189551.8548372382\r\n 30\r\n0.0\r\n 11\r\n531869.470434986\r\n 21\r\n189878.8407822911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n102E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532088.74975918\r\n 20\r\n189523.5864930972\r\n 30\r\n0.0\r\n 11\r\n531805.1927822128\r\n 21\r\n189838.9127799219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n102F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532246.1302548441\r\n 20\r\n190023.238120023\r\n 30\r\n0.0\r\n 11\r\n531801.6612649959\r\n 21\r\n189832.8976604999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1030\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532470.7391336279\r\n 20\r\n190140.428907227\r\n 30\r\n0.0\r\n 11\r\n531984.7594943132\r\n 21\r\n189906.3534569081\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1031\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532301.7252596375\r\n 20\r\n189949.1983383498\r\n 30\r\n0.0\r\n 11\r\n532209.3368012323\r\n 21\r\n190021.6821329716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1032\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532244.7805702968\r\n 20\r\n189924.453399633\r\n 30\r\n0.0\r\n 11\r\n532240.4817546558\r\n 21\r\n190034.2127776569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1033\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532075.9476160555\r\n 20\r\n189837.2828058441\r\n 30\r\n0.0\r\n 11\r\n532246.4030078652\r\n 21\r\n189945.6903275581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1034\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532268.6167204107\r\n 20\r\n189678.4203122155\r\n 30\r\n0.0\r\n 11\r\n532072.767541199\r\n 21\r\n189950.3266036608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1035\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532195.6990315971\r\n 20\r\n189619.7720839555\r\n 30\r\n0.0\r\n 11\r\n532285.5589545911\r\n 21\r\n189701.4584338929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1036\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532338.0010107443\r\n 20\r\n189613.8580269038\r\n 30\r\n0.0\r\n 11\r\n532222.6820952939\r\n 21\r\n189577.9514995641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1037\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532229.4091453788\r\n 20\r\n189577.6030549164\r\n 30\r\n0.0\r\n 11\r\n532195.459634246\r\n 21\r\n189621.9319573072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1038\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532467.022615763\r\n 20\r\n189337.1839935896\r\n 30\r\n0.0\r\n 11\r\n532174.3049913963\r\n 21\r\n189817.635823486\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1039\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532161.6679775332\r\n 20\r\n189821.0026685536\r\n 30\r\n0.0\r\n 11\r\n532182.5046815933\r\n 21\r\n189833.4760937429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n103A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531976.7650487176\r\n 20\r\n189865.3219824437\r\n 30\r\n0.0\r\n 11\r\n531957.2901799326\r\n 21\r\n189906.2471172519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n103B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531974.7421079803\r\n 20\r\n189849.9195996247\r\n 30\r\n0.0\r\n 11\r\n531975.9740472566\r\n 21\r\n189873.953508134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n103C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531922.5098082239\r\n 20\r\n189812.7677928074\r\n 30\r\n0.0\r\n 11\r\n531979.8281759879\r\n 21\r\n189856.0860001588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n103D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532170.1247097689\r\n 20\r\n189744.736887547\r\n 30\r\n0.0\r\n 11\r\n532526.1201255466\r\n 21\r\n189993.58332384\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n103E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532516.4835480185\r\n 20\r\n189963.3210453037\r\n 30\r\n0.0\r\n 11\r\n532373.8361481662\r\n 21\r\n190105.3281985797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n103F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532524.0494471331\r\n 20\r\n189635.5096147978\r\n 30\r\n0.0\r\n 11\r\n532505.5035082588\r\n 21\r\n189997.781077944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1040\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532585.1762395939\r\n 20\r\n189882.9770222952\r\n 30\r\n0.0\r\n 11\r\n532213.1407573749\r\n 21\r\n189747.8641355415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1041\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532280.2215546078\r\n 20\r\n189638.2372237165\r\n 30\r\n0.0\r\n 11\r\n532310.3957018821\r\n 21\r\n189656.9859454393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1042\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532326.0648090236\r\n 20\r\n189842.5096595214\r\n 30\r\n0.0\r\n 11\r\n532284.0292765015\r\n 21\r\n189925.8454513888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1043\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532303.4462126704\r\n 20\r\n189896.5449618215\r\n 30\r\n0.0\r\n 11\r\n532231.0361635415\r\n 21\r\n189937.8894539226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1044\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532293.5287351565\r\n 20\r\n189887.9475987774\r\n 30\r\n0.0\r\n 11\r\n532292.588323795\r\n 21\r\n189968.0928621695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1045\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532443.6591333519\r\n 20\r\n190039.7142635487\r\n 30\r\n0.0\r\n 11\r\n532284.8901796214\r\n 21\r\n189958.0875382314\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1046\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532714.8532277894\r\n 20\r\n189518.7983350472\r\n 30\r\n0.0\r\n 11\r\n532551.4203747162\r\n 21\r\n189451.8200780417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1047\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532613.6075195969\r\n 20\r\n189465.1154719042\r\n 30\r\n0.0\r\n 11\r\n532509.5353245167\r\n 21\r\n189706.9993271604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1048\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532007.3517006937\r\n 20\r\n189606.5802005249\r\n 30\r\n0.0\r\n 11\r\n532037.989566198\r\n 21\r\n189642.2373335461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1049\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532077.795397995\r\n 20\r\n189592.3592185572\r\n 30\r\n0.0\r\n 11\r\n532036.1235619935\r\n 21\r\n189642.6011903765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532060.190368608\r\n 20\r\n189546.0382893018\r\n 30\r\n0.0\r\n 11\r\n532147.4960968193\r\n 21\r\n189603.1404158431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532212.7048115895\r\n 20\r\n189466.9031058558\r\n 30\r\n0.0\r\n 11\r\n532078.5647071548\r\n 21\r\n189733.6711019223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531982.8387736801\r\n 20\r\n189757.0442570122\r\n 30\r\n0.0\r\n 11\r\n532034.56869682\r\n 21\r\n189802.4708880157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532054.8353292636\r\n 20\r\n189777.9105230313\r\n 30\r\n0.0\r\n 11\r\n532015.3109772028\r\n 21\r\n189823.191838723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532046.2392857908\r\n 20\r\n189777.4953171877\r\n 30\r\n0.0\r\n 11\r\n532100.4986561253\r\n 21\r\n189823.8029477473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n104F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532100.4879973464\r\n 20\r\n189820.0855261795\r\n 30\r\n0.0\r\n 11\r\n532064.6460298329\r\n 21\r\n189863.2936638331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1050\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532013.0049510107\r\n 20\r\n189814.4555873601\r\n 30\r\n0.0\r\n 11\r\n532071.3914760512\r\n 21\r\n189865.4173523631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1051\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532459.1306889654\r\n 20\r\n189483.299482677\r\n 30\r\n0.0\r\n 11\r\n532400.9612071705\r\n 21\r\n189579.8441973495\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1052\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531839.5884021576\r\n 20\r\n189506.7425210747\r\n 30\r\n0.0\r\n 11\r\n531644.1460684732\r\n 21\r\n189685.1130454415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1053\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531261.8280108232\r\n 20\r\n189635.3713330043\r\n 30\r\n0.0\r\n 11\r\n530793.9869514637\r\n 21\r\n189997.6585587048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1054\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531271.1054127446\r\n 20\r\n189503.5805225813\r\n 30\r\n0.0\r\n 11\r\n531418.5747294049\r\n 21\r\n189699.5365689853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1055\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532139.467897414\r\n 20\r\n189076.1120245828\r\n 30\r\n0.0\r\n 11\r\n531077.8151185179\r\n 21\r\n189859.7508112586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1056\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531402.0923696672\r\n 20\r\n189671.3567523413\r\n 30\r\n0.0\r\n 11\r\n531422.9353501108\r\n 21\r\n189750.6452661428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1057\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531480.7349199513\r\n 20\r\n189658.2928747189\r\n 30\r\n0.0\r\n 11\r\n531396.0834538663\r\n 21\r\n189681.7781418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1058\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531463.4189746374\r\n 20\r\n189655.7308904651\r\n 30\r\n0.0\r\n 11\r\n531619.8187998175\r\n 21\r\n189778.5858759885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1059\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531596.6289551386\r\n 20\r\n189500.2419092503\r\n 30\r\n0.0\r\n 11\r\n531343.389093251\r\n 21\r\n189952.207039958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531589.5539236847\r\n 20\r\n189825.3454190738\r\n 30\r\n0.0\r\n 11\r\n531419.862832838\r\n 21\r\n189747.5972843849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531618.0734580644\r\n 20\r\n189771.8641140451\r\n 30\r\n0.0\r\n 11\r\n531588.7417066297\r\n 21\r\n189825.5881220773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531860.484132561\r\n 20\r\n189944.1697091979\r\n 30\r\n0.0\r\n 11\r\n531597.0958568579\r\n 21\r\n189806.4287117634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531801.6355198837\r\n 20\r\n189909.2625706889\r\n 30\r\n0.0\r\n 11\r\n531742.489346984\r\n 21\r\n190005.6966494571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531814.9279010593\r\n 20\r\n190042.9721235435\r\n 30\r\n0.0\r\n 11\r\n531151.7309556583\r\n 21\r\n189680.9756981938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n105F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531317.3126143089\r\n 20\r\n189849.3600093366\r\n 30\r\n0.0\r\n 11\r\n531030.1549381406\r\n 21\r\n190181.6614336764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1060\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531258.3992373407\r\n 20\r\n189812.4975481947\r\n 30\r\n0.0\r\n 11\r\n531418.9099127025\r\n 21\r\n189921.3361498332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1061\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531218.5597509931\r\n 20\r\n189873.2035078246\r\n 30\r\n0.0\r\n 11\r\n531272.0820399069\r\n 21\r\n189908.8547391015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1062\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531228.6072996558\r\n 20\r\n189819.7590338899\r\n 30\r\n0.0\r\n 11\r\n531223.2377165169\r\n 21\r\n189888.3769841649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1063\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531232.3984328154\r\n 20\r\n189870.0973495005\r\n 30\r\n0.0\r\n 11\r\n530950.3934155348\r\n 21\r\n190158.3164813777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1064\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531034.8668555523\r\n 20\r\n189808.1214573949\r\n 30\r\n0.0\r\n 11\r\n531306.4089261723\r\n 21\r\n190111.7274489819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1065\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531313.8950552069\r\n 20\r\n190100.7158702\r\n 30\r\n0.0\r\n 11\r\n531145.5943331574\r\n 21\r\n190270.1580097362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1066\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531497.3699611719\r\n 20\r\n190152.1236482572\r\n 30\r\n0.0\r\n 11\r\n531296.0072010822\r\n 21\r\n190103.5446327226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1067\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531476.0315914901\r\n 20\r\n190067.5857371085\r\n 30\r\n0.0\r\n 11\r\n531436.7348178098\r\n 21\r\n190143.3952572212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1068\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530928.7867488221\r\n 20\r\n189884.8131776398\r\n 30\r\n0.0\r\n 11\r\n530992.320475658\r\n 21\r\n189948.7315361369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1069\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530808.066177742\r\n 20\r\n189943.2696648143\r\n 30\r\n0.0\r\n 11\r\n531148.6955089044\r\n 21\r\n190270.255609867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531367.9748330986\r\n 20\r\n189915.001320673\r\n 30\r\n0.0\r\n 11\r\n531084.4178561316\r\n 21\r\n190230.3276074982\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531581.3258303478\r\n 20\r\n190436.6834793387\r\n 30\r\n0.0\r\n 11\r\n531080.8863389146\r\n 21\r\n190224.3124880759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531580.9503335561\r\n 20\r\n190340.6131659256\r\n 30\r\n0.0\r\n 11\r\n531488.5618751509\r\n 21\r\n190413.0969605477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531524.0056442154\r\n 20\r\n190315.868227209\r\n 30\r\n0.0\r\n 11\r\n531519.7068285743\r\n 21\r\n190425.6276052329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531355.1726899743\r\n 20\r\n190228.6976334198\r\n 30\r\n0.0\r\n 11\r\n531525.6280817838\r\n 21\r\n190337.105155134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n106F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531547.8417943295\r\n 20\r\n190069.8351397915\r\n 30\r\n0.0\r\n 11\r\n531351.9926151177\r\n 21\r\n190341.7414312368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1070\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531474.9241055158\r\n 20\r\n190011.1869115315\r\n 30\r\n0.0\r\n 11\r\n531564.7840285096\r\n 21\r\n190092.8732614688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1071\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531617.2260846627\r\n 20\r\n190005.2728544797\r\n 30\r\n0.0\r\n 11\r\n531501.9071692126\r\n 21\r\n189969.3663271401\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1072\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531508.6342192977\r\n 20\r\n189969.0178824923\r\n 30\r\n0.0\r\n 11\r\n531474.6847081646\r\n 21\r\n190013.3467848832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1073\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531746.2476896815\r\n 20\r\n189728.5988211656\r\n 30\r\n0.0\r\n 11\r\n531453.5300653147\r\n 21\r\n190209.0506510619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1074\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531440.8930514517\r\n 20\r\n190212.4174961294\r\n 30\r\n0.0\r\n 11\r\n531461.7297555117\r\n 21\r\n190224.8909213187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1075\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531255.9901226361\r\n 20\r\n190256.7368100196\r\n 30\r\n0.0\r\n 11\r\n531236.5152538514\r\n 21\r\n190297.6619448278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1076\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531253.9671818987\r\n 20\r\n190241.3344272003\r\n 30\r\n0.0\r\n 11\r\n531255.1991211752\r\n 21\r\n190265.3683357099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1077\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531201.7348821424\r\n 20\r\n190204.1826203831\r\n 30\r\n0.0\r\n 11\r\n531259.0532499064\r\n 21\r\n190247.5008277345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1078\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531449.3497836877\r\n 20\r\n190136.151715123\r\n 30\r\n0.0\r\n 11\r\n531736.5174682032\r\n 21\r\n190344.9304718819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1079\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531803.2745210516\r\n 20\r\n190026.9244423737\r\n 30\r\n0.0\r\n 11\r\n531797.309994369\r\n 21\r\n190230.8633370709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531827.2245172675\r\n 20\r\n190222.350860722\r\n 30\r\n0.0\r\n 11\r\n531492.3658312936\r\n 21\r\n190139.2789631173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531559.4466285263\r\n 20\r\n190029.6520512927\r\n 30\r\n0.0\r\n 11\r\n531589.6207758007\r\n 21\r\n190048.4007730151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531605.2898829422\r\n 20\r\n190233.9244870974\r\n 30\r\n0.0\r\n 11\r\n531563.2543504202\r\n 21\r\n190317.2602789646\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531582.6712865889\r\n 20\r\n190287.9597893974\r\n 30\r\n0.0\r\n 11\r\n531510.2612374601\r\n 21\r\n190329.3042814985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531572.753809075\r\n 20\r\n190279.3624263534\r\n 30\r\n0.0\r\n 11\r\n531571.8133977135\r\n 21\r\n190359.5076897454\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n107F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531677.3906608113\r\n 20\r\n190404.6452770142\r\n 30\r\n0.0\r\n 11\r\n531564.11525354\r\n 21\r\n190349.5023658073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1080\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531879.5088061571\r\n 20\r\n189844.6153308284\r\n 30\r\n0.0\r\n 11\r\n531788.7603984353\r\n 21\r\n190098.4141547363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1081\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531286.5767746124\r\n 20\r\n189997.9950281009\r\n 30\r\n0.0\r\n 11\r\n531317.2146401164\r\n 21\r\n190033.652161122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1082\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531357.0204719137\r\n 20\r\n189983.7740461333\r\n 30\r\n0.0\r\n 11\r\n531315.3486359122\r\n 21\r\n190034.0160179524\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1083\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531339.4154425268\r\n 20\r\n189937.4531168776\r\n 30\r\n0.0\r\n 11\r\n531426.721170738\r\n 21\r\n189994.5552434192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1084\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531491.9298855079\r\n 20\r\n189858.3179334316\r\n 30\r\n0.0\r\n 11\r\n531357.7897810734\r\n 21\r\n190125.0859294983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1085\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531262.0638475986\r\n 20\r\n190148.4590845882\r\n 30\r\n0.0\r\n 11\r\n531313.7937707388\r\n 21\r\n190193.8857155916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1086\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531334.0604031822\r\n 20\r\n190169.3253506072\r\n 30\r\n0.0\r\n 11\r\n531294.5360511213\r\n 21\r\n190214.6066662988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1087\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531325.4643597094\r\n 20\r\n190168.9101447634\r\n 30\r\n0.0\r\n 11\r\n531379.7237300438\r\n 21\r\n190215.2177753232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1088\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531379.7130712649\r\n 20\r\n190211.5003537553\r\n 30\r\n0.0\r\n 11\r\n531343.8711037515\r\n 21\r\n190254.7084914091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1089\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531292.2300249293\r\n 20\r\n190205.8704149363\r\n 30\r\n0.0\r\n 11\r\n531350.6165499698\r\n 21\r\n190256.8321799389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531738.3557628839\r\n 20\r\n189874.7143102527\r\n 30\r\n0.0\r\n 11\r\n531680.1862810891\r\n 21\r\n189971.2590249253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531118.8134760765\r\n 20\r\n189898.157348651\r\n 30\r\n0.0\r\n 11\r\n530923.3711423917\r\n 21\r\n190076.5278730174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531549.0232186045\r\n 20\r\n190408.9283136724\r\n 30\r\n0.0\r\n 11\r\n531815.5912827789\r\n 21\r\n190918.3242959899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531725.3179468167\r\n 20\r\n190263.1451353913\r\n 30\r\n0.0\r\n 11\r\n531858.3226310664\r\n 21\r\n190368.7038944124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532023.1126640984\r\n 20\r\n189917.6702009027\r\n 30\r\n0.0\r\n 11\r\n531560.0017468874\r\n 21\r\n190514.6625615866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n108F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531752.6335439978\r\n 20\r\n190378.0479479378\r\n 30\r\n0.0\r\n 11\r\n532027.0884013829\r\n 21\r\n190720.947159359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1090\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531706.8490401603\r\n 20\r\n190430.3299356158\r\n 30\r\n0.0\r\n 11\r\n531839.8883803324\r\n 21\r\n190289.2269516705\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1091\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531760.4259942967\r\n 20\r\n190479.3392020101\r\n 30\r\n0.0\r\n 11\r\n531804.1551633149\r\n 21\r\n190432.1862012669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1092\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531709.2673430877\r\n 20\r\n190460.8985557431\r\n 30\r\n0.0\r\n 11\r\n531776.1512396244\r\n 21\r\n190477.1404739515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1093\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531759.5661330731\r\n 20\r\n190465.1822965296\r\n 30\r\n0.0\r\n 11\r\n531999.1325695614\r\n 21\r\n190789.5355303038\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1094\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531666.8870233325\r\n 20\r\n190650.3047366494\r\n 30\r\n0.0\r\n 11\r\n532009.9057406248\r\n 21\r\n190430.6462430029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1095\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532000.2286936998\r\n 20\r\n190421.5001095026\r\n 30\r\n0.0\r\n 11\r\n532140.6677263311\r\n 21\r\n190614.6649349926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1096\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532080.2335795344\r\n 20\r\n190248.5694326226\r\n 30\r\n0.0\r\n 11\r\n532000.1690734311\r\n 21\r\n190439.6101527941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1097\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531993.374854094\r\n 20\r\n190256.1553575474\r\n 30\r\n0.0\r\n 11\r\n532061.948672143\r\n 21\r\n190307.0370953283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1098\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531754.1490246187\r\n 20\r\n190815.97404762\r\n 30\r\n0.0\r\n 11\r\n531827.379987234\r\n 21\r\n190763.4448451408\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1099\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531825.5130731995\r\n 20\r\n190338.500300852\r\n 30\r\n0.0\r\n 11\r\n532091.5924045128\r\n 21\r\n190668.7078352868\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532343.8663683539\r\n 20\r\n190262.8020174649\r\n 30\r\n0.0\r\n 11\r\n532103.326302272\r\n 21\r\n190636.37358738\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532473.8057340179\r\n 20\r\n190090.674340814\r\n 30\r\n0.0\r\n 11\r\n532186.8019124103\r\n 21\r\n190502.1917741612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532279.6383763485\r\n 20\r\n190196.11274643\r\n 30\r\n0.0\r\n 11\r\n532336.463625641\r\n 21\r\n190298.8766446244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532246.1302706473\r\n 20\r\n190248.3833546964\r\n 30\r\n0.0\r\n 11\r\n532353.799973734\r\n 21\r\n190270.1281452764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532133.1547478067\r\n 20\r\n190401.1570765797\r\n 30\r\n0.0\r\n 11\r\n532267.3541937391\r\n 21\r\n190250.1678714276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n109F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532031.7148287482\r\n 20\r\n190209.3461047226\r\n 30\r\n0.0\r\n 11\r\n532244.2452321987\r\n 21\r\n190422.3211352275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532047.5686717147\r\n 20\r\n190119.5293704757\r\n 30\r\n0.0\r\n 11\r\n531987.5720785385\r\n 21\r\n190225.1128650848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531910.4851815169\r\n 20\r\n190158.168030588\r\n 30\r\n0.0\r\n 11\r\n532008.9166929821\r\n 21\r\n190088.1753987119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532002.4149168784\r\n 20\r\n190089.9365131366\r\n 30\r\n0.0\r\n 11\r\n532048.4679687842\r\n 21\r\n190121.5076598298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531701.8104183642\r\n 20\r\n189935.3453690496\r\n 30\r\n0.0\r\n 11\r\n531701.8198704416\r\n 21\r\n189935.3534495803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531813.0607339144\r\n 20\r\n190030.4526695709\r\n 30\r\n0.0\r\n 11\r\n532129.4420644395\r\n 21\r\n190300.9253790891\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532130.7508814489\r\n 20\r\n190313.9375565826\r\n 30\r\n0.0\r\n 11\r\n532146.3871067527\r\n 21\r\n190295.356301773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532145.0206820415\r\n 20\r\n190503.5415319083\r\n 30\r\n0.0\r\n 11\r\n532182.3169910715\r\n 21\r\n190529.2926970463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532129.4927986443\r\n 20\r\n190503.0827041237\r\n 30\r\n0.0\r\n 11\r\n532153.4156540405\r\n 21\r\n190505.6986976858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532084.48793898\r\n 20\r\n190548.722954936\r\n 30\r\n0.0\r\n 11\r\n532136.3912738704\r\n 21\r\n190499.0449296283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532056.8092401119\r\n 20\r\n190293.4285500489\r\n 30\r\n0.0\r\n 11\r\n532297.8757637227\r\n 21\r\n190037.9355843721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532207.5227721233\r\n 20\r\n189994.9465784494\r\n 30\r\n0.0\r\n 11\r\n532066.7553249823\r\n 21\r\n190251.4614745323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531969.2268888711\r\n 20\r\n190167.7590414535\r\n 30\r\n0.0\r\n 11\r\n531992.5469677952\r\n 21\r\n190140.9603913208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532178.1955524762\r\n 20\r\n190155.0732369392\r\n 30\r\n0.0\r\n 11\r\n532253.7626618632\r\n 21\r\n190209.85874761\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532227.9330378915\r\n 20\r\n190186.0183066627\r\n 30\r\n0.0\r\n 11\r\n532257.2029016576\r\n 21\r\n190264.0942781078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532217.8643400956\r\n 20\r\n190194.4380653439\r\n 30\r\n0.0\r\n 11\r\n532296.8342970701\r\n 21\r\n190208.1454908176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532391.6274120264\r\n 20\r\n190070.4273729366\r\n 30\r\n0.0\r\n 11\r\n532285.7295209613\r\n 21\r\n190214.1498124604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531894.4661772635\r\n 20\r\n190432.0901979454\r\n 30\r\n0.0\r\n 11\r\n531934.5522845409\r\n 21\r\n190407.5297838349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531891.6592800405\r\n 20\r\n190360.280225479\r\n 30\r\n0.0\r\n 11\r\n531934.6139546222\r\n 21\r\n190409.4299312725\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531843.1238733045\r\n 20\r\n190370.2742156616\r\n 30\r\n0.0\r\n 11\r\n531913.4162201869\r\n 21\r\n190293.1903068104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531789.3193321156\r\n 20\r\n190207.0930159958\r\n 30\r\n0.0\r\n 11\r\n532031.2859184319\r\n 21\r\n190382.0527326439\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532039.096682347\r\n 20\r\n190480.2807871166\r\n 30\r\n0.0\r\n 11\r\n532092.1903968702\r\n 21\r\n190436.4558942987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532071.1757363024\r\n 20\r\n190412.5324338467\r\n 30\r\n0.0\r\n 11\r\n532109.5756333829\r\n 21\r\n190458.7711606978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532069.3952158915\r\n 20\r\n190420.9522976431\r\n 30\r\n0.0\r\n 11\r\n532123.761975346\r\n 21\r\n190374.7707928645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532120.0904140471\r\n 20\r\n190374.1885778235\r\n 30\r\n0.0\r\n 11\r\n532157.0308076825\r\n 21\r\n190416.4614664497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532100.5834589982\r\n 20\r\n190459.6547015916\r\n 30\r\n0.0\r\n 11\r\n532160.2028778269\r\n 21\r\n190410.1409388884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531769.1561834484\r\n 20\r\n190581.7882006832\r\n 30\r\n0.0\r\n 11\r\n531914.0816828643\r\n 21\r\n190803.171012523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531719.4153004631\r\n 20\r\n189040.0434887144\r\n 30\r\n0.0\r\n 11\r\n531322.9694125037\r\n 21\r\n189229.0260951112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531968.8214497981\r\n 20\r\n188995.9724442154\r\n 30\r\n0.0\r\n 11\r\n531365.6109342521\r\n 21\r\n189366.7655952858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531684.4393783764\r\n 20\r\n189323.3329337703\r\n 30\r\n0.0\r\n 11\r\n531352.3449747928\r\n 21\r\n188808.9261875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531476.1160381618\r\n 20\r\n188976.8223097931\r\n 30\r\n0.0\r\n 11\r\n531268.1767972716\r\n 21\r\n189094.2831279027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531647.4109409196\r\n 20\r\n188919.6673788751\r\n 30\r\n0.0\r\n 11\r\n531416.1677844149\r\n 21\r\n188743.6164943205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531466.3846967644\r\n 20\r\n189459.5185089535\r\n 30\r\n0.0\r\n 11\r\n531268.9033481682\r\n 21\r\n189091.2666828764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531669.5210069521\r\n 20\r\n188973.8165935606\r\n 30\r\n0.0\r\n 11\r\n531290.3979437241\r\n 21\r\n189163.819039014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531194.0533733342\r\n 20\r\n188433.5445984078\r\n 30\r\n0.0\r\n 11\r\n531295.2640665268\r\n 21\r\n189168.8164507826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531499.0396327037\r\n 20\r\n188680.1597014088\r\n 30\r\n0.0\r\n 11\r\n531241.3553360876\r\n 21\r\n188965.0451001069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531310.3338233292\r\n 20\r\n188991.3747021521\r\n 30\r\n0.0\r\n 11\r\n531265.7140145608\r\n 21\r\n188999.3251636938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531324.6517658388\r\n 20\r\n188997.4014930081\r\n 30\r\n0.0\r\n 11\r\n531301.800692387\r\n 21\r\n188989.8533227177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531346.6567294156\r\n 20\r\n189057.6032493413\r\n 30\r\n0.0\r\n 11\r\n531320.0511396683\r\n 21\r\n188990.8649172865\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531567.9455156609\r\n 20\r\n189030.3499374114\r\n 30\r\n0.0\r\n 11\r\n531541.6673532669\r\n 21\r\n188991.3682991808\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531600.301193957\r\n 20\r\n188966.180934773\r\n 30\r\n0.0\r\n 11\r\n531540.8226630274\r\n 21\r\n188993.0714908561\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531886.7588520884\r\n 20\r\n189321.9919267621\r\n 30\r\n0.0\r\n 11\r\n531608.349415042\r\n 21\r\n188896.1120560258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531756.9861162266\r\n 20\r\n188869.2808768581\r\n 30\r\n0.0\r\n 11\r\n531407.9373381911\r\n 21\r\n188939.3426849193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531294.8779524876\r\n 20\r\n189527.3186458787\r\n 30\r\n0.0\r\n 11\r\n531058.9344860326\r\n 21\r\n189579.1778047209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531203.525372206\r\n 20\r\n189082.6444684779\r\n 30\r\n0.0\r\n 11\r\n531314.0853586686\r\n 21\r\n189591.3148192839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531096.1896724\r\n 20\r\n189100.4302733887\r\n 30\r\n0.0\r\n 11\r\n531269.7773097273\r\n 21\r\n189835.7798042393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531151.2142742812\r\n 20\r\n189631.5412952697\r\n 30\r\n0.0\r\n 11\r\n530754.7683863218\r\n 21\r\n189820.5239016666\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531171.1721781701\r\n 20\r\n189698.109373953\r\n 30\r\n0.0\r\n 11\r\n531108.6900636548\r\n 21\r\n189514.5187873819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531102.0876062626\r\n 20\r\n189720.4637947992\r\n 30\r\n0.0\r\n 11\r\n531081.8710946612\r\n 21\r\n189659.4151391157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531156.2856576337\r\n 20\r\n189724.9175859754\r\n 30\r\n0.0\r\n 11\r\n531088.6930151012\r\n 21\r\n189711.9372085358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531108.7451913958\r\n 20\r\n189707.9404608063\r\n 30\r\n0.0\r\n 11\r\n530756.1735946894\r\n 21\r\n189903.6197058668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531056.6520987661\r\n 20\r\n189822.3268650833\r\n 30\r\n0.0\r\n 11\r\n530895.3149307944\r\n 21\r\n189572.6253398407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530907.9150119798\r\n 20\r\n189568.3201163484\r\n 30\r\n0.0\r\n 11\r\n530699.9757710894\r\n 21\r\n189685.7809344579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530906.8933548907\r\n 20\r\n189377.7820440888\r\n 30\r\n0.0\r\n 11\r\n530900.4533912059\r\n 21\r\n189584.8216750027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530982.7706124859\r\n 20\r\n189420.7311560924\r\n 30\r\n0.0\r\n 11\r\n530899.2645509212\r\n 21\r\n189438.5653211523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530863.1775169132\r\n 20\r\n189980.745130767\r\n 30\r\n0.0\r\n 11\r\n530700.7023219861\r\n 21\r\n189682.7644894318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531101.31998077\r\n 20\r\n189565.3144001159\r\n 30\r\n0.0\r\n 11\r\n530722.196917542\r\n 21\r\n189755.3168455691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530654.6957032442\r\n 20\r\n189221.5155091609\r\n 30\r\n0.0\r\n 11\r\n530727.0630403447\r\n 21\r\n189760.3142573377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530747.2416806323\r\n 20\r\n189247.3009350145\r\n 30\r\n0.0\r\n 11\r\n530652.8930014143\r\n 21\r\n189317.2141273253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530756.0350379258\r\n 20\r\n189308.7638222205\r\n 30\r\n0.0\r\n 11\r\n530649.051045308\r\n 21\r\n189283.8634968476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530795.4192782982\r\n 20\r\n189494.645936663\r\n 30\r\n0.0\r\n 11\r\n530735.984569425\r\n 21\r\n189301.57924678\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530999.6047073716\r\n 20\r\n189350.8857676001\r\n 30\r\n0.0\r\n 11\r\n530685.5640125669\r\n 21\r\n189467.7975904928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531036.8657076219\r\n 20\r\n189436.7241149764\r\n 30\r\n0.0\r\n 11\r\n530981.8713730649\r\n 21\r\n189328.4509017923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531086.4521717799\r\n 20\r\n189415.375078614\r\n 30\r\n0.0\r\n 11\r\n531034.7194828299\r\n 21\r\n189436.3834052333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531381.1803599318\r\n 20\r\n189249.8553472654\r\n 30\r\n0.0\r\n 11\r\n530840.3943797157\r\n 21\r\n189404.9942916577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530833.8034017388\r\n 20\r\n189416.2898117606\r\n 30\r\n0.0\r\n 11\r\n530827.288728647\r\n 21\r\n189392.8950771704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530742.1327971468\r\n 20\r\n189582.8725087071\r\n 30\r\n0.0\r\n 11\r\n530697.5129883786\r\n 21\r\n189590.8229702489\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530756.4507396567\r\n 20\r\n189588.8992995633\r\n 30\r\n0.0\r\n 11\r\n530733.5996662051\r\n 21\r\n189581.3511292729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530778.4557032334\r\n 20\r\n189649.1010558965\r\n 30\r\n0.0\r\n 11\r\n530751.8501134863\r\n 21\r\n189582.3627238419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530909.5881846175\r\n 20\r\n189428.3169625748\r\n 30\r\n0.0\r\n 11\r\n530784.2463905739\r\n 21\r\n189096.1373681236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531108.5813818942\r\n 20\r\n189115.914939105\r\n 30\r\n0.0\r\n 11\r\n530910.3346308408\r\n 21\r\n189067.6979914053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530926.4599834396\r\n 20\r\n189041.102617044\r\n 30\r\n0.0\r\n 11\r\n530917.9558640805\r\n 21\r\n189386.0068931815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531041.426258261\r\n 20\r\n189350.3283994556\r\n 30\r\n0.0\r\n 11\r\n531031.3309967528\r\n 21\r\n189316.2684607437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530856.5678735057\r\n 20\r\n189252.0623850323\r\n 30\r\n0.0\r\n 11\r\n530765.0790922604\r\n 21\r\n189270.5459752372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530798.4733508944\r\n 20\r\n189259.5751234313\r\n 30\r\n0.0\r\n 11\r\n530739.440772385\r\n 21\r\n189318.4626171501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530804.1397268244\r\n 20\r\n189271.4141772521\r\n 30\r\n0.0\r\n 11\r\n530726.6028294479\r\n 21\r\n189251.1120304952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530711.0135881931\r\n 20\r\n189137.3537963988\r\n 30\r\n0.0\r\n 11\r\n530734.2142790415\r\n 21\r\n189261.1834636557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531304.5651187085\r\n 20\r\n189090.643348688\r\n 30\r\n0.0\r\n 11\r\n531035.799416155\r\n 21\r\n189110.9931312904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530999.7444894787\r\n 20\r\n189621.8477439666\r\n 30\r\n0.0\r\n 11\r\n530973.4663270845\r\n 21\r\n189582.8661057361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531032.1001677749\r\n 20\r\n189557.6787413281\r\n 30\r\n0.0\r\n 11\r\n530972.6216368453\r\n 21\r\n189584.5692974113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531072.1108657749\r\n 20\r\n189586.9141580743\r\n 30\r\n0.0\r\n 11\r\n531040.1483888599\r\n 21\r\n189487.6098625809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531188.7850900446\r\n 20\r\n189460.7786834135\r\n 30\r\n0.0\r\n 11\r\n530896.0297265131\r\n 21\r\n189519.5411584004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530848.1576575035\r\n 20\r\n189605.6691081451\r\n 30\r\n0.0\r\n 11\r\n530818.0399273344\r\n 21\r\n189543.7620319594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530847.0879069723\r\n 20\r\n189530.7173856346\r\n 30\r\n0.0\r\n 11\r\n530792.9614754305\r\n 21\r\n189556.8497671789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530845.2135190155\r\n 20\r\n189539.1168516337\r\n 30\r\n0.0\r\n 11\r\n530814.9155711146\r\n 21\r\n189474.5373636352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530818.4976435953\r\n 20\r\n189475.531392542\r\n 30\r\n0.0\r\n 11\r\n530767.3449581734\r\n 21\r\n189498.6612989157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530800.7760247072\r\n 20\r\n189561.3854770761\r\n 30\r\n0.0\r\n 11\r\n530767.0820439746\r\n 21\r\n189491.5943353683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531238.1855210372\r\n 20\r\n189218.7990321386\r\n 30\r\n0.0\r\n 11\r\n531129.6891580291\r\n 21\r\n189249.3458774341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530672.9130626553\r\n 20\r\n189260.0114279406\r\n 30\r\n0.0\r\n 11\r\n530252.2199106406\r\n 21\r\n188868.1440122411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530684.471856032\r\n 20\r\n189192.2221138704\r\n 30\r\n0.0\r\n 11\r\n530519.5811621016\r\n 21\r\n189035.7594543587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530860.1522721009\r\n 20\r\n189128.5806677993\r\n 30\r\n0.0\r\n 11\r\n530793.5540958264\r\n 21\r\n188972.3834189265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531272.1169317574\r\n 20\r\n188932.8263748838\r\n 30\r\n0.0\r\n 11\r\n530573.8535816081\r\n 21\r\n189221.4435853778\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530756.5744089849\r\n 20\r\n189071.8318840867\r\n 30\r\n0.0\r\n 11\r\n530499.3980613915\r\n 21\r\n188619.3786656358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530694.0402449708\r\n 20\r\n189102.1486345439\r\n 30\r\n0.0\r\n 11\r\n530865.3193356496\r\n 21\r\n189011.1926495405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530660.9563868377\r\n 20\r\n189037.5122938518\r\n 30\r\n0.0\r\n 11\r\n530718.0005073976\r\n 21\r\n189007.8203082046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530665.2013767399\r\n 20\r\n189091.7270989238\r\n 30\r\n0.0\r\n 11\r\n530667.2381379603\r\n 21\r\n189022.9295181036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n10FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530674.3810425642\r\n 20\r\n189042.0878760805\r\n 30\r\n0.0\r\n 11\r\n530437.7811339434\r\n 21\r\n188827.1015365688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1100\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530906.5493413559\r\n 20\r\n188952.519278251\r\n 30\r\n0.0\r\n 11\r\n530631.0793766138\r\n 21\r\n188635.0148490799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1101\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531083.9260207276\r\n 20\r\n188855.8237667776\r\n 30\r\n0.0\r\n 11\r\n530966.2296031682\r\n 21\r\n188885.7406319248\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1102\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531010.3881229036\r\n 20\r\n188977.7951032612\r\n 30\r\n0.0\r\n 11\r\n531103.9336384209\r\n 21\r\n188901.3950542242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1103\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531100.5147283493\r\n 20\r\n188907.198989996\r\n 30\r\n0.0\r\n 11\r\n531082.2562417648\r\n 21\r\n188854.4330107956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1104\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531170.0449162952\r\n 20\r\n189237.9965705819\r\n 30\r\n0.0\r\n 11\r\n531170.0396251662\r\n 21\r\n189237.9853171069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1105\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531107.7686870358\r\n 20\r\n189105.5439277551\r\n 30\r\n0.0\r\n 11\r\n530790.0936627911\r\n 21\r\n188558.1746075611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1106\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530770.2701002741\r\n 20\r\n188834.3343962393\r\n 30\r\n0.0\r\n 11\r\n531228.8502984493\r\n 21\r\n188636.032638733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1107\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531455.2532802372\r\n 20\r\n188641.247114639\r\n 30\r\n0.0\r\n 11\r\n530938.8815154797\r\n 21\r\n188837.4798149403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1108\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531016.6839955069\r\n 20\r\n188918.6094828753\r\n 30\r\n0.0\r\n 11\r\n531048.6985048241\r\n 21\r\n188903.2125700951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1109\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530596.0115345955\r\n 20\r\n188896.9408068378\r\n 30\r\n0.0\r\n 11\r\n530776.2852085942\r\n 21\r\n188888.5968132422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530810.499412421\r\n 20\r\n188942.4644181304\r\n 30\r\n0.0\r\n 11\r\n530774.4691225146\r\n 21\r\n188888.034501198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530931.1429369639\r\n 20\r\n189081.6941781546\r\n 30\r\n0.0\r\n 11\r\n530848.8341201208\r\n 21\r\n188861.8370460586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531203.0140174917\r\n 20\r\n188919.6828447229\r\n 30\r\n0.0\r\n 11\r\n531154.1005040535\r\n 21\r\n189123.1156930919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530792.987268706\r\n 20\r\n188939.2580701113\r\n 30\r\n0.0\r\n 11\r\n530893.48422323\r\n 21\r\n188879.0039768547\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531682.2218760266\r\n 20\r\n189319.8980726093\r\n 30\r\n0.0\r\n 11\r\n531672.7338951584\r\n 21\r\n189517.8227310418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n110F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528393.7599560187\r\n 20\r\n187524.6938483252\r\n 30\r\n0.0\r\n 11\r\n530003.6132568962\r\n 21\r\n189942.2237126069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1110\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528674.734682812\r\n 20\r\n188311.2132533978\r\n 30\r\n0.0\r\n 11\r\n528559.3309317352\r\n 21\r\n188037.4355296202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1111\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529022.3447486716\r\n 20\r\n187884.9339930147\r\n 30\r\n0.0\r\n 11\r\n528621.9671427173\r\n 21\r\n188233.4860521839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1112\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528790.496679948\r\n 20\r\n187830.6395476078\r\n 30\r\n0.0\r\n 11\r\n528886.1965418544\r\n 21\r\n188042.1536712512\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1113\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529017.9036586692\r\n 20\r\n188125.0850155283\r\n 30\r\n0.0\r\n 11\r\n528771.9057892071\r\n 21\r\n188328.2578044422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1114\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529180.9709087853\r\n 20\r\n188540.5938421276\r\n 30\r\n0.0\r\n 11\r\n529006.0636934473\r\n 21\r\n188684.6353220643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1115\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528854.9383508704\r\n 20\r\n187993.2720995656\r\n 30\r\n0.0\r\n 11\r\n529032.4021209982\r\n 21\r\n188160.2722698406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1116\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528690.2652093164\r\n 20\r\n188107.9072833756\r\n 30\r\n0.0\r\n 11\r\n528862.7144473831\r\n 21\r\n188341.1823277175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1117\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529891.4941110528\r\n 20\r\n189786.6610053253\r\n 30\r\n0.0\r\n 11\r\n532033.4775431653\r\n 21\r\n192553.6794256942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1118\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530424.1573235889\r\n 20\r\n189057.2601955194\r\n 30\r\n0.0\r\n 11\r\n530615.1814091358\r\n 21\r\n188886.4997984614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1119\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529791.779404945\r\n 20\r\n189319.6821134301\r\n 30\r\n0.0\r\n 11\r\n530003.6689285722\r\n 21\r\n189704.3723750401\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529597.6850152232\r\n 20\r\n189461.4597606462\r\n 30\r\n0.0\r\n 11\r\n529894.5596331585\r\n 21\r\n189249.4055132699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529779.842494701\r\n 20\r\n189420.5689342099\r\n 30\r\n0.0\r\n 11\r\n529831.8626403138\r\n 21\r\n189382.7595418249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529655.0159155208\r\n 20\r\n189570.2254684934\r\n 30\r\n0.0\r\n 11\r\n530034.0293144771\r\n 21\r\n189421.025811471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530026.3030274082\r\n 20\r\n189410.1813897105\r\n 30\r\n0.0\r\n 11\r\n530126.7485781536\r\n 21\r\n189626.8527145978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530138.2307661828\r\n 20\r\n189255.9802805821\r\n 30\r\n0.0\r\n 11\r\n530022.7433686064\r\n 21\r\n189427.9382489995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n111F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530051.5441219289\r\n 20\r\n189246.6309410291\r\n 30\r\n0.0\r\n 11\r\n530108.9874280879\r\n 21\r\n189309.8099433867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1120\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529675.5633810097\r\n 20\r\n189679.5496308565\r\n 30\r\n0.0\r\n 11\r\n529757.5681154661\r\n 21\r\n189642.1689603781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1121\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529702.9854214259\r\n 20\r\n189829.8454059539\r\n 30\r\n0.0\r\n 11\r\n530127.917123712\r\n 21\r\n189623.9784637252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1122\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529870.9296487201\r\n 20\r\n189294.9701512054\r\n 30\r\n0.0\r\n 11\r\n530068.1511336619\r\n 21\r\n189670.3884675232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1123\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530394.1384051356\r\n 20\r\n189320.9117378102\r\n 30\r\n0.0\r\n 11\r\n530061.2839424964\r\n 21\r\n189671.6111535061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1124\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530582.040160884\r\n 20\r\n189150.9830491771\r\n 30\r\n0.0\r\n 11\r\n530193.7565299102\r\n 21\r\n189525.4204246993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1125\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530344.0149637483\r\n 20\r\n189243.063587853\r\n 30\r\n0.0\r\n 11\r\n530379.9011146352\r\n 21\r\n189354.8746423326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1126\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530301.0336818742\r\n 20\r\n189287.8700499391\r\n 30\r\n0.0\r\n 11\r\n530402.4682670551\r\n 21\r\n189330.0200891955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1127\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530160.6542056199\r\n 20\r\n189415.9203584347\r\n 30\r\n0.0\r\n 11\r\n530321.5122062477\r\n 21\r\n189293.7240614566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1128\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529972.8374165564\r\n 20\r\n189026.1966783911\r\n 30\r\n0.0\r\n 11\r\n530265.5573080922\r\n 21\r\n189458.1619515941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1129\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530175.1575922121\r\n 20\r\n189329.8815589349\r\n 30\r\n0.0\r\n 11\r\n530194.0910912162\r\n 21\r\n189314.6737587161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530152.5025848808\r\n 20\r\n189518.6672716123\r\n 30\r\n0.0\r\n 11\r\n530184.1168749776\r\n 21\r\n189551.1430138658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530137.3563490113\r\n 20\r\n189515.2151382539\r\n 30\r\n0.0\r\n 11\r\n530160.3221415125\r\n 21\r\n189522.4067171776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530084.3770351425\r\n 20\r\n189551.2936940677\r\n 30\r\n0.0\r\n 11\r\n530144.9052914925\r\n 21\r\n189512.5872016605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530106.5758562604\r\n 20\r\n189295.4645403759\r\n 30\r\n0.0\r\n 11\r\n530463.5683009287\r\n 21\r\n189048.0505566158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530431.8429333872\r\n 20\r\n189046.5774025137\r\n 30\r\n0.0\r\n 11\r\n530515.4704058857\r\n 21\r\n189229.6641527433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n112F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530380.3564014845\r\n 20\r\n188954.2573887482\r\n 30\r\n0.0\r\n 11\r\n530124.4476774383\r\n 21\r\n189256.2120495064\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1130\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530252.4199769282\r\n 20\r\n189183.1866620482\r\n 30\r\n0.0\r\n 11\r\n530315.9699360793\r\n 21\r\n189251.5477832537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1131\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530295.2366096555\r\n 20\r\n189223.1635398347\r\n 30\r\n0.0\r\n 11\r\n530308.8600722086\r\n 21\r\n189305.4252168782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1132\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530283.7300963471\r\n 20\r\n189229.477901484\r\n 30\r\n0.0\r\n 11\r\n530358.560215857\r\n 21\r\n189258.1937652501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1133\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530478.1896499934\r\n 20\r\n189141.3998736121\r\n 30\r\n0.0\r\n 11\r\n530346.5041401216\r\n 21\r\n189261.9379565754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1134\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529920.4884380986\r\n 20\r\n189400.1249218689\r\n 30\r\n0.0\r\n 11\r\n529964.5664900084\r\n 21\r\n189383.7775894323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1135\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529931.6173131438\r\n 20\r\n189329.1270419157\r\n 30\r\n0.0\r\n 11\r\n529964.2596465282\r\n 21\r\n189385.6538118503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1136\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529882.0654487507\r\n 20\r\n189329.549276416\r\n 30\r\n0.0\r\n 11\r\n529965.9340981221\r\n 21\r\n189267.5090258793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1137\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529860.8233238849\r\n 20\r\n189159.0447172158\r\n 30\r\n0.0\r\n 11\r\n530064.4005868218\r\n 21\r\n189377.4824185364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1138\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530053.0738443868\r\n 20\r\n189475.3673694956\r\n 30\r\n0.0\r\n 11\r\n530113.6384535762\r\n 21\r\n189442.6337191324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1139\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530097.6453030549\r\n 20\r\n189415.0988856449\r\n 30\r\n0.0\r\n 11\r\n530126.3815590909\r\n 21\r\n189467.8890319381\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530094.2705849351\r\n 20\r\n189423.0156802548\r\n 30\r\n0.0\r\n 11\r\n530156.5398193389\r\n 21\r\n189388.2159911196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530153.0500824229\r\n 20\r\n189386.934947412\r\n 30\r\n0.0\r\n 11\r\n530181.1210737556\r\n 21\r\n189435.5519119445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530117.3882154891\r\n 20\r\n189467.0174726847\r\n 30\r\n0.0\r\n 11\r\n530185.4552303947\r\n 21\r\n189429.9638725852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529633.0482007297\r\n 20\r\n189917.753207084\r\n 30\r\n0.0\r\n 11\r\n529865.8300288423\r\n 21\r\n190673.7845134428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.7877707331\r\n 20\r\n190050.3400571805\r\n 30\r\n0.0\r\n 11\r\n529803.1800083046\r\n 21\r\n189984.5373966304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n113F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529690.468046342\r\n 20\r\n189886.8937312946\r\n 30\r\n0.0\r\n 11\r\n529835.0780648242\r\n 21\r\n190359.728321133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1140\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529771.0299817181\r\n 20\r\n189990.2071443399\r\n 30\r\n0.0\r\n 11\r\n529852.6219251565\r\n 21\r\n189998.1979528455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1141\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529786.091352851\r\n 20\r\n189911.9225946936\r\n 30\r\n0.0\r\n 11\r\n529778.7158427058\r\n 21\r\n189999.461330864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1142\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529678.12740668\r\n 20\r\n189748.3520551558\r\n 30\r\n0.0\r\n 11\r\n530014.0117758446\r\n 21\r\n190142.7941897908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1143\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530132.8866705972\r\n 20\r\n189698.1563884737\r\n 30\r\n0.0\r\n 11\r\n530202.777203116\r\n 21\r\n189787.1120784594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1144\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530262.8900021763\r\n 20\r\n189732.12793098\r\n 30\r\n0.0\r\n 11\r\n529693.1011346465\r\n 21\r\n190228.3257209733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1145\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529908.5101230068\r\n 20\r\n190131.5293901852\r\n 30\r\n0.0\r\n 11\r\n530125.3000962972\r\n 21\r\n190582.6184565757\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1146\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529853.4818453089\r\n 20\r\n190173.9736557676\r\n 30\r\n0.0\r\n 11\r\n530011.2903512204\r\n 21\r\n190061.2527900251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1147\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529896.5732127627\r\n 20\r\n190232.416210965\r\n 30\r\n0.0\r\n 11\r\n529948.5933583757\r\n 21\r\n190194.6068185801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1148\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529849.9447807383\r\n 20\r\n190204.4331025739\r\n 30\r\n0.0\r\n 11\r\n529912.426864935\r\n 21\r\n190233.2990804276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1149\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529898.4664877692\r\n 20\r\n190218.360150213\r\n 30\r\n0.0\r\n 11\r\n529958.5477179953\r\n 21\r\n190345.4488586622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529771.7466335826\r\n 20\r\n190382.0727452485\r\n 30\r\n0.0\r\n 11\r\n530512.071249634\r\n 21\r\n190087.5854839669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530143.0337454699\r\n 20\r\n190222.0286664657\r\n 30\r\n0.0\r\n 11\r\n530272.5447482439\r\n 21\r\n190505.4522987187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529800.495504817\r\n 20\r\n190503.9870758497\r\n 30\r\n0.0\r\n 11\r\n529882.500239273\r\n 21\r\n190466.6064053712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529987.6603667819\r\n 20\r\n190106.8174279606\r\n 30\r\n0.0\r\n 11\r\n530206.9770089463\r\n 21\r\n190524.2946848936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530195.3235001076\r\n 20\r\n189991.9189582468\r\n 30\r\n0.0\r\n 11\r\n530441.7331030244\r\n 21\r\n190342.1924138142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n114F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529944.2322428545\r\n 20\r\n189687.3531936067\r\n 30\r\n0.0\r\n 11\r\n530293.1197923231\r\n 21\r\n190128.7091115361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1150\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530223.3065743222\r\n 20\r\n190107.3118171309\r\n 30\r\n0.0\r\n 11\r\n530663.2321954126\r\n 21\r\n189814.3623448716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1151\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530243.7940378211\r\n 20\r\n189737.4826935213\r\n 30\r\n0.0\r\n 11\r\n530432.9675583755\r\n 21\r\n189813.9027659494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1152\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530435.3740718211\r\n 20\r\n189782.8939022669\r\n 30\r\n0.0\r\n 11\r\n530241.1783954999\r\n 21\r\n190068.0593262615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1153\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530369.1506949899\r\n 20\r\n189995.0339388033\r\n 30\r\n0.0\r\n 11\r\n530514.4874132149\r\n 21\r\n190153.0233038265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1154\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530554.2853607679\r\n 20\r\n189986.7113306505\r\n 30\r\n0.0\r\n 11\r\n530458.5247020654\r\n 21\r\n190122.4572681574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1155\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530099.3082621901\r\n 20\r\n189602.6786171054\r\n 30\r\n0.0\r\n 11\r\n530305.7932890129\r\n 21\r\n189775.9213665038\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1156\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530037.2191561604\r\n 20\r\n190211.9721986242\r\n 30\r\n0.0\r\n 11\r\n530081.2972080702\r\n 21\r\n190195.6248661874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1157\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530048.3480312057\r\n 20\r\n190140.974318671\r\n 30\r\n0.0\r\n 11\r\n530080.9903645901\r\n 21\r\n190197.5010886054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1158\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529998.7961668124\r\n 20\r\n190141.3965531712\r\n 30\r\n0.0\r\n 11\r\n530082.6648161838\r\n 21\r\n190079.3563026345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1159\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530078.5121304261\r\n 20\r\n189745.4989626146\r\n 30\r\n0.0\r\n 11\r\n530148.8456116325\r\n 21\r\n189833.577177656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529885.3325268359\r\n 20\r\n190334.6202251309\r\n 30\r\n0.0\r\n 11\r\n529999.4182105816\r\n 21\r\n190659.536911753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530543.8561078087\r\n 20\r\n190046.7631956589\r\n 30\r\n0.0\r\n 11\r\n530885.6216848795\r\n 21\r\n189962.0778141541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530217.6887113289\r\n 20\r\n189493.3847411613\r\n 30\r\n0.0\r\n 11\r\n530635.4718868977\r\n 21\r\n190165.2105370837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530547.8292868897\r\n 20\r\n189554.7386399882\r\n 30\r\n0.0\r\n 11\r\n530729.0204895633\r\n 21\r\n189707.5601312849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530524.7775013762\r\n 20\r\n189638.8254976219\r\n 30\r\n0.0\r\n 11\r\n530596.3074582908\r\n 21\r\n189592.1909071853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n115F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530567.889837774\r\n 20\r\n189349.5276480384\r\n 30\r\n0.0\r\n 11\r\n530683.9924030411\r\n 21\r\n189331.9287256953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1160\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530605.2697539877\r\n 20\r\n189399.1033628598\r\n 30\r\n0.0\r\n 11\r\n530663.0541326525\r\n 21\r\n189305.6872696934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1161\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530504.9687196564\r\n 20\r\n189599.6951843686\r\n 30\r\n0.0\r\n 11\r\n530706.8746037114\r\n 21\r\n189455.3898307983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1162\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530415.4768326146\r\n 20\r\n189540.5554919245\r\n 30\r\n0.0\r\n 11\r\n530493.6519406615\r\n 21\r\n189633.4862080975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1163\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530404.1021717828\r\n 20\r\n189682.5253705288\r\n 30\r\n0.0\r\n 11\r\n530372.6508416777\r\n 21\r\n189565.9125719136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1164\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530372.0443083815\r\n 20\r\n189572.621277741\r\n 30\r\n0.0\r\n 11\r\n530417.6443064328\r\n 21\r\n189540.3992189759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1165\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530122.6772955924\r\n 20\r\n189800.8264032089\r\n 30\r\n0.0\r\n 11\r\n530122.6881558121\r\n 21\r\n189800.8203457863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1166\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530250.5013500226\r\n 20\r\n189729.5309445075\r\n 30\r\n0.0\r\n 11\r\n530614.0162237905\r\n 21\r\n189526.7759952493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1167\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530581.7610652955\r\n 20\r\n189592.2842723292\r\n 30\r\n0.0\r\n 11\r\n530425.8919601132\r\n 21\r\n189277.4914096943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1168\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530354.1996803542\r\n 20\r\n189347.2906557087\r\n 30\r\n0.0\r\n 11\r\n530545.8603971944\r\n 21\r\n189568.3823464327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1169\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530433.4968575933\r\n 20\r\n189630.7708719959\r\n 30\r\n0.0\r\n 11\r\n530416.4651855908\r\n 21\r\n189599.5953065837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530494.1742757037\r\n 20\r\n189430.4035020564\r\n 30\r\n0.0\r\n 11\r\n530571.7937496105\r\n 21\r\n189378.5666669773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530540.4667486668\r\n 20\r\n189394.5089099479\r\n 30\r\n0.0\r\n 11\r\n530623.8482308888\r\n 21\r\n189394.1762472761\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530544.8656291073\r\n 20\r\n189406.875027464\r\n 30\r\n0.0\r\n 11\r\n530585.145662588\r\n 21\r\n189337.5809691292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530488.9207428889\r\n 20\r\n189200.8594292581\r\n 30\r\n0.0\r\n 11\r\n530586.919627916\r\n 21\r\n189350.0798081888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530407.9016811688\r\n 20\r\n189813.1407639047\r\n 30\r\n0.0\r\n 11\r\n530656.0048411988\r\n 21\r\n189646.9975927352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n116F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529599.7443129627\r\n 20\r\n189141.9164963533\r\n 30\r\n0.0\r\n 11\r\n529073.0465794991\r\n 21\r\n189156.8615358623\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1170\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529397.9785832684\r\n 20\r\n189142.0982707312\r\n 30\r\n0.0\r\n 11\r\n529627.9073701178\r\n 21\r\n189899.0021408969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1171\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529440.8580157359\r\n 20\r\n189273.1131639067\r\n 30\r\n0.0\r\n 11\r\n529294.3072642183\r\n 21\r\n189292.6214168864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1172\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529333.1202366099\r\n 20\r\n189148.6359144085\r\n 30\r\n0.0\r\n 11\r\n529477.7302550919\r\n 21\r\n189621.470504247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1173\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529324.1287595416\r\n 20\r\n189279.3380187785\r\n 30\r\n0.0\r\n 11\r\n529260.9644783164\r\n 21\r\n189331.6005467687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1174\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529267.8552350962\r\n 20\r\n189222.8702752408\r\n 30\r\n0.0\r\n 11\r\n529322.9340814623\r\n 21\r\n189291.308197208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1175\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529285.220690443\r\n 20\r\n189230.6266191861\r\n 30\r\n0.0\r\n 11\r\n529086.5249493996\r\n 21\r\n189239.2437692679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1176\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529256.3618522856\r\n 20\r\n189111.4712087769\r\n 30\r\n0.0\r\n 11\r\n529208.0640394783\r\n 21\r\n189541.7345497636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1177\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529082.044641571\r\n 20\r\n189295.137497983\r\n 30\r\n0.0\r\n 11\r\n529265.2378484767\r\n 21\r\n189330.9158113016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1178\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529090.0583594282\r\n 20\r\n189235.0592643627\r\n 30\r\n0.0\r\n 11\r\n529082.5629886751\r\n 21\r\n189295.808256935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1179\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528792.6523966713\r\n 20\r\n189233.7003870718\r\n 30\r\n0.0\r\n 11\r\n529086.9472625145\r\n 21\r\n189275.3716972314\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528860.8155782081\r\n 20\r\n189239.6542274844\r\n 30\r\n0.0\r\n 11\r\n528852.6389035224\r\n 21\r\n189352.4857093842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528772.0540770689\r\n 20\r\n189340.5320141246\r\n 30\r\n0.0\r\n 11\r\n529635.8297696164\r\n 21\r\n189445.595253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529289.216465819\r\n 20\r\n189473.3841425907\r\n 30\r\n0.0\r\n 11\r\n529328.7527121662\r\n 21\r\n189910.7863063088\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529358.572360176\r\n 20\r\n189477.7872034763\r\n 30\r\n0.0\r\n 11\r\n529164.7094688229\r\n 21\r\n189472.6202442182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529355.5426843992\r\n 20\r\n189550.3352514977\r\n 30\r\n0.0\r\n 11\r\n529291.2728503051\r\n 21\r\n189548.0915653369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n117F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529378.5419250274\r\n 20\r\n189501.0574678744\r\n 30\r\n0.0\r\n 11\r\n529342.8949609663\r\n 21\r\n189559.9348784515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1180\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529346.1109909713\r\n 20\r\n189539.7427780762\r\n 30\r\n0.0\r\n 11\r\n529407.1643398471\r\n 21\r\n189938.3272563772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1181\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529542.725968138\r\n 20\r\n189604.5678193184\r\n 30\r\n0.0\r\n 11\r\n529145.0952981153\r\n 21\r\n189692.8941715661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1182\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529145.4339834579\r\n 20\r\n189679.5831878522\r\n 30\r\n0.0\r\n 11\r\n529183.3674982138\r\n 21\r\n189915.3729674253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1183\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528966.4009061653\r\n 20\r\n189614.3684809313\r\n 30\r\n0.0\r\n 11\r\n529158.3170448564\r\n 21\r\n189692.311265146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1184\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529033.0284363266\r\n 20\r\n189558.1300895361\r\n 30\r\n0.0\r\n 11\r\n529020.7513625082\r\n 21\r\n189642.6321203984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1185\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529598.6615891\r\n 20\r\n189783.2636048686\r\n 30\r\n0.0\r\n 11\r\n529509.7764530662\r\n 21\r\n189798.1472734654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1186\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529648.1818643421\r\n 20\r\n189846.6063273694\r\n 30\r\n0.0\r\n 11\r\n529180.7911350706\r\n 21\r\n189913.644045867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1187\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529209.7837831938\r\n 20\r\n189497.1726082335\r\n 30\r\n0.0\r\n 11\r\n529256.2925069518\r\n 21\r\n189918.6843695926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1188\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528915.0275073097\r\n 20\r\n189863.6918634366\r\n 30\r\n0.0\r\n 11\r\n529197.3740694625\r\n 21\r\n189907.0042125853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1189\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528630.6392415507\r\n 20\r\n189668.1399893563\r\n 30\r\n0.0\r\n 11\r\n528867.6389683824\r\n 21\r\n189709.7115438169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529011.1539890148\r\n 20\r\n189125.1746906123\r\n 30\r\n0.0\r\n 11\r\n528968.8246504097\r\n 21\r\n189686.1789647126\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529101.5053739744\r\n 20\r\n189840.1004521793\r\n 30\r\n0.0\r\n 11\r\n529091.814488364\r\n 21\r\n189901.7571293312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529112.1295733161\r\n 20\r\n189828.7667822493\r\n 30\r\n0.0\r\n 11\r\n529097.1151838522\r\n 21\r\n189847.5740824715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529176.2263413235\r\n 20\r\n189829.0392131988\r\n 30\r\n0.0\r\n 11\r\n529104.4020878985\r\n 21\r\n189830.8109330373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528613.6534800922\r\n 20\r\n189380.0428021393\r\n 30\r\n0.0\r\n 11\r\n528496.9060559934\r\n 21\r\n189575.3968549445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n118F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528790.8784877498\r\n 20\r\n189334.2893465018\r\n 30\r\n0.0\r\n 11\r\n528582.4828990723\r\n 21\r\n189388.0899835995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1190\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529227.5216962489\r\n 20\r\n189612.0593604654\r\n 30\r\n0.0\r\n 11\r\n529181.840168628\r\n 21\r\n189623.1637727485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1191\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529178.583755367\r\n 20\r\n189559.4320979504\r\n 30\r\n0.0\r\n 11\r\n529183.1439911666\r\n 21\r\n189624.5473949048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1192\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529219.8949335223\r\n 20\r\n189532.065108598\r\n 30\r\n0.0\r\n 11\r\n529115.6713294665\r\n 21\r\n189527.5503116321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1193\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529142.1308924119\r\n 20\r\n189378.8470075555\r\n 30\r\n0.0\r\n 11\r\n529095.5635214133\r\n 21\r\n189673.7880377656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1194\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529159.7048485519\r\n 20\r\n189748.5921076506\r\n 30\r\n0.0\r\n 11\r\n529091.1913892631\r\n 21\r\n189755.335226266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1195\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529089.0468866706\r\n 20\r\n189723.5649724518\r\n 30\r\n0.0\r\n 11\r\n529094.7548927941\r\n 21\r\n189783.3979952963\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1196\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529096.2725740104\r\n 20\r\n189728.2397774477\r\n 30\r\n0.0\r\n 11\r\n529025.1904553542\r\n 21\r\n189734.2237831711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1197\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529027.3666452278\r\n 20\r\n189731.2098929347\r\n 30\r\n0.0\r\n 11\r\n529031.2918264516\r\n 21\r\n189787.2115245815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1198\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529101.7222307826\r\n 20\r\n189777.6450789907\r\n 30\r\n0.0\r\n 11\r\n529024.5734288724\r\n 21\r\n189785.003758375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1199\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529681.4765692738\r\n 20\r\n190017.5958356645\r\n 30\r\n0.0\r\n 11\r\n529618.3122880486\r\n 21\r\n190069.8583636548\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529625.2030448283\r\n 20\r\n189961.1280921271\r\n 30\r\n0.0\r\n 11\r\n529680.2818911949\r\n 21\r\n190029.5660140943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529640.7646787354\r\n 20\r\n189969.1431576651\r\n 30\r\n0.0\r\n 11\r\n529442.068937692\r\n 21\r\n189977.7603077468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529623.2038416172\r\n 20\r\n189765.1496793769\r\n 30\r\n0.0\r\n 11\r\n529565.4118492106\r\n 21\r\n190279.9923666497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529439.3924513033\r\n 20\r\n190033.3953148692\r\n 30\r\n0.0\r\n 11\r\n529622.5856582088\r\n 21\r\n190069.1736281878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529447.4061691604\r\n 20\r\n189973.3170812488\r\n 30\r\n0.0\r\n 11\r\n529439.9107984073\r\n 21\r\n190034.0660738211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n119F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529150.0002064036\r\n 20\r\n189971.958203958\r\n 30\r\n0.0\r\n 11\r\n529444.2950722467\r\n 21\r\n190013.6295141177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529234.2783157637\r\n 20\r\n190088.9390749303\r\n 30\r\n0.0\r\n 11\r\n529879.2664644778\r\n 21\r\n190171.3895907363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529646.5642755513\r\n 20\r\n190211.6419594768\r\n 30\r\n0.0\r\n 11\r\n529670.4577492668\r\n 21\r\n190475.9831164549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529715.9201699082\r\n 20\r\n190216.0450203624\r\n 30\r\n0.0\r\n 11\r\n529522.0572785551\r\n 21\r\n190210.8780611042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529712.8904941317\r\n 20\r\n190288.5930683839\r\n 30\r\n0.0\r\n 11\r\n529648.6206600372\r\n 21\r\n190286.3493822232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529735.8897347596\r\n 20\r\n190239.3152847607\r\n 30\r\n0.0\r\n 11\r\n529700.2427706988\r\n 21\r\n190298.1926953377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529703.4588007035\r\n 20\r\n190278.0005949622\r\n 30\r\n0.0\r\n 11\r\n529764.5121495793\r\n 21\r\n190676.5850732634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529792.6337321126\r\n 20\r\n190366.5769540622\r\n 30\r\n0.0\r\n 11\r\n529502.4431078476\r\n 21\r\n190431.151988452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529502.7817931904\r\n 20\r\n190417.8410047382\r\n 30\r\n0.0\r\n 11\r\n529540.715307946\r\n 21\r\n190653.6307843117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529323.7487158978\r\n 20\r\n190352.6262978175\r\n 30\r\n0.0\r\n 11\r\n529515.6648545887\r\n 21\r\n190430.5690820322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529433.1144004612\r\n 20\r\n190090.1837804841\r\n 30\r\n0.0\r\n 11\r\n529378.0991722405\r\n 21\r\n190380.8899372845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529567.131592926\r\n 20\r\n190235.4304251197\r\n 30\r\n0.0\r\n 11\r\n529614.7390158634\r\n 21\r\n190694.1570997866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529179.290859914\r\n 20\r\n190439.6790580357\r\n 30\r\n0.0\r\n 11\r\n529539.3947473728\r\n 21\r\n190386.1536617259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529236.7986886044\r\n 20\r\n190349.5859306546\r\n 30\r\n0.0\r\n 11\r\n529269.5934678258\r\n 21\r\n190462.342439048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529297.4897753574\r\n 20\r\n190362.6856109918\r\n 30\r\n0.0\r\n 11\r\n529236.9844176113\r\n 21\r\n190454.3627758919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529368.5017987471\r\n 20\r\n189863.4325074985\r\n 30\r\n0.0\r\n 11\r\n529349.6696075257\r\n 21\r\n190181.6308220653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529385.9158724497\r\n 20\r\n190087.9554098637\r\n 30\r\n0.0\r\n 11\r\n529107.8956361627\r\n 21\r\n190262.3863000119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529190.5207611801\r\n 20\r\n190184.8997290861\r\n 30\r\n0.0\r\n 11\r\n529277.6501320874\r\n 21\r\n190327.1649891366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529266.1013483288\r\n 20\r\n190305.8058681578\r\n 30\r\n0.0\r\n 11\r\n529300.8217879958\r\n 21\r\n190381.6153221281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529279.1713942825\r\n 20\r\n190304.6038239317\r\n 30\r\n0.0\r\n 11\r\n529233.2048132479\r\n 21\r\n190370.2637131008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529121.1132686136\r\n 20\r\n190345.3750432046\r\n 30\r\n0.0\r\n 11\r\n529245.2927747905\r\n 21\r\n190366.6237795077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529192.5917265354\r\n 20\r\n189879.9855184976\r\n 30\r\n0.0\r\n 11\r\n529151.473581988\r\n 21\r\n190023.4573339458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529584.8695059813\r\n 20\r\n190350.3171773516\r\n 30\r\n0.0\r\n 11\r\n529539.1879783602\r\n 21\r\n190361.4215896345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529535.9315650991\r\n 20\r\n190297.6899148364\r\n 30\r\n0.0\r\n 11\r\n529540.4918008986\r\n 21\r\n190362.805211791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529577.2427432546\r\n 20\r\n190270.3229254841\r\n 30\r\n0.0\r\n 11\r\n529473.0191391987\r\n 21\r\n190265.8081285183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529499.4787021441\r\n 20\r\n190117.1048244416\r\n 30\r\n0.0\r\n 11\r\n529452.9113311455\r\n 21\r\n190412.0458546517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529517.0526582841\r\n 20\r\n190486.8499245364\r\n 30\r\n0.0\r\n 11\r\n529448.5391989954\r\n 21\r\n190493.5930431521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529446.3946964027\r\n 20\r\n190461.822789338\r\n 30\r\n0.0\r\n 11\r\n529452.1027025263\r\n 21\r\n190521.6558121825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529289.7172643801\r\n 20\r\n189986.7411276527\r\n 30\r\n0.0\r\n 11\r\n529280.6825980962\r\n 21\r\n190099.0930094734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529222.9041325545\r\n 20\r\n190423.7023349991\r\n 30\r\n0.0\r\n 11\r\n528709.3237252108\r\n 21\r\n190682.1166628364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529163.3485840849\r\n 20\r\n190389.3201673407\r\n 30\r\n0.0\r\n 11\r\n528959.3591667059\r\n 21\r\n190489.6088624351\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529164.681216433\r\n 20\r\n190202.4724583925\r\n 30\r\n0.0\r\n 11\r\n528995.0771133086\r\n 21\r\n190210.678909631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529136.4969689673\r\n 20\r\n190064.9659453543\r\n 30\r\n0.0\r\n 11\r\n529183.7428766971\r\n 21\r\n191350.1385539917\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529075.492698009\r\n 20\r\n190279.8947185111\r\n 30\r\n0.0\r\n 11\r\n528649.9905491098\r\n 21\r\n190388.6682855325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529082.2046651557\r\n 20\r\n190349.065351906\r\n 30\r\n0.0\r\n 11\r\n529056.3943639352\r\n 21\r\n190156.8588315621\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529010.1017019967\r\n 20\r\n190357.6421176554\r\n 30\r\n0.0\r\n 11\r\n529002.0689515459\r\n 21\r\n190293.8367838478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529062.4162329431\r\n 20\r\n190372.4898407178\r\n 30\r\n0.0\r\n 11\r\n528998.6082292791\r\n 21\r\n190346.6868526846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529019.0547880857\r\n 20\r\n190346.6421365833\r\n 30\r\n0.0\r\n 11\r\n528635.3045711425\r\n 21\r\n190470.4680981078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528986.4090745275\r\n 20\r\n190551.0779274919\r\n 30\r\n0.0\r\n 11\r\n528835.8111172078\r\n 21\r\n190172.6179566959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528849.0058062867\r\n 20\r\n190170.8298920155\r\n 30\r\n0.0\r\n 11\r\n528622.2811080334\r\n 21\r\n190245.8744314231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528884.8396085598\r\n 20\r\n189983.6889307637\r\n 30\r\n0.0\r\n 11\r\n528838.4947543224\r\n 21\r\n190185.5776040143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528950.9821621563\r\n 20\r\n190040.4969147609\r\n 30\r\n0.0\r\n 11\r\n528865.6036683856\r\n 21\r\n190041.8506366036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528818.9183331026\r\n 20\r\n190634.7907043113\r\n 30\r\n0.0\r\n 11\r\n528790.0524771059\r\n 21\r\n190549.4159225766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528764.2819378928\r\n 20\r\n190693.7773339177\r\n 30\r\n0.0\r\n 11\r\n528623.5771128351\r\n 21\r\n190243.0553556253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529039.3431507226\r\n 20\r\n190205.2713146913\r\n 30\r\n0.0\r\n 11\r\n528630.6398575692\r\n 21\r\n190318.3944534166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528662.360593598\r\n 20\r\n189841.5344313142\r\n 30\r\n0.0\r\n 11\r\n528634.4480423454\r\n 21\r\n190324.238339472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528642.1873241249\r\n 20\r\n189641.292104649\r\n 30\r\n0.0\r\n 11\r\n528650.3809379063\r\n 21\r\n190127.5994357825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528753.425410089\r\n 20\r\n189824.8044275578\r\n 30\r\n0.0\r\n 11\r\n528647.3405610826\r\n 21\r\n189875.1584992957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528750.170429287\r\n 20\r\n189886.8077721141\r\n 30\r\n0.0\r\n 11\r\n528650.0186687917\r\n 21\r\n189841.694295748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528752.8755982489\r\n 20\r\n190076.7971426593\r\n 30\r\n0.0\r\n 11\r\n528731.887199553\r\n 21\r\n189875.8824381668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528947.1272669612\r\n 20\r\n189980.1131455051\r\n 30\r\n0.0\r\n 11\r\n528650.2833384174\r\n 21\r\n190029.2173010918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528942.591557104\r\n 20\r\n189876.9953841607\r\n 30\r\n0.0\r\n 11\r\n529048.8655200789\r\n 21\r\n189768.3325097931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529284.0550368516\r\n 20\r\n190057.307597568\r\n 30\r\n0.0\r\n 11\r\n529284.0426462572\r\n 21\r\n190057.3086510901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529069.2172349707\r\n 20\r\n189964.3602476667\r\n 30\r\n0.0\r\n 11\r\n528814.3343133004\r\n 21\r\n189997.5317432476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528805.6839475577\r\n 20\r\n190007.3399509129\r\n 30\r\n0.0\r\n 11\r\n528803.8150157145\r\n 21\r\n189983.1271099848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528683.5378083801\r\n 20\r\n190153.0575385689\r\n 30\r\n0.0\r\n 11\r\n528638.2227412406\r\n 21\r\n190152.2317883801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528696.420491177\r\n 20\r\n190161.7386773015\r\n 30\r\n0.0\r\n 11\r\n528675.4597844933\r\n 21\r\n190149.9151749459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528706.3716819392\r\n 20\r\n190225.0588454159\r\n 30\r\n0.0\r\n 11\r\n528693.1703564675\r\n 21\r\n190154.4359923367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528877.7138260937\r\n 20\r\n190033.7914588225\r\n 30\r\n0.0\r\n 11\r\n528830.8379358486\r\n 21\r\n189685.6645060741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528920.0980527489\r\n 20\r\n189798.5942733324\r\n 30\r\n0.0\r\n 11\r\n528894.1033295456\r\n 21\r\n189993.8972962386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529224.660609378\r\n 20\r\n190237.173797853\r\n 30\r\n0.0\r\n 11\r\n528810.2420405034\r\n 21\r\n189672.5104535883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528859.7685753607\r\n 20\r\n189850.6117725274\r\n 30\r\n0.0\r\n 11\r\n528766.4324096041\r\n 21\r\n189851.0593911296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528801.3176274221\r\n 20\r\n189846.7515289162\r\n 30\r\n0.0\r\n 11\r\n528732.0141848773\r\n 21\r\n189893.1154706532\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528804.5882927735\r\n 20\r\n189859.4626956493\r\n 30\r\n0.0\r\n 11\r\n528732.4391360198\r\n 21\r\n189824.5535736687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528735.7271808159\r\n 20\r\n189657.3973491444\r\n 30\r\n0.0\r\n 11\r\n528737.95990904\r\n 21\r\n189835.9065026335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528928.7545163261\r\n 20\r\n190241.1008184592\r\n 30\r\n0.0\r\n 11\r\n528910.5083181793\r\n 21\r\n190197.7743116633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528972.9053949298\r\n 20\r\n190184.3976374539\r\n 30\r\n0.0\r\n 11\r\n528909.3502903563\r\n 21\r\n190199.2820699479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529145.3677672739\r\n 20\r\n190119.6171140234\r\n 30\r\n0.0\r\n 11\r\n528846.7750420871\r\n 21\r\n190120.6734324097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528783.1552386387\r\n 20\r\n190195.9215508423\r\n 30\r\n0.0\r\n 11\r\n528744.2071778071\r\n 21\r\n190033.8158718843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528943.273818483\r\n 20\r\n190435.7833200833\r\n 30\r\n0.0\r\n 11\r\n528696.4510643113\r\n 21\r\n190531.1367562146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528976.0769089332\r\n 20\r\n189434.0576018465\r\n 30\r\n0.0\r\n 11\r\n529140.8150301299\r\n 21\r\n189457.1353655681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528884.5132737517\r\n 20\r\n189395.1880814658\r\n 30\r\n0.0\r\n 11\r\n528971.8021976204\r\n 21\r\n189232.6095664005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528963.8167557576\r\n 20\r\n190199.7062129303\r\n 30\r\n0.0\r\n 11\r\n528942.2151172271\r\n 21\r\n190084.5386704732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529538.7347799715\r\n 20\r\n189605.4543884852\r\n 30\r\n0.0\r\n 11\r\n529721.0447377914\r\n 21\r\n189683.0898924534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532093.4400750394\r\n 20\r\n190602.6288740622\r\n 30\r\n0.0\r\n 11\r\n532537.709917907\r\n 21\r\n190944.7038226986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532113.3938232591\r\n 20\r\n190608.2493097254\r\n 30\r\n0.0\r\n 11\r\n531485.2645507479\r\n 21\r\n191089.1072229474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532002.1664151241\r\n 20\r\n190689.6864734899\r\n 30\r\n0.0\r\n 11\r\n532109.8523286888\r\n 21\r\n190790.9852332279\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532093.3699689512\r\n 20\r\n190762.8054165837\r\n 30\r\n0.0\r\n 11\r\n532114.2129493946\r\n 21\r\n190842.0939303852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532172.0125192354\r\n 20\r\n190749.7415389612\r\n 30\r\n0.0\r\n 11\r\n532087.3610531503\r\n 21\r\n190773.2268060422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532153.3819682775\r\n 20\r\n190745.9176035789\r\n 30\r\n0.0\r\n 11\r\n532309.7817934577\r\n 21\r\n190868.7725891024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532246.303823139\r\n 20\r\n190665.9402739241\r\n 30\r\n0.0\r\n 11\r\n532034.6666925351\r\n 21\r\n191043.6557042007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532280.8315229687\r\n 20\r\n190916.7940833162\r\n 30\r\n0.0\r\n 11\r\n532111.1404321221\r\n 21\r\n190839.0459486273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532309.3510573484\r\n 20\r\n190863.3127782874\r\n 30\r\n0.0\r\n 11\r\n532280.0193059137\r\n 21\r\n190917.0367863198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532551.761731845\r\n 20\r\n191035.6183734401\r\n 30\r\n0.0\r\n 11\r\n532288.373456142\r\n 21\r\n190897.8773760057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532492.9131191679\r\n 20\r\n191000.7112349314\r\n 30\r\n0.0\r\n 11\r\n532433.7669462679\r\n 21\r\n191097.1453136996\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532506.2055003433\r\n 20\r\n191134.4207877858\r\n 30\r\n0.0\r\n 11\r\n531880.4091661065\r\n 21\r\n190762.0070556545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532008.590213593\r\n 20\r\n190940.8086735789\r\n 30\r\n0.0\r\n 11\r\n531721.4325374245\r\n 21\r\n191273.1100979186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531949.6768366249\r\n 20\r\n190903.9462124372\r\n 30\r\n0.0\r\n 11\r\n532110.1875119865\r\n 21\r\n191012.7848140758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531909.8373502772\r\n 20\r\n190964.652172067\r\n 30\r\n0.0\r\n 11\r\n531963.3596391908\r\n 21\r\n191000.303403344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531919.8848989398\r\n 20\r\n190911.2076981324\r\n 30\r\n0.0\r\n 11\r\n531914.5153158007\r\n 21\r\n190979.8256484073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531923.6760320993\r\n 20\r\n190961.5460137429\r\n 30\r\n0.0\r\n 11\r\n531641.6710148187\r\n 21\r\n191249.7651456203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531726.1444548365\r\n 20\r\n190899.5701216376\r\n 30\r\n0.0\r\n 11\r\n531997.6865254563\r\n 21\r\n191203.1761132243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532005.1726544908\r\n 20\r\n191192.1645344424\r\n 30\r\n0.0\r\n 11\r\n531836.8719324415\r\n 21\r\n191361.6066739787\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532188.6475604557\r\n 20\r\n191243.5723124995\r\n 30\r\n0.0\r\n 11\r\n531987.2848003661\r\n 21\r\n191194.9932969649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532167.309190774\r\n 20\r\n191159.034401351\r\n 30\r\n0.0\r\n 11\r\n532128.0124170939\r\n 21\r\n191234.8439214637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531630.7610581088\r\n 20\r\n190956.806285408\r\n 30\r\n0.0\r\n 11\r\n531694.2947849448\r\n 21\r\n191020.7246439053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n11FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531499.3437770261\r\n 20\r\n191034.7183290566\r\n 30\r\n0.0\r\n 11\r\n531839.9731081884\r\n 21\r\n191361.7042741094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1200\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532059.2524323825\r\n 20\r\n191006.4499849154\r\n 30\r\n0.0\r\n 11\r\n531775.6954554155\r\n 21\r\n191321.7762717404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1201\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532216.6329280467\r\n 20\r\n191506.1016118414\r\n 30\r\n0.0\r\n 11\r\n531772.1639381984\r\n 21\r\n191315.7611523182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1202\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532441.2418068305\r\n 20\r\n191623.2923990452\r\n 30\r\n0.0\r\n 11\r\n531955.262167516\r\n 21\r\n191389.2169487265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1203\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532272.2279328401\r\n 20\r\n191432.061830168\r\n 30\r\n0.0\r\n 11\r\n532179.8394744348\r\n 21\r\n191504.5456247899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1204\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532215.2832434994\r\n 20\r\n191407.3168914513\r\n 30\r\n0.0\r\n 11\r\n532210.9844278584\r\n 21\r\n191517.0762694753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1205\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532046.4502892583\r\n 20\r\n191320.1462976625\r\n 30\r\n0.0\r\n 11\r\n532216.905681068\r\n 21\r\n191428.5538193766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1206\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532239.1193936134\r\n 20\r\n191161.2838040338\r\n 30\r\n0.0\r\n 11\r\n532043.2702144016\r\n 21\r\n191433.1900954792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1207\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532166.2017047998\r\n 20\r\n191102.635575774\r\n 30\r\n0.0\r\n 11\r\n532256.0616277937\r\n 21\r\n191184.3219257113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1208\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532308.5036839469\r\n 20\r\n191096.7215187221\r\n 30\r\n0.0\r\n 11\r\n532193.1847684965\r\n 21\r\n191060.8149913824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1209\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532199.9118185815\r\n 20\r\n191060.4665467347\r\n 30\r\n0.0\r\n 11\r\n532165.9623074486\r\n 21\r\n191104.7954491255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n120A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532437.5252889657\r\n 20\r\n190820.0474854079\r\n 30\r\n0.0\r\n 11\r\n532144.8076645989\r\n 21\r\n191300.4993153043\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n120B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532132.1706507358\r\n 20\r\n191303.8661603718\r\n 30\r\n0.0\r\n 11\r\n532153.0073547956\r\n 21\r\n191316.3395855612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n120C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531947.2677219202\r\n 20\r\n191348.1854742621\r\n 30\r\n0.0\r\n 11\r\n531927.7928531354\r\n 21\r\n191389.1106090703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n120D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531945.2447811827\r\n 20\r\n191332.7830914429\r\n 30\r\n0.0\r\n 11\r\n531946.4767204593\r\n 21\r\n191356.8169999523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n120E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531893.0124814265\r\n 20\r\n191295.6312846257\r\n 30\r\n0.0\r\n 11\r\n531950.3308491905\r\n 21\r\n191338.9494919771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n120F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532140.6273829715\r\n 20\r\n191227.6003793653\r\n 30\r\n0.0\r\n 11\r\n532496.6227987491\r\n 21\r\n191476.4468156583\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1210\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532486.9862212213\r\n 20\r\n191446.1845371221\r\n 30\r\n0.0\r\n 11\r\n532344.3388213688\r\n 21\r\n191588.191690398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1211\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532494.5521203357\r\n 20\r\n191118.373106616\r\n 30\r\n0.0\r\n 11\r\n532476.0061814613\r\n 21\r\n191480.6445697622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1212\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532555.6789127965\r\n 20\r\n191365.8405141135\r\n 30\r\n0.0\r\n 11\r\n532183.6434305776\r\n 21\r\n191230.7276273598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1213\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532250.7242278104\r\n 20\r\n191121.100715535\r\n 30\r\n0.0\r\n 11\r\n532280.8983750848\r\n 21\r\n191139.8494372576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1214\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532296.5674822263\r\n 20\r\n191325.3731513396\r\n 30\r\n0.0\r\n 11\r\n532254.5319497042\r\n 21\r\n191408.7089432071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1215\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532273.9488858729\r\n 20\r\n191379.4084536399\r\n 30\r\n0.0\r\n 11\r\n532201.5388367442\r\n 21\r\n191420.752945741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1216\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532264.031408359\r\n 20\r\n191370.8110905958\r\n 30\r\n0.0\r\n 11\r\n532263.0909969975\r\n 21\r\n191450.9563539879\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1217\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532414.1618065546\r\n 20\r\n191522.577755367\r\n 30\r\n0.0\r\n 11\r\n532255.3928528242\r\n 21\r\n191440.9510300498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1218\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532685.3559009919\r\n 20\r\n191001.6618268656\r\n 30\r\n0.0\r\n 11\r\n532521.9230479188\r\n 21\r\n190934.6835698601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1219\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532584.1101927998\r\n 20\r\n190947.9789637227\r\n 30\r\n0.0\r\n 11\r\n532480.0379977193\r\n 21\r\n191189.8628189787\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n121A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531977.8543738964\r\n 20\r\n191089.4436923433\r\n 30\r\n0.0\r\n 11\r\n532008.4922394006\r\n 21\r\n191125.1008253645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n121B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532048.2980711977\r\n 20\r\n191075.2227103755\r\n 30\r\n0.0\r\n 11\r\n532006.6262351963\r\n 21\r\n191125.4646821949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n121C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532030.6930418108\r\n 20\r\n191028.9017811203\r\n 30\r\n0.0\r\n 11\r\n532117.998770022\r\n 21\r\n191086.0039076615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n121D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532183.2074847922\r\n 20\r\n190949.7665976741\r\n 30\r\n0.0\r\n 11\r\n532049.0673803575\r\n 21\r\n191216.5345937405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n121E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531953.3414468827\r\n 20\r\n191239.9077488307\r\n 30\r\n0.0\r\n 11\r\n532005.0713700226\r\n 21\r\n191285.334379834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n121F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532025.3380024663\r\n 20\r\n191260.7740148495\r\n 30\r\n0.0\r\n 11\r\n531985.8136504054\r\n 21\r\n191306.0553305413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1220\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532016.7419589933\r\n 20\r\n191260.358809006\r\n 30\r\n0.0\r\n 11\r\n532071.0013293279\r\n 21\r\n191306.6664395658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1221\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532070.9906705489\r\n 20\r\n191302.9490179977\r\n 30\r\n0.0\r\n 11\r\n532035.1487030354\r\n 21\r\n191346.1571556514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1222\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531983.5076242133\r\n 20\r\n191297.3190791788\r\n 30\r\n0.0\r\n 11\r\n532041.8941492539\r\n 21\r\n191348.2808441813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1223\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532429.633362168\r\n 20\r\n190966.1629744953\r\n 30\r\n0.0\r\n 11\r\n532371.4638803732\r\n 21\r\n191062.7076891677\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1224\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531810.0910753604\r\n 20\r\n190989.6060128932\r\n 30\r\n0.0\r\n 11\r\n531614.6487416758\r\n 21\r\n191167.9765372598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1225\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531796.2678138876\r\n 20\r\n190690.6548548851\r\n 30\r\n0.0\r\n 11\r\n530764.4896246664\r\n 21\r\n191480.5220505232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1226\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531281.3914890426\r\n 20\r\n191081.1013010658\r\n 30\r\n0.0\r\n 11\r\n531389.0774026074\r\n 21\r\n191182.4000608037\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1227\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531441.4991432304\r\n 20\r\n191042.7926367183\r\n 30\r\n0.0\r\n 11\r\n531048.3177917206\r\n 21\r\n191342.6143030769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1228\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531372.5950428699\r\n 20\r\n191154.2202441596\r\n 30\r\n0.0\r\n 11\r\n531393.4380233133\r\n 21\r\n191233.5087579612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1229\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531451.2375931538\r\n 20\r\n191141.1563665371\r\n 30\r\n0.0\r\n 11\r\n531366.5861270688\r\n 21\r\n191164.6416336182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531433.92164784\r\n 20\r\n191138.5943822833\r\n 30\r\n0.0\r\n 11\r\n531590.3214730201\r\n 21\r\n191261.4493678067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531567.1316283411\r\n 20\r\n190983.1054010685\r\n 30\r\n0.0\r\n 11\r\n531313.8917664535\r\n 21\r\n191435.0705317762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531560.0565968872\r\n 20\r\n191308.2089108923\r\n 30\r\n0.0\r\n 11\r\n531390.3655060405\r\n 21\r\n191230.4607762033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531588.5761312669\r\n 20\r\n191254.7276058633\r\n 30\r\n0.0\r\n 11\r\n531559.2443798324\r\n 21\r\n191308.4516138957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531830.9868057637\r\n 20\r\n191427.0332010161\r\n 30\r\n0.0\r\n 11\r\n531567.5985300605\r\n 21\r\n191289.2922035817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n122F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531772.1381930866\r\n 20\r\n191392.1260625073\r\n 30\r\n0.0\r\n 11\r\n531712.9920201865\r\n 21\r\n191488.5601412755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1230\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531785.4305742621\r\n 20\r\n191525.8356153619\r\n 30\r\n0.0\r\n 11\r\n531122.2336288609\r\n 21\r\n191163.8391900123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1231\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531287.8152875113\r\n 20\r\n191332.2235011548\r\n 30\r\n0.0\r\n 11\r\n531000.6576113431\r\n 21\r\n191664.5249254946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1232\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531228.9019105434\r\n 20\r\n191295.3610400128\r\n 30\r\n0.0\r\n 11\r\n531389.412585905\r\n 21\r\n191404.1996416514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1233\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531189.0624241958\r\n 20\r\n191356.0669996431\r\n 30\r\n0.0\r\n 11\r\n531242.5847131093\r\n 21\r\n191391.7182309199\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1234\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531199.1099728586\r\n 20\r\n191302.6225257084\r\n 30\r\n0.0\r\n 11\r\n531193.7403897194\r\n 21\r\n191371.2404759832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1235\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531202.901106018\r\n 20\r\n191352.9608413188\r\n 30\r\n0.0\r\n 11\r\n530920.8960887374\r\n 21\r\n191641.1799731962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1236\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530791.3001046506\r\n 20\r\n191134.8743590273\r\n 30\r\n0.0\r\n 11\r\n531243.4633766599\r\n 21\r\n191657.8057239712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1237\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531284.3977284094\r\n 20\r\n191583.5793620181\r\n 30\r\n0.0\r\n 11\r\n531116.0970063601\r\n 21\r\n191753.0215015545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1238\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531467.8726343744\r\n 20\r\n191634.9871400754\r\n 30\r\n0.0\r\n 11\r\n531266.5098742847\r\n 21\r\n191586.4081245408\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1239\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531446.5342646923\r\n 20\r\n191550.4492289268\r\n 30\r\n0.0\r\n 11\r\n531407.2374910125\r\n 21\r\n191626.2587490396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530855.7335500447\r\n 20\r\n191403.5462717947\r\n 30\r\n0.0\r\n 11\r\n530919.2672768807\r\n 21\r\n191467.4646302917\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530778.5688509447\r\n 20\r\n191426.1331566325\r\n 30\r\n0.0\r\n 11\r\n531119.1981821072\r\n 21\r\n191753.1191016854\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531338.4775063013\r\n 20\r\n191397.8648124914\r\n 30\r\n0.0\r\n 11\r\n531054.9205293343\r\n 21\r\n191713.1910993164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531377.5029102171\r\n 20\r\n191845.5685987614\r\n 30\r\n0.0\r\n 11\r\n531051.3890121169\r\n 21\r\n191707.1759798942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531518.344467532\r\n 20\r\n191552.6986316098\r\n 30\r\n0.0\r\n 11\r\n531322.4952883203\r\n 21\r\n191824.604923055\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n123F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531445.4267787183\r\n 20\r\n191494.0504033497\r\n 30\r\n0.0\r\n 11\r\n531535.2867017123\r\n 21\r\n191575.7367532872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1240\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531587.7287578654\r\n 20\r\n191488.136346298\r\n 30\r\n0.0\r\n 11\r\n531472.4098424151\r\n 21\r\n191452.2298189583\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1241\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531479.1368925001\r\n 20\r\n191451.8813743105\r\n 30\r\n0.0\r\n 11\r\n531445.1873813673\r\n 21\r\n191496.2102767015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1242\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531716.7503628843\r\n 20\r\n191211.4623129839\r\n 30\r\n0.0\r\n 11\r\n531424.0327385175\r\n 21\r\n191691.9141428803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1243\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531411.3957246545\r\n 20\r\n191695.2809879477\r\n 30\r\n0.0\r\n 11\r\n531432.2324287142\r\n 21\r\n191707.7544131372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1244\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531226.4927958389\r\n 20\r\n191739.600301838\r\n 30\r\n0.0\r\n 11\r\n531207.017927054\r\n 21\r\n191780.5254366461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1245\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531224.4698551012\r\n 20\r\n191724.1979190188\r\n 30\r\n0.0\r\n 11\r\n531225.7017943778\r\n 21\r\n191748.2318275282\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1246\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531172.2375553451\r\n 20\r\n191687.0461122015\r\n 30\r\n0.0\r\n 11\r\n531229.5559231091\r\n 21\r\n191730.3643195529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1247\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531419.8524568902\r\n 20\r\n191619.0152069412\r\n 30\r\n0.0\r\n 11\r\n531707.0201414058\r\n 21\r\n191827.7939637002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1248\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531773.7771942542\r\n 20\r\n191509.787934192\r\n 30\r\n0.0\r\n 11\r\n531767.8126675716\r\n 21\r\n191713.7268288893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1249\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531797.7271904702\r\n 20\r\n191705.2143525404\r\n 30\r\n0.0\r\n 11\r\n531462.8685044961\r\n 21\r\n191622.1424549358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531529.949301729\r\n 20\r\n191512.5155431109\r\n 30\r\n0.0\r\n 11\r\n531560.1234490032\r\n 21\r\n191531.2642648336\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531850.0114793597\r\n 20\r\n191327.4788226467\r\n 30\r\n0.0\r\n 11\r\n531759.2630716378\r\n 21\r\n191581.2776465546\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531257.0794478149\r\n 20\r\n191480.858519919\r\n 30\r\n0.0\r\n 11\r\n531287.7173133191\r\n 21\r\n191516.5156529402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531327.5231451162\r\n 20\r\n191466.6375379514\r\n 30\r\n0.0\r\n 11\r\n531285.8513091147\r\n 21\r\n191516.8795097707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531309.9181157294\r\n 20\r\n191420.3166086959\r\n 30\r\n0.0\r\n 11\r\n531397.2238439407\r\n 21\r\n191477.4187352375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n124F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531462.4325587107\r\n 20\r\n191341.18142525\r\n 30\r\n0.0\r\n 11\r\n531328.292454276\r\n 21\r\n191607.9494213166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1250\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531708.8584360867\r\n 20\r\n191357.5778020711\r\n 30\r\n0.0\r\n 11\r\n531650.6889542918\r\n 21\r\n191454.1225167437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1251\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531059.8805382769\r\n 20\r\n191405.2619729084\r\n 30\r\n0.0\r\n 11\r\n530893.8738155942\r\n 21\r\n191559.3913648357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1252\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531695.8206200191\r\n 20\r\n191746.0086272095\r\n 30\r\n0.0\r\n 11\r\n531828.8253042691\r\n 21\r\n191851.5673862307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1253\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531993.615337301\r\n 20\r\n191400.533692721\r\n 30\r\n0.0\r\n 11\r\n531530.5044200901\r\n 21\r\n191997.5260534049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1254\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531723.1362172004\r\n 20\r\n191860.9114397561\r\n 30\r\n0.0\r\n 11\r\n532005.3993839649\r\n 21\r\n192197.3802678644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1255\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531677.3517133629\r\n 20\r\n191913.1934274341\r\n 30\r\n0.0\r\n 11\r\n531810.391053535\r\n 21\r\n191772.0904434886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1256\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531730.9286674994\r\n 20\r\n191962.2026938285\r\n 30\r\n0.0\r\n 11\r\n531774.6578365174\r\n 21\r\n191915.0496930851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1257\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531679.7700162902\r\n 20\r\n191943.7620475613\r\n 30\r\n0.0\r\n 11\r\n531746.6539128269\r\n 21\r\n191960.0039657696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1258\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531730.0688062759\r\n 20\r\n191948.045788348\r\n 30\r\n0.0\r\n 11\r\n531969.6352427643\r\n 21\r\n192272.3990221221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1259\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531637.389696535\r\n 20\r\n192133.1682284677\r\n 30\r\n0.0\r\n 11\r\n531980.4084138274\r\n 21\r\n191913.5097348211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531970.7313669026\r\n 20\r\n191904.3636013212\r\n 30\r\n0.0\r\n 11\r\n532111.1703995337\r\n 21\r\n192097.5284268109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532050.7362527369\r\n 20\r\n191731.4329244408\r\n 30\r\n0.0\r\n 11\r\n531970.6717466338\r\n 21\r\n191922.4736446127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531963.8775272967\r\n 20\r\n191739.018849366\r\n 30\r\n0.0\r\n 11\r\n532032.4513453455\r\n 21\r\n191789.9005871466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531734.6458126212\r\n 20\r\n192378.6164578516\r\n 30\r\n0.0\r\n 11\r\n532111.7612289476\r\n 21\r\n192094.4824889581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531796.0157464022\r\n 20\r\n191821.3637926705\r\n 30\r\n0.0\r\n 11\r\n532062.0950777154\r\n 21\r\n192151.5713271051\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n125F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532314.3690415566\r\n 20\r\n191745.6655092834\r\n 30\r\n0.0\r\n 11\r\n532055.593819006\r\n 21\r\n192154.0985609112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1260\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532444.3084072207\r\n 20\r\n191573.5378326324\r\n 30\r\n0.0\r\n 11\r\n532157.3045856129\r\n 21\r\n191985.0552659795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1261\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532250.1410495512\r\n 20\r\n191678.9762382483\r\n 30\r\n0.0\r\n 11\r\n532306.9662988436\r\n 21\r\n191781.7401364429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1262\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532216.6329438502\r\n 20\r\n191731.2468465146\r\n 30\r\n0.0\r\n 11\r\n532324.3026469366\r\n 21\r\n191752.9916370946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1263\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532103.6574210093\r\n 20\r\n191884.0205683982\r\n 30\r\n0.0\r\n 11\r\n532237.8568669417\r\n 21\r\n191733.0313632459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1264\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532002.2175019509\r\n 20\r\n191692.209596541\r\n 30\r\n0.0\r\n 11\r\n532214.7479054014\r\n 21\r\n191905.1846270458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1265\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532018.0713449173\r\n 20\r\n191602.3928622941\r\n 30\r\n0.0\r\n 11\r\n531958.0747517411\r\n 21\r\n191707.9763569033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1266\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531880.9878547196\r\n 20\r\n191641.0315224062\r\n 30\r\n0.0\r\n 11\r\n531979.4193661846\r\n 21\r\n191571.0388905303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1267\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531972.917590081\r\n 20\r\n191572.800004955\r\n 30\r\n0.0\r\n 11\r\n532018.9706419868\r\n 21\r\n191604.3711516482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1268\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531672.3130915669\r\n 20\r\n191418.2088608678\r\n 30\r\n0.0\r\n 11\r\n531672.3225436441\r\n 21\r\n191418.2169413986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1269\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531783.5634071171\r\n 20\r\n191513.3161613891\r\n 30\r\n0.0\r\n 11\r\n532099.9447376423\r\n 21\r\n191783.7888709074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532101.2535546515\r\n 20\r\n191796.8010484009\r\n 30\r\n0.0\r\n 11\r\n532116.8897799552\r\n 21\r\n191778.2197935914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532115.5233552441\r\n 20\r\n191986.4050237265\r\n 30\r\n0.0\r\n 11\r\n532152.8196642743\r\n 21\r\n192012.1561888647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532099.995471847\r\n 20\r\n191985.9461959419\r\n 30\r\n0.0\r\n 11\r\n532123.9183272432\r\n 21\r\n191988.5621895042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532054.9906121824\r\n 20\r\n192031.5864467543\r\n 30\r\n0.0\r\n 11\r\n532106.893947073\r\n 21\r\n191981.9084214466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532027.3119133144\r\n 20\r\n191776.2920418672\r\n 30\r\n0.0\r\n 11\r\n532268.3784369255\r\n 21\r\n191520.7990761905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n126F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532178.0254453258\r\n 20\r\n191477.8100702677\r\n 30\r\n0.0\r\n 11\r\n532037.2579981849\r\n 21\r\n191734.3249663507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1270\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531939.7295620738\r\n 20\r\n191650.6225332717\r\n 30\r\n0.0\r\n 11\r\n531963.0496409979\r\n 21\r\n191623.823883139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1271\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532148.6982256789\r\n 20\r\n191637.9367287575\r\n 30\r\n0.0\r\n 11\r\n532224.2653350659\r\n 21\r\n191692.7222394283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1272\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532198.4357110942\r\n 20\r\n191668.8817984812\r\n 30\r\n0.0\r\n 11\r\n532227.7055748605\r\n 21\r\n191746.9577699262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1273\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532188.3670132983\r\n 20\r\n191677.3015571623\r\n 30\r\n0.0\r\n 11\r\n532267.336970273\r\n 21\r\n191691.0089826361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1274\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532362.1300852291\r\n 20\r\n191553.2908647549\r\n 30\r\n0.0\r\n 11\r\n532256.2321941641\r\n 21\r\n191697.0133042788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1275\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531864.9688504661\r\n 20\r\n191914.9536897637\r\n 30\r\n0.0\r\n 11\r\n531905.0549577436\r\n 21\r\n191890.3932756532\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1276\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531862.1619532432\r\n 20\r\n191843.1437172973\r\n 30\r\n0.0\r\n 11\r\n531905.1166278249\r\n 21\r\n191892.2934230909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1277\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531813.6265465071\r\n 20\r\n191853.1377074801\r\n 30\r\n0.0\r\n 11\r\n531883.9188933896\r\n 21\r\n191776.0537986287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1278\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531759.8220053184\r\n 20\r\n191689.9565078141\r\n 30\r\n0.0\r\n 11\r\n532001.7885916345\r\n 21\r\n191864.9162244624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1279\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532009.5993555495\r\n 20\r\n191963.144278935\r\n 30\r\n0.0\r\n 11\r\n532062.6930700728\r\n 21\r\n191919.319386117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532041.6784095048\r\n 20\r\n191895.395925665\r\n 30\r\n0.0\r\n 11\r\n532080.0783065855\r\n 21\r\n191941.6346525161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532039.8978890943\r\n 20\r\n191903.8157894616\r\n 30\r\n0.0\r\n 11\r\n532094.2646485485\r\n 21\r\n191857.6342846829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532090.5930872497\r\n 20\r\n191857.0520696418\r\n 30\r\n0.0\r\n 11\r\n532127.5334808851\r\n 21\r\n191899.3249582679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532071.0861322011\r\n 20\r\n191942.51819341\r\n 30\r\n0.0\r\n 11\r\n532130.7055510295\r\n 21\r\n191893.0044307067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531739.658856651\r\n 20\r\n192064.6516925016\r\n 30\r\n0.0\r\n 11\r\n531884.5843560669\r\n 21\r\n192286.0345043412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n127F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531726.566720581\r\n 20\r\n190667.1991249742\r\n 30\r\n0.0\r\n 11\r\n531616.5188179025\r\n 21\r\n190751.1164965218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1280\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531689.9179736658\r\n 20\r\n190522.9069805326\r\n 30\r\n0.0\r\n 11\r\n531293.4720857064\r\n 21\r\n190711.8895869297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1281\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531647.4488907804\r\n 20\r\n190599.3061460694\r\n 30\r\n0.0\r\n 11\r\n531294.8772940742\r\n 21\r\n190794.98539113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1282\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531654.9420515791\r\n 20\r\n190806.1964255886\r\n 30\r\n0.0\r\n 11\r\n531464.5204324898\r\n 21\r\n190511.2376294206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1283\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531506.7950860217\r\n 20\r\n190920.7104162707\r\n 30\r\n0.0\r\n 11\r\n531461.9685388102\r\n 21\r\n190842.5268395827\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1284\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531464.5931598749\r\n 20\r\n190989.1469239503\r\n 30\r\n0.0\r\n 11\r\n531239.4060213708\r\n 21\r\n190574.130174695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1285\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531640.0236801546\r\n 20\r\n190456.680085379\r\n 30\r\n0.0\r\n 11\r\n531260.9006169267\r\n 21\r\n190646.6825308323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1286\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531212.7647778893\r\n 20\r\n190266.6331710364\r\n 30\r\n0.0\r\n 11\r\n531265.7667397293\r\n 21\r\n190651.6799426009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1287\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531538.4481888635\r\n 20\r\n190513.2134292297\r\n 30\r\n0.0\r\n 11\r\n531512.1700264695\r\n 21\r\n190474.2317909991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1288\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531570.8038671595\r\n 20\r\n190449.0444265913\r\n 30\r\n0.0\r\n 11\r\n531511.32533623\r\n 21\r\n190475.9349826742\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1289\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531532.3049148279\r\n 20\r\n190937.4342044066\r\n 30\r\n0.0\r\n 11\r\n531029.4371592352\r\n 21\r\n191062.0412965392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n128A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531174.0280454086\r\n 20\r\n190565.5079602962\r\n 30\r\n0.0\r\n 11\r\n531255.8981468314\r\n 21\r\n190942.1803400939\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n128B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531066.6923456027\r\n 20\r\n190583.2937652071\r\n 30\r\n0.0\r\n 11\r\n531240.2799829301\r\n 21\r\n191318.6432960578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n128C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531121.7169474838\r\n 20\r\n191114.404787088\r\n 30\r\n0.0\r\n 11\r\n530725.2710595243\r\n 21\r\n191303.3873934849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n128D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531141.6748513727\r\n 20\r\n191180.9728657711\r\n 30\r\n0.0\r\n 11\r\n531079.1927368576\r\n 21\r\n190997.3822792003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n128E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531072.5902794654\r\n 20\r\n191203.3272866175\r\n 30\r\n0.0\r\n 11\r\n531052.3737678636\r\n 21\r\n191142.278630934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n128F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531126.7883308363\r\n 20\r\n191207.7810777936\r\n 30\r\n0.0\r\n 11\r\n531059.1956883039\r\n 21\r\n191194.8007003539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1290\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530935.1011591012\r\n 20\r\n191270.8061954971\r\n 30\r\n0.0\r\n 11\r\n530726.6762678921\r\n 21\r\n191386.4831976849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1291\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530953.2732856884\r\n 20\r\n190903.5946479108\r\n 30\r\n0.0\r\n 11\r\n530869.7672241239\r\n 21\r\n190921.4288129707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1292\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530833.6801901157\r\n 20\r\n191463.6086225853\r\n 30\r\n0.0\r\n 11\r\n530751.3796565852\r\n 21\r\n191262.9827624679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1293\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531071.8226539727\r\n 20\r\n191048.1778919344\r\n 30\r\n0.0\r\n 11\r\n530692.6995907446\r\n 21\r\n191238.1803373874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1294\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530970.1073805743\r\n 20\r\n190833.7492594184\r\n 30\r\n0.0\r\n 11\r\n530656.0666857695\r\n 21\r\n190950.6610823109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1295\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531007.3683808244\r\n 20\r\n190919.5876067948\r\n 30\r\n0.0\r\n 11\r\n530952.3740462676\r\n 21\r\n190811.3143936106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1296\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531056.9548449825\r\n 20\r\n190898.2385704325\r\n 30\r\n0.0\r\n 11\r\n531005.2221560326\r\n 21\r\n190919.2468970518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1297\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531351.6830331344\r\n 20\r\n190732.7188390835\r\n 30\r\n0.0\r\n 11\r\n530810.8970529181\r\n 21\r\n190887.8577834759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1298\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530804.3060749416\r\n 20\r\n190899.153303579\r\n 30\r\n0.0\r\n 11\r\n530797.7914018496\r\n 21\r\n190875.7585689889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1299\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530880.0908578202\r\n 20\r\n190911.1804543932\r\n 30\r\n0.0\r\n 11\r\n530754.7490637765\r\n 21\r\n190579.0008599418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531079.0840550969\r\n 20\r\n190598.7784309232\r\n 30\r\n0.0\r\n 11\r\n530880.8373040431\r\n 21\r\n190550.5614832236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530896.9626566423\r\n 20\r\n190523.9661088623\r\n 30\r\n0.0\r\n 11\r\n530888.458537283\r\n 21\r\n190868.8703849999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531275.0677919114\r\n 20\r\n190573.5068405064\r\n 30\r\n0.0\r\n 11\r\n531006.3020893577\r\n 21\r\n190593.8566231087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530970.2471626816\r\n 20\r\n191104.7112357848\r\n 30\r\n0.0\r\n 11\r\n530943.9690002872\r\n 21\r\n191065.7295975544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531002.6028409777\r\n 20\r\n191040.5422331465\r\n 30\r\n0.0\r\n 11\r\n530943.124310048\r\n 21\r\n191067.4327892296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n129F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531042.6135389779\r\n 20\r\n191069.7776498928\r\n 30\r\n0.0\r\n 11\r\n531010.6510620626\r\n 21\r\n190970.4733543993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531208.6881942397\r\n 20\r\n190701.6625239569\r\n 30\r\n0.0\r\n 11\r\n531100.1918312319\r\n 21\r\n190732.2093692526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530830.6549453034\r\n 20\r\n190611.4441596177\r\n 30\r\n0.0\r\n 11\r\n530764.056769029\r\n 21\r\n190455.2469107448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531242.6196049599\r\n 20\r\n190415.6898667019\r\n 30\r\n0.0\r\n 11\r\n530544.3562548107\r\n 21\r\n190704.3070771961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530727.0770821876\r\n 20\r\n190554.695375905\r\n 30\r\n0.0\r\n 11\r\n530469.9007345941\r\n 21\r\n190102.2421574541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530664.5429181734\r\n 20\r\n190585.0121263624\r\n 30\r\n0.0\r\n 11\r\n530835.8220088523\r\n 21\r\n190494.0561413587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530691.5892971918\r\n 20\r\n190658.1596607209\r\n 30\r\n0.0\r\n 11\r\n530637.7408111629\r\n 21\r\n190505.793009922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530644.8837157669\r\n 20\r\n190524.9513678989\r\n 30\r\n0.0\r\n 11\r\n530408.283807146\r\n 21\r\n190309.9650283871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530877.0520145585\r\n 20\r\n190435.3827700694\r\n 30\r\n0.0\r\n 11\r\n530601.5820498165\r\n 21\r\n190117.8783408983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531054.4286939304\r\n 20\r\n190338.687258596\r\n 30\r\n0.0\r\n 11\r\n530936.7322763709\r\n 21\r\n190368.6041237431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530980.8907961061\r\n 20\r\n190460.6585950796\r\n 30\r\n0.0\r\n 11\r\n531074.4363116233\r\n 21\r\n190384.2585460425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531071.0174015519\r\n 20\r\n190390.0624818143\r\n 30\r\n0.0\r\n 11\r\n531052.7589149675\r\n 21\r\n190337.296502614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531140.5475894979\r\n 20\r\n190720.8600624002\r\n 30\r\n0.0\r\n 11\r\n531140.5422983688\r\n 21\r\n190720.8488089252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531078.2713602384\r\n 20\r\n190588.4074195735\r\n 30\r\n0.0\r\n 11\r\n530552.7345483289\r\n 21\r\n189682.8822585834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530740.7727734767\r\n 20\r\n190317.1978880576\r\n 30\r\n0.0\r\n 11\r\n531066.8566840048\r\n 21\r\n190154.7626582723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531172.6815375744\r\n 20\r\n190253.818759882\r\n 30\r\n0.0\r\n 11\r\n530909.3841886824\r\n 21\r\n190320.3433067586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530987.1866687095\r\n 20\r\n190401.4729746934\r\n 30\r\n0.0\r\n 11\r\n531019.2011780268\r\n 21\r\n190386.0760619135\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530566.5142077983\r\n 20\r\n190379.8042986561\r\n 30\r\n0.0\r\n 11\r\n530746.7878817967\r\n 21\r\n190371.4603050605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530781.0020856237\r\n 20\r\n190425.3279099487\r\n 30\r\n0.0\r\n 11\r\n530744.9717957172\r\n 21\r\n190370.8979930163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530901.6456101665\r\n 20\r\n190564.5576699728\r\n 30\r\n0.0\r\n 11\r\n530819.3367933233\r\n 21\r\n190344.7005378771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531173.5166906944\r\n 20\r\n190402.5463365411\r\n 30\r\n0.0\r\n 11\r\n531124.6031772562\r\n 21\r\n190605.9791849102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530763.4899419086\r\n 20\r\n190422.1215619297\r\n 30\r\n0.0\r\n 11\r\n530863.9868964326\r\n 21\r\n190361.8674686729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531652.7245492292\r\n 20\r\n190802.7615644275\r\n 30\r\n0.0\r\n 11\r\n531643.2365683611\r\n 21\r\n191000.68622286\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528736.092904392\r\n 20\r\n189686.6373637899\r\n 30\r\n0.0\r\n 11\r\n528620.6891533154\r\n 21\r\n189412.8596400124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528883.5141672747\r\n 20\r\n189434.6341329915\r\n 30\r\n0.0\r\n 11\r\n528683.3253642974\r\n 21\r\n189608.9101625759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528709.7858504974\r\n 20\r\n189222.7317666962\r\n 30\r\n0.0\r\n 11\r\n528856.699215057\r\n 21\r\n189525.0171630695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528945.836060306\r\n 20\r\n189561.5091656175\r\n 30\r\n0.0\r\n 11\r\n528833.2640107872\r\n 21\r\n189703.6819148343\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529194.1836177331\r\n 20\r\n189955.6672653194\r\n 30\r\n0.0\r\n 11\r\n529067.4219150274\r\n 21\r\n190060.0594324565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528825.4410240728\r\n 20\r\n189476.1355913837\r\n 30\r\n0.0\r\n 11\r\n529002.9047942007\r\n 21\r\n189643.1357616589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528660.7678825191\r\n 20\r\n189590.7707751939\r\n 30\r\n0.0\r\n 11\r\n528833.2171205858\r\n 21\r\n189824.0458195359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530606.7976766392\r\n 20\r\n190323.4935651079\r\n 30\r\n0.0\r\n 11\r\n530953.6176210528\r\n 21\r\n190051.2345594849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530952.1102433072\r\n 20\r\n189920.7174612524\r\n 30\r\n0.0\r\n 11\r\n530840.126610297\r\n 21\r\n189582.7534186109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531395.6742002643\r\n 20\r\n190631.2880820697\r\n 30\r\n0.0\r\n 11\r\n531358.5835637108\r\n 21\r\n190314.4144565366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529420.8840551164\r\n 20\r\n188885.5709871339\r\n 30\r\n0.0\r\n 11\r\n529215.7566812801\r\n 21\r\n189003.180972715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529578.2053426957\r\n 20\r\n190618.865623553\r\n 30\r\n0.0\r\n 11\r\n529786.5781078201\r\n 21\r\n190957.2416225101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528306.4601697287\r\n 20\r\n191394.6659840302\r\n 30\r\n0.0\r\n 11\r\n530681.24822964\r\n 21\r\n190279.6287509912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530786.8875049436\r\n 20\r\n191256.1992820703\r\n 30\r\n0.0\r\n 11\r\n530934.3568216041\r\n 21\r\n191452.1553284745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530810.6600446865\r\n 20\r\n191279.9374053675\r\n 30\r\n0.0\r\n 11\r\n530574.7165782317\r\n 21\r\n191331.7965642098\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530611.9717645991\r\n 20\r\n190853.0490328778\r\n 30\r\n0.0\r\n 11\r\n530785.5594019265\r\n 21\r\n191588.3985637284\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530666.9963664804\r\n 20\r\n191384.1600547587\r\n 30\r\n0.0\r\n 11\r\n530270.5504785207\r\n 21\r\n191573.1426611555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530686.9542703694\r\n 20\r\n191450.7281334419\r\n 30\r\n0.0\r\n 11\r\n530624.4721558542\r\n 21\r\n191267.1375468709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530617.8696984619\r\n 20\r\n191473.0825542882\r\n 30\r\n0.0\r\n 11\r\n530597.6531868602\r\n 21\r\n191412.0338986045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530624.5272835949\r\n 20\r\n191460.5592202951\r\n 30\r\n0.0\r\n 11\r\n530271.9556868885\r\n 21\r\n191656.2384653555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530572.4341909653\r\n 20\r\n191574.9456245721\r\n 30\r\n0.0\r\n 11\r\n530411.0970229937\r\n 21\r\n191325.2440993296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530423.6971041789\r\n 20\r\n191320.9388758374\r\n 30\r\n0.0\r\n 11\r\n530215.7578632887\r\n 21\r\n191438.3996939469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530422.6754470898\r\n 20\r\n191130.4008035777\r\n 30\r\n0.0\r\n 11\r\n530416.2354834049\r\n 21\r\n191337.4404344914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530498.5527046849\r\n 20\r\n191173.3499155815\r\n 30\r\n0.0\r\n 11\r\n530415.0466431205\r\n 21\r\n191191.1840806411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530378.9596091123\r\n 20\r\n191733.363890256\r\n 30\r\n0.0\r\n 11\r\n530216.4844141852\r\n 21\r\n191435.3832489207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530617.1020729691\r\n 20\r\n191317.9331596048\r\n 30\r\n0.0\r\n 11\r\n530237.9790097414\r\n 21\r\n191507.9356050581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530170.4777954436\r\n 20\r\n190974.1342686499\r\n 30\r\n0.0\r\n 11\r\n530242.845132544\r\n 21\r\n191512.9330168268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530263.0237728314\r\n 20\r\n190999.9196945033\r\n 30\r\n0.0\r\n 11\r\n530168.6750936133\r\n 21\r\n191069.8328868142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530271.8171301251\r\n 20\r\n191061.3825817094\r\n 30\r\n0.0\r\n 11\r\n530164.8331375071\r\n 21\r\n191036.4822563365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530311.2013704974\r\n 20\r\n191247.264696152\r\n 30\r\n0.0\r\n 11\r\n530251.7666616241\r\n 21\r\n191054.1980062689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530515.3867995707\r\n 20\r\n191103.5045270889\r\n 30\r\n0.0\r\n 11\r\n530201.3461047661\r\n 21\r\n191220.4163499817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530552.647799821\r\n 20\r\n191189.3428744654\r\n 30\r\n0.0\r\n 11\r\n530497.6534652642\r\n 21\r\n191081.0696612813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530602.234263979\r\n 20\r\n191167.9938381031\r\n 30\r\n0.0\r\n 11\r\n530550.5015750291\r\n 21\r\n191189.0021647223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531277.3814127393\r\n 20\r\n190896.6993731198\r\n 30\r\n0.0\r\n 11\r\n530356.1764719148\r\n 21\r\n191157.6130511465\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530349.5854939382\r\n 20\r\n191168.9085712497\r\n 30\r\n0.0\r\n 11\r\n530343.0708208462\r\n 21\r\n191145.5138366594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530257.914889346\r\n 20\r\n191335.4912681963\r\n 30\r\n0.0\r\n 11\r\n530213.295080578\r\n 21\r\n191343.4417297378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530272.2328318559\r\n 20\r\n191341.5180590523\r\n 30\r\n0.0\r\n 11\r\n530249.3817584041\r\n 21\r\n191333.969888762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530294.2377954327\r\n 20\r\n191401.7198153854\r\n 30\r\n0.0\r\n 11\r\n530267.6322056853\r\n 21\r\n191334.9814833307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530425.3702768167\r\n 20\r\n191180.9357220638\r\n 30\r\n0.0\r\n 11\r\n530300.0284827732\r\n 21\r\n190848.7561276125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530624.3634740933\r\n 20\r\n190868.5336985939\r\n 30\r\n0.0\r\n 11\r\n530426.1167230396\r\n 21\r\n190820.3167508943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530442.2420756388\r\n 20\r\n190793.721376533\r\n 30\r\n0.0\r\n 11\r\n530433.7379562795\r\n 21\r\n191138.6256526705\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530557.2083504603\r\n 20\r\n191102.9471589445\r\n 30\r\n0.0\r\n 11\r\n530547.1130889521\r\n 21\r\n191068.8872202327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530372.3499657048\r\n 20\r\n191004.6811445212\r\n 30\r\n0.0\r\n 11\r\n530280.8611844596\r\n 21\r\n191023.1647347263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530314.2554430935\r\n 20\r\n191012.1938829203\r\n 30\r\n0.0\r\n 11\r\n530255.222864584\r\n 21\r\n191071.0813766387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530319.9218190236\r\n 20\r\n191024.032936741\r\n 30\r\n0.0\r\n 11\r\n530242.384921647\r\n 21\r\n191003.7307899842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530226.7956803922\r\n 20\r\n190889.9725558877\r\n 30\r\n0.0\r\n 11\r\n530249.9963712407\r\n 21\r\n191013.8022231446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530843.0219665133\r\n 20\r\n190748.4988920565\r\n 30\r\n0.0\r\n 11\r\n530551.5815083543\r\n 21\r\n190863.6118907793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530515.5265816781\r\n 20\r\n191374.4665034555\r\n 30\r\n0.0\r\n 11\r\n530489.2484192839\r\n 21\r\n191335.4848652249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530547.8822599742\r\n 20\r\n191310.297500817\r\n 30\r\n0.0\r\n 11\r\n530488.4037290445\r\n 21\r\n191337.1880569003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530587.8929579744\r\n 20\r\n191339.5329175635\r\n 30\r\n0.0\r\n 11\r\n530555.9304810591\r\n 21\r\n191240.2286220699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530704.5671822437\r\n 20\r\n191213.3974429023\r\n 30\r\n0.0\r\n 11\r\n530411.8118187123\r\n 21\r\n191272.1599178894\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530363.9397497025\r\n 20\r\n191358.287867634\r\n 30\r\n0.0\r\n 11\r\n530333.8220195336\r\n 21\r\n191296.3807914483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530362.8699991715\r\n 20\r\n191283.3361451236\r\n 30\r\n0.0\r\n 11\r\n530308.7435676297\r\n 21\r\n191309.4685266677\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530360.9956112147\r\n 20\r\n191291.7356111226\r\n 30\r\n0.0\r\n 11\r\n530330.6976633138\r\n 21\r\n191227.1561231241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530334.2797357945\r\n 20\r\n191228.1501520307\r\n 30\r\n0.0\r\n 11\r\n530283.1270503726\r\n 21\r\n191251.2800584046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530316.5581169064\r\n 20\r\n191314.0042365652\r\n 30\r\n0.0\r\n 11\r\n530282.8641361738\r\n 21\r\n191244.2130948573\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530753.9676132364\r\n 20\r\n190971.4177916275\r\n 30\r\n0.0\r\n 11\r\n530645.4712502283\r\n 21\r\n191001.964636923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530188.6951548543\r\n 20\r\n191012.6301874295\r\n 30\r\n0.0\r\n 11\r\n529846.2858622457\r\n 21\r\n190650.5201306966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530200.2539482312\r\n 20\r\n190944.8408733593\r\n 30\r\n0.0\r\n 11\r\n530035.3632543009\r\n 21\r\n190788.3782138476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530375.9343643\r\n 20\r\n190881.1994272883\r\n 30\r\n0.0\r\n 11\r\n530309.3361880256\r\n 21\r\n190725.0021784153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530671.8834682779\r\n 20\r\n190733.3985119153\r\n 30\r\n0.0\r\n 11\r\n530089.6356738072\r\n 21\r\n190974.0623448668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530209.82233717\r\n 20\r\n190854.7673940329\r\n 30\r\n0.0\r\n 11\r\n530381.1014278488\r\n 21\r\n190763.8114090294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530176.738479037\r\n 20\r\n190790.1310533407\r\n 30\r\n0.0\r\n 11\r\n530233.7825995969\r\n 21\r\n190760.4390676936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530180.983468939\r\n 20\r\n190844.3458584129\r\n 30\r\n0.0\r\n 11\r\n530183.0202301594\r\n 21\r\n190775.5482775925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530190.1631347634\r\n 20\r\n190794.7066355697\r\n 30\r\n0.0\r\n 11\r\n529953.5632261425\r\n 21\r\n190579.7202960579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530422.331433555\r\n 20\r\n190705.13803774\r\n 30\r\n0.0\r\n 11\r\n530242.3648234194\r\n 21\r\n190452.4459640357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530685.8270084943\r\n 20\r\n190990.6153300706\r\n 30\r\n0.0\r\n 11\r\n530685.8217173655\r\n 21\r\n190990.6040765957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530658.1253966024\r\n 20\r\n190512.595404907\r\n 30\r\n0.0\r\n 11\r\n530294.1637362402\r\n 21\r\n190689.0570376765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530111.7936267947\r\n 20\r\n190649.5595663267\r\n 30\r\n0.0\r\n 11\r\n530292.0673007933\r\n 21\r\n190641.2155727311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530326.2815046201\r\n 20\r\n190695.0831776194\r\n 30\r\n0.0\r\n 11\r\n530290.2512147138\r\n 21\r\n190640.653260687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530446.9250291631\r\n 20\r\n190834.3129376435\r\n 30\r\n0.0\r\n 11\r\n530364.6162123198\r\n 21\r\n190614.4558055476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529939.939415788\r\n 20\r\n190809.8789550084\r\n 30\r\n0.0\r\n 11\r\n530130.9635013352\r\n 21\r\n190639.1185579506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529654.0128583817\r\n 20\r\n191008.5990400711\r\n 30\r\n0.0\r\n 11\r\n529538.5254608057\r\n 21\r\n191180.5570084886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n12FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529909.9204973347\r\n 20\r\n191073.5304972992\r\n 30\r\n0.0\r\n 11\r\n529577.0660346956\r\n 21\r\n191424.229912995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1300\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530097.8222530831\r\n 20\r\n190903.6018086659\r\n 30\r\n0.0\r\n 11\r\n529709.5386221093\r\n 21\r\n191278.0391841883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1301\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529859.7970559477\r\n 20\r\n190995.6823473421\r\n 30\r\n0.0\r\n 11\r\n529895.6832068345\r\n 21\r\n191107.4934018215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1302\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529816.8157740735\r\n 20\r\n191040.488809428\r\n 30\r\n0.0\r\n 11\r\n529918.2503592541\r\n 21\r\n191082.6388486844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1303\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529676.4362978191\r\n 20\r\n191168.5391179237\r\n 30\r\n0.0\r\n 11\r\n529837.294298447\r\n 21\r\n191046.3428209456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1304\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529488.6195087556\r\n 20\r\n190778.8154378799\r\n 30\r\n0.0\r\n 11\r\n529781.3394002914\r\n 21\r\n191210.780711083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1305\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529690.9396844112\r\n 20\r\n191082.5003184239\r\n 30\r\n0.0\r\n 11\r\n529709.8731834154\r\n 21\r\n191067.2925182051\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1306\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529622.3579484594\r\n 20\r\n191048.0832998647\r\n 30\r\n0.0\r\n 11\r\n529979.350393128\r\n 21\r\n190800.6693161047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1307\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529947.6250255865\r\n 20\r\n190799.1961620026\r\n 30\r\n0.0\r\n 11\r\n530031.2524980849\r\n 21\r\n190982.2829122324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1308\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529909.4806381238\r\n 20\r\n190695.8884812792\r\n 30\r\n0.0\r\n 11\r\n529640.2297696372\r\n 21\r\n191008.8308089954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1309\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529768.2020691272\r\n 20\r\n190935.8054215372\r\n 30\r\n0.0\r\n 11\r\n529831.7520282783\r\n 21\r\n191004.1665427424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529811.0187018545\r\n 20\r\n190975.7822993236\r\n 30\r\n0.0\r\n 11\r\n529824.6421644078\r\n 21\r\n191058.0439763673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529799.5121885463\r\n 20\r\n190982.096660973\r\n 30\r\n0.0\r\n 11\r\n529874.3423080562\r\n 21\r\n191010.812524739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529993.9717421925\r\n 20\r\n190894.018633101\r\n 30\r\n0.0\r\n 11\r\n529862.2862323207\r\n 21\r\n191014.5567160643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530063.611379089\r\n 20\r\n191307.3573994773\r\n 30\r\n0.0\r\n 11\r\n530244.8025817625\r\n 21\r\n191460.1788907737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530040.5595935753\r\n 20\r\n191391.4442571109\r\n 30\r\n0.0\r\n 11\r\n530112.0895504901\r\n 21\r\n191344.8096666741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n130F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530083.6719299731\r\n 20\r\n191102.1464075275\r\n 30\r\n0.0\r\n 11\r\n530199.7744952403\r\n 21\r\n191084.5474851844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1310\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530121.0518461871\r\n 20\r\n191151.7221223488\r\n 30\r\n0.0\r\n 11\r\n530178.8362248517\r\n 21\r\n191058.3060291823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1311\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530020.7508118557\r\n 20\r\n191352.3139438574\r\n 30\r\n0.0\r\n 11\r\n530222.6566959106\r\n 21\r\n191208.0085902876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1312\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529931.2589248137\r\n 20\r\n191293.1742514133\r\n 30\r\n0.0\r\n 11\r\n530009.4340328605\r\n 21\r\n191386.1049675863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1313\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529919.8842639817\r\n 20\r\n191435.1441300177\r\n 30\r\n0.0\r\n 11\r\n529888.4329338768\r\n 21\r\n191318.5313314026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1314\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529887.8264005807\r\n 20\r\n191325.2400372301\r\n 30\r\n0.0\r\n 11\r\n529933.4263986319\r\n 21\r\n191293.0179784648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1315\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529766.283442222\r\n 20\r\n191482.1497039964\r\n 30\r\n0.0\r\n 11\r\n530129.7983159895\r\n 21\r\n191279.3947547383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1316\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530097.5431574947\r\n 20\r\n191344.9030318181\r\n 30\r\n0.0\r\n 11\r\n529941.6740523123\r\n 21\r\n191030.1101691833\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1317\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529869.9817725534\r\n 20\r\n191099.9094151975\r\n 30\r\n0.0\r\n 11\r\n530061.6424893936\r\n 21\r\n191321.0011059216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1318\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529949.2789497925\r\n 20\r\n191383.3896314849\r\n 30\r\n0.0\r\n 11\r\n529932.2472777902\r\n 21\r\n191352.2140660729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1319\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530009.9563679029\r\n 20\r\n191183.0222615452\r\n 30\r\n0.0\r\n 11\r\n530087.5758418096\r\n 21\r\n191131.1854264664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530056.2488408661\r\n 20\r\n191147.127669437\r\n 30\r\n0.0\r\n 11\r\n530139.6303230878\r\n 21\r\n191146.7950067648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530060.6477213065\r\n 20\r\n191159.4937869528\r\n 30\r\n0.0\r\n 11\r\n530100.927754787\r\n 21\r\n191090.1997286182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530004.702835088\r\n 20\r\n190953.4781887471\r\n 30\r\n0.0\r\n 11\r\n530102.7017201151\r\n 21\r\n191102.6985676777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529923.683773368\r\n 20\r\n191565.7595233935\r\n 30\r\n0.0\r\n 11\r\n530171.786933398\r\n 21\r\n191399.6163522243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530467.8923355064\r\n 20\r\n191673.3362207413\r\n 30\r\n0.0\r\n 11\r\n530355.9087024962\r\n 21\r\n191335.3721780998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n131F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n531840.7935770436\r\n 20\r\n189057.792002755\r\n 30\r\n0.0\r\n 11\r\n531982.1822814013\r\n 21\r\n189216.3451605004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1320\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n532397.1314996439\r\n 20\r\n186862.2401610883\r\n 30\r\n0.0\r\n 11\r\n532751.6338472817\r\n 21\r\n186400.5866240799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1321\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529390.5920680657\r\n 20\r\n178053.3126901525\r\n 30\r\n0.0\r\n 11\r\n530115.1553102974\r\n 21\r\n178218.3674452636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1322\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529588.7373599372\r\n 20\r\n178091.3637877734\r\n 30\r\n0.0\r\n 11\r\n529220.8203963338\r\n 21\r\n178791.6550297485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1323\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529522.027867812\r\n 20\r\n178212.0012265017\r\n 30\r\n0.0\r\n 11\r\n529662.3119211489\r\n 21\r\n178258.6711213384\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1324\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529651.2157191435\r\n 20\r\n178109.9595009088\r\n 30\r\n0.0\r\n 11\r\n529420.4224018896\r\n 21\r\n178547.2455074355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1325\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529635.5138608472\r\n 20\r\n178240.0261699392\r\n 30\r\n0.0\r\n 11\r\n529687.7454499261\r\n 21\r\n178303.2160374569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1326\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529701.3864531909\r\n 20\r\n178195.1249762844\r\n 30\r\n0.0\r\n 11\r\n529634.440434588\r\n 21\r\n178252.0078302338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1327\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529682.8737538791\r\n 20\r\n178199.4838608876\r\n 30\r\n0.0\r\n 11\r\n529876.420257985\r\n 21\r\n178245.2441442418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1328\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529733.5857718822\r\n 20\r\n178087.8633627716\r\n 30\r\n0.0\r\n 11\r\n529700.2622754637\r\n 21\r\n178519.5446872525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1329\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529870.3293648365\r\n 20\r\n178300.9853595905\r\n 30\r\n0.0\r\n 11\r\n529683.6765661495\r\n 21\r\n178301.741337488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n132A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529873.7351080664\r\n 20\r\n178240.4707767044\r\n 30\r\n0.0\r\n 11\r\n529869.6943259762\r\n 21\r\n178301.5468993824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n132B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530166.1098490548\r\n 20\r\n178294.9608130672\r\n 30\r\n0.0\r\n 11\r\n529869.2240375089\r\n 21\r\n178280.6506399475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n132C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530098.0406759726\r\n 20\r\n178288.0142161451\r\n 30\r\n0.0\r\n 11\r\n530084.8929137669\r\n 21\r\n178400.3749640314\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n132D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530166.28914748\r\n 20\r\n178403.7599636211\r\n 30\r\n0.0\r\n 11\r\n529351.949710317\r\n 21\r\n178348.293701919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n132E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529633.3820592434\r\n 20\r\n178437.1764218828\r\n 30\r\n0.0\r\n 11\r\n529512.4457275377\r\n 21\r\n178859.3827355189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n132F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529564.4324633867\r\n 20\r\n178428.4827311594\r\n 30\r\n0.0\r\n 11\r\n529755.8193743748\r\n 21\r\n178459.7967601896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1330\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529553.7906139416\r\n 20\r\n178500.3099491722\r\n 30\r\n0.0\r\n 11\r\n529617.3392258458\r\n 21\r\n178510.169950549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1331\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529540.4498922314\r\n 20\r\n178447.5909756185\r\n 30\r\n0.0\r\n 11\r\n529564.4116247705\r\n 21\r\n178512.1129943156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1332\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529565.0429286165\r\n 20\r\n178491.6761349184\r\n 30\r\n0.0\r\n 11\r\n529430.2582499482\r\n 21\r\n178871.7158540896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1333\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529359.7546940634\r\n 20\r\n178518.4432037213\r\n 30\r\n0.0\r\n 11\r\n529733.7382635378\r\n 21\r\n178679.8370821898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1334\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529735.9041441907\r\n 20\r\n178666.6991235893\r\n 30\r\n0.0\r\n 11\r\n529654.3858264684\r\n 21\r\n178891.1774868423\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1335\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529923.9961336309\r\n 20\r\n178636.2490944916\r\n 30\r\n0.0\r\n 11\r\n529720.8609436733\r\n 21\r\n178676.7827410348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1336\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529869.1091454615\r\n 20\r\n178568.5039620335\r\n 30\r\n0.0\r\n 11\r\n529865.3064953427\r\n 21\r\n178653.8084731304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1337\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529297.2528540473\r\n 20\r\n178610.462173554\r\n 30\r\n0.0\r\n 11\r\n529381.7643390703\r\n 21\r\n178641.7655263754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1338\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529210.7412612053\r\n 20\r\n178736.3848983364\r\n 30\r\n0.0\r\n 11\r\n529657.2409238578\r\n 21\r\n178889.9628940308\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1339\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529706.9376248931\r\n 20\r\n178475.4520136958\r\n 30\r\n0.0\r\n 11\r\n529582.1354664721\r\n 21\r\n178880.7415985645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530059.7092555507\r\n 20\r\n178862.7149028401\r\n 30\r\n0.0\r\n 11\r\n529576.4032417384\r\n 21\r\n178876.7673218856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530312.7701853247\r\n 20\r\n178874.6729484941\r\n 30\r\n0.0\r\n 11\r\n529773.4183123891\r\n 21\r\n178866.4825009502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530079.0449972051\r\n 20\r\n178772.167551013\r\n 30\r\n0.0\r\n 11\r\n530025.6681078049\r\n 21\r\n178876.7640873191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530016.9737908839\r\n 20\r\n178773.6423330408\r\n 30\r\n0.0\r\n 11\r\n530059.1953704929\r\n 21\r\n178875.0471608128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529827.1402371451\r\n 20\r\n178765.487534809\r\n 30\r\n0.0\r\n 11\r\n530027.3700867477\r\n 21\r\n178792.2314815871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n133F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529935.2167503272\r\n 20\r\n178540.3694703332\r\n 30\r\n0.0\r\n 11\r\n529871.7571494588\r\n 21\r\n178869.4026166622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1340\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529844.4046062384\r\n 20\r\n178517.7916381525\r\n 30\r\n0.0\r\n 11\r\n529960.2714997501\r\n 21\r\n178554.1554734086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1341\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529971.0478116974\r\n 20\r\n178452.6277842837\r\n 30\r\n0.0\r\n 11\r\n529851.3161161499\r\n 21\r\n178468.5039314089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1342\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529857.2739883265\r\n 20\r\n178465.3609430782\r\n 30\r\n0.0\r\n 11\r\n529845.0949802163\r\n 21\r\n178519.8521593871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1343\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529971.8629280645\r\n 20\r\n178147.3501551373\r\n 30\r\n0.0\r\n 11\r\n529908.1362417926\r\n 21\r\n178706.3282208272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1344\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529898.0838949129\r\n 20\r\n178714.6936309961\r\n 30\r\n0.0\r\n 11\r\n529922.23314985\r\n 21\r\n178717.2564532717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1345\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529748.9219505447\r\n 20\r\n178832.6088930304\r\n 30\r\n0.0\r\n 11\r\n529748.4472840071\r\n 21\r\n178877.9289974535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1346\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529740.6139858995\r\n 20\r\n178819.4824537115\r\n 30\r\n0.0\r\n 11\r\n529751.8312643767\r\n 21\r\n178840.7737452691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1347\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529677.6053795027\r\n 20\r\n178807.7187209904\r\n 30\r\n0.0\r\n 11\r\n529747.8204193533\r\n 21\r\n178822.9407625761\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1348\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529873.7097927802\r\n 20\r\n178641.9345159805\r\n 30\r\n0.0\r\n 11\r\n530301.3177057517\r\n 21\r\n178718.1497223015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1349\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530279.8565997225\r\n 20\r\n178694.7383990443\r\n 30\r\n0.0\r\n 11\r\n530210.0881816244\r\n 21\r\n178883.5416831849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530148.9711179213\r\n 20\r\n178394.0948102993\r\n 30\r\n0.0\r\n 11\r\n530284.3736267778\r\n 21\r\n178730.6222615631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530308.4283792124\r\n 20\r\n178592.96658897\r\n 30\r\n0.0\r\n 11\r\n529914.0577438836\r\n 21\r\n178626.6963115775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529928.8617689076\r\n 20\r\n178499.0298163773\r\n 30\r\n0.0\r\n 11\r\n529964.1210211301\r\n 21\r\n178503.3632748896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530056.2992316162\r\n 20\r\n178665.127754665\r\n 30\r\n0.0\r\n 11\r\n530053.1740083323\r\n 21\r\n178758.4126579452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530058.4809445885\r\n 20\r\n178723.6653914825\r\n 30\r\n0.0\r\n 11\r\n530010.1477911528\r\n 21\r\n178791.6101375701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n134F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530045.868844705\r\n 20\r\n178720.0313925719\r\n 30\r\n0.0\r\n 11\r\n530078.6936574002\r\n 21\r\n178793.1523833286\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1350\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530245.8754076924\r\n 20\r\n178794.6613581359\r\n 30\r\n0.0\r\n 11\r\n530067.5037911571\r\n 21\r\n178787.3081704402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1351\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530273.0675218956\r\n 20\r\n178208.0096468544\r\n 30\r\n0.0\r\n 11\r\n530096.6192585914\r\n 21\r\n178215.9086817285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1352\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530158.6363406193\r\n 20\r\n178201.8413428505\r\n 30\r\n0.0\r\n 11\r\n530165.8416213736\r\n 21\r\n178465.0654016896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1353\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529667.9501122793\r\n 20\r\n178584.9671873393\r\n 30\r\n0.0\r\n 11\r\n529710.7353059648\r\n 21\r\n178604.4489002836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1354\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529725.8966288471\r\n 20\r\n178542.4612814524\r\n 30\r\n0.0\r\n 11\r\n529709.1949448264\r\n 21\r\n178605.5631942513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1355\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529690.4566796745\r\n 20\r\n178507.8263922591\r\n 30\r\n0.0\r\n 11\r\n529793.675196943\r\n 21\r\n178522.9551968021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1356\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529795.5983844062\r\n 20\r\n178371.9284360456\r\n 30\r\n0.0\r\n 11\r\n529785.9759576364\r\n 21\r\n178670.3679445664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1357\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529708.9335792827\r\n 20\r\n178731.8027120526\r\n 30\r\n0.0\r\n 11\r\n529774.9635139324\r\n 21\r\n178751.2863329311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1358\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529783.0333527766\r\n 20\r\n178720.4833197699\r\n 30\r\n0.0\r\n 11\r\n529766.195812011\r\n 21\r\n178778.1814061991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1359\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529775.0586125864\r\n 20\r\n178723.7187298189\r\n 30\r\n0.0\r\n 11\r\n529843.7540392793\r\n 21\r\n178742.9388824889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n135A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529842.1822544748\r\n 20\r\n178739.5700801422\r\n 30\r\n0.0\r\n 11\r\n529827.8150230222\r\n 21\r\n178793.839523249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n135B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529760.4321706216\r\n 20\r\n178771.2229377899\r\n 30\r\n0.0\r\n 11\r\n529834.828413398\r\n 21\r\n178792.9320800863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n135C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530026.101377302\r\n 20\r\n178283.255303252\r\n 30\r\n0.0\r\n 11\r\n530013.8863797965\r\n 21\r\n178395.3060256032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n135D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529473.7643035521\r\n 20\r\n178564.8684743813\r\n 30\r\n0.0\r\n 11\r\n529371.3688412569\r\n 21\r\n178808.8539638275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n135E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529032.4566797877\r\n 20\r\n178870.0605803373\r\n 30\r\n0.0\r\n 11\r\n529172.7407331247\r\n 21\r\n178916.7304751739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n135F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529161.6445311194\r\n 20\r\n178768.0188547444\r\n 30\r\n0.0\r\n 11\r\n528930.8512138653\r\n 21\r\n179205.304861271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1360\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529145.9426728229\r\n 20\r\n178898.0855237747\r\n 30\r\n0.0\r\n 11\r\n529198.1742619019\r\n 21\r\n178961.2753912924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1361\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529211.8152651667\r\n 20\r\n178853.1843301198\r\n 30\r\n0.0\r\n 11\r\n529144.8692465639\r\n 21\r\n178910.0671840692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1362\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529195.0257614894\r\n 20\r\n178858.1359249845\r\n 30\r\n0.0\r\n 11\r\n529388.5722655955\r\n 21\r\n178903.8962083386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1363\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529250.5651757271\r\n 20\r\n178661.0646291282\r\n 30\r\n0.0\r\n 11\r\n529210.6910874394\r\n 21\r\n179177.6040410879\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1364\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529380.7581768124\r\n 20\r\n178959.044713426\r\n 30\r\n0.0\r\n 11\r\n529194.1053781251\r\n 21\r\n178959.8006913236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1365\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529384.1639200421\r\n 20\r\n178898.53013054\r\n 30\r\n0.0\r\n 11\r\n529380.123137952\r\n 21\r\n178959.6062532179\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1366\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529676.5386610307\r\n 20\r\n178953.0201669028\r\n 30\r\n0.0\r\n 11\r\n529379.6528494846\r\n 21\r\n178938.7099937831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1367\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529608.4694879482\r\n 20\r\n178946.0735699806\r\n 30\r\n0.0\r\n 11\r\n529595.3217257426\r\n 21\r\n179058.4343178669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1368\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529676.7179594558\r\n 20\r\n179061.8193174565\r\n 30\r\n0.0\r\n 11\r\n528922.8004795738\r\n 21\r\n179012.0193788653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1369\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529143.8108712193\r\n 20\r\n179095.2357757184\r\n 30\r\n0.0\r\n 11\r\n528987.872384487\r\n 21\r\n179724.1392376596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n136A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529074.8612753623\r\n 20\r\n179086.5420849948\r\n 30\r\n0.0\r\n 11\r\n529266.2481863507\r\n 21\r\n179117.8561140251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n136B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529064.2194259175\r\n 20\r\n179158.3693030075\r\n 30\r\n0.0\r\n 11\r\n529127.7680378215\r\n 21\r\n179168.2293043844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n136C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529050.8787042071\r\n 20\r\n179105.6503294541\r\n 30\r\n0.0\r\n 11\r\n529074.8404367462\r\n 21\r\n179170.1723481511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n136D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529075.4717405924\r\n 20\r\n179149.735488754\r\n 30\r\n0.0\r\n 11\r\n529028.4832144465\r\n 21\r\n179282.2246296349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n136E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528870.1835060391\r\n 20\r\n179176.5025575568\r\n 30\r\n0.0\r\n 11\r\n529244.1670755135\r\n 21\r\n179337.8964360254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n136F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529246.3329561665\r\n 20\r\n179324.7584774249\r\n 30\r\n0.0\r\n 11\r\n529164.8146384443\r\n 21\r\n179549.2368406779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1370\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529434.4249456065\r\n 20\r\n179294.3084483272\r\n 30\r\n0.0\r\n 11\r\n529231.2897556491\r\n 21\r\n179334.8420948704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1371\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529379.5379574373\r\n 20\r\n179226.5633158691\r\n 30\r\n0.0\r\n 11\r\n529375.7353073186\r\n 21\r\n179311.8678269659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1372\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528804.6219794623\r\n 20\r\n179283.2325338339\r\n 30\r\n0.0\r\n 11\r\n528889.1334644851\r\n 21\r\n179314.5358866552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1373\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529217.3664368688\r\n 20\r\n179133.5113675314\r\n 30\r\n0.0\r\n 11\r\n529092.5642784479\r\n 21\r\n179538.8009524001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1374\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529589.4738091809\r\n 20\r\n179430.2269048485\r\n 30\r\n0.0\r\n 11\r\n529536.0969197806\r\n 21\r\n179534.8234411546\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1375\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529527.4026028597\r\n 20\r\n179431.7016868763\r\n 30\r\n0.0\r\n 11\r\n529569.6241824687\r\n 21\r\n179533.1065146484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1376\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529337.5690491209\r\n 20\r\n179423.5468886444\r\n 30\r\n0.0\r\n 11\r\n529537.7988987233\r\n 21\r\n179450.2908354228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1377\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529445.6455623029\r\n 20\r\n179198.4288241688\r\n 30\r\n0.0\r\n 11\r\n529373.454971783\r\n 21\r\n179620.5635239094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1378\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529354.8334182141\r\n 20\r\n179175.850991988\r\n 30\r\n0.0\r\n 11\r\n529470.7003117257\r\n 21\r\n179212.2148272441\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1379\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529481.4766236733\r\n 20\r\n179110.6871381193\r\n 30\r\n0.0\r\n 11\r\n529361.7449281256\r\n 21\r\n179126.5632852444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529367.7028003022\r\n 20\r\n179123.4202969139\r\n 30\r\n0.0\r\n 11\r\n529355.523792192\r\n 21\r\n179177.9115132226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529482.2917400402\r\n 20\r\n178805.4095089728\r\n 30\r\n0.0\r\n 11\r\n529418.5650537684\r\n 21\r\n179364.3875746627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529408.5127068887\r\n 20\r\n179372.7529848317\r\n 30\r\n0.0\r\n 11\r\n529432.6619618259\r\n 21\r\n179375.3158071073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529259.3507625205\r\n 20\r\n179490.6682468659\r\n 30\r\n0.0\r\n 11\r\n529255.8735480284\r\n 21\r\n179568.0055555123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529251.0427978754\r\n 20\r\n179477.541807547\r\n 30\r\n0.0\r\n 11\r\n529262.2600763525\r\n 21\r\n179498.8330991046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n137F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529188.0341914784\r\n 20\r\n179465.778074826\r\n 30\r\n0.0\r\n 11\r\n529258.249231329\r\n 21\r\n179481.0001164117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1380\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529384.1386047561\r\n 20\r\n179299.9938698159\r\n 30\r\n0.0\r\n 11\r\n529732.453511002\r\n 21\r\n179368.7730410141\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1381\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529659.3999298971\r\n 20\r\n179052.1541641347\r\n 30\r\n0.0\r\n 11\r\n529739.685557499\r\n 21\r\n179239.7197962464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1382\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529763.253681698\r\n 20\r\n179219.4248595483\r\n 30\r\n0.0\r\n 11\r\n529424.4865558593\r\n 21\r\n179284.7556654132\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1383\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529439.2905808833\r\n 20\r\n179157.0891702127\r\n 30\r\n0.0\r\n 11\r\n529474.549833106\r\n 21\r\n179161.4226287252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1384\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529566.728043592\r\n 20\r\n179323.1871085005\r\n 30\r\n0.0\r\n 11\r\n529563.6028203082\r\n 21\r\n179416.4720117807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1385\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529568.9097565642\r\n 20\r\n179381.7247453179\r\n 30\r\n0.0\r\n 11\r\n529520.5766031286\r\n 21\r\n179449.6694914057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1386\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529556.2976566809\r\n 20\r\n179378.0907464075\r\n 30\r\n0.0\r\n 11\r\n529589.1224693758\r\n 21\r\n179451.2117371642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1387\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529703.8933669607\r\n 20\r\n179447.8056638777\r\n 30\r\n0.0\r\n 11\r\n529577.9326031328\r\n 21\r\n179445.3675242758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1388\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529651.9679774769\r\n 20\r\n178854.6875987086\r\n 30\r\n0.0\r\n 11\r\n529676.2704333494\r\n 21\r\n179123.124755525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1389\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529178.378924255\r\n 20\r\n179243.0265411749\r\n 30\r\n0.0\r\n 11\r\n529221.1641179405\r\n 21\r\n179262.5082541191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529236.3254408228\r\n 20\r\n179200.5206352878\r\n 30\r\n0.0\r\n 11\r\n529219.623756802\r\n 21\r\n179263.6225480869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529200.8854916501\r\n 20\r\n179165.8857460946\r\n 30\r\n0.0\r\n 11\r\n529304.1040089189\r\n 21\r\n179181.0145506376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529306.027196382\r\n 20\r\n179029.9877898812\r\n 30\r\n0.0\r\n 11\r\n529296.4047696122\r\n 21\r\n179328.427298402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529219.3623912584\r\n 20\r\n179389.8620658881\r\n 30\r\n0.0\r\n 11\r\n529285.392325908\r\n 21\r\n179409.3456867667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529293.4621647522\r\n 20\r\n179378.5426736056\r\n 30\r\n0.0\r\n 11\r\n529276.6246239869\r\n 21\r\n179436.2407600347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n138F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529285.4874245623\r\n 20\r\n179381.7780836545\r\n 30\r\n0.0\r\n 11\r\n529354.1828512551\r\n 21\r\n179400.9982363247\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1390\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529352.6110664505\r\n 20\r\n179397.6294339777\r\n 30\r\n0.0\r\n 11\r\n529338.243834998\r\n 21\r\n179451.8988770846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1391\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529270.8609825975\r\n 20\r\n179429.2822916254\r\n 30\r\n0.0\r\n 11\r\n529345.2572253737\r\n 21\r\n179450.9914339217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1392\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529536.5301892779\r\n 20\r\n178941.3146570876\r\n 30\r\n0.0\r\n 11\r\n529524.3151917721\r\n 21\r\n179053.3653794388\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1393\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528984.1931155279\r\n 20\r\n179222.9278282168\r\n 30\r\n0.0\r\n 11\r\n528881.7976532325\r\n 21\r\n179466.913317663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1394\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528256.2762777142\r\n 20\r\n179214.9213572008\r\n 30\r\n0.0\r\n 11\r\n530103.7181598913\r\n 21\r\n179877.1135497176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1395\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529654.1600247581\r\n 20\r\n179483.0418736856\r\n 30\r\n0.0\r\n 11\r\n529835.6988509518\r\n 21\r\n179619.8379238862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1396\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529687.9234379178\r\n 20\r\n179299.2651771761\r\n 30\r\n0.0\r\n 11\r\n529852.9724886179\r\n 21\r\n179339.161398821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1397\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529812.9763927825\r\n 20\r\n178860.6350568236\r\n 30\r\n0.0\r\n 11\r\n529635.628069068\r\n 21\r\n179631.6345729913\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1398\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529760.9940699366\r\n 20\r\n179392.0524657283\r\n 30\r\n0.0\r\n 11\r\n530158.5156557565\r\n 21\r\n179578.7617488612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1399\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529741.4176915706\r\n 20\r\n179458.7337407407\r\n 30\r\n0.0\r\n 11\r\n529802.8474606397\r\n 21\r\n179274.78836411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529810.6291420638\r\n 20\r\n179480.6921862162\r\n 30\r\n0.0\r\n 11\r\n529830.4957305616\r\n 21\r\n179419.5287628033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529756.457483715\r\n 20\r\n179485.4562664032\r\n 30\r\n0.0\r\n 11\r\n529823.9746865969\r\n 21\r\n179472.0890363976\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529803.899951935\r\n 20\r\n179468.2071818381\r\n 30\r\n0.0\r\n 11\r\n530157.5863137912\r\n 21\r\n179661.8642374505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529794.8493942628\r\n 20\r\n179677.7989024762\r\n 30\r\n0.0\r\n 11\r\n530016.551838801\r\n 21\r\n179331.6720833669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530003.9273105937\r\n 20\r\n179327.439084107\r\n 30\r\n0.0\r\n 11\r\n530212.5357747149\r\n 21\r\n179443.7072241541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n139F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530003.8578455762\r\n 20\r\n179136.8982854884\r\n 30\r\n0.0\r\n 11\r\n530011.4833042558\r\n 21\r\n179343.8976436545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529928.2277777098\r\n 20\r\n179180.2812000585\r\n 30\r\n0.0\r\n 11\r\n530011.8345964161\r\n 21\r\n179197.6368800278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529868.044136958\r\n 20\r\n180083.1249647489\r\n 30\r\n0.0\r\n 11\r\n530211.7919622313\r\n 21\r\n179440.6949891383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529810.5083008496\r\n 20\r\n179325.540939631\r\n 30\r\n0.0\r\n 11\r\n530190.7131860163\r\n 21\r\n179513.3692432622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530249.0655645315\r\n 20\r\n179039.0310878337\r\n 30\r\n0.0\r\n 11\r\n530185.8757603917\r\n 21\r\n179518.3944386658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530294.6453275093\r\n 20\r\n178828.2357818487\r\n 30\r\n0.0\r\n 11\r\n530207.136287022\r\n 21\r\n179322.2600316574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530162.7597095563\r\n 20\r\n179005.505079643\r\n 30\r\n0.0\r\n 11\r\n530257.5071957045\r\n 21\r\n179074.8768433358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530154.3184601428\r\n 20\r\n179067.0173137474\r\n 30\r\n0.0\r\n 11\r\n530261.1581083423\r\n 21\r\n179041.5047589406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530115.9993088026\r\n 20\r\n179253.1219120244\r\n 30\r\n0.0\r\n 11\r\n530174.3274578325\r\n 21\r\n179059.7180382476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529943.3485241449\r\n 20\r\n179121.6943172797\r\n 30\r\n0.0\r\n 11\r\n530225.6990278078\r\n 21\r\n179225.6449261795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529919.992444411\r\n 20\r\n179033.5303585037\r\n 30\r\n0.0\r\n 11\r\n529909.9177026341\r\n 21\r\n179154.5508737263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529811.8359642482\r\n 20\r\n179126.1964533755\r\n 30\r\n0.0\r\n 11\r\n529871.7432927308\r\n 21\r\n179021.321084674\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529866.583463484\r\n 20\r\n179025.6513016039\r\n 30\r\n0.0\r\n 11\r\n529921.639794042\r\n 21\r\n179034.9476104859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529528.8460521422\r\n 20\r\n179011.6896635413\r\n 30\r\n0.0\r\n 11\r\n529528.8580247461\r\n 21\r\n179011.6930241212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529669.7627948629\r\n 20\r\n179051.2434616328\r\n 30\r\n0.0\r\n 11\r\n530070.5115597969\r\n 21\r\n179163.7292843079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530077.1671128554\r\n 20\r\n179174.9868763492\r\n 30\r\n0.0\r\n 11\r\n530083.5477105241\r\n 21\r\n179151.5552194418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530169.790140668\r\n 20\r\n179341.0418955059\r\n 30\r\n0.0\r\n 11\r\n530214.4547457032\r\n 21\r\n179348.7367139115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530155.5069449908\r\n 20\r\n179347.150578423\r\n 30\r\n0.0\r\n 11\r\n530178.3144196068\r\n 21\r\n179339.4716765309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530133.8470841208\r\n 20\r\n179407.477357839\r\n 30\r\n0.0\r\n 11\r\n530160.0700644021\r\n 21\r\n179340.5877646542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530001.4524453501\r\n 20\r\n179187.4478071817\r\n 30\r\n0.0\r\n 11\r\n530112.8405056052\r\n 21\r\n178854.307559915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530012.787356849\r\n 20\r\n178853.2658569171\r\n 30\r\n0.0\r\n 11\r\n529992.8426168967\r\n 21\r\n179145.18634855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529869.1699363119\r\n 20\r\n179110.215485955\r\n 30\r\n0.0\r\n 11\r\n529879.0699900083\r\n 21\r\n179076.0982957604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530053.4625753887\r\n 20\r\n179010.8925017714\r\n 30\r\n0.0\r\n 11\r\n530145.0557017851\r\n 21\r\n179028.851883651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530111.5991667361\r\n 20\r\n179018.0724420342\r\n 30\r\n0.0\r\n 11\r\n530170.9679931944\r\n 21\r\n179076.6209235426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530106.0006793766\r\n 20\r\n179029.9437499166\r\n 30\r\n0.0\r\n 11\r\n530183.4200463617\r\n 21\r\n179009.1979254373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530211.5666022765\r\n 20\r\n178844.3956620246\r\n 30\r\n0.0\r\n 11\r\n530175.8663950519\r\n 21\r\n179019.3127799945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529912.4058616428\r\n 20\r\n179381.4916903172\r\n 30\r\n0.0\r\n 11\r\n529938.4603670565\r\n 21\r\n179342.3602108463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529879.6832537396\r\n 20\r\n179317.5090227454\r\n 30\r\n0.0\r\n 11\r\n529939.3147966758\r\n 21\r\n179344.0585375256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529839.8406267025\r\n 20\r\n179346.9730791118\r\n 30\r\n0.0\r\n 11\r\n529871.2339191949\r\n 21\r\n179247.487380539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529722.446007878\r\n 20\r\n179221.5078008555\r\n 30\r\n0.0\r\n 11\r\n530015.5330712783\r\n 21\r\n179278.5928655428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530063.8975621379\r\n 20\r\n179364.4452664547\r\n 30\r\n0.0\r\n 11\r\n530093.660291165\r\n 21\r\n179302.3667378539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530064.538088384\r\n 20\r\n179289.4886470033\r\n 30\r\n0.0\r\n 11\r\n530118.8132780433\r\n 21\r\n179315.310648166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530066.4605446687\r\n 20\r\n179297.8772417078\r\n 30\r\n0.0\r\n 11\r\n530096.3881850598\r\n 21\r\n179233.1253131048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530092.811863561\r\n 20\r\n179234.139838246\r\n 30\r\n0.0\r\n 11\r\n530144.0961623568\r\n 21\r\n179256.9764424545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530111.0248303785\r\n 20\r\n179319.8910332636\r\n 30\r\n0.0\r\n 11\r\n530144.3186036829\r\n 21\r\n179249.9080892157\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529861.6016424258\r\n 20\r\n179569.9884220753\r\n 30\r\n0.0\r\n 11\r\n530086.1388329739\r\n 21\r\n179709.9769923934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529622.5161699437\r\n 20\r\n178175.7189232008\r\n 30\r\n0.0\r\n 11\r\n529077.4038483118\r\n 21\r\n177670.6570250304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529774.3187212543\r\n 20\r\n177482.138466658\r\n 30\r\n0.0\r\n 11\r\n528687.2778214917\r\n 21\r\n179514.0567645756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529417.3393448741\r\n 20\r\n178156.7481172629\r\n 30\r\n0.0\r\n 11\r\n529299.651861507\r\n 21\r\n178067.2643144636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529428.6886676548\r\n 20\r\n177992.5128970265\r\n 30\r\n0.0\r\n 11\r\n529197.8953504009\r\n 21\r\n178429.7989035533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529330.1661889128\r\n 20\r\n178078.8680238525\r\n 30\r\n0.0\r\n 11\r\n529248.5245953539\r\n 21\r\n178071.4015350011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529330.0669757164\r\n 20\r\n177999.1478521863\r\n 30\r\n0.0\r\n 11\r\n529320.8798790198\r\n 21\r\n178086.5150413052\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529336.9143225266\r\n 20\r\n178016.8914074236\r\n 30\r\n0.0\r\n 11\r\n529189.9238064542\r\n 21\r\n177882.9211085918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529400.4528063577\r\n 20\r\n177912.0405350285\r\n 30\r\n0.0\r\n 11\r\n529062.8618736286\r\n 21\r\n178183.1338463775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529147.3409759589\r\n 20\r\n177919.4023998922\r\n 30\r\n0.0\r\n 11\r\n529252.0380194656\r\n 21\r\n178073.9286689897\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529195.3798063321\r\n 20\r\n177882.4445238005\r\n 30\r\n0.0\r\n 11\r\n529147.2356998853\r\n 21\r\n177920.2435409268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528985.4169776725\r\n 20\r\n177671.8079557215\r\n 30\r\n0.0\r\n 11\r\n529164.7529224974\r\n 21\r\n177908.8408332845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529029.5609383942\r\n 20\r\n177724.08585033\r\n 30\r\n0.0\r\n 11\r\n528944.2152067236\r\n 21\r\n177798.3415396893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528895.4917239208\r\n 20\r\n177733.0512087936\r\n 30\r\n0.0\r\n 11\r\n529395.5462928345\r\n 21\r\n178370.1010164841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529168.6027359841\r\n 20\r\n178191.8725241933\r\n 30\r\n0.0\r\n 11\r\n528888.2709667337\r\n 21\r\n178529.9521993433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529214.6858789368\r\n 20\r\n178243.8914723069\r\n 30\r\n0.0\r\n 11\r\n529080.8407019511\r\n 21\r\n178103.5526440751\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529161.3904520156\r\n 20\r\n178293.2067404935\r\n 30\r\n0.0\r\n 11\r\n529117.3919810326\r\n 21\r\n178246.304925462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529212.4426651124\r\n 20\r\n178274.4734394976\r\n 30\r\n0.0\r\n 11\r\n529145.6528736322\r\n 21\r\n178291.0980982021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529162.1692304324\r\n 20\r\n178279.0451431864\r\n 30\r\n0.0\r\n 11\r\n528924.464112137\r\n 21\r\n178604.7649222723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529255.9069136356\r\n 20\r\n178463.6338263879\r\n 30\r\n0.0\r\n 11\r\n528911.6359587691\r\n 21\r\n178245.9432113415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528921.2604722176\r\n 20\r\n178236.7418127482\r\n 30\r\n0.0\r\n 11\r\n528781.9298895611\r\n 21\r\n178430.7076871426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528840.2666205454\r\n 20\r\n178064.2721146709\r\n 30\r\n0.0\r\n 11\r\n528921.423797634\r\n 21\r\n178254.8512176915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528927.1673621965\r\n 20\r\n178071.3605236999\r\n 30\r\n0.0\r\n 11\r\n528858.8860398547\r\n 21\r\n178122.6341112539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529169.5950389337\r\n 20\r\n178629.8001218609\r\n 30\r\n0.0\r\n 11\r\n529096.0644715597\r\n 21\r\n178577.691133574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529160.0579374052\r\n 20\r\n178709.6349629289\r\n 30\r\n0.0\r\n 11\r\n528781.3216274457\r\n 21\r\n178427.6651825823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529095.4979343949\r\n 20\r\n178152.7428659879\r\n 30\r\n0.0\r\n 11\r\n528831.3138803026\r\n 21\r\n178484.4686743191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528628.0581488629\r\n 20\r\n178204.8741762493\r\n 30\r\n0.0\r\n 11\r\n528837.8295044756\r\n 21\r\n178486.9586376026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528424.0543547561\r\n 20\r\n177877.8356717893\r\n 30\r\n0.0\r\n 11\r\n528562.8268120758\r\n 21\r\n178074.4044123051\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529216.8899173546\r\n 20\r\n177748.886168231\r\n 30\r\n0.0\r\n 11\r\n528791.3587558008\r\n 21\r\n178116.9089922682\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528790.12447374\r\n 20\r\n178129.9284512769\r\n 30\r\n0.0\r\n 11\r\n528774.3821003199\r\n 21\r\n178111.4370410781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528776.9406634209\r\n 20\r\n178319.6110330121\r\n 30\r\n0.0\r\n 11\r\n528726.5995712288\r\n 21\r\n178356.5059315515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528792.4656647689\r\n 20\r\n178319.063293216\r\n 30\r\n0.0\r\n 11\r\n528768.558181954\r\n 21\r\n178321.8162367464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528837.7311428057\r\n 20\r\n178364.4450779506\r\n 30\r\n0.0\r\n 11\r\n528785.5441805669\r\n 21\r\n178315.0650886479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528755.2984108906\r\n 20\r\n177649.3990332462\r\n 30\r\n0.0\r\n 11\r\n528534.7752388648\r\n 21\r\n177705.6368993211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528913.2431451212\r\n 20\r\n177741.8952113882\r\n 30\r\n0.0\r\n 11\r\n528727.5188711966\r\n 21\r\n177633.1306766926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528996.851259631\r\n 20\r\n177534.4409062467\r\n 30\r\n0.0\r\n 11\r\n529089.8929912046\r\n 21\r\n177684.5729166937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529066.5130080652\r\n 20\r\n177625.4342248347\r\n 30\r\n0.0\r\n 11\r\n528845.1307561178\r\n 21\r\n177768.0130442476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529027.0818980847\r\n 20\r\n178246.7260845622\r\n 30\r\n0.0\r\n 11\r\n528986.8558042628\r\n 21\r\n178222.3956239463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529029.4775335915\r\n 20\r\n178174.901215971\r\n 30\r\n0.0\r\n 11\r\n528986.8050162779\r\n 21\r\n178224.2960933789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529078.0693745433\r\n 20\r\n178184.6171070637\r\n 30\r\n0.0\r\n 11\r\n529007.3367636004\r\n 21\r\n178107.936987194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529130.9385857497\r\n 20\r\n178021.1304743279\r\n 30\r\n0.0\r\n 11\r\n528889.9778635624\r\n 21\r\n178197.4729300951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528882.7297250409\r\n 20\r\n178295.7441018924\r\n 30\r\n0.0\r\n 11\r\n528829.3859203152\r\n 21\r\n178252.2239657511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528850.2632399967\r\n 20\r\n178228.1805583032\r\n 30\r\n0.0\r\n 11\r\n528812.1287559493\r\n 21\r\n178274.6384218255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528852.0919470814\r\n 20\r\n178236.5900879977\r\n 30\r\n0.0\r\n 11\r\n528797.4616232942\r\n 21\r\n178190.7206685541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528801.1297903722\r\n 20\r\n178190.1174380736\r\n 30\r\n0.0\r\n 11\r\n528764.4320756943\r\n 21\r\n178232.6011706328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528821.1258424423\r\n 20\r\n178275.4704550611\r\n 30\r\n0.0\r\n 11\r\n528761.2238634208\r\n 21\r\n178226.2989113819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529090.8056720976\r\n 20\r\n178811.7223970167\r\n 30\r\n0.0\r\n 11\r\n528921.4179963483\r\n 21\r\n178657.3388480305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529053.9482432962\r\n 20\r\n178755.0734565325\r\n 30\r\n0.0\r\n 11\r\n528795.8177370931\r\n 21\r\n178958.6398040954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528880.2968394233\r\n 20\r\n178694.9083576101\r\n 30\r\n0.0\r\n 11\r\n528984.9938829302\r\n 21\r\n178849.4346267077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528928.3356697966\r\n 20\r\n178657.9504815182\r\n 30\r\n0.0\r\n 11\r\n528880.1915633499\r\n 21\r\n178695.7494986447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528718.372841137\r\n 20\r\n178447.3139134394\r\n 30\r\n0.0\r\n 11\r\n528897.7087859617\r\n 21\r\n178684.3467910024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528695.6708666394\r\n 20\r\n178589.6934914857\r\n 30\r\n0.0\r\n 11\r\n529094.9695538866\r\n 21\r\n179102.887760648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528901.5585994485\r\n 20\r\n178967.3784819112\r\n 30\r\n0.0\r\n 11\r\n528732.141915289\r\n 21\r\n179171.6947379631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528947.6417424012\r\n 20\r\n179019.3974300246\r\n 30\r\n0.0\r\n 11\r\n528813.7965654157\r\n 21\r\n178879.0586017929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528894.34631548\r\n 20\r\n179068.7126982114\r\n 30\r\n0.0\r\n 11\r\n528850.347844497\r\n 21\r\n179021.8108831797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528945.3985285767\r\n 20\r\n179049.9793972156\r\n 30\r\n0.0\r\n 11\r\n528878.6087370967\r\n 21\r\n179066.6040559201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528895.1250938969\r\n 20\r\n179054.5511009042\r\n 30\r\n0.0\r\n 11\r\n528657.4199756015\r\n 21\r\n179380.27087999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528895.9212925059\r\n 20\r\n179180.2384345977\r\n 30\r\n0.0\r\n 11\r\n528644.5918222334\r\n 21\r\n179021.4491690592\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528654.216335682\r\n 20\r\n179012.2477704661\r\n 30\r\n0.0\r\n 11\r\n528514.8857530255\r\n 21\r\n179206.2136448606\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528586.5761248556\r\n 20\r\n178871.1360494124\r\n 30\r\n0.0\r\n 11\r\n528654.3796610985\r\n 21\r\n179030.3571754095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528835.808251877\r\n 20\r\n178730.7567791569\r\n 30\r\n0.0\r\n 11\r\n528591.8419033192\r\n 21\r\n178898.1400689717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n13FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528828.4537978593\r\n 20\r\n178928.2488237058\r\n 30\r\n0.0\r\n 11\r\n528564.269743767\r\n 21\r\n179259.9746320368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1400\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528269.2197572814\r\n 20\r\n178811.8149971797\r\n 30\r\n0.0\r\n 11\r\n528562.3417837797\r\n 21\r\n179027.729923469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1401\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528373.5205664697\r\n 20\r\n178788.4641264325\r\n 30\r\n0.0\r\n 11\r\n528317.2847204717\r\n 21\r\n178891.5517462234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1402\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528407.3274474087\r\n 20\r\n178840.5419954112\r\n 30\r\n0.0\r\n 11\r\n528299.7840299943\r\n 21\r\n178862.902993846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1403\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528949.8457808189\r\n 20\r\n178524.3921259489\r\n 30\r\n0.0\r\n 11\r\n528712.1583839063\r\n 21\r\n178736.7821449431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1404\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528735.5919425773\r\n 20\r\n178724.2733405178\r\n 30\r\n0.0\r\n 11\r\n528343.5785116573\r\n 21\r\n178635.7446258223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1405\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528456.8048605814\r\n 20\r\n178639.042180561\r\n 30\r\n0.0\r\n 11\r\n528418.2993716642\r\n 21\r\n178801.3636480728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1406\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528425.1672519241\r\n 20\r\n178778.0737645175\r\n 30\r\n0.0\r\n 11\r\n528396.3449656503\r\n 21\r\n178856.3160680103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1407\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528435.2839998973\r\n 20\r\n178786.435727325\r\n 30\r\n0.0\r\n 11\r\n528356.3938325171\r\n 21\r\n178800.5951449837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1408\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528294.4449571226\r\n 20\r\n178703.9188960649\r\n 30\r\n0.0\r\n 11\r\n528367.5328099538\r\n 21\r\n178806.5357773142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1409\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528813.4200762677\r\n 20\r\n178412.1139766217\r\n 30\r\n0.0\r\n 11\r\n528683.1105900724\r\n 21\r\n178484.8759271629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528760.037761549\r\n 20\r\n179022.23204228\r\n 30\r\n0.0\r\n 11\r\n528719.8116677272\r\n 21\r\n178997.9015816641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528762.4333970562\r\n 20\r\n178950.4071736888\r\n 30\r\n0.0\r\n 11\r\n528719.7608797423\r\n 21\r\n178999.8020510967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528811.0252380077\r\n 20\r\n178960.1230647815\r\n 30\r\n0.0\r\n 11\r\n528740.292627065\r\n 21\r\n178883.4429449118\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528863.8944492142\r\n 20\r\n178796.6364320458\r\n 30\r\n0.0\r\n 11\r\n528622.9337270268\r\n 21\r\n178972.978887813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528615.6855885053\r\n 20\r\n179071.2500596103\r\n 30\r\n0.0\r\n 11\r\n528562.3417837797\r\n 21\r\n179027.729923469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n140F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528604.542523008\r\n 20\r\n178870.2673164959\r\n 30\r\n0.0\r\n 11\r\n528545.0846194137\r\n 21\r\n179050.1443795434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1410\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528807.0383873775\r\n 20\r\n178556.2992887536\r\n 30\r\n0.0\r\n 11\r\n528721.42228723\r\n 21\r\n178629.6099560472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1411\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528311.4140469933\r\n 20\r\n178831.2318750209\r\n 30\r\n0.0\r\n 11\r\n527764.9983652827\r\n 21\r\n178652.4227521558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1412\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528293.4167632091\r\n 20\r\n178764.8609884605\r\n 30\r\n0.0\r\n 11\r\n528078.0430157141\r\n 21\r\n178692.1722434146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1413\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528426.0905374633\r\n 20\r\n178633.2877697826\r\n 30\r\n0.0\r\n 11\r\n528300.0214083799\r\n 21\r\n178519.5359683435\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1414\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528503.0450711533\r\n 20\r\n178515.8978525081\r\n 30\r\n0.0\r\n 11\r\n527848.7885761961\r\n 21\r\n179224.2979558424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1415\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528308.2547575839\r\n 20\r\n178625.3173770244\r\n 30\r\n0.0\r\n 11\r\n527929.8019000886\r\n 21\r\n178402.4784166646\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1416\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528264.2492173824\r\n 20\r\n178679.1052888522\r\n 30\r\n0.0\r\n 11\r\n528381.4511659365\r\n 21\r\n178524.5956730775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1417\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528207.0669986657\r\n 20\r\n178634.3549584659\r\n 30\r\n0.0\r\n 11\r\n528246.3532710626\r\n 21\r\n178583.4409672331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1418\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528233.7008313366\r\n 20\r\n178681.767024288\r\n 30\r\n0.0\r\n 11\r\n528206.6393295455\r\n 21\r\n178618.4825029276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1419\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528221.171590992\r\n 20\r\n178632.8657273165\r\n 30\r\n0.0\r\n 11\r\n527861.7172574328\r\n 21\r\n178450.1372953824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528053.8908279912\r\n 20\r\n178754.8365498442\r\n 30\r\n0.0\r\n 11\r\n528213.902859453\r\n 21\r\n178380.2596631688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528224.5211522193\r\n 20\r\n178388.2938933077\r\n 30\r\n0.0\r\n 11\r\n528010.8207720457\r\n 21\r\n178281.6734487079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528381.8699628479\r\n 20\r\n178280.8362153252\r\n 30\r\n0.0\r\n 11\r\n528206.6694766406\r\n 21\r\n178391.3426474184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528388.7284378934\r\n 20\r\n178367.7554063139\r\n 30\r\n0.0\r\n 11\r\n528327.2234748795\r\n 21\r\n178308.5231576142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527795.7539910907\r\n 20\r\n178699.4383652264\r\n 30\r\n0.0\r\n 11\r\n528013.7273650271\r\n 21\r\n178280.5878456312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n141F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528335.2273462379\r\n 20\r\n178546.9086936534\r\n 30\r\n0.0\r\n 11\r\n527965.6217953812\r\n 21\r\n178338.9977436644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1420\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528324.307153484\r\n 20\r\n178023.1710512262\r\n 30\r\n0.0\r\n 11\r\n527964.202594872\r\n 21\r\n178345.8270295297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1421\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528451.1721830445\r\n 20\r\n177866.9365657112\r\n 30\r\n0.0\r\n 11\r\n528114.1337485903\r\n 21\r\n178217.6031442749\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1422\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528400.6852306725\r\n 20\r\n178075.5073020777\r\n 30\r\n0.0\r\n 11\r\n528289.9497653272\r\n 21\r\n178036.4280947665\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1423\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528354.6640913282\r\n 20\r\n178117.1854062772\r\n 30\r\n0.0\r\n 11\r\n528315.4415328623\r\n 21\r\n178014.5833020709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1424\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528222.6390442239\r\n 20\r\n178253.8333692926\r\n 30\r\n0.0\r\n 11\r\n528349.4000127607\r\n 21\r\n178096.5473615973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1425\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528428.5654308189\r\n 20\r\n178322.2134059058\r\n 30\r\n0.0\r\n 11\r\n528183.4244803492\r\n 21\r\n178147.7615489016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1426\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528498.0472897094\r\n 20\r\n178245.8844032025\r\n 30\r\n0.0\r\n 11\r\n528785.7765094022\r\n 21\r\n178228.4478699931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1427\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528753.2729735434\r\n 20\r\n178602.3532546211\r\n 30\r\n0.0\r\n 11\r\n528753.2634433724\r\n 21\r\n178602.3452663433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1428\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528526.2577362868\r\n 20\r\n178397.1155255769\r\n 30\r\n0.0\r\n 11\r\n528322.1082209895\r\n 21\r\n178240.946939484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1429\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528309.0585253266\r\n 20\r\n178241.8043823055\r\n 30\r\n0.0\r\n 11\r\n528324.8032623659\r\n 21\r\n178223.3149845974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528119.700557502\r\n 20\r\n178259.033853847\r\n 30\r\n0.0\r\n 11\r\n528088.1451886887\r\n 21\r\n178226.5008571775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528122.7167284986\r\n 20\r\n178274.2728957545\r\n 30\r\n0.0\r\n 11\r\n528116.1869921529\r\n 21\r\n178251.1102323525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528085.1330619262\r\n 20\r\n178326.1953176414\r\n 30\r\n0.0\r\n 11\r\n528125.5601604262\r\n 21\r\n178266.8024554597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528341.4937854892\r\n 20\r\n178311.3453024235\r\n 30\r\n0.0\r\n 11\r\n528553.6807481992\r\n 21\r\n178031.4052781823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528537.3680729672\r\n 20\r\n178174.4241490659\r\n 30\r\n0.0\r\n 11\r\n528381.2428563006\r\n 21\r\n178294.6069810829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n142F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528444.1633946261\r\n 20\r\n178700.1838262611\r\n 30\r\n0.0\r\n 11\r\n528548.3477819184\r\n 21\r\n178007.5561802428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1430\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528457.909674054\r\n 20\r\n178168.7824377468\r\n 30\r\n0.0\r\n 11\r\n528391.3999235287\r\n 21\r\n178103.2973762012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1431\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528419.1776495675\r\n 20\r\n178124.8365042053\r\n 30\r\n0.0\r\n 11\r\n528337.3406876953\r\n 21\r\n178108.8585846446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1432\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528412.535768426\r\n 20\r\n178136.1571237316\r\n 30\r\n0.0\r\n 11\r\n528385.9785806686\r\n 21\r\n178060.5339566718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1433\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528506.1565314453\r\n 20\r\n177944.3045508276\r\n 30\r\n0.0\r\n 11\r\n528381.8900450846\r\n 21\r\n178072.4776498863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1434\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528231.5376889895\r\n 20\r\n178494.3534429387\r\n 30\r\n0.0\r\n 11\r\n528249.142879486\r\n 21\r\n178450.7625355663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1435\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528302.8256281043\r\n 20\r\n178485.2660585849\r\n 30\r\n0.0\r\n 11\r\n528247.2586261313\r\n 21\r\n178451.0154244339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1436\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528470.8068808959\r\n 20\r\n178560.9105217073\r\n 30\r\n0.0\r\n 11\r\n528258.2996718624\r\n 21\r\n178351.1501406726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1437\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528160.1300526372\r\n 20\r\n178359.6639282912\r\n 30\r\n0.0\r\n 11\r\n528246.7934186207\r\n 21\r\n178217.2396902225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1438\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528104.5825630481\r\n 20\r\n178642.6588122643\r\n 30\r\n0.0\r\n 11\r\n527862.3107208053\r\n 21\r\n178536.2722331519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1439\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528974.2490269006\r\n 20\r\n177943.2169498362\r\n 30\r\n0.0\r\n 11\r\n529074.8116481313\r\n 21\r\n178075.7250287029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528936.7151588525\r\n 20\r\n177851.0977463463\r\n 30\r\n0.0\r\n 11\r\n529113.2393739193\r\n 21\r\n177797.3359449813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528285.5873183847\r\n 20\r\n178489.7153869756\r\n 30\r\n0.0\r\n 11\r\n528351.4611522887\r\n 21\r\n178392.8090836222\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529252.4513196267\r\n 20\r\n178461.4487730904\r\n 30\r\n0.0\r\n 11\r\n529327.0124102068\r\n 21\r\n178645.0375417232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530338.2961201331\r\n 20\r\n180788.7547084909\r\n 30\r\n0.0\r\n 11\r\n530435.1516274485\r\n 21\r\n181525.5409562457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530235.1318529886\r\n 20\r\n180967.1210590397\r\n 30\r\n0.0\r\n 11\r\n530240.08671063\r\n 21\r\n181114.8814870659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n143F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530375.6883102297\r\n 20\r\n181052.8292676401\r\n 30\r\n0.0\r\n 11\r\n529885.4674530158\r\n 21\r\n180988.268304624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1440\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530248.2643181117\r\n 20\r\n181083.2761554827\r\n 30\r\n0.0\r\n 11\r\n530207.1473563143\r\n 21\r\n181154.2021289139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1441\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530313.2478625071\r\n 20\r\n181129.4546631625\r\n 30\r\n0.0\r\n 11\r\n530236.6556469487\r\n 21\r\n181086.430704766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1442\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530302.7309378077\r\n 20\r\n181113.6080797556\r\n 30\r\n0.0\r\n 11\r\n530327.0365308518\r\n 21\r\n181310.9997992657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1443\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530425.0157447808\r\n 20\r\n181122.3984354473\r\n 30\r\n0.0\r\n 11\r\n530008.6308414541\r\n 21\r\n181241.0695507227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1444\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530272.6495276417\r\n 20\r\n181324.6466285585\r\n 30\r\n0.0\r\n 11\r\n530207.1171655377\r\n 21\r\n181149.8743530758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1445\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530330.580248871\r\n 20\r\n181306.824020257\r\n 30\r\n0.0\r\n 11\r\n530271.9023948822\r\n 21\r\n181324.2461364468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1446\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530381.021937737\r\n 20\r\n181599.9243260485\r\n 30\r\n0.0\r\n 11\r\n530291.3346635938\r\n 21\r\n181316.5479702797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1447\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530363.8961214457\r\n 20\r\n181533.6795228619\r\n 30\r\n0.0\r\n 11\r\n530253.9629897674\r\n 21\r\n181560.3723660222\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1448\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530279.057127295\r\n 20\r\n181637.8777809726\r\n 30\r\n0.0\r\n 11\r\n530048.2555749861\r\n 21\r\n180854.9627992806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1449\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530062.6450814385\r\n 20\r\n181149.7461893054\r\n 30\r\n0.0\r\n 11\r\n529624.7179966677\r\n 21\r\n181182.9672071196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530046.8518474741\r\n 20\r\n181082.0690086005\r\n 30\r\n0.0\r\n 11\r\n530083.9544910923\r\n 21\r\n181272.418455535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529975.7995744307\r\n 20\r\n181097.0347261711\r\n 30\r\n0.0\r\n 11\r\n529988.6233627915\r\n 21\r\n181160.0521535555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530020.6039639803\r\n 20\r\n181066.2153863765\r\n 30\r\n0.0\r\n 11\r\n529968.4198112056\r\n 21\r\n181111.0937745181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529987.8038513251\r\n 20\r\n181104.588180371\r\n 30\r\n0.0\r\n 11\r\n529584.6093016989\r\n 21\r\n181110.1786099761\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529891.407447771\r\n 20\r\n180921.3739107299\r\n 30\r\n0.0\r\n 11\r\n529869.9416690375\r\n 21\r\n181328.1304897638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n144F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529883.0140692269\r\n 20\r\n181325.5988206547\r\n 30\r\n0.0\r\n 11\r\n529644.197247677\r\n 21\r\n181327.1145507522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1450\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529976.892035066\r\n 20\r\n181491.4081337029\r\n 30\r\n0.0\r\n 11\r\n529868.3336776149\r\n 21\r\n181314.9939479675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1451\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530021.3585201078\r\n 20\r\n181416.4100260595\r\n 30\r\n0.0\r\n 11\r\n529940.0430461289\r\n 21\r\n181442.4698313734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1452\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529656.6301186837\r\n 20\r\n180661.1742274603\r\n 30\r\n0.0\r\n 11\r\n529783.4049957184\r\n 21\r\n180984.8427226674\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1453\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529635.2797641427\r\n 20\r\n180857.3255297743\r\n 30\r\n0.0\r\n 11\r\n529646.3277984724\r\n 21\r\n181329.3701150071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1454\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530052.2973304801\r\n 20\r\n181232.0162702387\r\n 30\r\n0.0\r\n 11\r\n529628.8914339743\r\n 21\r\n181255.737002807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1455\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529811.6546990779\r\n 20\r\n181697.3242248847\r\n 30\r\n0.0\r\n 11\r\n529630.6275680862\r\n 21\r\n181248.9813300898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1456\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529888.3275670068\r\n 20\r\n181938.7866450614\r\n 30\r\n0.0\r\n 11\r\n529708.694419197\r\n 21\r\n181430.1615783586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1457\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529903.2812325341\r\n 20\r\n181684.009864405\r\n 30\r\n0.0\r\n 11\r\n529786.6576949632\r\n 21\r\n181670.2811276199\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1458\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529880.3412750034\r\n 20\r\n181626.3143881118\r\n 30\r\n0.0\r\n 11\r\n529799.9115781909\r\n 21\r\n181701.1252479569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1459\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529822.0603907441\r\n 20\r\n181445.464678714\r\n 30\r\n0.0\r\n 11\r\n529866.519758919\r\n 21\r\n181642.5194831281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530070.7006040116\r\n 20\r\n181468.6318969595\r\n 30\r\n0.0\r\n 11\r\n529740.1085727789\r\n 21\r\n181523.3935734394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530060.3345732529\r\n 20\r\n181375.631093596\r\n 30\r\n0.0\r\n 11\r\n530066.4740637235\r\n 21\r\n181496.9149432353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530165.4248362273\r\n 20\r\n181471.7605166045\r\n 30\r\n0.0\r\n 11\r\n530108.9547541151\r\n 21\r\n181364.9950690455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530113.9712455618\r\n 20\r\n181369.490559017\r\n 30\r\n0.0\r\n 11\r\n530058.6420695524\r\n 21\r\n181376.9941032111\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530451.983915835\r\n 20\r\n181366.5037393104\r\n 30\r\n0.0\r\n 11\r\n529905.6668498683\r\n 21\r\n181500.873497438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n145F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529894.3310124588\r\n 20\r\n181494.3521053083\r\n 30\r\n0.0\r\n 11\r\n529900.3146067254\r\n 21\r\n181517.8882726195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1460\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529731.9521605782\r\n 20\r\n181395.4258543422\r\n 30\r\n0.0\r\n 11\r\n529689.2881019887\r\n 21\r\n181410.7201434047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1461\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529741.3762525003\r\n 20\r\n181383.0762722773\r\n 30\r\n0.0\r\n 11\r\n529725.3059075305\r\n 21\r\n181400.9896875065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1462\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529730.5252408357\r\n 20\r\n181319.9040835115\r\n 30\r\n0.0\r\n 11\r\n529740.6359545888\r\n 21\r\n181391.0352007434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1463\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529954.0963399314\r\n 20\r\n181446.2263190318\r\n 30\r\n0.0\r\n 11\r\n530031.1308153276\r\n 21\r\n181873.6873985594\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1464\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530045.6316110478\r\n 20\r\n181845.4314955982\r\n 30\r\n0.0\r\n 11\r\n529844.349988987\r\n 21\r\n181845.5760181434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1465\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530282.1062332428\r\n 20\r\n181618.2810391656\r\n 30\r\n0.0\r\n 11\r\n530013.5500333215\r\n 21\r\n181862.1296240347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1466\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530150.9915726047\r\n 20\r\n181836.8800974799\r\n 30\r\n0.0\r\n 11\r\n529982.3986712572\r\n 21\r\n181478.7707205962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1467\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530107.2600731355\r\n 20\r\n181448.3154505321\r\n 30\r\n0.0\r\n 11\r\n530115.4416801651\r\n 21\r\n181482.8850185999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1468\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529995.7589939005\r\n 20\r\n181625.5055781762\r\n 30\r\n0.0\r\n 11\r\n529907.1951239718\r\n 21\r\n181654.9721888375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1469\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529941.6226574095\r\n 20\r\n181647.8812763107\r\n 30\r\n0.0\r\n 11\r\n529861.1212243257\r\n 21\r\n181626.1533791875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529940.6503530184\r\n 20\r\n181634.7921344092\r\n 30\r\n0.0\r\n 11\r\n529883.4805572988\r\n 21\r\n181690.9683044021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529940.1267632553\r\n 20\r\n181848.2680882116\r\n 30\r\n0.0\r\n 11\r\n529885.0748283349\r\n 21\r\n181678.4452763864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530499.7067164951\r\n 20\r\n181670.0269107118\r\n 30\r\n0.0\r\n 11\r\n530431.0198845195\r\n 21\r\n181507.3047441572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530465.7497934597\r\n 20\r\n181560.5761427814\r\n 30\r\n0.0\r\n 11\r\n530221.4121484268\r\n 21\r\n181658.7491352089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529936.0586576352\r\n 20\r\n181233.4894753265\r\n 30\r\n0.0\r\n 11\r\n529932.6486109173\r\n 21\r\n181280.3774430722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n146F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529996.04332569\r\n 20\r\n181273.0671257869\r\n 30\r\n0.0\r\n 11\r\n529931.068716294\r\n 21\r\n181279.3199476997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1470\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530016.2143186337\r\n 20\r\n181227.8045961354\r\n 30\r\n0.0\r\n 11\r\n530037.8743831275\r\n 21\r\n181329.8525487859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1471\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530180.1685787403\r\n 20\r\n181279.2053078991\r\n 30\r\n0.0\r\n 11\r\n529896.9632612126\r\n 21\r\n181373.8281353093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1472\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529812.5960530011\r\n 20\r\n181322.917106081\r\n 30\r\n0.0\r\n 11\r\n529817.2569814127\r\n 21\r\n181391.6036367747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1473\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529848.9453069127\r\n 20\r\n181388.47346972\r\n 30\r\n0.0\r\n 11\r\n529788.9909870235\r\n 21\r\n181392.7221734328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1474\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529843.1416998106\r\n 20\r\n181382.1187467608\r\n 30\r\n0.0\r\n 11\r\n529848.9754071669\r\n 21\r\n181453.2133581997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1475\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529851.5886507226\r\n 20\r\n181450.5694416274\r\n 30\r\n0.0\r\n 11\r\n529795.7074865813\r\n 21\r\n181455.9439452276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1476\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529793.514654658\r\n 20\r\n181384.9006469958\r\n 30\r\n0.0\r\n 11\r\n529798.9941570257\r\n 21\r\n181462.2056458788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1477\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530343.3747185888\r\n 20\r\n181464.5652553773\r\n 30\r\n0.0\r\n 11\r\n530234.0562590772\r\n 21\r\n181492.0251343554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1478\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529887.4667406315\r\n 20\r\n181044.4103591459\r\n 30\r\n0.0\r\n 11\r\n529623.1064784813\r\n 21\r\n181033.123129424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1479\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529387.0340056964\r\n 20\r\n180728.3098706004\r\n 30\r\n0.0\r\n 11\r\n528799.8257840726\r\n 21\r\n180655.4140875558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529486.5268066528\r\n 20\r\n180641.3842100841\r\n 30\r\n0.0\r\n 11\r\n529452.9622144351\r\n 21\r\n180884.3232757525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530403.7387025317\r\n 20\r\n180950.4231390571\r\n 30\r\n0.0\r\n 11\r\n529098.342956821\r\n 21\r\n180757.7100933105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529461.139821917\r\n 20\r\n180852.7179441691\r\n 30\r\n0.0\r\n 11\r\n529420.0228601196\r\n 21\r\n180923.6439176005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529526.1233663122\r\n 20\r\n180898.896451849\r\n 30\r\n0.0\r\n 11\r\n529449.5311507541\r\n 21\r\n180855.8724934527\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529515.649079774\r\n 20\r\n180884.8716507115\r\n 30\r\n0.0\r\n 11\r\n529539.954672818\r\n 21\r\n181082.2633702215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n147F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529719.7424303435\r\n 20\r\n180868.5123586221\r\n 30\r\n0.0\r\n 11\r\n529221.5063452594\r\n 21\r\n181010.5113394093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1480\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529485.5250314471\r\n 20\r\n181094.088417245\r\n 30\r\n0.0\r\n 11\r\n529419.992669343\r\n 21\r\n180919.3161417624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1481\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529543.4557526762\r\n 20\r\n181076.2658089434\r\n 30\r\n0.0\r\n 11\r\n529484.7778986873\r\n 21\r\n181093.6879251331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1482\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529593.8974415423\r\n 20\r\n181369.3661147352\r\n 30\r\n0.0\r\n 11\r\n529504.210167399\r\n 21\r\n181085.9897589662\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1483\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529576.7716252509\r\n 20\r\n181303.1213115482\r\n 30\r\n0.0\r\n 11\r\n529466.8384935727\r\n 21\r\n181329.8141547087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1484\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529491.9326311002\r\n 20\r\n181407.3195696592\r\n 30\r\n0.0\r\n 11\r\n529276.8016459199\r\n 21\r\n180683.033535298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1485\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529275.5205852436\r\n 20\r\n180919.1879779918\r\n 30\r\n0.0\r\n 11\r\n528837.5935004729\r\n 21\r\n180952.4089958063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1486\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529259.7273512793\r\n 20\r\n180851.5107972869\r\n 30\r\n0.0\r\n 11\r\n529296.8299948975\r\n 21\r\n181041.8602442213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1487\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529188.6750782359\r\n 20\r\n180866.4765148574\r\n 30\r\n0.0\r\n 11\r\n529201.498866597\r\n 21\r\n180929.4939422421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1488\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529233.4794677856\r\n 20\r\n180835.6571750629\r\n 30\r\n0.0\r\n 11\r\n529181.2953150109\r\n 21\r\n180880.5355632046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1489\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529200.6793551305\r\n 20\r\n180874.0299690574\r\n 30\r\n0.0\r\n 11\r\n528797.4848055041\r\n 21\r\n180879.6203986625\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529104.2829515762\r\n 20\r\n180690.8156994162\r\n 30\r\n0.0\r\n 11\r\n529082.8171728428\r\n 21\r\n181097.5722784504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529095.8895730323\r\n 20\r\n181095.0406093412\r\n 30\r\n0.0\r\n 11\r\n528857.0727514823\r\n 21\r\n181096.5563394386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529189.7675388713\r\n 20\r\n181260.8499223896\r\n 30\r\n0.0\r\n 11\r\n529081.2091814203\r\n 21\r\n181084.435736654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529234.2340239129\r\n 20\r\n181185.851814746\r\n 30\r\n0.0\r\n 11\r\n529152.9185499342\r\n 21\r\n181211.9116200599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528974.9826614881\r\n 20\r\n180670.418543214\r\n 30\r\n0.0\r\n 11\r\n528974.9780985168\r\n 21\r\n180760.5411873043\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n148F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528848.1552679479\r\n 20\r\n180626.7673184608\r\n 30\r\n0.0\r\n 11\r\n528859.2033022775\r\n 21\r\n181098.8119036936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1490\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529265.1728342852\r\n 20\r\n181001.4580589253\r\n 30\r\n0.0\r\n 11\r\n528841.7669377794\r\n 21\r\n181025.1787914937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1491\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529048.6929366448\r\n 20\r\n181521.8496197857\r\n 30\r\n0.0\r\n 11\r\n528843.5030718915\r\n 21\r\n181018.4231187765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1492\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529116.1567363395\r\n 20\r\n181453.4516530914\r\n 30\r\n0.0\r\n 11\r\n528999.5331987682\r\n 21\r\n181439.7229163066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1493\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529093.2167788087\r\n 20\r\n181395.7561767984\r\n 30\r\n0.0\r\n 11\r\n529012.7870819961\r\n 21\r\n181470.5670366435\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1494\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529034.9358945496\r\n 20\r\n181214.9064674006\r\n 30\r\n0.0\r\n 11\r\n529079.3952627241\r\n 21\r\n181411.9612718146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1495\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529283.5761078168\r\n 20\r\n181238.073685646\r\n 30\r\n0.0\r\n 11\r\n528952.9840765841\r\n 21\r\n181292.8353621259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1496\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529273.2100770582\r\n 20\r\n181145.0728822825\r\n 30\r\n0.0\r\n 11\r\n529279.3495675287\r\n 21\r\n181266.3567319217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1497\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529378.3003400324\r\n 20\r\n181241.2023052909\r\n 30\r\n0.0\r\n 11\r\n529321.8302579203\r\n 21\r\n181134.4368577321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1498\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529326.8467493671\r\n 20\r\n181138.9323477035\r\n 30\r\n0.0\r\n 11\r\n529271.5175733577\r\n 21\r\n181146.4358918976\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1499\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529664.8594196403\r\n 20\r\n181135.9455279969\r\n 30\r\n0.0\r\n 11\r\n529118.5423536736\r\n 21\r\n181270.3152861244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529107.2065162641\r\n 20\r\n181263.7938939947\r\n 30\r\n0.0\r\n 11\r\n529113.1901105305\r\n 21\r\n181287.3300613058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528944.8276643835\r\n 20\r\n181164.8676430287\r\n 30\r\n0.0\r\n 11\r\n528902.163605794\r\n 21\r\n181180.1619320912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528954.2517563056\r\n 20\r\n181152.5180609637\r\n 30\r\n0.0\r\n 11\r\n528938.1814113358\r\n 21\r\n181170.431476193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528943.4007446409\r\n 20\r\n181089.3458721978\r\n 30\r\n0.0\r\n 11\r\n528953.5114583941\r\n 21\r\n181160.4769894299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529166.9718437365\r\n 20\r\n181215.6681077183\r\n 30\r\n0.0\r\n 11\r\n529223.4415039462\r\n 21\r\n181566.1891852296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n149F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529494.9817370479\r\n 20\r\n181387.7228278521\r\n 30\r\n0.0\r\n 11\r\n529346.9736344345\r\n 21\r\n181528.1516351163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529374.1904109175\r\n 20\r\n181543.2044757688\r\n 30\r\n0.0\r\n 11\r\n529195.2741750626\r\n 21\r\n181248.2125092826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529320.1355769406\r\n 20\r\n181217.7572392189\r\n 30\r\n0.0\r\n 11\r\n529328.3171839703\r\n 21\r\n181252.3268072863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529208.6344977056\r\n 20\r\n181394.9473668628\r\n 30\r\n0.0\r\n 11\r\n529120.0706277772\r\n 21\r\n181424.4139775238\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529154.4981612148\r\n 20\r\n181417.3230649972\r\n 30\r\n0.0\r\n 11\r\n529073.996728131\r\n 21\r\n181395.595167874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529153.5258568235\r\n 20\r\n181404.2339230956\r\n 30\r\n0.0\r\n 11\r\n529096.3560611041\r\n 21\r\n181460.4100930885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529139.4093974719\r\n 20\r\n181566.8543061548\r\n 30\r\n0.0\r\n 11\r\n529097.9503321401\r\n 21\r\n181447.8870650729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529677.5761621105\r\n 20\r\n181312.1744703976\r\n 30\r\n0.0\r\n 11\r\n529434.287652232\r\n 21\r\n181428.1909238953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529148.9341614404\r\n 20\r\n181002.931264013\r\n 30\r\n0.0\r\n 11\r\n529145.5241147225\r\n 21\r\n181049.8192317587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529208.9188294952\r\n 20\r\n181042.5089144736\r\n 30\r\n0.0\r\n 11\r\n529143.9442200992\r\n 21\r\n181048.7617363862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529229.089822439\r\n 20\r\n180997.2463848219\r\n 30\r\n0.0\r\n 11\r\n529250.7498869326\r\n 21\r\n181099.2943374726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529393.0440825455\r\n 20\r\n181048.6470965855\r\n 30\r\n0.0\r\n 11\r\n529109.8387650178\r\n 21\r\n181143.2699239959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529025.4715568064\r\n 20\r\n181092.3588947676\r\n 30\r\n0.0\r\n 11\r\n529030.132485218\r\n 21\r\n181161.0454254612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529061.8208107179\r\n 20\r\n181157.9152584065\r\n 30\r\n0.0\r\n 11\r\n529001.8664908287\r\n 21\r\n181162.1639621192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529056.0172036158\r\n 20\r\n181151.5605354473\r\n 30\r\n0.0\r\n 11\r\n529061.8509109723\r\n 21\r\n181222.6551468862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529064.4641545279\r\n 20\r\n181220.0112303138\r\n 30\r\n0.0\r\n 11\r\n529008.5829903865\r\n 21\r\n181225.3857339141\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529006.3901584631\r\n 20\r\n181154.3424356824\r\n 30\r\n0.0\r\n 11\r\n529011.869660831\r\n 21\r\n181231.6474345654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529556.2502223941\r\n 20\r\n181234.0070440637\r\n 30\r\n0.0\r\n 11\r\n529446.9317628824\r\n 21\r\n181261.4669230418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529100.3422444369\r\n 20\r\n180813.8521478327\r\n 30\r\n0.0\r\n 11\r\n528835.9819822866\r\n 21\r\n180802.5649181105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529045.3514116085\r\n 20\r\n181479.3920862135\r\n 30\r\n0.0\r\n 11\r\n528875.2749760494\r\n 21\r\n182028.5885954034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529273.1578980983\r\n 20\r\n181500.2911526591\r\n 30\r\n0.0\r\n 11\r\n529293.0655504569\r\n 21\r\n181668.9226533226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529727.9161891624\r\n 20\r\n181465.2266305704\r\n 30\r\n0.0\r\n 11\r\n528978.5941736404\r\n 21\r\n181562.118928557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529211.5230500173\r\n 20\r\n181601.0380815575\r\n 30\r\n0.0\r\n 11\r\n529164.4210874387\r\n 21\r\n182037.7150136904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529142.1935067098\r\n 20\r\n181605.8382328055\r\n 30\r\n0.0\r\n 11\r\n529336.0236311505\r\n 21\r\n181599.5612135245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529145.6385750521\r\n 20\r\n181678.3677420495\r\n 30\r\n0.0\r\n 11\r\n529209.8945070248\r\n 21\r\n181675.7560551536\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529122.3575251194\r\n 20\r\n181629.222470229\r\n 30\r\n0.0\r\n 11\r\n529158.3410628242\r\n 21\r\n181687.894785142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529155.0094566439\r\n 20\r\n181667.7214322521\r\n 30\r\n0.0\r\n 11\r\n529096.2395799927\r\n 21\r\n182066.648993784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528958.7689201024\r\n 20\r\n181733.6713150126\r\n 30\r\n0.0\r\n 11\r\n529356.8988662861\r\n 21\r\n181819.7192097903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529356.4839619108\r\n 20\r\n181806.4103837885\r\n 30\r\n0.0\r\n 11\r\n529319.9013057859\r\n 21\r\n182042.4135214028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529535.1406554567\r\n 20\r\n181740.1715234809\r\n 30\r\n0.0\r\n 11\r\n529343.6739983511\r\n 21\r\n181819.2120265032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529468.1921718079\r\n 20\r\n181684.3155929165\r\n 30\r\n0.0\r\n 11\r\n529480.9529403677\r\n 21\r\n181768.745934306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528903.8575074511\r\n 20\r\n181912.684482759\r\n 30\r\n0.0\r\n 11\r\n528992.8264165814\r\n 21\r\n181927.0589116806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529291.0906535335\r\n 20\r\n181624.3712904532\r\n 30\r\n0.0\r\n 11\r\n529246.996455296\r\n 21\r\n182046.1424701601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529712.0754532269\r\n 20\r\n181936.1278735951\r\n 30\r\n0.0\r\n 11\r\n529278.1139804708\r\n 21\r\n182031.483426149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529925.5796502365\r\n 20\r\n181905.6625871589\r\n 30\r\n0.0\r\n 11\r\n529431.9139545944\r\n 21\r\n181995.1722096143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529713.5411507648\r\n 20\r\n181843.550632553\r\n 30\r\n0.0\r\n 11\r\n529681.3926029392\r\n 21\r\n181956.4930895919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529652.9260736845\r\n 20\r\n181856.9976421366\r\n 30\r\n0.0\r\n 11\r\n529713.9554234051\r\n 21\r\n181948.3268234142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529465.0973098047\r\n 20\r\n181885.696672062\r\n 30\r\n0.0\r\n 11\r\n529666.720024011\r\n 21\r\n181873.2262078698\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529528.3837332418\r\n 20\r\n181678.1482808087\r\n 30\r\n0.0\r\n 11\r\n529528.9621030175\r\n 21\r\n181979.0256669608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529602.9486020106\r\n 20\r\n181625.6271380842\r\n 30\r\n0.0\r\n 11\r\n529485.9619619313\r\n 21\r\n181658.2092124433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529478.4882745172\r\n 20\r\n181556.3851261245\r\n 30\r\n0.0\r\n 11\r\n529597.6412726829\r\n 21\r\n181576.1409858726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529591.7886059378\r\n 20\r\n181572.8061832562\r\n 30\r\n0.0\r\n 11\r\n529602.1916801686\r\n 21\r\n181627.6641538704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529487.5869661725\r\n 20\r\n181251.2420300496\r\n 30\r\n0.0\r\n 11\r\n529487.587972784\r\n 21\r\n181251.2544245436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529499.4347171412\r\n 20\r\n181397.1243871717\r\n 30\r\n0.0\r\n 11\r\n529533.1281695744\r\n 21\r\n181811.994709275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529524.8827278017\r\n 20\r\n181822.1456922354\r\n 30\r\n0.0\r\n 11\r\n529549.0718544475\r\n 21\r\n181819.9914582276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529401.3310440504\r\n 20\r\n181966.6734615757\r\n 30\r\n0.0\r\n 11\r\n529409.6269396648\r\n 21\r\n182011.2303385892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529390.6421172938\r\n 20\r\n181955.4008163437\r\n 30\r\n0.0\r\n 11\r\n529405.7639595057\r\n 21\r\n181974.1218291566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529326.5479602904\r\n 20\r\n181956.0402892964\r\n 30\r\n0.0\r\n 11\r\n529398.3811817222\r\n 21\r\n181957.4006826129\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529486.9021456546\r\n 20\r\n181755.4714014451\r\n 30\r\n0.0\r\n 11\r\n529837.9909134975\r\n 21\r\n181744.2285632496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529804.2198961672\r\n 20\r\n181650.0413236167\r\n 30\r\n0.0\r\n 11\r\n529523.542947489\r\n 21\r\n181732.7203207542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529513.3862834716\r\n 20\r\n181604.6003171262\r\n 30\r\n0.0\r\n 11\r\n529548.8181221356\r\n 21\r\n181602.0354508805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.5307986297\r\n 20\r\n181742.9275861688\r\n 30\r\n0.0\r\n 11\r\n529685.4990405129\r\n 21\r\n181835.0567994266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529683.9882674731\r\n 20\r\n181799.9390878854\r\n 30\r\n0.0\r\n 11\r\n529649.7025155847\r\n 21\r\n181875.946123477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.9115523811\r\n 20\r\n181798.8119082378\r\n 30\r\n0.0\r\n 11\r\n529717.253377332\r\n 21\r\n181864.2074958406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529881.572860625\r\n 20\r\n181833.3672292052\r\n 30\r\n0.0\r\n 11\r\n529705.1447701149\r\n 21\r\n181860.6368429481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529274.0109237178\r\n 20\r\n181739.3577341212\r\n 30\r\n0.0\r\n 11\r\n529319.7552911159\r\n 21\r\n181750.200371683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529322.6466951995\r\n 20\r\n181686.4510941786\r\n 30\r\n0.0\r\n 11\r\n529318.4594131879\r\n 21\r\n181751.5914374181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529281.1794788938\r\n 20\r\n181659.3211196363\r\n 30\r\n0.0\r\n 11\r\n529385.3755203517\r\n 21\r\n181654.2095661979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529358.0648502905\r\n 20\r\n181505.6602194628\r\n 30\r\n0.0\r\n 11\r\n529406.3204206742\r\n 21\r\n181800.3297483763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529342.608506431\r\n 20\r\n181875.4998933934\r\n 30\r\n0.0\r\n 11\r\n529411.1594564413\r\n 21\r\n181881.850563048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529413.1219933337\r\n 20\r\n181850.0685497743\r\n 30\r\n0.0\r\n 11\r\n529407.7567111777\r\n 21\r\n181909.9332781541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529405.9231944706\r\n 20\r\n181854.7846556055\r\n 30\r\n0.0\r\n 11\r\n529477.0384147157\r\n 21\r\n181860.3615155338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529474.8450016534\r\n 20\r\n181857.3601365404\r\n 30\r\n0.0\r\n 11\r\n529471.2405749233\r\n 21\r\n181913.3833272983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529400.7565436811\r\n 20\r\n181904.2203542361\r\n 30\r\n0.0\r\n 11\r\n529477.9462196996\r\n 21\r\n181911.1371247718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529079.6029298196\r\n 20\r\n181757.1795881796\r\n 30\r\n0.0\r\n 11\r\n529026.3082474618\r\n 21\r\n182016.3579564733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530304.0548154939\r\n 20\r\n181048.7539546006\r\n 30\r\n0.0\r\n 11\r\n530588.3653885961\r\n 21\r\n180362.1664057763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530387.586207844\r\n 20\r\n180865.0913584818\r\n 30\r\n0.0\r\n 11\r\n529834.2934995411\r\n 21\r\n180781.9679262921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530250.5880801642\r\n 20\r\n180849.7596601176\r\n 30\r\n0.0\r\n 11\r\n530293.6298891184\r\n 21\r\n180708.320283045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530408.542233124\r\n 20\r\n180803.3646145163\r\n 30\r\n0.0\r\n 11\r\n529429.5724630821\r\n 21\r\n180667.1618954379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530293.3458882066\r\n 20\r\n180740.9651845166\r\n 30\r\n0.0\r\n 11\r\n530271.9939805481\r\n 21\r\n180661.812204194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530368.0695185732\r\n 20\r\n180713.1857914608\r\n 30\r\n0.0\r\n 11\r\n530282.9497682542\r\n 21\r\n180734.9126546915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530353.8084333581\r\n 20\r\n180725.7691677678\r\n 30\r\n0.0\r\n 11\r\n530428.3909564597\r\n 21\r\n180541.4007864436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530474.1995392441\r\n 20\r\n180748.9386734418\r\n 30\r\n0.0\r\n 11\r\n530102.7367198838\r\n 21\r\n180526.5098193058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530379.3916276373\r\n 20\r\n180514.1382142453\r\n 30\r\n0.0\r\n 11\r\n530270.8443368462\r\n 21\r\n180665.9845985361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530430.7327140616\r\n 20\r\n180546.3516690988\r\n 30\r\n0.0\r\n 11\r\n530378.566280631\r\n 21\r\n180514.3316143769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530555.3395872043\r\n 20\r\n180276.3048576078\r\n 30\r\n0.0\r\n 11\r\n530395.3428708616\r\n 21\r\n180526.7984042543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530521.6466092081\r\n 20\r\n180335.8569420938\r\n 30\r\n0.0\r\n 11\r\n530422.3727951547\r\n 21\r\n180281.6120238077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530466.6778245934\r\n 20\r\n180213.2463200424\r\n 30\r\n0.0\r\n 11\r\n530042.9464715477\r\n 21\r\n180903.4193199609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530131.2651613216\r\n 20\r\n180628.7038626293\r\n 30\r\n0.0\r\n 11\r\n529716.8712397313\r\n 21\r\n180483.2341223061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530098.4884788015\r\n 20\r\n180689.9844966847\r\n 30\r\n0.0\r\n 11\r\n530183.6084302914\r\n 21\r\n180515.7314853186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530033.7335854979\r\n 20\r\n180657.1332866572\r\n 30\r\n0.0\r\n 11\r\n530062.4356391981\r\n 21\r\n180599.58471747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530069.0309937571\r\n 20\r\n180698.501849582\r\n 30\r\n0.0\r\n 11\r\n530030.2454078206\r\n 21\r\n180641.642955409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530047.2841766509\r\n 20\r\n180652.9453499921\r\n 30\r\n0.0\r\n 11\r\n529659.2848141497\r\n 21\r\n180543.156496049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529906.7395476128\r\n 20\r\n180804.9550288512\r\n 30\r\n0.0\r\n 11\r\n529991.3169604977\r\n 21\r\n180406.5101073454\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530003.2881671689\r\n 20\r\n180412.339962063\r\n 30\r\n0.0\r\n 11\r\n529773.0067559511\r\n 21\r\n180349.0450701636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530136.8940016724\r\n 20\r\n180276.4897439913\r\n 30\r\n0.0\r\n 11\r\n529986.3626820854\r\n 21\r\n180418.7824132492\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530160.4269277974\r\n 20\r\n180360.44321819\r\n 30\r\n0.0\r\n 11\r\n530088.6310933923\r\n 21\r\n180314.2190045845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529656.0831902319\r\n 20\r\n180747.808326711\r\n 30\r\n0.0\r\n 11\r\n529775.6486375952\r\n 21\r\n180347.4180243195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530142.5703661036\r\n 20\r\n180546.5598761695\r\n 30\r\n0.0\r\n 11\r\n529739.7428308468\r\n 21\r\n180414.0260948585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530030.6034768476\r\n 20\r\n180034.8140560444\r\n 30\r\n0.0\r\n 11\r\n529739.6706909495\r\n 21\r\n180421.000911799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530167.1778184791\r\n 20\r\n179821.435804477\r\n 30\r\n0.0\r\n 11\r\n529861.9841355233\r\n 21\r\n180266.2102890804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530115.6586507159\r\n 20\r\n180071.3969923189\r\n 30\r\n0.0\r\n 11\r\n529999.4572098697\r\n 21\r\n180054.4632132203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530078.5632398818\r\n 20\r\n180121.1859482354\r\n 30\r\n0.0\r\n 11\r\n530020.2448667559\r\n 21\r\n180028.1022856727\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529975.4466945978\r\n 20\r\n180280.7799861815\r\n 30\r\n0.0\r\n 11\r\n530069.4085769443\r\n 21\r\n180101.9549431169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530221.6070836974\r\n 20\r\n180322.7768728894\r\n 30\r\n0.0\r\n 11\r\n529916.4653748503\r\n 21\r\n180184.2905203223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530563.4482295682\r\n 20\r\n180520.1388637834\r\n 30\r\n0.0\r\n 11\r\n530070.5480235035\r\n 21\r\n180248.9065734364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n14FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530057.9102858542\r\n 20\r\n180252.2707006923\r\n 30\r\n0.0\r\n 11\r\n530069.7834853323\r\n 21\r\n180231.0862321789\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1500\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529875.4556045341\r\n 20\r\n180305.7831659003\r\n 30\r\n0.0\r\n 11\r\n529838.2060363652\r\n 21\r\n180279.9644354035\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1501\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529881.3609942497\r\n 20\r\n180320.1516055526\r\n 30\r\n0.0\r\n 11\r\n529870.4764736164\r\n 21\r\n180298.6882963201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1502\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529854.5243826426\r\n 20\r\n180378.3604207361\r\n 30\r\n0.0\r\n 11\r\n529882.7065439429\r\n 21\r\n180312.2723873586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1503\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530103.1777825322\r\n 20\r\n180314.2290691114\r\n 30\r\n0.0\r\n 11\r\n530288.257365063\r\n 21\r\n179921.2878100911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1504\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530464.5492722588\r\n 20\r\n180232.9642966499\r\n 30\r\n0.0\r\n 11\r\n530268.2836737723\r\n 21\r\n179927.8997465798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1505\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530394.5016180104\r\n 20\r\n179987.8726226491\r\n 30\r\n0.0\r\n 11\r\n530138.940988989\r\n 21\r\n180290.1219519965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1506\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530189.8361350755\r\n 20\r\n180151.8493923363\r\n 30\r\n0.0\r\n 11\r\n530111.9210931672\r\n 21\r\n180100.4578906554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1507\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530143.3388728079\r\n 20\r\n180116.2204799576\r\n 30\r\n0.0\r\n 11\r\n530059.9568527525\r\n 21\r\n180116.3653020212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1508\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530139.0108783557\r\n 20\r\n180128.6115846532\r\n 30\r\n0.0\r\n 11\r\n530098.3346968596\r\n 21\r\n180059.5493237822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1509\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530256.6557167706\r\n 20\r\n179825.3268424936\r\n 30\r\n0.0\r\n 11\r\n530096.6323345037\r\n 21\r\n180072.058116419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530688.1274518463\r\n 20\r\n180239.3206435547\r\n 30\r\n0.0\r\n 11\r\n530579.6530818914\r\n 21\r\n180378.7110859745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530626.9910246668\r\n 20\r\n180336.2478352728\r\n 30\r\n0.0\r\n 11\r\n530416.4020727649\r\n 21\r\n180178.1620529922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530030.676524334\r\n 20\r\n180515.0421419232\r\n 30\r\n0.0\r\n 11\r\n530039.5222749266\r\n 21\r\n180468.8700439159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530098.862731711\r\n 20\r\n180492.3443019127\r\n 30\r\n0.0\r\n 11\r\n530037.7224595286\r\n 21\r\n180469.4824392266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530106.6272602049\r\n 20\r\n180541.2858756927\r\n 30\r\n0.0\r\n 11\r\n530153.9694919473\r\n 21\r\n180448.3253672619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n150F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530278.2990380709\r\n 20\r\n180534.0863436747\r\n 30\r\n0.0\r\n 11\r\n530029.2485366401\r\n 21\r\n180369.3666451558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1510\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529934.5768977602\r\n 20\r\n180396.698668686\r\n 30\r\n0.0\r\n 11\r\n529956.8621806169\r\n 21\r\n180331.5608922397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1511\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529986.6596079763\r\n 20\r\n180342.7885919839\r\n 30\r\n0.0\r\n 11\r\n529929.8495715699\r\n 21\r\n180323.1622902407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1512\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529979.4086186403\r\n 20\r\n180347.4240545212\r\n 30\r\n0.0\r\n 11\r\n530003.4501558765\r\n 21\r\n180280.2639443032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1513\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530005.289772253\r\n 20\r\n180283.4942923202\r\n 30\r\n0.0\r\n 11\r\n529952.7054835665\r\n 21\r\n180263.83513725\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1514\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529932.1939634152\r\n 20\r\n180331.8883243654\r\n 30\r\n0.0\r\n 11\r\n529957.5012727588\r\n 21\r\n180258.637878003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1515\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529486.6508263606\r\n 20\r\n180674.9791019966\r\n 30\r\n0.0\r\n 11\r\n529282.7583007949\r\n 21\r\n180545.4162611162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1516\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529735.3611681152\r\n 20\r\n180295.211299418\r\n 30\r\n0.0\r\n 11\r\n529455.1550969702\r\n 21\r\n180733.9066311564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1517\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529646.6994055041\r\n 20\r\n180232.1527618527\r\n 30\r\n0.0\r\n 11\r\n529251.3825813411\r\n 21\r\n180876.0442192342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1518\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529311.2867422323\r\n 20\r\n180647.6103044398\r\n 30\r\n0.0\r\n 11\r\n528896.8928206421\r\n 21\r\n180502.1405641166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1519\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529278.5100597123\r\n 20\r\n180708.8909384949\r\n 30\r\n0.0\r\n 11\r\n529363.6300112022\r\n 21\r\n180534.6379271289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529213.7551664087\r\n 20\r\n180676.0397284676\r\n 30\r\n0.0\r\n 11\r\n529242.4572201087\r\n 21\r\n180618.4911592803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529249.0525746678\r\n 20\r\n180717.4082913922\r\n 30\r\n0.0\r\n 11\r\n529210.2669887313\r\n 21\r\n180660.5493972194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529227.3057575616\r\n 20\r\n180671.8517918025\r\n 30\r\n0.0\r\n 11\r\n528839.3063950604\r\n 21\r\n180562.0629378591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529109.7181942716\r\n 20\r\n180716.2489171899\r\n 30\r\n0.0\r\n 11\r\n529171.3385414084\r\n 21\r\n180425.4165491558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529183.3097480795\r\n 20\r\n180431.2464038735\r\n 30\r\n0.0\r\n 11\r\n528953.028336862\r\n 21\r\n180367.951511974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n151F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529316.9155825832\r\n 20\r\n180295.3961858016\r\n 30\r\n0.0\r\n 11\r\n529166.3842629962\r\n 21\r\n180437.6888550596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1520\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529340.4485087083\r\n 20\r\n180379.3496600005\r\n 30\r\n0.0\r\n 11\r\n529268.6526743031\r\n 21\r\n180333.1254463949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1521\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528860.8199180713\r\n 20\r\n180692.1987855913\r\n 30\r\n0.0\r\n 11\r\n528955.670218506\r\n 21\r\n180366.3244661299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1522\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529322.5919470144\r\n 20\r\n180565.4663179799\r\n 30\r\n0.0\r\n 11\r\n528919.7644117577\r\n 21\r\n180432.9325366689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1523\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529248.2253256548\r\n 20\r\n180006.770937361\r\n 30\r\n0.0\r\n 11\r\n528919.6922718605\r\n 21\r\n180439.9073536093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1524\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529295.6802316267\r\n 20\r\n180090.3034341293\r\n 30\r\n0.0\r\n 11\r\n529179.4787907807\r\n 21\r\n180073.3696550306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1525\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529258.5848207927\r\n 20\r\n180140.0923900456\r\n 30\r\n0.0\r\n 11\r\n529200.2664476667\r\n 21\r\n180047.0087274829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1526\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529155.4682755085\r\n 20\r\n180299.686427992\r\n 30\r\n0.0\r\n 11\r\n529249.4301578551\r\n 21\r\n180120.8613849271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1527\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529401.6286646083\r\n 20\r\n180341.6833146997\r\n 30\r\n0.0\r\n 11\r\n529096.4869557612\r\n 21\r\n180203.1969621326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1528\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529367.5377231179\r\n 20\r\n180428.8292367399\r\n 30\r\n0.0\r\n 11\r\n529404.8688565344\r\n 21\r\n180313.2703686059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1529\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529417.7557216468\r\n 20\r\n180448.6471933713\r\n 30\r\n0.0\r\n 11\r\n529366.2558188828\r\n 21\r\n180427.0745044187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n152A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529743.4698104789\r\n 20\r\n180539.0453055938\r\n 30\r\n0.0\r\n 11\r\n529250.5696044141\r\n 21\r\n180267.8130152466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n152B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529237.9318667649\r\n 20\r\n180271.1771425025\r\n 30\r\n0.0\r\n 11\r\n529249.8050662433\r\n 21\r\n180249.9926739893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n152C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529055.4771854449\r\n 20\r\n180324.6896077105\r\n 30\r\n0.0\r\n 11\r\n529018.227617276\r\n 21\r\n180298.8708772138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n152D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529061.3825751605\r\n 20\r\n180339.058047363\r\n 30\r\n0.0\r\n 11\r\n529050.4980545273\r\n 21\r\n180317.5947381304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n152E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529034.5459635536\r\n 20\r\n180397.2668625465\r\n 30\r\n0.0\r\n 11\r\n529062.7281248536\r\n 21\r\n180331.178829169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n152F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529283.1993634429\r\n 20\r\n180333.1355109217\r\n 30\r\n0.0\r\n 11\r\n529428.495189928\r\n 21\r\n180009.1864854411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1530\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529644.5708531695\r\n 20\r\n180251.8707384601\r\n 30\r\n0.0\r\n 11\r\n529537.9671151138\r\n 21\r\n180077.9101355026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1531\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529568.1531303601\r\n 20\r\n180070.417110919\r\n 30\r\n0.0\r\n 11\r\n529318.9625698996\r\n 21\r\n180309.0283938069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1532\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529431.6815314825\r\n 20\r\n180370.7724530625\r\n 30\r\n0.0\r\n 11\r\n529448.5343991409\r\n 21\r\n180339.4998679173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1533\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529369.8577159862\r\n 20\r\n180170.7558341468\r\n 30\r\n0.0\r\n 11\r\n529291.9426740779\r\n 21\r\n180119.3643324658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1534\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529323.3604537187\r\n 20\r\n180135.1269217678\r\n 30\r\n0.0\r\n 11\r\n529239.9784336633\r\n 21\r\n180135.2717438316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1535\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529319.0324592666\r\n 20\r\n180147.5180264635\r\n 30\r\n0.0\r\n 11\r\n529278.3562777705\r\n 21\r\n180078.4557655923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1536\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529347.5005444616\r\n 20\r\n179986.7877196253\r\n 30\r\n0.0\r\n 11\r\n529276.6539154145\r\n 21\r\n180090.9645582292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1537\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529801.379483573\r\n 20\r\n180372.1177002053\r\n 30\r\n0.0\r\n 11\r\n529596.4236536755\r\n 21\r\n180197.0684948025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1538\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529210.6981052448\r\n 20\r\n180533.9485837334\r\n 30\r\n0.0\r\n 11\r\n529219.5438558373\r\n 21\r\n180487.776485726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1539\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529278.8843126219\r\n 20\r\n180511.2507437229\r\n 30\r\n0.0\r\n 11\r\n529217.7440404395\r\n 21\r\n180488.388881037\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n153A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529286.648841116\r\n 20\r\n180560.1923175028\r\n 30\r\n0.0\r\n 11\r\n529333.9910728581\r\n 21\r\n180467.2318090721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n153B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529458.3206189816\r\n 20\r\n180552.9927854849\r\n 30\r\n0.0\r\n 11\r\n529209.2701175509\r\n 21\r\n180388.2730869662\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n153C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529114.5984786709\r\n 20\r\n180415.6051104964\r\n 30\r\n0.0\r\n 11\r\n529136.8837615276\r\n 21\r\n180350.46733405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n153D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529166.6811888871\r\n 20\r\n180361.6950337942\r\n 30\r\n0.0\r\n 11\r\n529109.8711524805\r\n 21\r\n180342.0687320508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n153E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529159.4301995511\r\n 20\r\n180366.3304963314\r\n 30\r\n0.0\r\n 11\r\n529183.4717367871\r\n 21\r\n180299.1703861135\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n153F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529185.3113531638\r\n 20\r\n180302.4007341305\r\n 30\r\n0.0\r\n 11\r\n529132.7270644774\r\n 21\r\n180282.7415790602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1540\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529112.215544326\r\n 20\r\n180350.7947661756\r\n 30\r\n0.0\r\n 11\r\n529137.5228536697\r\n 21\r\n180277.5443198133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1541\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529663.9524871362\r\n 20\r\n180416.2079580638\r\n 30\r\n0.0\r\n 11\r\n529565.4709759887\r\n 21\r\n180361.3812993516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1542\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529234.0052739636\r\n 20\r\n180046.9156515399\r\n 30\r\n0.0\r\n 11\r\n529211.9176295402\r\n 21\r\n179472.4115735709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1543\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529289.9946326802\r\n 20\r\n180006.9883611616\r\n 30\r\n0.0\r\n 11\r\n529283.3608963961\r\n 21\r\n179779.775909238\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1544\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529459.4550720368\r\n 20\r\n180085.7093986373\r\n 30\r\n0.0\r\n 11\r\n529522.3434504139\r\n 21\r\n179927.9819454036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1545\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529889.6290109534\r\n 20\r\n180237.3174666211\r\n 30\r\n0.0\r\n 11\r\n529190.9426539895\r\n 21\r\n179949.7257856779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1546\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529426.0056714986\r\n 20\r\n179972.4400921852\r\n 30\r\n0.0\r\n 11\r\n529562.597765681\r\n 21\r\n179470.2487059042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1547\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529360.2828528293\r\n 20\r\n179949.8538544857\r\n 30\r\n0.0\r\n 11\r\n529545.8787654194\r\n 21\r\n180006.1004129726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1548\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529382.3886989727\r\n 20\r\n179880.6893421017\r\n 30\r\n0.0\r\n 11\r\n529443.7775062827\r\n 21\r\n179899.848153108\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1549\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529347.1775158107\r\n 20\r\n179922.1313209226\r\n 30\r\n0.0\r\n 11\r\n529397.1246658042\r\n 21\r\n179874.7758805751\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n154A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529388.6836782065\r\n 20\r\n179893.3988098539\r\n 30\r\n0.0\r\n 11\r\n529372.4531559766\r\n 21\r\n179574.1258653627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n154B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529616.4842112671\r\n 20\r\n179993.5565345598\r\n 30\r\n0.0\r\n 11\r\n529644.9627958351\r\n 21\r\n179574.1739714516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n154C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529810.4509426742\r\n 20\r\n180050.0314443105\r\n 30\r\n0.0\r\n 11\r\n529705.8888757529\r\n 21\r\n179988.2719131615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n154D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529672.3072657123\r\n 20\r\n180084.689110929\r\n 30\r\n0.0\r\n 11\r\n529792.5123713107\r\n 21\r\n180096.4561646946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n154E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529785.9958672843\r\n 20\r\n180098.1619758782\r\n 30\r\n0.0\r\n 11\r\n529810.2472230898\r\n 21\r\n180047.8679142512\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n154F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529602.0926766144\r\n 20\r\n180381.7833834248\r\n 30\r\n0.0\r\n 11\r\n529602.0968578984\r\n 21\r\n180381.7716721647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1550\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529651.3061089158\r\n 20\r\n180243.9426441503\r\n 30\r\n0.0\r\n 11\r\n529811.9088096871\r\n 21\r\n179631.7846855943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1551\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529603.1557238958\r\n 20\r\n179813.6619840299\r\n 30\r\n0.0\r\n 11\r\n530068.185463361\r\n 21\r\n179996.3275982037\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1552\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530011.1804052058\r\n 20\r\n180078.5598368081\r\n 30\r\n0.0\r\n 11\r\n529720.5177057797\r\n 21\r\n179934.7647016076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1553\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529718.4984998654\r\n 20\r\n180047.1531873395\r\n 30\r\n0.0\r\n 11\r\n529752.0581562893\r\n 21\r\n180058.8040753184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1554\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529435.4333691352\r\n 20\r\n179735.2093099271\r\n 30\r\n0.0\r\n 11\r\n529569.1663452307\r\n 21\r\n179856.3856726004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1555\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529555.4541606357\r\n 20\r\n179918.709878119\r\n 30\r\n0.0\r\n 11\r\n529568.2748068141\r\n 21\r\n179854.7065291475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1556\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529542.8570141844\r\n 20\r\n180102.5062273532\r\n 30\r\n0.0\r\n 11\r\n529639.4839479853\r\n 21\r\n179888.5549816735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1557\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530296.9455510268\r\n 20\r\n180360.090818716\r\n 30\r\n0.0\r\n 11\r\n530207.6100940128\r\n 21\r\n180500.4133324969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1558\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530370.2956111029\r\n 20\r\n180292.9007332187\r\n 30\r\n0.0\r\n 11\r\n530482.0169150562\r\n 21\r\n180439.7662500494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1559\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529849.8873611541\r\n 20\r\n180179.2781143133\r\n 30\r\n0.0\r\n 11\r\n529671.7765252076\r\n 21\r\n180289.0687592285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n155A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529545.2950098589\r\n 20\r\n179904.0897720795\r\n 30\r\n0.0\r\n 11\r\n529659.0471003351\r\n 21\r\n179932.2083697526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n155B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529907.5884870807\r\n 20\r\n180800.9556676964\r\n 30\r\n0.0\r\n 11\r\n529761.3216142649\r\n 21\r\n180934.635113062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n155C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528841.0342824628\r\n 20\r\n177209.4097422151\r\n 30\r\n0.0\r\n 11\r\n528278.3732090686\r\n 21\r\n180058.8817655076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n155D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528485.8015310987\r\n 20\r\n177965.2994590461\r\n 30\r\n0.0\r\n 11\r\n528596.9717934894\r\n 21\r\n177689.7755207768\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n155E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529032.856454134\r\n 20\r\n177908.0484599054\r\n 30\r\n0.0\r\n 11\r\n528503.1768036521\r\n 21\r\n177872.9737800619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n155F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528906.7072705641\r\n 20\r\n177706.0885696858\r\n 30\r\n0.0\r\n 11\r\n528825.4591571875\r\n 21\r\n177923.5636996254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1560\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528860.3990250182\r\n 20\r\n178075.2330047576\r\n 30\r\n0.0\r\n 11\r\n528542.6989520168\r\n 21\r\n178045.8936531997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1561\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528683.1105900724\r\n 20\r\n178484.8759271629\r\n 30\r\n0.0\r\n 11\r\n528457.5160371857\r\n 21\r\n178463.7198493692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1562\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528837.7525704118\r\n 20\r\n177866.8596032536\r\n 30\r\n0.0\r\n 11\r\n528845.8741515778\r\n 21\r\n178110.4093651077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1563\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528640.1476426235\r\n 20\r\n177832.0636059231\r\n 30\r\n0.0\r\n 11\r\n528597.9887555746\r\n 21\r\n178119.0803550255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1564\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528308.5306784712\r\n 20\r\n179869.5117948136\r\n 30\r\n0.0\r\n 11\r\n527876.8658865468\r\n 21\r\n183341.9964196203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1565\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529200.5279966597\r\n 20\r\n179727.7499392975\r\n 30\r\n0.0\r\n 11\r\n529456.3896473957\r\n 21\r\n179741.3193956278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1566\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528567.0355326954\r\n 20\r\n179468.0301035344\r\n 30\r\n0.0\r\n 11\r\n528446.0992009897\r\n 21\r\n179890.2364171706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1567\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528329.4294157617\r\n 20\r\n179431.7414473565\r\n 30\r\n0.0\r\n 11\r\n528689.4728478268\r\n 21\r\n179490.6504418413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1568\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528487.4440873934\r\n 20\r\n179531.1636308236\r\n 30\r\n0.0\r\n 11\r\n528550.9926992977\r\n 21\r\n179541.0236322006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1569\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528293.4081675153\r\n 20\r\n179549.2968853729\r\n 30\r\n0.0\r\n 11\r\n528667.3917369897\r\n 21\r\n179710.6907638414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n156A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528669.5576176427\r\n 20\r\n179697.5528052409\r\n 30\r\n0.0\r\n 11\r\n528588.0392999204\r\n 21\r\n179922.0311684939\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n156B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528857.6496070828\r\n 20\r\n179667.1027761433\r\n 30\r\n0.0\r\n 11\r\n528654.5144171252\r\n 21\r\n179707.6364226865\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n156C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528802.7626189134\r\n 20\r\n179599.3576436852\r\n 30\r\n0.0\r\n 11\r\n528798.9599687946\r\n 21\r\n179684.662154782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n156D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528230.9063274992\r\n 20\r\n179641.3158552055\r\n 30\r\n0.0\r\n 11\r\n528315.4178125222\r\n 21\r\n179672.619208027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n156E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528144.3947346573\r\n 20\r\n179767.238579988\r\n 30\r\n0.0\r\n 11\r\n528590.8943973097\r\n 21\r\n179920.8165756824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n156F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528640.591098345\r\n 20\r\n179506.3056953474\r\n 30\r\n0.0\r\n 11\r\n528515.7889399241\r\n 21\r\n179911.5952802161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1570\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528993.3627290027\r\n 20\r\n179893.5685844917\r\n 30\r\n0.0\r\n 11\r\n528510.0567151904\r\n 21\r\n179907.6210035374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1571\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529246.4236587767\r\n 20\r\n179905.5266301457\r\n 30\r\n0.0\r\n 11\r\n528707.0717858409\r\n 21\r\n179897.3361826018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1572\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529012.6984706571\r\n 20\r\n179803.0212326646\r\n 30\r\n0.0\r\n 11\r\n528959.3215812568\r\n 21\r\n179907.6177689707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1573\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528950.6272643358\r\n 20\r\n179804.4960146925\r\n 30\r\n0.0\r\n 11\r\n528992.8488439449\r\n 21\r\n179905.9008424644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1574\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528760.793710597\r\n 20\r\n179796.3412164605\r\n 30\r\n0.0\r\n 11\r\n528961.0235601997\r\n 21\r\n179823.0851632388\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1575\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528902.3510568863\r\n 20\r\n179387.5366045096\r\n 30\r\n0.0\r\n 11\r\n528805.4106229107\r\n 21\r\n179900.2562983138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1576\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528831.7373683648\r\n 20\r\n179745.5473126478\r\n 30\r\n0.0\r\n 11\r\n528855.8866233021\r\n 21\r\n179748.1101349233\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1577\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528682.5754239966\r\n 20\r\n179863.462574682\r\n 30\r\n0.0\r\n 11\r\n528682.1007574591\r\n 21\r\n179908.782679105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1578\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528674.2674593516\r\n 20\r\n179850.3361353631\r\n 30\r\n0.0\r\n 11\r\n528685.4847378287\r\n 21\r\n179871.6274269207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1579\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528611.2588529547\r\n 20\r\n179838.572402642\r\n 30\r\n0.0\r\n 11\r\n528681.4738928051\r\n 21\r\n179853.7944442277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n157A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528807.3632662322\r\n 20\r\n179672.788197632\r\n 30\r\n0.0\r\n 11\r\n529234.9711792036\r\n 21\r\n179749.003403953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n157B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529213.5100731744\r\n 20\r\n179725.592080696\r\n 30\r\n0.0\r\n 11\r\n529143.7416550763\r\n 21\r\n179914.3953648365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n157C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529242.0818526643\r\n 20\r\n179623.8202706216\r\n 30\r\n0.0\r\n 11\r\n528847.7112173356\r\n 21\r\n179657.5499932291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n157D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528989.9527050682\r\n 20\r\n179695.9814363166\r\n 30\r\n0.0\r\n 11\r\n528986.8274817843\r\n 21\r\n179789.2663395969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n157E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528992.1344180404\r\n 20\r\n179754.519073134\r\n 30\r\n0.0\r\n 11\r\n528943.8012646047\r\n 21\r\n179822.4638192218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n157F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528979.5223181569\r\n 20\r\n179750.8850742235\r\n 30\r\n0.0\r\n 11\r\n529012.3471308522\r\n 21\r\n179824.0060649801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1580\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529179.5288811444\r\n 20\r\n179825.5150397874\r\n 30\r\n0.0\r\n 11\r\n529001.157264609\r\n 21\r\n179818.1618520918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1581\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528601.6035857312\r\n 20\r\n179615.8208689909\r\n 30\r\n0.0\r\n 11\r\n528644.3887794168\r\n 21\r\n179635.3025819352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1582\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528659.5501022991\r\n 20\r\n179573.3149631039\r\n 30\r\n0.0\r\n 11\r\n528642.8484182783\r\n 21\r\n179636.4168759029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1583\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528624.1101531263\r\n 20\r\n179538.6800739106\r\n 30\r\n0.0\r\n 11\r\n528727.328670395\r\n 21\r\n179553.8088784535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1584\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528729.2518578581\r\n 20\r\n179402.7821176971\r\n 30\r\n0.0\r\n 11\r\n528719.6294310883\r\n 21\r\n179701.221626218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1585\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528642.5870527347\r\n 20\r\n179762.6563937042\r\n 30\r\n0.0\r\n 11\r\n528708.6169873843\r\n 21\r\n179782.1400145828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1586\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528716.6868262284\r\n 20\r\n179751.3370014214\r\n 30\r\n0.0\r\n 11\r\n528699.849285463\r\n 21\r\n179809.0350878508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1587\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528708.7120860384\r\n 20\r\n179754.5724114705\r\n 30\r\n0.0\r\n 11\r\n528777.4075127313\r\n 21\r\n179773.7925641406\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1588\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528775.8357279267\r\n 20\r\n179770.4237617937\r\n 30\r\n0.0\r\n 11\r\n528761.4684964741\r\n 21\r\n179824.6932049007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1589\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528694.0856440736\r\n 20\r\n179802.0766194414\r\n 30\r\n0.0\r\n 11\r\n528768.4818868498\r\n 21\r\n179823.7857617378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n158A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528032.8196453648\r\n 20\r\n179780.2768232606\r\n 30\r\n0.0\r\n 11\r\n527664.9026817615\r\n 21\r\n180480.5680652355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n158B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527966.1101532396\r\n 20\r\n179900.9142619889\r\n 30\r\n0.0\r\n 11\r\n528106.3942065767\r\n 21\r\n179947.5841568255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n158C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528095.2980045713\r\n 20\r\n179798.8725363961\r\n 30\r\n0.0\r\n 11\r\n527864.5046873172\r\n 21\r\n180236.1585429227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n158D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528079.5961462748\r\n 20\r\n179928.9392054262\r\n 30\r\n0.0\r\n 11\r\n528131.8277353538\r\n 21\r\n179992.1290729441\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n158E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528145.4687386187\r\n 20\r\n179884.0380117714\r\n 30\r\n0.0\r\n 11\r\n528078.5227200158\r\n 21\r\n179940.9208657209\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n158F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528184.2186491791\r\n 20\r\n179691.9183107798\r\n 30\r\n0.0\r\n 11\r\n528144.3445608914\r\n 21\r\n180208.4577227396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1590\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528542.1229614001\r\n 20\r\n179976.9272516323\r\n 30\r\n0.0\r\n 11\r\n528528.9751991945\r\n 21\r\n180089.2879995186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1591\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528610.3714329076\r\n 20\r\n180092.6729991083\r\n 30\r\n0.0\r\n 11\r\n527856.4539530258\r\n 21\r\n180042.873060517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1592\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528077.4643446711\r\n 20\r\n180126.0894573699\r\n 30\r\n0.0\r\n 11\r\n527913.1918958154\r\n 21\r\n180598.8407671337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1593\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528008.5147488142\r\n 20\r\n180117.3957666466\r\n 30\r\n0.0\r\n 11\r\n528199.9016598025\r\n 21\r\n180148.7097956767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1594\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527997.8728993692\r\n 20\r\n180189.2229846591\r\n 30\r\n0.0\r\n 11\r\n528061.4215112735\r\n 21\r\n180199.0829860361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1595\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527984.5321776591\r\n 20\r\n180136.5040111058\r\n 30\r\n0.0\r\n 11\r\n528008.4939101981\r\n 21\r\n180201.0260298027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1596\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528009.1252140441\r\n 20\r\n180180.5891704056\r\n 30\r\n0.0\r\n 11\r\n527962.1366878985\r\n 21\r\n180313.0783112867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1597\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527803.836979491\r\n 20\r\n180207.3562392084\r\n 30\r\n0.0\r\n 11\r\n528536.4916803161\r\n 21\r\n180520.438294822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1598\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528179.9864296183\r\n 20\r\n180355.6121590764\r\n 30\r\n0.0\r\n 11\r\n528072.0206366862\r\n 21\r\n180647.9226835457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1599\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527738.2754529142\r\n 20\r\n180314.0862154856\r\n 30\r\n0.0\r\n 11\r\n527822.7869379371\r\n 21\r\n180345.389568307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528151.0199103206\r\n 20\r\n180164.3650491832\r\n 30\r\n0.0\r\n 11\r\n528012.2358912885\r\n 21\r\n180615.0601186566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528379.2990357547\r\n 20\r\n180229.2825058204\r\n 30\r\n0.0\r\n 11\r\n528307.1084452349\r\n 21\r\n180651.417205561\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528415.9452134922\r\n 20\r\n179836.2631906246\r\n 30\r\n0.0\r\n 11\r\n528352.2185272204\r\n 21\r\n180395.2412563144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528317.7920782079\r\n 20\r\n180330.8475514675\r\n 30\r\n0.0\r\n 11\r\n528836.3191207583\r\n 21\r\n180433.2372557007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528593.0534033489\r\n 20\r\n180083.0078457863\r\n 30\r\n0.0\r\n 11\r\n528673.3390309509\r\n 21\r\n180270.5734778979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n159F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528696.9071551498\r\n 20\r\n180250.2785411998\r\n 30\r\n0.0\r\n 11\r\n528358.1400293112\r\n 21\r\n180315.6093470646\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528500.3815170438\r\n 20\r\n180354.0407901521\r\n 30\r\n0.0\r\n 11\r\n528492.0712026886\r\n 21\r\n180568.5503232738\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528637.5468404127\r\n 20\r\n180478.6593455293\r\n 30\r\n0.0\r\n 11\r\n528473.9315714308\r\n 21\r\n180507.4188145933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528585.6214509289\r\n 20\r\n179885.5412803603\r\n 30\r\n0.0\r\n 11\r\n528609.9239068013\r\n 21\r\n180153.9784371766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528112.0323977069\r\n 20\r\n180273.8802228265\r\n 30\r\n0.0\r\n 11\r\n528154.8175913925\r\n 21\r\n180293.3619357707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528169.9789142748\r\n 20\r\n180231.3743169395\r\n 30\r\n0.0\r\n 11\r\n528153.277230254\r\n 21\r\n180294.4762297385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528134.5389651021\r\n 20\r\n180196.7394277462\r\n 30\r\n0.0\r\n 11\r\n528237.7574823708\r\n 21\r\n180211.8682322892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528470.1836627297\r\n 20\r\n179972.1683387392\r\n 30\r\n0.0\r\n 11\r\n528457.968665224\r\n 21\r\n180084.2190610903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527917.8465889796\r\n 20\r\n180253.7815098684\r\n 30\r\n0.0\r\n 11\r\n527769.6882990085\r\n 21\r\n180564.6440479685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528587.8134982101\r\n 20\r\n180513.8955553372\r\n 30\r\n0.0\r\n 11\r\n528889.8979239679\r\n 21\r\n180694.7831536562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528746.6298662342\r\n 20\r\n179891.4887384752\r\n 30\r\n0.0\r\n 11\r\n528569.28154252\r\n 21\r\n180662.4882546429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528937.5113190281\r\n 20\r\n180167.75196714\r\n 30\r\n0.0\r\n 11\r\n528958.2724492294\r\n 21\r\n180403.8740448904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528861.8812511615\r\n 20\r\n180211.1348817101\r\n 30\r\n0.0\r\n 11\r\n528945.4880698681\r\n 21\r\n180228.4905616793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529096.4131830083\r\n 20\r\n180036.3587612945\r\n 30\r\n0.0\r\n 11\r\n529191.1606691565\r\n 21\r\n180105.7305249874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529087.9719335948\r\n 20\r\n180097.870995399\r\n 30\r\n0.0\r\n 11\r\n529194.8115817942\r\n 21\r\n180072.3584405921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528875.4199148993\r\n 20\r\n180169.4182922914\r\n 30\r\n0.0\r\n 11\r\n529120.3480046597\r\n 21\r\n180209.4214413092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528853.6459178629\r\n 20\r\n180064.3840401553\r\n 30\r\n0.0\r\n 11\r\n528843.571176086\r\n 21\r\n180185.404555378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528745.4894377002\r\n 20\r\n180157.0501350272\r\n 30\r\n0.0\r\n 11\r\n528805.3967661827\r\n 21\r\n180052.1747663256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528800.2369369359\r\n 20\r\n180056.5049832557\r\n 30\r\n0.0\r\n 11\r\n528855.293267494\r\n 21\r\n180065.8012921374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528462.4995255942\r\n 20\r\n180042.543345193\r\n 30\r\n0.0\r\n 11\r\n528462.5114981981\r\n 21\r\n180042.5467057729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528603.4162683148\r\n 20\r\n180082.0971432843\r\n 30\r\n0.0\r\n 11\r\n529004.1650332488\r\n 21\r\n180194.5829659595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528935.105918802\r\n 20\r\n180218.3014888331\r\n 30\r\n0.0\r\n 11\r\n529046.4939790572\r\n 21\r\n179885.1612415667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528946.4408303008\r\n 20\r\n179884.1195385687\r\n 30\r\n0.0\r\n 11\r\n528926.4960903486\r\n 21\r\n180176.0400302016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528802.8234097638\r\n 20\r\n180141.0691676066\r\n 30\r\n0.0\r\n 11\r\n528812.7234634602\r\n 21\r\n180106.951977412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528987.1160488407\r\n 20\r\n180041.746183423\r\n 30\r\n0.0\r\n 11\r\n529078.7091752371\r\n 21\r\n180059.7055653025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529045.2526401881\r\n 20\r\n180048.9261236859\r\n 30\r\n0.0\r\n 11\r\n529104.6214666463\r\n 21\r\n180107.4746051942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529039.6541528286\r\n 20\r\n180060.7974315682\r\n 30\r\n0.0\r\n 11\r\n529117.0735198138\r\n 21\r\n180040.0516070889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529145.2200757285\r\n 20\r\n179875.2493436762\r\n 30\r\n0.0\r\n 11\r\n529109.5198685039\r\n 21\r\n180050.1664616459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528656.0994813299\r\n 20\r\n180252.361482507\r\n 30\r\n0.0\r\n 11\r\n528949.1865447303\r\n 21\r\n180309.4465471946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528556.1696433956\r\n 20\r\n179206.5726048524\r\n 30\r\n0.0\r\n 11\r\n528172.098326215\r\n 21\r\n178845.8468364899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528412.9488724005\r\n 20\r\n179064.4555633811\r\n 30\r\n0.0\r\n 11\r\n528042.393364479\r\n 21\r\n179763.3542192984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528350.9928183259\r\n 20\r\n179187.6017989144\r\n 30\r\n0.0\r\n 11\r\n528233.3053349589\r\n 21\r\n179098.1179961152\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528362.3421411069\r\n 20\r\n179023.3665786782\r\n 30\r\n0.0\r\n 11\r\n528131.5488238528\r\n 21\r\n179460.6525852049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528263.8196623647\r\n 20\r\n179109.7217055041\r\n 30\r\n0.0\r\n 11\r\n528182.1780688058\r\n 21\r\n179102.2552166527\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528263.7204491684\r\n 20\r\n179030.0015338379\r\n 30\r\n0.0\r\n 11\r\n528254.5333524718\r\n 21\r\n179117.3687229567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528270.5677959786\r\n 20\r\n179047.7450890754\r\n 30\r\n0.0\r\n 11\r\n528123.5772799061\r\n 21\r\n178913.7747902436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528334.1062798096\r\n 20\r\n178942.8942166801\r\n 30\r\n0.0\r\n 11\r\n527996.5153470805\r\n 21\r\n179213.9875280292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528080.9944494109\r\n 20\r\n178950.2560815439\r\n 30\r\n0.0\r\n 11\r\n528185.6914929178\r\n 21\r\n179104.7823506414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528129.0332797841\r\n 20\r\n178913.2982054521\r\n 30\r\n0.0\r\n 11\r\n528080.8891733374\r\n 21\r\n178951.0972225784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527919.0704511244\r\n 20\r\n178702.6616373729\r\n 30\r\n0.0\r\n 11\r\n528098.4063959493\r\n 21\r\n178939.6945149362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527963.2144118462\r\n 20\r\n178754.9395319815\r\n 30\r\n0.0\r\n 11\r\n527877.8686801754\r\n 21\r\n178829.1952213407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527829.1451973728\r\n 20\r\n178763.9048904451\r\n 30\r\n0.0\r\n 11\r\n528367.6663100075\r\n 21\r\n179447.3825729228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528102.2562094361\r\n 20\r\n179222.726205845\r\n 30\r\n0.0\r\n 11\r\n527821.9244401856\r\n 21\r\n179560.8058809949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528148.3393523888\r\n 20\r\n179274.7451539584\r\n 30\r\n0.0\r\n 11\r\n528014.4941754031\r\n 21\r\n179134.4063257267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528095.0439254675\r\n 20\r\n179324.060422145\r\n 30\r\n0.0\r\n 11\r\n528051.0454544846\r\n 21\r\n179277.1586071135\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528146.0961385644\r\n 20\r\n179305.3271211492\r\n 30\r\n0.0\r\n 11\r\n528079.3063470841\r\n 21\r\n179321.9517798538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528095.8227038843\r\n 20\r\n179309.8988248382\r\n 30\r\n0.0\r\n 11\r\n527858.117585589\r\n 21\r\n179635.618603924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528189.5603870874\r\n 20\r\n179494.4875080394\r\n 30\r\n0.0\r\n 11\r\n527845.2894322208\r\n 21\r\n179276.7968929931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527854.9139456695\r\n 20\r\n179267.5954944\r\n 30\r\n0.0\r\n 11\r\n527715.583363013\r\n 21\r\n179461.5613687941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527773.9200939974\r\n 20\r\n179095.1257963224\r\n 30\r\n0.0\r\n 11\r\n527855.0772710858\r\n 21\r\n179285.7048993431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527860.8208356485\r\n 20\r\n179102.2142053516\r\n 30\r\n0.0\r\n 11\r\n527792.5395133066\r\n 21\r\n179153.4877929055\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528103.2485123857\r\n 20\r\n179660.6538035126\r\n 30\r\n0.0\r\n 11\r\n528029.7179450116\r\n 21\r\n179608.5448152255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528093.7114108572\r\n 20\r\n179740.4886445803\r\n 30\r\n0.0\r\n 11\r\n527714.9751008977\r\n 21\r\n179458.5188642339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528029.1514078468\r\n 20\r\n179183.5965476397\r\n 30\r\n0.0\r\n 11\r\n527764.9673537545\r\n 21\r\n179515.3223559707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527561.7116223148\r\n 20\r\n179235.727857901\r\n 30\r\n0.0\r\n 11\r\n527731.416867063\r\n 21\r\n179465.5009430376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527497.8881053979\r\n 20\r\n178896.5468150255\r\n 30\r\n0.0\r\n 11\r\n527636.6605627178\r\n 21\r\n179093.1155555411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528150.5433908066\r\n 20\r\n178779.7398498826\r\n 30\r\n0.0\r\n 11\r\n527725.0122292528\r\n 21\r\n179147.7626739199\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527710.5941368728\r\n 20\r\n179350.4647146638\r\n 30\r\n0.0\r\n 11\r\n527660.2530446807\r\n 21\r\n179387.3596132032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527726.1191382208\r\n 20\r\n179349.9169748675\r\n 30\r\n0.0\r\n 11\r\n527702.2116554058\r\n 21\r\n179352.6699183981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527771.3846162575\r\n 20\r\n179395.2987596021\r\n 30\r\n0.0\r\n 11\r\n527719.1976540189\r\n 21\r\n179345.9187702994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527688.9518843426\r\n 20\r\n178680.2527148979\r\n 30\r\n0.0\r\n 11\r\n527468.4287123164\r\n 21\r\n178736.4905809727\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527846.8966185731\r\n 20\r\n178772.7488930398\r\n 30\r\n0.0\r\n 11\r\n527661.1723446485\r\n 21\r\n178663.9843583443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527960.7353715366\r\n 20\r\n179277.5797662137\r\n 30\r\n0.0\r\n 11\r\n527920.5092777147\r\n 21\r\n179253.2493055979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527963.1310070435\r\n 20\r\n179205.7548976227\r\n 30\r\n0.0\r\n 11\r\n527920.45848973\r\n 21\r\n179255.1497750304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528011.7228479952\r\n 20\r\n179215.4707887154\r\n 30\r\n0.0\r\n 11\r\n527940.9902370524\r\n 21\r\n179138.7906688454\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528064.5920592017\r\n 20\r\n179051.9841559795\r\n 30\r\n0.0\r\n 11\r\n527823.6313370143\r\n 21\r\n179228.3266117468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527816.3831984929\r\n 20\r\n179326.5977835442\r\n 30\r\n0.0\r\n 11\r\n527763.0393937672\r\n 21\r\n179283.0776474026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527783.9167134486\r\n 20\r\n179259.0342399549\r\n 30\r\n0.0\r\n 11\r\n527745.7822294013\r\n 21\r\n179305.4921034771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527785.7454205332\r\n 20\r\n179267.4437696493\r\n 30\r\n0.0\r\n 11\r\n527731.1150967461\r\n 21\r\n179221.5743502057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527734.7832638241\r\n 20\r\n179220.9711197252\r\n 30\r\n0.0\r\n 11\r\n527698.085549146\r\n 21\r\n179263.4548522845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527754.7793158943\r\n 20\r\n179306.3241367128\r\n 30\r\n0.0\r\n 11\r\n527694.8773368726\r\n 21\r\n179257.1525930337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527996.7755258292\r\n 20\r\n179885.2276632219\r\n 30\r\n0.0\r\n 11\r\n527915.1339322702\r\n 21\r\n179877.7611743706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527996.6763126328\r\n 20\r\n179805.5074915559\r\n 30\r\n0.0\r\n 11\r\n527987.4892159362\r\n 21\r\n179892.8746806747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528002.0619858726\r\n 20\r\n179822.162828514\r\n 30\r\n0.0\r\n 11\r\n527855.0714698003\r\n 21\r\n179688.1925296822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528133.4243398228\r\n 20\r\n179665.1097987787\r\n 30\r\n0.0\r\n 11\r\n527729.4712105449\r\n 21\r\n179989.493485747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527813.9503128752\r\n 20\r\n179725.7620392616\r\n 30\r\n0.0\r\n 11\r\n527918.647356382\r\n 21\r\n179880.2883083592\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527861.9891432484\r\n 20\r\n179688.8041631699\r\n 30\r\n0.0\r\n 11\r\n527813.8450368016\r\n 21\r\n179726.6031802962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527652.026314589\r\n 20\r\n179478.1675950908\r\n 30\r\n0.0\r\n 11\r\n527831.3622594136\r\n 21\r\n179715.2004726541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527629.3243400914\r\n 20\r\n179620.5471731373\r\n 30\r\n0.0\r\n 11\r\n528028.6230273386\r\n 21\r\n180133.7414422995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527835.2120729005\r\n 20\r\n179998.2321635629\r\n 30\r\n0.0\r\n 11\r\n527665.7953887408\r\n 21\r\n180202.5484196148\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527881.2952158531\r\n 20\r\n180050.2511116761\r\n 30\r\n0.0\r\n 11\r\n527747.4500388677\r\n 21\r\n179909.9122834445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527827.999788932\r\n 20\r\n180099.566379863\r\n 30\r\n0.0\r\n 11\r\n527784.0013179489\r\n 21\r\n180052.6645648313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527879.0520020287\r\n 20\r\n180080.8330788671\r\n 30\r\n0.0\r\n 11\r\n527812.2622105485\r\n 21\r\n180097.4577375718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527828.7785673487\r\n 20\r\n180085.4047825559\r\n 30\r\n0.0\r\n 11\r\n527591.0734490533\r\n 21\r\n180411.1245616417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527829.5747659578\r\n 20\r\n180211.0921162493\r\n 30\r\n0.0\r\n 11\r\n527578.2452956853\r\n 21\r\n180052.3028507109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527587.8698091339\r\n 20\r\n180043.1014521177\r\n 30\r\n0.0\r\n 11\r\n527448.5392264774\r\n 21\r\n180237.0673265123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527769.4617253289\r\n 20\r\n179761.6104608084\r\n 30\r\n0.0\r\n 11\r\n527470.9605082231\r\n 21\r\n179966.4096719633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527762.1072713112\r\n 20\r\n179959.1025053575\r\n 30\r\n0.0\r\n 11\r\n527472.4656967936\r\n 21\r\n180317.9957862653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527343.0535079231\r\n 20\r\n179830.5261404157\r\n 30\r\n0.0\r\n 11\r\n527590.952526175\r\n 21\r\n180062.8786122959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527447.3543171115\r\n 20\r\n179807.1752696685\r\n 30\r\n0.0\r\n 11\r\n527391.1184711135\r\n 21\r\n179910.2628894595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527481.1611980505\r\n 20\r\n179859.2531386474\r\n 30\r\n0.0\r\n 11\r\n527373.6177806362\r\n 21\r\n179881.6141370817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527883.4992542709\r\n 20\r\n179555.2458076005\r\n 30\r\n0.0\r\n 11\r\n527645.8118573582\r\n 21\r\n179767.6358265945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527737.5594578391\r\n 20\r\n179726.7548728622\r\n 30\r\n0.0\r\n 11\r\n527417.4122622993\r\n 21\r\n179654.4557690584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527530.6386112234\r\n 20\r\n179657.7533237969\r\n 30\r\n0.0\r\n 11\r\n527492.133122306\r\n 21\r\n179820.0747913089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527499.0010025659\r\n 20\r\n179796.7849077535\r\n 30\r\n0.0\r\n 11\r\n527470.1787162922\r\n 21\r\n179875.0272112465\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527509.1177505392\r\n 20\r\n179805.1468705611\r\n 30\r\n0.0\r\n 11\r\n527430.2275831589\r\n 21\r\n179819.3062882198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n15FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527368.2787077643\r\n 20\r\n179722.6300393009\r\n 30\r\n0.0\r\n 11\r\n527441.3665605957\r\n 21\r\n179825.2469205501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1600\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527747.0735497196\r\n 20\r\n179442.9676582734\r\n 30\r\n0.0\r\n 11\r\n527616.7640635243\r\n 21\r\n179515.7296088145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1601\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527693.6912350009\r\n 20\r\n180053.0857239316\r\n 30\r\n0.0\r\n 11\r\n527653.4651411791\r\n 21\r\n180028.7552633158\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1602\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527696.0868705079\r\n 20\r\n179981.2608553404\r\n 30\r\n0.0\r\n 11\r\n527653.4143531943\r\n 21\r\n180030.6557327483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1603\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527744.6787114596\r\n 20\r\n179990.9767464331\r\n 30\r\n0.0\r\n 11\r\n527673.9461005169\r\n 21\r\n179914.2966265633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1604\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527797.5479226662\r\n 20\r\n179827.4901136973\r\n 30\r\n0.0\r\n 11\r\n527537.2927043674\r\n 21\r\n180019.8184956274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1605\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527549.3390619573\r\n 20\r\n180102.1037412619\r\n 30\r\n0.0\r\n 11\r\n527495.9952572316\r\n 21\r\n180058.5836051206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1606\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527516.8725769129\r\n 20\r\n180034.5401976727\r\n 30\r\n0.0\r\n 11\r\n527478.7380928657\r\n 21\r\n180080.9980611951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1607\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527740.6918608296\r\n 20\r\n179587.1529704054\r\n 30\r\n0.0\r\n 11\r\n527655.0757606819\r\n 21\r\n179660.4636376987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1608\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527385.2477976351\r\n 20\r\n179849.943018257\r\n 30\r\n0.0\r\n 11\r\n527098.8476690628\r\n 21\r\n179756.2214112595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1609\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527367.2505138509\r\n 20\r\n179783.5721316966\r\n 30\r\n0.0\r\n 11\r\n527151.8767663561\r\n 21\r\n179710.8833866505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527499.9242881051\r\n 20\r\n179651.9989130187\r\n 30\r\n0.0\r\n 11\r\n527373.8551590216\r\n 21\r\n179538.2471115796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527576.8788217952\r\n 20\r\n179534.6089957443\r\n 30\r\n0.0\r\n 11\r\n526615.348353887\r\n 21\r\n180575.7118171535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527382.0885082257\r\n 20\r\n179644.0285202604\r\n 30\r\n0.0\r\n 11\r\n527003.6356507306\r\n 21\r\n179421.1895599007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527338.0829680242\r\n 20\r\n179697.8164320882\r\n 30\r\n0.0\r\n 11\r\n527455.2849165784\r\n 21\r\n179543.3068163136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527280.9007493075\r\n 20\r\n179653.0661017021\r\n 30\r\n0.0\r\n 11\r\n527320.1870217045\r\n 21\r\n179602.1521104691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n160F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527307.5345819786\r\n 20\r\n179700.4781675243\r\n 30\r\n0.0\r\n 11\r\n527280.4730801873\r\n 21\r\n179637.1936461638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1610\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527295.0053416338\r\n 20\r\n179651.5768705524\r\n 30\r\n0.0\r\n 11\r\n526935.5510080746\r\n 21\r\n179468.8484386185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1611\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527092.8716803185\r\n 20\r\n179855.1358713125\r\n 30\r\n0.0\r\n 11\r\n527287.7366100949\r\n 21\r\n179398.970806405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1612\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527298.354902861\r\n 20\r\n179407.0050365438\r\n 30\r\n0.0\r\n 11\r\n527084.6545226875\r\n 21\r\n179300.3845919441\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1613\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527455.7037134897\r\n 20\r\n179299.5473585614\r\n 30\r\n0.0\r\n 11\r\n527280.5032272824\r\n 21\r\n179410.0537906542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1614\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527462.5621885354\r\n 20\r\n179386.46654955\r\n 30\r\n0.0\r\n 11\r\n527401.0572255213\r\n 21\r\n179327.2343008504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1615\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526919.5354947839\r\n 20\r\n179622.1715367483\r\n 30\r\n0.0\r\n 11\r\n527087.5611156689\r\n 21\r\n179299.2989888672\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1616\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527409.0610968798\r\n 20\r\n179565.6198368894\r\n 30\r\n0.0\r\n 11\r\n527039.455546023\r\n 21\r\n179357.7088869003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1617\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527398.1409041258\r\n 20\r\n179041.8821944623\r\n 30\r\n0.0\r\n 11\r\n527038.0363455138\r\n 21\r\n179364.5381727657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1618\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527525.0059336864\r\n 20\r\n178885.6477089472\r\n 30\r\n0.0\r\n 11\r\n527187.9674992323\r\n 21\r\n179236.314287511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1619\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527474.5189813144\r\n 20\r\n179094.2184453138\r\n 30\r\n0.0\r\n 11\r\n527363.7835159692\r\n 21\r\n179055.1392380027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n161A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527428.49784197\r\n 20\r\n179135.8965495132\r\n 30\r\n0.0\r\n 11\r\n527389.2752835042\r\n 21\r\n179033.2944453069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n161B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527296.4727948656\r\n 20\r\n179272.5445125288\r\n 30\r\n0.0\r\n 11\r\n527423.2337634025\r\n 21\r\n179115.2585048334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n161C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527502.3991814606\r\n 20\r\n179340.924549142\r\n 30\r\n0.0\r\n 11\r\n527257.2582309912\r\n 21\r\n179166.4726921377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n161D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527571.8810403514\r\n 20\r\n179264.5955464387\r\n 30\r\n0.0\r\n 11\r\n527723.8586542512\r\n 21\r\n179262.4553722551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n161E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527686.9264469953\r\n 20\r\n179633.2069362727\r\n 30\r\n0.0\r\n 11\r\n527686.9169168243\r\n 21\r\n179633.1989479949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n161F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527600.0914869286\r\n 20\r\n179415.8266688129\r\n 30\r\n0.0\r\n 11\r\n527395.9419716314\r\n 21\r\n179259.6580827202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1620\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527382.8922759684\r\n 20\r\n179260.5155255418\r\n 30\r\n0.0\r\n 11\r\n527398.6370130078\r\n 21\r\n179242.0261278335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1621\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527193.5343081437\r\n 20\r\n179277.7449970831\r\n 30\r\n0.0\r\n 11\r\n527161.9789393307\r\n 21\r\n179245.2120004136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1622\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527196.5504791403\r\n 20\r\n179292.9840389905\r\n 30\r\n0.0\r\n 11\r\n527190.0207427949\r\n 21\r\n179269.8213755883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1623\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527158.9668125681\r\n 20\r\n179344.9064608775\r\n 30\r\n0.0\r\n 11\r\n527199.393911068\r\n 21\r\n179285.5135986958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1624\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527415.3275361311\r\n 20\r\n179330.0564456594\r\n 30\r\n0.0\r\n 11\r\n527627.5144988411\r\n 21\r\n179050.1164214183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1625\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527611.2018236088\r\n 20\r\n179193.135292302\r\n 30\r\n0.0\r\n 11\r\n527455.0766069426\r\n 21\r\n179313.318124319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1626\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527517.997145268\r\n 20\r\n179718.8949694971\r\n 30\r\n0.0\r\n 11\r\n527622.1815325604\r\n 21\r\n179026.267323479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1627\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527531.7434246959\r\n 20\r\n179187.4935809829\r\n 30\r\n0.0\r\n 11\r\n527465.2336741706\r\n 21\r\n179122.0085194374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1628\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527493.0114002093\r\n 20\r\n179143.5476474413\r\n 30\r\n0.0\r\n 11\r\n527411.1744383372\r\n 21\r\n179127.5697278805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1629\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527486.3695190679\r\n 20\r\n179154.8682669677\r\n 30\r\n0.0\r\n 11\r\n527459.8123313106\r\n 21\r\n179079.2450999079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n162A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527579.9902820873\r\n 20\r\n178963.0156940637\r\n 30\r\n0.0\r\n 11\r\n527455.7237957266\r\n 21\r\n179091.1887931223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n162B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527305.3714396315\r\n 20\r\n179513.0645861748\r\n 30\r\n0.0\r\n 11\r\n527322.9766301279\r\n 21\r\n179469.4736788026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n162C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527376.6593787462\r\n 20\r\n179503.977201821\r\n 30\r\n0.0\r\n 11\r\n527321.0923767731\r\n 21\r\n179469.7265676699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n162D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527544.6406315378\r\n 20\r\n179579.6216649434\r\n 30\r\n0.0\r\n 11\r\n527332.1334225043\r\n 21\r\n179369.8612839087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n162E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527233.9638032789\r\n 20\r\n179378.3750715273\r\n 30\r\n0.0\r\n 11\r\n527320.6271692625\r\n 21\r\n179235.9508334586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n162F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527178.4163136899\r\n 20\r\n179661.3699555005\r\n 30\r\n0.0\r\n 11\r\n526916.167627152\r\n 21\r\n179585.7363974202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1630\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527907.9025003525\r\n 20\r\n178974.0706314878\r\n 30\r\n0.0\r\n 11\r\n528008.4651215832\r\n 21\r\n179106.5787103545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1631\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527870.3686323044\r\n 20\r\n178881.9514279978\r\n 30\r\n0.0\r\n 11\r\n528046.8928473712\r\n 21\r\n178828.1896266328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1632\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527359.4210690266\r\n 20\r\n179508.4265302118\r\n 30\r\n0.0\r\n 11\r\n527425.2949029307\r\n 21\r\n179411.5202268584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1633\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528186.1047930786\r\n 20\r\n179492.302454742\r\n 30\r\n0.0\r\n 11\r\n528260.6658836588\r\n 21\r\n179675.8912233747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1634\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529294.8928599667\r\n 20\r\n182000.5817697426\r\n 30\r\n0.0\r\n 11\r\n529368.8051009005\r\n 21\r\n182556.3946378973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1635\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529305.0816559066\r\n 20\r\n182018.6352957792\r\n 30\r\n0.0\r\n 11\r\n528520.6037537193\r\n 21\r\n181916.8259805211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1636\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529168.7853264406\r\n 20\r\n181997.9747406915\r\n 30\r\n0.0\r\n 11\r\n529173.7401840819\r\n 21\r\n182145.7351687175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1637\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529181.9177915637\r\n 20\r\n182114.1298371344\r\n 30\r\n0.0\r\n 11\r\n529140.8008297662\r\n 21\r\n182185.0558105655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1638\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529246.9013359591\r\n 20\r\n182160.3083448142\r\n 30\r\n0.0\r\n 11\r\n529170.3091204007\r\n 21\r\n182117.2843864177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1639\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529236.3844112596\r\n 20\r\n182144.4617614073\r\n 30\r\n0.0\r\n 11\r\n529260.6900043037\r\n 21\r\n182341.8534809173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n163A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529358.6692182326\r\n 20\r\n182153.2521170987\r\n 30\r\n0.0\r\n 11\r\n528942.2843149059\r\n 21\r\n182271.9232323746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n163B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529206.3030010937\r\n 20\r\n182355.5003102103\r\n 30\r\n0.0\r\n 11\r\n529140.7706389897\r\n 21\r\n182180.7280347275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n163C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529264.233722323\r\n 20\r\n182337.6777019085\r\n 30\r\n0.0\r\n 11\r\n529205.5558683341\r\n 21\r\n182355.0998180983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n163D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529314.675411189\r\n 20\r\n182630.7780077002\r\n 30\r\n0.0\r\n 11\r\n529224.9881370458\r\n 21\r\n182347.4016519313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n163E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529297.5495948976\r\n 20\r\n182564.5332045134\r\n 30\r\n0.0\r\n 11\r\n529187.6164632194\r\n 21\r\n182591.2260476738\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n163F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529212.7106007468\r\n 20\r\n182668.7314626243\r\n 30\r\n0.0\r\n 11\r\n529031.4484553348\r\n 21\r\n181963.4250934025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1640\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528996.2985548904\r\n 20\r\n182180.5998709571\r\n 30\r\n0.0\r\n 11\r\n528558.3714701195\r\n 21\r\n182213.8208887712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1641\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528980.5053209261\r\n 20\r\n182112.922690252\r\n 30\r\n0.0\r\n 11\r\n529017.6079645442\r\n 21\r\n182303.2721371866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1642\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528909.4530478827\r\n 20\r\n182127.8884078224\r\n 30\r\n0.0\r\n 11\r\n528922.2768362436\r\n 21\r\n182190.9058352073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1643\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528954.2574374323\r\n 20\r\n182097.0690680281\r\n 30\r\n0.0\r\n 11\r\n528902.0732846576\r\n 21\r\n182141.9474561697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1644\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528921.4573247771\r\n 20\r\n182135.4418620226\r\n 30\r\n0.0\r\n 11\r\n528518.2627751507\r\n 21\r\n182141.0322916278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1645\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528825.0609212229\r\n 20\r\n181952.2275923816\r\n 30\r\n0.0\r\n 11\r\n528803.5951424895\r\n 21\r\n182358.9841714154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1646\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528816.6675426789\r\n 20\r\n182356.4525023064\r\n 30\r\n0.0\r\n 11\r\n528577.850721129\r\n 21\r\n182357.9682324038\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1647\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528910.5455085181\r\n 20\r\n182522.2618153545\r\n 30\r\n0.0\r\n 11\r\n528801.987151067\r\n 21\r\n182345.8476296189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1648\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528955.0119935594\r\n 20\r\n182447.2637077112\r\n 30\r\n0.0\r\n 11\r\n528873.6965195808\r\n 21\r\n182473.323513025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1649\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528717.0630321416\r\n 20\r\n181925.5737602287\r\n 30\r\n0.0\r\n 11\r\n528717.0584691702\r\n 21\r\n182015.6964043191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n164A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528568.9332375947\r\n 20\r\n181888.1792114258\r\n 30\r\n0.0\r\n 11\r\n528579.9812719242\r\n 21\r\n182360.2237966586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n164B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528985.9508039319\r\n 20\r\n182262.8699518902\r\n 30\r\n0.0\r\n 11\r\n528562.5449074261\r\n 21\r\n182286.5906844586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n164C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528745.3081725296\r\n 20\r\n182728.1779065364\r\n 30\r\n0.0\r\n 11\r\n528564.2810415382\r\n 21\r\n182279.8350117414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n164D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528821.9810404587\r\n 20\r\n182969.6403267128\r\n 30\r\n0.0\r\n 11\r\n528642.3478926489\r\n 21\r\n182461.0152600103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n164E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528836.9347059861\r\n 20\r\n182714.8635460567\r\n 30\r\n0.0\r\n 11\r\n528720.311168415\r\n 21\r\n182701.1348092714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n164F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528813.9947484554\r\n 20\r\n182657.1680697636\r\n 30\r\n0.0\r\n 11\r\n528733.5650516428\r\n 21\r\n182731.9789296086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1650\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528755.7138641961\r\n 20\r\n182476.3183603657\r\n 30\r\n0.0\r\n 11\r\n528800.1732323709\r\n 21\r\n182673.3731647797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1651\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529004.3540774635\r\n 20\r\n182499.4855786111\r\n 30\r\n0.0\r\n 11\r\n528673.7620462308\r\n 21\r\n182554.2472550911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1652\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528993.9880467048\r\n 20\r\n182406.4847752476\r\n 30\r\n0.0\r\n 11\r\n529000.1275371754\r\n 21\r\n182527.768624887\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1653\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529099.0783096793\r\n 20\r\n182502.614198256\r\n 30\r\n0.0\r\n 11\r\n529042.608227567\r\n 21\r\n182395.8487506972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1654\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529047.6247190138\r\n 20\r\n182400.3442406685\r\n 30\r\n0.0\r\n 11\r\n528992.2955430044\r\n 21\r\n182407.8477848628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1655\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529385.637389287\r\n 20\r\n182397.357420962\r\n 30\r\n0.0\r\n 11\r\n528839.3203233203\r\n 21\r\n182531.7271790895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1656\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528827.9844859108\r\n 20\r\n182525.2057869599\r\n 30\r\n0.0\r\n 11\r\n528833.9680801772\r\n 21\r\n182548.7419542709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1657\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528665.6056340302\r\n 20\r\n182426.2795359938\r\n 30\r\n0.0\r\n 11\r\n528622.9415754407\r\n 21\r\n182441.5738250564\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1658\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528675.0297259523\r\n 20\r\n182413.9299539289\r\n 30\r\n0.0\r\n 11\r\n528658.9593809825\r\n 21\r\n182431.8433691579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1659\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528664.1787142876\r\n 20\r\n182350.7577651632\r\n 30\r\n0.0\r\n 11\r\n528674.2894280408\r\n 21\r\n182421.8888823951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n165A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528887.7498133832\r\n 20\r\n182477.0800006834\r\n 30\r\n0.0\r\n 11\r\n528964.7842887796\r\n 21\r\n182904.5410802109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n165B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529215.7597066946\r\n 20\r\n182649.1347208173\r\n 30\r\n0.0\r\n 11\r\n528947.2035067732\r\n 21\r\n182892.9833056864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n165C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529084.6450460566\r\n 20\r\n182867.7337791315\r\n 30\r\n0.0\r\n 11\r\n528916.0521447092\r\n 21\r\n182509.6244022478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n165D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529040.9135465872\r\n 20\r\n182479.1691321838\r\n 30\r\n0.0\r\n 11\r\n529049.095153617\r\n 21\r\n182513.7387002515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n165E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528929.4124673524\r\n 20\r\n182656.3592598277\r\n 30\r\n0.0\r\n 11\r\n528840.8485974237\r\n 21\r\n182685.825870489\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n165F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528875.2761308614\r\n 20\r\n182678.7349579624\r\n 30\r\n0.0\r\n 11\r\n528794.7746977778\r\n 21\r\n182657.0070608392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1660\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528874.3038264703\r\n 20\r\n182665.6458160607\r\n 30\r\n0.0\r\n 11\r\n528817.1340307507\r\n 21\r\n182721.8219860538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1661\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529410.8461557705\r\n 20\r\n182845.4371980838\r\n 30\r\n0.0\r\n 11\r\n529364.6733579714\r\n 21\r\n182538.1584258087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1662\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529399.4032669115\r\n 20\r\n182591.429824433\r\n 30\r\n0.0\r\n 11\r\n529155.0656218786\r\n 21\r\n182689.6028168605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1663\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528869.7121310872\r\n 20\r\n182264.3431569781\r\n 30\r\n0.0\r\n 11\r\n528866.3020843692\r\n 21\r\n182311.2311247239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1664\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528929.6967991418\r\n 20\r\n182303.9208074386\r\n 30\r\n0.0\r\n 11\r\n528864.7221897459\r\n 21\r\n182310.1736293514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1665\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528949.8677920855\r\n 20\r\n182258.6582777871\r\n 30\r\n0.0\r\n 11\r\n528971.5278565793\r\n 21\r\n182360.7062304376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1666\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529113.8220521923\r\n 20\r\n182310.0589895508\r\n 30\r\n0.0\r\n 11\r\n528830.6167346646\r\n 21\r\n182404.6818169607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1667\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528746.2495264531\r\n 20\r\n182353.7707877327\r\n 30\r\n0.0\r\n 11\r\n528750.9104548647\r\n 21\r\n182422.4573184263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1668\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528782.5987803646\r\n 20\r\n182419.3271513715\r\n 30\r\n0.0\r\n 11\r\n528722.6444604755\r\n 21\r\n182423.5758550844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1669\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528776.7951732625\r\n 20\r\n182412.9724284125\r\n 30\r\n0.0\r\n 11\r\n528782.6288806188\r\n 21\r\n182484.0670398513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n166A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528785.2421241746\r\n 20\r\n182481.4231232787\r\n 30\r\n0.0\r\n 11\r\n528729.3609600332\r\n 21\r\n182486.7976268792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n166B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528727.1681281097\r\n 20\r\n182415.7543286476\r\n 30\r\n0.0\r\n 11\r\n528732.6476304777\r\n 21\r\n182493.0593275304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n166C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529277.0281920406\r\n 20\r\n182495.4189370289\r\n 30\r\n0.0\r\n 11\r\n529167.7097325291\r\n 21\r\n182522.878816007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n166D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528821.1202140835\r\n 20\r\n182075.2640407977\r\n 30\r\n0.0\r\n 11\r\n528556.7599519333\r\n 21\r\n182063.9768110757\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n166E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529022.0789531999\r\n 20\r\n181853.5018650219\r\n 30\r\n0.0\r\n 11\r\n527686.7491531824\r\n 21\r\n181680.2031497812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n166F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528381.6608302458\r\n 20\r\n181767.4165293778\r\n 30\r\n0.0\r\n 11\r\n528386.6156878871\r\n 21\r\n181915.1769574041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1670\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528522.2172874869\r\n 20\r\n181853.1247379782\r\n 30\r\n0.0\r\n 11\r\n528031.996430273\r\n 21\r\n181788.563774962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1671\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528394.7932953689\r\n 20\r\n181883.5716258208\r\n 30\r\n0.0\r\n 11\r\n528353.6763335714\r\n 21\r\n181954.497599252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1672\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528459.7768397642\r\n 20\r\n181929.7501335006\r\n 30\r\n0.0\r\n 11\r\n528383.1846242059\r\n 21\r\n181886.7261751042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1673\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528449.302553226\r\n 20\r\n181915.7253323631\r\n 30\r\n0.0\r\n 11\r\n528473.60814627\r\n 21\r\n182113.117051873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1674\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528653.3959037955\r\n 20\r\n181899.3660402736\r\n 30\r\n0.0\r\n 11\r\n528155.1598187115\r\n 21\r\n182041.3650210609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1675\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528419.1785048989\r\n 20\r\n182124.9420988967\r\n 30\r\n0.0\r\n 11\r\n528353.6461427949\r\n 21\r\n181950.169823414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1676\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528477.1092261283\r\n 20\r\n182107.1194905949\r\n 30\r\n0.0\r\n 11\r\n528418.4313721394\r\n 21\r\n182124.5416067849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1677\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528527.5509149943\r\n 20\r\n182400.2197963869\r\n 30\r\n0.0\r\n 11\r\n528437.8636408509\r\n 21\r\n182116.8434406178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1678\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528510.4250987028\r\n 20\r\n182333.9749932\r\n 30\r\n0.0\r\n 11\r\n528400.4919670246\r\n 21\r\n182360.6678363602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1679\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528425.5861045521\r\n 20\r\n182438.1732513108\r\n 30\r\n0.0\r\n 11\r\n528210.4551193718\r\n 21\r\n181713.8872169497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528209.1740586957\r\n 20\r\n181950.0416596434\r\n 30\r\n0.0\r\n 11\r\n527771.2469739247\r\n 21\r\n181983.2626774577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528193.3808247313\r\n 20\r\n181882.3644789384\r\n 30\r\n0.0\r\n 11\r\n528230.4834683494\r\n 21\r\n182072.7139258729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528122.328551688\r\n 20\r\n181897.330196509\r\n 30\r\n0.0\r\n 11\r\n528135.1523400488\r\n 21\r\n181960.3476238937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528167.1329412375\r\n 20\r\n181866.5108567147\r\n 30\r\n0.0\r\n 11\r\n528114.9487884628\r\n 21\r\n181911.3892448562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528134.3328285824\r\n 20\r\n181904.883650709\r\n 30\r\n0.0\r\n 11\r\n527731.1382789561\r\n 21\r\n181910.4740803142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n167F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527996.1768338681\r\n 20\r\n181460.0353403722\r\n 30\r\n0.0\r\n 11\r\n527948.1823344532\r\n 21\r\n182149.6768160842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1680\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528029.5430464843\r\n 20\r\n182125.8942909927\r\n 30\r\n0.0\r\n 11\r\n527797.7082417475\r\n 21\r\n182127.3657074069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1681\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528123.4210123233\r\n 20\r\n182291.7036040411\r\n 30\r\n0.0\r\n 11\r\n528014.8626548722\r\n 21\r\n182115.2894183054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1682\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528167.8874973648\r\n 20\r\n182216.7054963975\r\n 30\r\n0.0\r\n 11\r\n528086.572023386\r\n 21\r\n182242.7653017115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1683\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527852.4579638684\r\n 20\r\n181696.0038806513\r\n 30\r\n0.0\r\n 11\r\n527852.453400897\r\n 21\r\n181786.1265247416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1684\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527781.8087413998\r\n 20\r\n181657.6210001123\r\n 30\r\n0.0\r\n 11\r\n527782.4804644517\r\n 21\r\n182093.9906394431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1685\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528198.8263077372\r\n 20\r\n182032.3117405768\r\n 30\r\n0.0\r\n 11\r\n527775.4204112313\r\n 21\r\n182056.0324731452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1686\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527910.8695471963\r\n 20\r\n182377.3371982609\r\n 30\r\n0.0\r\n 11\r\n527777.1565453434\r\n 21\r\n182049.2768004279\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1687\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528217.2295812688\r\n 20\r\n182268.9273672976\r\n 30\r\n0.0\r\n 11\r\n527886.6375500361\r\n 21\r\n182323.6890437774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1688\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528206.8635505101\r\n 20\r\n182175.9265639341\r\n 30\r\n0.0\r\n 11\r\n528213.0030409806\r\n 21\r\n182297.2104135735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1689\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528311.9538134844\r\n 20\r\n182272.0559869425\r\n 30\r\n0.0\r\n 11\r\n528255.4837313723\r\n 21\r\n182165.2905393836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528260.5002228191\r\n 20\r\n182169.786029355\r\n 30\r\n0.0\r\n 11\r\n528205.1710468096\r\n 21\r\n182177.2895735493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528598.5128930922\r\n 20\r\n182166.7992096486\r\n 30\r\n0.0\r\n 11\r\n528052.1958271254\r\n 21\r\n182301.1689677762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528040.859989716\r\n 20\r\n182294.6475756465\r\n 30\r\n0.0\r\n 11\r\n528046.8435839823\r\n 21\r\n182318.1837429574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527878.4811378353\r\n 20\r\n182195.7213246802\r\n 30\r\n0.0\r\n 11\r\n527671.7558010316\r\n 21\r\n182303.4826875344\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527887.9052297575\r\n 20\r\n182183.3717426153\r\n 30\r\n0.0\r\n 11\r\n527871.8348847878\r\n 21\r\n182201.2851578445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n168F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527877.0542180927\r\n 20\r\n182120.1995538495\r\n 30\r\n0.0\r\n 11\r\n527887.164931846\r\n 21\r\n182191.3306710815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1690\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528100.6253171885\r\n 20\r\n182246.5217893698\r\n 30\r\n0.0\r\n 11\r\n528157.0949773981\r\n 21\r\n182597.0428668813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1691\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528428.6352104999\r\n 20\r\n182418.5765095037\r\n 30\r\n0.0\r\n 11\r\n528280.6271078863\r\n 21\r\n182559.005316768\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1692\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528307.8438843695\r\n 20\r\n182574.0581574205\r\n 30\r\n0.0\r\n 11\r\n528128.9276485144\r\n 21\r\n182279.0661909342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1693\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528253.7890503926\r\n 20\r\n182248.6109208704\r\n 30\r\n0.0\r\n 11\r\n528261.9706574223\r\n 21\r\n182283.180488938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1694\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528611.2296355624\r\n 20\r\n182343.028152049\r\n 30\r\n0.0\r\n 11\r\n528367.9411256838\r\n 21\r\n182459.0446055469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1695\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528082.5876348925\r\n 20\r\n182033.7849456645\r\n 30\r\n0.0\r\n 11\r\n528079.1775881745\r\n 21\r\n182080.6729134102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1696\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528142.5723029471\r\n 20\r\n182073.3625961251\r\n 30\r\n0.0\r\n 11\r\n528077.5976935512\r\n 21\r\n182079.6154180378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1697\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528162.7432958909\r\n 20\r\n182028.1000664736\r\n 30\r\n0.0\r\n 11\r\n528184.4033603846\r\n 21\r\n182130.1480191241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1698\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528326.6975559975\r\n 20\r\n182079.5007782372\r\n 30\r\n0.0\r\n 11\r\n528043.4922384698\r\n 21\r\n182174.1236056473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1699\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528489.9036958461\r\n 20\r\n182264.8607257154\r\n 30\r\n0.0\r\n 11\r\n528380.5852363343\r\n 21\r\n182292.3206046936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527996.0297969854\r\n 20\r\n181841.1454156097\r\n 30\r\n0.0\r\n 11\r\n527769.6354557385\r\n 21\r\n181833.4185997619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528206.8113715502\r\n 20\r\n182531.1448343106\r\n 30\r\n0.0\r\n 11\r\n528226.7190239089\r\n 21\r\n182699.7763349743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528661.5696626142\r\n 20\r\n182496.080312222\r\n 30\r\n0.0\r\n 11\r\n527912.2476470924\r\n 21\r\n182592.9726102086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528145.1765234692\r\n 20\r\n182631.8917632092\r\n 30\r\n0.0\r\n 11\r\n528108.1456837993\r\n 21\r\n183069.5131572405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528075.8469801618\r\n 20\r\n182636.6919144571\r\n 30\r\n0.0\r\n 11\r\n528269.6771046024\r\n 21\r\n182630.4148951759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n169F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528079.2920485041\r\n 20\r\n182709.2214237011\r\n 30\r\n0.0\r\n 11\r\n528143.5479804768\r\n 21\r\n182706.6097368051\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528056.0109985714\r\n 20\r\n182660.0761518805\r\n 30\r\n0.0\r\n 11\r\n528091.9945362762\r\n 21\r\n182718.7484667934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528088.6629300958\r\n 20\r\n182698.5751139037\r\n 30\r\n0.0\r\n 11\r\n528029.8930534446\r\n 21\r\n183097.5026754358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527892.4223935542\r\n 20\r\n182764.5249966642\r\n 30\r\n0.0\r\n 11\r\n528290.552339738\r\n 21\r\n182850.572891442\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528290.1374353627\r\n 20\r\n182837.2640654401\r\n 30\r\n0.0\r\n 11\r\n528256.5027161783\r\n 21\r\n183054.2493831048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528468.7941289087\r\n 20\r\n182771.0252051323\r\n 30\r\n0.0\r\n 11\r\n528277.3274718031\r\n 21\r\n182850.0657081549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528401.8456452598\r\n 20\r\n182715.1692745681\r\n 30\r\n0.0\r\n 11\r\n528414.6064138194\r\n 21\r\n182799.5996159577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527788.3542460773\r\n 20\r\n183007.16342335\r\n 30\r\n0.0\r\n 11\r\n528210.7738302006\r\n 21\r\n183067.2709162053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528224.7441269853\r\n 20\r\n182655.224972105\r\n 30\r\n0.0\r\n 11\r\n528180.649928748\r\n 21\r\n183076.9961518119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529484.7651123115\r\n 20\r\n182728.031229721\r\n 30\r\n0.0\r\n 11\r\n528171.209505827\r\n 21\r\n183064.0007175021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528398.7507832566\r\n 20\r\n182916.5503537137\r\n 30\r\n0.0\r\n 11\r\n528600.373497463\r\n 21\r\n182904.0798895212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528462.0372066938\r\n 20\r\n182709.0019624602\r\n 30\r\n0.0\r\n 11\r\n528462.6155764694\r\n 21\r\n183009.8793486124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528536.6020754626\r\n 20\r\n182656.4808197359\r\n 30\r\n0.0\r\n 11\r\n528419.6154353832\r\n 21\r\n182689.0628940951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528412.1417479692\r\n 20\r\n182587.2388077762\r\n 30\r\n0.0\r\n 11\r\n528531.2947461346\r\n 21\r\n182606.9946675243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528525.4420793897\r\n 20\r\n182603.6598649078\r\n 30\r\n0.0\r\n 11\r\n528535.8451536205\r\n 21\r\n182658.517835522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528421.2404396244\r\n 20\r\n182282.0957117013\r\n 30\r\n0.0\r\n 11\r\n528421.2414462359\r\n 21\r\n182282.1081061951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528433.0881905932\r\n 20\r\n182427.9780688233\r\n 30\r\n0.0\r\n 11\r\n528466.7816430264\r\n 21\r\n182842.8483909267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528458.5362012535\r\n 20\r\n182852.9993738869\r\n 30\r\n0.0\r\n 11\r\n528482.7253278994\r\n 21\r\n182850.8451398792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528420.5556191065\r\n 20\r\n182786.3250830966\r\n 30\r\n0.0\r\n 11\r\n528771.6443869495\r\n 21\r\n182775.0822449014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528737.8733696192\r\n 20\r\n182680.8950052683\r\n 30\r\n0.0\r\n 11\r\n528457.1964209409\r\n 21\r\n182763.5740024058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528447.0397569236\r\n 20\r\n182635.4539987776\r\n 30\r\n0.0\r\n 11\r\n528482.4715955876\r\n 21\r\n182632.8891325321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528604.1842720816\r\n 20\r\n182773.7812678206\r\n 30\r\n0.0\r\n 11\r\n528619.1525139648\r\n 21\r\n182865.9104810782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528617.6417409251\r\n 20\r\n182830.7927695371\r\n 30\r\n0.0\r\n 11\r\n528583.3559890368\r\n 21\r\n182906.7998051287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528604.5650258331\r\n 20\r\n182829.6655898895\r\n 30\r\n0.0\r\n 11\r\n528650.9068507839\r\n 21\r\n182895.0611774923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528815.2263340769\r\n 20\r\n182864.2209108569\r\n 30\r\n0.0\r\n 11\r\n528638.798243567\r\n 21\r\n182891.4905245996\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528207.6643971698\r\n 20\r\n182770.2114157729\r\n 30\r\n0.0\r\n 11\r\n528253.4087645679\r\n 21\r\n182781.0540533346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528256.3001686514\r\n 20\r\n182717.3047758302\r\n 30\r\n0.0\r\n 11\r\n528252.1128866399\r\n 21\r\n182782.4451190698\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528214.8329523457\r\n 20\r\n182690.174801288\r\n 30\r\n0.0\r\n 11\r\n528319.0289938037\r\n 21\r\n182685.0632478495\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528291.7183237425\r\n 20\r\n182536.5139011146\r\n 30\r\n0.0\r\n 11\r\n528339.9738941262\r\n 21\r\n182831.183430028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528276.2619798829\r\n 20\r\n182906.3535750451\r\n 30\r\n0.0\r\n 11\r\n528344.8129298933\r\n 21\r\n182912.7042446996\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528346.7754667857\r\n 20\r\n182880.9222314257\r\n 30\r\n0.0\r\n 11\r\n528341.4101846297\r\n 21\r\n182940.7869598057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528339.5766679224\r\n 20\r\n182885.6383372573\r\n 30\r\n0.0\r\n 11\r\n528410.6918881676\r\n 21\r\n182891.2151971855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528408.4984751054\r\n 20\r\n182888.213818192\r\n 30\r\n0.0\r\n 11\r\n528404.8940483753\r\n 21\r\n182944.2370089496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528334.410017133\r\n 20\r\n182935.0740358879\r\n 30\r\n0.0\r\n 11\r\n528411.5996931515\r\n 21\r\n182941.9908064232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528989.1832316477\r\n 20\r\n181787.7273625354\r\n 30\r\n0.0\r\n 11\r\n528851.974849362\r\n 21\r\n181769.6573331517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529064.9186347733\r\n 20\r\n181659.5575442809\r\n 30\r\n0.0\r\n 11\r\n528650.5247131833\r\n 21\r\n181514.0878039578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528980.9376501028\r\n 20\r\n181683.7990316437\r\n 30\r\n0.0\r\n 11\r\n528592.9382876016\r\n 21\r\n181574.0101777006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528840.3930210647\r\n 20\r\n181835.8087105029\r\n 30\r\n0.0\r\n 11\r\n528913.2932495596\r\n 21\r\n181492.3751053638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528654.593928897\r\n 20\r\n181812.577808336\r\n 30\r\n0.0\r\n 11\r\n528677.9227151468\r\n 21\r\n181725.5269109787\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528576.4161301284\r\n 20\r\n181831.3605113784\r\n 30\r\n0.0\r\n 11\r\n528709.3021110472\r\n 21\r\n181378.271705971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529076.2238395554\r\n 20\r\n181577.4135578212\r\n 30\r\n0.0\r\n 11\r\n528673.3963042988\r\n 21\r\n181444.8797765102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528907.1951827109\r\n 20\r\n181141.4120527991\r\n 30\r\n0.0\r\n 11\r\n528673.3241644014\r\n 21\r\n181451.8545934505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528964.3299977859\r\n 20\r\n181545.8958235747\r\n 30\r\n0.0\r\n 11\r\n528973.1757483785\r\n 21\r\n181499.7237255672\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529032.516205163\r\n 20\r\n181523.1979835643\r\n 30\r\n0.0\r\n 11\r\n528971.3759329806\r\n 21\r\n181500.3361208781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528660.8951822511\r\n 20\r\n181842.4229195187\r\n 30\r\n0.0\r\n 11\r\n528216.4117742468\r\n 21\r\n181576.2699427678\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528669.0146415672\r\n 20\r\n181326.0649810698\r\n 30\r\n0.0\r\n 11\r\n528461.5209524132\r\n 21\r\n181650.9205861786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528580.3528789561\r\n 20\r\n181263.0064435044\r\n 30\r\n0.0\r\n 11\r\n528185.0360547931\r\n 21\r\n181906.897900886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528244.9402156842\r\n 20\r\n181678.4639860913\r\n 30\r\n0.0\r\n 11\r\n527830.546294094\r\n 21\r\n181532.9942457681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528212.1635331643\r\n 20\r\n181739.7446201465\r\n 30\r\n0.0\r\n 11\r\n528297.2834846542\r\n 21\r\n181565.4916087805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528147.4086398607\r\n 20\r\n181706.8934101192\r\n 30\r\n0.0\r\n 11\r\n528176.1106935607\r\n 21\r\n181649.3448409319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528182.7060481197\r\n 20\r\n181748.2619730439\r\n 30\r\n0.0\r\n 11\r\n528143.9204621834\r\n 21\r\n181691.403078871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528274.1019821601\r\n 20\r\n181410.2033416521\r\n 30\r\n0.0\r\n 11\r\n528202.306147755\r\n 21\r\n181363.9791280465\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527794.473391523\r\n 20\r\n181723.0524672429\r\n 30\r\n0.0\r\n 11\r\n527877.5480466762\r\n 21\r\n181522.7459140839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528256.2454204663\r\n 20\r\n181596.3199996316\r\n 30\r\n0.0\r\n 11\r\n527853.4178852097\r\n 21\r\n181463.7862183204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528335.2821380603\r\n 20\r\n181372.5369963514\r\n 30\r\n0.0\r\n 11\r\n528030.1404292131\r\n 21\r\n181234.0506437841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528301.1911965698\r\n 20\r\n181459.6829183916\r\n 30\r\n0.0\r\n 11\r\n528338.5223299863\r\n 21\r\n181344.1240502575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528351.4091950987\r\n 20\r\n181479.500875023\r\n 30\r\n0.0\r\n 11\r\n528299.9092923348\r\n 21\r\n181457.9281860703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528677.1232839307\r\n 20\r\n181569.8989872454\r\n 30\r\n0.0\r\n 11\r\n528184.2230778662\r\n 21\r\n181298.6666968981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528171.5853402168\r\n 20\r\n181302.0308241542\r\n 30\r\n0.0\r\n 11\r\n528183.4585396952\r\n 21\r\n181280.8463556411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528216.8528368949\r\n 20\r\n181363.9891925735\r\n 30\r\n0.0\r\n 11\r\n528362.1486633801\r\n 21\r\n181040.0401670928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528578.2243266215\r\n 20\r\n181282.7244201118\r\n 30\r\n0.0\r\n 11\r\n528471.6205885658\r\n 21\r\n181108.7638171541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528501.806603812\r\n 20\r\n181101.2707925706\r\n 30\r\n0.0\r\n 11\r\n528252.6160433516\r\n 21\r\n181339.8820754586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528735.032957025\r\n 20\r\n181402.9713818568\r\n 30\r\n0.0\r\n 11\r\n528530.0771271274\r\n 21\r\n181227.9221764542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528144.3515786968\r\n 20\r\n181564.8022653851\r\n 30\r\n0.0\r\n 11\r\n528153.1973292892\r\n 21\r\n181518.6301673776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528212.5377860739\r\n 20\r\n181542.1044253746\r\n 30\r\n0.0\r\n 11\r\n528151.3975138914\r\n 21\r\n181519.2425626885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528220.302314568\r\n 20\r\n181591.0459991545\r\n 30\r\n0.0\r\n 11\r\n528267.6445463101\r\n 21\r\n181498.0854907237\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528597.6059605881\r\n 20\r\n181447.0616397155\r\n 30\r\n0.0\r\n 11\r\n528499.1244494406\r\n 21\r\n181392.2349810032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528393.1085454885\r\n 20\r\n181116.5630802888\r\n 30\r\n0.0\r\n 11\r\n528455.9969238659\r\n 21\r\n180958.8356270552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528823.2824844054\r\n 20\r\n181268.1711482727\r\n 30\r\n0.0\r\n 11\r\n528124.5961274414\r\n 21\r\n180980.5794673295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528359.6591449503\r\n 20\r\n181003.2937738368\r\n 30\r\n0.0\r\n 11\r\n528496.251239133\r\n 21\r\n180501.1023875558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528293.9363262813\r\n 20\r\n180980.7075361373\r\n 30\r\n0.0\r\n 11\r\n528479.5322388713\r\n 21\r\n181036.9540946242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528261.5482504279\r\n 20\r\n181051.651746213\r\n 30\r\n0.0\r\n 11\r\n528330.7781392561\r\n 21\r\n180905.6295622267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528322.3371516584\r\n 20\r\n180924.2524915057\r\n 30\r\n0.0\r\n 11\r\n528306.1066294286\r\n 21\r\n180604.9795470143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528550.137684719\r\n 20\r\n181024.4102162114\r\n 30\r\n0.0\r\n 11\r\n528578.6162692871\r\n 21\r\n180605.0276531032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528744.1044161262\r\n 20\r\n181080.8851259622\r\n 30\r\n0.0\r\n 11\r\n528639.5423492048\r\n 21\r\n181019.1255948131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528605.9607391642\r\n 20\r\n181115.5427925806\r\n 30\r\n0.0\r\n 11\r\n528726.1658447626\r\n 21\r\n181127.3098463461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528719.6493407362\r\n 20\r\n181129.0156575297\r\n 30\r\n0.0\r\n 11\r\n528743.9006965419\r\n 21\r\n181078.7215959029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528535.7461500664\r\n 20\r\n181412.6370650762\r\n 30\r\n0.0\r\n 11\r\n528535.7503313503\r\n 21\r\n181412.6253538163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528584.9595823676\r\n 20\r\n181274.796325802\r\n 30\r\n0.0\r\n 11\r\n528850.6481789077\r\n 21\r\n180262.0898888091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528536.8091973477\r\n 20\r\n180844.5156656816\r\n 30\r\n0.0\r\n 11\r\n528882.5862303128\r\n 21\r\n180959.2072697967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528887.8023072455\r\n 20\r\n181104.0651430399\r\n 30\r\n0.0\r\n 11\r\n528654.1711792317\r\n 21\r\n180965.6183832592\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528652.1519733174\r\n 20\r\n181078.006868991\r\n 30\r\n0.0\r\n 11\r\n528685.7116297412\r\n 21\r\n181089.6577569701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528369.086842587\r\n 20\r\n180766.0629915787\r\n 30\r\n0.0\r\n 11\r\n528502.8198186826\r\n 21\r\n180887.2393542519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528489.1076340876\r\n 20\r\n180949.5635597706\r\n 30\r\n0.0\r\n 11\r\n528501.9282802661\r\n 21\r\n180885.5602107991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528476.5104876363\r\n 20\r\n181133.3599090048\r\n 30\r\n0.0\r\n 11\r\n528573.1374214369\r\n 21\r\n180919.4086633252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528783.5408346061\r\n 20\r\n181210.1317959648\r\n 30\r\n0.0\r\n 11\r\n528605.4299986597\r\n 21\r\n181319.9224408801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528478.9484833108\r\n 20\r\n180934.9434537312\r\n 30\r\n0.0\r\n 11\r\n528592.700573787\r\n 21\r\n180963.0620514041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528841.2419605326\r\n 20\r\n181831.809349348\r\n 30\r\n0.0\r\n 11\r\n528694.9750877169\r\n 21\r\n181965.4887947136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527559.6352817407\r\n 20\r\n178984.0106022821\r\n 30\r\n0.0\r\n 11\r\n527670.8055441313\r\n 21\r\n178708.4866640128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527841.850379535\r\n 20\r\n178909.2222632197\r\n 30\r\n0.0\r\n 11\r\n527577.010554294\r\n 21\r\n178891.6849232979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527868.0342853392\r\n 20\r\n178636.461298328\r\n 30\r\n0.0\r\n 11\r\n527759.1126306393\r\n 21\r\n178954.417381277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527796.601578126\r\n 20\r\n179043.1395445016\r\n 30\r\n0.0\r\n 11\r\n527616.5327026586\r\n 21\r\n179064.6047964356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527694.8464714251\r\n 20\r\n179497.7635815927\r\n 30\r\n0.0\r\n 11\r\n527531.3497878276\r\n 21\r\n179482.4309926053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527771.4060438636\r\n 20\r\n178897.713284905\r\n 30\r\n0.0\r\n 11\r\n527779.5276250298\r\n 21\r\n179141.2630467593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527573.8011160755\r\n 20\r\n178862.9172875747\r\n 30\r\n0.0\r\n 11\r\n527531.6422290265\r\n 21\r\n179149.9340366772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528437.3553301\r\n 20\r\n180754.5273863803\r\n 30\r\n0.0\r\n 11\r\n528875.2647654894\r\n 21\r\n180805.9507894455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n16FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528966.2110071292\r\n 20\r\n180712.3251185517\r\n 30\r\n0.0\r\n 11\r\n529125.0585334791\r\n 21\r\n180393.6913294563\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1700\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528779.8311440291\r\n 20\r\n181528.9781279204\r\n 30\r\n0.0\r\n 11\r\n528976.924057618\r\n 21\r\n181278.1016776676\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1701\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528610.0466290963\r\n 20\r\n178898.6744360602\r\n 30\r\n0.0\r\n 11\r\n528381.6542351669\r\n 21\r\n178837.4677158369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1702\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527499.6368574303\r\n 20\r\n180238.8424938624\r\n 30\r\n0.0\r\n 11\r\n527408.8582457727\r\n 21\r\n180625.7233147637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1703\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526325.5493438983\r\n 20\r\n179990.7231208413\r\n 30\r\n0.0\r\n 11\r\n528521.0807331772\r\n 21\r\n180775.9064331124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1704\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527907.5126679384\r\n 20\r\n181542.9682871881\r\n 30\r\n0.0\r\n 11\r\n527873.9480757209\r\n 21\r\n181785.9073528567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1705\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527907.6366876462\r\n 20\r\n181576.5631791007\r\n 30\r\n0.0\r\n 11\r\n527703.7441620805\r\n 21\r\n181447.0003382203\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1706\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528067.6852667896\r\n 20\r\n181133.7368389568\r\n 30\r\n0.0\r\n 11\r\n527435.8092670268\r\n 21\r\n182162.9355310014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1707\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527732.2726035179\r\n 20\r\n181549.194381544\r\n 30\r\n0.0\r\n 11\r\n527317.8786819276\r\n 21\r\n181403.7246412206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1708\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527699.4959209979\r\n 20\r\n181610.4750155991\r\n 30\r\n0.0\r\n 11\r\n527784.6158724877\r\n 21\r\n181436.2220042331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1709\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527634.7410276944\r\n 20\r\n181577.6238055718\r\n 30\r\n0.0\r\n 11\r\n527663.4430813943\r\n 21\r\n181520.0752363844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527486.3805875073\r\n 20\r\n181827.0284917456\r\n 30\r\n0.0\r\n 11\r\n527592.3244026941\r\n 21\r\n181327.0006262598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527604.2956093652\r\n 20\r\n181332.8304809776\r\n 30\r\n0.0\r\n 11\r\n527374.0141981476\r\n 21\r\n181269.5355890781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527737.901443869\r\n 20\r\n181196.9802629057\r\n 30\r\n0.0\r\n 11\r\n527587.3701242818\r\n 21\r\n181339.2729321637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527761.4343699937\r\n 20\r\n181280.9337371047\r\n 30\r\n0.0\r\n 11\r\n527689.6385355888\r\n 21\r\n181234.7095234988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527281.8057793569\r\n 20\r\n181593.7828626954\r\n 30\r\n0.0\r\n 11\r\n527376.6560797916\r\n 21\r\n181267.9085432339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n170F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527743.5778082999\r\n 20\r\n181467.0503950839\r\n 30\r\n0.0\r\n 11\r\n527340.7502730433\r\n 21\r\n181334.516613773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1710\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527669.2111869405\r\n 20\r\n180908.3550144651\r\n 30\r\n0.0\r\n 11\r\n527340.678133146\r\n 21\r\n181341.4914307134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1711\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527716.6660929125\r\n 20\r\n180991.8875112333\r\n 30\r\n0.0\r\n 11\r\n527600.4646520663\r\n 21\r\n180974.9537321347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1712\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527679.5706820783\r\n 20\r\n181041.6764671496\r\n 30\r\n0.0\r\n 11\r\n527621.2523089522\r\n 21\r\n180948.592804587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1713\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527576.4541367941\r\n 20\r\n181201.2705050961\r\n 30\r\n0.0\r\n 11\r\n527670.4160191407\r\n 21\r\n181022.4454620314\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1714\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527822.614525894\r\n 20\r\n181243.2673918037\r\n 30\r\n0.0\r\n 11\r\n527517.4728170468\r\n 21\r\n181104.7810392368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1715\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527788.5235844035\r\n 20\r\n181330.413313844\r\n 30\r\n0.0\r\n 11\r\n527825.8547178198\r\n 21\r\n181214.8544457102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1716\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527838.7415829323\r\n 20\r\n181350.2312704753\r\n 30\r\n0.0\r\n 11\r\n527787.2416801685\r\n 21\r\n181328.658581523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1717\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528508.8212567543\r\n 20\r\n181633.8112238231\r\n 30\r\n0.0\r\n 11\r\n527671.5554656998\r\n 21\r\n181169.3970923505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1718\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527658.9177280506\r\n 20\r\n181172.7612196068\r\n 30\r\n0.0\r\n 11\r\n527670.7909275288\r\n 21\r\n181151.5767510934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1719\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527476.4630467304\r\n 20\r\n181226.2736848147\r\n 30\r\n0.0\r\n 11\r\n527439.2134785617\r\n 21\r\n181200.4549543179\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527482.3684364462\r\n 20\r\n181240.642124467\r\n 30\r\n0.0\r\n 11\r\n527471.4839158129\r\n 21\r\n181219.1788152345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527455.5318248391\r\n 20\r\n181298.8509396505\r\n 30\r\n0.0\r\n 11\r\n527483.7139861392\r\n 21\r\n181232.7629062729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527704.1852247286\r\n 20\r\n181234.7195880258\r\n 30\r\n0.0\r\n 11\r\n527849.4810512137\r\n 21\r\n180910.7705625452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528065.5567144552\r\n 20\r\n181153.4548155641\r\n 30\r\n0.0\r\n 11\r\n527958.9529763994\r\n 21\r\n180979.4942126066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527989.1389916457\r\n 20\r\n180972.0011880231\r\n 30\r\n0.0\r\n 11\r\n527739.9484311853\r\n 21\r\n181210.612470911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n171F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527852.6673927681\r\n 20\r\n181272.3565301665\r\n 30\r\n0.0\r\n 11\r\n527869.5202604264\r\n 21\r\n181241.0839450215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1720\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527790.8435772719\r\n 20\r\n181072.3399112507\r\n 30\r\n0.0\r\n 11\r\n527712.9285353634\r\n 21\r\n181020.9484095699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1721\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527744.3463150042\r\n 20\r\n181036.710998872\r\n 30\r\n0.0\r\n 11\r\n527660.964294949\r\n 21\r\n181036.8558209355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1722\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527740.0183205521\r\n 20\r\n181049.1021035675\r\n 30\r\n0.0\r\n 11\r\n527699.3421390562\r\n 21\r\n180980.0398426965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1723\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527768.4864057471\r\n 20\r\n180888.3717967293\r\n 30\r\n0.0\r\n 11\r\n527697.6397767001\r\n 21\r\n180992.5486353334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1724\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528305.2549142606\r\n 20\r\n181222.4813618912\r\n 30\r\n0.0\r\n 11\r\n528017.4095149611\r\n 21\r\n181098.6525719066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1725\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527631.6839665303\r\n 20\r\n181435.5326608375\r\n 30\r\n0.0\r\n 11\r\n527640.529717123\r\n 21\r\n181389.3605628302\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1726\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527699.8701739076\r\n 20\r\n181412.834820827\r\n 30\r\n0.0\r\n 11\r\n527638.7299017251\r\n 21\r\n181389.9729581412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1727\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527707.6347024016\r\n 20\r\n181461.7763946069\r\n 30\r\n0.0\r\n 11\r\n527754.9769341437\r\n 21\r\n181368.8158861762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1728\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527879.3064802673\r\n 20\r\n181454.5768625892\r\n 30\r\n0.0\r\n 11\r\n527630.2559788366\r\n 21\r\n181289.8571640703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1729\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527535.5843399566\r\n 20\r\n181317.1891876006\r\n 30\r\n0.0\r\n 11\r\n527557.8696228134\r\n 21\r\n181252.0514111541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n172A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527587.6670501727\r\n 20\r\n181263.2791108984\r\n 30\r\n0.0\r\n 11\r\n527530.8570137664\r\n 21\r\n181243.6528091551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n172B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527580.4160608368\r\n 20\r\n181267.9145734355\r\n 30\r\n0.0\r\n 11\r\n527604.4575980728\r\n 21\r\n181200.7544632176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n172C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527606.2972144495\r\n 20\r\n181203.9848112346\r\n 30\r\n0.0\r\n 11\r\n527553.712925763\r\n 21\r\n181184.3256561642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n172D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527533.2014056115\r\n 20\r\n181252.3788432797\r\n 30\r\n0.0\r\n 11\r\n527558.5087149551\r\n 21\r\n181179.1283969175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n172E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528084.9383484219\r\n 20\r\n181317.7920351681\r\n 30\r\n0.0\r\n 11\r\n527986.4568372743\r\n 21\r\n181262.9653764555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n172F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527654.9911352492\r\n 20\r\n180948.4997286438\r\n 30\r\n0.0\r\n 11\r\n527667.4434421974\r\n 21\r\n180450.2901774473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1730\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527710.9804939659\r\n 20\r\n180908.5724382659\r\n 30\r\n0.0\r\n 11\r\n527704.3467576817\r\n 21\r\n180681.3599863421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1731\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527880.4409333225\r\n 20\r\n180987.2934757415\r\n 30\r\n0.0\r\n 11\r\n527943.3293116995\r\n 21\r\n180829.5660225076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1732\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528194.5290345232\r\n 20\r\n181091.1185565957\r\n 30\r\n0.0\r\n 11\r\n527611.9285152752\r\n 21\r\n180851.309862782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1733\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527781.268714115\r\n 20\r\n180851.4379315898\r\n 30\r\n0.0\r\n 11\r\n527966.864626705\r\n 21\r\n180907.6844900767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1734\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527803.3745602582\r\n 20\r\n180782.2734192058\r\n 30\r\n0.0\r\n 11\r\n527864.7633675682\r\n 21\r\n180801.4322302122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1735\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527768.1633770963\r\n 20\r\n180823.7153980267\r\n 30\r\n0.0\r\n 11\r\n527818.1105270899\r\n 21\r\n180776.3599576792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1736\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527809.669539492\r\n 20\r\n180794.9828869581\r\n 30\r\n0.0\r\n 11\r\n527793.4390172622\r\n 21\r\n180475.7099424668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1737\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528037.4700725527\r\n 20\r\n180895.1406116638\r\n 30\r\n0.0\r\n 11\r\n528087.9867389572\r\n 21\r\n180589.0534814345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1738\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528023.0785379001\r\n 20\r\n181283.3674605286\r\n 30\r\n0.0\r\n 11\r\n528023.0827191841\r\n 21\r\n181283.3557492687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1739\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528340.439197865\r\n 20\r\n180924.8250785686\r\n 30\r\n0.0\r\n 11\r\n527957.9105047284\r\n 21\r\n180793.3770014409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n173A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527856.4192304206\r\n 20\r\n180636.7933870313\r\n 30\r\n0.0\r\n 11\r\n527990.1522065163\r\n 21\r\n180757.9697497044\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n173B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527976.4400219213\r\n 20\r\n180820.2939552231\r\n 30\r\n0.0\r\n 11\r\n527989.2606680998\r\n 21\r\n180756.2906062517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n173C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527963.8428754701\r\n 20\r\n181004.0903044574\r\n 30\r\n0.0\r\n 11\r\n528060.4698092707\r\n 21\r\n180790.1390587778\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n173D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527621.5138579452\r\n 20\r\n180629.3340164016\r\n 30\r\n0.0\r\n 11\r\n527877.3755086813\r\n 21\r\n180642.9034727321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n173E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527667.4095200623\r\n 20\r\n180807.1107072498\r\n 30\r\n0.0\r\n 11\r\n527128.0576471266\r\n 21\r\n180798.9202597059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n173F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527433.6843319427\r\n 20\r\n180704.6053097688\r\n 30\r\n0.0\r\n 11\r\n527380.3074425424\r\n 21\r\n180809.2018460748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1740\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527371.6131256215\r\n 20\r\n180706.0800917967\r\n 30\r\n0.0\r\n 11\r\n527413.8347052304\r\n 21\r\n180807.4849195685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1741\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527181.7795718828\r\n 20\r\n180697.9252935647\r\n 30\r\n0.0\r\n 11\r\n527382.0094214852\r\n 21\r\n180724.6692403429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1742\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527379.8248971851\r\n 20\r\n180601.3707391883\r\n 30\r\n0.0\r\n 11\r\n527655.9570404891\r\n 21\r\n180650.5874810572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1743\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527634.49593446\r\n 20\r\n180627.1761578001\r\n 30\r\n0.0\r\n 11\r\n527564.727516362\r\n 21\r\n180815.9794419407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1744\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527680.2763528484\r\n 20\r\n180527.0181601985\r\n 30\r\n0.0\r\n 11\r\n527085.8869598081\r\n 21\r\n180596.2012948931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1745\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527410.9385663538\r\n 20\r\n180597.5655134207\r\n 30\r\n0.0\r\n 11\r\n527407.81334307\r\n 21\r\n180690.8504167008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1746\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527413.120279326\r\n 20\r\n180656.1031502381\r\n 30\r\n0.0\r\n 11\r\n527364.7871258904\r\n 21\r\n180724.0478963259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1747\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527400.5081794425\r\n 20\r\n180652.4691513277\r\n 30\r\n0.0\r\n 11\r\n527433.3329921378\r\n 21\r\n180725.5901420843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1748\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527600.5147424299\r\n 20\r\n180727.0991168916\r\n 30\r\n0.0\r\n 11\r\n527422.1431258947\r\n 21\r\n180719.7459291959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1749\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527358.4971803137\r\n 20\r\n181069.3360442441\r\n 30\r\n0.0\r\n 11\r\n527379.258310515\r\n 21\r\n181305.4581219943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n174A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527517.3990442939\r\n 20\r\n180937.9428383985\r\n 30\r\n0.0\r\n 11\r\n527612.146530442\r\n 21\r\n181007.3146020915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n174B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527508.9577948804\r\n 20\r\n180999.4550725032\r\n 30\r\n0.0\r\n 11\r\n527615.7974430798\r\n 21\r\n180973.9425176962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n174C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527296.4057761851\r\n 20\r\n181071.0023693953\r\n 30\r\n0.0\r\n 11\r\n527541.3338659454\r\n 21\r\n181111.0055184133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n174D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527356.0917800875\r\n 20\r\n181119.8855659372\r\n 30\r\n0.0\r\n 11\r\n527467.4798403427\r\n 21\r\n180786.7453186707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n174E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527367.4266915865\r\n 20\r\n180785.7036156728\r\n 30\r\n0.0\r\n 11\r\n527347.4819516342\r\n 21\r\n181077.6241073057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n174F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527408.1019101263\r\n 20\r\n180943.3302605271\r\n 30\r\n0.0\r\n 11\r\n527499.6950365228\r\n 21\r\n180961.2896424068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1750\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527466.2385014737\r\n 20\r\n180950.5102007901\r\n 30\r\n0.0\r\n 11\r\n527525.6073279321\r\n 21\r\n181009.0586822982\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1751\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527460.6400141142\r\n 20\r\n180962.3815086723\r\n 30\r\n0.0\r\n 11\r\n527538.0593810993\r\n 21\r\n180941.635684193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1752\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527566.2059370142\r\n 20\r\n180776.8334207803\r\n 30\r\n0.0\r\n 11\r\n527530.5057297896\r\n 21\r\n180951.7505387501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1753\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527077.0853426155\r\n 20\r\n181153.9455596111\r\n 30\r\n0.0\r\n 11\r\n527370.172406016\r\n 21\r\n181211.0306242986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1754\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527387.1968684147\r\n 20\r\n181613.9091956559\r\n 30\r\n0.0\r\n 11\r\n527546.0443947647\r\n 21\r\n181295.2754065605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1755\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529864.0625938844\r\n 20\r\n179850.1100024555\r\n 30\r\n0.0\r\n 11\r\n530689.4088798159\r\n 21\r\n179901.2472741166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1756\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526146.3666421647\r\n 20\r\n183861.9215044605\r\n 30\r\n0.0\r\n 11\r\n526295.0595649951\r\n 21\r\n183266.6983786453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1757\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526156.7676960638\r\n 20\r\n183757.2998493608\r\n 30\r\n0.0\r\n 11\r\n526872.0452317546\r\n 21\r\n184095.1589363041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1758\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526280.1281120633\r\n 20\r\n183818.8283446044\r\n 30\r\n0.0\r\n 11\r\n526320.8011047294\r\n 21\r\n183676.6896715689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1759\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526172.6945403687\r\n 20\r\n183694.0884457485\r\n 30\r\n0.0\r\n 11\r\n526619.3832154593\r\n 21\r\n183906.1116386753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n175A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526303.3104941537\r\n 20\r\n183704.2550264607\r\n 30\r\n0.0\r\n 11\r\n526364.2262575479\r\n 21\r\n183649.3882056604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n175B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526255.6535841598\r\n 20\r\n183640.3477925701\r\n 30\r\n0.0\r\n 11\r\n526315.3269201439\r\n 21\r\n183704.818882624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n175C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526260.794374798\r\n 20\r\n183658.6587778636\r\n 30\r\n0.0\r\n 11\r\n526298.2976688607\r\n 21\r\n183463.3442732338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n175D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526147.1218396106\r\n 20\r\n183612.73058267\r\n 30\r\n0.0\r\n 11\r\n526579.828602082\r\n 21\r\n183627.6998522125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n175E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526354.247191199\r\n 20\r\n183467.0635497783\r\n 30\r\n0.0\r\n 11\r\n526362.9256044818\r\n 21\r\n183653.5160206742\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n175F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526293.6425841297\r\n 20\r\n183466.2296248381\r\n 30\r\n0.0\r\n 11\r\n526354.8351812499\r\n 21\r\n183467.6741797741\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1760\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526441.1573141331\r\n 20\r\n183292.5913131285\r\n 30\r\n0.0\r\n 11\r\n526423.5172909697\r\n 21\r\n183982.9678032511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1761\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526500.3735382098\r\n 20\r\n183698.0161894802\r\n 30\r\n0.0\r\n 11\r\n526927.332856658\r\n 21\r\n183800.9215245747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1762\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526494.6144850082\r\n 20\r\n183767.2726717287\r\n 30\r\n0.0\r\n 11\r\n526517.7762170607\r\n 21\r\n183574.729034389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1763\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526566.8286919588\r\n 20\r\n183774.8559771781\r\n 30\r\n0.0\r\n 11\r\n526573.9822678175\r\n 21\r\n183710.9461027097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1764\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526514.7235287358\r\n 20\r\n183790.4225115961\r\n 30\r\n0.0\r\n 11\r\n526578.1702533896\r\n 21\r\n183763.7435188542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1765\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526557.7250167089\r\n 20\r\n183763.9802964612\r\n 30\r\n0.0\r\n 11\r\n526943.1435876271\r\n 21\r\n183882.5114018416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1766\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526593.1821208949\r\n 20\r\n183967.9472765855\r\n 30\r\n0.0\r\n 11\r\n526738.5555161251\r\n 21\r\n183587.449878167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1767\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526725.3374610824\r\n 20\r\n183585.8436353218\r\n 30\r\n0.0\r\n 11\r\n526953.0738168576\r\n 21\r\n183657.7597249765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1768\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526686.9306696731\r\n 20\r\n183399.2137364918\r\n 30\r\n0.0\r\n 11\r\n526736.0505498801\r\n 21\r\n183600.4452431444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1769\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526621.5764646847\r\n 20\r\n183456.9269267728\r\n 30\r\n0.0\r\n 11\r\n526706.9655038702\r\n 21\r\n183457.1051075179\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n176A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526687.7712547906\r\n 20\r\n184026.4867210937\r\n 30\r\n0.0\r\n 11\r\n526715.4590134472\r\n 21\r\n183940.72263176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n176B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526817.252760931\r\n 20\r\n184107.5751165661\r\n 30\r\n0.0\r\n 11\r\n526951.7391244286\r\n 21\r\n183654.9587585502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n176C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526535.4923129867\r\n 20\r\n183622.9021839629\r\n 30\r\n0.0\r\n 11\r\n526945.7142486438\r\n 21\r\n183730.3879497893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n176D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526907.4315473432\r\n 20\r\n183254.0098220853\r\n 30\r\n0.0\r\n 11\r\n526941.9868780364\r\n 21\r\n183736.2837096106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n176E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526816.1450377863\r\n 20\r\n183238.5351007249\r\n 30\r\n0.0\r\n 11\r\n526922.9130617307\r\n 21\r\n183287.4239214544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n176F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526820.2533152976\r\n 20\r\n183300.4877575854\r\n 30\r\n0.0\r\n 11\r\n526919.7745033624\r\n 21\r\n183253.9997590661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1770\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526820.164002127\r\n 20\r\n183490.4963649759\r\n 30\r\n0.0\r\n 11\r\n526838.3844023372\r\n 21\r\n183289.3117523006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1771\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526590.6611682273\r\n 20\r\n183392.0731721455\r\n 30\r\n0.0\r\n 11\r\n526922.0915035857\r\n 21\r\n183441.5086364376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1772\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526571.9585185818\r\n 20\r\n183483.7618569228\r\n 30\r\n0.0\r\n 11\r\n526603.371210842\r\n 21\r\n183366.4558115051\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1773\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526501.4775952947\r\n 20\r\n183359.9989028833\r\n 30\r\n0.0\r\n 11\r\n526522.4218541533\r\n 21\r\n183478.9487620135\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1774\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526519.0287964525\r\n 20\r\n183473.1296748034\r\n 30\r\n0.0\r\n 11\r\n526573.9878772992\r\n 21\r\n183482.9846393319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1775\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526196.4405248281\r\n 20\r\n183372.1430748632\r\n 30\r\n0.0\r\n 11\r\n526757.6198582386\r\n 21\r\n183412.0845848348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1776\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526766.4044345876\r\n 20\r\n183421.7727726658\r\n 30\r\n0.0\r\n 11\r\n526767.9398491217\r\n 21\r\n183397.536496668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1777\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526890.5451039946\r\n 20\r\n183565.7949545252\r\n 30\r\n0.0\r\n 11\r\n526935.8445084186\r\n 21\r\n183564.3454263059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1778\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526877.7831560563\r\n 20\r\n183574.6526275019\r\n 30\r\n0.0\r\n 11\r\n526898.5791011399\r\n 21\r\n183562.5416778816\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1779\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526868.7046423821\r\n 20\r\n183638.1037935833\r\n 30\r\n0.0\r\n 11\r\n526880.9324460784\r\n 21\r\n183567.3058897442\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n177A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526694.7455424822\r\n 20\r\n183449.2134150571\r\n 30\r\n0.0\r\n 11\r\n526718.8337582751\r\n 21\r\n183114.217383739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n177B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526797.9205867572\r\n 20\r\n183062.9766257928\r\n 30\r\n0.0\r\n 11\r\n526965.7571857292\r\n 21\r\n183122.9233535809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n177C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526644.3091041178\r\n 20\r\n183148.8166298903\r\n 30\r\n0.0\r\n 11\r\n526677.8083660316\r\n 21\r\n183409.5486689271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n177D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526549.6285343083\r\n 20\r\n183400.1772286422\r\n 30\r\n0.0\r\n 11\r\n526552.4613872791\r\n 21\r\n183364.7658085349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n177E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526689.3727600271\r\n 20\r\n183265.9906037531\r\n 30\r\n0.0\r\n 11\r\n526803.5007252154\r\n 21\r\n183264.9666445346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n177F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526768.5595068004\r\n 20\r\n183261.1394582676\r\n 30\r\n0.0\r\n 11\r\n526838.494677635\r\n 21\r\n183306.5448998165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1780\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526765.464147099\r\n 20\r\n183273.8944478745\r\n 30\r\n0.0\r\n 11\r\n526837.1258694434\r\n 21\r\n183237.9953508338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1781\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526831.5368826524\r\n 20\r\n183070.9002346203\r\n 30\r\n0.0\r\n 11\r\n526831.7619163459\r\n 21\r\n183249.4232088129\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1782\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526646.5637345624\r\n 20\r\n183657.2058092401\r\n 30\r\n0.0\r\n 11\r\n526664.2117238904\r\n 21\r\n183613.6322116076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1783\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526601.6364027762\r\n 20\r\n183601.1158308463\r\n 30\r\n0.0\r\n 11\r\n526665.3903993997\r\n 21\r\n183615.1238843356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1784\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526568.5371013311\r\n 20\r\n183637.9940329533\r\n 30\r\n0.0\r\n 11\r\n526579.2708064839\r\n 21\r\n183534.2263568313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1785\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526428.2985359867\r\n 20\r\n183538.715750499\r\n 30\r\n0.0\r\n 11\r\n526726.8775057319\r\n 21\r\n183535.6612179669\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1786\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526791.5272269688\r\n 20\r\n183610.0263459667\r\n 30\r\n0.0\r\n 11\r\n526808.1904199362\r\n 21\r\n183543.2288778073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1787\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526777.0726188523\r\n 20\r\n183536.4738519391\r\n 30\r\n0.0\r\n 11\r\n526835.4334266978\r\n 21\r\n183550.8470236224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1788\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526780.6436278328\r\n 20\r\n183544.3040661218\r\n 30\r\n0.0\r\n 11\r\n526796.9304441347\r\n 21\r\n183474.8546922448\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1789\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526793.6313980108\r\n 20\r\n183476.56806068\r\n 30\r\n0.0\r\n 11\r\n526848.4617921767\r\n 21\r\n183488.6186901389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n178A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526828.72588772\r\n 20\r\n183556.9008460126\r\n 30\r\n0.0\r\n 11\r\n526847.2574595743\r\n 21\r\n183481.6501407461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n178B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526634.7260185561\r\n 20\r\n183852.0697490888\r\n 30\r\n0.0\r\n 11\r\n526882.8381198066\r\n 21\r\n183944.016119175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n178C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526958.3758547891\r\n 20\r\n184280.0246811046\r\n 30\r\n0.0\r\n 11\r\n526999.0488474554\r\n 21\r\n184137.8860080692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n178D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526850.9422830945\r\n 20\r\n184155.2847822487\r\n 30\r\n0.0\r\n 11\r\n527297.6309581853\r\n 21\r\n184367.3079751753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n178E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526981.5582368797\r\n 20\r\n184165.4513629608\r\n 30\r\n0.0\r\n 11\r\n527042.4740002738\r\n 21\r\n184110.5845421606\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n178F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526933.9013268857\r\n 20\r\n184101.5441290703\r\n 30\r\n0.0\r\n 11\r\n526993.5746628696\r\n 21\r\n184166.0152191241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1790\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526939.5611466158\r\n 20\r\n184118.1083122997\r\n 30\r\n0.0\r\n 11\r\n526977.0644406785\r\n 21\r\n183922.79380767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1791\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526740.309918598\r\n 20\r\n184070.9843235278\r\n 30\r\n0.0\r\n 11\r\n527258.076344808\r\n 21\r\n184088.8961887127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1792\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527032.4949339247\r\n 20\r\n183928.2598862781\r\n 30\r\n0.0\r\n 11\r\n527041.1733472075\r\n 21\r\n184114.7123571743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1793\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526971.8903268556\r\n 20\r\n183927.4259613383\r\n 30\r\n0.0\r\n 11\r\n527033.0829239759\r\n 21\r\n183928.8705162743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1794\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527013.9204027358\r\n 20\r\n183633.0017334758\r\n 30\r\n0.0\r\n 11\r\n527012.2254621887\r\n 21\r\n183930.2273940919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1795\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527009.8694960516\r\n 20\r\n183701.3044251353\r\n 30\r\n0.0\r\n 11\r\n527122.6870704073\r\n 21\r\n183709.6708002807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1796\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527122.6138772766\r\n 20\r\n183628.2042443963\r\n 30\r\n0.0\r\n 11\r\n527104.861432775\r\n 21\r\n184383.5561167509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1797\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527178.6212809359\r\n 20\r\n184159.2125259804\r\n 30\r\n0.0\r\n 11\r\n527813.577229433\r\n 21\r\n184288.3144994509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1798\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527172.862227734\r\n 20\r\n184228.4690082291\r\n 30\r\n0.0\r\n 11\r\n527196.0239597866\r\n 21\r\n184035.925370889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1799\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527245.0764346846\r\n 20\r\n184236.052313678\r\n 30\r\n0.0\r\n 11\r\n527252.2300105434\r\n 21\r\n184172.14243921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527192.9712714617\r\n 20\r\n184251.6188480962\r\n 30\r\n0.0\r\n 11\r\n527256.4179961154\r\n 21\r\n184224.9398553542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527235.9727594348\r\n 20\r\n184225.1766329612\r\n 30\r\n0.0\r\n 11\r\n527370.3370712806\r\n 21\r\n184266.4988514751\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527271.4298636206\r\n 20\r\n184429.1436130856\r\n 30\r\n0.0\r\n 11\r\n527416.803258851\r\n 21\r\n184048.6462146672\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527403.5852038083\r\n 20\r\n184047.0399718219\r\n 30\r\n0.0\r\n 11\r\n527631.3215595834\r\n 21\r\n184118.9560614766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527365.1784123991\r\n 20\r\n183860.4100729922\r\n 30\r\n0.0\r\n 11\r\n527414.298292606\r\n 21\r\n184061.6415796445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n179F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527299.8242074107\r\n 20\r\n183918.1232632729\r\n 30\r\n0.0\r\n 11\r\n527385.2132465961\r\n 21\r\n183918.301444018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527380.8466232018\r\n 20\r\n184490.1155273246\r\n 30\r\n0.0\r\n 11\r\n527408.5343818584\r\n 21\r\n184404.3514379912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527213.7400557126\r\n 20\r\n184084.0985204632\r\n 30\r\n0.0\r\n 11\r\n527623.9619913699\r\n 21\r\n184191.5842862895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527494.3927805122\r\n 20\r\n183699.7314372251\r\n 30\r\n0.0\r\n 11\r\n527601.1608044566\r\n 21\r\n183748.6202579545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527498.5010580233\r\n 20\r\n183761.6840940857\r\n 30\r\n0.0\r\n 11\r\n527598.0222460883\r\n 21\r\n183715.1960955663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527498.4117448529\r\n 20\r\n183951.6927014761\r\n 30\r\n0.0\r\n 11\r\n527516.6321450631\r\n 21\r\n183750.5080888008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527268.9089109532\r\n 20\r\n183853.2695086456\r\n 30\r\n0.0\r\n 11\r\n527693.7275002586\r\n 21\r\n183907.4760789607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527250.2062613076\r\n 20\r\n183944.9581934229\r\n 30\r\n0.0\r\n 11\r\n527281.6189535678\r\n 21\r\n183827.6521480053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527179.7253380207\r\n 20\r\n183821.1952393834\r\n 30\r\n0.0\r\n 11\r\n527200.6695968792\r\n 21\r\n183940.1450985137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527197.2765391785\r\n 20\r\n183934.3260113036\r\n 30\r\n0.0\r\n 11\r\n527252.235620025\r\n 21\r\n183944.180975832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526874.6882675539\r\n 20\r\n183833.3394113636\r\n 30\r\n0.0\r\n 11\r\n527435.8676009643\r\n 21\r\n183873.280921335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527444.6521773135\r\n 20\r\n183882.969109166\r\n 30\r\n0.0\r\n 11\r\n527446.1875918474\r\n 21\r\n183858.7328331681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527568.7928467203\r\n 20\r\n184026.9912910253\r\n 30\r\n0.0\r\n 11\r\n527646.2080503886\r\n 21\r\n184027.1825246443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527556.0308987824\r\n 20\r\n184035.8489640022\r\n 30\r\n0.0\r\n 11\r\n527576.8268438658\r\n 21\r\n184023.7380143818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527546.9523851079\r\n 20\r\n184099.3001300833\r\n 30\r\n0.0\r\n 11\r\n527559.1801888044\r\n 21\r\n184028.5022262444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527372.9932852081\r\n 20\r\n183910.4097515571\r\n 30\r\n0.0\r\n 11\r\n527426.9250448026\r\n 21\r\n183559.489228346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527113.6925585766\r\n 20\r\n183645.9169350216\r\n 30\r\n0.0\r\n 11\r\n527297.6811319859\r\n 21\r\n183557.7418069882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527276.4040582523\r\n 20\r\n183535.0564137323\r\n 30\r\n0.0\r\n 11\r\n527356.0561087577\r\n 21\r\n183870.7450054275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527227.8762770341\r\n 20\r\n183861.3735651424\r\n 30\r\n0.0\r\n 11\r\n527230.7091300049\r\n 21\r\n183825.962145035\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527388.414985323\r\n 20\r\n183727.0003715881\r\n 30\r\n0.0\r\n 11\r\n527481.7484679412\r\n 21\r\n183726.1629810347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527446.8072495261\r\n 20\r\n183722.3357947676\r\n 30\r\n0.0\r\n 11\r\n527516.7424203608\r\n 21\r\n183767.7412363167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527443.7118898248\r\n 20\r\n183735.0907843745\r\n 30\r\n0.0\r\n 11\r\n527515.3736121694\r\n 21\r\n183699.1916873341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527507.0987654129\r\n 20\r\n183584.6688198411\r\n 30\r\n0.0\r\n 11\r\n527510.0096590718\r\n 21\r\n183710.619545313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526916.7194524115\r\n 20\r\n183661.7243328356\r\n 30\r\n0.0\r\n 11\r\n527183.8830550492\r\n 21\r\n183626.0490480191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527324.8114772883\r\n 20\r\n184118.4021457402\r\n 30\r\n0.0\r\n 11\r\n527342.4594666163\r\n 21\r\n184074.8285481079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527279.8841455021\r\n 20\r\n184062.3121673466\r\n 30\r\n0.0\r\n 11\r\n527343.6381421257\r\n 21\r\n184076.3202208358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527246.7848440569\r\n 20\r\n184099.1903694535\r\n 30\r\n0.0\r\n 11\r\n527257.5185492098\r\n 21\r\n183995.4226933316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527106.5462787125\r\n 20\r\n183999.912086999\r\n 30\r\n0.0\r\n 11\r\n527405.1252484577\r\n 21\r\n183996.857554467\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527469.7749696947\r\n 20\r\n184071.2226824668\r\n 30\r\n0.0\r\n 11\r\n527486.438162662\r\n 21\r\n184004.4252143077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527455.3203615782\r\n 20\r\n183997.6701884394\r\n 30\r\n0.0\r\n 11\r\n527513.6811694236\r\n 21\r\n184012.0433601225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527458.8913705585\r\n 20\r\n184005.500402622\r\n 30\r\n0.0\r\n 11\r\n527475.1781868609\r\n 21\r\n183936.0510287449\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527471.8791407367\r\n 20\r\n183937.7643971802\r\n 30\r\n0.0\r\n 11\r\n527526.7095349025\r\n 21\r\n183949.815026639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527506.9736304459\r\n 20\r\n184018.0971825126\r\n 30\r\n0.0\r\n 11\r\n527525.5052023\r\n 21\r\n183942.8464772463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527008.1685822724\r\n 20\r\n183773.3808903472\r\n 30\r\n0.0\r\n 11\r\n527120.6368161418\r\n 21\r\n183780.828501626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527312.973761282\r\n 20\r\n184313.2660855889\r\n 30\r\n0.0\r\n 11\r\n527561.0858625324\r\n 21\r\n184405.2124556752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527335.8734279835\r\n 20\r\n185040.8666845549\r\n 30\r\n0.0\r\n 11\r\n527919.0477671159\r\n 21\r\n183166.9809628446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527544.4143172993\r\n 20\r\n183632.8616138635\r\n 30\r\n0.0\r\n 11\r\n527673.3810309673\r\n 21\r\n183445.6796394856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527359.3700625528\r\n 20\r\n183606.9296638141\r\n 30\r\n0.0\r\n 11\r\n527392.2242523522\r\n 21\r\n183440.3358468486\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526915.8269966726\r\n 20\r\n183500.6085807193\r\n 30\r\n0.0\r\n 11\r\n527693.6597362677\r\n 21\r\n183645.0693403355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527448.9719851374\r\n 20\r\n183529.9862193265\r\n 30\r\n0.0\r\n 11\r\n527643.2933316129\r\n 21\r\n183069.7323576719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527516.4241439892\r\n 20\r\n183546.7144378046\r\n 30\r\n0.0\r\n 11\r\n527330.0369680068\r\n 21\r\n183493.1482288574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527535.4248805666\r\n 20\r\n183476.6332690318\r\n 30\r\n0.0\r\n 11\r\n527473.4732808892\r\n 21\r\n183459.3808779063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527542.4841681129\r\n 20\r\n183530.5538725857\r\n 30\r\n0.0\r\n 11\r\n527526.2629878082\r\n 21\r\n183463.6649435127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527523.236772931\r\n 20\r\n183483.8863626044\r\n 30\r\n0.0\r\n 11\r\n527721.4676373326\r\n 21\r\n183085.4501236723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527733.0237619601\r\n 20\r\n183484.0319248232\r\n 30\r\n0.0\r\n 11\r\n527377.7980020232\r\n 21\r\n183277.2218469782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527374.1047094388\r\n 20\r\n183290.0146803263\r\n 30\r\n0.0\r\n 11\r\n527481.4129521734\r\n 21\r\n183076.6588443756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527183.7386016345\r\n 20\r\n183298.1722389731\r\n 30\r\n0.0\r\n 11\r\n527390.2276942121\r\n 21\r\n183281.7668573049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527230.2927904696\r\n 20\r\n183371.8926021298\r\n 30\r\n0.0\r\n 11\r\n527244.0838495338\r\n 21\r\n183287.6244204047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528134.8774861161\r\n 20\r\n183393.6977037461\r\n 30\r\n0.0\r\n 11\r\n527478.4350058732\r\n 21\r\n183077.5298510543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527380.4186075985\r\n 20\r\n183483.339926926\r\n 30\r\n0.0\r\n 11\r\n527551.9385165398\r\n 21\r\n183095.5047207027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527214.3653902986\r\n 20\r\n183070.3577530247\r\n 30\r\n0.0\r\n 11\r\n527557.1645236159\r\n 21\r\n183100.1244745444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526863.0108382376\r\n 20\r\n183020.7490917978\r\n 30\r\n0.0\r\n 11\r\n527360.3044246794\r\n 21\r\n183087.2087069777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527295.0972429494\r\n 20\r\n183181.1983438331\r\n 30\r\n0.0\r\n 11\r\n527099.3917540238\r\n 21\r\n183131.1324575882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527171.1168625928\r\n 20\r\n183359.2724053633\r\n 30\r\n0.0\r\n 11\r\n527262.9884432511\r\n 21\r\n183072.7638563169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527084.0237982917\r\n 20\r\n183386.3498542505\r\n 30\r\n0.0\r\n 11\r\n527205.3628897168\r\n 21\r\n183391.2783853459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527181.1974413807\r\n 20\r\n183490.4753190934\r\n 30\r\n0.0\r\n 11\r\n527073.8736295296\r\n 21\r\n183435.073781426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527078.4189700695\r\n 20\r\n183440.0451490341\r\n 30\r\n0.0\r\n 11\r\n527085.3698454549\r\n 21\r\n183384.6438293321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527078.8063363808\r\n 20\r\n183778.070793482\r\n 30\r\n0.0\r\n 11\r\n527078.8091857135\r\n 21\r\n183778.0586890183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527112.3427896616\r\n 20\r\n183635.6020684094\r\n 30\r\n0.0\r\n 11\r\n527207.7160715952\r\n 21\r\n183230.4396688804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527218.6809989879\r\n 20\r\n183223.312247723\r\n 30\r\n0.0\r\n 11\r\n527194.9996156784\r\n 21\r\n183217.9320380072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527380.6546446571\r\n 20\r\n183123.7239312546\r\n 30\r\n0.0\r\n 11\r\n527386.4465854053\r\n 21\r\n183078.7729513362\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527387.3641206894\r\n 20\r\n183137.7349489587\r\n 30\r\n0.0\r\n 11\r\n527378.7239987938\r\n 21\r\n183115.2739889114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527448.5559520536\r\n 20\r\n183156.8145103248\r\n 30\r\n0.0\r\n 11\r\n527380.6135250315\r\n 21\r\n183133.4545235604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527234.3446664419\r\n 20\r\n183298.4297236824\r\n 30\r\n0.0\r\n 11\r\n526896.7764445693\r\n 21\r\n183201.283339818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526899.9827787879\r\n 20\r\n183301.2905252701\r\n 30\r\n0.0\r\n 11\r\n527192.4867734056\r\n 21\r\n183308.8257239823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527162.7971416081\r\n 20\r\n183433.8713913096\r\n 30\r\n0.0\r\n 11\r\n527128.2904609601\r\n 21\r\n183425.4284818214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526882.6827136528\r\n 20\r\n183103.0669733985\r\n 30\r\n0.0\r\n 11\r\n527058.9575892087\r\n 21\r\n183131.310046931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527431.9935369405\r\n 20\r\n183379.1591894488\r\n 30\r\n0.0\r\n 11\r\n527391.7913556132\r\n 21\r\n183354.7892375719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527369.457562608\r\n 20\r\n183414.568266419\r\n 30\r\n0.0\r\n 11\r\n527393.4518823327\r\n 21\r\n183353.8634867969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527400.5863184767\r\n 20\r\n183453.1242789833\r\n 30\r\n0.0\r\n 11\r\n527299.8576946609\r\n 21\r\n183425.9822934587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527280.2173434821\r\n 20\r\n183575.7388883725\r\n 30\r\n0.0\r\n 11\r\n527324.8098717205\r\n 21\r\n183280.4928252855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527408.5318940674\r\n 20\r\n183228.5276283497\r\n 30\r\n0.0\r\n 11\r\n527345.2459384735\r\n 21\r\n183201.4268612583\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527333.6156467227\r\n 20\r\n183231.0694696553\r\n 30\r\n0.0\r\n 11\r\n527357.1104773119\r\n 21\r\n183175.7470972171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527341.9150752116\r\n 20\r\n183228.7926635495\r\n 30\r\n0.0\r\n 11\r\n527275.9511290317\r\n 21\r\n183201.640615347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527277.1165489448\r\n 20\r\n183205.1706483711\r\n 30\r\n0.0\r\n 11\r\n527297.7556320369\r\n 21\r\n183152.9631963756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527362.0173412369\r\n 20\r\n183183.3340947189\r\n 30\r\n0.0\r\n 11\r\n527290.6842075074\r\n 21\r\n183153.0409959863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527622.4769279048\r\n 20\r\n183421.9162279387\r\n 30\r\n0.0\r\n 11\r\n527752.8080714243\r\n 21\r\n183191.6391279312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526172.6398658639\r\n 20\r\n183798.7108105307\r\n 30\r\n0.0\r\n 11\r\n525758.1454340727\r\n 21\r\n184286.030813627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525540.2138584358\r\n 20\r\n183597.7464136007\r\n 30\r\n0.0\r\n 11\r\n527616.4438770662\r\n 21\r\n184597.5557938863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526229.3686672956\r\n 20\r\n183925.7679148408\r\n 30\r\n0.0\r\n 11\r\n526144.9611678353\r\n 21\r\n184047.147767945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526064.799718067\r\n 20\r\n183921.4003476109\r\n 30\r\n0.0\r\n 11\r\n526511.4883931579\r\n 21\r\n184133.4235405376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526155.2591332825\r\n 20\r\n184016.1683851839\r\n 30\r\n0.0\r\n 11\r\n526151.2649311015\r\n 21\r\n184098.0533325403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526075.6150280776\r\n 20\r\n184019.6515044495\r\n 30\r\n0.0\r\n 11\r\n526163.2934473707\r\n 21\r\n184025.1217211256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526093.0519312629\r\n 20\r\n184012.0571435086\r\n 30\r\n0.0\r\n 11\r\n525965.44190075\r\n 21\r\n184164.6019988687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525985.5984568236\r\n 20\r\n183953.0266835703\r\n 30\r\n0.0\r\n 11\r\n526270.7776231972\r\n 21\r\n184278.805848628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526003.6978839475\r\n 20\r\n184205.5978744847\r\n 30\r\n0.0\r\n 11\r\n526153.6406479724\r\n 21\r\n184094.4358023696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525964.7341469383\r\n 20\r\n184159.1711469766\r\n 30\r\n0.0\r\n 11\r\n526004.542735631\r\n 21\r\n184205.6673505589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525763.2000248929\r\n 20\r\n184377.885917585\r\n 30\r\n0.0\r\n 11\r\n525992.4067272518\r\n 21\r\n184188.6499438754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525813.5569578426\r\n 20\r\n184331.5626314666\r\n 30\r\n0.0\r\n 11\r\n525891.368509183\r\n 21\r\n184413.6794007321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525828.2052620678\r\n 20\r\n184465.1304386105\r\n 30\r\n0.0\r\n 11\r\n526443.4543435843\r\n 21\r\n183938.4848300049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526275.019891734\r\n 20\r\n184172.7893517072\r\n 30\r\n0.0\r\n 11\r\n526624.6944832488\r\n 21\r\n184438.5174978444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526325.0357963618\r\n 20\r\n184124.5396230914\r\n 30\r\n0.0\r\n 11\r\n526190.5049777605\r\n 21\r\n184264.2213218149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526376.5689214775\r\n 20\r\n184175.693657369\r\n 30\r\n0.0\r\n 11\r\n526331.5770466168\r\n 21\r\n184221.6433787894\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526355.6854196749\r\n 20\r\n184125.4826587656\r\n 30\r\n0.0\r\n 11\r\n526375.1302151602\r\n 21\r\n184191.5065593739\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526362.3870306762\r\n 20\r\n184175.5167183563\r\n 30\r\n0.0\r\n 11\r\n526697.9034325305\r\n 21\r\n184399.1812927491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526542.8303198861\r\n 20\r\n184074.0280263877\r\n 30\r\n0.0\r\n 11\r\n526339.9496769996\r\n 21\r\n184427.2292990156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n17FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526330.3480265903\r\n 20\r\n184418.0040453817\r\n 30\r\n0.0\r\n 11\r\n526530.0534350708\r\n 21\r\n184548.9754984417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1800\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526161.4718436333\r\n 20\r\n184506.245960555\r\n 30\r\n0.0\r\n 11\r\n526348.4341758878\r\n 21\r\n184417.0721515127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1801\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526164.8650642328\r\n 20\r\n184419.1226542814\r\n 30\r\n0.0\r\n 11\r\n526218.990871217\r\n 21\r\n184485.1659490183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1802\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526712.5106458383\r\n 20\r\n184153.2086076598\r\n 30\r\n0.0\r\n 11\r\n526663.56988205\r\n 21\r\n184228.8848432855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1803\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526792.6783634435\r\n 20\r\n184159.3482499835\r\n 30\r\n0.0\r\n 11\r\n526527.03949261\r\n 21\r\n184549.7123618235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1804\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526239.0286861463\r\n 20\r\n184247.4892532267\r\n 30\r\n0.0\r\n 11\r\n526581.6696928112\r\n 21\r\n184497.3539504156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1805\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526310.9550896549\r\n 20\r\n184712.2948244993\r\n 30\r\n0.0\r\n 11\r\n526583.880833825\r\n 21\r\n184490.7385040259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1806\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525992.8709973916\r\n 20\r\n184929.997010199\r\n 30\r\n0.0\r\n 11\r\n526183.3718907056\r\n 21\r\n184783.0056012491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1807\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525830.383102649\r\n 20\r\n184143.3497653357\r\n 30\r\n0.0\r\n 11\r\n526216.1373391672\r\n 21\r\n184552.8753902649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1808\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526229.1974565366\r\n 20\r\n184553.5559043262\r\n 30\r\n0.0\r\n 11\r\n526211.3909523055\r\n 21\r\n184570.0690196928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1809\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526419.2687016282\r\n 20\r\n184558.6761052552\r\n 30\r\n0.0\r\n 11\r\n526458.2672452309\r\n 21\r\n184607.4056927582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526418.0624437224\r\n 20\r\n184543.1883479094\r\n 30\r\n0.0\r\n 11\r\n526421.8277408346\r\n 21\r\n184566.9574238335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526461.4818759007\r\n 20\r\n184496.0372843275\r\n 30\r\n0.0\r\n 11\r\n526414.3616489805\r\n 21\r\n184550.2733109726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525750.5794705347\r\n 20\r\n184608.7482925879\r\n 30\r\n0.0\r\n 11\r\n525816.1275078263\r\n 21\r\n184826.6854894777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525836.2877733857\r\n 20\r\n184447.0196035297\r\n 30\r\n0.0\r\n 11\r\n525735.5049749351\r\n 21\r\n184637.1933595237\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525625.4714226731\r\n 20\r\n184372.2929563019\r\n 30\r\n0.0\r\n 11\r\n525771.5186383708\r\n 21\r\n184272.9622200615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n180F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525713.4256940008\r\n 20\r\n184298.8314740285\r\n 30\r\n0.0\r\n 11\r\n525865.2733286215\r\n 21\r\n184513.9619392872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1810\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526335.831346627\r\n 20\r\n184311.854184065\r\n 30\r\n0.0\r\n 11\r\n526313.2303502487\r\n 21\r\n184353.0768101416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1811\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526263.9695257499\r\n 20\r\n184312.5095601781\r\n 30\r\n0.0\r\n 11\r\n526315.1312625812\r\n 21\r\n184353.0468804205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1812\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526271.614012543\r\n 20\r\n184263.5490927737\r\n 30\r\n0.0\r\n 11\r\n526198.0054952921\r\n 21\r\n184337.4728996437\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1813\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526106.0305223349\r\n 20\r\n184217.6672843158\r\n 30\r\n0.0\r\n 11\r\n526292.442435946\r\n 21\r\n184450.9253598606\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1814\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526390.9327040018\r\n 20\r\n184453.9955091639\r\n 30\r\n0.0\r\n 11\r\n526349.7161546585\r\n 21\r\n184509.1385940667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1815\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526324.8082092294\r\n 20\r\n184489.3006966659\r\n 30\r\n0.0\r\n 11\r\n526372.8429470729\r\n 21\r\n184525.42874556\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1816\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526333.1325333442\r\n 20\r\n184487.1166666029\r\n 30\r\n0.0\r\n 11\r\n526289.6234289066\r\n 21\r\n184543.6448343446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1817\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526288.8650342379\r\n 20\r\n184540.0055797161\r\n 30\r\n0.0\r\n 11\r\n526332.868234571\r\n 21\r\n184574.8668498478\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1818\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526373.2923182385\r\n 20\r\n184516.4044500072\r\n 30\r\n0.0\r\n 11\r\n526326.7078393501\r\n 21\r\n184578.3396913904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1819\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526897.6134313817\r\n 20\r\n184224.2046449315\r\n 30\r\n0.0\r\n 11\r\n526750.5592740903\r\n 21\r\n184399.9929827601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526842.5800905745\r\n 20\r\n184263.4335107758\r\n 30\r\n0.0\r\n 11\r\n527056.9201882246\r\n 21\r\n184512.6902832656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526789.8404489752\r\n 20\r\n184439.4823091223\r\n 30\r\n0.0\r\n 11\r\n526939.783213\r\n 21\r\n184328.3202370075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526750.8767119656\r\n 20\r\n184393.0555816145\r\n 30\r\n0.0\r\n 11\r\n526790.6853006583\r\n 21\r\n184439.5517851969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526549.3425899203\r\n 20\r\n184611.7703522228\r\n 30\r\n0.0\r\n 11\r\n526778.5492922794\r\n 21\r\n184422.5343785133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526692.5574984854\r\n 20\r\n184628.4080760892\r\n 30\r\n0.0\r\n 11\r\n527188.3396056741\r\n 21\r\n184207.6850059707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n181F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527061.1624567615\r\n 20\r\n184406.6737863451\r\n 30\r\n0.0\r\n 11\r\n527272.4860252165\r\n 21\r\n184567.2648657181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1820\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527111.1783613893\r\n 20\r\n184358.4240577295\r\n 30\r\n0.0\r\n 11\r\n526976.6475427879\r\n 21\r\n184498.1057564528\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1821\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527162.711486505\r\n 20\r\n184409.5780920069\r\n 30\r\n0.0\r\n 11\r\n527117.7196116441\r\n 21\r\n184455.5278134274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1822\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527141.8279847026\r\n 20\r\n184359.3670934034\r\n 30\r\n0.0\r\n 11\r\n527161.2727801879\r\n 21\r\n184425.3909940119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1823\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527148.5295957035\r\n 20\r\n184409.4011529941\r\n 30\r\n0.0\r\n 11\r\n527484.0459975578\r\n 21\r\n184633.065727387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1824\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527274.0698449415\r\n 20\r\n184403.2704430421\r\n 30\r\n0.0\r\n 11\r\n527126.0922420271\r\n 21\r\n184661.1137336536\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1825\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527116.490591618\r\n 20\r\n184651.8884800196\r\n 30\r\n0.0\r\n 11\r\n527316.1960000983\r\n 21\r\n184782.8599330798\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1826\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526978.3772804878\r\n 20\r\n184725.4576938802\r\n 30\r\n0.0\r\n 11\r\n527134.5767409155\r\n 21\r\n184650.9565861506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1827\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526827.5450292298\r\n 20\r\n184482.4090883761\r\n 30\r\n0.0\r\n 11\r\n527005.1334362445\r\n 21\r\n184719.0503836559\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1828\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527025.1712511737\r\n 20\r\n184481.3736878646\r\n 30\r\n0.0\r\n 11\r\n527367.8122578385\r\n 21\r\n184731.2383850533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1829\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526932.5809737569\r\n 20\r\n185045.0461003779\r\n 30\r\n0.0\r\n 11\r\n527135.858719686\r\n 21\r\n184743.0230287044\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526904.8237453241\r\n 20\r\n184941.8305093475\r\n 30\r\n0.0\r\n 11\r\n527010.2055709973\r\n 21\r\n184993.6397609068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526955.4196256611\r\n 20\r\n184905.843476556\r\n 30\r\n0.0\r\n 11\r\n526982.3255175957\r\n 21\r\n185012.3407716361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526616.5256676765\r\n 20\r\n184377.2341999736\r\n 30\r\n0.0\r\n 11\r\n526838.8137058941\r\n 21\r\n184605.691738446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526825.3214585717\r\n 20\r\n184582.8102803995\r\n 30\r\n0.0\r\n 11\r\n526753.5128899614\r\n 21\r\n184978.2282779938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526752.0011926325\r\n 20\r\n184864.9640085656\r\n 30\r\n0.0\r\n 11\r\n526915.8108504811\r\n 21\r\n184896.5445007636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n182F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526892.2504283604\r\n 20\r\n184890.6714296093\r\n 30\r\n0.0\r\n 11\r\n526971.645669471\r\n 21\r\n184916.1464748675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1830\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526900.1754142045\r\n 20\r\n184880.2088481438\r\n 30\r\n0.0\r\n 11\r\n526917.6708325288\r\n 21\r\n184958.426863686\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1831\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526823.7113538355\r\n 20\r\n185024.4236562697\r\n 30\r\n0.0\r\n 11\r\n526923.1332783114\r\n 21\r\n184947.0457557922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1832\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526510.1397750775\r\n 20\r\n184518.3029687869\r\n 30\r\n0.0\r\n 11\r\n526588.3675743969\r\n 21\r\n184645.4063717812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1833\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527121.9739116546\r\n 20\r\n184545.7386187029\r\n 30\r\n0.0\r\n 11\r\n527099.3729152762\r\n 21\r\n184586.9612447796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1834\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527050.1120907775\r\n 20\r\n184546.3939948161\r\n 30\r\n0.0\r\n 11\r\n527101.2738276086\r\n 21\r\n184586.9313150585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1835\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527057.7565775703\r\n 20\r\n184497.4335274115\r\n 30\r\n0.0\r\n 11\r\n526984.1480603196\r\n 21\r\n184571.3573342815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1836\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526892.1730873623\r\n 20\r\n184451.5517189536\r\n 30\r\n0.0\r\n 11\r\n527078.5850009737\r\n 21\r\n184684.8097944985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1837\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527177.0752690295\r\n 20\r\n184687.8799438017\r\n 30\r\n0.0\r\n 11\r\n527135.858719686\r\n 21\r\n184743.0230287044\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1838\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526976.7466853434\r\n 20\r\n184707.544365911\r\n 30\r\n0.0\r\n 11\r\n527158.9855121005\r\n 21\r\n184759.3131801978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1839\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526654.4660197752\r\n 20\r\n184518.5584666173\r\n 30\r\n0.0\r\n 11\r\n526731.3448775517\r\n 21\r\n184600.9854753612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526950.1892693617\r\n 20\r\n185002.0656262611\r\n 30\r\n0.0\r\n 11\r\n526794.7357978775\r\n 21\r\n185555.5789665183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526884.6421618659\r\n 20\r\n185022.8640277708\r\n 30\r\n0.0\r\n 11\r\n526821.1612098639\r\n 21\r\n185241.1291727191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526747.5557430888\r\n 20\r\n184895.8949132786\r\n 30\r\n0.0\r\n 11\r\n526639.2579063532\r\n 21\r\n185026.6789956317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526627.0050355719\r\n 20\r\n184823.9927585792\r\n 30\r\n0.0\r\n 11\r\n527362.5387850584\r\n 21\r\n185447.5890790977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526744.594477287\r\n 20\r\n185013.962813596\r\n 30\r\n0.0\r\n 11\r\n526538.0210973291\r\n 21\r\n185401.533718455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n183F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526800.2018736364\r\n 20\r\n185055.6454778395\r\n 30\r\n0.0\r\n 11\r\n526640.8564858529\r\n 21\r\n184945.1078575293\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1840\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526757.9191734891\r\n 20\r\n185114.6757368199\r\n 30\r\n0.0\r\n 11\r\n526705.3834328252\r\n 21\r\n185077.5860933195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1841\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526804.1579407269\r\n 20\r\n185086.0533429193\r\n 30\r\n0.0\r\n 11\r\n526742.0791783166\r\n 21\r\n185115.7767811565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1842\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526755.8325669559\r\n 20\r\n185100.647073046\r\n 30\r\n0.0\r\n 11\r\n526588.5271048182\r\n 21\r\n185467.5339494677\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1843\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526884.7942566758\r\n 20\r\n185262.5995901697\r\n 30\r\n0.0\r\n 11\r\n526503.7627330624\r\n 21\r\n185118.6319818105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1844\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526511.3389918514\r\n 20\r\n185107.6822193495\r\n 30\r\n0.0\r\n 11\r\n526413.8858925074\r\n 21\r\n185325.7158523542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1845\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526397.2989610982\r\n 20\r\n184955.0366424418\r\n 30\r\n0.0\r\n 11\r\n526515.1427734561\r\n 21\r\n185125.3883896891\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1846\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526483.8486768585\r\n 20\r\n184944.4947667127\r\n 30\r\n0.0\r\n 11\r\n526427.2806052112\r\n 21\r\n185008.4586083068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1847\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526840.4035060879\r\n 20\r\n185522.8553234135\r\n 30\r\n0.0\r\n 11\r\n526412.677887643\r\n 21\r\n185322.8579613402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1848\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526665.1115230083\r\n 20\r\n184990.3428613132\r\n 30\r\n0.0\r\n 11\r\n526473.077143995\r\n 21\r\n185368.4407634845\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1849\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526142.309491468\r\n 20\r\n185023.4850477535\r\n 30\r\n0.0\r\n 11\r\n526479.960517171\r\n 21\r\n185369.568792402\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525980.8306060982\r\n 20\r\n184903.3662741616\r\n 30\r\n0.0\r\n 11\r\n526345.4878643996\r\n 21\r\n185225.2156793015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526191.356440681\r\n 20\r\n184944.954221952\r\n 30\r\n0.0\r\n 11\r\n526157.0130028118\r\n 21\r\n185057.2487276261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526234.9505034651\r\n 20\r\n184989.1647108225\r\n 30\r\n0.0\r\n 11\r\n526134.1058144044\r\n 21\r\n185032.7072138333\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526377.0795550635\r\n 20\r\n185115.2702679994\r\n 30\r\n0.0\r\n 11\r\n526214.5545125192\r\n 21\r\n184995.3000970941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526436.6567078091\r\n 20\r\n184906.6268665365\r\n 30\r\n0.0\r\n 11\r\n526272.7679378563\r\n 21\r\n185158.9520676018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n184F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526357.4471082533\r\n 20\r\n184840.4476801803\r\n 30\r\n0.0\r\n 11\r\n526327.8126399383\r\n 21\r\n184553.7179558004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1850\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526702.7607323182\r\n 20\r\n184570.3205013269\r\n 30\r\n0.0\r\n 11\r\n526702.7531557811\r\n 21\r\n184570.3303619977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1851\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526507.3444309529\r\n 20\r\n184805.8431383081\r\n 30\r\n0.0\r\n 11\r\n526359.9824307177\r\n 21\r\n185016.4377554403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1852\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526361.3930396807\r\n 20\r\n185029.4392917895\r\n 30\r\n0.0\r\n 11\r\n526342.251967972\r\n 21\r\n185014.4935918768\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1853\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526386.6449285419\r\n 20\r\n185217.8952197336\r\n 30\r\n0.0\r\n 11\r\n526355.4807307931\r\n 21\r\n185250.8031207893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1854\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526401.7422031849\r\n 20\r\n185214.2348940512\r\n 30\r\n0.0\r\n 11\r\n526378.8775942331\r\n 21\r\n185221.7419633934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1855\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526455.2131926328\r\n 20\r\n185249.5806600645\r\n 30\r\n0.0\r\n 11\r\n526394.1577971015\r\n 21\r\n185211.7111334264\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1856\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526429.4944541394\r\n 20\r\n184994.0813645118\r\n 30\r\n0.0\r\n 11\r\n526140.7997494224\r\n 21\r\n184793.968666802\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1857\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526284.3821589323\r\n 20\r\n184804.1957133648\r\n 30\r\n0.0\r\n 11\r\n526411.0839343908\r\n 21\r\n184955.0786364757\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1858\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526813.624339175\r\n 20\r\n184874.9987138734\r\n 30\r\n0.0\r\n 11\r\n526117.198523644\r\n 21\r\n184800.3091828398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1859\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526282.1184163698\r\n 20\r\n184883.8219749501\r\n 30\r\n0.0\r\n 11\r\n526219.5156131227\r\n 21\r\n184953.0515150769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526239.8562063999\r\n 20\r\n184924.3845242305\r\n 30\r\n0.0\r\n 11\r\n526227.366538283\r\n 21\r\n185006.8259606097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526251.4485595676\r\n 20\r\n184930.5398763398\r\n 30\r\n0.0\r\n 11\r\n526177.0208654439\r\n 21\r\n184960.2832111424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526055.79485749\r\n 20\r\n184845.1473364929\r\n 30\r\n0.0\r\n 11\r\n526189.1273452085\r\n 21\r\n184963.8610706331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526617.0051048034\r\n 20\r\n185096.1699463408\r\n 30\r\n0.0\r\n 11\r\n526572.7061751235\r\n 21\r\n185080.4309893497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526604.8998507491\r\n 20\r\n185025.3320070574\r\n 30\r\n0.0\r\n 11\r\n526573.0388196335\r\n 21\r\n185082.3028096171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n185F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526673.3455933371\r\n 20\r\n184854.2911744704\r\n 30\r\n0.0\r\n 11\r\n526472.7948735252\r\n 21\r\n185075.5108393422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1860\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526485.4681327537\r\n 20\r\n185173.2305774661\r\n 30\r\n0.0\r\n 11\r\n526339.4935442785\r\n 21\r\n185092.6910088522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1861\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526770.5658452664\r\n 20\r\n185216.7153135767\r\n 30\r\n0.0\r\n 11\r\n526674.5592140982\r\n 21\r\n185463.2847288145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1862\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526034.838448984\r\n 20\r\n184377.5229186959\r\n 30\r\n0.0\r\n 11\r\n526162.9583683656\r\n 21\r\n184271.426179767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1863\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525944.3955297334\r\n 20\r\n184418.9332707799\r\n 30\r\n0.0\r\n 11\r\n525883.1890116699\r\n 21\r\n184244.8502677682\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1864\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526610.0769078264\r\n 20\r\n185042.3659122216\r\n 30\r\n0.0\r\n 11\r\n526510.4617097421\r\n 21\r\n184980.6649727358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1865\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526540.7939205786\r\n 20\r\n184077.5732577944\r\n 30\r\n0.0\r\n 11\r\n526721.0522125807\r\n 21\r\n183995.2863186054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1866\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529002.4945046415\r\n 20\r\n182989.4166194158\r\n 30\r\n0.0\r\n 11\r\n529149.9114243247\r\n 21\r\n182978.1940307746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1867\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529082.1590611431\r\n 20\r\n182845.3486731855\r\n 30\r\n0.0\r\n 11\r\n529038.4653913891\r\n 21\r\n183337.8681855062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1868\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529117.9874533724\r\n 20\r\n182971.3653905561\r\n 30\r\n0.0\r\n 11\r\n529190.5948485013\r\n 21\r\n183009.4345963159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1869\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529161.3658895741\r\n 20\r\n182904.4802136752\r\n 30\r\n0.0\r\n 11\r\n529121.6319291057\r\n 21\r\n182982.8296927146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529145.9800161928\r\n 20\r\n182915.6603215054\r\n 30\r\n0.0\r\n 11\r\n529342.1620844844\r\n 21\r\n182882.9976690538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529149.5716516822\r\n 20\r\n182793.1125980499\r\n 30\r\n0.0\r\n 11\r\n529285.810685997\r\n 21\r\n183204.0847952215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529358.1052558049\r\n 20\r\n182936.7563646868\r\n 30\r\n0.0\r\n 11\r\n529186.2722550136\r\n 21\r\n183009.6484671357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529337.839644036\r\n 20\r\n182879.6344003608\r\n 30\r\n0.0\r\n 11\r\n529357.7368392796\r\n 21\r\n182937.5198242835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529628.5345965598\r\n 20\r\n182816.7965311425\r\n 30\r\n0.0\r\n 11\r\n529349.2207426371\r\n 21\r\n182918.4318456688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n186F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529563.0764663739\r\n 20\r\n182836.7188986079\r\n 30\r\n0.0\r\n 11\r\n529594.4117381667\r\n 21\r\n182945.4198740323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1870\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.7820878086\r\n 20\r\n182917.0583723003\r\n 30\r\n0.0\r\n 11\r\n528898.3699407844\r\n 21\r\n183180.8853994138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1871\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529192.2768187649\r\n 20\r\n183153.9957730478\r\n 30\r\n0.0\r\n 11\r\n529244.0572068602\r\n 21\r\n183590.1179566264\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1872\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529125.3310361034\r\n 20\r\n183172.6475614621\r\n 30\r\n0.0\r\n 11\r\n529313.9339647009\r\n 21\r\n183127.4983262947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1873\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529143.2993213422\r\n 20\r\n183243.00052112\r\n 30\r\n0.0\r\n 11\r\n529205.7155989878\r\n 21\r\n183227.5133010033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1874\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529110.6058846278\r\n 20\r\n183199.5447479236\r\n 30\r\n0.0\r\n 11\r\n529157.6589570039\r\n 21\r\n183249.7768482477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1875\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529150.3364046958\r\n 20\r\n183230.6864319542\r\n 30\r\n0.0\r\n 11\r\n529173.0367678382\r\n 21\r\n183633.2802610981\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1876\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528971.3791487153\r\n 20\r\n183334.7731061746\r\n 30\r\n0.0\r\n 11\r\n529378.6802900167\r\n 21\r\n183338.9533619875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1877\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529375.5960000428\r\n 20\r\n183326.0002098403\r\n 30\r\n0.0\r\n 11\r\n529387.2477611892\r\n 21\r\n183564.537435772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1878\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529537.2708909291\r\n 20\r\n183225.1685163086\r\n 30\r\n0.0\r\n 11\r\n529365.6238454158\r\n 21\r\n183341.117529533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1879\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529460.4528499908\r\n 20\r\n183183.9256620372\r\n 30\r\n0.0\r\n 11\r\n529489.9408801077\r\n 21\r\n183264.0616454732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528721.379921109\r\n 20\r\n183580.3838869297\r\n 30\r\n0.0\r\n 11\r\n529039.3752873129\r\n 21\r\n183439.9840603285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528918.2607131755\r\n 20\r\n183593.3886842624\r\n 30\r\n0.0\r\n 11\r\n529389.4108538934\r\n 21\r\n183562.3130601848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529274.9119920447\r\n 20\r\n183160.8419620406\r\n 30\r\n0.0\r\n 11\r\n529316.5842563571\r\n 21\r\n183582.8593180066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529750.0154457829\r\n 20\r\n183381.516104049\r\n 30\r\n0.0\r\n 11\r\n529309.7609766477\r\n 21\r\n183581.4115163893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529988.005583848\r\n 20\r\n183294.6626457544\r\n 30\r\n0.0\r\n 11\r\n529487.4641051801\r\n 21\r\n183495.7242144426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n187F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529732.8236843104\r\n 20\r\n183290.5373308892\r\n 30\r\n0.0\r\n 11\r\n529724.0578069372\r\n 21\r\n183407.6385141588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1880\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529676.1539762847\r\n 20\r\n183315.9056936367\r\n 30\r\n0.0\r\n 11\r\n529754.3115197908\r\n 21\r\n183393.0872929542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1881\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529497.9412056234\r\n 20\r\n183381.8108317713\r\n 30\r\n0.0\r\n 11\r\n529692.9311665412\r\n 21\r\n183329.0268711166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1882\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529510.5331576017\r\n 20\r\n183132.4113161336\r\n 30\r\n0.0\r\n 11\r\n529579.2785852399\r\n 21\r\n183460.3808246315\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1883\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529418.0562012752\r\n 20\r\n183146.715740923\r\n 30\r\n0.0\r\n 11\r\n529538.9701211892\r\n 21\r\n183135.4334761842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1884\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529509.6380631061\r\n 20\r\n183037.6396577352\r\n 30\r\n0.0\r\n 11\r\n529405.3659134461\r\n 21\r\n183098.5908658569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1885\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529409.6444093042\r\n 20\r\n183093.3880695214\r\n 30\r\n0.0\r\n 11\r\n529419.489826466\r\n 21\r\n183148.3488614938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1886\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529392.3121772476\r\n 20\r\n182755.8068495324\r\n 30\r\n0.0\r\n 11\r\n529549.751119872\r\n 21\r\n183295.9277136093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1887\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529543.7167941479\r\n 20\r\n183307.5301563754\r\n 30\r\n0.0\r\n 11\r\n529566.9777532239\r\n 21\r\n183300.5528822005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1888\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529451.7724354552\r\n 20\r\n183473.9619128789\r\n 30\r\n0.0\r\n 11\r\n529468.8639611219\r\n 21\r\n183515.9382981882\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1889\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529439.0339467371\r\n 20\r\n183465.070535544\r\n 30\r\n0.0\r\n 11\r\n529457.6133766657\r\n 21\r\n183480.3659994512\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529376.3793059448\r\n 20\r\n183478.5933264844\r\n 30\r\n0.0\r\n 11\r\n529447.0171259769\r\n 21\r\n183465.4723222404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529493.0974417447\r\n 20\r\n183249.8615614997\r\n 30\r\n0.0\r\n 11\r\n529916.9032413744\r\n 21\r\n183154.751472073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529888.0572707052\r\n 20\r\n183141.4631650017\r\n 30\r\n0.0\r\n 11\r\n529896.7457502339\r\n 21\r\n183342.5572290356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529651.0735796021\r\n 20\r\n182914.8438654025\r\n 30\r\n0.0\r\n 11\r\n529906.1021607946\r\n 21\r\n183172.8070170999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529875.041216191\r\n 20\r\n183036.5611619992\r\n 30\r\n0.0\r\n 11\r\n529524.4111204172\r\n 21\r\n183220.203281717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n188F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529488.683131434\r\n 20\r\n183096.7472006318\r\n 30\r\n0.0\r\n 11\r\n529522.8742442423\r\n 21\r\n183087.1055443997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1890\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.4465953165\r\n 20\r\n183200.6263381069\r\n 30\r\n0.0\r\n 11\r\n529703.6460430593\r\n 21\r\n183287.8595707087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1891\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529695.1001273892\r\n 20\r\n183253.764066248\r\n 30\r\n0.0\r\n 11\r\n529676.8089733075\r\n 21\r\n183335.1152550795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1892\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529682.0640560481\r\n 20\r\n183255.2911076818\r\n 30\r\n0.0\r\n 11\r\n529740.6163598035\r\n 21\r\n183310.0247841765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1893\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529895.369820892\r\n 20\r\n183246.7525081241\r\n 30\r\n0.0\r\n 11\r\n529728.0369450099\r\n 21\r\n183308.9635329003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1894\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529693.5360133447\r\n 20\r\n182695.2429836775\r\n 30\r\n0.0\r\n 11\r\n529533.8761624989\r\n 21\r\n182770.7752046368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1895\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529585.6253156224\r\n 20\r\n182733.8153123566\r\n 30\r\n0.0\r\n 11\r\n529694.0815682416\r\n 21\r\n182973.7654373622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1896\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529281.3180175185\r\n 20\r\n183276.9133290334\r\n 30\r\n0.0\r\n 11\r\n529328.3084743434\r\n 21\r\n183278.3299818934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1897\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529318.3137405335\r\n 20\r\n183215.3027187767\r\n 30\r\n0.0\r\n 11\r\n529327.3189961681\r\n 21\r\n183279.9533415037\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1898\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529272.2357810101\r\n 20\r\n183197.0712297279\r\n 30\r\n0.0\r\n 11\r\n529373.2723181507\r\n 21\r\n183171.0989137618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1899\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529316.6305635991\r\n 20\r\n183031.0828691245\r\n 30\r\n0.0\r\n 11\r\n529423.1897224751\r\n 21\r\n183310.0163325214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n189A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529375.9058362808\r\n 20\r\n183396.4685900099\r\n 30\r\n0.0\r\n 11\r\n529444.3326079678\r\n 21\r\n183388.8962278366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n189B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529439.860142844\r\n 20\r\n183357.3693349594\r\n 30\r\n0.0\r\n 11\r\n529446.6499833035\r\n 21\r\n183417.089264825\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n189C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529433.7575016177\r\n 20\r\n183363.4374589976\r\n 30\r\n0.0\r\n 11\r\n529504.5404009335\r\n 21\r\n183354.5911557249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n189D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529501.7879393648\r\n 20\r\n183352.0924976781\r\n 30\r\n0.0\r\n 11\r\n529509.5296659485\r\n 21\r\n183407.695154667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n189E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529438.6434841719\r\n 20\r\n183412.9016860105\r\n 30\r\n0.0\r\n 11\r\n529515.6462087013\r\n 21\r\n183404.1456473196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n189F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529494.895595546\r\n 20\r\n182860.1555962907\r\n 30\r\n0.0\r\n 11\r\n529526.9711199328\r\n 21\r\n182968.2098941174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529094.4719762004\r\n 20\r\n183333.4875583031\r\n 30\r\n0.0\r\n 11\r\n529094.416596101\r\n 21\r\n183598.0886669403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528799.8989817682\r\n 20\r\n183846.8871999126\r\n 30\r\n0.0\r\n 11\r\n528751.9949650761\r\n 21\r\n184436.6604579644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528708.8283584604\r\n 20\r\n183751.1739329707\r\n 30\r\n0.0\r\n 11\r\n528952.9732172928\r\n 21\r\n183774.3958920667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528978.6545404572\r\n 20\r\n182821.6705424059\r\n 30\r\n0.0\r\n 11\r\n528841.5271843571\r\n 21\r\n184134.0700467983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528921.0492463402\r\n 20\r\n183767.5672518482\r\n 30\r\n0.0\r\n 11\r\n528993.6566414693\r\n 21\r\n183805.636457608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528964.4276825422\r\n 20\r\n183700.6820749673\r\n 30\r\n0.0\r\n 11\r\n528924.6937220741\r\n 21\r\n183779.0315540066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528950.8601394615\r\n 20\r\n183711.7422512852\r\n 30\r\n0.0\r\n 11\r\n529147.042207753\r\n 21\r\n183679.0795988337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528925.852151978\r\n 20\r\n183508.5272844486\r\n 30\r\n0.0\r\n 11\r\n529088.8724789651\r\n 21\r\n184000.2866565134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529161.1670487729\r\n 20\r\n183732.9582259788\r\n 30\r\n0.0\r\n 11\r\n528989.3340479817\r\n 21\r\n183805.8503284278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529140.901437004\r\n 20\r\n183675.836261653\r\n 30\r\n0.0\r\n 11\r\n529160.7986322474\r\n 21\r\n183733.7216855758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529431.5963895281\r\n 20\r\n183612.9983924347\r\n 30\r\n0.0\r\n 11\r\n529152.2825356053\r\n 21\r\n183714.633706961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529366.1382593417\r\n 20\r\n183632.9207599\r\n 30\r\n0.0\r\n 11\r\n529397.4735311349\r\n 21\r\n183741.6217353242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529473.8438807766\r\n 20\r\n183713.2602335924\r\n 30\r\n0.0\r\n 11\r\n528759.3426455927\r\n 21\r\n183958.9421117921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528995.3386117331\r\n 20\r\n183950.19763434\r\n 30\r\n0.0\r\n 11\r\n529047.1189998285\r\n 21\r\n184386.3198179183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528928.3928290715\r\n 20\r\n183968.8494227541\r\n 30\r\n0.0\r\n 11\r\n529116.9957576689\r\n 21\r\n183923.7001875868\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528946.36111431\r\n 20\r\n184039.202382412\r\n 30\r\n0.0\r\n 11\r\n529008.777391956\r\n 21\r\n184023.7151622953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528913.6676775958\r\n 20\r\n183995.7466092156\r\n 30\r\n0.0\r\n 11\r\n528960.720749972\r\n 21\r\n184045.9787095397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528953.3981976639\r\n 20\r\n184026.8882932462\r\n 30\r\n0.0\r\n 11\r\n528976.0985608062\r\n 21\r\n184429.48212239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528774.4409416834\r\n 20\r\n184130.9749674667\r\n 30\r\n0.0\r\n 11\r\n529181.7420829849\r\n 21\r\n184135.1552232796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529178.657793011\r\n 20\r\n184122.2020711322\r\n 30\r\n0.0\r\n 11\r\n529190.3095541572\r\n 21\r\n184360.739297064\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529340.3326838975\r\n 20\r\n184021.3703776007\r\n 30\r\n0.0\r\n 11\r\n529168.6856383837\r\n 21\r\n184137.3193908248\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529263.514642959\r\n 20\r\n183980.1275233293\r\n 30\r\n0.0\r\n 11\r\n529293.0026730755\r\n 21\r\n184060.2635067652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528759.5507635506\r\n 20\r\n184261.0245410653\r\n 30\r\n0.0\r\n 11\r\n528849.5923701449\r\n 21\r\n184257.2035358896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528721.3225061437\r\n 20\r\n184389.5905455545\r\n 30\r\n0.0\r\n 11\r\n529192.4726468614\r\n 21\r\n184358.5149214769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529077.9737850126\r\n 20\r\n183957.0438233327\r\n 30\r\n0.0\r\n 11\r\n529119.6460493255\r\n 21\r\n184379.0611792988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529607.0855259606\r\n 20\r\n184151.2387982638\r\n 30\r\n0.0\r\n 11\r\n529112.8227696159\r\n 21\r\n184377.6133776814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529535.8854772784\r\n 20\r\n184086.7391921813\r\n 30\r\n0.0\r\n 11\r\n529527.1195999053\r\n 21\r\n184203.8403754511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529479.2157692527\r\n 20\r\n184112.1075549288\r\n 30\r\n0.0\r\n 11\r\n529557.3733127589\r\n 21\r\n184189.2891542463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529301.0029985914\r\n 20\r\n184178.0126930631\r\n 30\r\n0.0\r\n 11\r\n529495.9929595092\r\n 21\r\n184125.2287324086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529313.59495057\r\n 20\r\n183928.6131774258\r\n 30\r\n0.0\r\n 11\r\n529382.340378208\r\n 21\r\n184256.5826859235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529221.1179942434\r\n 20\r\n183942.917602215\r\n 30\r\n0.0\r\n 11\r\n529342.0319141572\r\n 21\r\n183931.6353374763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529312.699856074\r\n 20\r\n183833.8415190274\r\n 30\r\n0.0\r\n 11\r\n529208.4277064143\r\n 21\r\n183894.792727149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529212.7062022725\r\n 20\r\n183889.5899308134\r\n 30\r\n0.0\r\n 11\r\n529222.5516194342\r\n 21\r\n183944.5507227859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529195.3739702155\r\n 20\r\n183552.0087108246\r\n 30\r\n0.0\r\n 11\r\n529352.8129128399\r\n 21\r\n184092.1295749014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529346.7785871158\r\n 20\r\n184103.7320176673\r\n 30\r\n0.0\r\n 11\r\n529370.0395461917\r\n 21\r\n184096.7547434928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529254.8342284231\r\n 20\r\n184270.163774171\r\n 30\r\n0.0\r\n 11\r\n529271.9257540901\r\n 21\r\n184312.1401594801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529242.0957397047\r\n 20\r\n184261.272396836\r\n 30\r\n0.0\r\n 11\r\n529260.6751696339\r\n 21\r\n184276.5678607432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529179.4410989126\r\n 20\r\n184274.7951877764\r\n 30\r\n0.0\r\n 11\r\n529250.0789189447\r\n 21\r\n184261.6741835324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529296.1592347129\r\n 20\r\n184046.0634227918\r\n 30\r\n0.0\r\n 11\r\n529643.9673254191\r\n 21\r\n183974.7655943309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529454.1353725699\r\n 20\r\n183711.0457266946\r\n 30\r\n0.0\r\n 11\r\n529600.7203160754\r\n 21\r\n183852.9594423334\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529614.6042797779\r\n 20\r\n183825.1282280992\r\n 30\r\n0.0\r\n 11\r\n529327.4729133852\r\n 21\r\n184016.405143009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529291.7449244022\r\n 20\r\n183892.949061924\r\n 30\r\n0.0\r\n 11\r\n529325.9360372104\r\n 21\r\n183883.3074056918\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529473.5083882844\r\n 20\r\n183996.828199399\r\n 30\r\n0.0\r\n 11\r\n529506.7078360274\r\n 21\r\n184084.0614320004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529498.1619203571\r\n 20\r\n184049.9659275401\r\n 30\r\n0.0\r\n 11\r\n529479.8707662756\r\n 21\r\n184131.3171163717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529485.1258490162\r\n 20\r\n184051.4929689739\r\n 30\r\n0.0\r\n 11\r\n529543.6781527715\r\n 21\r\n184106.2266454686\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529648.1988771667\r\n 20\r\n184058.6937259326\r\n 30\r\n0.0\r\n 11\r\n529531.0987379779\r\n 21\r\n184105.1653941923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529370.9042646857\r\n 20\r\n183531.8227899418\r\n 30\r\n0.0\r\n 11\r\n529497.1433612095\r\n 21\r\n183769.9672986542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529084.3798104866\r\n 20\r\n184073.1151903254\r\n 30\r\n0.0\r\n 11\r\n529131.3702673114\r\n 21\r\n184074.5318431856\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529121.3755335018\r\n 20\r\n184011.5045800688\r\n 30\r\n0.0\r\n 11\r\n529130.3807891362\r\n 21\r\n184076.1552027958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529075.2975739782\r\n 20\r\n183993.2730910198\r\n 30\r\n0.0\r\n 11\r\n529176.3341111189\r\n 21\r\n183967.3007750539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529119.6923565671\r\n 20\r\n183827.2847304165\r\n 30\r\n0.0\r\n 11\r\n529226.2515154431\r\n 21\r\n184106.2181938137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529178.9676292489\r\n 20\r\n184192.670451302\r\n 30\r\n0.0\r\n 11\r\n529247.3944009359\r\n 21\r\n184185.0980891285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529242.9219358122\r\n 20\r\n184153.5711962515\r\n 30\r\n0.0\r\n 11\r\n529249.7117762716\r\n 21\r\n184213.291126117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529236.8192945857\r\n 20\r\n184159.6393202897\r\n 30\r\n0.0\r\n 11\r\n529307.6021939016\r\n 21\r\n184150.793017017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529304.8497323328\r\n 20\r\n184148.2943589701\r\n 30\r\n0.0\r\n 11\r\n529312.5914589166\r\n 21\r\n184203.8970159591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529241.70527714\r\n 20\r\n184209.1035473026\r\n 30\r\n0.0\r\n 11\r\n529318.7080016693\r\n 21\r\n184200.3475086117\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529297.9573885139\r\n 20\r\n183656.3574575827\r\n 30\r\n0.0\r\n 11\r\n529330.0329129007\r\n 21\r\n183764.4117554094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528897.5337691688\r\n 20\r\n184129.6894195952\r\n 30\r\n0.0\r\n 11\r\n528897.478389069\r\n 21\r\n184394.2905282322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529564.8081035469\r\n 20\r\n184156.3795667532\r\n 30\r\n0.0\r\n 11\r\n530120.7290760145\r\n 21\r\n184302.9901803174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529576.0183069298\r\n 20\r\n183927.891279077\r\n 30\r\n0.0\r\n 11\r\n529743.6527647668\r\n 21\r\n183900.8434291773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529521.6816180366\r\n 20\r\n183475.0313137005\r\n 30\r\n0.0\r\n 11\r\n529650.2941202522\r\n 21\r\n184219.5650098007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529679.2907305889\r\n 20\r\n183985.1940250151\r\n 30\r\n0.0\r\n 11\r\n530117.5734721159\r\n 21\r\n184013.717285966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529687.0294849822\r\n 20\r\n184054.2573199527\r\n 30\r\n0.0\r\n 11\r\n529672.5303405014\r\n 21\r\n183860.8683520123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529759.3473827288\r\n 20\r\n184047.7365935693\r\n 30\r\n0.0\r\n 11\r\n529754.0104869314\r\n 21\r\n183983.6494400565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529711.2346513648\r\n 20\r\n184073.0827985901\r\n 30\r\n0.0\r\n 11\r\n529768.3266381497\r\n 21\r\n184034.6411471173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529748.3128897444\r\n 20\r\n184038.8260773843\r\n 30\r\n0.0\r\n 11\r\n530149.3755702474\r\n 21\r\n184080.6091368607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529822.5334303282\r\n 20\r\n184232.0902659284\r\n 30\r\n0.0\r\n 11\r\n529891.6037786624\r\n 21\r\n183830.6665730242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529878.3245604799\r\n 20\r\n183831.6460420928\r\n 30\r\n0.0\r\n 11\r\n530115.6678549417\r\n 21\r\n183858.1777639944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529804.5617092055\r\n 20\r\n183655.9621141555\r\n 30\r\n0.0\r\n 11\r\n529891.6584272959\r\n 21\r\n183843.9010499806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529751.5979813427\r\n 20\r\n183725.2212505417\r\n 30\r\n0.0\r\n 11\r\n529835.4105477586\r\n 21\r\n183708.8880490126\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530003.7161490814\r\n 20\r\n184279.3533582009\r\n 30\r\n0.0\r\n 11\r\n530014.3010319426\r\n 21\r\n184189.8544685236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529699.2253891022\r\n 20\r\n183904.7076811009\r\n 30\r\n0.0\r\n 11\r\n530122.488138511\r\n 21\r\n183930.8586144009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529992.8308329559\r\n 20\r\n183470.8687570237\r\n 30\r\n0.0\r\n 11\r\n530106.5214174473\r\n 21\r\n183900.3913899983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529953.3300898477\r\n 20\r\n183258.8502033253\r\n 30\r\n0.0\r\n 11\r\n530063.7143634662\r\n 21\r\n183748.2713958617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529900.2748189806\r\n 20\r\n183473.3341383796\r\n 30\r\n0.0\r\n 11\r\n530014.4801315384\r\n 21\r\n183500.6594803322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529916.2827226056\r\n 20\r\n183533.3237762995\r\n 30\r\n0.0\r\n 11\r\n530004.9389856002\r\n 21\r\n183468.472655168\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529952.9289195793\r\n 20\r\n183719.7650139767\r\n 30\r\n0.0\r\n 11\r\n529931.9111294502\r\n 21\r\n183518.8533820108\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529742.8811912783\r\n 20\r\n183665.3457348656\r\n 30\r\n0.0\r\n 11\r\n530043.46283358\r\n 21\r\n183651.9961161206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529687.2422269649\r\n 20\r\n183593.0775140649\r\n 30\r\n0.0\r\n 11\r\n529724.7608320558\r\n 21\r\n183708.5756517063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529623.3457701452\r\n 20\r\n183720.3648745762\r\n 30\r\n0.0\r\n 11\r\n529638.0259663806\r\n 21\r\n183600.4806687575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529634.9426060249\r\n 20\r\n183606.469617366\r\n 30\r\n0.0\r\n 11\r\n529689.309536844\r\n 21\r\n183593.7472855568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529318.09148679\r\n 20\r\n183724.2272268729\r\n 30\r\n0.0\r\n 11\r\n529318.1038273831\r\n 21\r\n183724.225695042\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529463.3394359053\r\n 20\r\n183706.1976788945\r\n 30\r\n0.0\r\n 11\r\n529876.4055847055\r\n 21\r\n183654.9240051979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529886.8974241664\r\n 20\r\n183662.7311218112\r\n 30\r\n0.0\r\n 11\r\n529883.7183415998\r\n 21\r\n183638.6552416385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530036.5394987975\r\n 20\r\n183780.0364676758\r\n 30\r\n0.0\r\n 11\r\n530080.7040672157\r\n 21\r\n183769.8566803663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530025.7307421312\r\n 20\r\n183791.1942660727\r\n 30\r\n0.0\r\n 11\r\n530043.7929825967\r\n 21\r\n183775.2913763358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530029.0903345296\r\n 20\r\n183855.2035078002\r\n 30\r\n0.0\r\n 11\r\n530027.4002947669\r\n 21\r\n183783.3772860089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529821.8954453944\r\n 20\r\n183703.5076889587\r\n 30\r\n0.0\r\n 11\r\n529795.7595766237\r\n 21\r\n183353.2126123737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529703.0907581594\r\n 20\r\n183390.9512902205\r\n 30\r\n0.0\r\n 11\r\n529797.6095269524\r\n 21\r\n183667.8656604379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.0361374302\r\n 20\r\n183683.451661832\r\n 30\r\n0.0\r\n 11\r\n529665.9695573602\r\n 21\r\n183648.1606338434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529801.5681898015\r\n 20\r\n183520.5770130863\r\n 30\r\n0.0\r\n 11\r\n529892.9789850213\r\n 21\r\n183501.7115229562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529857.9570564266\r\n 20\r\n183504.7116257166\r\n 30\r\n0.0\r\n 11\r\n529935.3509598677\r\n 21\r\n183535.7400957423\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529857.3859786731\r\n 20\r\n183517.8244012334\r\n 30\r\n0.0\r\n 11\r\n529920.755485241\r\n 21\r\n183468.7484065412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529882.9679134057\r\n 20\r\n183305.8861517042\r\n 30\r\n0.0\r\n 11\r\n529917.7020419922\r\n 21\r\n183480.9976683616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529814.8331984142\r\n 20\r\n183916.8910231721\r\n 30\r\n0.0\r\n 11\r\n529823.7242868534\r\n 21\r\n183870.7276341683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n18FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529759.9097336122\r\n 20\r\n183870.5448924621\r\n 30\r\n0.0\r\n 11\r\n529825.1691067379\r\n 21\r\n183871.9632955235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1900\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529734.5644303138\r\n 20\r\n183913.1263572974\r\n 30\r\n0.0\r\n 11\r\n529725.0345265799\r\n 21\r\n183809.2412093268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1901\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529577.7783682334\r\n 20\r\n183842.8329485435\r\n 30\r\n0.0\r\n 11\r\n529870.1339267547\r\n 21\r\n183782.112616325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1902\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529947.940788104\r\n 20\r\n183842.5762503987\r\n 30\r\n0.0\r\n 11\r\n529951.375853984\r\n 21\r\n183773.8175122284\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1903\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529919.539180531\r\n 20\r\n183773.2058405635\r\n 30\r\n0.0\r\n 11\r\n529979.5776981694\r\n 21\r\n183776.0251235164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1904\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529924.5566131975\r\n 20\r\n183780.197959607\r\n 30\r\n0.0\r\n 11\r\n529927.109717592\r\n 21\r\n183708.9101094842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1905\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529924.2041507862\r\n 20\r\n183711.2289493369\r\n 30\r\n0.0\r\n 11\r\n529980.3298478019\r\n 21\r\n183712.4520312043\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1906\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529974.1670696054\r\n 20\r\n183783.2614860843\r\n 30\r\n0.0\r\n 11\r\n529977.8010258291\r\n 21\r\n183705.8477782501\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1907\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529840.8913014926\r\n 20\r\n184110.3672796936\r\n 30\r\n0.0\r\n 11\r\n530102.0983370033\r\n 21\r\n184152.6122126289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1908\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528668.7913145144\r\n 20\r\n183107.5549678178\r\n 30\r\n0.0\r\n 11\r\n528541.0430600417\r\n 21\r\n183527.7503403289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1909\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528804.4113192836\r\n 20\r\n182893.6556957394\r\n 30\r\n0.0\r\n 11\r\n528671.5138685195\r\n 21\r\n183589.133053046\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n190A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528854.4143764418\r\n 20\r\n183324.3966236097\r\n 30\r\n0.0\r\n 11\r\n528250.610854468\r\n 21\r\n183222.7979014137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n190B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528458.0548529516\r\n 20\r\n183244.6009172969\r\n 30\r\n0.0\r\n 11\r\n528404.5920938378\r\n 21\r\n183477.3615348441\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n190C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528531.3448267208\r\n 20\r\n183079.5639227049\r\n 30\r\n0.0\r\n 11\r\n528245.4138924677\r\n 21\r\n183131.629383617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n190D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528807.9591497892\r\n 20\r\n183577.2528416022\r\n 30\r\n0.0\r\n 11\r\n528402.8543708085\r\n 21\r\n183474.7910999636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n190E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528586.2414796501\r\n 20\r\n183099.7468354818\r\n 30\r\n0.0\r\n 11\r\n528470.9265496374\r\n 21\r\n183507.8371358638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n190F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527866.6651222174\r\n 20\r\n183086.587611023\r\n 30\r\n0.0\r\n 11\r\n528477.8981421178\r\n 21\r\n183507.6131407652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1910\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528254.4293880732\r\n 20\r\n183027.6427082953\r\n 30\r\n0.0\r\n 11\r\n528291.0664511334\r\n 21\r\n183410.0281326049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1911\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528357.0203913149\r\n 20\r\n183376.8414271265\r\n 30\r\n0.0\r\n 11\r\n528332.8061176764\r\n 21\r\n183415.1533851214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1912\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528371.1252056358\r\n 20\r\n183370.331442587\r\n 30\r\n0.0\r\n 11\r\n528350.1432728785\r\n 21\r\n183382.1172361704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1913\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528430.4207266745\r\n 20\r\n183394.6729929148\r\n 30\r\n0.0\r\n 11\r\n528363.1959728388\r\n 21\r\n183369.3215660714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1914\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528559.5018706355\r\n 20\r\n183212.8777008889\r\n 30\r\n0.0\r\n 11\r\n528512.9959012541\r\n 21\r\n183205.9998560331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1915\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528533.9300921969\r\n 20\r\n183145.716439993\r\n 30\r\n0.0\r\n 11\r\n528513.6841439121\r\n 21\r\n183207.77205397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1916\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528989.8411163921\r\n 20\r\n183174.0817346289\r\n 30\r\n0.0\r\n 11\r\n528487.6116385765\r\n 21\r\n183092.5278840273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1917\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528568.0177221007\r\n 20\r\n182964.6699830321\r\n 30\r\n0.0\r\n 11\r\n528384.4060132413\r\n 21\r\n183269.6789120271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1918\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528742.3877054963\r\n 20\r\n183749.6239748958\r\n 30\r\n0.0\r\n 11\r\n528621.5965608299\r\n 21\r\n183958.8324620295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1919\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528352.40484145\r\n 20\r\n183517.2583498101\r\n 30\r\n0.0\r\n 11\r\n528802.5990649035\r\n 21\r\n183778.5899352814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n191A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528293.1666930174\r\n 20\r\n183608.5169334034\r\n 30\r\n0.0\r\n 11\r\n528953.2583603691\r\n 21\r\n183976.1452661638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n191B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528722.4875052028\r\n 20\r\n183925.9917585473\r\n 30\r\n0.0\r\n 11\r\n528594.7392507302\r\n 21\r\n184346.1871310584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n191C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528785.1042229958\r\n 20\r\n183956.1376318977\r\n 30\r\n0.0\r\n 11\r\n528607.3950652944\r\n 21\r\n183878.4911678382\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n191D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528755.0313661355\r\n 20\r\n184022.2286410237\r\n 30\r\n0.0\r\n 11\r\n528696.3163109133\r\n 21\r\n183995.9953036005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n191E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528794.8643226163\r\n 20\r\n183985.207017528\r\n 30\r\n0.0\r\n 11\r\n528739.703064588\r\n 21\r\n184026.371214784\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n191F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528750.2720030147\r\n 20\r\n184008.8680348702\r\n 30\r\n0.0\r\n 11\r\n528657.0520669105\r\n 21\r\n184401.178041452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1920\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528799.6205179925\r\n 20\r\n184124.465023813\r\n 30\r\n0.0\r\n 11\r\n528506.43460244\r\n 21\r\n184075.2455926983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1921\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528511.7510436402\r\n 20\r\n184063.0377080264\r\n 30\r\n0.0\r\n 11\r\n528458.2882845263\r\n 21\r\n184295.7983255736\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1922\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528370.3519160148\r\n 20\r\n183935.3189252638\r\n 30\r\n0.0\r\n 11\r\n528518.9061481188\r\n 21\r\n184079.674465598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1923\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528453.2307839687\r\n 20\r\n183908.2435178108\r\n 30\r\n0.0\r\n 11\r\n528410.0958539993\r\n 21\r\n183981.9367846534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1924\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528786.1574028308\r\n 20\r\n184374.1598480596\r\n 30\r\n0.0\r\n 11\r\n528456.5505614972\r\n 21\r\n184293.2278906931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1925\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528639.9376703386\r\n 20\r\n183918.1836262113\r\n 30\r\n0.0\r\n 11\r\n528524.6227403257\r\n 21\r\n184326.2739265931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1926\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528084.9026102108\r\n 20\r\n184016.1989552483\r\n 30\r\n0.0\r\n 11\r\n528531.5943328062\r\n 21\r\n184326.0499314945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1927\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528166.3454298809\r\n 20\r\n183965.2409996249\r\n 30\r\n0.0\r\n 11\r\n528154.3594816886\r\n 21\r\n184082.0565156114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1928\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528217.6641506519\r\n 20\r\n184000.1895122487\r\n 30\r\n0.0\r\n 11\r\n528127.1399110786\r\n 21\r\n184062.4065752605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1929\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528381.4914746685\r\n 20\r\n184096.4385993347\r\n 30\r\n0.0\r\n 11\r\n528198.839080213\r\n 21\r\n184010.15224954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n192A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528413.0013877898\r\n 20\r\n183848.7173829846\r\n 30\r\n0.0\r\n 11\r\n528287.5926426249\r\n 21\r\n184159.4625824032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n192B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528501.5158683562\r\n 20\r\n183879.0783900494\r\n 30\r\n0.0\r\n 11\r\n528384.4765103999\r\n 21\r\n183846.6861963027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n192C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528519.1842874642\r\n 20\r\n183828.0644140476\r\n 30\r\n0.0\r\n 11\r\n528499.8171324582\r\n 21\r\n183880.4336244704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n192D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528595.6748710933\r\n 20\r\n183498.8066472854\r\n 30\r\n0.0\r\n 11\r\n528345.6098893717\r\n 21\r\n184002.7759651829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n192E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528349.5074364252\r\n 20\r\n184015.2595100341\r\n 30\r\n0.0\r\n 11\r\n528327.8380637481\r\n 21\r\n184004.2962596118\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n192F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528410.7165820031\r\n 20\r\n184195.2782178561\r\n 30\r\n0.0\r\n 11\r\n528386.5023083646\r\n 21\r\n184233.5901758509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1930\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528424.8213963242\r\n 20\r\n184188.7682333163\r\n 30\r\n0.0\r\n 11\r\n528403.8394635669\r\n 21\r\n184200.5540268997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1931\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528484.1169173629\r\n 20\r\n184213.1097836442\r\n 30\r\n0.0\r\n 11\r\n528416.8921635274\r\n 21\r\n184187.7583568011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1932\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528409.4884254542\r\n 20\r\n183967.4027798099\r\n 30\r\n0.0\r\n 11\r\n528079.6638097751\r\n 21\r\n183835.989039296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1933\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528312.9572507023\r\n 20\r\n183609.8065701943\r\n 30\r\n0.0\r\n 11\r\n528143.6786059444\r\n 21\r\n183723.6985750834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1934\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528134.9109864112\r\n 20\r\n183693.8578347845\r\n 30\r\n0.0\r\n 11\r\n528383.8849453777\r\n 21\r\n183932.6951172608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1935\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528440.7886101574\r\n 20\r\n183817.4568159531\r\n 30\r\n0.0\r\n 11\r\n528408.8288346195\r\n 21\r\n183801.9466103597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1936\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528243.5765977299\r\n 20\r\n183887.7152970022\r\n 30\r\n0.0\r\n 11\r\n528195.5387878738\r\n 21\r\n183967.7415990835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1937\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528209.9535345455\r\n 20\r\n183935.6830405157\r\n 30\r\n0.0\r\n 11\r\n528213.6376612554\r\n 21\r\n184018.9837575135\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1938\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528222.5171871721\r\n 20\r\n183939.4811511292\r\n 30\r\n0.0\r\n 11\r\n528155.2438146322\r\n 21\r\n183983.0522535347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1939\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528060.7233277694\r\n 20\r\n183917.8614732753\r\n 30\r\n0.0\r\n 11\r\n528167.8135951839\r\n 21\r\n183984.2221029732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n193A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528426.4395500667\r\n 20\r\n183448.0349839718\r\n 30\r\n0.0\r\n 11\r\n528260.2481751706\r\n 21\r\n183660.2366414376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n193B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528613.1980613237\r\n 20\r\n184031.3144916184\r\n 30\r\n0.0\r\n 11\r\n528566.6920919425\r\n 21\r\n184024.4366467629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n193C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528587.6262828853\r\n 20\r\n183964.1532307225\r\n 30\r\n0.0\r\n 11\r\n528567.3803346004\r\n 21\r\n184026.2088446995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n193D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528636.194151661\r\n 20\r\n183954.3182081319\r\n 30\r\n0.0\r\n 11\r\n528541.3078292647\r\n 21\r\n183910.9646747567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n193E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528621.7139127892\r\n 20\r\n183783.1067737617\r\n 30\r\n0.0\r\n 11\r\n528467.7144836024\r\n 21\r\n184038.9248871805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n193F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528499.0405333586\r\n 20\r\n184132.3509934097\r\n 30\r\n0.0\r\n 11\r\n528433.0154931339\r\n 21\r\n184112.8507930077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1940\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528442.9682191248\r\n 20\r\n184082.6036251381\r\n 30\r\n0.0\r\n 11\r\n528425.7711037648\r\n 21\r\n184140.1955618993\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1941\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528447.9072965878\r\n 20\r\n184089.6513107935\r\n 30\r\n0.0\r\n 11\r\n528379.7871951758\r\n 21\r\n184068.4822838726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1942\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528382.936542737\r\n 20\r\n184066.5072024408\r\n 30\r\n0.0\r\n 11\r\n528365.5272273391\r\n 21\r\n184119.8785948911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1943\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528434.389757027\r\n 20\r\n184137.4828767697\r\n 30\r\n0.0\r\n 11\r\n528360.1310789086\r\n 21\r\n184115.3077437919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1944\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528476.3236267395\r\n 20\r\n183583.4665500198\r\n 30\r\n0.0\r\n 11\r\n528425.7267702648\r\n 21\r\n183684.1866009447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1945\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528125.6147590899\r\n 20\r\n184028.7021100603\r\n 30\r\n0.0\r\n 11\r\n527552.5660905527\r\n 21\r\n184075.1566375765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1946\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528083.3467968647\r\n 20\r\n183974.4580672929\r\n 30\r\n0.0\r\n 11\r\n527856.6207323578\r\n 21\r\n183990.7306343801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1947\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528154.8035516293\r\n 20\r\n183801.8087856649\r\n 30\r\n0.0\r\n 11\r\n527994.5487521048\r\n 21\r\n183745.6723726351\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1948\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528288.0147642038\r\n 20\r\n183365.5870566724\r\n 30\r\n0.0\r\n 11\r\n528030.3404346557\r\n 21\r\n184075.8514723987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1949\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528043.0562136596\r\n 20\r\n183840.0361402322\r\n 30\r\n0.0\r\n 11\r\n527535.5193539366\r\n 21\r\n183724.884393956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528023.2801637968\r\n 20\r\n183906.6584704155\r\n 30\r\n0.0\r\n 11\r\n528071.5977713523\r\n 21\r\n183718.842265279\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527953.2396338999\r\n 20\r\n183887.5084735797\r\n 30\r\n0.0\r\n 11\r\n527969.7753182916\r\n 21\r\n183825.3617371906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527996.1389185524\r\n 20\r\n183920.9287728688\r\n 30\r\n0.0\r\n 11\r\n527946.7059838759\r\n 21\r\n183873.0368059822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527965.6704341591\r\n 20\r\n183880.6796714141\r\n 30\r\n0.0\r\n 11\r\n527647.3742233534\r\n 21\r\n183910.4481971195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528056.0681094791\r\n 20\r\n183648.8329268226\r\n 30\r\n0.0\r\n 11\r\n527635.8546818722\r\n 21\r\n183638.182139202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n194F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528104.2585344263\r\n 20\r\n183452.6437546761\r\n 30\r\n0.0\r\n 11\r\n528046.9931643914\r\n 21\r\n183559.7331702191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1950\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528144.7489437926\r\n 20\r\n183589.19175389\r\n 30\r\n0.0\r\n 11\r\n528151.4028743793\r\n 21\r\n183468.5955011539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1951\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528153.3837633594\r\n 20\r\n183475.0337225985\r\n 30\r\n0.0\r\n 11\r\n528102.1056020192\r\n 21\r\n183452.9391290769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1952\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528444.5559317088\r\n 20\r\n183646.7318726641\r\n 30\r\n0.0\r\n 11\r\n528444.5440535158\r\n 21\r\n183646.7281922736\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1953\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528304.7504013262\r\n 20\r\n183603.4139203\r\n 30\r\n0.0\r\n 11\r\n527686.3268742882\r\n 21\r\n183468.9411166398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1954\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527876.9014784467\r\n 20\r\n183669.7856404972\r\n 30\r\n0.0\r\n 11\r\n528039.6626700543\r\n 21\r\n183197.4211840708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1955\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528196.1692423678\r\n 20\r\n183033.7410272279\r\n 30\r\n0.0\r\n 11\r\n527992.9132103017\r\n 21\r\n183547.3888224487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1956\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528105.2861078474\r\n 20\r\n183544.635494493\r\n 30\r\n0.0\r\n 11\r\n528115.501939949\r\n 21\r\n183510.6115249354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1957\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527805.6390662193\r\n 20\r\n183840.6870125336\r\n 30\r\n0.0\r\n 11\r\n527921.0294539186\r\n 21\r\n183701.9308299949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1958\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527983.8795447074\r\n 20\r\n183712.985091062\r\n 30\r\n0.0\r\n 11\r\n527919.3896683446\r\n 21\r\n183702.8928418217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1959\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528168.0449598422\r\n 20\r\n183717.7690181888\r\n 30\r\n0.0\r\n 11\r\n527950.1848962111\r\n 21\r\n183630.3110709327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n195A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528231.7146954377\r\n 20\r\n183407.7565646374\r\n 30\r\n0.0\r\n 11\r\n528348.9669055398\r\n 21\r\n183581.0464224438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n195B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527969.7038562812\r\n 20\r\n183723.7556854169\r\n 30\r\n0.0\r\n 11\r\n527992.9685127766\r\n 21\r\n183608.912534202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n195C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528850.3825839323\r\n 20\r\n183323.7182158954\r\n 30\r\n0.0\r\n 11\r\n528990.1503365547\r\n 21\r\n183464.1787709401\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n195D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525307.3474071975\r\n 20\r\n184541.7665493575\r\n 30\r\n0.0\r\n 11\r\n528178.1351607463\r\n 21\r\n184982.9648824393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n195E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526077.6348797937\r\n 20\r\n184864.5927893283\r\n 30\r\n0.0\r\n 11\r\n525797.6402801826\r\n 21\r\n184765.2182856161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n195F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525997.2138650289\r\n 20\r\n184320.4611636129\r\n 30\r\n0.0\r\n 11\r\n525984.6548647781\r\n 21\r\n184851.1522572005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1960\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525800.7908432205\r\n 20\r\n184455.0695224782\r\n 30\r\n0.0\r\n 11\r\n526021.5188082319\r\n 21\r\n184527.0129275369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1961\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526171.5682654237\r\n 20\r\n184485.6664297445\r\n 30\r\n0.0\r\n 11\r\n526155.7412254004\r\n 21\r\n184804.3255559893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1962\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526588.3675743969\r\n 20\r\n184645.4063717812\r\n 30\r\n0.0\r\n 11\r\n526576.8066982293\r\n 21\r\n184871.6956292857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1963\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525964.343985564\r\n 20\r\n184517.1375942794\r\n 30\r\n0.0\r\n 11\r\n526207.3294778549\r\n 21\r\n184498.6850303378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1964\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525937.9673686516\r\n 20\r\n184716.0414479291\r\n 30\r\n0.0\r\n 11\r\n526226.5149961723\r\n 21\r\n184745.9789273604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1965\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527987.6557398821\r\n 20\r\n184960.8730516275\r\n 30\r\n0.0\r\n 11\r\n530791.2460484537\r\n 21\r\n185189.0669865992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1966\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527808.157781419\r\n 20\r\n184075.6972938018\r\n 30\r\n0.0\r\n 11\r\n527810.8540837077\r\n 21\r\n183819.4902595181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1967\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527575.5627971427\r\n 20\r\n184719.6434625751\r\n 30\r\n0.0\r\n 11\r\n528002.5221155909\r\n 21\r\n184822.5487976695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1968\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527549.3928541368\r\n 20\r\n184958.5758116922\r\n 30\r\n0.0\r\n 11\r\n527592.9654759936\r\n 21\r\n184596.3563074837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1969\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527642.0179508916\r\n 20\r\n184796.483250273\r\n 30\r\n0.0\r\n 11\r\n527649.1715267503\r\n 21\r\n184732.5733758048\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n196A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527668.3713798277\r\n 20\r\n184989.5745496803\r\n 30\r\n0.0\r\n 11\r\n527813.7447750579\r\n 21\r\n184609.0771512619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n196B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527800.5267200151\r\n 20\r\n184607.4709084165\r\n 30\r\n0.0\r\n 11\r\n528028.2630757902\r\n 21\r\n184679.3869980712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n196C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527762.119928606\r\n 20\r\n184420.8410095866\r\n 30\r\n0.0\r\n 11\r\n527811.2398088129\r\n 21\r\n184622.0725162393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n196D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527696.7657236177\r\n 20\r\n184478.5541998675\r\n 30\r\n0.0\r\n 11\r\n527782.1547628032\r\n 21\r\n184478.7323806127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n196E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527762.9605137232\r\n 20\r\n185048.1139941885\r\n 30\r\n0.0\r\n 11\r\n527790.6482723803\r\n 21\r\n184962.3499048549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n196F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527892.4420198638\r\n 20\r\n185129.2023896609\r\n 30\r\n0.0\r\n 11\r\n528026.9283833614\r\n 21\r\n184676.586031645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1970\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527610.6815719196\r\n 20\r\n184644.5294570579\r\n 30\r\n0.0\r\n 11\r\n528020.9035075767\r\n 21\r\n184752.0152228841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1971\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527982.6208062758\r\n 20\r\n184275.6370951802\r\n 30\r\n0.0\r\n 11\r\n528017.1761369693\r\n 21\r\n184757.9109827055\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1972\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527983.8260365036\r\n 20\r\n184022.296659296\r\n 30\r\n0.0\r\n 11\r\n527998.5376072865\r\n 21\r\n184561.5100641322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1973\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527891.334296719\r\n 20\r\n184260.1623738197\r\n 30\r\n0.0\r\n 11\r\n527998.1023206634\r\n 21\r\n184309.0511945493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1974\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527895.4425742306\r\n 20\r\n184322.1150306804\r\n 30\r\n0.0\r\n 11\r\n527994.9637622951\r\n 21\r\n184275.6270321611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1975\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527895.3532610598\r\n 20\r\n184512.1236380707\r\n 30\r\n0.0\r\n 11\r\n527913.57366127\r\n 21\r\n184310.9390253954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1976\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527480.90823527\r\n 20\r\n184388.0469938584\r\n 30\r\n0.0\r\n 11\r\n527997.2807625187\r\n 21\r\n184463.1359095324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1977\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527841.5936935205\r\n 20\r\n184443.4000457608\r\n 30\r\n0.0\r\n 11\r\n527843.1291080543\r\n 21\r\n184419.1637697629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1978\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527965.7343629274\r\n 20\r\n184587.42222762\r\n 30\r\n0.0\r\n 11\r\n528011.0337673516\r\n 21\r\n184585.9726994008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1979\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527952.9724149893\r\n 20\r\n184596.2799005969\r\n 30\r\n0.0\r\n 11\r\n527973.7683600728\r\n 21\r\n184584.1689509764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n197A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527943.8939013147\r\n 20\r\n184659.7310666782\r\n 30\r\n0.0\r\n 11\r\n527956.1217050114\r\n 21\r\n184588.9331628391\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n197B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527769.934801415\r\n 20\r\n184470.840688152\r\n 30\r\n0.0\r\n 11\r\n527827.9300307166\r\n 21\r\n184040.3829802543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n197C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527805.4507991196\r\n 20\r\n184062.8185162508\r\n 30\r\n0.0\r\n 11\r\n527997.0454664766\r\n 21\r\n184124.5096477568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n197D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527702.5578931418\r\n 20\r\n184038.5925424107\r\n 30\r\n0.0\r\n 11\r\n527752.9976249645\r\n 21\r\n184431.175942022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n197E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527785.35650153\r\n 20\r\n184287.4313081827\r\n 30\r\n0.0\r\n 11\r\n527878.6899841483\r\n 21\r\n184286.5939176294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n197F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527843.748765733\r\n 20\r\n184282.7667313624\r\n 30\r\n0.0\r\n 11\r\n527913.6839365679\r\n 21\r\n184328.1721729113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1980\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527840.6534060318\r\n 20\r\n184295.5217209693\r\n 30\r\n0.0\r\n 11\r\n527912.3151283762\r\n 21\r\n184259.6226239287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1981\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527906.7261415853\r\n 20\r\n184092.5275077153\r\n 30\r\n0.0\r\n 11\r\n527906.9511752789\r\n 21\r\n184271.0504819078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1982\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527721.7529934951\r\n 20\r\n184678.8330823348\r\n 30\r\n0.0\r\n 11\r\n527739.4009828234\r\n 21\r\n184635.2594847026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1983\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527676.8256617091\r\n 20\r\n184622.7431039412\r\n 30\r\n0.0\r\n 11\r\n527740.5796583324\r\n 21\r\n184636.7511574304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1984\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527643.7263602637\r\n 20\r\n184659.6213060481\r\n 30\r\n0.0\r\n 11\r\n527654.4600654166\r\n 21\r\n184555.8536299263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1985\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527503.4877949194\r\n 20\r\n184560.3430235939\r\n 30\r\n0.0\r\n 11\r\n527802.0667646647\r\n 21\r\n184557.2884910617\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1986\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527866.7164859016\r\n 20\r\n184631.6536190617\r\n 30\r\n0.0\r\n 11\r\n527883.379678869\r\n 21\r\n184564.8561509022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1987\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527852.2618777851\r\n 20\r\n184558.101125034\r\n 30\r\n0.0\r\n 11\r\n527910.6226856307\r\n 21\r\n184572.4742967173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1988\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527855.8328867656\r\n 20\r\n184565.9313392166\r\n 30\r\n0.0\r\n 11\r\n527872.1197030677\r\n 21\r\n184496.4819653397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1989\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527868.8206569435\r\n 20\r\n184498.1953337749\r\n 30\r\n0.0\r\n 11\r\n527923.6510511095\r\n 21\r\n184510.2459632337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n198A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527903.9151466527\r\n 20\r\n184578.5281191074\r\n 30\r\n0.0\r\n 11\r\n527922.4467185071\r\n 21\r\n184503.2774138411\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n198B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527910.2046977225\r\n 20\r\n185240.1234589559\r\n 30\r\n0.0\r\n 11\r\n528625.4822334132\r\n 21\r\n185577.9825458991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n198C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528033.5651137221\r\n 20\r\n185301.6519541995\r\n 30\r\n0.0\r\n 11\r\n528074.238106388\r\n 21\r\n185159.5132811641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n198D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527926.1315420274\r\n 20\r\n185176.9120553437\r\n 30\r\n0.0\r\n 11\r\n528372.8202171181\r\n 21\r\n185388.9352482703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n198E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528056.7474958125\r\n 20\r\n185187.0786360558\r\n 30\r\n0.0\r\n 11\r\n528117.6632592067\r\n 21\r\n185132.2118152555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n198F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528009.0905858184\r\n 20\r\n185123.1714021653\r\n 30\r\n0.0\r\n 11\r\n528068.7639218026\r\n 21\r\n185187.6424922191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1990\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527815.499177531\r\n 20\r\n185092.6115966227\r\n 30\r\n0.0\r\n 11\r\n528333.2656037408\r\n 21\r\n185110.5234618076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1991\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528085.0587549844\r\n 20\r\n184722.9316982304\r\n 30\r\n0.0\r\n 11\r\n528197.8763293401\r\n 21\r\n184731.2980733757\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1992\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528197.8031362093\r\n 20\r\n184649.8315174913\r\n 30\r\n0.0\r\n 11\r\n528180.0506917082\r\n 21\r\n185405.1833898459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1993\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528253.8105398686\r\n 20\r\n185180.8397990754\r\n 30\r\n0.0\r\n 11\r\n528733.1088459851\r\n 21\r\n185324.8966353942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1994\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528248.0514866669\r\n 20\r\n185250.0962813238\r\n 30\r\n0.0\r\n 11\r\n528271.2132187195\r\n 21\r\n185057.552643984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1995\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528320.2656936174\r\n 20\r\n185257.679586773\r\n 30\r\n0.0\r\n 11\r\n528327.4192694761\r\n 21\r\n185193.7697123049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1996\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528268.1605303945\r\n 20\r\n185273.2461211912\r\n 30\r\n0.0\r\n 11\r\n528331.6072550481\r\n 21\r\n185246.5671284493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1997\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528311.1620183674\r\n 20\r\n185246.8039060563\r\n 30\r\n0.0\r\n 11\r\n528445.5263302135\r\n 21\r\n185288.12612457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1998\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528346.6191225535\r\n 20\r\n185450.7708861805\r\n 30\r\n0.0\r\n 11\r\n528628.3189486684\r\n 21\r\n184705.4867174532\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1999\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528478.774462741\r\n 20\r\n185068.6672449169\r\n 30\r\n0.0\r\n 11\r\n528775.4044934505\r\n 21\r\n185164.1276033924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528456.0358821345\r\n 20\r\n185511.7428004195\r\n 30\r\n0.0\r\n 11\r\n528483.7236407914\r\n 21\r\n185425.9787110862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528288.9293146456\r\n 20\r\n185105.7257935582\r\n 30\r\n0.0\r\n 11\r\n528745.1093170271\r\n 21\r\n185225.2534264041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528344.0981698862\r\n 20\r\n184874.8967817407\r\n 30\r\n0.0\r\n 11\r\n528768.9167591915\r\n 21\r\n184929.1033520555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527949.8775264869\r\n 20\r\n184854.9666844584\r\n 30\r\n0.0\r\n 11\r\n528511.0568598971\r\n 21\r\n184894.9081944299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528448.1825441407\r\n 20\r\n184932.0370246522\r\n 30\r\n0.0\r\n 11\r\n528528.469305634\r\n 21\r\n184409.6310701323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n199F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528188.8818175094\r\n 20\r\n184667.5442081165\r\n 30\r\n0.0\r\n 11\r\n528372.8703909186\r\n 21\r\n184579.3690800832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528351.5933171851\r\n 20\r\n184556.6836868273\r\n 30\r\n0.0\r\n 11\r\n528431.2453676903\r\n 21\r\n184892.3722785223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528463.6042442558\r\n 20\r\n184748.6276446831\r\n 30\r\n0.0\r\n 11\r\n528678.2731909844\r\n 21\r\n184747.8248774162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528582.2880243458\r\n 20\r\n184606.2960929359\r\n 30\r\n0.0\r\n 11\r\n528617.9667813305\r\n 21\r\n184768.5430947721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527991.9087113443\r\n 20\r\n184683.3516059304\r\n 30\r\n0.0\r\n 11\r\n528259.0723139821\r\n 21\r\n184647.6763211142\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528400.0007362211\r\n 20\r\n185140.0294188351\r\n 30\r\n0.0\r\n 11\r\n528417.6487255491\r\n 21\r\n185096.4558212028\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528355.073404435\r\n 20\r\n185083.9394404415\r\n 30\r\n0.0\r\n 11\r\n528418.8274010583\r\n 21\r\n185097.9474939306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528321.9741029895\r\n 20\r\n185120.8176425483\r\n 30\r\n0.0\r\n 11\r\n528332.7078081425\r\n 21\r\n185017.0499664265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528083.3578412053\r\n 20\r\n184795.0081634422\r\n 30\r\n0.0\r\n 11\r\n528195.8260750748\r\n 21\r\n184802.455774721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528388.1630202148\r\n 20\r\n185334.8933586839\r\n 30\r\n0.0\r\n 11\r\n528705.0344509524\r\n 21\r\n185469.7224833694\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528619.6035762321\r\n 20\r\n184654.4888869583\r\n 30\r\n0.0\r\n 11\r\n528787.5051260328\r\n 21\r\n184344.9983490001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527991.0162556054\r\n 20\r\n184522.2358538144\r\n 30\r\n0.0\r\n 11\r\n528768.8489952007\r\n 21\r\n184666.6966134304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528258.9278605673\r\n 20\r\n184319.7995120679\r\n 30\r\n0.0\r\n 11\r\n528493.9558347146\r\n 21\r\n184289.0340850979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528305.4820494023\r\n 20\r\n184393.5198752249\r\n 30\r\n0.0\r\n 11\r\n528319.2731084667\r\n 21\r\n184309.2516934997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528120.907951347\r\n 20\r\n184166.6183070277\r\n 30\r\n0.0\r\n 11\r\n528186.1953061795\r\n 21\r\n184069.0114987191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528182.7230597031\r\n 20\r\n184172.4408507259\r\n 30\r\n0.0\r\n 11\r\n528152.6983259142\r\n 21\r\n184066.7804691202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528263.2283659217\r\n 20\r\n184381.7642178277\r\n 30\r\n0.0\r\n 11\r\n528292.7986475518\r\n 21\r\n184135.3588211145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528159.2130572247\r\n 20\r\n184407.9771273453\r\n 30\r\n0.0\r\n 11\r\n528280.5521486496\r\n 21\r\n184412.9056584408\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528256.3867003138\r\n 20\r\n184512.1025921885\r\n 30\r\n0.0\r\n 11\r\n528149.0628884625\r\n 21\r\n184456.7010545208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528153.6082290024\r\n 20\r\n184461.6724221288\r\n 30\r\n0.0\r\n 11\r\n528160.5591043877\r\n 21\r\n184406.2711024269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528153.9955953136\r\n 20\r\n184799.6980665769\r\n 30\r\n0.0\r\n 11\r\n528153.9984446465\r\n 21\r\n184799.6859621131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528187.5320485945\r\n 20\r\n184657.2293415045\r\n 30\r\n0.0\r\n 11\r\n528282.9053305279\r\n 21\r\n184252.0669419752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528309.5339253747\r\n 20\r\n184320.0569967773\r\n 30\r\n0.0\r\n 11\r\n527971.965703502\r\n 21\r\n184222.9106129128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527975.1720377207\r\n 20\r\n184322.9177983651\r\n 30\r\n0.0\r\n 11\r\n528267.6760323384\r\n 21\r\n184330.4529970771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528237.986400541\r\n 20\r\n184455.4986644045\r\n 30\r\n0.0\r\n 11\r\n528203.4797198928\r\n 21\r\n184447.0557549162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528130.9300084558\r\n 20\r\n184275.5882396961\r\n 30\r\n0.0\r\n 11\r\n528144.9852191297\r\n 21\r\n184183.3153224697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528135.6356705808\r\n 20\r\n184217.1992720769\r\n 30\r\n0.0\r\n 11\r\n528191.6112669698\r\n 21\r\n184155.3986664904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528147.7339253272\r\n 20\r\n184222.2887950057\r\n 30\r\n0.0\r\n 11\r\n528123.7204699332\r\n 21\r\n184145.8198367432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527957.8719725857\r\n 20\r\n184124.6942464935\r\n 30\r\n0.0\r\n 11\r\n528134.1468481414\r\n 21\r\n184152.9373200259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528355.4066024149\r\n 20\r\n184597.3661614674\r\n 30\r\n0.0\r\n 11\r\n528399.9991306533\r\n 21\r\n184302.1200983803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527314.8022005422\r\n 20\r\n184741.5980162658\r\n 30\r\n0.0\r\n 11\r\n526970.7047902906\r\n 21\r\n185140.6353940886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527178.8927506483\r\n 20\r\n184890.7223407424\r\n 30\r\n0.0\r\n 11\r\n527892.8909575186\r\n 21\r\n185231.2767068576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527304.5579262283\r\n 20\r\n184947.3951879357\r\n 30\r\n0.0\r\n 11\r\n527220.1504267684\r\n 21\r\n185068.77504104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527139.9889769999\r\n 20\r\n184943.0276207057\r\n 30\r\n0.0\r\n 11\r\n527586.6776520906\r\n 21\r\n185155.0508136324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527230.4483922155\r\n 20\r\n185037.7956582788\r\n 30\r\n0.0\r\n 11\r\n527226.4541900343\r\n 21\r\n185119.6806056352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527150.8042870103\r\n 20\r\n185041.2787775443\r\n 30\r\n0.0\r\n 11\r\n527238.4827063035\r\n 21\r\n185046.7489942205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527168.2411901958\r\n 20\r\n185033.6844166035\r\n 30\r\n0.0\r\n 11\r\n527040.6311596829\r\n 21\r\n185186.2292719635\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527060.7877157567\r\n 20\r\n184974.6539566652\r\n 30\r\n0.0\r\n 11\r\n527345.9668821299\r\n 21\r\n185300.4331217227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527078.8871428805\r\n 20\r\n185227.2251475794\r\n 30\r\n0.0\r\n 11\r\n527228.8299069052\r\n 21\r\n185116.0630754644\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527039.9234058711\r\n 20\r\n185180.7984200714\r\n 30\r\n0.0\r\n 11\r\n527079.7319945638\r\n 21\r\n185227.2946236537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526838.3892838256\r\n 20\r\n185399.5131906798\r\n 30\r\n0.0\r\n 11\r\n527067.5959861845\r\n 21\r\n185210.2772169702\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526888.7462167753\r\n 20\r\n185353.1899045615\r\n 30\r\n0.0\r\n 11\r\n526966.5577681158\r\n 21\r\n185435.3066738271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526903.3945210007\r\n 20\r\n185486.7577117054\r\n 30\r\n0.0\r\n 11\r\n527563.396785898\r\n 21\r\n184919.709440807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527350.2091506667\r\n 20\r\n185194.4166248022\r\n 30\r\n0.0\r\n 11\r\n527699.8837421815\r\n 21\r\n185460.1447709393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527400.2250552947\r\n 20\r\n185146.1668961864\r\n 30\r\n0.0\r\n 11\r\n527265.6942366933\r\n 21\r\n185285.8485949097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527451.7581804101\r\n 20\r\n185197.3209304638\r\n 30\r\n0.0\r\n 11\r\n527406.7663055494\r\n 21\r\n185243.270651884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527430.8746786076\r\n 20\r\n185147.1099318603\r\n 30\r\n0.0\r\n 11\r\n527450.3194740931\r\n 21\r\n185213.1338324689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527437.5762896092\r\n 20\r\n185197.1439914512\r\n 30\r\n0.0\r\n 11\r\n527773.0926914633\r\n 21\r\n185420.8085658439\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527618.0195788189\r\n 20\r\n185095.6552994826\r\n 30\r\n0.0\r\n 11\r\n527415.1389359325\r\n 21\r\n185448.8565721106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527405.5372855231\r\n 20\r\n185439.6313184767\r\n 30\r\n0.0\r\n 11\r\n527605.2426940034\r\n 21\r\n185570.6027715367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527236.6611025661\r\n 20\r\n185527.8732336498\r\n 30\r\n0.0\r\n 11\r\n527423.6234348207\r\n 21\r\n185438.6994246076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527240.0543231658\r\n 20\r\n185440.7499273761\r\n 30\r\n0.0\r\n 11\r\n527294.18013015\r\n 21\r\n185506.7932221131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527787.6999047709\r\n 20\r\n185174.8358807547\r\n 30\r\n0.0\r\n 11\r\n527738.7591409829\r\n 21\r\n185250.5121163805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527867.8676223761\r\n 20\r\n185180.9755230782\r\n 30\r\n0.0\r\n 11\r\n527602.2287515429\r\n 21\r\n185571.3396349185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527314.2179450792\r\n 20\r\n185269.1165263216\r\n 30\r\n0.0\r\n 11\r\n527656.8589517441\r\n 21\r\n185518.9812235104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527386.1443485876\r\n 20\r\n185733.9220975941\r\n 30\r\n0.0\r\n 11\r\n527608.5066100865\r\n 21\r\n185554.6163101546\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527049.9782308985\r\n 20\r\n185812.0857878571\r\n 30\r\n0.0\r\n 11\r\n527240.4791242125\r\n 21\r\n185665.0943789074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526905.5723615818\r\n 20\r\n185164.9770384304\r\n 30\r\n0.0\r\n 11\r\n527291.3265981003\r\n 21\r\n185574.5026633598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527494.4579605611\r\n 20\r\n185580.3033783502\r\n 30\r\n0.0\r\n 11\r\n527533.4565041639\r\n 21\r\n185629.032965853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527493.2517026551\r\n 20\r\n185564.8156210044\r\n 30\r\n0.0\r\n 11\r\n527497.0169997674\r\n 21\r\n185588.5846969284\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527536.6711348336\r\n 20\r\n185517.6645574225\r\n 30\r\n0.0\r\n 11\r\n527489.5509079133\r\n 21\r\n185571.9005840673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526825.7687294675\r\n 20\r\n185630.3755656826\r\n 30\r\n0.0\r\n 11\r\n526891.3167667593\r\n 21\r\n185848.3127625726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526911.4770323184\r\n 20\r\n185468.6468766246\r\n 30\r\n0.0\r\n 11\r\n526810.6942338679\r\n 21\r\n185658.8206326186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527411.0206055598\r\n 20\r\n185333.4814571598\r\n 30\r\n0.0\r\n 11\r\n527388.4196091816\r\n 21\r\n185374.7040832365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527339.1587846829\r\n 20\r\n185334.1368332729\r\n 30\r\n0.0\r\n 11\r\n527390.3205215139\r\n 21\r\n185374.6741535153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527346.8032714759\r\n 20\r\n185285.1763658685\r\n 30\r\n0.0\r\n 11\r\n527273.1947542249\r\n 21\r\n185359.1001727385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527181.2197812676\r\n 20\r\n185239.2945574107\r\n 30\r\n0.0\r\n 11\r\n527367.6316948791\r\n 21\r\n185472.5526329555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527466.121962935\r\n 20\r\n185475.6227822589\r\n 30\r\n0.0\r\n 11\r\n527424.9054135911\r\n 21\r\n185530.7658671615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527399.9974681621\r\n 20\r\n185510.9279697606\r\n 30\r\n0.0\r\n 11\r\n527448.0322060059\r\n 21\r\n185547.0560186549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527408.3217922771\r\n 20\r\n185508.7439396979\r\n 30\r\n0.0\r\n 11\r\n527364.8126878394\r\n 21\r\n185565.2721074394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527364.0542931707\r\n 20\r\n185561.6328528111\r\n 30\r\n0.0\r\n 11\r\n527408.0574935037\r\n 21\r\n185596.4941229428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527448.4815771714\r\n 20\r\n185538.0317231022\r\n 30\r\n0.0\r\n 11\r\n527401.8970982832\r\n 21\r\n185599.9669644852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528016.5909572429\r\n 20\r\n185271.6800929167\r\n 30\r\n0.0\r\n 11\r\n528012.5967550619\r\n 21\r\n185353.5650402731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527936.946852038\r\n 20\r\n185275.1632121824\r\n 30\r\n0.0\r\n 11\r\n528024.6252713311\r\n 21\r\n185280.6334288583\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527953.3585635359\r\n 20\r\n185269.0754004951\r\n 30\r\n0.0\r\n 11\r\n527825.7485330229\r\n 21\r\n185421.620255855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527790.870967409\r\n 20\r\n185144.4981020443\r\n 30\r\n0.0\r\n 11\r\n528132.1094471575\r\n 21\r\n185534.3175563607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527865.0297079079\r\n 20\r\n185461.1095822174\r\n 30\r\n0.0\r\n 11\r\n528014.9724719328\r\n 21\r\n185349.9475101025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527826.0659708985\r\n 20\r\n185414.6828547094\r\n 30\r\n0.0\r\n 11\r\n527865.8745595912\r\n 21\r\n185461.1790582917\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527624.531848853\r\n 20\r\n185633.3976253178\r\n 30\r\n0.0\r\n 11\r\n527853.7385512123\r\n 21\r\n185444.161651608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527767.7467574182\r\n 20\r\n185650.035349184\r\n 30\r\n0.0\r\n 11\r\n528263.528864607\r\n 21\r\n185229.3122790655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528136.3517156943\r\n 20\r\n185428.30105944\r\n 30\r\n0.0\r\n 11\r\n528347.6752841493\r\n 21\r\n185588.892138813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528186.367620322\r\n 20\r\n185380.0513308243\r\n 30\r\n0.0\r\n 11\r\n528051.8368017208\r\n 21\r\n185519.7330295476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528237.9007454377\r\n 20\r\n185431.2053651018\r\n 30\r\n0.0\r\n 11\r\n528192.908870577\r\n 21\r\n185477.1550865222\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528217.0172436352\r\n 20\r\n185380.9943664984\r\n 30\r\n0.0\r\n 11\r\n528236.4620391206\r\n 21\r\n185447.0182671067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528223.7188546365\r\n 20\r\n185431.0284260889\r\n 30\r\n0.0\r\n 11\r\n528559.2352564908\r\n 21\r\n185654.693000482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528349.2591038744\r\n 20\r\n185424.8977161368\r\n 30\r\n0.0\r\n 11\r\n528201.2815009599\r\n 21\r\n185682.7410067485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528191.6798505507\r\n 20\r\n185673.5157531144\r\n 30\r\n0.0\r\n 11\r\n528391.3852590313\r\n 21\r\n185804.4872061746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528022.8036675936\r\n 20\r\n185761.7576682877\r\n 30\r\n0.0\r\n 11\r\n528209.7659998483\r\n 21\r\n185672.5838592456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527902.7342881627\r\n 20\r\n185504.0363614708\r\n 30\r\n0.0\r\n 11\r\n528080.3226951775\r\n 21\r\n185740.677656751\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528100.3605101067\r\n 20\r\n185503.0009609594\r\n 30\r\n0.0\r\n 11\r\n528471.2251337772\r\n 21\r\n185777.1470163376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527989.6882072637\r\n 20\r\n185927.1348780362\r\n 30\r\n0.0\r\n 11\r\n528192.9659531929\r\n 21\r\n185625.1118063627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527961.9309788312\r\n 20\r\n185823.9192870058\r\n 30\r\n0.0\r\n 11\r\n528067.3128045042\r\n 21\r\n185875.7285385648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528012.5268591681\r\n 20\r\n185787.9322542143\r\n 30\r\n0.0\r\n 11\r\n528039.4327511025\r\n 21\r\n185894.4295492943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527691.7149266093\r\n 20\r\n185398.8614730684\r\n 30\r\n0.0\r\n 11\r\n527914.0029648269\r\n 21\r\n185627.3190115407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527869.2643178839\r\n 20\r\n185537.3894388642\r\n 30\r\n0.0\r\n 11\r\n527810.6201234687\r\n 21\r\n185860.3170556521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527809.1084261395\r\n 20\r\n185747.0527862236\r\n 30\r\n0.0\r\n 11\r\n527972.918083988\r\n 21\r\n185778.6332784218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n19FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527949.3576618674\r\n 20\r\n185772.7602072676\r\n 30\r\n0.0\r\n 11\r\n528028.7529029781\r\n 21\r\n185798.2352525258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527957.2826477116\r\n 20\r\n185762.2976258021\r\n 30\r\n0.0\r\n 11\r\n527974.7780660359\r\n 21\r\n185840.5156413443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527880.8185873425\r\n 20\r\n185906.512433928\r\n 30\r\n0.0\r\n 11\r\n527980.2405118185\r\n 21\r\n185829.1345334503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527585.3290340103\r\n 20\r\n185539.930241882\r\n 30\r\n0.0\r\n 11\r\n527663.5568333297\r\n 21\r\n185667.0336448759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528197.1631705874\r\n 20\r\n185567.3658917978\r\n 30\r\n0.0\r\n 11\r\n528174.562174209\r\n 21\r\n185608.5885178743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528125.3013497101\r\n 20\r\n185568.0212679109\r\n 30\r\n0.0\r\n 11\r\n528176.4630865414\r\n 21\r\n185608.5585881534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528132.9458365035\r\n 20\r\n185519.0608005063\r\n 30\r\n0.0\r\n 11\r\n528059.3373192524\r\n 21\r\n185592.9846073763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527967.3623462952\r\n 20\r\n185473.1789920484\r\n 30\r\n0.0\r\n 11\r\n528153.7742599065\r\n 21\r\n185706.4370675933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528252.2645279622\r\n 20\r\n185709.5072168967\r\n 30\r\n0.0\r\n 11\r\n528211.0479786187\r\n 21\r\n185764.6503017994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528186.1400331898\r\n 20\r\n185744.8124043986\r\n 30\r\n0.0\r\n 11\r\n528234.1747710333\r\n 21\r\n185780.9404532926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527729.6552787081\r\n 20\r\n185540.1857397122\r\n 30\r\n0.0\r\n 11\r\n527806.5341364845\r\n 21\r\n185622.6127484563\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528007.2965028686\r\n 20\r\n185884.1544039194\r\n 30\r\n0.0\r\n 11\r\n527851.8430313845\r\n 21\r\n186437.6677441766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527941.7493953729\r\n 20\r\n185904.9528054292\r\n 30\r\n0.0\r\n 11\r\n527878.2684433706\r\n 21\r\n186123.2179503772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527804.6629765957\r\n 20\r\n185777.9836909368\r\n 30\r\n0.0\r\n 11\r\n527696.3651398602\r\n 21\r\n185908.7677732899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527684.112269079\r\n 20\r\n185706.0815362376\r\n 30\r\n0.0\r\n 11\r\n528665.054318946\r\n 21\r\n186537.7386197715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527801.7017107939\r\n 20\r\n185896.0515912543\r\n 30\r\n0.0\r\n 11\r\n527595.1283308359\r\n 21\r\n186283.6224961132\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527857.3091071436\r\n 20\r\n185937.7342554978\r\n 30\r\n0.0\r\n 11\r\n527697.9637193599\r\n 21\r\n185827.1966351875\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527815.0264069962\r\n 20\r\n185996.7645144781\r\n 30\r\n0.0\r\n 11\r\n527762.4906663322\r\n 21\r\n185959.6748709776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527861.265174234\r\n 20\r\n185968.1421205775\r\n 30\r\n0.0\r\n 11\r\n527799.1864118238\r\n 21\r\n185997.8655588148\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527812.9398004629\r\n 20\r\n185982.7358507043\r\n 30\r\n0.0\r\n 11\r\n527645.6343383252\r\n 21\r\n186349.6227271258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527941.9014901828\r\n 20\r\n186144.688367828\r\n 30\r\n0.0\r\n 11\r\n527560.8699665694\r\n 21\r\n186000.7207594688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527568.4462253584\r\n 20\r\n185989.7709970077\r\n 30\r\n0.0\r\n 11\r\n527470.9931260145\r\n 21\r\n186207.8046300123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527454.4061946053\r\n 20\r\n185837.1254201002\r\n 30\r\n0.0\r\n 11\r\n527572.250006963\r\n 21\r\n186007.4771673475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527540.9559103656\r\n 20\r\n185826.5835443709\r\n 30\r\n0.0\r\n 11\r\n527484.3878387183\r\n 21\r\n185890.5473859652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527722.2187565154\r\n 20\r\n185872.4316389714\r\n 30\r\n0.0\r\n 11\r\n527530.1843775018\r\n 21\r\n186250.5295411427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527199.4167249749\r\n 20\r\n185905.5738254118\r\n 30\r\n0.0\r\n 11\r\n527537.0677506778\r\n 21\r\n186251.6575700604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527037.937839605\r\n 20\r\n185785.4550518199\r\n 30\r\n0.0\r\n 11\r\n527402.5950979067\r\n 21\r\n186107.3044569597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527248.4636741881\r\n 20\r\n185827.0429996101\r\n 30\r\n0.0\r\n 11\r\n527214.1202363191\r\n 21\r\n185939.3375052844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527292.057736972\r\n 20\r\n185871.2534884808\r\n 30\r\n0.0\r\n 11\r\n527191.2130479115\r\n 21\r\n185914.7959914915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527434.1867885707\r\n 20\r\n185997.3590456579\r\n 30\r\n0.0\r\n 11\r\n527271.6617460263\r\n 21\r\n185877.3888747525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527493.7639413161\r\n 20\r\n185788.7156441948\r\n 30\r\n0.0\r\n 11\r\n527329.8751713632\r\n 21\r\n186041.0408452601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527414.5543417604\r\n 20\r\n185722.5364578387\r\n 30\r\n0.0\r\n 11\r\n527405.9648867027\r\n 21\r\n185570.7866745304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527777.9499912509\r\n 20\r\n185591.9477744219\r\n 30\r\n0.0\r\n 11\r\n527777.9424147139\r\n 21\r\n185591.9576350925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527564.4516644597\r\n 20\r\n185687.9319159665\r\n 30\r\n0.0\r\n 11\r\n527417.0896642248\r\n 21\r\n185898.5265330985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527418.5002731879\r\n 20\r\n185911.5280694478\r\n 30\r\n0.0\r\n 11\r\n527399.359201479\r\n 21\r\n185896.5823695351\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527443.7521620491\r\n 20\r\n186099.9839973919\r\n 30\r\n0.0\r\n 11\r\n527412.5879643001\r\n 21\r\n186132.8918984475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527458.8494366919\r\n 20\r\n186096.3236717095\r\n 30\r\n0.0\r\n 11\r\n527435.98482774\r\n 21\r\n186103.8307410518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527512.3204261397\r\n 20\r\n186131.6694377228\r\n 30\r\n0.0\r\n 11\r\n527451.2650306086\r\n 21\r\n186093.7999110848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527486.6016876462\r\n 20\r\n185876.1701421699\r\n 30\r\n0.0\r\n 11\r\n527197.9069829295\r\n 21\r\n185676.0574444601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527341.4893924392\r\n 20\r\n185686.2844910231\r\n 30\r\n0.0\r\n 11\r\n527468.1911678976\r\n 21\r\n185837.1674141337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527870.7315726819\r\n 20\r\n185757.0874915315\r\n 30\r\n0.0\r\n 11\r\n527174.3057571509\r\n 21\r\n185682.3979604978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527339.2256498769\r\n 20\r\n185765.9107526084\r\n 30\r\n0.0\r\n 11\r\n527276.6228466298\r\n 21\r\n185835.140292735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527296.9634399069\r\n 20\r\n185806.4733018887\r\n 30\r\n0.0\r\n 11\r\n527284.4737717901\r\n 21\r\n185888.914738268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527308.5557930746\r\n 20\r\n185812.628653998\r\n 30\r\n0.0\r\n 11\r\n527234.1280989511\r\n 21\r\n185842.3719888006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527112.9020909969\r\n 20\r\n185727.2361141512\r\n 30\r\n0.0\r\n 11\r\n527246.2345787155\r\n 21\r\n185845.9498482914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527674.1123383103\r\n 20\r\n185978.258723999\r\n 30\r\n0.0\r\n 11\r\n527629.8134086306\r\n 21\r\n185962.5197670078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527662.0070842561\r\n 20\r\n185907.4207847158\r\n 30\r\n0.0\r\n 11\r\n527630.1460531406\r\n 21\r\n185964.3915872753\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527730.4528268442\r\n 20\r\n185736.3799521287\r\n 30\r\n0.0\r\n 11\r\n527529.9021070324\r\n 21\r\n185957.5996170005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527542.5753662606\r\n 20\r\n186055.3193551242\r\n 30\r\n0.0\r\n 11\r\n527396.6007777854\r\n 21\r\n185974.7797865106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527827.6730787736\r\n 20\r\n186098.8040912351\r\n 30\r\n0.0\r\n 11\r\n527731.6664476053\r\n 21\r\n186345.3735064728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527110.0277079166\r\n 20\r\n185399.1501917908\r\n 30\r\n0.0\r\n 11\r\n527238.1476272985\r\n 21\r\n185293.0534528619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527019.584788666\r\n 20\r\n185440.5605438748\r\n 30\r\n0.0\r\n 11\r\n526958.3782706025\r\n 21\r\n185266.4775408631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527667.1841413337\r\n 20\r\n185924.4546898795\r\n 30\r\n0.0\r\n 11\r\n527567.5689432492\r\n 21\r\n185862.7537503939\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527615.9831795112\r\n 20\r\n185099.2005308893\r\n 30\r\n0.0\r\n 11\r\n527796.2414715133\r\n 21\r\n185016.9135917002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530074.9353769958\r\n 20\r\n183884.9393605395\r\n 30\r\n0.0\r\n 11\r\n530627.1098105166\r\n 21\r\n183787.5003604821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530092.5401323481\r\n 20\r\n183873.9934044805\r\n 30\r\n0.0\r\n 11\r\n530024.122431041\r\n 21\r\n184662.0858697672\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530077.6837635742\r\n 20\r\n184011.0438925107\r\n 30\r\n0.0\r\n 11\r\n530225.1006832576\r\n 21\r\n183999.8213038695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530193.1767123051\r\n 20\r\n183992.992663651\r\n 30\r\n0.0\r\n 11\r\n530265.7841074339\r\n 21\r\n184031.0618694109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530236.5551485069\r\n 20\r\n183926.10748677\r\n 30\r\n0.0\r\n 11\r\n530196.8211880385\r\n 21\r\n184004.4569658093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530221.1692751257\r\n 20\r\n183937.2875946002\r\n 30\r\n0.0\r\n 11\r\n530417.3513434172\r\n 21\r\n183904.6249421486\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530224.7609106149\r\n 20\r\n183814.7398711447\r\n 30\r\n0.0\r\n 11\r\n530360.99994493\r\n 21\r\n184225.7120683164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530433.2945147376\r\n 20\r\n183958.3836377817\r\n 30\r\n0.0\r\n 11\r\n530261.4615139464\r\n 21\r\n184031.2757402305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530413.0289029687\r\n 20\r\n183901.2616734557\r\n 30\r\n0.0\r\n 11\r\n530432.9260982123\r\n 21\r\n183959.1470973785\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530703.7238554928\r\n 20\r\n183838.4238042374\r\n 30\r\n0.0\r\n 11\r\n530424.4100015701\r\n 21\r\n183940.0591187636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530638.2657253066\r\n 20\r\n183858.3461717027\r\n 30\r\n0.0\r\n 11\r\n530669.6009970998\r\n 21\r\n183967.0471471273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530745.9713467414\r\n 20\r\n183938.6856453953\r\n 30\r\n0.0\r\n 11\r\n530048.9949907507\r\n 21\r\n184149.7235543463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530267.4660776979\r\n 20\r\n184175.6230461426\r\n 30\r\n0.0\r\n 11\r\n530319.246465793\r\n 21\r\n184611.7452297214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530200.5202950364\r\n 20\r\n184194.2748345569\r\n 30\r\n0.0\r\n 11\r\n530389.1232236338\r\n 21\r\n184149.1255993895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530180.4056919937\r\n 20\r\n184329.153562387\r\n 30\r\n0.0\r\n 11\r\n530198.7734187687\r\n 21\r\n184654.907534193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530046.5684076484\r\n 20\r\n184356.4003792694\r\n 30\r\n0.0\r\n 11\r\n530453.8695489496\r\n 21\r\n184360.5806350824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530450.7852589756\r\n 20\r\n184347.6274829353\r\n 30\r\n0.0\r\n 11\r\n530385.9506331715\r\n 21\r\n184610.7077117975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530612.460149862\r\n 20\r\n184246.7957894036\r\n 30\r\n0.0\r\n 11\r\n530440.8131043484\r\n 21\r\n184362.7448026278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530535.6421089239\r\n 20\r\n184205.5529351321\r\n 30\r\n0.0\r\n 11\r\n530565.1301390405\r\n 21\r\n184285.688918568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530024.5229396512\r\n 20\r\n184465.432338599\r\n 30\r\n0.0\r\n 11\r\n530114.5645462456\r\n 21\r\n184461.6113334234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529993.4499721084\r\n 20\r\n184615.0159573572\r\n 30\r\n0.0\r\n 11\r\n530483.024820749\r\n 21\r\n184583.9403332796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530493.2454602082\r\n 20\r\n184168.3430140179\r\n 30\r\n0.0\r\n 11\r\n530614.159380122\r\n 21\r\n184157.0607492791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530584.827322039\r\n 20\r\n184059.2669308301\r\n 30\r\n0.0\r\n 11\r\n530480.5551723789\r\n 21\r\n184120.2181389518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530484.8336682371\r\n 20\r\n184115.0153426162\r\n 30\r\n0.0\r\n 11\r\n530494.679085399\r\n 21\r\n184169.9761345888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530467.5014361801\r\n 20\r\n183777.4341226273\r\n 30\r\n0.0\r\n 11\r\n530624.9403788047\r\n 21\r\n184317.5549867041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530563.872390367\r\n 20\r\n184118.3744737268\r\n 30\r\n0.0\r\n 11\r\n530598.0635031751\r\n 21\r\n184108.7328174946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530768.7252722775\r\n 20\r\n183716.8702567725\r\n 30\r\n0.0\r\n 11\r\n530609.0654214319\r\n 21\r\n183792.4024777319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530347.425039943\r\n 20\r\n184218.6985028227\r\n 30\r\n0.0\r\n 11\r\n530448.4615770839\r\n 21\r\n184192.7261868566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530391.819822532\r\n 20\r\n184052.7101422193\r\n 30\r\n0.0\r\n 11\r\n530498.3789814079\r\n 21\r\n184331.6436056164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530570.0848544786\r\n 20\r\n183881.7828693857\r\n 30\r\n0.0\r\n 11\r\n530602.1603788654\r\n 21\r\n183989.8371672121\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529939.5685612063\r\n 20\r\n184163.7506789629\r\n 30\r\n0.0\r\n 11\r\n529827.1842240089\r\n 21\r\n185458.2877310593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529880.7455565422\r\n 20\r\n184807.2457538028\r\n 30\r\n0.0\r\n 11\r\n530028.1624762256\r\n 21\r\n184796.0231651615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529960.4101130438\r\n 20\r\n184663.1778075725\r\n 30\r\n0.0\r\n 11\r\n529916.71644329\r\n 21\r\n185155.697319893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529996.238505273\r\n 20\r\n184789.1945249431\r\n 30\r\n0.0\r\n 11\r\n530068.8459004022\r\n 21\r\n184827.263730703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530039.6169414749\r\n 20\r\n184722.3093480621\r\n 30\r\n0.0\r\n 11\r\n529999.8829810068\r\n 21\r\n184800.6588271014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530026.0493983941\r\n 20\r\n184733.36952438\r\n 30\r\n0.0\r\n 11\r\n530222.2314666858\r\n 21\r\n184700.7068719285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530001.0414109108\r\n 20\r\n184530.1545575434\r\n 30\r\n0.0\r\n 11\r\n530164.0617378978\r\n 21\r\n185021.9139296083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530236.3563077058\r\n 20\r\n184754.5854990738\r\n 30\r\n0.0\r\n 11\r\n530064.5233069145\r\n 21\r\n184827.4776015228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530216.0906959366\r\n 20\r\n184697.4635347478\r\n 30\r\n0.0\r\n 11\r\n530235.9878911803\r\n 21\r\n184755.3489586706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530407.4403198415\r\n 20\r\n184689.2318219746\r\n 30\r\n0.0\r\n 11\r\n530227.4717945381\r\n 21\r\n184736.2609800559\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530070.5278706658\r\n 20\r\n184971.8249074348\r\n 30\r\n0.0\r\n 11\r\n530122.3082587611\r\n 21\r\n185407.9470910134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530003.5820880041\r\n 20\r\n184990.476695849\r\n 30\r\n0.0\r\n 11\r\n530192.1850166016\r\n 21\r\n184945.3274606815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530021.5503732429\r\n 20\r\n185060.8296555069\r\n 30\r\n0.0\r\n 11\r\n530083.9666508887\r\n 21\r\n185045.3424353904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529988.8569365287\r\n 20\r\n185017.3738823104\r\n 30\r\n0.0\r\n 11\r\n530035.9100089048\r\n 21\r\n185067.6059826347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530028.5874565967\r\n 20\r\n185048.5155663411\r\n 30\r\n0.0\r\n 11\r\n530051.2878197391\r\n 21\r\n185451.109395485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529590.0046100221\r\n 20\r\n185205.4301442984\r\n 30\r\n0.0\r\n 11\r\n530281.0617747266\r\n 21\r\n185224.1071918924\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530253.8470519436\r\n 20\r\n185143.829344227\r\n 30\r\n0.0\r\n 11\r\n530265.4988130901\r\n 21\r\n185382.3665701588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529831.8611015576\r\n 20\r\n185339.0029824713\r\n 30\r\n0.0\r\n 11\r\n529921.902708152\r\n 21\r\n185335.1819772955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529796.5117650765\r\n 20\r\n185411.2178186492\r\n 30\r\n0.0\r\n 11\r\n530267.6619057944\r\n 21\r\n185380.1421945718\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530153.1630439457\r\n 20\r\n184978.6710964276\r\n 30\r\n0.0\r\n 11\r\n530194.8353082583\r\n 21\r\n185400.6884523936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530159.5690694193\r\n 20\r\n185094.7424634202\r\n 30\r\n0.0\r\n 11\r\n530206.5595262442\r\n 21\r\n185096.1591162804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530196.5647924344\r\n 20\r\n185033.1318531638\r\n 30\r\n0.0\r\n 11\r\n530205.5700480689\r\n 21\r\n185097.7824758906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530150.4868329109\r\n 20\r\n185014.9003641146\r\n 30\r\n0.0\r\n 11\r\n530251.5233700519\r\n 21\r\n184988.9280481487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n530194.8816155\r\n 20\r\n184848.9120035113\r\n 30\r\n0.0\r\n 11\r\n530301.4407743759\r\n 21\r\n185127.8454669085\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1A9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529970.7774168067\r\n 20\r\n185189.3995273232\r\n 30\r\n0.0\r\n 11\r\n529972.6676480018\r\n 21\r\n185415.9178013272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ACD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529875.2497154139\r\n 20\r\n184199.4087741126\r\n 30\r\n0.0\r\n 11\r\n529863.0202526016\r\n 21\r\n184337.2605291638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ACE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529743.980573447\r\n 20\r\n184129.1822409128\r\n 30\r\n0.0\r\n 11\r\n529616.2323189746\r\n 21\r\n184549.3776134238\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ACF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529771.7650712592\r\n 20\r\n184212.0585172357\r\n 30\r\n0.0\r\n 11\r\n529678.5451351549\r\n 21\r\n184604.3685238173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529929.6036353747\r\n 20\r\n184346.0238967045\r\n 30\r\n0.0\r\n 11\r\n529583.3850811765\r\n 21\r\n184287.767590759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529914.2805504444\r\n 20\r\n184532.6416357702\r\n 30\r\n0.0\r\n 11\r\n529826.3178454189\r\n 21\r\n184513.0290499321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529936.3648480746\r\n 20\r\n184609.9516736181\r\n 30\r\n0.0\r\n 11\r\n529478.0436297417\r\n 21\r\n184496.4183730585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529661.430738583\r\n 20\r\n184121.3741085768\r\n 30\r\n0.0\r\n 11\r\n529546.1158085704\r\n 21\r\n184529.4644089586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529232.9972191319\r\n 20\r\n184308.7579889585\r\n 30\r\n0.0\r\n 11\r\n529553.0874010506\r\n 21\r\n184529.24041386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529634.6911295682\r\n 20\r\n184234.5049739838\r\n 30\r\n0.0\r\n 11\r\n529588.1851601869\r\n 21\r\n184227.6271291281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529609.1193511298\r\n 20\r\n184167.343713088\r\n 30\r\n0.0\r\n 11\r\n529588.8734028448\r\n 21\r\n184229.3993270648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529943.8312827582\r\n 20\r\n184525.0791841147\r\n 30\r\n0.0\r\n 11\r\n529696.7858197628\r\n 21\r\n184980.4597351244\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529427.594100383\r\n 20\r\n184538.885622905\r\n 30\r\n0.0\r\n 11\r\n529760.9646796797\r\n 21\r\n184732.402681762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529368.3559519504\r\n 20\r\n184630.1442064984\r\n 30\r\n0.0\r\n 11\r\n530028.4476193018\r\n 21\r\n184997.7725392588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ADA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529797.6767641356\r\n 20\r\n184947.6190316421\r\n 30\r\n0.0\r\n 11\r\n529669.928509663\r\n 21\r\n185367.8144041533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ADB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529860.2934819285\r\n 20\r\n184977.7649049925\r\n 30\r\n0.0\r\n 11\r\n529682.5843242276\r\n 21\r\n184900.118440933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ADC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529830.2206250684\r\n 20\r\n185043.8559141184\r\n 30\r\n0.0\r\n 11\r\n529771.5055698461\r\n 21\r\n185017.6225766955\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ADD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529870.0535815491\r\n 20\r\n185006.8342906227\r\n 30\r\n0.0\r\n 11\r\n529814.8923235209\r\n 21\r\n185047.9984878788\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ADE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529787.3488705874\r\n 20\r\n185190.8888152999\r\n 30\r\n0.0\r\n 11\r\n529732.2413258432\r\n 21\r\n185422.8053145468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ADF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529528.4200429016\r\n 20\r\n184929.8707909057\r\n 30\r\n0.0\r\n 11\r\n529485.2851129321\r\n 21\r\n185003.5640577484\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529861.3466617636\r\n 20\r\n185395.7871211546\r\n 30\r\n0.0\r\n 11\r\n529657.6942649834\r\n 21\r\n185321.2900416619\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529715.1269292716\r\n 20\r\n184939.8108993062\r\n 30\r\n0.0\r\n 11\r\n529599.8119992587\r\n 21\r\n185347.9011996878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529488.1906467225\r\n 20\r\n184870.3446560795\r\n 30\r\n0.0\r\n 11\r\n529362.7819015576\r\n 21\r\n185181.0898554979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529576.7051272891\r\n 20\r\n184900.7056631444\r\n 30\r\n0.0\r\n 11\r\n529459.6657693327\r\n 21\r\n184868.3134693976\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529594.3735463972\r\n 20\r\n184849.6916871425\r\n 30\r\n0.0\r\n 11\r\n529575.0063913913\r\n 21\r\n184902.0608975654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529670.8641300261\r\n 20\r\n184520.4339203804\r\n 30\r\n0.0\r\n 11\r\n529420.7991483043\r\n 21\r\n185024.4032382779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529424.696695358\r\n 20\r\n185036.8867831289\r\n 30\r\n0.0\r\n 11\r\n529403.0273226811\r\n 21\r\n185025.9235327067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529484.6776843873\r\n 20\r\n184989.0300529047\r\n 30\r\n0.0\r\n 11\r\n529154.8530687077\r\n 21\r\n184857.6163123908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529388.1465096351\r\n 20\r\n184631.4338432891\r\n 30\r\n0.0\r\n 11\r\n529218.8678648771\r\n 21\r\n184745.3258481783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529210.1002453442\r\n 20\r\n184715.4851078794\r\n 30\r\n0.0\r\n 11\r\n529459.0742043105\r\n 21\r\n184954.3223903557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529501.6288089996\r\n 20\r\n184469.6622570667\r\n 30\r\n0.0\r\n 11\r\n529335.4374341035\r\n 21\r\n184681.8639145324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529688.3873202567\r\n 20\r\n185052.9417647131\r\n 30\r\n0.0\r\n 11\r\n529641.8813508754\r\n 21\r\n185046.0639198577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529662.8155418183\r\n 20\r\n184985.7805038173\r\n 30\r\n0.0\r\n 11\r\n529642.5695935333\r\n 21\r\n185047.8361177944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529711.3834105942\r\n 20\r\n184975.9454812266\r\n 30\r\n0.0\r\n 11\r\n529616.4970881978\r\n 21\r\n184932.5919478516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529551.5128856724\r\n 20\r\n184605.0938231147\r\n 30\r\n0.0\r\n 11\r\n529500.9160291978\r\n 21\r\n184705.8138740395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529229.9928105621\r\n 20\r\n184823.4360587599\r\n 30\r\n0.0\r\n 11\r\n529069.7380110376\r\n 21\r\n184767.29964573\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529363.2040231364\r\n 20\r\n184387.2143297671\r\n 30\r\n0.0\r\n 11\r\n529105.5296935886\r\n 21\r\n185097.4787454935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529118.2454725926\r\n 20\r\n184861.663413327\r\n 30\r\n0.0\r\n 11\r\n528610.7086128694\r\n 21\r\n184746.5116670509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529098.4694227296\r\n 20\r\n184928.2857435104\r\n 30\r\n0.0\r\n 11\r\n529146.7870302851\r\n 21\r\n184740.469538374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529170.724510631\r\n 20\r\n184957.6331569076\r\n 30\r\n0.0\r\n 11\r\n529021.8952428087\r\n 21\r\n184894.6640790772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529040.859693092\r\n 20\r\n184902.3069445089\r\n 30\r\n0.0\r\n 11\r\n528722.5634822862\r\n 21\r\n184932.0754702145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529131.2573684122\r\n 20\r\n184670.4601999175\r\n 30\r\n0.0\r\n 11\r\n528711.0439408052\r\n 21\r\n184659.8094122968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529179.4477933593\r\n 20\r\n184474.2710277709\r\n 30\r\n0.0\r\n 11\r\n529122.1824233242\r\n 21\r\n184581.3604433139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529219.9382027254\r\n 20\r\n184610.819026985\r\n 30\r\n0.0\r\n 11\r\n529226.5921333122\r\n 21\r\n184490.2227742489\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529228.5730222924\r\n 20\r\n184496.6609956934\r\n 30\r\n0.0\r\n 11\r\n529177.2948609519\r\n 21\r\n184474.5664021717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529519.7451906417\r\n 20\r\n184668.359145759\r\n 30\r\n0.0\r\n 11\r\n529519.7333124487\r\n 21\r\n184668.3554653684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529379.9396602592\r\n 20\r\n184625.041193395\r\n 30\r\n0.0\r\n 11\r\n528356.8679548832\r\n 21\r\n184402.5798630084\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528952.0907373794\r\n 20\r\n184691.4129135921\r\n 30\r\n0.0\r\n 11\r\n529052.0012758732\r\n 21\r\n184341.0790658432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529196.5071686171\r\n 20\r\n184329.7187022287\r\n 30\r\n0.0\r\n 11\r\n529068.1024692344\r\n 21\r\n184569.0160955433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529180.47536678\r\n 20\r\n184566.2627675879\r\n 30\r\n0.0\r\n 11\r\n529190.6911988818\r\n 21\r\n184532.2387980305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528880.8283251523\r\n 20\r\n184862.3142856285\r\n 30\r\n0.0\r\n 11\r\n528996.2187128513\r\n 21\r\n184723.5581030898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1AFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529059.0688036402\r\n 20\r\n184734.6123641568\r\n 30\r\n0.0\r\n 11\r\n528994.5789272775\r\n 21\r\n184724.5201149165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529243.2342187749\r\n 20\r\n184739.3962912836\r\n 30\r\n0.0\r\n 11\r\n529025.374155144\r\n 21\r\n184651.9383440277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529306.9039543703\r\n 20\r\n184429.3838377322\r\n 30\r\n0.0\r\n 11\r\n529424.1561644725\r\n 21\r\n184602.6736955386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529044.8931152141\r\n 20\r\n184745.3829585117\r\n 30\r\n0.0\r\n 11\r\n529068.1577717093\r\n 21\r\n184630.5398072969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529925.571842865\r\n 20\r\n184345.3454889904\r\n 30\r\n0.0\r\n 11\r\n530065.3395954874\r\n 21\r\n184485.8060440349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527134.7421133008\r\n 20\r\n185746.6815669867\r\n 30\r\n0.0\r\n 11\r\n526854.7475136897\r\n 21\r\n185647.3070632744\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527048.0415984104\r\n 20\r\n185467.8954880649\r\n 30\r\n0.0\r\n 11\r\n527041.7620982851\r\n 21\r\n185733.2410348589\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526774.4150185317\r\n 20\r\n185453.3134554358\r\n 30\r\n0.0\r\n 11\r\n527096.7080671646\r\n 21\r\n185548.6402006319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527183.7589148466\r\n 20\r\n185507.4189276198\r\n 30\r\n0.0\r\n 11\r\n527212.8484589074\r\n 21\r\n185686.4143336474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527642.2925246087\r\n 20\r\n185589.7842453163\r\n 30\r\n0.0\r\n 11\r\n527633.9139317363\r\n 21\r\n185753.7844069439\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527039.5332444966\r\n 20\r\n185538.7648673743\r\n 30\r\n0.0\r\n 11\r\n527282.5187367876\r\n 21\r\n185520.3123034324\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527013.1566275844\r\n 20\r\n185737.6687210239\r\n 30\r\n0.0\r\n 11\r\n527301.7042551051\r\n 21\r\n185767.6062004553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528866.4052278898\r\n 20\r\n184794.5969995048\r\n 30\r\n0.0\r\n 11\r\n528899.1937164198\r\n 21\r\n184354.8994272966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528801.7919096823\r\n 20\r\n184268.0094211798\r\n 30\r\n0.0\r\n 11\r\n528476.702491275\r\n 21\r\n184122.8305720991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529625.620367733\r\n 20\r\n184419.5556609415\r\n 30\r\n0.0\r\n 11\r\n529366.6037593966\r\n 21\r\n184233.2897046201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527004.8945598029\r\n 20\r\n184700.8393834953\r\n 30\r\n0.0\r\n 11\r\n526953.4379044082\r\n 21\r\n184931.6240468094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528390.9898125458\r\n 20\r\n185753.3602785319\r\n 30\r\n0.0\r\n 11\r\n528781.3753309265\r\n 21\r\n185827.6345873771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528106.4157938656\r\n 20\r\n187215.6255117142\r\n 30\r\n0.0\r\n 11\r\n528884.2109935742\r\n 21\r\n184710.0395547231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529676.6264599539\r\n 20\r\n185290.4940208969\r\n 30\r\n0.0\r\n 11\r\n529920.7713187865\r\n 21\r\n185313.7159799931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529710.1858069896\r\n 20\r\n185288.9440628221\r\n 30\r\n0.0\r\n 11\r\n529589.3946623234\r\n 21\r\n185498.1525499557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529260.9647945109\r\n 20\r\n185147.8370213298\r\n 30\r\n0.0\r\n 11\r\n529921.0564618626\r\n 21\r\n185515.4653540902\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529690.2856066964\r\n 20\r\n185465.3118464734\r\n 30\r\n0.0\r\n 11\r\n529562.5373522235\r\n 21\r\n185885.5072189847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529752.9023244892\r\n 20\r\n185495.4577198239\r\n 30\r\n0.0\r\n 11\r\n529575.1931667881\r\n 21\r\n185417.8112557643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529722.829467629\r\n 20\r\n185561.5487289499\r\n 30\r\n0.0\r\n 11\r\n529664.1144124067\r\n 21\r\n185535.3153915267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529718.0701045081\r\n 20\r\n185548.1881227963\r\n 30\r\n0.0\r\n 11\r\n529624.8501684037\r\n 21\r\n185940.498129378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529767.4186194858\r\n 20\r\n185663.7851117391\r\n 30\r\n0.0\r\n 11\r\n529474.2327039333\r\n 21\r\n185614.5656806243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529479.5491451336\r\n 20\r\n185602.3577959528\r\n 30\r\n0.0\r\n 11\r\n529426.0863860198\r\n 21\r\n185835.1184134999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529338.1500175083\r\n 20\r\n185474.63901319\r\n 30\r\n0.0\r\n 11\r\n529486.7042496121\r\n 21\r\n185618.9945535243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529421.0288854622\r\n 20\r\n185447.5636057371\r\n 30\r\n0.0\r\n 11\r\n529377.8939554926\r\n 21\r\n185521.2568725796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529753.9555043243\r\n 20\r\n185913.4799359859\r\n 30\r\n0.0\r\n 11\r\n529424.3486629905\r\n 21\r\n185832.5479786192\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529607.735771832\r\n 20\r\n185457.5037141376\r\n 30\r\n0.0\r\n 11\r\n529492.4208418194\r\n 21\r\n185865.5940145193\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529052.7007117045\r\n 20\r\n185555.5190431744\r\n 30\r\n0.0\r\n 11\r\n529499.3924342998\r\n 21\r\n185865.3700194207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529134.1435313744\r\n 20\r\n185504.561087551\r\n 30\r\n0.0\r\n 11\r\n529122.1575831819\r\n 21\r\n185621.3766035377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529185.4622521453\r\n 20\r\n185539.5096001749\r\n 30\r\n0.0\r\n 11\r\n529094.9380125719\r\n 21\r\n185601.7266631869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529349.289576162\r\n 20\r\n185635.758687261\r\n 30\r\n0.0\r\n 11\r\n529166.6371817065\r\n 21\r\n185549.4723374663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529380.7994892831\r\n 20\r\n185388.0374709109\r\n 30\r\n0.0\r\n 11\r\n529255.3907441184\r\n 21\r\n185698.7826703294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529469.3139698497\r\n 20\r\n185418.3984779757\r\n 30\r\n0.0\r\n 11\r\n529352.2746118934\r\n 21\r\n185386.006284229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529486.9823889578\r\n 20\r\n185367.3845019738\r\n 30\r\n0.0\r\n 11\r\n529467.6152339519\r\n 21\r\n185419.7537123967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529741.8629154026\r\n 20\r\n184685.8712765344\r\n 30\r\n0.0\r\n 11\r\n529313.4079908648\r\n 21\r\n185542.0960531091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529317.3055379187\r\n 20\r\n185554.5795979603\r\n 30\r\n0.0\r\n 11\r\n529295.6361652416\r\n 21\r\n185543.6163475381\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529378.5146834967\r\n 20\r\n185734.5983057824\r\n 30\r\n0.0\r\n 11\r\n529354.3004098581\r\n 21\r\n185772.910263777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529392.6194978177\r\n 20\r\n185728.0883212426\r\n 30\r\n0.0\r\n 11\r\n529371.6375650604\r\n 21\r\n185739.8741148262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529451.9150188564\r\n 20\r\n185752.4298715705\r\n 30\r\n0.0\r\n 11\r\n529384.6902650206\r\n 21\r\n185727.0784447274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529377.2865269477\r\n 20\r\n185506.7228677362\r\n 30\r\n0.0\r\n 11\r\n529047.4619112686\r\n 21\r\n185375.3091272221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529280.7553521956\r\n 20\r\n185149.1266581205\r\n 30\r\n0.0\r\n 11\r\n529111.4767074376\r\n 21\r\n185263.0186630097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529102.7090879047\r\n 20\r\n185233.1779227109\r\n 30\r\n0.0\r\n 11\r\n529351.6830468711\r\n 21\r\n185472.0152051871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529408.5867116509\r\n 20\r\n185356.7769038792\r\n 30\r\n0.0\r\n 11\r\n529376.626936113\r\n 21\r\n185341.2666982859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529211.3746992233\r\n 20\r\n185427.0353849283\r\n 30\r\n0.0\r\n 11\r\n529163.3368893673\r\n 21\r\n185507.06168701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529177.751636039\r\n 20\r\n185475.0031284419\r\n 30\r\n0.0\r\n 11\r\n529181.4357627487\r\n 21\r\n185558.3038454395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529190.3152886656\r\n 20\r\n185478.8012390553\r\n 30\r\n0.0\r\n 11\r\n529123.0419161259\r\n 21\r\n185522.372341461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529028.5214292627\r\n 20\r\n185457.1815612015\r\n 30\r\n0.0\r\n 11\r\n529135.6116966774\r\n 21\r\n185523.5421908994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529339.5448717486\r\n 20\r\n184906.714440032\r\n 30\r\n0.0\r\n 11\r\n529228.0462766641\r\n 21\r\n185199.5567293637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529580.9961628172\r\n 20\r\n185570.6345795445\r\n 30\r\n0.0\r\n 11\r\n529534.4901934361\r\n 21\r\n185563.7567346888\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529555.4243843787\r\n 20\r\n185503.4733186487\r\n 30\r\n0.0\r\n 11\r\n529535.1784360941\r\n 21\r\n185565.5289326257\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529603.9922531548\r\n 20\r\n185493.638296058\r\n 30\r\n0.0\r\n 11\r\n529509.1059307583\r\n 21\r\n185450.2847626829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529589.5120142827\r\n 20\r\n185322.4268616879\r\n 30\r\n0.0\r\n 11\r\n529435.5125850959\r\n 21\r\n185578.2449751067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529466.8386348521\r\n 20\r\n185671.6710813359\r\n 30\r\n0.0\r\n 11\r\n529400.8135946273\r\n 21\r\n185652.1708809338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529410.7663206183\r\n 20\r\n185621.9237130644\r\n 30\r\n0.0\r\n 11\r\n529393.5692052581\r\n 21\r\n185679.5156498254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529415.7053980812\r\n 20\r\n185628.9713987198\r\n 30\r\n0.0\r\n 11\r\n529347.5852966691\r\n 21\r\n185607.802371799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529350.7346442304\r\n 20\r\n185605.8272903669\r\n 30\r\n0.0\r\n 11\r\n529333.3253288324\r\n 21\r\n185659.1986828176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529402.1878585207\r\n 20\r\n185676.8029646959\r\n 30\r\n0.0\r\n 11\r\n529327.9291804021\r\n 21\r\n185654.6278317182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529444.121728233\r\n 20\r\n185122.7866379459\r\n 30\r\n0.0\r\n 11\r\n529393.5248717581\r\n 21\r\n185223.5066888709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529093.4128605832\r\n 20\r\n185568.0221979865\r\n 30\r\n0.0\r\n 11\r\n528595.1237850393\r\n 21\r\n185576.7293241136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529051.144898358\r\n 20\r\n185513.7781552191\r\n 30\r\n0.0\r\n 11\r\n528824.4188338513\r\n 21\r\n185530.0507223063\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529122.6016531229\r\n 20\r\n185341.1288735912\r\n 30\r\n0.0\r\n 11\r\n528962.3468535983\r\n 21\r\n185284.9924605613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529213.0006079433\r\n 20\r\n185022.9166618555\r\n 30\r\n0.0\r\n 11\r\n528998.1385361492\r\n 21\r\n185615.1715603249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528991.0782652902\r\n 20\r\n185445.9785583417\r\n 30\r\n0.0\r\n 11\r\n529039.3958728458\r\n 21\r\n185258.1623532054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528921.0377353934\r\n 20\r\n185426.828561506\r\n 30\r\n0.0\r\n 11\r\n528937.5734197853\r\n 21\r\n185364.6818251168\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528963.9370200458\r\n 20\r\n185460.2488607951\r\n 30\r\n0.0\r\n 11\r\n528914.5040853694\r\n 21\r\n185412.3568939084\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528933.4685356528\r\n 20\r\n185419.9997593404\r\n 30\r\n0.0\r\n 11\r\n528615.1723248469\r\n 21\r\n185449.7682850459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529023.8662109728\r\n 20\r\n185188.1530147488\r\n 30\r\n0.0\r\n 11\r\n528715.9106166859\r\n 21\r\n185150.6747967539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529412.354033202\r\n 20\r\n185186.0519605904\r\n 30\r\n0.0\r\n 11\r\n529412.3421550092\r\n 21\r\n185186.0482801997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529040.6633607615\r\n 20\r\n184884.196908992\r\n 30\r\n0.0\r\n 11\r\n528925.5715025252\r\n 21\r\n185271.9605769922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528773.4371677128\r\n 20\r\n185380.00710046\r\n 30\r\n0.0\r\n 11\r\n528888.8275554119\r\n 21\r\n185241.2509179212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528951.6776462008\r\n 20\r\n185252.3051789882\r\n 30\r\n0.0\r\n 11\r\n528887.1877698381\r\n 21\r\n185242.212929748\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529135.8430613358\r\n 20\r\n185257.0891061149\r\n 30\r\n0.0\r\n 11\r\n528917.9829977046\r\n 21\r\n185169.6311588591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528775.9558829125\r\n 20\r\n185615.017381728\r\n 30\r\n0.0\r\n 11\r\n528778.6521852016\r\n 21\r\n185358.8103474443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528729.9180300995\r\n 20\r\n185960.161097513\r\n 30\r\n0.0\r\n 11\r\n528779.0379103066\r\n 21\r\n186161.3926041654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528950.4189077693\r\n 20\r\n185814.9571831064\r\n 30\r\n0.0\r\n 11\r\n528984.9742384628\r\n 21\r\n186297.2310706317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528951.624137997\r\n 20\r\n185561.616747222\r\n 30\r\n0.0\r\n 11\r\n528966.33570878\r\n 21\r\n186100.8301520585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528859.1323982127\r\n 20\r\n185799.482461746\r\n 30\r\n0.0\r\n 11\r\n528965.9004221569\r\n 21\r\n185848.3712824754\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528863.2406757241\r\n 20\r\n185861.4351186065\r\n 30\r\n0.0\r\n 11\r\n528962.7618637885\r\n 21\r\n185814.9471200873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528863.1513625532\r\n 20\r\n186051.4437259971\r\n 30\r\n0.0\r\n 11\r\n528881.3717627635\r\n 21\r\n185850.2591133216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528448.7063367634\r\n 20\r\n185927.3670817845\r\n 30\r\n0.0\r\n 11\r\n528965.078864012\r\n 21\r\n186002.4559974586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528809.391795014\r\n 20\r\n185982.7201336871\r\n 30\r\n0.0\r\n 11\r\n528810.9272095478\r\n 21\r\n185958.4838576892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528737.7329029084\r\n 20\r\n186010.1607760782\r\n 30\r\n0.0\r\n 11\r\n528795.7281322101\r\n 21\r\n185579.7030681805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528773.2489006129\r\n 20\r\n185602.138604177\r\n 30\r\n0.0\r\n 11\r\n528964.8435679701\r\n 21\r\n185663.829735683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528671.2378729466\r\n 20\r\n185560.6509984881\r\n 30\r\n0.0\r\n 11\r\n528720.795726458\r\n 21\r\n185970.4960299483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528753.1546030234\r\n 20\r\n185826.7513961091\r\n 30\r\n0.0\r\n 11\r\n528846.4880856416\r\n 21\r\n185825.9140055556\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528811.5468672264\r\n 20\r\n185822.0868192886\r\n 30\r\n0.0\r\n 11\r\n528881.4820380612\r\n 21\r\n185867.4922608376\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528808.4515075253\r\n 20\r\n185834.8418088954\r\n 30\r\n0.0\r\n 11\r\n528880.1132298697\r\n 21\r\n185798.942711855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528874.5242430786\r\n 20\r\n185631.8475956416\r\n 30\r\n0.0\r\n 11\r\n528874.7492767722\r\n 21\r\n185810.370569834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529226.7259620609\r\n 20\r\n185859.1195999941\r\n 30\r\n0.0\r\n 11\r\n529461.753936208\r\n 21\r\n185828.3541730241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529273.2801508957\r\n 20\r\n185932.8399631512\r\n 30\r\n0.0\r\n 11\r\n529287.0712099601\r\n 21\r\n185848.5717814258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529088.7060528404\r\n 20\r\n185705.938394954\r\n 30\r\n0.0\r\n 11\r\n529153.993407673\r\n 21\r\n185608.3315866453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529150.5211611966\r\n 20\r\n185711.7609386521\r\n 30\r\n0.0\r\n 11\r\n529120.4964274076\r\n 21\r\n185606.1005570466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529231.026467415\r\n 20\r\n185921.0843057538\r\n 30\r\n0.0\r\n 11\r\n529260.5967490455\r\n 21\r\n185674.6789090408\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529127.0111587181\r\n 20\r\n185947.2972152716\r\n 30\r\n0.0\r\n 11\r\n529248.350250143\r\n 21\r\n185952.225746367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529224.1848018071\r\n 20\r\n186051.4226801147\r\n 30\r\n0.0\r\n 11\r\n529116.8609899559\r\n 21\r\n185996.021142447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529121.4063304959\r\n 20\r\n186000.9925100552\r\n 30\r\n0.0\r\n 11\r\n529128.3572058809\r\n 21\r\n185945.5911903531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529155.3301500879\r\n 20\r\n186196.5494294306\r\n 30\r\n0.0\r\n 11\r\n529250.7034320214\r\n 21\r\n185791.3870299013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529277.3320268682\r\n 20\r\n185859.3770847035\r\n 30\r\n0.0\r\n 11\r\n528939.7638049955\r\n 21\r\n185762.2307008389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528942.970139214\r\n 20\r\n185862.2378862911\r\n 30\r\n0.0\r\n 11\r\n529235.4741338318\r\n 21\r\n185869.7730850032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529205.7845020345\r\n 20\r\n185994.8187523307\r\n 30\r\n0.0\r\n 11\r\n529171.2778213867\r\n 21\r\n185986.3758428427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529098.7281099492\r\n 20\r\n185814.9083276223\r\n 30\r\n0.0\r\n 11\r\n529112.7833206234\r\n 21\r\n185722.6354103959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529103.4337720745\r\n 20\r\n185756.5193600031\r\n 30\r\n0.0\r\n 11\r\n529159.4093684629\r\n 21\r\n185694.7187544166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529115.5320268205\r\n 20\r\n185761.6088829318\r\n 30\r\n0.0\r\n 11\r\n529091.5185714267\r\n 21\r\n185685.1399246696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528925.6700740792\r\n 20\r\n185664.0143344197\r\n 30\r\n0.0\r\n 11\r\n529101.9449496349\r\n 21\r\n185692.2574079522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529323.2047039083\r\n 20\r\n186136.6862493935\r\n 30\r\n0.0\r\n 11\r\n529367.797232147\r\n 21\r\n185841.4401863067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n529769.5900111758\r\n 20\r\n185807.3295091061\r\n 30\r\n0.0\r\n 11\r\n529444.5005927685\r\n 21\r\n185662.1506600254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528763.7395908349\r\n 20\r\n183029.8856650012\r\n 30\r\n0.0\r\n 11\r\n528976.162882365\r\n 21\r\n183032.3786083496\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527025.2812095881\r\n 20\r\n183263.6346011901\r\n 30\r\n0.0\r\n 11\r\n526897.1265927663\r\n 21\r\n182483.0277155677\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526964.2083557769\r\n 20\r\n183286.4261005596\r\n 30\r\n0.0\r\n 11\r\n526885.0249361946\r\n 21\r\n182798.3537771728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526777.074562552\r\n 20\r\n183143.2710983985\r\n 30\r\n0.0\r\n 11\r\n526678.3375863469\r\n 21\r\n182989.0315936426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526376.0911853841\r\n 20\r\n183362.1726671961\r\n 30\r\n0.0\r\n 11\r\n527059.5232641422\r\n 21\r\n182915.9150971422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526781.3386109241\r\n 20\r\n183014.4930036137\r\n 30\r\n0.0\r\n 11\r\n526623.5488075315\r\n 21\r\n182604.6318740274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526841.6122685247\r\n 20\r\n182979.8994604785\r\n 30\r\n0.0\r\n 11\r\n526669.981091038\r\n 21\r\n183070.1893105516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526806.8403955176\r\n 20\r\n182916.1553230647\r\n 30\r\n0.0\r\n 11\r\n526750.1753566118\r\n 21\r\n182946.5645168706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526849.2454166972\r\n 20\r\n182950.2005754067\r\n 30\r\n0.0\r\n 11\r\n526791.2527324742\r\n 21\r\n182913.1316652581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526803.0593180441\r\n 20\r\n182929.825026326\r\n 30\r\n0.0\r\n 11\r\n526681.7233194259\r\n 21\r\n182545.2802653542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526950.8006147146\r\n 20\r\n182784.8000475242\r\n 30\r\n0.0\r\n 11\r\n526555.0614632221\r\n 21\r\n182881.2480553835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526561.2464987034\r\n 20\r\n182893.0396766159\r\n 30\r\n0.0\r\n 11\r\n526491.097430139\r\n 21\r\n182664.75283978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526429.450063369\r\n 20\r\n183030.6460005865\r\n 30\r\n0.0\r\n 11\r\n526567.1802176478\r\n 21\r\n182875.9292060764\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526514.0693656086\r\n 20\r\n183051.6592852067\r\n 30\r\n0.0\r\n 11\r\n526465.7200294525\r\n 21\r\n182981.2770327941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526945.2614984458\r\n 20\r\n182673.699691965\r\n 30\r\n0.0\r\n 11\r\n526858.9467190832\r\n 21\r\n182699.6197587514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526938.4648895453\r\n 20\r\n182521.0740243328\r\n 30\r\n0.0\r\n 11\r\n526489.5500694043\r\n 21\r\n182667.4421689821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526699.5692000325\r\n 20\r\n183028.2482065977\r\n 30\r\n0.0\r\n 11\r\n526555.0552630549\r\n 21\r\n182629.5616776445\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526184.705617505\r\n 20\r\n182931.6259519551\r\n 30\r\n0.0\r\n 11\r\n526562.0248081487\r\n 21\r\n182629.2811126734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525975.5045021903\r\n 20\r\n183074.5165478142\r\n 30\r\n0.0\r\n 11\r\n526410.9589320396\r\n 21\r\n182756.1661656958\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526223.8142669609\r\n 20\r\n183015.5497707789\r\n 30\r\n0.0\r\n 11\r\n526203.4151242994\r\n 21\r\n182899.9063416185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526272.4723055687\r\n 20\r\n182976.9828819357\r\n 30\r\n0.0\r\n 11\r\n526177.6872562321\r\n 21\r\n182921.4725648552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526428.9131914558\r\n 20\r\n182869.1425922379\r\n 30\r\n0.0\r\n 11\r\n526252.9762846761\r\n 21\r\n182968.4070682298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526478.2483462436\r\n 20\r\n183113.9378498654\r\n 30\r\n0.0\r\n 11\r\n526330.704046688\r\n 21\r\n182813.0714143925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526580.5570010577\r\n 20\r\n183271.4185264061\r\n 30\r\n0.0\r\n 11\r\n526399.896323525\r\n 21\r\n182965.1540424672\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526402.8812421781\r\n 20\r\n182952.4214062233\r\n 30\r\n0.0\r\n 11\r\n526382.0610931183\r\n 21\r\n182964.9224447871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526450.9167544769\r\n 20\r\n182768.4488967919\r\n 30\r\n0.0\r\n 11\r\n526423.9962748326\r\n 21\r\n182731.9876166585\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526465.4552706402\r\n 20\r\n182773.9222169457\r\n 30\r\n0.0\r\n 11\r\n526443.6762423573\r\n 21\r\n182763.6840354824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526522.8360133179\r\n 20\r\n182745.3578990408\r\n 30\r\n0.0\r\n 11\r\n526457.6197868785\r\n 21\r\n182775.5026528175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526466.1648483548\r\n 20\r\n182995.8169228339\r\n 30\r\n0.0\r\n 11\r\n526078.9306227268\r\n 21\r\n183192.5577152809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526110.1635046939\r\n 20\r\n183198.3175948517\r\n 30\r\n0.0\r\n 11\r\n526052.1249617262\r\n 21\r\n183005.5850345606\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526395.7367372402\r\n 20\r\n183359.4557518874\r\n 30\r\n0.0\r\n 11\r\n526084.9426491088\r\n 21\r\n183172.395334799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526148.6610269019\r\n 20\r\n183296.7644774479\r\n 30\r\n0.0\r\n 11\r\n526443.1373601789\r\n 21\r\n183032.2846458226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526306.4476798011\r\n 20\r\n183087.2896267643\r\n 30\r\n0.0\r\n 11\r\n526252.7504783172\r\n 21\r\n183010.9453358622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526269.4450135935\r\n 20\r\n183041.8779819008\r\n 30\r\n0.0\r\n 11\r\n526267.0977212187\r\n 21\r\n182958.5288819632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526281.7012315749\r\n 20\r\n183037.1815862247\r\n 30\r\n0.0\r\n 11\r\n526211.4541276583\r\n 21\r\n182998.5876487597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526077.0975650373\r\n 20\r\n183098.088044319\r\n 30\r\n0.0\r\n 11\r\n526223.9064536299\r\n 21\r\n182996.5121949012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526664.7213589688\r\n 20\r\n182917.3463248682\r\n 30\r\n0.0\r\n 11\r\n526618.8342611189\r\n 21\r\n182927.568075641\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526644.0715489711\r\n 20\r\n182986.1804455111\r\n 30\r\n0.0\r\n 11\r\n526619.3925915336\r\n 21\r\n182925.7507615153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526693.2233190768\r\n 20\r\n182992.4787819791\r\n 30\r\n0.0\r\n 11\r\n526601.7192616864\r\n 21\r\n183042.5781883141\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526691.1577809463\r\n 20\r\n183164.2890439809\r\n 30\r\n0.0\r\n 11\r\n526519.0682599293\r\n 21\r\n182920.2727984166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526543.5586095794\r\n 20\r\n182824.8265753773\r\n 30\r\n0.0\r\n 11\r\n526479.1159747663\r\n 21\r\n182849.0486845077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526491.2292186234\r\n 20\r\n182878.4972369685\r\n 30\r\n0.0\r\n 11\r\n526469.913795082\r\n 21\r\n182822.2991526963\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526495.6458991038\r\n 20\r\n182871.1109460985\r\n 30\r\n0.0\r\n 11\r\n526429.2343233493\r\n 21\r\n182897.1489668176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526432.5182091687\r\n 20\r\n182898.891215551\r\n 30\r\n0.0\r\n 11\r\n526411.2962424721\r\n 21\r\n182846.9179731636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526478.7059982679\r\n 20\r\n182824.3817010889\r\n 30\r\n0.0\r\n 11\r\n526406.244637348\r\n 21\r\n182851.8669511721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526831.8309248414\r\n 20\r\n182816.4182337956\r\n 30\r\n0.0\r\n 11\r\n526766.5959213014\r\n 21\r\n182559.9847257041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527000.2530682652\r\n 20\r\n182306.9787163504\r\n 30\r\n0.0\r\n 11\r\n526860.1632714045\r\n 21\r\n182354.2285155059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526958.5995454632\r\n 20\r\n182466.2489230176\r\n 30\r\n0.0\r\n 11\r\n526879.4161258808\r\n 21\r\n181978.1765996306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526892.7851017648\r\n 20\r\n182352.9689788648\r\n 30\r\n0.0\r\n 11\r\n526813.0293333185\r\n 21\r\n182333.9922653943\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526867.2513936017\r\n 20\r\n182428.4894751634\r\n 30\r\n0.0\r\n 11\r\n526886.42456548\r\n 21\r\n182342.7583958494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1B9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526877.6704091146\r\n 20\r\n182414.4235645573\r\n 30\r\n0.0\r\n 11\r\n526695.6134468584\r\n 21\r\n182494.4830129586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526952.0471927737\r\n 20\r\n182605.1847142627\r\n 30\r\n0.0\r\n 11\r\n526672.7287760333\r\n 21\r\n182168.8544161005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526668.6311203727\r\n 20\r\n182445.7554883518\r\n 30\r\n0.0\r\n 11\r\n526817.1655042102\r\n 21\r\n182332.718434346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526702.3646228387\r\n 20\r\n182496.1108717801\r\n 30\r\n0.0\r\n 11\r\n526668.7997668507\r\n 21\r\n182444.9247298686\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526436.1625892373\r\n 20\r\n182628.7330061977\r\n 30\r\n0.0\r\n 11\r\n526681.7623917887\r\n 21\r\n182461.3212290171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526494.6810839999\r\n 20\r\n182593.2752383091\r\n 30\r\n0.0\r\n 11\r\n526437.4933880692\r\n 21\r\n182495.666997106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526370.4823750703\r\n 20\r\n182541.9954896542\r\n 30\r\n0.0\r\n 11\r\n527002.2713055748\r\n 21\r\n182127.6111901839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526775.7298006102\r\n 20\r\n182194.3158260718\r\n 30\r\n0.0\r\n 11\r\n526521.3716858642\r\n 21\r\n181598.3809927647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526836.0034582111\r\n 20\r\n182159.7222829365\r\n 30\r\n0.0\r\n 11\r\n526664.3722807242\r\n 21\r\n182250.0121330097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526801.2315852038\r\n 20\r\n182095.9781455227\r\n 30\r\n0.0\r\n 11\r\n526744.5665462982\r\n 21\r\n182126.3873393285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526843.6366063836\r\n 20\r\n182130.0233978648\r\n 30\r\n0.0\r\n 11\r\n526785.6439221603\r\n 21\r\n182092.9544877161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526797.4505077304\r\n 20\r\n182109.6478487839\r\n 30\r\n0.0\r\n 11\r\n526755.1504495946\r\n 21\r\n181975.5881638581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526945.1918044008\r\n 20\r\n181964.6228699824\r\n 30\r\n0.0\r\n 11\r\n526549.4526529084\r\n 21\r\n182061.0708778416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526555.6376883897\r\n 20\r\n182072.8624990739\r\n 30\r\n0.0\r\n 11\r\n526485.4886198253\r\n 21\r\n181844.5756622381\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526423.8412530552\r\n 20\r\n182210.4688230445\r\n 30\r\n0.0\r\n 11\r\n526561.5714073341\r\n 21\r\n182055.7520285342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526508.4605552949\r\n 20\r\n182231.4821076646\r\n 30\r\n0.0\r\n 11\r\n526460.1112191387\r\n 21\r\n182161.0998552523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526933.2335520479\r\n 20\r\n181839.9368571187\r\n 30\r\n0.0\r\n 11\r\n526846.9187726854\r\n 21\r\n181865.856923905\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526693.9603897188\r\n 20\r\n182208.0710290557\r\n 30\r\n0.0\r\n 11\r\n526549.4464527412\r\n 21\r\n181809.3845001026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526218.2054566471\r\n 20\r\n182195.3725932368\r\n 30\r\n0.0\r\n 11\r\n526197.8063139856\r\n 21\r\n182079.7291640766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526266.863495255\r\n 20\r\n182156.8057043941\r\n 30\r\n0.0\r\n 11\r\n526172.0784459183\r\n 21\r\n182101.2953873133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526423.3043811421\r\n 20\r\n182048.9654146958\r\n 30\r\n0.0\r\n 11\r\n526247.3674743625\r\n 21\r\n182148.2298906876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526472.6395359299\r\n 20\r\n182293.7606723235\r\n 30\r\n0.0\r\n 11\r\n526275.9831066587\r\n 21\r\n181913.3195666171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526558.7276475325\r\n 20\r\n182257.0804179532\r\n 30\r\n0.0\r\n 11\r\n526444.3361225294\r\n 21\r\n182297.8485983638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526496.8912697186\r\n 20\r\n182385.3812040725\r\n 30\r\n0.0\r\n 11\r\n526582.9000737242\r\n 21\r\n182300.5860591656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526580.0376232157\r\n 20\r\n182306.6836811287\r\n 30\r\n0.0\r\n 11\r\n526556.93538664\r\n 21\r\n182255.8515302934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526680.130013927\r\n 20\r\n182629.5505262505\r\n 30\r\n0.0\r\n 11\r\n526394.2875132112\r\n 21\r\n182144.9768649251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526397.2724318643\r\n 20\r\n182132.2442286813\r\n 30\r\n0.0\r\n 11\r\n526376.4522828047\r\n 21\r\n182144.7452672451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526445.3079441631\r\n 20\r\n181948.2717192499\r\n 30\r\n0.0\r\n 11\r\n526401.4980246618\r\n 21\r\n181884.4450689966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526459.8464603266\r\n 20\r\n181953.7450394038\r\n 30\r\n0.0\r\n 11\r\n526438.0674320437\r\n 21\r\n181943.5068579403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526517.2272030042\r\n 20\r\n181925.1807214987\r\n 30\r\n0.0\r\n 11\r\n526452.0109765648\r\n 21\r\n181955.3254752755\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526460.556038041\r\n 20\r\n182175.639745292\r\n 30\r\n0.0\r\n 11\r\n526141.0942032139\r\n 21\r\n182330.5525736593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526390.1279269266\r\n 20\r\n182539.2785743455\r\n 30\r\n0.0\r\n 11\r\n526213.0589553081\r\n 21\r\n182437.9216424716\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526206.4714515425\r\n 20\r\n182468.3181180565\r\n 30\r\n0.0\r\n 11\r\n526437.5285498651\r\n 21\r\n182212.1074682804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526502.6138736954\r\n 20\r\n182322.9307229501\r\n 30\r\n0.0\r\n 11\r\n526471.8589425878\r\n 21\r\n182340.7107100859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526300.8388694875\r\n 20\r\n182267.1124492223\r\n 30\r\n0.0\r\n 11\r\n526247.1416680035\r\n 21\r\n182190.7681583202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526263.8362032798\r\n 20\r\n182221.700804359\r\n 30\r\n0.0\r\n 11\r\n526261.488910905\r\n 21\r\n182138.3517044211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526276.0924212611\r\n 20\r\n182217.0044086828\r\n 30\r\n0.0\r\n 11\r\n526205.8453173446\r\n 21\r\n182178.4104712177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526116.2847454244\r\n 20\r\n182250.2635450903\r\n 30\r\n0.0\r\n 11\r\n526218.2976433162\r\n 21\r\n182176.3350173591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526515.0077327294\r\n 20\r\n182692.4233179073\r\n 30\r\n0.0\r\n 11\r\n526333.9111826571\r\n 21\r\n182492.7907652685\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526659.1125486551\r\n 20\r\n182097.1691473261\r\n 30\r\n0.0\r\n 11\r\n526613.2254508053\r\n 21\r\n182107.3908980991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526638.4627386574\r\n 20\r\n182166.0032679689\r\n 30\r\n0.0\r\n 11\r\n526613.7837812198\r\n 21\r\n182105.5735839731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526687.6145087632\r\n 20\r\n182172.301604437\r\n 30\r\n0.0\r\n 11\r\n526596.1104513726\r\n 21\r\n182222.401010772\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526685.5489706326\r\n 20\r\n182344.1118664388\r\n 30\r\n0.0\r\n 11\r\n526513.4594496156\r\n 21\r\n182100.0956208746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526537.9497992656\r\n 20\r\n182004.6493978354\r\n 30\r\n0.0\r\n 11\r\n526473.5071644527\r\n 21\r\n182028.8715069656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526485.6204083097\r\n 20\r\n182058.3200594264\r\n 30\r\n0.0\r\n 11\r\n526464.3049847683\r\n 21\r\n182002.1219751545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BCC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526490.0370887901\r\n 20\r\n182050.9337685565\r\n 30\r\n0.0\r\n 11\r\n526423.6255130356\r\n 21\r\n182076.9717892756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526426.9093988549\r\n 20\r\n182078.7140380091\r\n 30\r\n0.0\r\n 11\r\n526405.6874321583\r\n 21\r\n182026.7407956217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526473.0971879541\r\n 20\r\n182004.204523547\r\n 30\r\n0.0\r\n 11\r\n526400.6358270344\r\n 21\r\n182031.68977363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526554.9709952949\r\n 20\r\n182553.7399813713\r\n 30\r\n0.0\r\n 11\r\n526497.225498478\r\n 21\r\n182456.9410756913\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526826.2221145276\r\n 20\r\n181996.2410562537\r\n 30\r\n0.0\r\n 11\r\n526760.9871109879\r\n 21\r\n181739.8075481622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527412.0818102422\r\n 20\r\n181564.1583751753\r\n 30\r\n0.0\r\n 11\r\n525538.5358990799\r\n 21\r\n182148.4234918985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526134.7576759403\r\n 20\r\n182192.179583049\r\n 30\r\n0.0\r\n 11\r\n525907.4484610363\r\n 21\r\n182192.3395395591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526218.5082342736\r\n 20\r\n182359.2115746763\r\n 30\r\n0.0\r\n 11\r\n526062.7307945771\r\n 21\r\n182426.7858813327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526382.9052427298\r\n 20\r\n182784.6622153052\r\n 30\r\n0.0\r\n 11\r\n526060.0427866276\r\n 21\r\n182062.4070552026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526104.2898207399\r\n 20\r\n182329.1624117874\r\n 30\r\n0.0\r\n 11\r\n525674.5130014083\r\n 21\r\n182419.581730331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526079.7494059731\r\n 20\r\n182264.1439907801\r\n 30\r\n0.0\r\n 11\r\n526141.5177681991\r\n 21\r\n182447.9759454006\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526011.276471197\r\n 20\r\n182288.3070909581\r\n 30\r\n0.0\r\n 11\r\n526032.2614591864\r\n 21\r\n182349.0958726634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526051.6475756412\r\n 20\r\n182251.8730553012\r\n 30\r\n0.0\r\n 11\r\n526005.8060671727\r\n 21\r\n182303.2132113621\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526024.1684002717\r\n 20\r\n182294.2194085108\r\n 30\r\n0.0\r\n 11\r\n525625.1965641057\r\n 21\r\n182352.687961578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525905.1414408565\r\n 20\r\n182121.4676071119\r\n 30\r\n0.0\r\n 11\r\n525936.6700146762\r\n 21\r\n182531.2989112529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525949.296971645\r\n 20\r\n182527.0731624555\r\n 30\r\n0.0\r\n 11\r\n525712.7456148091\r\n 21\r\n182559.9247571213\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526064.1280438116\r\n 20\r\n182679.1245538622\r\n 30\r\n0.0\r\n 11\r\n525933.351531187\r\n 21\r\n182518.4871184777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526098.3649140155\r\n 20\r\n182598.9383882181\r\n 30\r\n0.0\r\n 11\r\n526021.1738839632\r\n 21\r\n182635.4468069849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525602.5606954889\r\n 20\r\n181842.0189004617\r\n 30\r\n0.0\r\n 11\r\n525715.1538129658\r\n 21\r\n182561.8811309198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526104.8310295083\r\n 20\r\n182412.0789316116\r\n 30\r\n0.0\r\n 11\r\n525688.2026632234\r\n 21\r\n182491.1740057715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525927.3506884325\r\n 20\r\n182904.9491957143\r\n 30\r\n0.0\r\n 11\r\n525689.0369715465\r\n 21\r\n182484.2488916828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526017.9443528103\r\n 20\r\n183100.6657351099\r\n 30\r\n0.0\r\n 11\r\n525790.2114538591\r\n 21\r\n182653.6137042441\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526016.436623323\r\n 20\r\n182879.722423568\r\n 30\r\n0.0\r\n 11\r\n525899.0200947565\r\n 21\r\n182881.4214081781\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525986.1216033472\r\n 20\r\n182825.5374699364\r\n 30\r\n0.0\r\n 11\r\n525916.2081338395\r\n 21\r\n182910.2588229799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525904.605267724\r\n 20\r\n182653.9030739494\r\n 30\r\n0.0\r\n 11\r\n525974.5468944026\r\n 21\r\n182843.4166624298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526121.5860971713\r\n 20\r\n182654.811784923\r\n 30\r\n0.0\r\n 11\r\n525833.5921459401\r\n 21\r\n182741.9152869398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526193.3364792057\r\n 20\r\n182711.1169602223\r\n 30\r\n0.0\r\n 11\r\n526128.4794766109\r\n 21\r\n182608.447418775\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526223.8499447324\r\n 20\r\n182571.9991764507\r\n 30\r\n0.0\r\n 11\r\n526239.204328213\r\n 21\r\n182691.798900466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526240.7146177363\r\n 20\r\n182685.2343256837\r\n 30\r\n0.0\r\n 11\r\n526191.167827044\r\n 21\r\n182710.97799336\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526518.7129862614\r\n 20\r\n182492.9366568091\r\n 30\r\n0.0\r\n 11\r\n526518.7014051999\r\n 21\r\n182492.9411862413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526382.4046717591\r\n 20\r\n182546.2477693468\r\n 30\r\n0.0\r\n 11\r\n525994.7616732592\r\n 21\r\n182697.8575929502\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525982.6678762281\r\n 20\r\n182692.8806623247\r\n 30\r\n0.0\r\n 11\r\n525991.6892370746\r\n 21\r\n182715.4277158023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525808.7082592372\r\n 20\r\n182616.1255561446\r\n 30\r\n0.0\r\n 11\r\n525768.4210246726\r\n 21\r\n182636.8879236488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525816.4297002768\r\n 20\r\n182602.6457551815\r\n 30\r\n0.0\r\n 11\r\n525802.8498693046\r\n 21\r\n182622.5136847008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525797.3801032143\r\n 20\r\n182541.4445890212\r\n 30\r\n0.0\r\n 11\r\n525816.7405599603\r\n 21\r\n182610.6329918491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526035.598679878\r\n 20\r\n182637.3260432762\r\n 30\r\n0.0\r\n 11\r\n526147.3595702719\r\n 21\r\n182970.3413998211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526227.8513561675\r\n 20\r\n182910.9041209083\r\n 30\r\n0.0\r\n 11\r\n526067.9281441547\r\n 21\r\n182665.8736486268\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526187.7113128795\r\n 20\r\n182619.2916172854\r\n 30\r\n0.0\r\n 11\r\n526200.3599981748\r\n 21\r\n182652.4880702626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526100.4344341845\r\n 20\r\n182809.5850182491\r\n 30\r\n0.0\r\n 11\r\n526016.5049331899\r\n 21\r\n182850.4222446896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526049.7037537386\r\n 20\r\n182838.873460631\r\n 30\r\n0.0\r\n 11\r\n525967.0467297591\r\n 21\r\n182827.900829733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526047.0216787222\r\n 20\r\n182826.0252123005\r\n 30\r\n0.0\r\n 11\r\n525997.7207043991\r\n 21\r\n182889.2198445766\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526074.5251576573\r\n 20\r\n183037.7226748375\r\n 30\r\n0.0\r\n 11\r\n525997.6573086355\r\n 21\r\n182876.5959025693\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525989.7915622426\r\n 20\r\n182428.7977942877\r\n 30\r\n0.0\r\n 11\r\n525992.5659074848\r\n 21\r\n182475.7276669322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526054.4524535999\r\n 20\r\n182460.1589158632\r\n 30\r\n0.0\r\n 11\r\n525990.8608686098\r\n 21\r\n182474.886711572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526068.5073888174\r\n 20\r\n182412.6402422408\r\n 30\r\n0.0\r\n 11\r\n526103.3756467485\r\n 21\r\n182510.9618961269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526237.7902046644\r\n 20\r\n182442.0742503921\r\n 30\r\n0.0\r\n 11\r\n525969.4564207093\r\n 21\r\n182573.0540646057\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525879.1362642368\r\n 20\r\n182533.658277353\r\n 30\r\n0.0\r\n 11\r\n525892.7731972832\r\n 21\r\n182601.1386286375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525923.7764311459\r\n 20\r\n182593.8758875\r\n 30\r\n0.0\r\n 11\r\n525864.898618392\r\n 21\r\n182605.9579039674\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525917.1888719714\r\n 20\r\n182588.3379796451\r\n 30\r\n0.0\r\n 11\r\n525932.304539506\r\n 21\r\n182658.0516261728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525934.5481091393\r\n 20\r\n182655.0875526203\r\n 30\r\n0.0\r\n 11\r\n525879.8559882184\r\n 21\r\n182667.7509527922\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525868.3564271535\r\n 20\r\n182597.610245419\r\n 30\r\n0.0\r\n 11\r\n525883.9361791152\r\n 21\r\n182673.5270362318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1BFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525916.8000977243\r\n 20\r\n182247.7333508397\r\n 30\r\n0.0\r\n 11\r\n525653.2457118757\r\n 21\r\n182271.245804112\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527244.1243499752\r\n 20\r\n183861.7178842388\r\n 30\r\n0.0\r\n 11\r\n526887.8587946553\r\n 21\r\n181585.0043007456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527212.5796583467\r\n 20\r\n183246.1310702512\r\n 30\r\n0.0\r\n 11\r\n527133.3962387643\r\n 21\r\n182758.0587468642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527346.8091104488\r\n 20\r\n183038.3259333679\r\n 30\r\n0.0\r\n 11\r\n527389.7655543316\r\n 21\r\n182873.6116105945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527794.4787894083\r\n 20\r\n183132.0576301447\r\n 30\r\n0.0\r\n 11\r\n527011.5876332116\r\n 21\r\n182924.7692635655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527300.0973198231\r\n 20\r\n182930.3311150156\r\n 30\r\n0.0\r\n 11\r\n527320.2151109535\r\n 21\r\n182491.6067800618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527231.9783573573\r\n 20\r\n182916.5676132878\r\n 30\r\n0.0\r\n 11\r\n527423.3516630881\r\n 21\r\n182947.964682665\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527244.8138405172\r\n 20\r\n182845.0997983003\r\n 30\r\n0.0\r\n 11\r\n527308.1863830451\r\n 21\r\n182856.0344476155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527215.3473432128\r\n 20\r\n182890.805274612\r\n 30\r\n0.0\r\n 11\r\n527258.6460484188\r\n 21\r\n182837.3031470795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527252.7226938883\r\n 20\r\n182856.8729615311\r\n 30\r\n0.0\r\n 11\r\n527246.2602959411\r\n 21\r\n182453.6914451339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527066.7092573773\r\n 20\r\n182765.9953699274\r\n 30\r\n0.0\r\n 11\r\n527472.6425793829\r\n 21\r\n182732.3823913409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527470.5027378193\r\n 20\r\n182745.5246161631\r\n 30\r\n0.0\r\n 11\r\n527464.8802400704\r\n 21\r\n182506.7691780846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527639.0437239939\r\n 20\r\n182834.4050793871\r\n 30\r\n0.0\r\n 11\r\n527459.4638476878\r\n 21\r\n182731.1677318473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527565.4080953913\r\n 20\r\n182881.0931789668\r\n 30\r\n0.0\r\n 11\r\n527589.0259726629\r\n 21\r\n182799.0351773181\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527035.5118023315\r\n 20\r\n182581.3668340386\r\n 30\r\n0.0\r\n 11\r\n527125.5940504404\r\n 21\r\n182578.6687654175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526995.0345653063\r\n 20\r\n182511.8963263632\r\n 30\r\n0.0\r\n 11\r\n527467.1984727799\r\n 21\r\n182508.8313647648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527382.0213844116\r\n 20\r\n182917.5291695387\r\n 30\r\n0.0\r\n 11\r\n527393.0771309889\r\n 21\r\n182493.6034722552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527723.7383600434\r\n 20\r\n182594.346349493\r\n 30\r\n0.0\r\n 11\r\n527386.376364243\r\n 21\r\n182495.5407385079\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528083.5754440563\r\n 20\r\n182732.5093126143\r\n 30\r\n0.0\r\n 11\r\n527854.3980075514\r\n 21\r\n182659.1965084425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527528.3942624024\r\n 20\r\n183313.0177615849\r\n 30\r\n0.0\r\n 11\r\n527646.3761425884\r\n 21\r\n182762.9288193099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527639.5188679864\r\n 20\r\n182751.7929515791\r\n 30\r\n0.0\r\n 11\r\n527663.2233537091\r\n 21\r\n182757.070444228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527535.7837706053\r\n 20\r\n182592.4432598958\r\n 30\r\n0.0\r\n 11\r\n527553.7426780206\r\n 21\r\n182532.6692124688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527523.7213644617\r\n 20\r\n182602.2322355196\r\n 30\r\n0.0\r\n 11\r\n527541.1464808263\r\n 21\r\n182585.6336888271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527460.2530903324\r\n 20\r\n182593.2741069957\r\n 30\r\n0.0\r\n 11\r\n527531.6546121294\r\n 21\r\n182601.2543987397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527380.0198904067\r\n 20\r\n182801.2983929789\r\n 30\r\n0.0\r\n 11\r\n527426.7849958205\r\n 21\r\n182796.4885225456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527421.3726306412\r\n 20\r\n182860.0734020617\r\n 30\r\n0.0\r\n 11\r\n527425.6807543277\r\n 21\r\n182794.940939201\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527376.733173879\r\n 20\r\n182881.5881515784\r\n 30\r\n0.0\r\n 11\r\n527479.3828969314\r\n 21\r\n182900.1886190805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527433.0110471161\r\n 20\r\n183043.9329499576\r\n 30\r\n0.0\r\n 11\r\n527519.127408857\r\n 21\r\n182758.0261406934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527465.7176284195\r\n 20\r\n182675.2182058559\r\n 30\r\n0.0\r\n 11\r\n527534.5127772507\r\n 21\r\n182677.824208477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527532.3310817872\r\n 20\r\n182709.5919298885\r\n 30\r\n0.0\r\n 11\r\n527534.7860246275\r\n 21\r\n182649.5374112223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527525.8057444187\r\n 20\r\n182703.9808398422\r\n 30\r\n0.0\r\n 11\r\n527597.0429492604\r\n 21\r\n182707.687126868\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527594.4783161435\r\n 20\r\n182710.3782221283\r\n 30\r\n0.0\r\n 11\r\n527598.1802909119\r\n 21\r\n182654.3613927147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527527.1031916927\r\n 20\r\n182654.2928210643\r\n 30\r\n0.0\r\n 11\r\n527604.5374235002\r\n 21\r\n182657.4594506405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526988.8188472393\r\n 20\r\n182388.6928958193\r\n 30\r\n0.0\r\n 11\r\n527217.0229275381\r\n 21\r\n182409.8910709357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527052.3626297287\r\n 20\r\n182411.7094164673\r\n 30\r\n0.0\r\n 11\r\n527135.7854414482\r\n 21\r\n182093.7294633607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527227.2159459994\r\n 20\r\n182355.1323276016\r\n 30\r\n0.0\r\n 11\r\n527050.5631702309\r\n 21\r\n182294.8526828323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527211.1326827404\r\n 20\r\n182413.5698367184\r\n 30\r\n0.0\r\n 11\r\n527226.7933031375\r\n 21\r\n182354.3974981635\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527505.6096122967\r\n 20\r\n182455.2290636664\r\n 30\r\n0.0\r\n 11\r\n527219.6793507476\r\n 21\r\n182374.0511622241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527437.9658937181\r\n 20\r\n182327.9040809348\r\n 30\r\n0.0\r\n 11\r\n526810.1065464444\r\n 21\r\n182158.7874360434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527046.1172069397\r\n 20\r\n182150.4489677819\r\n 30\r\n0.0\r\n 11\r\n527058.2752633564\r\n 21\r\n181885.3087652044\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526977.9982444741\r\n 20\r\n182136.6854660542\r\n 30\r\n0.0\r\n 11\r\n527169.3715502046\r\n 21\r\n182168.0825354316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526990.8337276338\r\n 20\r\n182065.2176510666\r\n 30\r\n0.0\r\n 11\r\n527054.2062701618\r\n 21\r\n182076.152300382\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526961.3672303293\r\n 20\r\n182110.9231273783\r\n 30\r\n0.0\r\n 11\r\n527004.6659355352\r\n 21\r\n182057.4209998459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526998.7425810051\r\n 20\r\n182076.9908142976\r\n 30\r\n0.0\r\n 11\r\n526992.2801830577\r\n 21\r\n181673.8092979005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526922.3970494072\r\n 20\r\n181977.1444343519\r\n 30\r\n0.0\r\n 11\r\n527218.6624664996\r\n 21\r\n181952.5002441074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527216.5226249359\r\n 20\r\n181965.6424689295\r\n 30\r\n0.0\r\n 11\r\n527210.900127187\r\n 21\r\n181726.8870308509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527510.2724370283\r\n 20\r\n182121.4202003876\r\n 30\r\n0.0\r\n 11\r\n527205.4837348044\r\n 21\r\n181951.2855846136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527241.1336385168\r\n 20\r\n182299.7189575159\r\n 30\r\n0.0\r\n 11\r\n527335.0458597796\r\n 21\r\n182019.1530300846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527128.0412715281\r\n 20\r\n182137.647022305\r\n 30\r\n0.0\r\n 11\r\n527139.0970181055\r\n 21\r\n181713.7213250218\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527644.5683360037\r\n 20\r\n181893.7221573058\r\n 30\r\n0.0\r\n 11\r\n527280.5326643672\r\n 21\r\n181897.9420612434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527274.414149519\r\n 20\r\n182533.1356143514\r\n 30\r\n0.0\r\n 11\r\n527336.2037937141\r\n 21\r\n182220.4267102733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527325.0335880328\r\n 20\r\n182244.5270912905\r\n 30\r\n0.0\r\n 11\r\n527691.2728910904\r\n 21\r\n182079.0561384222\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527598.9071578056\r\n 20\r\n182144.6278645905\r\n 30\r\n0.0\r\n 11\r\n527531.865750263\r\n 21\r\n181991.8653653745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527450.9444338949\r\n 20\r\n182540.5796976902\r\n 30\r\n0.0\r\n 11\r\n527511.1304576061\r\n 21\r\n182404.0055193513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527126.0397775233\r\n 20\r\n182021.4162457452\r\n 30\r\n0.0\r\n 11\r\n527172.8048829372\r\n 21\r\n182016.6063753122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527167.3925177578\r\n 20\r\n182080.1912548282\r\n 30\r\n0.0\r\n 11\r\n527171.7006414443\r\n 21\r\n182015.0587919673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527122.7530609956\r\n 20\r\n182101.7060043448\r\n 30\r\n0.0\r\n 11\r\n527225.4027840479\r\n 21\r\n182120.3064718471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527179.0309342328\r\n 20\r\n182264.0508027241\r\n 30\r\n0.0\r\n 11\r\n527265.1472959734\r\n 21\r\n181978.1439934599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527211.737515536\r\n 20\r\n181895.3360586223\r\n 30\r\n0.0\r\n 11\r\n527280.5326643672\r\n 21\r\n181897.9420612434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527369.1858417139\r\n 20\r\n182421.6441571977\r\n 30\r\n0.0\r\n 11\r\n527393.3662381814\r\n 21\r\n182311.5538353243\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527802.8122269755\r\n 20\r\n182483.2968750188\r\n 30\r\n0.0\r\n 11\r\n527583.6445782589\r\n 21\r\n182670.5338326724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527384.3609804307\r\n 20\r\n182352.4964698768\r\n 30\r\n0.0\r\n 11\r\n527384.3733994724\r\n 21\r\n182352.4971056026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527689.197375687\r\n 20\r\n182379.5744221103\r\n 30\r\n0.0\r\n 11\r\n527946.2242562205\r\n 21\r\n182381.2580377173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527886.3906322288\r\n 20\r\n182282.7998223323\r\n 30\r\n0.0\r\n 11\r\n527887.5998568822\r\n 21\r\n182688.0099292871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527814.4709905778\r\n 20\r\n182564.0233585824\r\n 30\r\n0.0\r\n 11\r\n527866.6988063393\r\n 21\r\n182374.0463819468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527572.1680598442\r\n 20\r\n182088.2086467597\r\n 30\r\n0.0\r\n 11\r\n527906.2226569025\r\n 21\r\n182703.8343193632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527881.2945578066\r\n 20\r\n182520.6635047166\r\n 30\r\n0.0\r\n 11\r\n527993.0588859202\r\n 21\r\n182481.5747727534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527605.0161793467\r\n 20\r\n183011.740254553\r\n 30\r\n0.0\r\n 11\r\n527444.9266236437\r\n 21\r\n182966.5454992318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527070.7837827931\r\n 20\r\n182765.6579821643\r\n 30\r\n0.0\r\n 11\r\n526900.6797779977\r\n 21\r\n182664.0271809811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524802.1481827238\r\n 20\r\n181562.0366289828\r\n 30\r\n0.0\r\n 11\r\n524281.0200600184\r\n 21\r\n181032.262673504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524777.053703827\r\n 20\r\n181357.5184435995\r\n 30\r\n0.0\r\n 11\r\n524684.092533473\r\n 21\r\n181242.5579481624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524613.2310495336\r\n 20\r\n181373.7712167126\r\n 30\r\n0.0\r\n 11\r\n525043.4239603823\r\n 21\r\n181130.0117733084\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524696.6030450924\r\n 20\r\n181272.7118425649\r\n 30\r\n0.0\r\n 11\r\n524686.699858292\r\n 21\r\n181191.3298719215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524616.9155208406\r\n 20\r\n181274.995281273\r\n 30\r\n0.0\r\n 11\r\n524703.9691052645\r\n 21\r\n181263.2011336066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524634.8557972559\r\n 20\r\n181281.3092651929\r\n 30\r\n0.0\r\n 11\r\n524496.5522201735\r\n 21\r\n181138.3884012488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524531.9507471499\r\n 20\r\n181347.9530573438\r\n 30\r\n0.0\r\n 11\r\n524792.8333296382\r\n 21\r\n181002.4107307421\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524531.7445357123\r\n 20\r\n181094.7342720634\r\n 30\r\n0.0\r\n 11\r\n524689.3308695419\r\n 21\r\n181194.7661977195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524496.2389124904\r\n 20\r\n181143.8562075754\r\n 30\r\n0.0\r\n 11\r\n524532.5821545919\r\n 21\r\n181094.6039037225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524279.4212524852\r\n 20\r\n180940.2824972378\r\n 30\r\n0.0\r\n 11\r\n524521.708080378\r\n 21\r\n181112.4540953071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524332.9951300431\r\n 20\r\n180982.8443014322\r\n 30\r\n0.0\r\n 11\r\n524404.6669084259\r\n 21\r\n180895.3174055657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524337.9495387016\r\n 20\r\n180848.5670295033\r\n 30\r\n0.0\r\n 11\r\n524993.7823634268\r\n 21\r\n181334.4770326099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524804.7283952061\r\n 20\r\n181107.8431824673\r\n 30\r\n0.0\r\n 11\r\n525134.2787297177\r\n 21\r\n180817.5324099774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524858.1013985478\r\n 20\r\n181152.3510417901\r\n 30\r\n0.0\r\n 11\r\n524713.8250135487\r\n 21\r\n181022.7599817463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524905.8017889537\r\n 20\r\n181097.6055309042\r\n 30\r\n0.0\r\n 11\r\n524857.6059376409\r\n 21\r\n181055.0284758354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524888.6026609199\r\n 20\r\n181149.1948226532\r\n 30\r\n0.0\r\n 11\r\n524903.2237374958\r\n 21\r\n181081.9380040936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524891.6697933747\r\n 20\r\n181098.8072110047\r\n 30\r\n0.0\r\n 11\r\n525210.1397417366\r\n 21\r\n180851.473449173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525078.9775679318\r\n 20\r\n181186.9861926767\r\n 30\r\n0.0\r\n 11\r\n524851.094926959\r\n 21\r\n180849.375179546\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524842.1852879555\r\n 20\r\n180859.2703969775\r\n 30\r\n0.0\r\n 11\r\n525031.9003218494\r\n 21\r\n180714.2049717113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524667.3719613483\r\n 20\r\n180783.4673521569\r\n 30\r\n0.0\r\n 11\r\n524860.2914843905\r\n 21\r\n180858.8924111912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524677.0544180947\r\n 20\r\n180870.1174212477\r\n 30\r\n0.0\r\n 11\r\n524726.2643675579\r\n 21\r\n180800.3341808871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525423.1171166157\r\n 20\r\n181253.2601729294\r\n 30\r\n0.0\r\n 11\r\n525126.9555856972\r\n 21\r\n181071.2670086604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525322.0041594378\r\n 20\r\n181083.8277647864\r\n 30\r\n0.0\r\n 11\r\n525028.8409972251\r\n 21\r\n180713.6879130657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524763.431323889\r\n 20\r\n181035.9405116734\r\n 30\r\n0.0\r\n 11\r\n525087.1132389359\r\n 21\r\n180761.9601397101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524675.2302947439\r\n 20\r\n180519.5676355819\r\n 30\r\n0.0\r\n 11\r\n525089.7968232458\r\n 21\r\n180768.3984353517\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524468.5794109521\r\n 20\r\n180373.0130680584\r\n 30\r\n0.0\r\n 11\r\n524918.345269609\r\n 21\r\n180670.801917173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524610.1124200717\r\n 20\r\n180585.388272364\r\n 30\r\n0.0\r\n 11\r\n524711.4732601816\r\n 21\r\n180526.0965543799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524663.1774156499\r\n 20\r\n180617.6235927516\r\n 30\r\n0.0\r\n 11\r\n524682.3142602708\r\n 21\r\n180509.4599109629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524818.6363339504\r\n 20\r\n180726.8746960876\r\n 30\r\n0.0\r\n 11\r\n524664.4485827883\r\n 21\r\n180596.3627473906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524606.2118737778\r\n 20\r\n180858.155023537\r\n 30\r\n0.0\r\n 11\r\n524837.1099606695\r\n 21\r\n180615.3052638189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524670.5069143573\r\n 20\r\n180926.1458448061\r\n 30\r\n0.0\r\n 11\r\n524592.5487836899\r\n 21\r\n180833.0330347883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524528.7166376978\r\n 20\r\n180912.716519252\r\n 30\r\n0.0\r\n 11\r\n524638.1041728994\r\n 21\r\n180963.9229456919\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524631.3919774674\r\n 20\r\n180963.3563338301\r\n 30\r\n0.0\r\n 11\r\n524671.0368695406\r\n 21\r\n180924.0383554253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524363.3830957445\r\n 20\r\n181169.3483862856\r\n 30\r\n0.0\r\n 11\r\n524718.5236090007\r\n 21\r\n180733.0081700438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524731.5003627983\r\n 20\r\n180731.3853250246\r\n 30\r\n0.0\r\n 11\r\n524712.5467186364\r\n 21\r\n180716.2026393256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524920.7041831621\r\n 20\r\n180712.5383351309\r\n 30\r\n0.0\r\n 11\r\n524945.5466481336\r\n 21\r\n180674.6306959616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524920.6206858733\r\n 20\r\n180728.0727715202\r\n 30\r\n0.0\r\n 11\r\n524922.6578734268\r\n 21\r\n180704.0936910647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524967.3350531292\r\n 20\r\n180771.9616969969\r\n 30\r\n0.0\r\n 11\r\n524916.4174040469\r\n 21\r\n180721.2738741675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524712.7839783264\r\n 20\r\n180805.8009324259\r\n 30\r\n0.0\r\n 11\r\n524393.8048668058\r\n 21\r\n180510.9965713254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524399.2505034822\r\n 20\r\n180542.2857734541\r\n 30\r\n0.0\r\n 11\r\n524559.8302091394\r\n 21\r\n180420.9248637786\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524347.3201296349\r\n 20\r\n180866.0461988797\r\n 30\r\n0.0\r\n 11\r\n524414.8002064813\r\n 21\r\n180509.6321081265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524320.3012945151\r\n 20\r\n180612.5770980434\r\n 30\r\n0.0\r\n 11\r\n524670.5888307349\r\n 21\r\n180796.8717918515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524589.2673918903\r\n 20\r\n180896.3942352395\r\n 30\r\n0.0\r\n 11\r\n524561.9130884548\r\n 21\r\n180873.7284942734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524571.5360312731\r\n 20\r\n180687.7931066333\r\n 30\r\n0.0\r\n 11\r\n524624.479636645\r\n 21\r\n180610.9242907791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524601.2702712349\r\n 20\r\n180637.3224243558\r\n 30\r\n0.0\r\n 11\r\n524678.6162067298\r\n 21\r\n180606.1745752426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524609.9308592037\r\n 20\r\n180647.1847378564\r\n 30\r\n0.0\r\n 11\r\n524621.7261504309\r\n 21\r\n180567.9066278729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524481.7577776428\r\n 20\r\n180476.4688388858\r\n 30\r\n0.0\r\n 11\r\n524627.9970410905\r\n 21\r\n180578.8630808189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524142.4573055844\r\n 20\r\n180955.8171789115\r\n 30\r\n0.0\r\n 11\r\n524295.3029998789\r\n 21\r\n181044.3303311023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524235.4919657421\r\n 20\r\n181022.7282783792\r\n 30\r\n0.0\r\n 11\r\n524371.3906109211\r\n 21\r\n180797.1836498444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524855.327798902\r\n 20\r\n180964.7461489882\r\n 30\r\n0.0\r\n 11\r\n524829.8059644724\r\n 21\r\n180925.2651927524\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524783.6066146152\r\n 20\r\n180969.2873539066\r\n 30\r\n0.0\r\n 11\r\n524831.7040670197\r\n 21\r\n180925.1576278679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524794.7704363647\r\n 20\r\n181017.5671077454\r\n 30\r\n0.0\r\n 11\r\n524716.0105759171\r\n 21\r\n180949.1578436337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524632.9369456995\r\n 20\r\n181075.2988483744\r\n 30\r\n0.0\r\n 11\r\n524801.9989999381\r\n 21\r\n180829.1753973185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524900.0096459172\r\n 20\r\n180818.993452846\r\n 30\r\n0.0\r\n 11\r\n524854.9146575729\r\n 21\r\n180766.9741700884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524831.5059540864\r\n 20\r\n180788.5607520285\r\n 30\r\n0.0\r\n 11\r\n524876.8033334446\r\n 21\r\n180749.0548109575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524839.9663818906\r\n 20\r\n180790.1373054382\r\n 30\r\n0.0\r\n 11\r\n524792.4847093471\r\n 21\r\n180736.9022916819\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524791.9913793488\r\n 20\r\n180740.5868489466\r\n 30\r\n0.0\r\n 11\r\n524833.3593439895\r\n 21\r\n180702.6358108023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524877.9038921384\r\n 20\r\n180758.0230111801\r\n 30\r\n0.0\r\n 11\r\n524826.9640158099\r\n 21\r\n180699.6173881792\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524391.0079010363\r\n 20\r\n181025.6511740913\r\n 30\r\n0.0\r\n 11\r\n524461.7269989744\r\n 21\r\n180937.8822745294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525008.009930925\r\n 20\r\n181086.4024399666\r\n 30\r\n0.0\r\n 11\r\n525225.8263071603\r\n 21\r\n180936.1700333339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525597.873440998\r\n 20\r\n181037.2752526085\r\n 30\r\n0.0\r\n 11\r\n526110.5041094252\r\n 21\r\n180741.7467624144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525570.8176342342\r\n 20\r\n181166.5921935663\r\n 30\r\n0.0\r\n 11\r\n525451.2708726696\r\n 21\r\n180952.4554538928\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524652.5268457475\r\n 20\r\n181472.4103574203\r\n 30\r\n0.0\r\n 11\r\n525810.6022995788\r\n 21\r\n180839.9092790389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525463.7813842892\r\n 20\r\n180982.6093482953\r\n 30\r\n0.0\r\n 11\r\n525453.8781974885\r\n 21\r\n180901.2273776519\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525384.0938600372\r\n 20\r\n180984.8927870034\r\n 30\r\n0.0\r\n 11\r\n525471.1474444611\r\n 21\r\n180973.0986393367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525400.9027190662\r\n 20\r\n180989.7782740392\r\n 30\r\n0.0\r\n 11\r\n525262.5991419836\r\n 21\r\n180846.8574100953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525247.8458925852\r\n 20\r\n181125.7758109726\r\n 30\r\n0.0\r\n 11\r\n525560.0116688346\r\n 21\r\n180712.3082364724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525298.922874909\r\n 20\r\n180804.6317777938\r\n 30\r\n0.0\r\n 11\r\n525456.5092087385\r\n 21\r\n180904.6637034498\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525263.4172516872\r\n 20\r\n180853.7537133059\r\n 30\r\n0.0\r\n 11\r\n525299.7604937888\r\n 21\r\n180804.5014094529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525046.5995916819\r\n 20\r\n180650.180002968\r\n 30\r\n0.0\r\n 11\r\n525288.8864195746\r\n 21\r\n180822.3516010374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525100.1734692398\r\n 20\r\n180692.7418071628\r\n 30\r\n0.0\r\n 11\r\n525171.8452476225\r\n 21\r\n180605.214911296\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525105.1278778982\r\n 20\r\n180558.4645352336\r\n 30\r\n0.0\r\n 11\r\n525713.1359778347\r\n 21\r\n181007.015257858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525571.9067344027\r\n 20\r\n180817.7406881978\r\n 30\r\n0.0\r\n 11\r\n525901.4570689142\r\n 21\r\n180527.4299157075\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525625.2797377445\r\n 20\r\n180862.2485475206\r\n 30\r\n0.0\r\n 11\r\n525481.0033527453\r\n 21\r\n180732.6574874768\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525672.9801281504\r\n 20\r\n180807.5030366347\r\n 30\r\n0.0\r\n 11\r\n525624.7842768374\r\n 21\r\n180764.9259815658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525655.7810001165\r\n 20\r\n180859.0923283836\r\n 30\r\n0.0\r\n 11\r\n525670.4020766922\r\n 21\r\n180791.8355098239\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525658.8481325714\r\n 20\r\n180808.7047167351\r\n 30\r\n0.0\r\n 11\r\n525977.3180809332\r\n 21\r\n180561.3709549034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525846.1559071286\r\n 20\r\n180896.8836984073\r\n 30\r\n0.0\r\n 11\r\n525618.2732661557\r\n 21\r\n180559.2726852762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525609.3636271522\r\n 20\r\n180569.167902708\r\n 30\r\n0.0\r\n 11\r\n525799.0786610461\r\n 21\r\n180424.1024774419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525434.5503005449\r\n 20\r\n180493.3648578872\r\n 30\r\n0.0\r\n 11\r\n525627.4698235871\r\n 21\r\n180568.7899169216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525444.2327572913\r\n 20\r\n180580.0149269779\r\n 30\r\n0.0\r\n 11\r\n525493.4427067547\r\n 21\r\n180510.2316866175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525961.6524090845\r\n 20\r\n180835.2787713809\r\n 30\r\n0.0\r\n 11\r\n525907.3690808953\r\n 21\r\n180763.3384399991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526089.1824986345\r\n 20\r\n180793.7252705167\r\n 30\r\n0.0\r\n 11\r\n525796.0193364219\r\n 21\r\n180423.5854187961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525530.6096630857\r\n 20\r\n180745.8380174036\r\n 30\r\n0.0\r\n 11\r\n525854.2915781323\r\n 21\r\n180471.8576454403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525389.9409016577\r\n 20\r\n180200.0512254642\r\n 30\r\n0.0\r\n 11\r\n525856.9751624424\r\n 21\r\n180478.295941082\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525377.2907592685\r\n 20\r\n180295.2857780945\r\n 30\r\n0.0\r\n 11\r\n525478.6515993782\r\n 21\r\n180235.9940601101\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525430.3557548465\r\n 20\r\n180327.521098482\r\n 30\r\n0.0\r\n 11\r\n525449.4925994674\r\n 21\r\n180219.3574166934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525585.8146731471\r\n 20\r\n180436.772201818\r\n 30\r\n0.0\r\n 11\r\n525431.626921985\r\n 21\r\n180306.260253121\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525373.3902129744\r\n 20\r\n180568.0525292673\r\n 30\r\n0.0\r\n 11\r\n525604.2882998661\r\n 21\r\n180325.2027695491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525437.6852535538\r\n 20\r\n180636.0433505364\r\n 30\r\n0.0\r\n 11\r\n525359.7271228865\r\n 21\r\n180542.9305405187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525295.8949768945\r\n 20\r\n180622.6140249824\r\n 30\r\n0.0\r\n 11\r\n525405.282512096\r\n 21\r\n180673.8204514221\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1C9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525398.5703166641\r\n 20\r\n180673.2538395604\r\n 30\r\n0.0\r\n 11\r\n525438.2152087374\r\n 21\r\n180633.9358611555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525130.5614349412\r\n 20\r\n180879.2458920159\r\n 30\r\n0.0\r\n 11\r\n525485.7019481972\r\n 21\r\n180442.9056757742\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525498.678701995\r\n 20\r\n180441.282830755\r\n 30\r\n0.0\r\n 11\r\n525479.7250578333\r\n 21\r\n180426.1001450563\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525687.8825223587\r\n 20\r\n180422.4358408612\r\n 30\r\n0.0\r\n 11\r\n525712.7249873302\r\n 21\r\n180384.528201692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525687.79902507\r\n 20\r\n180437.9702772509\r\n 30\r\n0.0\r\n 11\r\n525689.8362126233\r\n 21\r\n180413.9911967952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525734.5133923259\r\n 20\r\n180481.8592027276\r\n 30\r\n0.0\r\n 11\r\n525683.5957432436\r\n 21\r\n180431.1713798979\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525479.962317523\r\n 20\r\n180515.6984381563\r\n 30\r\n0.0\r\n 11\r\n525223.7445992931\r\n 21\r\n180269.921447433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525114.4984688314\r\n 20\r\n180575.9437046102\r\n 30\r\n0.0\r\n 11\r\n525148.0515304179\r\n 21\r\n180374.6954986379\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525117.2592444702\r\n 20\r\n180379.0745464745\r\n 30\r\n0.0\r\n 11\r\n525437.7671699316\r\n 21\r\n180506.769297582\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525356.4457310868\r\n 20\r\n180606.2917409695\r\n 30\r\n0.0\r\n 11\r\n525329.0914276513\r\n 21\r\n180583.626000004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525338.7143704697\r\n 20\r\n180397.6906123634\r\n 30\r\n0.0\r\n 11\r\n525391.6579758414\r\n 21\r\n180320.8217965096\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525368.4486104316\r\n 20\r\n180347.2199300862\r\n 30\r\n0.0\r\n 11\r\n525445.7945459263\r\n 21\r\n180316.0720809731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525377.1091984003\r\n 20\r\n180357.0822435868\r\n 30\r\n0.0\r\n 11\r\n525388.9044896276\r\n 21\r\n180277.8041336032\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525290.4199535019\r\n 20\r\n180218.7723081885\r\n 30\r\n0.0\r\n 11\r\n525395.1753802871\r\n 21\r\n180288.7605865493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525014.2560689964\r\n 20\r\n180746.2368038634\r\n 30\r\n0.0\r\n 11\r\n525138.5689501177\r\n 21\r\n180507.0811555747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525622.5061380987\r\n 20\r\n180674.6436547186\r\n 30\r\n0.0\r\n 11\r\n525596.9843036692\r\n 21\r\n180635.1626984828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525550.7849538118\r\n 20\r\n180679.1848596368\r\n 30\r\n0.0\r\n 11\r\n525598.8824062162\r\n 21\r\n180635.0551335983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525561.9487755611\r\n 20\r\n180727.4646134757\r\n 30\r\n0.0\r\n 11\r\n525483.1889151137\r\n 21\r\n180659.0553493637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525400.1152848961\r\n 20\r\n180785.1963541049\r\n 30\r\n0.0\r\n 11\r\n525569.1773391347\r\n 21\r\n180539.072903049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525667.1879851137\r\n 20\r\n180528.8909585764\r\n 30\r\n0.0\r\n 11\r\n525622.0929967695\r\n 21\r\n180476.8716758188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525598.6842932832\r\n 20\r\n180498.4582577588\r\n 30\r\n0.0\r\n 11\r\n525643.9816726412\r\n 21\r\n180458.9523166879\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525607.1447210872\r\n 20\r\n180500.0348111686\r\n 30\r\n0.0\r\n 11\r\n525559.6630485436\r\n 21\r\n180446.7997974125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525559.1697185455\r\n 20\r\n180450.484354677\r\n 30\r\n0.0\r\n 11\r\n525600.537683186\r\n 21\r\n180412.5333165327\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525645.082231335\r\n 20\r\n180467.9205169104\r\n 30\r\n0.0\r\n 11\r\n525594.1423550066\r\n 21\r\n180409.5148939096\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525158.1862402328\r\n 20\r\n180735.5486798217\r\n 30\r\n0.0\r\n 11\r\n525228.9053381709\r\n 21\r\n180647.7797802598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525775.1882701215\r\n 20\r\n180796.2999456968\r\n 30\r\n0.0\r\n 11\r\n525993.0046463569\r\n 21\r\n180646.0675390643\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525418.1832166672\r\n 20\r\n180231.9287973527\r\n 30\r\n0.0\r\n 11\r\n525223.1231718565\r\n 21\r\n179691.1013030836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525223.754888888\r\n 20\r\n180352.4700418386\r\n 30\r\n0.0\r\n 11\r\n525106.2860575173\r\n 21\r\n180229.8569459029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524881.8800376533\r\n 20\r\n180654.3909091102\r\n 30\r\n0.0\r\n 11\r\n525421.6381162864\r\n 21\r\n180125.682277721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525212.2662827289\r\n 20\r\n180234.9251137939\r\n 30\r\n0.0\r\n 11\r\n524986.8238694697\r\n 21\r\n179857.9887050464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525264.71496686\r\n 20\r\n180189.3316651403\r\n 30\r\n0.0\r\n 11\r\n525113.7772041884\r\n 21\r\n180311.099107059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525218.275614624\r\n 20\r\n180133.512450071\r\n 30\r\n0.0\r\n 11\r\n525168.5585218523\r\n 21\r\n180174.3028458577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525266.4625094876\r\n 20\r\n180158.7173740281\r\n 30\r\n0.0\r\n 11\r\n525202.3974678277\r\n 21\r\n180133.5593542309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525217.2085946082\r\n 20\r\n180147.655250444\r\n 30\r\n0.0\r\n 11\r\n525023.8187307353\r\n 21\r\n179793.8227218339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525334.1253874497\r\n 20\r\n179976.8038566251\r\n 30\r\n0.0\r\n 11\r\n524964.4981331313\r\n 21\r\n180147.9394376977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524972.8461245731\r\n 20\r\n180158.3128669318\r\n 30\r\n0.0\r\n 11\r\n524859.8864172327\r\n 21\r\n179947.8945307285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524870.1391553542\r\n 20\r\n180318.8029888629\r\n 30\r\n0.0\r\n 11\r\n524975.3599812941\r\n 21\r\n180140.3780475297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524957.2244979571\r\n 20\r\n180323.0606344381\r\n 30\r\n0.0\r\n 11\r\n524896.180502328\r\n 21\r\n180263.353429186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525270.1249543759\r\n 20\r\n179800.8353309385\r\n 30\r\n0.0\r\n 11\r\n525190.4496126549\r\n 21\r\n179842.9533902513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525134.6987595177\r\n 20\r\n180264.2290642028\r\n 30\r\n0.0\r\n 11\r\n524915.8342363212\r\n 21\r\n179901.0024863818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524610.868708002\r\n 20\r\n180268.9667676791\r\n 30\r\n0.0\r\n 11\r\n524899.8257795197\r\n 21\r\n179931.447802198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524458.7969630624\r\n 20\r\n180421.892763538\r\n 30\r\n0.0\r\n 11\r\n524798.9324632437\r\n 21\r\n180053.0762331568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524665.464301145\r\n 20\r\n180343.7465446084\r\n 30\r\n0.0\r\n 11\r\n524623.0929854331\r\n 21\r\n180234.228512604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524705.7483468587\r\n 20\r\n180296.5003246841\r\n 30\r\n0.0\r\n 11\r\n524602.0198271621\r\n 21\r\n180260.3617707335\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524838.3894159758\r\n 20\r\n180160.4502396316\r\n 30\r\n0.0\r\n 11\r\n524684.9621933807\r\n 21\r\n180291.8554097274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CCC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524912.8934556925\r\n 20\r\n180364.2409513169\r\n 30\r\n0.0\r\n 11\r\n524731.1929690219\r\n 21\r\n180124.4233765795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524885.0114208989\r\n 20\r\n180451.0797803243\r\n 30\r\n0.0\r\n 11\r\n524958.7659591307\r\n 21\r\n180354.6031841114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525026.0671377887\r\n 20\r\n180431.3791693508\r\n 30\r\n0.0\r\n 11\r\n524919.0566906104\r\n 21\r\n180487.3835902562\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524925.7371762494\r\n 20\r\n180486.5200347311\r\n 30\r\n0.0\r\n 11\r\n524884.3885775652\r\n 21\r\n180448.9978508899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525202.6127386466\r\n 20\r\n180680.4308629602\r\n 30\r\n0.0\r\n 11\r\n525202.6044691076\r\n 21\r\n180680.4215757932\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525105.2808209763\r\n 20\r\n180571.121535247\r\n 30\r\n0.0\r\n 11\r\n524828.4815915741\r\n 21\r\n180260.2601199806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524828.9486333343\r\n 20\r\n180247.1906273707\r\n 30\r\n0.0\r\n 11\r\n524810.9380603054\r\n 21\r\n180263.4809260549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524840.5110408532\r\n 20\r\n180057.4023100257\r\n 30\r\n0.0\r\n 11\r\n524807.0494777431\r\n 21\r\n180026.8333557182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524855.8334198841\r\n 20\r\n180059.9616823253\r\n 30\r\n0.0\r\n 11\r\n524832.4859485963\r\n 21\r\n180054.1271286077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524906.6093788347\r\n 20\r\n180020.8429926709\r\n 30\r\n0.0\r\n 11\r\n524848.451298822\r\n 21\r\n180063.0271140968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524899.427885137\r\n 20\r\n180277.5330191347\r\n 30\r\n0.0\r\n 11\r\n524625.9545763003\r\n 21\r\n180497.9917991143\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524709.6465865055\r\n 20\r\n180552.8312479539\r\n 30\r\n0.0\r\n 11\r\n524883.8850270141\r\n 21\r\n180317.7645937127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524969.1676192615\r\n 20\r\n180413.9143342909\r\n 30\r\n0.0\r\n 11\r\n524942.4302544877\r\n 21\r\n180437.3046539747\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524760.4080436268\r\n 20\r\n180398.1576980424\r\n 30\r\n0.0\r\n 11\r\n524692.9644496469\r\n 21\r\n180333.6348196841\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524715.3241523529\r\n 20\r\n180360.7563940109\r\n 30\r\n0.0\r\n 11\r\n524696.9074980718\r\n 21\r\n180279.4335246133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524726.4412079268\r\n 20\r\n180353.7791390408\r\n 30\r\n0.0\r\n 11\r\n524650.0581049922\r\n 21\r\n180329.4939747678\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524537.4723958892\r\n 20\r\n180453.0920036419\r\n 30\r\n0.0\r\n 11\r\n524661.8742680996\r\n 21\r\n180325.0503028359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525079.0679994453\r\n 20\r\n180162.1564531274\r\n 30\r\n0.0\r\n 11\r\n525036.0227337291\r\n 21\r\n180181.0565863907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525072.1152669157\r\n 20\r\n180233.6841423673\r\n 30\r\n0.0\r\n 11\r\n525036.2191946904\r\n 21\r\n180179.1656166461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525121.5573963299\r\n 20\r\n180230.3612842898\r\n 30\r\n0.0\r\n 11\r\n525041.4651988386\r\n 21\r\n180297.2057525356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525152.7464166145\r\n 20\r\n180399.3295582072\r\n 30\r\n0.0\r\n 11\r\n524936.7285080018\r\n 21\r\n180193.1864174004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524942.3044836137\r\n 20\r\n180094.8061998036\r\n 30\r\n0.0\r\n 11\r\n524883.7603928235\r\n 21\r\n180131.029854864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524901.33831756\r\n 20\r\n180157.581022084\r\n 30\r\n0.0\r\n 11\r\n524869.560407142\r\n 21\r\n180106.5640017272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524904.243703815\r\n 20\r\n180149.4802140999\r\n 30\r\n0.0\r\n 11\r\n524844.1188824767\r\n 21\r\n180187.8661721603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524847.6776396538\r\n 20\r\n180188.9406879022\r\n 30\r\n0.0\r\n 11\r\n524816.8081996556\r\n 21\r\n180142.0507372842\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524878.5893528519\r\n 20\r\n180106.9074897788\r\n 30\r\n0.0\r\n 11\r\n524812.8086682417\r\n 21\r\n180147.8829620847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525223.5127926947\r\n 20\r\n180030.8256179181\r\n 30\r\n0.0\r\n 11\r\n525109.9329272069\r\n 21\r\n179791.8415935258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524672.8650839235\r\n 20\r\n181333.8745039805\r\n 30\r\n0.0\r\n 11\r\n524859.5012256396\r\n 21\r\n182053.1810553086\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524716.8211785645\r\n 20\r\n181530.7940420282\r\n 30\r\n0.0\r\n 11\r\n525208.540654474\r\n 21\r\n181263.8590629573\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524835.4109704701\r\n 20\r\n181460.5088428871\r\n 30\r\n0.0\r\n 11\r\n524886.2527054516\r\n 21\r\n181599.335399024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524737.2758838151\r\n 20\r\n181592.6887182873\r\n 30\r\n0.0\r\n 11\r\n525600.752012998\r\n 21\r\n181111.7085048984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524866.8151658661\r\n 20\r\n181573.106554149\r\n 30\r\n0.0\r\n 11\r\n524931.5378577799\r\n 21\r\n181623.4262461793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524823.9027735845\r\n 20\r\n181640.2916879391\r\n 30\r\n0.0\r\n 11\r\n524878.7593920745\r\n 21\r\n181571.6755099045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524827.7064194305\r\n 20\r\n181621.6569840489\r\n 30\r\n0.0\r\n 11\r\n524879.2308113621\r\n 21\r\n181813.7493832228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524717.6514214086\r\n 20\r\n181675.682364936\r\n 30\r\n0.0\r\n 11\r\n525148.1439612566\r\n 21\r\n181629.4720364983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524934.7650866334\r\n 20\r\n181805.9952657354\r\n 30\r\n0.0\r\n 11\r\n524929.9422093081\r\n 21\r\n181619.4032546132\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524874.3793247449\r\n 20\r\n181811.2080950981\r\n 30\r\n0.0\r\n 11\r\n524935.3073960814\r\n 21\r\n181805.343727744\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524937.5832628485\r\n 20\r\n182101.8236752705\r\n 30\r\n0.0\r\n 11\r\n524914.4064158528\r\n 21\r\n181805.4981787039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524928.6053765027\r\n 20\r\n182033.9925239486\r\n 30\r\n0.0\r\n 11\r\n525040.5229816188\r\n 21\r\n182017.4924942015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525046.3391693385\r\n 20\r\n182098.7511986293\r\n 30\r\n0.0\r\n 11\r\n524968.8315460129\r\n 21\r\n181292.6000975962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525063.8136333624\r\n 20\r\n181565.0834485425\r\n 30\r\n0.0\r\n 11\r\n525482.2168983525\r\n 21\r\n181431.582604177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525053.0631203627\r\n 20\r\n181496.4244833779\r\n 30\r\n0.0\r\n 11\r\n525090.0831673517\r\n 21\r\n181686.7900113307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525124.5401973068\r\n 20\r\n181483.640678055\r\n 30\r\n0.0\r\n 11\r\n525136.2950800057\r\n 21\r\n181546.8662143109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525071.4460584255\r\n 20\r\n181471.8815350281\r\n 30\r\n0.0\r\n 11\r\n525136.6554013828\r\n 21\r\n181493.9041850524\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525116.2465394077\r\n 20\r\n181495.1460060711\r\n 30\r\n0.0\r\n 11\r\n525492.088159179\r\n 21\r\n181349.0632398076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525136.866173508\r\n 20\r\n181289.1494869064\r\n 30\r\n0.0\r\n 11\r\n525309.3652517367\r\n 21\r\n181658.142389622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525296.2978940966\r\n 20\r\n181660.6999586831\r\n 30\r\n0.0\r\n 11\r\n525518.2396293072\r\n 21\r\n181572.5090415504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525271.4829984441\r\n 20\r\n181849.6179877786\r\n 30\r\n0.0\r\n 11\r\n525305.9274088119\r\n 21\r\n181645.3621078251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525202.1277142461\r\n 20\r\n181796.7802266995\r\n 30\r\n0.0\r\n 11\r\n525287.2804677732\r\n 21\r\n181790.4297678073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525371.3681014678\r\n 20\r\n181183.7777599395\r\n 30\r\n0.0\r\n 11\r\n525517.1109097619\r\n 21\r\n181575.3991642102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525104.2704918624\r\n 20\r\n181637.4622076297\r\n 30\r\n0.0\r\n 11\r\n525505.6490466426\r\n 21\r\n181500.602856059\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1CFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525501.9037164204\r\n 20\r\n181978.5020695708\r\n 30\r\n0.0\r\n 11\r\n525501.5052255752\r\n 21\r\n181494.9919717723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525521.4196865071\r\n 20\r\n182231.0925601788\r\n 30\r\n0.0\r\n 11\r\n525497.1132152171\r\n 21\r\n181692.2264156459\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525411.9747038597\r\n 20\r\n182000.5353745444\r\n 30\r\n0.0\r\n 11\r\n525514.9292324447\r\n 21\r\n181944.0562388116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525411.5936965098\r\n 20\r\n181938.4478196756\r\n 30\r\n0.0\r\n 11\r\n525514.2151067717\r\n 21\r\n181977.6198382092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525397.7689600213\r\n 20\r\n181748.9427919842\r\n 30\r\n0.0\r\n 11\r\n525430.4852564121\r\n 21\r\n181948.2838948999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525175.9815577455\r\n 20\r\n181863.6991593308\r\n 30\r\n0.0\r\n 11\r\n525502.9710926166\r\n 21\r\n181790.4340488745\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524784.2330615084\r\n 20\r\n181912.0751880627\r\n 30\r\n0.0\r\n 11\r\n525341.0568122784\r\n 21\r\n181831.6707165202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525349.1180495949\r\n 20\r\n181821.3728420787\r\n 30\r\n0.0\r\n 11\r\n525352.4014790639\r\n 21\r\n181845.4347136385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525462.5226132335\r\n 20\r\n181668.7533819362\r\n 30\r\n0.0\r\n 11\r\n525507.8082858266\r\n 21\r\n181666.9244393336\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525449.1537364944\r\n 20\r\n181660.8414402994\r\n 30\r\n0.0\r\n 11\r\n525470.770769125\r\n 21\r\n181671.4173720726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525435.5121121047\r\n 20\r\n181598.2125653963\r\n 30\r\n0.0\r\n 11\r\n525452.8258801166\r\n 21\r\n181667.9412955474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525275.6629654501\r\n 20\r\n181799.1841898901\r\n 30\r\n0.0\r\n 11\r\n525364.6241005938\r\n 21\r\n182224.3232275521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525036.1607473376\r\n 20\r\n182081.7297691328\r\n 30\r\n0.0\r\n 11\r\n525376.5846581334\r\n 21\r\n182207.013949368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525239.7094067614\r\n 20\r\n182235.172089817\r\n 30\r\n0.0\r\n 11\r\n525261.6374529488\r\n 21\r\n181839.9695430297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525304.3029185713\r\n 20\r\n181980.9988828615\r\n 30\r\n0.0\r\n 11\r\n525397.4527456271\r\n 21\r\n181975.0870371206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525362.8796105945\r\n 20\r\n181981.4300989267\r\n 30\r\n0.0\r\n 11\r\n525429.3494648776\r\n 21\r\n181931.0878630456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525358.8702955248\r\n 20\r\n181968.9322429417\r\n 30\r\n0.0\r\n 11\r\n525432.939661286\r\n 21\r\n181999.5570151602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525447.6529162399\r\n 20\r\n182281.8852571326\r\n 30\r\n0.0\r\n 11\r\n525426.7636260753\r\n 21\r\n181988.54681444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524853.8675979557\r\n 20\r\n182211.3322892552\r\n 30\r\n0.0\r\n 11\r\n524856.4895709922\r\n 21\r\n182034.7267694308\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524844.2820292215\r\n 20\r\n182097.1365796394\r\n 30\r\n0.0\r\n 11\r\n525107.6038457547\r\n 21\r\n182096.4716284987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525212.5715177859\r\n 20\r\n181595.2190166764\r\n 30\r\n0.0\r\n 11\r\n525233.3232547421\r\n 21\r\n181637.4028447537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525171.8164555471\r\n 20\r\n181654.4100271384\r\n 30\r\n0.0\r\n 11\r\n525234.3910139501\r\n 21\r\n181635.8298686707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525136.1378398911\r\n 20\r\n181620.021047339\r\n 30\r\n0.0\r\n 11\r\n525154.3447919175\r\n 21\r\n181722.7412981756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525003.4429764331\r\n 20\r\n181729.1773837962\r\n 30\r\n0.0\r\n 11\r\n525301.4615792174\r\n 21\r\n181710.639753487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525360.566326539\r\n 20\r\n181631.7956822925\r\n 30\r\n0.0\r\n 11\r\n525382.0146893034\r\n 21\r\n181697.2138104154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525351.4666208391\r\n 20\r\n181706.2006581319\r\n 30\r\n0.0\r\n 11\r\n525408.6357065016\r\n 21\r\n181687.6462085011\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525354.4622434232\r\n 20\r\n181698.1327832805\r\n 30\r\n0.0\r\n 11\r\n525375.7269195981\r\n 21\r\n181766.2230870276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525372.3126460178\r\n 20\r\n181764.7526882235\r\n 30\r\n0.0\r\n 11\r\n525426.1284504718\r\n 21\r\n181748.7699166965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525401.5080878492\r\n 20\r\n181682.0931105359\r\n 30\r\n0.0\r\n 11\r\n525425.4310228318\r\n 21\r\n181755.807294926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525550.4821613834\r\n 20\r\n181139.8508269699\r\n 30\r\n0.0\r\n 11\r\n525791.2774661715\r\n 21\r\n181120.4520406538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525580.7167677637\r\n 20\r\n181592.8036794261\r\n 30\r\n0.0\r\n 11\r\n525540.1266019988\r\n 21\r\n181073.841759013\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525689.4726742537\r\n 20\r\n181589.7312027846\r\n 30\r\n0.0\r\n 11\r\n525617.1625483183\r\n 21\r\n180837.6388906033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525706.9471382775\r\n 20\r\n181056.0634526979\r\n 30\r\n0.0\r\n 11\r\n526125.3504032675\r\n 21\r\n180922.5626083323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525696.1966252777\r\n 20\r\n180987.4044875335\r\n 30\r\n0.0\r\n 11\r\n525733.2166722667\r\n 21\r\n181177.7700154862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525767.673702222\r\n 20\r\n180974.6206822104\r\n 30\r\n0.0\r\n 11\r\n525779.4285849208\r\n 21\r\n181037.8462184663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525714.5795633408\r\n 20\r\n180962.8615391838\r\n 30\r\n0.0\r\n 11\r\n525779.7889062979\r\n 21\r\n180984.8841892078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525759.3800443228\r\n 20\r\n180986.1260102264\r\n 30\r\n0.0\r\n 11\r\n526135.2216640942\r\n 21\r\n180840.0432439632\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525826.4972455265\r\n 20\r\n180879.8564422131\r\n 30\r\n0.0\r\n 11\r\n525952.4987566518\r\n 21\r\n181149.1223937773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525939.4313990119\r\n 20\r\n181151.6799628386\r\n 30\r\n0.0\r\n 11\r\n526161.3731342222\r\n 21\r\n181063.4890457058\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525914.6165033592\r\n 20\r\n181340.597991934\r\n 30\r\n0.0\r\n 11\r\n525949.060913727\r\n 21\r\n181136.3421119805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525845.2612191611\r\n 20\r\n181287.7602308549\r\n 30\r\n0.0\r\n 11\r\n525930.4139726882\r\n 21\r\n181281.4097719626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526039.6595348584\r\n 20\r\n180749.1254239648\r\n 30\r\n0.0\r\n 11\r\n526160.244414677\r\n 21\r\n181066.3791683655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525747.4039967776\r\n 20\r\n181128.442211785\r\n 30\r\n0.0\r\n 11\r\n526148.7825515574\r\n 21\r\n180991.5828602147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526143.3048822115\r\n 20\r\n181529.6072795687\r\n 30\r\n0.0\r\n 11\r\n526144.6387304903\r\n 21\r\n180985.9719759277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526055.1082087747\r\n 20\r\n181491.5153786999\r\n 30\r\n0.0\r\n 11\r\n526158.0627373598\r\n 21\r\n181435.0362429673\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526054.727201425\r\n 20\r\n181429.4278238311\r\n 30\r\n0.0\r\n 11\r\n526157.3486116869\r\n 21\r\n181468.5998423646\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526040.9024649364\r\n 20\r\n181239.9227961396\r\n 30\r\n0.0\r\n 11\r\n526073.6187613272\r\n 21\r\n181439.2638990554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525819.1150626604\r\n 20\r\n181354.6791634863\r\n 30\r\n0.0\r\n 11\r\n526146.1045975316\r\n 21\r\n181281.41405303\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525793.8332015857\r\n 20\r\n181264.5823737513\r\n 30\r\n0.0\r\n 11\r\n525833.643721944\r\n 21\r\n181379.3106963023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525741.8105573311\r\n 20\r\n181279.0130101218\r\n 30\r\n0.0\r\n 11\r\n525795.9134356442\r\n 21\r\n181265.2108562477\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525427.3665664235\r\n 20\r\n181403.0551922181\r\n 30\r\n0.0\r\n 11\r\n525984.1903171935\r\n 21\r\n181322.6507206756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525992.25155451\r\n 20\r\n181312.3528462341\r\n 30\r\n0.0\r\n 11\r\n525995.5349839787\r\n 21\r\n181336.4147177941\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526105.6561181488\r\n 20\r\n181159.7333860918\r\n 30\r\n0.0\r\n 11\r\n526150.9417907415\r\n 21\r\n181157.904443489\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526092.2872414094\r\n 20\r\n181151.8214444548\r\n 30\r\n0.0\r\n 11\r\n526113.90427404\r\n 21\r\n181162.397376228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526078.6456170197\r\n 20\r\n181089.1925695517\r\n 30\r\n0.0\r\n 11\r\n526095.9593850317\r\n 21\r\n181158.9212997027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525918.7964703651\r\n 20\r\n181290.1641940455\r\n 30\r\n0.0\r\n 11\r\n525997.955051366\r\n 21\r\n181636.2678885616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525679.2942522527\r\n 20\r\n181572.7097732883\r\n 30\r\n0.0\r\n 11\r\n525869.1756024465\r\n 21\r\n181647.3537361884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525849.5941156315\r\n 20\r\n181671.517889556\r\n 30\r\n0.0\r\n 11\r\n525904.7709578639\r\n 21\r\n181330.9495471852\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525777.6039437721\r\n 20\r\n181349.5625448107\r\n 30\r\n0.0\r\n 11\r\n525782.9892644946\r\n 21\r\n181384.6765313503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525947.4364234862\r\n 20\r\n181471.9788870168\r\n 30\r\n0.0\r\n 11\r\n526040.5862505421\r\n 21\r\n181466.0670412759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526006.0131155095\r\n 20\r\n181472.4101030822\r\n 30\r\n0.0\r\n 11\r\n526072.4829697926\r\n 21\r\n181422.0678672007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526002.0038004398\r\n 20\r\n181459.9122470971\r\n 30\r\n0.0\r\n 11\r\n526076.073166201\r\n 21\r\n181490.5370193159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526076.09878786\r\n 20\r\n181605.3584441946\r\n 30\r\n0.0\r\n 11\r\n526069.8971309905\r\n 21\r\n181479.5268185956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525481.6937793638\r\n 20\r\n181571.182850897\r\n 30\r\n0.0\r\n 11\r\n525750.7373506701\r\n 21\r\n181587.451632654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525855.7050227011\r\n 20\r\n181086.1990208319\r\n 30\r\n0.0\r\n 11\r\n525876.4567596575\r\n 21\r\n181128.3828489091\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525814.9499604622\r\n 20\r\n181145.390031294\r\n 30\r\n0.0\r\n 11\r\n525877.5245188651\r\n 21\r\n181126.8098728261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525779.2713448061\r\n 20\r\n181111.0010514946\r\n 30\r\n0.0\r\n 11\r\n525797.4782968325\r\n 21\r\n181213.721302331\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525646.5764813483\r\n 20\r\n181220.1573879517\r\n 30\r\n0.0\r\n 11\r\n525944.5950841326\r\n 21\r\n181201.6197576427\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526003.6998314539\r\n 20\r\n181122.7756864479\r\n 30\r\n0.0\r\n 11\r\n526025.1481942186\r\n 21\r\n181188.1938145709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525994.6001257541\r\n 20\r\n181197.1806622872\r\n 30\r\n0.0\r\n 11\r\n526051.769211417\r\n 21\r\n181178.6262126565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525997.5957483383\r\n 20\r\n181189.112787436\r\n 30\r\n0.0\r\n 11\r\n526018.8604245131\r\n 21\r\n181257.2030911829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526015.4461509327\r\n 20\r\n181255.7326923791\r\n 30\r\n0.0\r\n 11\r\n526069.261955387\r\n 21\r\n181239.7499208522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526044.6415927642\r\n 20\r\n181173.0731146914\r\n 30\r\n0.0\r\n 11\r\n526068.5645277468\r\n 21\r\n181246.7872990814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525564.8320348503\r\n 20\r\n181453.2075964477\r\n 30\r\n0.0\r\n 11\r\n525676.4676305909\r\n 21\r\n181437.6491804908\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526130.473714444\r\n 20\r\n181488.9973167478\r\n 30\r\n0.0\r\n 11\r\n526494.1671899047\r\n 21\r\n181934.2723503464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526109.8328697965\r\n 20\r\n181554.5942094994\r\n 30\r\n0.0\r\n 11\r\n526251.9934859582\r\n 21\r\n181731.9634965217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525927.1473617616\r\n 20\r\n181593.8350989162\r\n 30\r\n0.0\r\n 11\r\n525971.9586043235\r\n 21\r\n181757.6180350803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525492.4506609762\r\n 20\r\n181731.9415880005\r\n 30\r\n0.0\r\n 11\r\n526223.3911410159\r\n 21\r\n181540.6365567163\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526022.0770722465\r\n 20\r\n181664.0999425277\r\n 30\r\n0.0\r\n 11\r\n526215.550577524\r\n 21\r\n182147.2371812123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526088.1434775098\r\n 20\r\n181642.5393970146\r\n 30\r\n0.0\r\n 11\r\n525906.1162328381\r\n 21\r\n181709.4393245857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526112.1606457125\r\n 20\r\n181711.0636543148\r\n 30\r\n0.0\r\n 11\r\n526051.6183006626\r\n 21\r\n181732.749367538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526115.3035619875\r\n 20\r\n181656.7738108306\r\n 30\r\n0.0\r\n 11\r\n526103.9601991942\r\n 21\r\n181724.6603606289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526099.4801024202\r\n 20\r\n181704.710611271\r\n 30\r\n0.0\r\n 11\r\n526304.7553206837\r\n 21\r\n181949.7835141037\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525857.313670571\r\n 20\r\n181761.9825238141\r\n 30\r\n0.0\r\n 11\r\n526087.2040436257\r\n 21\r\n182113.8961217255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525668.4671300806\r\n 20\r\n181833.7424880624\r\n 30\r\n0.0\r\n 11\r\n525789.1324778181\r\n 21\r\n181820.0552903225\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525757.8593417412\r\n 20\r\n181722.8647994392\r\n 30\r\n0.0\r\n 11\r\n525654.8212814394\r\n 21\r\n181785.8797904769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525658.9953514573\r\n 20\r\n181780.5928484492\r\n 30\r\n0.0\r\n 11\r\n525669.9329835094\r\n 21\r\n181835.3467441867\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525634.9459465169\r\n 20\r\n181443.4235846078\r\n 30\r\n0.0\r\n 11\r\n525634.9496634225\r\n 21\r\n181443.4354514254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525678.693672931\r\n 20\r\n181583.0952272422\r\n 30\r\n0.0\r\n 11\r\n525919.2417741847\r\n 21\r\n182168.4730579651\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525976.3153867182\r\n 20\r\n181897.5490736705\r\n 30\r\n0.0\r\n 11\r\n525495.0880701026\r\n 21\r\n182031.8608562202\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525491.0565304261\r\n 20\r\n181931.8835367471\r\n 30\r\n0.0\r\n 11\r\n525809.6864879597\r\n 21\r\n181871.5776837387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525743.5990615419\r\n 20\r\n181780.6507845993\r\n 30\r\n0.0\r\n 11\r\n525709.7929964333\r\n 21\r\n181791.5660808326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526157.4518696392\r\n 20\r\n181859.1409376143\r\n 30\r\n0.0\r\n 11\r\n525977.7109751933\r\n 21\r\n181842.9721210265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525951.114209062\r\n 20\r\n181784.9639954642\r\n 30\r\n0.0\r\n 11\r\n525979.4340796496\r\n 21\r\n181843.775410835\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525850.4565019642\r\n 20\r\n181630.6661921994\r\n 30\r\n0.0\r\n 11\r\n525902.2043944721\r\n 21\r\n181859.6510289999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525093.3682658213\r\n 20\r\n181879.2959285518\r\n 30\r\n0.0\r\n 11\r\n525080.1517503274\r\n 21\r\n181713.4750750022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525075.2920115007\r\n 20\r\n181977.1120209499\r\n 30\r\n0.0\r\n 11\r\n524897.6469292312\r\n 21\r\n181927.1785198064\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525559.1342218785\r\n 20\r\n181754.3305998252\r\n 30\r\n0.0\r\n 11\r\n525635.1712887211\r\n 21\r\n181559.4054345479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525968.0301132713\r\n 20\r\n181790.5144936306\r\n 30\r\n0.0\r\n 11\r\n525860.2933285217\r\n 21\r\n181836.5902880851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525138.5976201284\r\n 20\r\n181292.8532256214\r\n 30\r\n0.0\r\n 11\r\n525174.8263971197\r\n 21\r\n181098.0413473536\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527943.7217281111\r\n 20\r\n183084.8932846896\r\n 30\r\n0.0\r\n 11\r\n526886.0691300294\r\n 21\r\n180903.8038450779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527579.4189956524\r\n 20\r\n183075.1156235687\r\n 30\r\n0.0\r\n 11\r\n527883.4646186981\r\n 21\r\n182875.7659136232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527616.3711753756\r\n 20\r\n182837.7830018993\r\n 30\r\n0.0\r\n 11\r\n527887.6384030865\r\n 21\r\n182669.8299575536\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527511.1304576061\r\n 20\r\n182404.0055193513\r\n 30\r\n0.0\r\n 11\r\n527703.9479938831\r\n 21\r\n182285.0018235103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527759.9654076744\r\n 20\r\n182990.4690615484\r\n 30\r\n0.0\r\n 11\r\n527606.7760979401\r\n 21\r\n182800.9552573995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527938.6573479137\r\n 20\r\n182899.213051281\r\n 30\r\n0.0\r\n 11\r\n527799.4197403971\r\n 21\r\n182644.7157533081\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526976.0672279639\r\n 20\r\n181073.1283888675\r\n 30\r\n0.0\r\n 11\r\n525228.9175514841\r\n 21\r\n178041.3051799581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526349.4510224499\r\n 20\r\n181723.5957364893\r\n 30\r\n0.0\r\n 11\r\n526137.0436574432\r\n 21\r\n181866.8871380226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527011.5634163477\r\n 20\r\n181549.3135720685\r\n 30\r\n0.0\r\n 11\r\n526853.7736129552\r\n 21\r\n181139.4524424818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527223.0841845988\r\n 20\r\n181435.1536054864\r\n 30\r\n0.0\r\n 11\r\n526900.2058964616\r\n 21\r\n181605.0098790062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527037.0652009413\r\n 20\r\n181450.9758915195\r\n 30\r\n0.0\r\n 11\r\n526980.4001620355\r\n 21\r\n181481.3850853253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527181.0254201383\r\n 20\r\n181319.6206159791\r\n 30\r\n0.0\r\n 11\r\n526785.2862686458\r\n 21\r\n181416.0686238382\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526791.4713041271\r\n 20\r\n181427.8602450707\r\n 30\r\n0.0\r\n 11\r\n526721.3222355628\r\n 21\r\n181199.5734082347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526659.6748687927\r\n 20\r\n181565.4665690411\r\n 30\r\n0.0\r\n 11\r\n526797.4050230715\r\n 21\r\n181410.7497745311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526744.2941710323\r\n 20\r\n181586.4798536614\r\n 30\r\n0.0\r\n 11\r\n526695.9448348761\r\n 21\r\n181516.0976012488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527175.4863038696\r\n 20\r\n181208.5202604197\r\n 30\r\n0.0\r\n 11\r\n527089.1715245067\r\n 21\r\n181234.440327206\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527168.689694969\r\n 20\r\n181055.8945927876\r\n 30\r\n0.0\r\n 11\r\n526719.774874828\r\n 21\r\n181202.2627374366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526929.7940054563\r\n 20\r\n181563.0687750525\r\n 30\r\n0.0\r\n 11\r\n526785.2800684787\r\n 21\r\n181164.3822460992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526414.9304229288\r\n 20\r\n181466.4465204097\r\n 30\r\n0.0\r\n 11\r\n526792.2496135724\r\n 21\r\n181164.1016811281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526205.7293076139\r\n 20\r\n181609.3371162689\r\n 30\r\n0.0\r\n 11\r\n526641.1837374633\r\n 21\r\n181290.9867341505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526454.0390723845\r\n 20\r\n181550.3703392336\r\n 30\r\n0.0\r\n 11\r\n526433.6399297231\r\n 21\r\n181434.7269100732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526502.6971109922\r\n 20\r\n181511.8034503905\r\n 30\r\n0.0\r\n 11\r\n526407.9120616558\r\n 21\r\n181456.2931333099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526659.1379968794\r\n 20\r\n181403.9631606926\r\n 30\r\n0.0\r\n 11\r\n526483.2010900999\r\n 21\r\n181503.2276366846\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526792.3949678253\r\n 20\r\n181815.5482342014\r\n 30\r\n0.0\r\n 11\r\n526560.9288521117\r\n 21\r\n181347.8919828472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526633.1060476017\r\n 20\r\n181487.2419746779\r\n 30\r\n0.0\r\n 11\r\n526612.2858985422\r\n 21\r\n181499.7430132419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526681.1415599006\r\n 20\r\n181303.2694652466\r\n 30\r\n0.0\r\n 11\r\n526654.2210802562\r\n 21\r\n181266.8081851133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526695.680076064\r\n 20\r\n181308.7427854004\r\n 30\r\n0.0\r\n 11\r\n526673.901047781\r\n 21\r\n181298.5046039371\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526753.0608187414\r\n 20\r\n181280.1784674954\r\n 30\r\n0.0\r\n 11\r\n526687.8445923023\r\n 21\r\n181310.3232212721\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526696.3896537784\r\n 20\r\n181530.6374912887\r\n 30\r\n0.0\r\n 11\r\n526309.1554281505\r\n 21\r\n181727.3782837355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526340.3883101176\r\n 20\r\n181733.1381633065\r\n 30\r\n0.0\r\n 11\r\n526282.3497671501\r\n 21\r\n181540.4056030153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526378.8858323255\r\n 20\r\n181831.5850459025\r\n 30\r\n0.0\r\n 11\r\n526673.3621656025\r\n 21\r\n181567.1052142773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526536.6724852248\r\n 20\r\n181622.110195219\r\n 30\r\n0.0\r\n 11\r\n526482.9752837407\r\n 21\r\n181545.7659043168\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526499.6698190174\r\n 20\r\n181576.6985503557\r\n 30\r\n0.0\r\n 11\r\n526497.3225266423\r\n 21\r\n181493.3494504177\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526511.9260369985\r\n 20\r\n181572.0021546795\r\n 30\r\n0.0\r\n 11\r\n526441.678933082\r\n 21\r\n181533.4082172145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526307.3223704611\r\n 20\r\n181632.9086127737\r\n 30\r\n0.0\r\n 11\r\n526454.1312590536\r\n 21\r\n181531.3327633558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526894.9461643925\r\n 20\r\n181452.1668933229\r\n 30\r\n0.0\r\n 11\r\n526849.0590665425\r\n 21\r\n181462.3886440957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526874.2963543948\r\n 20\r\n181521.0010139657\r\n 30\r\n0.0\r\n 11\r\n526849.6173969573\r\n 21\r\n181460.5713299699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526923.4481245006\r\n 20\r\n181527.2993504338\r\n 30\r\n0.0\r\n 11\r\n526831.9440671101\r\n 21\r\n181577.3987567687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526921.3825863701\r\n 20\r\n181699.1096124356\r\n 30\r\n0.0\r\n 11\r\n526749.2930653531\r\n 21\r\n181455.0933668714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526773.7834150032\r\n 20\r\n181359.6471438321\r\n 30\r\n0.0\r\n 11\r\n526709.34078019\r\n 21\r\n181383.8692529624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526721.454024047\r\n 20\r\n181413.3178054233\r\n 30\r\n0.0\r\n 11\r\n526700.1386005055\r\n 21\r\n181357.1197211509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526725.8707045275\r\n 20\r\n181405.9315145532\r\n 30\r\n0.0\r\n 11\r\n526659.4591287731\r\n 21\r\n181431.9695352724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526662.7430145923\r\n 20\r\n181433.7117840057\r\n 30\r\n0.0\r\n 11\r\n526641.5210478957\r\n 21\r\n181381.7385416184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526708.9308036916\r\n 20\r\n181359.2022695438\r\n 30\r\n0.0\r\n 11\r\n526636.4694427717\r\n 21\r\n181386.6875196267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527324.4023127908\r\n 20\r\n181542.1238641195\r\n 30\r\n0.0\r\n 11\r\n527121.7425878764\r\n 21\r\n180197.6711064802\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527230.4778736888\r\n 20\r\n180841.7992848049\r\n 30\r\n0.0\r\n 11\r\n527090.3880768281\r\n 21\r\n180889.0490839605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527188.824350887\r\n 20\r\n181001.0694914723\r\n 30\r\n0.0\r\n 11\r\n527109.6409313045\r\n 21\r\n180512.9971680853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527123.0099071885\r\n 20\r\n180887.7895473195\r\n 30\r\n0.0\r\n 11\r\n527043.2541387421\r\n 21\r\n180868.8128338491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527097.4761990254\r\n 20\r\n180963.3100436179\r\n 30\r\n0.0\r\n 11\r\n527116.6493709036\r\n 21\r\n180877.5789643039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527182.2719981973\r\n 20\r\n181140.0052827173\r\n 30\r\n0.0\r\n 11\r\n526902.953581457\r\n 21\r\n180703.6749845552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526724.9058894234\r\n 20\r\n181128.0958067637\r\n 30\r\n0.0\r\n 11\r\n526667.7181934928\r\n 21\r\n181030.4875655608\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526600.7071804941\r\n 20\r\n181076.8160581087\r\n 30\r\n0.0\r\n 11\r\n527232.4961109984\r\n 21\r\n180662.4317586386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527005.9546060342\r\n 20\r\n180729.1363945265\r\n 30\r\n0.0\r\n 11\r\n526852.309829773\r\n 21\r\n180252.8250246601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527066.2282636347\r\n 20\r\n180694.542851391\r\n 30\r\n0.0\r\n 11\r\n526894.597086148\r\n 21\r\n180784.8327014642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527031.4563906275\r\n 20\r\n180630.7987139774\r\n 30\r\n0.0\r\n 11\r\n526974.7913517218\r\n 21\r\n180661.2079077832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527073.8614118073\r\n 20\r\n180664.8439663194\r\n 30\r\n0.0\r\n 11\r\n527015.8687275841\r\n 21\r\n180627.7750561708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527027.6753131541\r\n 20\r\n180644.4684172386\r\n 30\r\n0.0\r\n 11\r\n526985.3752550181\r\n 21\r\n180510.4087323127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527175.4166098245\r\n 20\r\n180499.4434384371\r\n 30\r\n0.0\r\n 11\r\n526402.0073828482\r\n 21\r\n180690.8630085347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526785.8624938135\r\n 20\r\n180607.6830675286\r\n 30\r\n0.0\r\n 11\r\n526728.7625141292\r\n 21\r\n180418.1739236337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527163.4583574716\r\n 20\r\n180374.7574255732\r\n 30\r\n0.0\r\n 11\r\n527077.143578109\r\n 21\r\n180400.6774923597\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1D9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526924.1851951425\r\n 20\r\n180742.8915975102\r\n 30\r\n0.0\r\n 11\r\n526779.21622005\r\n 21\r\n180342.9497047469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526702.8643413537\r\n 20\r\n180828.581240778\r\n 30\r\n0.0\r\n 11\r\n526506.2079120824\r\n 21\r\n180448.1401350717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526910.3548193506\r\n 20\r\n181164.3710947051\r\n 30\r\n0.0\r\n 11\r\n526624.5123186351\r\n 21\r\n180679.7974333797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526690.7808434647\r\n 20\r\n180710.4603137467\r\n 30\r\n0.0\r\n 11\r\n526215.2065931234\r\n 21\r\n180941.0748792045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526620.3527323503\r\n 20\r\n181074.0991428002\r\n 30\r\n0.0\r\n 11\r\n526443.2837607318\r\n 21\r\n180972.7422109263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526436.6962569662\r\n 20\r\n181003.1386865113\r\n 30\r\n0.0\r\n 11\r\n526667.7533552889\r\n 21\r\n180746.9280367352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526531.0636749112\r\n 20\r\n180801.933017677\r\n 30\r\n0.0\r\n 11\r\n526408.4835079856\r\n 21\r\n180625.7016248967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526346.5095508479\r\n 20\r\n180785.0841135451\r\n 30\r\n0.0\r\n 11\r\n526459.7865481565\r\n 21\r\n180663.571212232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526745.2325381531\r\n 20\r\n181227.243886362\r\n 30\r\n0.0\r\n 11\r\n526564.135988081\r\n 21\r\n181027.6113337231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526889.3373540787\r\n 20\r\n180631.9897157808\r\n 30\r\n0.0\r\n 11\r\n526843.4502562289\r\n 21\r\n180642.2114665537\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526868.6875440812\r\n 20\r\n180700.8238364236\r\n 30\r\n0.0\r\n 11\r\n526844.0085866436\r\n 21\r\n180640.3941524279\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526917.8393141868\r\n 20\r\n180707.1221728916\r\n 30\r\n0.0\r\n 11\r\n526826.3352567963\r\n 21\r\n180757.2215792266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526785.1958007188\r\n 20\r\n181088.5605498259\r\n 30\r\n0.0\r\n 11\r\n526727.4503039016\r\n 21\r\n180991.761644146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527056.4469199513\r\n 20\r\n180531.0616247083\r\n 30\r\n0.0\r\n 11\r\n526941.7075286161\r\n 21\r\n180189.3892904521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526364.9824813638\r\n 20\r\n180727.0001515036\r\n 30\r\n0.0\r\n 11\r\n526014.8921859642\r\n 21\r\n180764.5781846883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526613.1300481536\r\n 20\r\n181319.4827837597\r\n 30\r\n0.0\r\n 11\r\n526290.2675920513\r\n 21\r\n180597.2276236572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526294.3528492354\r\n 20\r\n181213.945122317\r\n 30\r\n0.0\r\n 11\r\n526135.5486117216\r\n 21\r\n181037.9738909294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526328.5897194393\r\n 20\r\n181133.7589566729\r\n 30\r\n0.0\r\n 11\r\n526251.3986893869\r\n 21\r\n181170.2673754394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526246.6614287466\r\n 20\r\n181414.5429920229\r\n 30\r\n0.0\r\n 11\r\n526129.2449001803\r\n 21\r\n181416.2419766329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526216.3464087707\r\n 20\r\n181360.3580383912\r\n 30\r\n0.0\r\n 11\r\n526146.4329392632\r\n 21\r\n181445.0793914347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526342.9116307196\r\n 20\r\n181175.2131736575\r\n 30\r\n0.0\r\n 11\r\n526123.3088360611\r\n 21\r\n181290.8186824505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526423.5612846294\r\n 20\r\n181245.937528677\r\n 30\r\n0.0\r\n 11\r\n526358.7042820345\r\n 21\r\n181143.2679872298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526454.0747501559\r\n 20\r\n181106.8197449054\r\n 30\r\n0.0\r\n 11\r\n526469.4291336368\r\n 21\r\n181226.6194689207\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526470.93942316\r\n 20\r\n181220.0548941384\r\n 30\r\n0.0\r\n 11\r\n526421.3926324677\r\n 21\r\n181245.7985618147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526748.9377916851\r\n 20\r\n181027.7572252637\r\n 30\r\n0.0\r\n 11\r\n526748.9262106236\r\n 21\r\n181027.7617546961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526612.6294771829\r\n 20\r\n181081.0683378015\r\n 30\r\n0.0\r\n 11\r\n526224.986478683\r\n 21\r\n181232.678161405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526265.8234853017\r\n 20\r\n181172.1466117311\r\n 30\r\n0.0\r\n 11\r\n526377.5843756956\r\n 21\r\n181505.1619682758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526458.0761615913\r\n 20\r\n181445.7246893631\r\n 30\r\n0.0\r\n 11\r\n526298.1529495785\r\n 21\r\n181200.6942170815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526417.9361183032\r\n 20\r\n181154.1121857402\r\n 30\r\n0.0\r\n 11\r\n526430.5848035984\r\n 21\r\n181187.3086387173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526330.6592396082\r\n 20\r\n181344.4055867037\r\n 30\r\n0.0\r\n 11\r\n526246.7297386135\r\n 21\r\n181385.2428131443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526279.9285591622\r\n 20\r\n181373.6940290857\r\n 30\r\n0.0\r\n 11\r\n526197.2715351827\r\n 21\r\n181362.7213981878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526277.2464841459\r\n 20\r\n181360.8457807552\r\n 30\r\n0.0\r\n 11\r\n526227.9455098227\r\n 21\r\n181424.0404130312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526304.749963081\r\n 20\r\n181572.5432432923\r\n 30\r\n0.0\r\n 11\r\n526227.8821140592\r\n 21\r\n181411.4164710242\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526468.0150100879\r\n 20\r\n180976.8948188468\r\n 30\r\n0.0\r\n 11\r\n526199.6812261328\r\n 21\r\n181107.8746330602\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527177.7303266084\r\n 20\r\n181751.4685846251\r\n 30\r\n0.0\r\n 11\r\n527701.5928006742\r\n 21\r\n181808.0544919456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527450.2036285262\r\n 20\r\n181826.5587563648\r\n 30\r\n0.0\r\n 11\r\n527363.6210441879\r\n 21\r\n181292.8793153189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527369.3614103036\r\n 20\r\n181546.873448078\r\n 30\r\n0.0\r\n 11\r\n527720.1122960226\r\n 21\r\n181749.5979243848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n528024.703594832\r\n 20\r\n181666.8781985996\r\n 30\r\n0.0\r\n 11\r\n527183.1410703766\r\n 21\r\n181445.7012363482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527614.5857858546\r\n 20\r\n180887.3170383316\r\n 30\r\n0.0\r\n 11\r\n527614.5982048961\r\n 21\r\n180887.3176740574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527301.0085882168\r\n 20\r\n181300.4785506191\r\n 30\r\n0.0\r\n 11\r\n527130.9045834213\r\n 21\r\n181198.8477494359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524905.0467234861\r\n 20\r\n179966.2211383896\r\n 30\r\n0.0\r\n 11\r\n524511.244865442\r\n 21\r\n179567.0832419587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524886.0389746226\r\n 20\r\n179957.9478773517\r\n 30\r\n0.0\r\n 11\r\n525573.550575652\r\n 21\r\n179566.6698251386\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525007.2785092507\r\n 20\r\n179892.3390120542\r\n 30\r\n0.0\r\n 11\r\n524914.3173388969\r\n 21\r\n179777.3785166172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524926.827850516\r\n 20\r\n179807.5324110196\r\n 30\r\n0.0\r\n 11\r\n524916.9246637157\r\n 21\r\n179726.1504403762\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524847.1403262642\r\n 20\r\n179809.8158497277\r\n 30\r\n0.0\r\n 11\r\n524934.1939106882\r\n 21\r\n179798.0217020612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DCC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524865.0806026798\r\n 20\r\n179816.1298336475\r\n 30\r\n0.0\r\n 11\r\n524726.7770255972\r\n 21\r\n179673.2089697036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524762.1755525736\r\n 20\r\n179882.7736257986\r\n 30\r\n0.0\r\n 11\r\n525023.0581350619\r\n 21\r\n179537.2312991965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524761.9693411359\r\n 20\r\n179629.5548405179\r\n 30\r\n0.0\r\n 11\r\n524919.5556749655\r\n 21\r\n179729.5867661742\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524726.4637179141\r\n 20\r\n179678.6767760302\r\n 30\r\n0.0\r\n 11\r\n524762.8069600158\r\n 21\r\n179629.4244721773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524509.6460579089\r\n 20\r\n179475.1030656924\r\n 30\r\n0.0\r\n 11\r\n524751.9328858016\r\n 21\r\n179647.2746637618\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524563.219935467\r\n 20\r\n179517.664869887\r\n 30\r\n0.0\r\n 11\r\n524634.8917138494\r\n 21\r\n179430.1379740204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524568.1743441253\r\n 20\r\n179383.3875979579\r\n 30\r\n0.0\r\n 11\r\n525137.7149643251\r\n 21\r\n179837.1898916572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525034.9532006296\r\n 20\r\n179642.663750922\r\n 30\r\n0.0\r\n 11\r\n525364.5035351414\r\n 21\r\n179352.3529784319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525088.3262039714\r\n 20\r\n179687.1716102447\r\n 30\r\n0.0\r\n 11\r\n524944.0498189723\r\n 21\r\n179557.5805502009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525136.0265943775\r\n 20\r\n179632.4260993589\r\n 30\r\n0.0\r\n 11\r\n525087.8307430644\r\n 21\r\n179589.8490442901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525118.8274663434\r\n 20\r\n179684.0153911079\r\n 30\r\n0.0\r\n 11\r\n525133.4485429193\r\n 21\r\n179616.7585725482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525121.8945987984\r\n 20\r\n179633.6277794594\r\n 30\r\n0.0\r\n 11\r\n525440.3645471604\r\n 21\r\n179386.2940176274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525309.2023733555\r\n 20\r\n179721.8067611314\r\n 30\r\n0.0\r\n 11\r\n525081.3197323827\r\n 21\r\n179384.1957480005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525072.4100933793\r\n 20\r\n179394.0909654322\r\n 30\r\n0.0\r\n 11\r\n525262.1251272731\r\n 21\r\n179249.0255401661\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524897.5967667719\r\n 20\r\n179318.2879206117\r\n 30\r\n0.0\r\n 11\r\n525090.5162898143\r\n 21\r\n179393.7129796461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524907.2792235184\r\n 20\r\n179404.9379897022\r\n 30\r\n0.0\r\n 11\r\n524956.4891729818\r\n 21\r\n179335.1547493418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525411.4637193101\r\n 20\r\n179678.027908497\r\n 30\r\n0.0\r\n 11\r\n525357.1803911208\r\n 21\r\n179606.0875771149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525552.2289648615\r\n 20\r\n179618.6483332411\r\n 30\r\n0.0\r\n 11\r\n525259.0658026489\r\n 21\r\n179248.5084815205\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524993.6561293127\r\n 20\r\n179570.7610801281\r\n 30\r\n0.0\r\n 11\r\n525317.3380443595\r\n 21\r\n179296.7807081647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524905.4551001676\r\n 20\r\n179054.3882040365\r\n 30\r\n0.0\r\n 11\r\n525320.0216286696\r\n 21\r\n179303.2190038064\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524698.8042163758\r\n 20\r\n178907.8336365132\r\n 30\r\n0.0\r\n 11\r\n525148.5700750326\r\n 21\r\n179205.6224856277\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524840.3372254955\r\n 20\r\n179120.2088408187\r\n 30\r\n0.0\r\n 11\r\n524941.6980656054\r\n 21\r\n179060.9171228345\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524893.4022210735\r\n 20\r\n179152.4441612063\r\n 30\r\n0.0\r\n 11\r\n524912.5390656945\r\n 21\r\n179044.2804794176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525048.8611393741\r\n 20\r\n179261.6952645422\r\n 30\r\n0.0\r\n 11\r\n524894.6733882119\r\n 21\r\n179131.1833158452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524836.4366792015\r\n 20\r\n179392.9755919916\r\n 30\r\n0.0\r\n 11\r\n525067.3347660931\r\n 21\r\n179150.1258322735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524900.7317197808\r\n 20\r\n179460.9664132607\r\n 30\r\n0.0\r\n 11\r\n524822.7735891135\r\n 21\r\n179367.8536032429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524758.9414431214\r\n 20\r\n179447.5370877066\r\n 30\r\n0.0\r\n 11\r\n524868.3289783231\r\n 21\r\n179498.7435141465\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524861.6167828911\r\n 20\r\n179498.1769022848\r\n 30\r\n0.0\r\n 11\r\n524901.2616749643\r\n 21\r\n179458.8589238799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524593.6079011682\r\n 20\r\n179704.1689547404\r\n 30\r\n0.0\r\n 11\r\n524948.7484144244\r\n 21\r\n179267.8287384986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524961.7251682221\r\n 20\r\n179266.2058934793\r\n 30\r\n0.0\r\n 11\r\n524942.7715240602\r\n 21\r\n179251.0232077804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525150.9289885858\r\n 20\r\n179247.3589035855\r\n 30\r\n0.0\r\n 11\r\n525175.7714535572\r\n 21\r\n179209.4512644161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525150.8454912971\r\n 20\r\n179262.8933399751\r\n 30\r\n0.0\r\n 11\r\n525152.8826788504\r\n 21\r\n179238.9142595195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525197.5598585529\r\n 20\r\n179306.7822654515\r\n 30\r\n0.0\r\n 11\r\n525146.6422094706\r\n 21\r\n179256.0944426223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524943.0087837501\r\n 20\r\n179340.6215008807\r\n 30\r\n0.0\r\n 11\r\n524624.0296722295\r\n 21\r\n179045.8171397802\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524577.5449350585\r\n 20\r\n179400.8667673345\r\n 30\r\n0.0\r\n 11\r\n524645.025011905\r\n 21\r\n179044.4526765811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524550.5260999387\r\n 20\r\n179147.397666498\r\n 30\r\n0.0\r\n 11\r\n524900.8136361586\r\n 21\r\n179331.692360306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524819.4921973141\r\n 20\r\n179431.214803694\r\n 30\r\n0.0\r\n 11\r\n524792.1378938785\r\n 21\r\n179408.5490627281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524801.7608366968\r\n 20\r\n179222.613675088\r\n 30\r\n0.0\r\n 11\r\n524854.7044420686\r\n 21\r\n179145.7448592339\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524831.4950766586\r\n 20\r\n179172.1429928104\r\n 30\r\n0.0\r\n 11\r\n524908.8410121534\r\n 21\r\n179140.9951436974\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524840.1556646274\r\n 20\r\n179182.0053063112\r\n 30\r\n0.0\r\n 11\r\n524851.9509558546\r\n 21\r\n179102.7271963276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524303.5770037772\r\n 20\r\n179361.6882295428\r\n 30\r\n0.0\r\n 11\r\n524525.5278053027\r\n 21\r\n179579.1508995571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524465.7167711658\r\n 20\r\n179557.5488468338\r\n 30\r\n0.0\r\n 11\r\n524601.6154163449\r\n 21\r\n179332.0042182991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525085.5526043257\r\n 20\r\n179499.5667174429\r\n 30\r\n0.0\r\n 11\r\n525060.0307698961\r\n 21\r\n179460.0857612072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525013.8314200389\r\n 20\r\n179504.1079223612\r\n 30\r\n0.0\r\n 11\r\n525061.9288724432\r\n 21\r\n179459.9781963227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525024.9952417884\r\n 20\r\n179552.3876762001\r\n 30\r\n0.0\r\n 11\r\n524946.2353813408\r\n 21\r\n179483.9784120883\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524863.1617511231\r\n 20\r\n179610.1194168292\r\n 30\r\n0.0\r\n 11\r\n525032.2238053618\r\n 21\r\n179363.9959657733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525130.2344513407\r\n 20\r\n179353.8140213007\r\n 30\r\n0.0\r\n 11\r\n525085.1394629966\r\n 21\r\n179301.794738543\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525061.7307595102\r\n 20\r\n179323.3813204832\r\n 30\r\n0.0\r\n 11\r\n525107.0281388681\r\n 21\r\n179283.8753794123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525070.1911873143\r\n 20\r\n179324.9578738929\r\n 30\r\n0.0\r\n 11\r\n525022.7095147707\r\n 21\r\n179271.7228601367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525022.2161847724\r\n 20\r\n179275.4074174014\r\n 30\r\n0.0\r\n 11\r\n525063.5841494132\r\n 21\r\n179237.4563792571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525108.1286975622\r\n 20\r\n179292.8435796346\r\n 30\r\n0.0\r\n 11\r\n525057.1888212336\r\n 21\r\n179234.4379566338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1DFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524621.23270646\r\n 20\r\n179560.471742546\r\n 30\r\n0.0\r\n 11\r\n524691.951804398\r\n 21\r\n179472.702842984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525238.2347363486\r\n 20\r\n179621.2230084213\r\n 30\r\n0.0\r\n 11\r\n525456.0511125839\r\n 21\r\n179470.9906017885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525211.4080794374\r\n 20\r\n179919.2887862473\r\n 30\r\n0.0\r\n 11\r\n526340.7289148488\r\n 21\r\n179276.5673308692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525774.4568484473\r\n 20\r\n179602.2365177847\r\n 30\r\n0.0\r\n 11\r\n525681.4956780933\r\n 21\r\n179487.2760223476\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525610.6341941539\r\n 20\r\n179618.4892908976\r\n 30\r\n0.0\r\n 11\r\n526040.8271050026\r\n 21\r\n179374.7298474935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525694.0061897128\r\n 20\r\n179517.42991675\r\n 30\r\n0.0\r\n 11\r\n525684.1030029122\r\n 21\r\n179436.0479461065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525614.3186654611\r\n 20\r\n179519.713355458\r\n 30\r\n0.0\r\n 11\r\n525701.3722498848\r\n 21\r\n179507.9192077916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525631.1275244898\r\n 20\r\n179524.5988424941\r\n 30\r\n0.0\r\n 11\r\n525492.8239474074\r\n 21\r\n179381.67797855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525478.070698009\r\n 20\r\n179660.5963794274\r\n 30\r\n0.0\r\n 11\r\n525790.2364742585\r\n 21\r\n179247.1288049273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525529.1476803325\r\n 20\r\n179339.4523462485\r\n 30\r\n0.0\r\n 11\r\n525686.7340141623\r\n 21\r\n179439.4842719045\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525493.6420571108\r\n 20\r\n179388.5742817606\r\n 30\r\n0.0\r\n 11\r\n525529.9852992123\r\n 21\r\n179339.3219779076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525276.8243971054\r\n 20\r\n179185.0005714228\r\n 30\r\n0.0\r\n 11\r\n525519.1112249984\r\n 21\r\n179357.172169492\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525330.3982746635\r\n 20\r\n179227.5623756174\r\n 30\r\n0.0\r\n 11\r\n525402.0700530462\r\n 21\r\n179140.0354797507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525335.3526833219\r\n 20\r\n179093.2851036883\r\n 30\r\n0.0\r\n 11\r\n525943.3607832583\r\n 21\r\n179541.8358263128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525802.1315398264\r\n 20\r\n179352.5612566525\r\n 30\r\n0.0\r\n 11\r\n526131.681874338\r\n 21\r\n179062.2504841623\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525855.5045431681\r\n 20\r\n179397.0691159753\r\n 30\r\n0.0\r\n 11\r\n525711.228158169\r\n 21\r\n179267.4780559315\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525903.204933574\r\n 20\r\n179342.3236050893\r\n 30\r\n0.0\r\n 11\r\n525855.0090822612\r\n 21\r\n179299.7465500204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525886.00580554\r\n 20\r\n179393.9128968382\r\n 30\r\n0.0\r\n 11\r\n525900.626882116\r\n 21\r\n179326.6560782785\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525889.072937995\r\n 20\r\n179343.5252851897\r\n 30\r\n0.0\r\n 11\r\n526207.5428863568\r\n 21\r\n179096.191523358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526267.3138975824\r\n 20\r\n179615.3908302213\r\n 30\r\n0.0\r\n 11\r\n525890.2062519648\r\n 21\r\n179035.9957485947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525839.588432576\r\n 20\r\n179103.9884711629\r\n 30\r\n0.0\r\n 11\r\n526029.3034664696\r\n 21\r\n178958.9230458965\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525664.7751059686\r\n 20\r\n179028.1854263421\r\n 30\r\n0.0\r\n 11\r\n525857.6946290109\r\n 21\r\n179103.6104853765\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525674.4575627151\r\n 20\r\n179114.8354954328\r\n 30\r\n0.0\r\n 11\r\n525723.6675121784\r\n 21\r\n179045.0522550722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526239.8931634749\r\n 20\r\n179340.4647148076\r\n 30\r\n0.0\r\n 11\r\n526185.6098352858\r\n 21\r\n179268.5243834258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526319.4073040581\r\n 20\r\n179328.5458389713\r\n 30\r\n0.0\r\n 11\r\n526026.2441418455\r\n 21\r\n178958.4059872507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525760.8344685093\r\n 20\r\n179280.6585858584\r\n 30\r\n0.0\r\n 11\r\n526084.5163835561\r\n 21\r\n179006.678213895\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525782.854755432\r\n 20\r\n178831.7969486525\r\n 30\r\n0.0\r\n 11\r\n526087.1999678662\r\n 21\r\n179013.1165095366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525603.615018398\r\n 20\r\n179102.8730977221\r\n 30\r\n0.0\r\n 11\r\n525834.5131052899\r\n 21\r\n178860.023338004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525667.9100589774\r\n 20\r\n179170.8639189911\r\n 30\r\n0.0\r\n 11\r\n525589.9519283101\r\n 21\r\n179077.7511089732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525526.1197823183\r\n 20\r\n179157.4345934369\r\n 30\r\n0.0\r\n 11\r\n525635.5073175197\r\n 21\r\n179208.641019877\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525628.7951220878\r\n 20\r\n179208.0744080153\r\n 30\r\n0.0\r\n 11\r\n525668.4400141611\r\n 21\r\n179168.7564296102\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525360.7862403647\r\n 20\r\n179414.0664604705\r\n 30\r\n0.0\r\n 11\r\n525715.9267536209\r\n 21\r\n178977.7262442288\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525728.9035074186\r\n 20\r\n178976.1033992095\r\n 30\r\n0.0\r\n 11\r\n525709.949863257\r\n 21\r\n178960.9207135108\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525918.1073277824\r\n 20\r\n178957.2564093159\r\n 30\r\n0.0\r\n 11\r\n525942.9497927538\r\n 21\r\n178919.3487701466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525918.0238304939\r\n 20\r\n178972.7908457055\r\n 30\r\n0.0\r\n 11\r\n525920.0610180469\r\n 21\r\n178948.8117652499\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525964.7381977496\r\n 20\r\n179016.6797711822\r\n 30\r\n0.0\r\n 11\r\n525913.8205486673\r\n 21\r\n178965.9919483526\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525710.1871229467\r\n 20\r\n179050.5190066111\r\n 30\r\n0.0\r\n 11\r\n525453.9694047169\r\n 21\r\n178804.7420158878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525344.7232742551\r\n 20\r\n179110.7642730649\r\n 30\r\n0.0\r\n 11\r\n525378.2763358416\r\n 21\r\n178909.5160670926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525347.4840498939\r\n 20\r\n178913.895114929\r\n 30\r\n0.0\r\n 11\r\n525667.9919753553\r\n 21\r\n179041.5898660366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525586.6705365106\r\n 20\r\n179141.1123094243\r\n 30\r\n0.0\r\n 11\r\n525559.3162330751\r\n 21\r\n179118.4465684587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525244.4808744201\r\n 20\r\n179281.0573723183\r\n 30\r\n0.0\r\n 11\r\n525368.7937555415\r\n 21\r\n179041.9017240295\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525852.7309435223\r\n 20\r\n179209.4642231735\r\n 30\r\n0.0\r\n 11\r\n525827.2091090929\r\n 21\r\n179169.9832669377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525781.0097592355\r\n 20\r\n179214.0054280916\r\n 30\r\n0.0\r\n 11\r\n525829.1072116399\r\n 21\r\n179169.8757020531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525792.1735809848\r\n 20\r\n179262.2851819305\r\n 30\r\n0.0\r\n 11\r\n525713.4137205373\r\n 21\r\n179193.8759178186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525630.3400903196\r\n 20\r\n179320.0169225595\r\n 30\r\n0.0\r\n 11\r\n525799.4021445584\r\n 21\r\n179073.8934715036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525388.4110456565\r\n 20\r\n179270.3692482764\r\n 30\r\n0.0\r\n 11\r\n525459.1301435945\r\n 21\r\n179182.6003487144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526037.8628631727\r\n 20\r\n179311.0930584983\r\n 30\r\n0.0\r\n 11\r\n526223.2294517805\r\n 21\r\n179180.8881075191\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525453.9796943118\r\n 20\r\n178887.2906102932\r\n 30\r\n0.0\r\n 11\r\n525336.510862941\r\n 21\r\n178764.6775143576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525112.104843077\r\n 20\r\n179189.2114775647\r\n 30\r\n0.0\r\n 11\r\n525651.8629217101\r\n 21\r\n178660.5028461757\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525442.4910881526\r\n 20\r\n178769.7456822486\r\n 30\r\n0.0\r\n 11\r\n525208.4408025759\r\n 21\r\n178398.1219055309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525494.9397722838\r\n 20\r\n178724.1522335949\r\n 30\r\n0.0\r\n 11\r\n525344.0020096121\r\n 21\r\n178845.9196755137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525448.5004200477\r\n 20\r\n178668.3330185256\r\n 30\r\n0.0\r\n 11\r\n525398.783327276\r\n 21\r\n178709.1234143126\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525496.6873149113\r\n 20\r\n178693.5379424829\r\n 30\r\n0.0\r\n 11\r\n525432.6222732513\r\n 21\r\n178668.3799226858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525447.4334000319\r\n 20\r\n178682.4758188987\r\n 30\r\n0.0\r\n 11\r\n525254.0435361588\r\n 21\r\n178328.6432902885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525564.3501928733\r\n 20\r\n178511.6244250797\r\n 30\r\n0.0\r\n 11\r\n525194.722938555\r\n 21\r\n178682.7600061523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525203.0709299968\r\n 20\r\n178693.1334353863\r\n 30\r\n0.0\r\n 11\r\n525099.213844755\r\n 21\r\n178499.6712213452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525100.363960778\r\n 20\r\n178853.6235573177\r\n 30\r\n0.0\r\n 11\r\n525205.5847867179\r\n 21\r\n178675.1986159843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525187.4493033807\r\n 20\r\n178857.8812028928\r\n 30\r\n0.0\r\n 11\r\n525126.4053077517\r\n 21\r\n178798.1739976407\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525501.2617850861\r\n 20\r\n178255.2585961814\r\n 30\r\n0.0\r\n 11\r\n525127.8717471582\r\n 21\r\n178461.7315855154\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525364.9235649414\r\n 20\r\n178799.0496326572\r\n 30\r\n0.0\r\n 11\r\n525146.0590417449\r\n 21\r\n178435.8230548363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524315.2950718407\r\n 20\r\n179499.9302652056\r\n 30\r\n0.0\r\n 11\r\n525161.4225941317\r\n 21\r\n178440.5096480434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525068.6142213994\r\n 20\r\n178695.2708080864\r\n 30\r\n0.0\r\n 11\r\n524915.1869988046\r\n 21\r\n178826.6759781821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525143.1182611162\r\n 20\r\n178899.0615197718\r\n 30\r\n0.0\r\n 11\r\n524961.4177744454\r\n 21\r\n178659.2439450341\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525115.2362263225\r\n 20\r\n178985.9003487789\r\n 30\r\n0.0\r\n 11\r\n525188.9907645544\r\n 21\r\n178889.423752566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525256.2919432123\r\n 20\r\n178966.1997378055\r\n 30\r\n0.0\r\n 11\r\n525149.2814960341\r\n 21\r\n179022.2041587109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525155.9619816731\r\n 20\r\n179021.3406031857\r\n 30\r\n0.0\r\n 11\r\n525114.613382989\r\n 21\r\n178983.8184193446\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525432.8375440702\r\n 20\r\n179215.2514314149\r\n 30\r\n0.0\r\n 11\r\n525432.8292745313\r\n 21\r\n179215.2421442479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525335.5056263998\r\n 20\r\n179105.9421037015\r\n 30\r\n0.0\r\n 11\r\n525058.7063969978\r\n 21\r\n178795.0806884354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525059.173438758\r\n 20\r\n178782.0111958253\r\n 30\r\n0.0\r\n 11\r\n525041.1628657293\r\n 21\r\n178798.3014945095\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525129.6526905607\r\n 20\r\n178812.3535875894\r\n 30\r\n0.0\r\n 11\r\n524856.1793817239\r\n 21\r\n179032.8123675689\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524939.8713919292\r\n 20\r\n179087.6518164087\r\n 30\r\n0.0\r\n 11\r\n525114.1098324377\r\n 21\r\n178852.5851621675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525199.3924246851\r\n 20\r\n178948.7349027456\r\n 30\r\n0.0\r\n 11\r\n525172.6550599113\r\n 21\r\n178972.1252224294\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524990.6328490503\r\n 20\r\n178932.978266497\r\n 30\r\n0.0\r\n 11\r\n524923.1892550706\r\n 21\r\n178868.4553881387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524945.5489577764\r\n 20\r\n178895.5769624656\r\n 30\r\n0.0\r\n 11\r\n524927.1323034953\r\n 21\r\n178814.2540930681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524956.6660133504\r\n 20\r\n178888.5997074953\r\n 30\r\n0.0\r\n 11\r\n524880.2829104158\r\n 21\r\n178864.3145432224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524767.6972013128\r\n 20\r\n178987.9125720965\r\n 30\r\n0.0\r\n 11\r\n524892.0990735233\r\n 21\r\n178859.8708712906\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525309.292804869\r\n 20\r\n178696.9770215821\r\n 30\r\n0.0\r\n 11\r\n525266.2475391527\r\n 21\r\n178715.8771548452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525302.3400723392\r\n 20\r\n178768.5047108219\r\n 30\r\n0.0\r\n 11\r\n525266.444000114\r\n 21\r\n178713.9861851008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525351.7822017535\r\n 20\r\n178765.1818527446\r\n 30\r\n0.0\r\n 11\r\n525271.6900042621\r\n 21\r\n178832.0263209903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525382.9712220381\r\n 20\r\n178934.1501266619\r\n 30\r\n0.0\r\n 11\r\n525166.9533134254\r\n 21\r\n178728.0069858551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525172.5292890373\r\n 20\r\n178629.6267682583\r\n 30\r\n0.0\r\n 11\r\n525113.9851982472\r\n 21\r\n178665.8504233187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525131.5631229839\r\n 20\r\n178692.4015905385\r\n 30\r\n0.0\r\n 11\r\n525099.7852125658\r\n 21\r\n178641.384570182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525134.4685092385\r\n 20\r\n178684.3007825545\r\n 30\r\n0.0\r\n 11\r\n525074.3436879002\r\n 21\r\n178722.686740615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525077.9024450775\r\n 20\r\n178723.7612563569\r\n 30\r\n0.0\r\n 11\r\n525047.0330050794\r\n 21\r\n178676.8713057391\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525108.8141582754\r\n 20\r\n178641.7280582332\r\n 30\r\n0.0\r\n 11\r\n525043.0334736655\r\n 21\r\n178682.7035305395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525277.2864968406\r\n 20\r\n179951.9759059466\r\n 30\r\n0.0\r\n 11\r\n525397.6936000875\r\n 21\r\n179883.749843338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525294.0384387862\r\n 20\r\n180099.9040169973\r\n 30\r\n0.0\r\n 11\r\n525712.441703776\r\n 21\r\n179966.4031726317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525346.4713448314\r\n 20\r\n180029.9665745256\r\n 30\r\n0.0\r\n 11\r\n525722.3129646027\r\n 21\r\n179883.8838082623\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525367.0909789318\r\n 20\r\n179823.9700553612\r\n 30\r\n0.0\r\n 11\r\n525515.7739640111\r\n 21\r\n180142.0179360354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525529.3928401671\r\n 20\r\n179730.5940236112\r\n 30\r\n0.0\r\n 11\r\n525563.208015364\r\n 21\r\n179814.1321880935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525580.4817299055\r\n 20\r\n179668.5095368278\r\n 30\r\n0.0\r\n 11\r\n525747.3357151855\r\n 21\r\n180110.2197326648\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525334.4952972862\r\n 20\r\n180172.2827760843\r\n 30\r\n0.0\r\n 11\r\n525735.8738520661\r\n 21\r\n180035.4234245136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525732.0503643001\r\n 20\r\n180418.4899406992\r\n 30\r\n0.0\r\n 11\r\n525731.7300309989\r\n 21\r\n180029.8125402269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525442.7963232096\r\n 20\r\n180130.0395851312\r\n 30\r\n0.0\r\n 11\r\n525463.5480601659\r\n 21\r\n180172.2234132085\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525402.0412609708\r\n 20\r\n180189.2305955932\r\n 30\r\n0.0\r\n 11\r\n525464.6158193738\r\n 21\r\n180170.6504371254\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525506.3853305195\r\n 20\r\n179710.566768304\r\n 30\r\n0.0\r\n 11\r\n526021.5022715954\r\n 21\r\n179655.2726091083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525810.9415731873\r\n 20\r\n180127.6242478806\r\n 30\r\n0.0\r\n 11\r\n525780.88439704\r\n 21\r\n179743.3309206274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525919.6974796773\r\n 20\r\n180124.5517712393\r\n 30\r\n0.0\r\n 11\r\n525847.3873537419\r\n 21\r\n179372.4594590579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525937.1719437012\r\n 20\r\n179590.8840211527\r\n 30\r\n0.0\r\n 11\r\n526355.5752086912\r\n 21\r\n179457.3831767871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525926.4214307014\r\n 20\r\n179522.2250559882\r\n 30\r\n0.0\r\n 11\r\n525963.4414776904\r\n 21\r\n179712.5905839408\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525997.8985076456\r\n 20\r\n179509.4412506651\r\n 30\r\n0.0\r\n 11\r\n526009.6533903446\r\n 21\r\n179572.666786921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525944.8043687644\r\n 20\r\n179497.6821076383\r\n 30\r\n0.0\r\n 11\r\n526010.0137117215\r\n 21\r\n179519.7047576626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526143.2653595122\r\n 20\r\n179461.2215478405\r\n 30\r\n0.0\r\n 11\r\n526365.4464695179\r\n 21\r\n179374.8638124178\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526075.4860245848\r\n 20\r\n179822.5807993095\r\n 30\r\n0.0\r\n 11\r\n526160.6387781117\r\n 21\r\n179816.2303404174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526269.8843402822\r\n 20\r\n179283.9459924196\r\n 30\r\n0.0\r\n 11\r\n526324.2307933421\r\n 21\r\n179493.875925033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525977.6288022012\r\n 20\r\n179663.2627802396\r\n 30\r\n0.0\r\n 11\r\n526379.0073569811\r\n 21\r\n179526.4034286693\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526049.3398680841\r\n 20\r\n179889.4997319409\r\n 30\r\n0.0\r\n 11\r\n526376.3294029554\r\n 21\r\n179816.2346214849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526024.0580070095\r\n 20\r\n179799.402942206\r\n 30\r\n0.0\r\n 11\r\n526063.8685273676\r\n 21\r\n179914.1312647571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525972.0353627549\r\n 20\r\n179813.8335785763\r\n 30\r\n0.0\r\n 11\r\n526026.138241068\r\n 21\r\n179800.0314247022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525657.5913718472\r\n 20\r\n179937.8757606729\r\n 30\r\n0.0\r\n 11\r\n526214.4151226173\r\n 21\r\n179857.4712891304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526222.4763599335\r\n 20\r\n179847.1734146887\r\n 30\r\n0.0\r\n 11\r\n526225.7597894024\r\n 21\r\n179871.2352862486\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526149.0212757887\r\n 20\r\n179824.9847625001\r\n 30\r\n0.0\r\n 11\r\n526228.1798567896\r\n 21\r\n180171.0884570164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525909.5190576763\r\n 20\r\n180107.530341743\r\n 30\r\n0.0\r\n 11\r\n526099.4004078702\r\n 21\r\n180182.1743046431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526079.818921055\r\n 20\r\n180206.3384580108\r\n 30\r\n0.0\r\n 11\r\n526134.9957632876\r\n 21\r\n179865.7701156398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525711.9185847874\r\n 20\r\n180106.0034193516\r\n 30\r\n0.0\r\n 11\r\n525980.9621560936\r\n 21\r\n180122.2722011088\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526085.9298281247\r\n 20\r\n179621.0195892866\r\n 30\r\n0.0\r\n 11\r\n526106.6815650811\r\n 21\r\n179663.2034173638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526045.1747658859\r\n 20\r\n179680.2105997487\r\n 30\r\n0.0\r\n 11\r\n526107.7493242888\r\n 21\r\n179661.6304412809\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526009.4961502297\r\n 20\r\n179645.8216199492\r\n 30\r\n0.0\r\n 11\r\n526027.7031022563\r\n 21\r\n179748.5418707858\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525795.056840274\r\n 20\r\n179988.0281649024\r\n 30\r\n0.0\r\n 11\r\n525906.6924360145\r\n 21\r\n179972.4697489455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526157.3721671854\r\n 20\r\n180128.6556673708\r\n 30\r\n0.0\r\n 11\r\n526202.1834097474\r\n 21\r\n180292.4386035349\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525722.6754663999\r\n 20\r\n180266.7621564555\r\n 30\r\n0.0\r\n 11\r\n526453.6159464396\r\n 21\r\n180075.4571251711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526252.3018776702\r\n 20\r\n180198.9205109824\r\n 30\r\n0.0\r\n 11\r\n526445.7753829477\r\n 21\r\n180682.057749667\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526318.3682829335\r\n 20\r\n180177.3599654693\r\n 30\r\n0.0\r\n 11\r\n526136.3410382619\r\n 21\r\n180244.2598930404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526301.4865506871\r\n 20\r\n180101.2214370023\r\n 30\r\n0.0\r\n 11\r\n526334.1850046179\r\n 21\r\n180259.4809290837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526329.704907844\r\n 20\r\n180239.5311797255\r\n 30\r\n0.0\r\n 11\r\n526534.9801261073\r\n 21\r\n180484.6040825584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526087.5384759946\r\n 20\r\n180296.8030922689\r\n 30\r\n0.0\r\n 11\r\n526317.4288490493\r\n 21\r\n180648.7166901801\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525898.6919355042\r\n 20\r\n180368.563056517\r\n 30\r\n0.0\r\n 11\r\n526019.3572832418\r\n 21\r\n180354.8758587771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525988.0841471649\r\n 20\r\n180257.6853678938\r\n 30\r\n0.0\r\n 11\r\n525885.0460868631\r\n 21\r\n180320.7003589317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525889.220156881\r\n 20\r\n180315.4134169037\r\n 30\r\n0.0\r\n 11\r\n525900.1577889329\r\n 21\r\n180370.1673126414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525865.1707519406\r\n 20\r\n179978.2441530627\r\n 30\r\n0.0\r\n 11\r\n525865.1744688462\r\n 21\r\n179978.2560198802\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525908.9184783546\r\n 20\r\n180117.9157956967\r\n 30\r\n0.0\r\n 11\r\n526306.8625173747\r\n 21\r\n181086.3192754854\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526206.5401921418\r\n 20\r\n180432.3696421253\r\n 30\r\n0.0\r\n 11\r\n525861.4479683868\r\n 21\r\n180549.1055735451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525770.026693169\r\n 20\r\n180436.6193017752\r\n 30\r\n0.0\r\n 11\r\n526039.9112933834\r\n 21\r\n180406.3982521934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525973.8238669656\r\n 20\r\n180315.4713530542\r\n 30\r\n0.0\r\n 11\r\n525940.0178018569\r\n 21\r\n180326.3866492873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526387.676675063\r\n 20\r\n180393.9615060689\r\n 30\r\n0.0\r\n 11\r\n526207.9357806169\r\n 21\r\n180377.7926894812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526181.3390144858\r\n 20\r\n180319.7845639188\r\n 30\r\n0.0\r\n 11\r\n526209.6588850731\r\n 21\r\n180378.5959792896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526080.6813073879\r\n 20\r\n180165.4867606541\r\n 30\r\n0.0\r\n 11\r\n526132.4291998959\r\n 21\r\n180394.4715974546\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525789.3590273023\r\n 20\r\n180289.1511682799\r\n 30\r\n0.0\r\n 11\r\n525865.3960941447\r\n 21\r\n180094.2260030026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526198.2549186949\r\n 20\r\n180325.3350620853\r\n 30\r\n0.0\r\n 11\r\n526090.5181339454\r\n 21\r\n180371.4108565399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525368.8224255521\r\n 20\r\n179827.6737940761\r\n 30\r\n0.0\r\n 11\r\n525405.0512025434\r\n 21\r\n179632.8619158082\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526340.1321654935\r\n 20\r\n180444.2921744968\r\n 30\r\n0.0\r\n 11\r\n525959.6088533624\r\n 21\r\n180667.0275531655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525943.4109402349\r\n 20\r\n180796.5443965836\r\n 30\r\n0.0\r\n 11\r\n526008.5505737855\r\n 21\r\n181146.5684762149\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525600.2574380592\r\n 20\r\n180032.4074553064\r\n 30\r\n0.0\r\n 11\r\n525594.054054251\r\n 21\r\n180351.3841439652\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526288.1311668085\r\n 20\r\n179495.7837681826\r\n 30\r\n0.0\r\n 11\r\n526168.5844052437\r\n 21\r\n179281.6470285089\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526267.7956939577\r\n 20\r\n179469.0424015861\r\n 30\r\n0.0\r\n 11\r\n526508.5909987458\r\n 21\r\n179449.6436152699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526406.7862068278\r\n 20\r\n179918.9227774008\r\n 30\r\n0.0\r\n 11\r\n526334.4760808925\r\n 21\r\n179166.8304652195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526424.2606708517\r\n 20\r\n179385.2550273141\r\n 30\r\n0.0\r\n 11\r\n526842.6639358418\r\n 21\r\n179251.7541829487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526413.5101578521\r\n 20\r\n179316.5960621496\r\n 30\r\n0.0\r\n 11\r\n526450.530204841\r\n 21\r\n179506.9615901023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526484.9872347962\r\n 20\r\n179303.8122568266\r\n 30\r\n0.0\r\n 11\r\n526496.7421174952\r\n 21\r\n179367.0377930824\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526476.6935768971\r\n 20\r\n179315.3175848426\r\n 30\r\n0.0\r\n 11\r\n526852.5351966685\r\n 21\r\n179169.2348185793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526543.8107781008\r\n 20\r\n179209.0480168294\r\n 30\r\n0.0\r\n 11\r\n526669.8122892258\r\n 21\r\n179478.3139683937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526656.744931586\r\n 20\r\n179480.8715374547\r\n 30\r\n0.0\r\n 11\r\n526878.6866667965\r\n 21\r\n179392.680620322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526631.9300359334\r\n 20\r\n179669.7895665503\r\n 30\r\n0.0\r\n 11\r\n526666.3744463014\r\n 21\r\n179465.5336865968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526562.5747517353\r\n 20\r\n179616.9518054711\r\n 30\r\n0.0\r\n 11\r\n526647.7275052624\r\n 21\r\n179610.601346579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526756.9730674327\r\n 20\r\n179078.316998581\r\n 30\r\n0.0\r\n 11\r\n526877.5579472513\r\n 21\r\n179395.5707429818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526464.7175293518\r\n 20\r\n179457.6337864013\r\n 30\r\n0.0\r\n 11\r\n526866.0960841318\r\n 21\r\n179320.7744348308\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526860.6184147858\r\n 20\r\n179858.7988541849\r\n 30\r\n0.0\r\n 11\r\n526861.9522630644\r\n 21\r\n179315.163550544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526772.4217413488\r\n 20\r\n179820.7069533161\r\n 30\r\n0.0\r\n 11\r\n526875.3762699339\r\n 21\r\n179764.2278175836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526772.0407339991\r\n 20\r\n179758.6193984473\r\n 30\r\n0.0\r\n 11\r\n526874.6621442611\r\n 21\r\n179797.7914169808\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526758.2159975106\r\n 20\r\n179569.1143707557\r\n 30\r\n0.0\r\n 11\r\n526790.9322939016\r\n 21\r\n179768.4554736715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1E9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526536.4285952347\r\n 20\r\n179683.8707381025\r\n 30\r\n0.0\r\n 11\r\n526963.5064845303\r\n 21\r\n179587.5356502704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526511.14673416\r\n 20\r\n179593.7739483675\r\n 30\r\n0.0\r\n 11\r\n526550.9572545182\r\n 21\r\n179708.5022709184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526459.1240899054\r\n 20\r\n179608.204584738\r\n 30\r\n0.0\r\n 11\r\n526513.2269682183\r\n 21\r\n179594.4024308638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525753.434535395\r\n 20\r\n179785.4801100221\r\n 30\r\n0.0\r\n 11\r\n526701.5038497678\r\n 21\r\n179651.842295292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526709.5650870841\r\n 20\r\n179641.5444208502\r\n 30\r\n0.0\r\n 11\r\n526712.8485165531\r\n 21\r\n179665.6062924103\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526822.969650723\r\n 20\r\n179488.9249607078\r\n 30\r\n0.0\r\n 11\r\n526868.2553233158\r\n 21\r\n179487.0960181053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526809.6007739837\r\n 20\r\n179481.013019071\r\n 30\r\n0.0\r\n 11\r\n526831.2178066143\r\n 21\r\n179491.5889508443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526795.9591495938\r\n 20\r\n179418.3841441678\r\n 30\r\n0.0\r\n 11\r\n526813.2729176061\r\n 21\r\n179488.112874319\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526636.1100029395\r\n 20\r\n179619.3557686616\r\n 30\r\n0.0\r\n 11\r\n526715.2685839402\r\n 21\r\n179965.4594631777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526396.6077848269\r\n 20\r\n179901.9013479045\r\n 30\r\n0.0\r\n 11\r\n526586.4891350208\r\n 21\r\n179976.5453108047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526566.9076482057\r\n 20\r\n180000.7094641722\r\n 30\r\n0.0\r\n 11\r\n526622.0844904381\r\n 21\r\n179660.1411218014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526494.9174763462\r\n 20\r\n179678.7541194271\r\n 30\r\n0.0\r\n 11\r\n526500.3027970688\r\n 21\r\n179713.8681059663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526664.7499560606\r\n 20\r\n179801.1704616331\r\n 30\r\n0.0\r\n 11\r\n526757.8997831164\r\n 21\r\n179795.258615892\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526723.3266480838\r\n 20\r\n179801.6016776982\r\n 30\r\n0.0\r\n 11\r\n526789.7965023669\r\n 21\r\n179751.2594418172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526719.3173330142\r\n 20\r\n179789.1038217133\r\n 30\r\n0.0\r\n 11\r\n526793.3866987752\r\n 21\r\n179819.7285939321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526793.4123204343\r\n 20\r\n179934.5500188108\r\n 30\r\n0.0\r\n 11\r\n526787.2106635646\r\n 21\r\n179808.7183932118\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526163.6968290265\r\n 20\r\n179991.1895204469\r\n 30\r\n0.0\r\n 11\r\n526468.0508832441\r\n 21\r\n179916.6432072703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526573.0185552753\r\n 20\r\n179415.3905954482\r\n 30\r\n0.0\r\n 11\r\n526593.7702922315\r\n 21\r\n179457.5744235253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526532.2634930363\r\n 20\r\n179474.5816059103\r\n 30\r\n0.0\r\n 11\r\n526594.8380514394\r\n 21\r\n179456.0014474424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526496.5848773803\r\n 20\r\n179440.1926261107\r\n 30\r\n0.0\r\n 11\r\n526514.7918294069\r\n 21\r\n179542.9128769474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526363.8900139225\r\n 20\r\n179549.3489625679\r\n 30\r\n0.0\r\n 11\r\n526661.9086167068\r\n 21\r\n179530.8113322588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526721.0133640281\r\n 20\r\n179451.967261064\r\n 30\r\n0.0\r\n 11\r\n526742.4617267929\r\n 21\r\n179517.3853891871\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526711.9136583285\r\n 20\r\n179526.3722369036\r\n 30\r\n0.0\r\n 11\r\n526769.0827439912\r\n 21\r\n179507.8177872728\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526714.9092809126\r\n 20\r\n179518.3043620523\r\n 30\r\n0.0\r\n 11\r\n526736.1739570874\r\n 21\r\n179586.3946657991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526732.759683507\r\n 20\r\n179584.9242669951\r\n 30\r\n0.0\r\n 11\r\n526786.5754879611\r\n 21\r\n179568.9414954683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526761.9551253384\r\n 20\r\n179502.2646893075\r\n 30\r\n0.0\r\n 11\r\n526785.878060321\r\n 21\r\n179575.9788736977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526282.1455674244\r\n 20\r\n179782.3991710638\r\n 30\r\n0.0\r\n 11\r\n526393.7811631652\r\n 21\r\n179766.8407551071\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526847.7872470182\r\n 20\r\n179818.1888913642\r\n 30\r\n0.0\r\n 11\r\n527137.9529271293\r\n 21\r\n180223.3699557505\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526827.1464023706\r\n 20\r\n179883.7857841154\r\n 30\r\n0.0\r\n 11\r\n526969.3070185326\r\n 21\r\n180061.1550711378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526644.4608943359\r\n 20\r\n179923.0266735323\r\n 30\r\n0.0\r\n 11\r\n526616.8198055494\r\n 21\r\n180035.3862282373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526307.4165122343\r\n 20\r\n180027.1168364971\r\n 30\r\n0.0\r\n 11\r\n527138.5741937184\r\n 21\r\n179816.0033204743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526829.4741782867\r\n 20\r\n180040.2552289311\r\n 30\r\n0.0\r\n 11\r\n526768.9318332369\r\n 21\r\n180061.9409421541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526832.6170945618\r\n 20\r\n179985.9653854469\r\n 30\r\n0.0\r\n 11\r\n526821.2737317685\r\n 21\r\n180053.8519352452\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526816.7936349946\r\n 20\r\n180033.9021858869\r\n 30\r\n0.0\r\n 11\r\n526957.2168035019\r\n 21\r\n180224.7761332145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526352.2594790912\r\n 20\r\n179772.6151592242\r\n 30\r\n0.0\r\n 11\r\n526352.2631959968\r\n 21\r\n179772.6270260417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526314.9106074973\r\n 20\r\n180249.9782180647\r\n 30\r\n0.0\r\n 11\r\n526507.1714302967\r\n 21\r\n180187.2289110584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527073.8171808937\r\n 20\r\n179977.5827294601\r\n 30\r\n0.0\r\n 11\r\n526861.4098158871\r\n 21\r\n180120.8741309933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527049.1786023032\r\n 20\r\n180034.3736699857\r\n 30\r\n0.0\r\n 11\r\n526985.7328634694\r\n 21\r\n179826.2728416301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n527002.591502373\r\n 20\r\n179513.810835256\r\n 30\r\n0.0\r\n 11\r\n526852.862144296\r\n 21\r\n179367.1654655456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526660.724472809\r\n 20\r\n179125.7359711999\r\n 30\r\n0.0\r\n 11\r\n526725.8641063598\r\n 21\r\n179475.760050831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525746.0995262102\r\n 20\r\n182025.6174555021\r\n 30\r\n0.0\r\n 11\r\n525056.4892183749\r\n 21\r\n182481.9606767529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526255.1770219457\r\n 20\r\n176496.5269798067\r\n 30\r\n0.0\r\n 11\r\n526588.3769258359\r\n 21\r\n177160.7654823236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526351.7667754745\r\n 20\r\n176673.6706001668\r\n 30\r\n0.0\r\n 11\r\n525577.3034436981\r\n 21\r\n176834.8452365946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ECA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526216.2354019187\r\n 20\r\n176698.8657335175\r\n 30\r\n0.0\r\n 11\r\n526269.3892037421\r\n 21\r\n176836.823582357\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ECB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526377.1301782186\r\n 20\r\n176733.7209433581\r\n 30\r\n0.0\r\n 11\r\n525892.8589853867\r\n 21\r\n176833.5508917015\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ECC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526266.7460571489\r\n 20\r\n176804.2846207156\r\n 30\r\n0.0\r\n 11\r\n526251.1719546794\r\n 21\r\n176884.7740336025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ECD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526343.2823493881\r\n 20\r\n176826.5895884126\r\n 30\r\n0.0\r\n 11\r\n526256.8146720737\r\n 21\r\n176811.0728471291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ECE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526328.1489277797\r\n 20\r\n176815.0700631957\r\n 30\r\n0.0\r\n 11\r\n526415.8642461339\r\n 21\r\n176993.564532887\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ECF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526446.5501364223\r\n 20\r\n176783.258144649\r\n 30\r\n0.0\r\n 11\r\n526092.1384880852\r\n 21\r\n177031.9579734428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526368.9639172092\r\n 20\r\n177024.2979221347\r\n 30\r\n0.0\r\n 11\r\n526249.7236978589\r\n 21\r\n176880.6956629269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526417.8419793417\r\n 20\r\n176988.4573184709\r\n 30\r\n0.0\r\n 11\r\n526368.1267487453\r\n 21\r\n177024.1646920515\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526561.6444323391\r\n 20\r\n177248.7898130673\r\n 30\r\n0.0\r\n 11\r\n526383.958226091\r\n 21\r\n177010.5177453355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526523.7346062075\r\n 20\r\n177191.8291896897\r\n 30\r\n0.0\r\n 11\r\n526428.6418707171\r\n 21\r\n177253.1086558552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526477.7731172824\r\n 20\r\n177318.0926977102\r\n 30\r\n0.0\r\n 11\r\n526002.9071639054\r\n 21\r\n176654.219553631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526113.2047176925\r\n 20\r\n176927.9689911812\r\n 30\r\n0.0\r\n 11\r\n525710.4109407036\r\n 21\r\n177103.0145304551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526076.0838334604\r\n 20\r\n176869.2181019876\r\n 30\r\n0.0\r\n 11\r\n526173.577774299\r\n 21\r\n177036.861919683\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526013.8731623593\r\n 20\r\n176906.6644717475\r\n 30\r\n0.0\r\n 11\r\n526046.6602886157\r\n 21\r\n176961.9876138668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526046.0877021004\r\n 20\r\n176862.852504689\r\n 30\r\n0.0\r\n 11\r\n526011.5139015976\r\n 21\r\n176922.3664345021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1ED9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526027.6910453359\r\n 20\r\n176909.8618838492\r\n 30\r\n0.0\r\n 11\r\n525648.6434118033\r\n 21\r\n177047.4118357381\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525876.5253984999\r\n 20\r\n176768.4098338997\r\n 30\r\n0.0\r\n 11\r\n525989.6849763969\r\n 21\r\n177159.6982239322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526001.2034243672\r\n 20\r\n177153.0182275587\r\n 30\r\n0.0\r\n 11\r\n525776.1000689673\r\n 21\r\n177232.7944839307\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526144.2802689023\r\n 20\r\n177278.8546981125\r\n 30\r\n0.0\r\n 11\r\n525983.856499181\r\n 21\r\n177147.8161693907\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526161.6826575419\r\n 20\r\n177193.4196859003\r\n 30\r\n0.0\r\n 11\r\n526093.4161965302\r\n 21\r\n177244.7130583994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525765.760308933\r\n 20\r\n176778.6599923234\r\n 30\r\n0.0\r\n 11\r\n525795.3209390993\r\n 21\r\n176863.7967067469\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525613.560714316\r\n 20\r\n176791.9291939231\r\n 30\r\n0.0\r\n 11\r\n525778.8526571896\r\n 21\r\n177234.2262921855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526130.4185050208\r\n 20\r\n177009.0808133312\r\n 30\r\n0.0\r\n 11\r\n525738.2257169645\r\n 21\r\n177170.3881081017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526055.738486585\r\n 20\r\n177527.5817907187\r\n 30\r\n0.0\r\n 11\r\n525737.6495586863\r\n 21\r\n177163.4367544813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526207.3805466062\r\n 20\r\n177730.5288642783\r\n 30\r\n0.0\r\n 11\r\n525870.8327531437\r\n 21\r\n177308.9803985171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526137.9265610156\r\n 20\r\n177484.9459577887\r\n 30\r\n0.0\r\n 11\r\n526023.2532773761\r\n 21\r\n177510.2355949675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526097.3289771107\r\n 20\r\n177437.968880216\r\n 30\r\n0.0\r\n 11\r\n526045.8921695055\r\n 21\r\n177535.0248213197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525982.9452194781\r\n 20\r\n177286.2466509642\r\n 30\r\n0.0\r\n 11\r\n526089.5884684561\r\n 21\r\n177457.8113583155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526225.4256337584\r\n 20\r\n177226.5647915325\r\n 30\r\n0.0\r\n 11\r\n525931.0934040827\r\n 21\r\n177386.7474088776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526185.12413629\r\n 20\r\n177142.1112935483\r\n 30\r\n0.0\r\n 11\r\n526230.7113104238\r\n 21\r\n177254.669167911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526315.9341363822\r\n 20\r\n177198.4457698113\r\n 30\r\n0.0\r\n 11\r\n526227.5644827577\r\n 21\r\n177116.1139091223\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526233.7781151948\r\n 20\r\n177118.7149451577\r\n 30\r\n0.0\r\n 11\r\n526183.9724349232\r\n 21\r\n177143.9541033457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526552.1051833143\r\n 20\r\n177005.0075836561\r\n 30\r\n0.0\r\n 11\r\n526080.1018509581\r\n 21\r\n177311.1618302548\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526067.253986068\r\n 20\r\n177308.720082347\r\n 30\r\n0.0\r\n 11\r\n526080.6275394143\r\n 21\r\n177328.9908160026\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525881.4082668052\r\n 20\r\n177268.5372091289\r\n 30\r\n0.0\r\n 11\r\n525846.1225825818\r\n 21\r\n177296.9811480634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525886.2595165639\r\n 20\r\n177253.7794633145\r\n 30\r\n0.0\r\n 11\r\n525876.9550485725\r\n 21\r\n177275.9734559256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525855.2852228508\r\n 20\r\n177197.6629504452\r\n 30\r\n0.0\r\n 11\r\n525888.1711318466\r\n 21\r\n177261.5407976287\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526107.9240993181\r\n 20\r\n177243.6514450411\r\n 30\r\n0.0\r\n 11\r\n526320.9250431739\r\n 21\r\n177622.1853045925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526325.353944576\r\n 20\r\n177590.736076287\r\n 30\r\n0.0\r\n 11\r\n526135.2587465105\r\n 21\r\n177656.903499832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526474.2247281625\r\n 20\r\n177298.5801819529\r\n 30\r\n0.0\r\n 11\r\n526300.5256348284\r\n 21\r\n177617.0345583299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526422.077933941\r\n 20\r\n177548.0943386304\r\n 30\r\n0.0\r\n 11\r\n526145.3364330091\r\n 21\r\n177265.1101803126\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526253.2970288973\r\n 20\r\n177195.3792482302\r\n 30\r\n0.0\r\n 11\r\n526272.3664885074\r\n 21\r\n177225.3517262752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526206.0940969802\r\n 20\r\n177399.3417821021\r\n 30\r\n0.0\r\n 11\r\n526132.0979797496\r\n 21\r\n177456.2312788077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526162.294088263\r\n 20\r\n177438.2387489769\r\n 30\r\n0.0\r\n 11\r\n526079.1197531001\r\n 21\r\n177444.1219634151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526157.0816685246\r\n 20\r\n177426.1929326067\r\n 30\r\n0.0\r\n 11\r\n526121.5043960536\r\n 21\r\n177498.0149717119\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526226.6183319566\r\n 20\r\n177628.0267985385\r\n 30\r\n0.0\r\n 11\r\n526118.902231297\r\n 21\r\n177485.6619692671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526696.7584575979\r\n 20\r\n177276.0780754461\r\n 30\r\n0.0\r\n 11\r\n526578.4914040608\r\n 21\r\n177144.8938979601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526628.7751494532\r\n 20\r\n177183.8240075886\r\n 30\r\n0.0\r\n 11\r\n526430.1651325173\r\n 21\r\n177356.7195899359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526021.0958195116\r\n 20\r\n177048.6048545089\r\n 30\r\n0.0\r\n 11\r\n526033.2561919037\r\n 21\r\n177094.0166952692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526090.744449026\r\n 20\r\n177066.3141521915\r\n 30\r\n0.0\r\n 11\r\n526031.4168155517\r\n 21\r\n177093.5360102175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526094.9506934654\r\n 20\r\n177016.939330121\r\n 30\r\n0.0\r\n 11\r\n526148.8891460266\r\n 21\r\n177106.2342704555\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526266.6937747585\r\n 20\r\n177011.7099319813\r\n 30\r\n0.0\r\n 11\r\n526030.2023995345\r\n 21\r\n177194.0024463306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525933.8026293408\r\n 20\r\n177173.5857123843\r\n 30\r\n0.0\r\n 11\r\n525960.7383942654\r\n 21\r\n177236.9420721305\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1EFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525989.6462154662\r\n 20\r\n177223.5897018464\r\n 30\r\n0.0\r\n 11\r\n525934.4035908969\r\n 21\r\n177247.2714329343\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F00\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525982.0791010418\r\n 20\r\n177219.4905386911\r\n 30\r\n0.0\r\n 11\r\n526010.9127192368\r\n 21\r\n177284.7369821109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F01\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526012.5140018397\r\n 20\r\n177281.3821004813\r\n 30\r\n0.0\r\n 11\r\n525961.4884440385\r\n 21\r\n177304.7911210896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F02\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525936.1110470527\r\n 20\r\n177238.398753624\r\n 30\r\n0.0\r\n 11\r\n525966.6473939993\r\n 21\r\n177309.6280966901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F03\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526481.6757723958\r\n 20\r\n177133.2718294049\r\n 30\r\n0.0\r\n 11\r\n526387.4153207091\r\n 21\r\n177195.0742386724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F04\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525913.1651616291\r\n 20\r\n176885.9301494603\r\n 30\r\n0.0\r\n 11\r\n525659.7319104015\r\n 21\r\n176961.9915518347\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F05\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525397.0355684111\r\n 20\r\n176739.2847153854\r\n 30\r\n0.0\r\n 11\r\n525450.1893702347\r\n 21\r\n176877.2425642249\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F06\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525557.930344711\r\n 20\r\n176774.139925226\r\n 30\r\n0.0\r\n 11\r\n525073.6591518792\r\n 21\r\n176873.9698735696\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F07\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525447.5462236413\r\n 20\r\n176844.7036025835\r\n 30\r\n0.0\r\n 11\r\n525431.9721211719\r\n 21\r\n176925.1930154706\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F08\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525524.0825158807\r\n 20\r\n176867.0085702805\r\n 30\r\n0.0\r\n 11\r\n525437.6148385663\r\n 21\r\n176851.4918289969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F09\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525509.5870126812\r\n 20\r\n176857.1960215582\r\n 30\r\n0.0\r\n 11\r\n525597.3023310353\r\n 21\r\n177035.6904912493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525697.0190445365\r\n 20\r\n176774.7887669079\r\n 30\r\n0.0\r\n 11\r\n525272.9386545777\r\n 21\r\n177072.376955311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525549.7640837018\r\n 20\r\n177064.7169040027\r\n 30\r\n0.0\r\n 11\r\n525430.5238643515\r\n 21\r\n176921.1146447949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525598.6421458342\r\n 20\r\n177028.8763003388\r\n 30\r\n0.0\r\n 11\r\n525548.9269152378\r\n 21\r\n177064.5836739195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525742.4445988317\r\n 20\r\n177289.2087949354\r\n 30\r\n0.0\r\n 11\r\n525564.7583925835\r\n 21\r\n177050.9367272036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525704.5347726999\r\n 20\r\n177232.2481715577\r\n 30\r\n0.0\r\n 11\r\n525609.4420372094\r\n 21\r\n177293.5276377232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F0F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525658.5732837748\r\n 20\r\n177358.5116795782\r\n 30\r\n0.0\r\n 11\r\n525217.744042467\r\n 21\r\n176744.8821656507\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F10\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525294.004884185\r\n 20\r\n176968.3879730492\r\n 30\r\n0.0\r\n 11\r\n524709.4042916746\r\n 21\r\n177247.8133178601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F11\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525256.8839999527\r\n 20\r\n176909.6370838556\r\n 30\r\n0.0\r\n 11\r\n525354.3779407914\r\n 21\r\n177077.280901551\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F12\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525194.6733288519\r\n 20\r\n176947.0834536155\r\n 30\r\n0.0\r\n 11\r\n525227.4604551082\r\n 21\r\n177002.4065957346\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F13\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525226.887868593\r\n 20\r\n176903.2714865569\r\n 30\r\n0.0\r\n 11\r\n525192.3140680902\r\n 21\r\n176962.78541637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F14\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525208.4912118285\r\n 20\r\n176950.2808657172\r\n 30\r\n0.0\r\n 11\r\n525076.3479310441\r\n 21\r\n176998.2334191865\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F15\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525057.3255649925\r\n 20\r\n176808.8288157677\r\n 30\r\n0.0\r\n 11\r\n525170.4851428896\r\n 21\r\n177200.1172058003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F16\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525182.0035908596\r\n 20\r\n177193.4372094267\r\n 30\r\n0.0\r\n 11\r\n524956.9002354598\r\n 21\r\n177273.2134657988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F17\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525325.0804353948\r\n 20\r\n177319.2736799805\r\n 30\r\n0.0\r\n 11\r\n525164.6566656736\r\n 21\r\n177188.2351512587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F18\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525342.4828240345\r\n 20\r\n177233.8386677683\r\n 30\r\n0.0\r\n 11\r\n525274.2163630228\r\n 21\r\n177285.1320402674\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F19\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524933.259545622\r\n 20\r\n176826.0690141637\r\n 30\r\n0.0\r\n 11\r\n524962.8201757881\r\n 21\r\n176911.205728587\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525311.2186715134\r\n 20\r\n177049.4997951991\r\n 30\r\n0.0\r\n 11\r\n524919.025883457\r\n 21\r\n177210.8070899695\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525318.7267275081\r\n 20\r\n177525.3649396567\r\n 30\r\n0.0\r\n 11\r\n525204.0534438687\r\n 21\r\n177550.6545768355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525278.1291436034\r\n 20\r\n177478.3878620838\r\n 30\r\n0.0\r\n 11\r\n525226.6923359981\r\n 21\r\n177575.4438031876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525163.7453859706\r\n 20\r\n177326.6656328321\r\n 30\r\n0.0\r\n 11\r\n525270.3886349485\r\n 21\r\n177498.2303401834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525406.2258002512\r\n 20\r\n177266.9837734004\r\n 30\r\n0.0\r\n 11\r\n525034.4753566237\r\n 21\r\n177479.6120728989\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F1F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525365.9243027826\r\n 20\r\n177182.5302754163\r\n 30\r\n0.0\r\n 11\r\n525411.5114769163\r\n 21\r\n177295.0881497791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F20\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525496.7343028748\r\n 20\r\n177238.8647516793\r\n 30\r\n0.0\r\n 11\r\n525408.3646492504\r\n 21\r\n177156.5328909903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F21\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525414.5782816872\r\n 20\r\n177159.1339270254\r\n 30\r\n0.0\r\n 11\r\n525364.7726014158\r\n 21\r\n177184.3730852137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F22\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525732.9053498066\r\n 20\r\n177045.4265655241\r\n 30\r\n0.0\r\n 11\r\n525260.9020174507\r\n 21\r\n177351.580812123\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F23\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525248.0541525605\r\n 20\r\n177349.139064215\r\n 30\r\n0.0\r\n 11\r\n525261.427705907\r\n 21\r\n177369.4097978704\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F24\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525062.2084332978\r\n 20\r\n177308.9561909968\r\n 30\r\n0.0\r\n 11\r\n525000.2989745414\r\n 21\r\n177355.4359634337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F25\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525067.0596830563\r\n 20\r\n177294.1984451826\r\n 30\r\n0.0\r\n 11\r\n525057.755215065\r\n 21\r\n177316.3924377936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F26\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525036.0853893436\r\n 20\r\n177238.0819323134\r\n 30\r\n0.0\r\n 11\r\n525068.971298339\r\n 21\r\n177301.9597794967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F27\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525288.7242658106\r\n 20\r\n177284.0704269092\r\n 30\r\n0.0\r\n 11\r\n525457.0581157747\r\n 21\r\n177596.6685127321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F28\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525655.024894655\r\n 20\r\n177338.9991638207\r\n 30\r\n0.0\r\n 11\r\n525561.2756183285\r\n 21\r\n177520.2109778318\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F29\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525591.9243254799\r\n 20\r\n177525.5022615888\r\n 30\r\n0.0\r\n 11\r\n525326.1365995015\r\n 21\r\n177305.5291621807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525434.0971953899\r\n 20\r\n177235.7982300982\r\n 30\r\n0.0\r\n 11\r\n525453.1666549999\r\n 21\r\n177265.7707081433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525386.8942634725\r\n 20\r\n177439.76076397\r\n 30\r\n0.0\r\n 11\r\n525312.8981462424\r\n 21\r\n177496.6502606758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525343.0942547557\r\n 20\r\n177478.6577308449\r\n 30\r\n0.0\r\n 11\r\n525259.9199195926\r\n 21\r\n177484.540945283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525337.8818350173\r\n 20\r\n177466.6119144748\r\n 30\r\n0.0\r\n 11\r\n525302.304562546\r\n 21\r\n177538.43395358\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525377.8945772925\r\n 20\r\n177624.8637513252\r\n 30\r\n0.0\r\n 11\r\n525299.7023977896\r\n 21\r\n177526.0809511351\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F2F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525802.7306519567\r\n 20\r\n177207.7311645296\r\n 30\r\n0.0\r\n 11\r\n525610.9652990102\r\n 21\r\n177397.138571804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F30\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525201.8959860041\r\n 20\r\n177089.0238363769\r\n 30\r\n0.0\r\n 11\r\n525214.0563583964\r\n 21\r\n177134.4356771372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F31\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525271.5446155183\r\n 20\r\n177106.7331340595\r\n 30\r\n0.0\r\n 11\r\n525212.2169820442\r\n 21\r\n177133.9549920855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F32\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525275.750859958\r\n 20\r\n177057.3583119888\r\n 30\r\n0.0\r\n 11\r\n525329.6893125192\r\n 21\r\n177146.6532523234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F33\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525447.4939412511\r\n 20\r\n177052.1289138494\r\n 30\r\n0.0\r\n 11\r\n525211.0025660272\r\n 21\r\n177234.4214281987\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F34\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525114.6027958332\r\n 20\r\n177214.0046942522\r\n 30\r\n0.0\r\n 11\r\n525141.5385607578\r\n 21\r\n177277.3610539983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F35\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525170.4463819585\r\n 20\r\n177264.0086837144\r\n 30\r\n0.0\r\n 11\r\n525115.2037573895\r\n 21\r\n177287.6904148024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F36\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525162.8792675344\r\n 20\r\n177259.909520559\r\n 30\r\n0.0\r\n 11\r\n525191.7128857292\r\n 21\r\n177325.1559639791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F37\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525193.314168332\r\n 20\r\n177321.8010823494\r\n 30\r\n0.0\r\n 11\r\n525142.2886105311\r\n 21\r\n177345.2101029576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F38\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525116.9112135452\r\n 20\r\n177278.8177354919\r\n 30\r\n0.0\r\n 11\r\n525147.4475604918\r\n 21\r\n177350.047078558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F39\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525662.4759388884\r\n 20\r\n177173.6908112729\r\n 30\r\n0.0\r\n 11\r\n525568.2154872015\r\n 21\r\n177235.4932205403\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525093.9653281217\r\n 20\r\n176926.3491313284\r\n 30\r\n0.0\r\n 11\r\n524840.532076894\r\n 21\r\n177002.4105337027\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524637.4032810166\r\n 20\r\n176359.3587226847\r\n 30\r\n0.0\r\n 11\r\n525300.6708435408\r\n 21\r\n178206.4147988111\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525319.0788219256\r\n 20\r\n177608.8730437454\r\n 30\r\n0.0\r\n 11\r\n525328.8875517543\r\n 21\r\n177835.970585752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525482.4051818097\r\n 20\r\n177518.1077287009\r\n 30\r\n0.0\r\n 11\r\n525556.5310875172\r\n 21\r\n177670.8763371959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525900.4939529543\r\n 20\r\n177335.7991895602\r\n 30\r\n0.0\r\n 11\r\n525192.5947924674\r\n 21\r\n177689.029228539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F3F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525457.2314948729\r\n 20\r\n177633.4987321044\r\n 30\r\n0.0\r\n 11\r\n525565.8126626467\r\n 21\r\n178059.0500187968\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F40\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525393.3133794839\r\n 20\r\n177660.7769569792\r\n 30\r\n0.0\r\n 11\r\n525574.3576694129\r\n 21\r\n177591.260892679\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F41\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525420.3612685173\r\n 20\r\n177728.1624888528\r\n 30\r\n0.0\r\n 11\r\n525480.204479206\r\n 21\r\n177704.6160276196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F42\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525382.2463826507\r\n 20\r\n177689.3743398424\r\n 30\r\n0.0\r\n 11\r\n525435.4861634504\r\n 21\r\n177732.9952208904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F43\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525425.7210150123\r\n 20\r\n177715.0312112448\r\n 30\r\n0.0\r\n 11\r\n525501.0725929005\r\n 21\r\n178111.1615401282\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F44\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525258.1774284148\r\n 20\r\n177841.2839282224\r\n 30\r\n0.0\r\n 11\r\n525666.3009968047\r\n 21\r\n177792.387080208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F45\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525661.543062447\r\n 20\r\n177779.9508807949\r\n 30\r\n0.0\r\n 11\r\n525704.4062784762\r\n 21\r\n178014.8945259626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F46\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525808.5830059624\r\n 20\r\n177658.7689688832\r\n 30\r\n0.0\r\n 11\r\n525653.6416162046\r\n 21\r\n177796.2464130009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F47\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525727.0158142383\r\n 20\r\n177627.9667339593\r\n 30\r\n0.0\r\n 11\r\n525766.767963913\r\n 21\r\n177703.5384638431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F48\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524991.8246753834\r\n 20\r\n178155.4541019633\r\n 30\r\n0.0\r\n 11\r\n525706.2586647039\r\n 21\r\n178012.4054534317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F49\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525540.0503052236\r\n 20\r\n177629.4383357195\r\n 30\r\n0.0\r\n 11\r\n525636.7593045289\r\n 21\r\n178042.3337169034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526040.0100858348\r\n 20\r\n177785.8371415856\r\n 30\r\n0.0\r\n 11\r\n525629.8050172541\r\n 21\r\n178041.7941207417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526231.7046598897\r\n 20\r\n177687.0172746743\r\n 30\r\n0.0\r\n 11\r\n525794.7224773271\r\n 21\r\n177933.5215620383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526011.024494235\r\n 20\r\n177697.9023401254\r\n 30\r\n0.0\r\n 11\r\n526017.7060938436\r\n 21\r\n177815.1409172062\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525958.1752044581\r\n 20\r\n177730.490101728\r\n 30\r\n0.0\r\n 11\r\n526045.7879111788\r\n 21\r\n177796.7442676439\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525790.155749319\r\n 20\r\n177819.2185726607\r\n 30\r\n0.0\r\n 11\r\n525976.5296098422\r\n 21\r\n177741.2954344097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F4F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525781.8531474059\r\n 20\r\n177602.3947434703\r\n 30\r\n0.0\r\n 11\r\n525881.1030283052\r\n 21\r\n177886.4317078795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F50\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525835.0618820717\r\n 20\r\n177528.3189671136\r\n 30\r\n0.0\r\n 11\r\n525735.2379582577\r\n 21\r\n177597.4756714956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F51\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525694.774242326\r\n 20\r\n177503.738335011\r\n 30\r\n0.0\r\n 11\r\n525813.8142166504\r\n 21\r\n177483.3124818092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F52\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525807.1914493779\r\n 20\r\n177482.082209412\r\n 30\r\n0.0\r\n 11\r\n525835.0150963279\r\n 21\r\n177530.4915635056\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F53\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525603.2665140946\r\n 20\r\n177212.4971446795\r\n 30\r\n0.0\r\n 11\r\n525603.2715310418\r\n 21\r\n177212.5085230352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F54\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525662.315648034\r\n 20\r\n177346.4196263749\r\n 30\r\n0.0\r\n 11\r\n525830.2436531786\r\n 21\r\n177727.2776287684\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F55\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525825.7845710629\r\n 20\r\n177739.5717880226\r\n 30\r\n0.0\r\n 11\r\n525847.9283594355\r\n 21\r\n177729.6014716514\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F56\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525756.4829586113\r\n 20\r\n177916.6327413126\r\n 30\r\n0.0\r\n 11\r\n525778.9367416901\r\n 21\r\n177956.0023336231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F57\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525742.68754455\r\n 20\r\n177909.4904562009\r\n 30\r\n0.0\r\n 11\r\n525763.1140086971\r\n 21\r\n177922.214684864\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F58\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525682.3501668144\r\n 20\r\n177931.1207760227\r\n 30\r\n0.0\r\n 11\r\n525750.6543864948\r\n 21\r\n177908.8408311148\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F59\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525768.0331965474\r\n 20\r\n177689.0468989655\r\n 30\r\n0.0\r\n 11\r\n526096.0043194264\r\n 21\r\n177563.2507667763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526033.2038644383\r\n 20\r\n177485.3545500873\r\n 30\r\n0.0\r\n 11\r\n525795.1827360411\r\n 21\r\n177655.5347737426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525743.5580844673\r\n 20\r\n177537.8369041633\r\n 30\r\n0.0\r\n 11\r\n525776.1876994059\r\n 21\r\n177523.7904825929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525937.38473207\r\n 20\r\n177616.9574620742\r\n 30\r\n0.0\r\n 11\r\n525981.7478251474\r\n 21\r\n177699.0778381885\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525968.8002129287\r\n 20\r\n177666.3991687407\r\n 30\r\n0.0\r\n 11\r\n525961.3461323477\r\n 21\r\n177749.4474614664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525956.0773950968\r\n 20\r\n177669.6242141621\r\n 30\r\n0.0\r\n 11\r\n526021.3078160592\r\n 21\r\n177716.1982390985\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F5F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526166.4165668602\r\n 20\r\n177633.1593019857\r\n 30\r\n0.0\r\n 11\r\n526008.6979435723\r\n 21\r\n177716.7974441392\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F60\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525561.6373423731\r\n 20\r\n177743.6644239177\r\n 30\r\n0.0\r\n 11\r\n525608.4071486459\r\n 21\r\n177738.9004802636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F61\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525590.2254440928\r\n 20\r\n177677.7305839139\r\n 30\r\n0.0\r\n 11\r\n525607.6393274828\r\n 21\r\n177740.6396795464\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F62\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525542.1529911521\r\n 20\r\n177665.7054096925\r\n 30\r\n0.0\r\n 11\r\n525638.9059212225\r\n 21\r\n177626.6949808709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F63\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525564.3746808246\r\n 20\r\n177495.325748098\r\n 30\r\n0.0\r\n 11\r\n525706.6267833462\r\n 21\r\n177757.8577855168\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F64\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525671.1004532344\r\n 20\r\n177849.7688217813\r\n 30\r\n0.0\r\n 11\r\n525737.9411154572\r\n 21\r\n177833.2797458222\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F65\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525729.3688821658\r\n 20\r\n177802.6127483302\r\n 30\r\n0.0\r\n 11\r\n525743.9392788691\r\n 21\r\n177860.9246295939\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F66\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525724.1155973437\r\n 20\r\n177809.4294453208\r\n 30\r\n0.0\r\n 11\r\n525793.1247719047\r\n 21\r\n177791.3681678577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F67\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525790.068134001\r\n 20\r\n177789.2524406895\r\n 30\r\n0.0\r\n 11\r\n525805.0417143705\r\n 21\r\n177843.3577240329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F68\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525735.4523658776\r\n 20\r\n177857.8242824288\r\n 30\r\n0.0\r\n 11\r\n525810.6393939268\r\n 21\r\n177839.0360251497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F69\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525383.8344721295\r\n 20\r\n177824.2759981915\r\n 30\r\n0.0\r\n 11\r\n525418.5132004842\r\n 21\r\n178086.5947652645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526308.1239966137\r\n 20\r\n176753.3706925865\r\n 30\r\n0.0\r\n 11\r\n526351.46407407\r\n 21\r\n176011.5104619067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526940.0214358629\r\n 20\r\n176429.6370203297\r\n 30\r\n0.0\r\n 11\r\n524680.4828571335\r\n 21\r\n176882.2243582025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526192.3355979434\r\n 20\r\n176582.9287149022\r\n 30\r\n0.0\r\n 11\r\n526186.5959414836\r\n 21\r\n176435.1966904509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526326.328497571\r\n 20\r\n176487.2839683498\r\n 30\r\n0.0\r\n 11\r\n525842.057304739\r\n 21\r\n176587.1139166937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526197.0368922976\r\n 20\r\n176466.1281759423\r\n 30\r\n0.0\r\n 11\r\n526150.9002913538\r\n 21\r\n176398.3600985904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F6F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526258.5121904945\r\n 20\r\n176415.3728478937\r\n 30\r\n0.0\r\n 11\r\n526185.2305518461\r\n 21\r\n176463.8210668214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F70\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526249.168325507\r\n 20\r\n176431.9382364462\r\n 30\r\n0.0\r\n 11\r\n526259.1409477169\r\n 21\r\n176233.3059138232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F71\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526370.497744524\r\n 20\r\n176414.3309524263\r\n 30\r\n0.0\r\n 11\r\n525946.6235430839\r\n 21\r\n176326.0706404363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F72\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526203.9097136959\r\n 20\r\n176223.6264067887\r\n 30\r\n0.0\r\n 11\r\n526151.1830329954\r\n 21\r\n176402.6787340636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F73\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526262.9772598672\r\n 20\r\n176237.2145935001\r\n 30\r\n0.0\r\n 11\r\n526203.1934871118\r\n 21\r\n176224.0798610557\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F74\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526292.0988566732\r\n 20\r\n175941.234719471\r\n 30\r\n0.0\r\n 11\r\n526223.1314125833\r\n 21\r\n176230.353134325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F75\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526279.8066610718\r\n 20\r\n176008.5442244475\r\n 30\r\n0.0\r\n 11\r\n526168.2315331545\r\n 21\r\n175989.8682466451\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F76\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526187.6571765576\r\n 20\r\n175910.7515640599\r\n 30\r\n0.0\r\n 11\r\n526013.7881416039\r\n 21\r\n176701.736132844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F77\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526007.0981989844\r\n 20\r\n176413.2503998727\r\n 30\r\n0.0\r\n 11\r\n525567.9153355425\r\n 21\r\n176411.7738974628\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F78\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525996.2386453274\r\n 20\r\n176481.8922028909\r\n 30\r\n0.0\r\n 11\r\n526019.4839204014\r\n 21\r\n176289.358633614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F79\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525924.2904011676\r\n 20\r\n176472.1019848462\r\n 30\r\n0.0\r\n 11\r\n525932.5251302081\r\n 21\r\n176408.3224039468\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525971.2054875981\r\n 20\r\n176499.6017974548\r\n 30\r\n0.0\r\n 11\r\n525915.9136219851\r\n 21\r\n176458.6132000153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525935.717234424\r\n 20\r\n176463.7005078429\r\n 30\r\n0.0\r\n 11\r\n525533.1734404422\r\n 21\r\n176487.2715001471\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525852.8175313351\r\n 20\r\n176653.4038932794\r\n 30\r\n0.0\r\n 11\r\n525802.0036205032\r\n 21\r\n176249.2632733093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525815.2248326041\r\n 20\r\n176250.843319441\r\n 30\r\n0.0\r\n 11\r\n525576.923260623\r\n 21\r\n176266.5955410115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525896.8708853521\r\n 20\r\n176078.6814106625\r\n 30\r\n0.0\r\n 11\r\n525801.3494721967\r\n 21\r\n176262.481686859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F7F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525946.6426193002\r\n 20\r\n176150.2688323363\r\n 30\r\n0.0\r\n 11\r\n525863.6560382271\r\n 21\r\n176130.1554755012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F80\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525669.6796913576\r\n 20\r\n176692.4104188136\r\n 30\r\n0.0\r\n 11\r\n525663.1602053267\r\n 21\r\n176602.5238942365\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F81\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525601.9899951039\r\n 20\r\n176735.8000854975\r\n 30\r\n0.0\r\n 11\r\n525578.8851832505\r\n 21\r\n176264.1918612483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F82\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525990.8302451481\r\n 20\r\n176331.9435991444\r\n 30\r\n0.0\r\n 11\r\n525566.8173502574\r\n 21\r\n176338.8927944822\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F83\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525653.4333764499\r\n 20\r\n176004.2532276039\r\n 30\r\n0.0\r\n 11\r\n525569.0373073484\r\n 21\r\n176345.5052876603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F84\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525776.1972912831\r\n 20\r\n175638.8756795467\r\n 30\r\n0.0\r\n 11\r\n525712.6787874618\r\n 21\r\n175870.9585620065\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F85\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526379.7490696148\r\n 20\r\n176168.9147862752\r\n 30\r\n0.0\r\n 11\r\n525825.147800122\r\n 21\r\n176074.3896555292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F86\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525814.3130500861\r\n 20\r\n176081.7134494056\r\n 30\r\n0.0\r\n 11\r\n525818.5795679024\r\n 21\r\n176057.8063082598\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F87\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525659.5103779263\r\n 20\r\n176192.1191891137\r\n 30\r\n0.0\r\n 11\r\n525599.027879986\r\n 21\r\n176176.7137827821\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F88\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525669.8025604574\r\n 20\r\n176203.7551963534\r\n 30\r\n0.0\r\n 11\r\n525652.4793060129\r\n 21\r\n176187.050368067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F89\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525663.5466343454\r\n 20\r\n176267.5465223788\r\n 30\r\n0.0\r\n 11\r\n525668.4888511959\r\n 21\r\n176195.8706068711\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526163.1087802012\r\n 20\r\n175749.3538325748\r\n 30\r\n0.0\r\n 11\r\n525979.5087794271\r\n 21\r\n175614.8763002626\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526192.1149468061\r\n 20\r\n175930.0766157012\r\n 30\r\n0.0\r\n 11\r\n526158.0071352461\r\n 21\r\n175717.5680579371\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526405.4054263194\r\n 20\r\n175862.7358636809\r\n 30\r\n0.0\r\n 11\r\n526348.661430612\r\n 21\r\n176029.9976445105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526379.4495038881\r\n 20\r\n175974.3550077079\r\n 30\r\n0.0\r\n 11\r\n526128.6542323571\r\n 21\r\n175894.1019516912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525874.789192354\r\n 20\r\n176338.8771021823\r\n 30\r\n0.0\r\n 11\r\n525867.9985523191\r\n 21\r\n176292.3583194611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F8F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525931.7558665713\r\n 20\r\n176295.0667284537\r\n 30\r\n0.0\r\n 11\r\n525866.4992371829\r\n 21\r\n176293.5272581273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F90\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525955.1460984748\r\n 20\r\n176338.7526826987\r\n 30\r\n0.0\r\n 11\r\n525969.3724818535\r\n 21\r\n176235.4059215012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F91\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526114.955662\r\n 20\r\n176275.6342544645\r\n 30\r\n0.0\r\n 11\r\n525825.6510484453\r\n 21\r\n176201.7318057975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F92\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525745.1849126536\r\n 20\r\n176258.6085120067\r\n 30\r\n0.0\r\n 11\r\n525744.8683208652\r\n 21\r\n176189.7647503285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F93\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525776.7000182735\r\n 20\r\n176190.5959896947\r\n 30\r\n0.0\r\n 11\r\n525716.5954207258\r\n 21\r\n176190.6924791494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F94\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525771.3709760044\r\n 20\r\n176197.3536274314\r\n 30\r\n0.0\r\n 11\r\n525772.0500154658\r\n 21\r\n176126.0233055297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F95\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525774.8475497621\r\n 20\r\n176128.4713942915\r\n 30\r\n0.0\r\n 11\r\n525718.7240675965\r\n 21\r\n176127.1505822807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F96\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525721.6726684595\r\n 20\r\n176198.1665275917\r\n 30\r\n0.0\r\n 11\r\n525721.5494828701\r\n 21\r\n176120.6676719627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F97\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525479.1614602226\r\n 20\r\n176747.2399923062\r\n 30\r\n0.0\r\n 11\r\n525490.653625448\r\n 21\r\n176518.3417724971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F98\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525499.4599018504\r\n 20\r\n176682.7764694169\r\n 30\r\n0.0\r\n 11\r\n525178.2253902241\r\n 21\r\n176612.9265973124\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F99\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525435.5115608358\r\n 20\r\n176510.4823636649\r\n 30\r\n0.0\r\n 11\r\n525382.7848801356\r\n 21\r\n176689.5346909398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525494.5791070076\r\n 20\r\n176524.0705503761\r\n 30\r\n0.0\r\n 11\r\n525434.795334252\r\n 21\r\n176510.9358179317\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525523.7007038133\r\n 20\r\n176228.090676347\r\n 30\r\n0.0\r\n 11\r\n525454.7332597232\r\n 21\r\n176517.2090912012\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525399.3618533586\r\n 20\r\n176301.078169511\r\n 30\r\n0.0\r\n 11\r\n525257.049278716\r\n 21\r\n176935.550336463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525238.7000461245\r\n 20\r\n176700.1063567486\r\n 30\r\n0.0\r\n 11\r\n524973.2827348328\r\n 21\r\n176699.2140421064\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525227.8404924674\r\n 20\r\n176768.7481597669\r\n 30\r\n0.0\r\n 11\r\n525251.0857675414\r\n 21\r\n176576.2145904901\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1F9F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525155.8922483074\r\n 20\r\n176758.9579417224\r\n 30\r\n0.0\r\n 11\r\n525164.1269773482\r\n 21\r\n176695.1783608227\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525202.8073347379\r\n 20\r\n176786.4577543309\r\n 30\r\n0.0\r\n 11\r\n525147.5154691249\r\n 21\r\n176745.4691568915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525167.3190815642\r\n 20\r\n176750.5564647189\r\n 30\r\n0.0\r\n 11\r\n524764.7752875822\r\n 21\r\n176774.127457023\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525070.8034445501\r\n 20\r\n176831.0715042767\r\n 30\r\n0.0\r\n 11\r\n525033.6054676431\r\n 21\r\n176536.1192301853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525046.8266797438\r\n 20\r\n176537.6992763171\r\n 30\r\n0.0\r\n 11\r\n524808.5251077629\r\n 21\r\n176553.4514978876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525112.755593354\r\n 20\r\n176395.779953145\r\n 30\r\n0.0\r\n 11\r\n525032.9513193365\r\n 21\r\n176549.3376437352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525379.5573529772\r\n 20\r\n176498.9294258487\r\n 30\r\n0.0\r\n 11\r\n525095.257885367\r\n 21\r\n176417.0114323773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525222.4320922882\r\n 20\r\n176618.7995560205\r\n 30\r\n0.0\r\n 11\r\n524798.4191973975\r\n 21\r\n176625.7487513584\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524956.8013278007\r\n 20\r\n176113.092283917\r\n 30\r\n0.0\r\n 11\r\n524976.4701680052\r\n 21\r\n176476.6207072047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525041.1314063764\r\n 20\r\n176178.7608441982\r\n 30\r\n0.0\r\n 11\r\n524925.8054389438\r\n 21\r\n176200.8843377061\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FA9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525022.4222532825\r\n 20\r\n176237.9636923282\r\n 30\r\n0.0\r\n 11\r\n524936.7949349053\r\n 21\r\n176169.1627967839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FAA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525611.3509167548\r\n 20\r\n176455.7707431512\r\n 30\r\n0.0\r\n 11\r\n525296.3009969729\r\n 21\r\n176407.3107920077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FAB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525320.8538129465\r\n 20\r\n176417.4479063852\r\n 30\r\n0.0\r\n 11\r\n525139.9857252317\r\n 21\r\n176058.562690482\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FAC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525209.4191285801\r\n 20\r\n176148.0617544851\r\n 30\r\n0.0\r\n 11\r\n525059.6401223514\r\n 21\r\n176221.5272619363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FAD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525081.9842410516\r\n 20\r\n176212.0232199121\r\n 30\r\n0.0\r\n 11\r\n525003.2641276836\r\n 21\r\n176239.513690866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FAE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525081.9606900939\r\n 20\r\n176225.1484039835\r\n 30\r\n0.0\r\n 11\r\n525020.8795128013\r\n 21\r\n176173.2519937195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FAF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525056.1253922576\r\n 20\r\n176063.9739618511\r\n 30\r\n0.0\r\n 11\r\n525023.3748981102\r\n 21\r\n176185.6270081834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525611.2948584211\r\n 20\r\n176279.0835830742\r\n 30\r\n0.0\r\n 11\r\n525472.2889781802\r\n 21\r\n176224.7491658278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525106.3910394939\r\n 20\r\n176625.7330590585\r\n 30\r\n0.0\r\n 11\r\n525099.6003994591\r\n 21\r\n176579.2142763372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525163.3577137114\r\n 20\r\n176581.9226853298\r\n 30\r\n0.0\r\n 11\r\n525098.1010843228\r\n 21\r\n176580.3832150034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525186.747945615\r\n 20\r\n176625.6086395747\r\n 30\r\n0.0\r\n 11\r\n525200.9743289936\r\n 21\r\n176522.2618783774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525346.55750914\r\n 20\r\n176562.4902113408\r\n 30\r\n0.0\r\n 11\r\n525057.2528955853\r\n 21\r\n176488.5877626738\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524976.7867597936\r\n 20\r\n176545.4644688829\r\n 30\r\n0.0\r\n 11\r\n524976.4701680052\r\n 21\r\n176476.6207072047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525124.8475752318\r\n 20\r\n176409.0964892458\r\n 30\r\n0.0\r\n 11\r\n524948.1972678658\r\n 21\r\n176477.5484360255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525495.9370425737\r\n 20\r\n176365.8171089485\r\n 30\r\n0.0\r\n 11\r\n525384.9195298884\r\n 21\r\n176346.3316676994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524968.6361060145\r\n 20\r\n176158.0067721589\r\n 30\r\n0.0\r\n 11\r\n524759.3034177146\r\n 21\r\n175622.5419037983\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FB9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525008.428749703\r\n 20\r\n176101.9216376339\r\n 30\r\n0.0\r\n 11\r\n524927.6245599849\r\n 21\r\n175889.4594346649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FBA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525194.3357915465\r\n 20\r\n176120.6943316627\r\n 30\r\n0.0\r\n 11\r\n525202.001045836\r\n 21\r\n175951.0649075782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FBB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525333.8731606127\r\n 20\r\n176105.4721252761\r\n 30\r\n0.0\r\n 11\r\n524371.1220574266\r\n 21\r\n176050.7676381506\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FBC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525125.5792390395\r\n 20\r\n176024.6665509538\r\n 30\r\n0.0\r\n 11\r\n525057.0097835689\r\n 21\r\n175590.8670611235\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FBD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525056.084082703\r\n 20\r\n176024.8907673184\r\n 30\r\n0.0\r\n 11\r\n525249.860849121\r\n 21\r\n176017.1394507645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FBE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525054.2770043241\r\n 20\r\n175952.3019756577\r\n 30\r\n0.0\r\n 11\r\n525118.5536201788\r\n 21\r\n175950.261790285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FBF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525034.6095598894\r\n 20\r\n176003.0016468368\r\n 30\r\n0.0\r\n 11\r\n525066.257551652\r\n 21\r\n175941.8815998767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525064.3929867726\r\n 20\r\n175962.2430134911\r\n 30\r\n0.0\r\n 11\r\n524976.9385344599\r\n 21\r\n175568.6076282395\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524863.8983838503\r\n 20\r\n175910.6518377226\r\n 30\r\n0.0\r\n 11\r\n525254.7663220056\r\n 21\r\n175796.0483946414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525255.3145936151\r\n 20\r\n175809.3523937935\r\n 30\r\n0.0\r\n 11\r\n525201.7670636297\r\n 21\r\n175576.6112635104\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525438.2922485863\r\n 20\r\n175862.5029210243\r\n 30\r\n0.0\r\n 11\r\n525241.6127186602\r\n 21\r\n175797.5102721375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525375.5567296231\r\n 20\r\n175923.0523975084\r\n 30\r\n0.0\r\n 11\r\n525382.1806715409\r\n 21\r\n175837.9204813144\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524742.5622633709\r\n 20\r\n175676.171281405\r\n 30\r\n0.0\r\n 11\r\n525204.4528169983\r\n 21\r\n175578.1648225352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525203.2519185999\r\n 20\r\n175995.6424744553\r\n 30\r\n0.0\r\n 11\r\n525128.7833911182\r\n 21\r\n175578.1623374859\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525600.5985110734\r\n 20\r\n175654.2686996066\r\n 30\r\n0.0\r\n 11\r\n525122.6094655095\r\n 21\r\n175581.4082453863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525801.8496525614\r\n 20\r\n175652.8800890392\r\n 30\r\n0.0\r\n 11\r\n525316.9017097373\r\n 21\r\n175615.6316209963\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FC9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525608.7527508469\r\n 20\r\n175746.4977742084\r\n 30\r\n0.0\r\n 11\r\n525568.5237424624\r\n 21\r\n175636.1748182397\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FCA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525547.3241824866\r\n 20\r\n175737.4677894125\r\n 30\r\n0.0\r\n 11\r\n525601.5917047545\r\n 21\r\n175641.9657637425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FCB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525357.9121957003\r\n 20\r\n175722.4219221779\r\n 30\r\n0.0\r\n 11\r\n525559.9088859833\r\n 21\r\n175720.2845228642\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FCC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525436.036643558\r\n 20\r\n175924.8523466458\r\n 30\r\n0.0\r\n 11\r\n525414.8631771929\r\n 21\r\n175624.7203418022\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FCD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525539.1274344841\r\n 20\r\n175929.9645081115\r\n 30\r\n0.0\r\n 11\r\n525735.4989487451\r\n 21\r\n176140.9866987503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FCE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525426.207520169\r\n 20\r\n176353.5908584147\r\n 30\r\n0.0\r\n 11\r\n525426.2076281533\r\n 21\r\n176353.5784235813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FCF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525440.321241981\r\n 20\r\n176047.8798081949\r\n 30\r\n0.0\r\n 11\r\n525431.0929545699\r\n 21\r\n175791.013129566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525422.1352744367\r\n 20\r\n175781.4847649781\r\n 30\r\n0.0\r\n 11\r\n525446.4168434282\r\n 21\r\n175781.8847391607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525288.4589785783\r\n 20\r\n175646.266635299\r\n 30\r\n0.0\r\n 11\r\n525293.5121681359\r\n 21\r\n175601.2266258793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525278.6129131255\r\n 20\r\n175658.2824865316\r\n 30\r\n0.0\r\n 11\r\n525292.341856174\r\n 21\r\n175638.5173010937\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525214.6402196538\r\n 20\r\n175662.2780312479\r\n 30\r\n0.0\r\n 11\r\n525286.1871600408\r\n 21\r\n175655.7283982416\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525389.0739232269\r\n 20\r\n175850.7302177447\r\n 30\r\n0.0\r\n 11\r\n525740.0568714903\r\n 21\r\n175836.5635545971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525619.2862598824\r\n 20\r\n175914.8895411783\r\n 30\r\n0.0\r\n 11\r\n525427.2635288181\r\n 21\r\n175870.7730233485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525154.18579619\r\n 20\r\n176177.1716581862\r\n 30\r\n0.0\r\n 11\r\n525755.0764899278\r\n 21\r\n175817.2858196714\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525573.128933022\r\n 20\r\n175849.9667621131\r\n 30\r\n0.0\r\n 11\r\n525581.3980240038\r\n 21\r\n175756.9965392731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525582.429850939\r\n 20\r\n175792.1315849146\r\n 30\r\n0.0\r\n 11\r\n525542.7392790357\r\n 21\r\n175718.8019132671\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FD9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525569.4688321452\r\n 20\r\n175794.2011267442\r\n 30\r\n0.0\r\n 11\r\n525610.9619874878\r\n 21\r\n175725.626600297\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FDA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525777.0809907501\r\n 20\r\n175744.5075799035\r\n 30\r\n0.0\r\n 11\r\n525599.1431815309\r\n 21\r\n175730.0632382783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FDB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525177.9045442866\r\n 20\r\n175882.1915599004\r\n 30\r\n0.0\r\n 11\r\n525222.7454192442\r\n 21\r\n175868.0704455326\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FDC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525230.2376718728\r\n 20\r\n175931.443915932\r\n 30\r\n0.0\r\n 11\r\n525221.352372083\r\n 21\r\n175866.7766978408\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FDD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525278.6324720035\r\n 20\r\n176109.2014176325\r\n 30\r\n0.0\r\n 11\r\n525305.4602313113\r\n 21\r\n175811.8144598258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FDE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525236.4809838362\r\n 20\r\n175741.4466963524\r\n 30\r\n0.0\r\n 11\r\n525401.5150701644\r\n 21\r\n175717.8045106914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FDF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524982.7168481601\r\n 20\r\n175878.4700206413\r\n 30\r\n0.0\r\n 11\r\n524910.8256864786\r\n 21\r\n175623.8224001321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526075.4906367242\r\n 20\r\n176105.1506865437\r\n 30\r\n0.0\r\n 11\r\n526037.1321662943\r\n 21\r\n176267.0143930995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526122.7396103357\r\n 20\r\n176017.616273911\r\n 30\r\n0.0\r\n 11\r\n526276.4577789378\r\n 21\r\n176119.7037581224\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525215.8445735419\r\n 20\r\n175920.96562573\r\n 30\r\n0.0\r\n 11\r\n525332.5259441775\r\n 21\r\n175910.2114930633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525852.3074904985\r\n 20\r\n176649.3473619765\r\n 30\r\n0.0\r\n 11\r\n525757.9889398609\r\n 21\r\n176823.6121122912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524542.8023875946\r\n 20\r\n179000.7833106453\r\n 30\r\n0.0\r\n 11\r\n524431.8915657004\r\n 21\r\n179098.5405829653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524565.994524599\r\n 20\r\n179163.7684003769\r\n 30\r\n0.0\r\n 11\r\n524304.1937811976\r\n 21\r\n178744.3104435472\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524461.4872296996\r\n 20\r\n179084.7613623397\r\n 30\r\n0.0\r\n 11\r\n524380.5989865734\r\n 21\r\n179098.1101592356\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524467.151219915\r\n 20\r\n179164.2801326305\r\n 30\r\n0.0\r\n 11\r\n524451.672415497\r\n 21\r\n179077.8056560839\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524472.6979763602\r\n 20\r\n179146.0880078581\r\n 30\r\n0.0\r\n 11\r\n524335.776701389\r\n 21\r\n179290.3336914834\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FE9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524543.6498567635\r\n 20\r\n179246.07138166\r\n 30\r\n0.0\r\n 11\r\n524187.3449274755\r\n 21\r\n179000.0916697241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FEA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524290.6680611737\r\n 20\r\n179257.0261451039\r\n 30\r\n0.0\r\n 11\r\n524383.920532796\r\n 21\r\n179095.3356528147\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FEB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524341.2528787772\r\n 20\r\n179290.414617019\r\n 30\r\n0.0\r\n 11\r\n524290.5022547393\r\n 21\r\n179256.1948151342\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FEC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524147.066225208\r\n 20\r\n179515.6782332696\r\n 30\r\n0.0\r\n 11\r\n524308.7979445157\r\n 21\r\n179266.3013756385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524187.3155401592\r\n 20\r\n179460.3459625875\r\n 30\r\n0.0\r\n 11\r\n524096.8251819277\r\n 21\r\n179392.4541634975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FEE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524052.9489909405\r\n 20\r\n179461.095877851\r\n 30\r\n0.0\r\n 11\r\n524510.5819551447\r\n 21\r\n178785.2280688973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FEF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524292.1774219008\r\n 20\r\n178983.7318844501\r\n 30\r\n0.0\r\n 11\r\n523988.1394265688\r\n 21\r\n178666.8018211947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524334.3795647158\r\n 20\r\n178928.5176999585\r\n 30\r\n0.0\r\n 11\r\n524211.0296152242\r\n 21\r\n179078.1649788252\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524277.6585918697\r\n 20\r\n178883.1841643977\r\n 30\r\n0.0\r\n 11\r\n524237.1657510626\r\n 21\r\n178933.1439036428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524329.9314599481\r\n 20\r\n178898.1779061311\r\n 30\r\n0.0\r\n 11\r\n524262.1146210516\r\n 21\r\n178886.4249539442\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524279.4590697602\r\n 20\r\n178897.252412813\r\n 30\r\n0.0\r\n 11\r\n524018.8296930751\r\n 21\r\n178589.5684422194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524359.6076526764\r\n 20\r\n178706.370407703\r\n 30\r\n0.0\r\n 11\r\n524031.9742005421\r\n 21\r\n178948.3787036076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524042.2386991308\r\n 20\r\n178956.8602756267\r\n 30\r\n0.0\r\n 11\r\n523889.2509233729\r\n 21\r\n178773.4740379708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523973.9245285336\r\n 20\r\n179134.7337555477\r\n 30\r\n0.0\r\n 11\r\n524041.0924745702\r\n 21\r\n178938.7864439398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524060.085491399\r\n 20\r\n179121.3818672867\r\n 30\r\n0.0\r\n 11\r\n523988.2762647926\r\n 21\r\n179075.1784611826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524411.2137166957\r\n 20\r\n178359.7278200375\r\n 30\r\n0.0\r\n 11\r\n524241.9561798962\r\n 21\r\n178663.3477312312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FF9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524246.2261103226\r\n 20\r\n178467.9417783873\r\n 30\r\n0.0\r\n 11\r\n523888.8641942761\r\n 21\r\n178776.5525534257\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FFA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524222.0925554075\r\n 20\r\n179028.0438879628\r\n 30\r\n0.0\r\n 11\r\n523934.6193464978\r\n 21\r\n178716.2837549942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FFB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523709.9291016019\r\n 20\r\n179138.0846317387\r\n 30\r\n0.0\r\n 11\r\n523940.9379251233\r\n 21\r\n178713.3292940167\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FFC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523572.2786335773\r\n 20\r\n179350.7702628629\r\n 30\r\n0.0\r\n 11\r\n523850.7072225497\r\n 21\r\n178888.7691296246\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FFD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523778.4545626078\r\n 20\r\n179200.3498308638\r\n 30\r\n0.0\r\n 11\r\n523714.913678927\r\n 21\r\n179101.5971912518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FFE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523808.4083026672\r\n 20\r\n179145.9643264288\r\n 30\r\n0.0\r\n 11\r\n523699.5297843255\r\n 21\r\n179131.4361082373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n1FFF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523910.9619477837\r\n 20\r\n178986.0079925976\r\n 30\r\n0.0\r\n 11\r\n523787.1126615274\r\n 21\r\n179145.596794382\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2000\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524051.1410301031\r\n 20\r\n179192.6683432578\r\n 30\r\n0.0\r\n 11\r\n523798.708901256\r\n 21\r\n178972.2869632569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2001\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524116.3413454738\r\n 20\r\n179125.5451513231\r\n 30\r\n0.0\r\n 11\r\n524026.6216614344\r\n 21\r\n179207.3855070313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2002\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524108.9428978228\r\n 20\r\n179267.7776803463\r\n 30\r\n0.0\r\n 11\r\n524155.4598415749\r\n 21\r\n179156.3151085556\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2003\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524155.178662528\r\n 20\r\n179163.0453057934\r\n 30\r\n0.0\r\n 11\r\n524114.213259897\r\n 21\r\n179125.1051334082\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2004\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524372.3616001382\r\n 20\r\n179422.0685826785\r\n 30\r\n0.0\r\n 11\r\n523921.3395205944\r\n 21\r\n179085.7701256054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2005\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523919.1672955888\r\n 20\r\n179072.8739554913\r\n 30\r\n0.0\r\n 11\r\n523904.8028469463\r\n 21\r\n179092.4549970173\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2006\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523892.3058896266\r\n 20\r\n178884.6406971708\r\n 30\r\n0.0\r\n 11\r\n523853.3778947085\r\n 21\r\n178861.4297431853\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2007\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523907.8298685278\r\n 20\r\n178884.0647068877\r\n 30\r\n0.0\r\n 11\r\n523883.7859259912\r\n 21\r\n178883.0472296616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2008\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523949.6962839617\r\n 20\r\n178835.529429549\r\n 30\r\n0.0\r\n 11\r\n523901.2155219774\r\n 21\r\n178888.5528025903\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2009\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523994.310310179\r\n 20\r\n179088.4146450171\r\n 30\r\n0.0\r\n 11\r\n523713.3118281377\r\n 21\r\n179419.6202277009\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523744.3416693581\r\n 20\r\n179412.851322139\r\n 30\r\n0.0\r\n 11\r\n523616.2737920614\r\n 21\r\n179257.5679325866\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524070.0146388352\r\n 20\r\n179450.9917698515\r\n 30\r\n0.0\r\n 11\r\n523711.0573757446\r\n 21\r\n179398.7017312847\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523817.9209068757\r\n 20\r\n179488.7456151748\r\n 30\r\n0.0\r\n 11\r\n523987.1803352345\r\n 21\r\n179130.9507883419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524090.0650417751\r\n 20\r\n179207.9743582003\r\n 30\r\n0.0\r\n 11\r\n524068.5808773766\r\n 21\r\n179236.2661310338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523882.4046020887\r\n 20\r\n179234.5445255751\r\n 30\r\n0.0\r\n 11\r\n523803.3576987031\r\n 21\r\n179184.9116003569\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n200F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523830.7172395122\r\n 20\r\n179206.9794871106\r\n 30\r\n0.0\r\n 11\r\n523796.3142523012\r\n 21\r\n179131.0254436837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2010\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523840.2030354173\r\n 20\r\n179197.9080656343\r\n 30\r\n0.0\r\n 11\r\n523760.4956905026\r\n 21\r\n179189.4886366538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2011\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523675.0817546599\r\n 20\r\n179333.2122401419\r\n 30\r\n0.0\r\n 11\r\n523771.1760785405\r\n 21\r\n179182.7583140627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2012\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524168.4008082703\r\n 20\r\n179651.8593062971\r\n 30\r\n0.0\r\n 11\r\n524250.3461214321\r\n 21\r\n179495.3941343705\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2013\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524231.3024235346\r\n 20\r\n179556.068231453\r\n 30\r\n0.0\r\n 11\r\n524000.1924044534\r\n 21\r\n179429.8660908105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2014\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524147.0615027255\r\n 20\r\n178939.2523313183\r\n 30\r\n0.0\r\n 11\r\n524108.6994938733\r\n 21\r\n178966.4270661795\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2015\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524154.6430655738\r\n 20\r\n179010.7161034157\r\n 30\r\n0.0\r\n 11\r\n524108.5114544834\r\n 21\r\n178964.5352404283\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2016\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524202.4054162988\r\n 20\r\n178997.5129447023\r\n 30\r\n0.0\r\n 11\r\n524137.4010440239\r\n 21\r\n179079.1056810162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2017\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524266.9546972896\r\n 20\r\n179156.7499469993\r\n 30\r\n0.0\r\n 11\r\n524013.8766698282\r\n 21\r\n178998.287827364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2018\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523999.5435054869\r\n 20\r\n178900.7977298236\r\n 30\r\n0.0\r\n 11\r\n523949.4853209126\r\n 21\r\n178948.0602086997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2019\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523972.0461085181\r\n 20\r\n178970.5314966329\r\n 30\r\n0.0\r\n 11\r\n523930.6529734734\r\n 21\r\n178926.9519104971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523973.2621091063\r\n 20\r\n178962.0117723504\r\n 30\r\n0.0\r\n 11\r\n523922.0906002993\r\n 21\r\n179011.7103900734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523925.7927776032\r\n 20\r\n179012.0468717714\r\n 30\r\n0.0\r\n 11\r\n523886.1199414426\r\n 21\r\n178972.3271554368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523939.5663733144\r\n 20\r\n178925.4716578331\r\n 30\r\n0.0\r\n 11\r\n523883.3757110357\r\n 21\r\n178978.8448465255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524227.6212786628\r\n 20\r\n179400.568396655\r\n 30\r\n0.0\r\n 11\r\n524136.9295746451\r\n 21\r\n179333.6386919953\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524262.1270243825\r\n 20\r\n178781.5437002942\r\n 30\r\n0.0\r\n 11\r\n524102.784066827\r\n 21\r\n178570.3007793799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n201F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524188.0053421091\r\n 20\r\n178194.2972296616\r\n 30\r\n0.0\r\n 11\r\n523870.9828607271\r\n 21\r\n177694.6733340894\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2020\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524318.3542007789\r\n 20\r\n178215.8393498417\r\n 30\r\n0.0\r\n 11\r\n524109.4850426079\r\n 21\r\n178344.368125777\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2021\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524662.8767133136\r\n 20\r\n179120.3209471774\r\n 30\r\n0.0\r\n 11\r\n523981.7872581052\r\n 21\r\n177990.1379863591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2022\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524139.0807066072\r\n 20\r\n178330.5889051513\r\n 30\r\n0.0\r\n 11\r\n524058.192463481\r\n 21\r\n178343.9377020474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2023\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524144.7446968224\r\n 20\r\n178410.1076754422\r\n 30\r\n0.0\r\n 11\r\n524129.2658924044\r\n 21\r\n178323.6331988957\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2024\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524148.9122708286\r\n 20\r\n178393.1065857026\r\n 30\r\n0.0\r\n 11\r\n524011.9909958576\r\n 21\r\n178537.3522693281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2025\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524291.2842484481\r\n 20\r\n178540.2525750229\r\n 30\r\n0.0\r\n 11\r\n523864.9384043831\r\n 21\r\n178245.9192125361\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2026\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523968.2615380813\r\n 20\r\n178502.8536879156\r\n 30\r\n0.0\r\n 11\r\n524061.5140097036\r\n 21\r\n178341.1631956266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2027\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524018.8463556848\r\n 20\r\n178536.2421598306\r\n 30\r\n0.0\r\n 11\r\n523968.095731647\r\n 21\r\n178502.0223579458\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2028\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523824.6597021152\r\n 20\r\n178761.5057760814\r\n 30\r\n0.0\r\n 11\r\n523986.3914214229\r\n 21\r\n178512.1289184503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2029\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523864.9090170671\r\n 20\r\n178706.1735053991\r\n 30\r\n0.0\r\n 11\r\n523774.4186588351\r\n 21\r\n178638.2817063094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523730.542467848\r\n 20\r\n178706.9234206626\r\n 30\r\n0.0\r\n 11\r\n524152.8799091047\r\n 21\r\n178080.4230726436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523969.7708988082\r\n 20\r\n178229.5594272618\r\n 30\r\n0.0\r\n 11\r\n523665.732903476\r\n 21\r\n177912.6293640066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524011.9730416233\r\n 20\r\n178174.3452427703\r\n 30\r\n0.0\r\n 11\r\n523888.6230921318\r\n 21\r\n178323.992521637\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523955.2520687775\r\n 20\r\n178129.0117072094\r\n 30\r\n0.0\r\n 11\r\n523914.75922797\r\n 21\r\n178178.9714464547\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524007.5249368556\r\n 20\r\n178144.0054489427\r\n 30\r\n0.0\r\n 11\r\n523939.7080979591\r\n 21\r\n178132.2524967561\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n202F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523957.052546668\r\n 20\r\n178143.0799556247\r\n 30\r\n0.0\r\n 11\r\n523696.423169983\r\n 21\r\n177835.3959850311\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2030\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524037.201129584\r\n 20\r\n177952.1979505146\r\n 30\r\n0.0\r\n 11\r\n523709.5676774497\r\n 21\r\n178194.2062464195\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2031\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523719.8321760384\r\n 20\r\n178202.6878184385\r\n 30\r\n0.0\r\n 11\r\n523566.8444002805\r\n 21\r\n178019.3015807826\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2032\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523651.518005441\r\n 20\r\n178380.5612983597\r\n 30\r\n0.0\r\n 11\r\n523718.6859514777\r\n 21\r\n178184.6139867516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2033\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523737.6789683065\r\n 20\r\n178367.2094100985\r\n 30\r\n0.0\r\n 11\r\n523665.8697417005\r\n 21\r\n178321.0060039942\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2034\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523970.7490853096\r\n 20\r\n177839.4205821743\r\n 30\r\n0.0\r\n 11\r\n523901.1778382863\r\n 21\r\n177896.7087361529\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2035\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523923.8195872301\r\n 20\r\n177713.769321199\r\n 30\r\n0.0\r\n 11\r\n523566.4576711837\r\n 21\r\n178022.3800962373\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2036\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523899.6860323151\r\n 20\r\n178273.8714307745\r\n 30\r\n0.0\r\n 11\r\n523612.212823405\r\n 21\r\n177962.111297806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2037\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523360.362347059\r\n 20\r\n178437.5811898571\r\n 30\r\n0.0\r\n 11\r\n523618.5314020309\r\n 21\r\n177959.1568368285\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2038\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523456.0480395155\r\n 20\r\n178446.1773736755\r\n 30\r\n0.0\r\n 11\r\n523392.5071558344\r\n 21\r\n178347.4247340636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2039\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523486.0017795747\r\n 20\r\n178391.7918692405\r\n 30\r\n0.0\r\n 11\r\n523377.123261233\r\n 21\r\n178377.263651049\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523588.5554246914\r\n 20\r\n178231.8355354097\r\n 30\r\n0.0\r\n 11\r\n523464.706138435\r\n 21\r\n178391.4243371938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523728.7345070106\r\n 20\r\n178438.4958860697\r\n 30\r\n0.0\r\n 11\r\n523476.3023781635\r\n 21\r\n178218.1145060688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523793.9348223813\r\n 20\r\n178371.3726941348\r\n 30\r\n0.0\r\n 11\r\n523704.215138342\r\n 21\r\n178453.213049843\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523786.5363747306\r\n 20\r\n178513.6052231579\r\n 30\r\n0.0\r\n 11\r\n523833.0533184824\r\n 21\r\n178402.1426513674\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523832.7721394355\r\n 20\r\n178408.8728486055\r\n 30\r\n0.0\r\n 11\r\n523791.8067368046\r\n 21\r\n178370.93267622\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n203F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524049.9550770458\r\n 20\r\n178667.8961254901\r\n 30\r\n0.0\r\n 11\r\n523598.932997502\r\n 21\r\n178331.5976684171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2040\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523596.7607724965\r\n 20\r\n178318.7014983031\r\n 30\r\n0.0\r\n 11\r\n523582.396323854\r\n 21\r\n178338.2825398289\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2041\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523569.8993665342\r\n 20\r\n178130.4682399823\r\n 30\r\n0.0\r\n 11\r\n523530.971371616\r\n 21\r\n178107.2572859973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2042\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523585.4233454357\r\n 20\r\n178129.8922496992\r\n 30\r\n0.0\r\n 11\r\n523561.3794028986\r\n 21\r\n178128.8747724734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2043\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523627.2897608695\r\n 20\r\n178081.3569723606\r\n 30\r\n0.0\r\n 11\r\n523578.8089988852\r\n 21\r\n178134.3803454021\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2044\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523671.9037870865\r\n 20\r\n178334.242187829\r\n 30\r\n0.0\r\n 11\r\n523437.2243629574\r\n 21\r\n178600.6618120954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2045\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523747.6081157428\r\n 20\r\n178696.8193126631\r\n 30\r\n0.0\r\n 11\r\n523545.1170284044\r\n 21\r\n178671.8391625966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2046\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523550.7992131782\r\n 20\r\n178702.4178105399\r\n 30\r\n0.0\r\n 11\r\n523664.7738121421\r\n 21\r\n178376.7783311538\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2047\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523767.6585186823\r\n 20\r\n178453.801901012\r\n 30\r\n0.0\r\n 11\r\n523746.1743542842\r\n 21\r\n178482.0936738456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2048\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523559.9980789962\r\n 20\r\n178480.3720683869\r\n 30\r\n0.0\r\n 11\r\n523480.9511756107\r\n 21\r\n178430.7391431687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2049\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523508.3107164198\r\n 20\r\n178452.8070299222\r\n 30\r\n0.0\r\n 11\r\n523473.9077292088\r\n 21\r\n178376.8529864954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523517.7965123248\r\n 20\r\n178443.7356084459\r\n 30\r\n0.0\r\n 11\r\n523438.0891674102\r\n 21\r\n178435.3161794655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523383.2910629254\r\n 20\r\n178536.217755333\r\n 30\r\n0.0\r\n 11\r\n523448.7695554481\r\n 21\r\n178428.5858568744\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523922.0028546302\r\n 20\r\n178789.7426866138\r\n 30\r\n0.0\r\n 11\r\n523677.7858813611\r\n 21\r\n178675.6936336222\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523824.6549796329\r\n 20\r\n178185.0798741302\r\n 30\r\n0.0\r\n 11\r\n523786.2929707809\r\n 21\r\n178212.2546089911\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523832.2365424811\r\n 20\r\n178256.5436462275\r\n 30\r\n0.0\r\n 11\r\n523786.1049313909\r\n 21\r\n178210.3627832404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n204F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523879.9988932064\r\n 20\r\n178243.3404875143\r\n 30\r\n0.0\r\n 11\r\n523814.9945209313\r\n 21\r\n178324.933223828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2050\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523944.5481741972\r\n 20\r\n178402.577489811\r\n 30\r\n0.0\r\n 11\r\n523691.4701467358\r\n 21\r\n178244.1153701758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2051\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523677.1369823944\r\n 20\r\n178146.6252726353\r\n 30\r\n0.0\r\n 11\r\n523627.0787978201\r\n 21\r\n178193.8877515116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2052\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523649.6395854257\r\n 20\r\n178216.3590394448\r\n 30\r\n0.0\r\n 11\r\n523608.246450381\r\n 21\r\n178172.779453309\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2053\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523650.8555860139\r\n 20\r\n178207.8393151623\r\n 30\r\n0.0\r\n 11\r\n523599.6840772069\r\n 21\r\n178257.5379328851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2054\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523603.3862545109\r\n 20\r\n178257.8744145832\r\n 30\r\n0.0\r\n 11\r\n523563.7134183502\r\n 21\r\n178218.1546982485\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2055\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523617.1598502217\r\n 20\r\n178171.2992006449\r\n 30\r\n0.0\r\n 11\r\n523560.9691879433\r\n 21\r\n178224.6723893374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2056\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523905.2147555707\r\n 20\r\n178646.3959394668\r\n 30\r\n0.0\r\n 11\r\n523814.5230515527\r\n 21\r\n178579.466234807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2057\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523939.7205012899\r\n 20\r\n178027.3712431062\r\n 30\r\n0.0\r\n 11\r\n523780.3775437346\r\n 21\r\n177816.1283221916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2058\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523391.0123446939\r\n 20\r\n178408.0111781633\r\n 30\r\n0.0\r\n 11\r\n522858.9523112461\r\n 21\r\n178625.8526812025\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2059\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523519.6981161965\r\n 20\r\n178597.1474741987\r\n 30\r\n0.0\r\n 11\r\n523402.1819029408\r\n 21\r\n178719.7151586041\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523835.8588979495\r\n 20\r\n178925.8981153875\r\n 30\r\n0.0\r\n 11\r\n523284.7149343134\r\n 21\r\n178409.0693896933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523402.7468093565\r\n 20\r\n178613.6153219293\r\n 30\r\n0.0\r\n 11\r\n523035.7198233606\r\n 21\r\n178854.8548905876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523354.9680920425\r\n 20\r\n178563.1492818721\r\n 30\r\n0.0\r\n 11\r\n523483.0328498929\r\n 21\r\n178708.7821624604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523301.1704663153\r\n 20\r\n178611.9162140408\r\n 30\r\n0.0\r\n 11\r\n523344.0345082054\r\n 21\r\n178659.857006848\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523324.3072144031\r\n 20\r\n178562.7028427259\r\n 30\r\n0.0\r\n 11\r\n523301.8913304754\r\n 21\r\n178627.7780582134\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n205F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523315.3458125261\r\n 20\r\n178612.3819327488\r\n 30\r\n0.0\r\n 11\r\n522970.0413020606\r\n 21\r\n178820.6171190256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2060\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523139.6854806142\r\n 20\r\n178502.8228938208\r\n 30\r\n0.0\r\n 11\r\n523326.3569039595\r\n 21\r\n178864.852552758\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2061\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523336.366624138\r\n 20\r\n178856.0717499962\r\n 30\r\n0.0\r\n 11\r\n523130.9329078317\r\n 21\r\n178977.8615685262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2062\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523501.0718386049\r\n 20\r\n178951.8735928333\r\n 30\r\n0.0\r\n 11\r\n523318.3412608636\r\n 21\r\n178854.3214638997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2063\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523501.6290112135\r\n 20\r\n178864.6860134383\r\n 30\r\n0.0\r\n 11\r\n523444.5668437729\r\n 21\r\n178928.2094642923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2064\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522966.5922798777\r\n 20\r\n178574.2352269626\r\n 30\r\n0.0\r\n 11\r\n523012.0544690127\r\n 21\r\n178652.050908915\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2065\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523435.3169658926\r\n 20\r\n178689.8690239371\r\n 30\r\n0.0\r\n 11\r\n523081.708232544\r\n 21\r\n178923.9546707615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2066\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523462.2861582033\r\n 20\r\n179213.0258181883\r\n 30\r\n0.0\r\n 11\r\n523112.8056404958\r\n 21\r\n178938.6563428773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2067\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523621.5295212859\r\n 20\r\n179358.469027492\r\n 30\r\n0.0\r\n 11\r\n523238.6072048998\r\n 21\r\n179034.295784951\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2068\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523534.681036312\r\n 20\r\n179155.3051507301\r\n 30\r\n0.0\r\n 11\r\n523427.0603128358\r\n 21\r\n179202.2871431067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2069\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523485.7674071429\r\n 20\r\n179117.0629421416\r\n 30\r\n0.0\r\n 11\r\n523454.0645383182\r\n 21\r\n179222.2319917162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523344.2095454536\r\n 20\r\n178990.3165392215\r\n 30\r\n0.0\r\n 11\r\n523482.0090182521\r\n 21\r\n179138.0275295288\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523544.6539933986\r\n 20\r\n178907.2290588684\r\n 30\r\n0.0\r\n 11\r\n523312.7654748956\r\n 21\r\n179098.9456491675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523632.5980994354\r\n 20\r\n178931.3997911901\r\n 30\r\n0.0\r\n 11\r\n523533.0776977153\r\n 21\r\n178861.8070101844\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523606.9276528144\r\n 20\r\n178791.3074733768\r\n 30\r\n0.0\r\n 11\r\n523667.4240192958\r\n 21\r\n178895.8441684115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523666.2776660543\r\n 20\r\n178889.2063607339\r\n 30\r\n0.0\r\n 11\r\n523630.544485245\r\n 21\r\n178932.1104477491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n206F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523848.2607838725\r\n 20\r\n178604.3491488078\r\n 30\r\n0.0\r\n 11\r\n523848.2518561053\r\n 21\r\n178604.3578051187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2070\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523743.1815674026\r\n 20\r\n178706.2333457597\r\n 30\r\n0.0\r\n 11\r\n523444.3500346296\r\n 21\r\n178995.9786613726\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2071\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523431.2724968967\r\n 20\r\n178996.0668199145\r\n 30\r\n0.0\r\n 11\r\n523448.3126328807\r\n 21\r\n179013.3696618109\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2072\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523241.1644374892\r\n 20\r\n178992.5710486596\r\n 30\r\n0.0\r\n 11\r\n523212.0434267714\r\n 21\r\n179027.3000553831\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2073\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523243.0710921107\r\n 20\r\n178977.1538389934\r\n 30\r\n0.0\r\n 11\r\n523238.2328606282\r\n 21\r\n179000.7279338593\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2074\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523201.8323023783\r\n 20\r\n178928.0841731191\r\n 30\r\n0.0\r\n 11\r\n523246.4471202749\r\n 21\r\n178984.3991835094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2075\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523458.5958068072\r\n 20\r\n178924.3631072621\r\n 30\r\n0.0\r\n 11\r\n523690.464388803\r\n 21\r\n179188.2317961954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2076\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523741.7018148549\r\n 20\r\n179102.2873729164\r\n 30\r\n0.0\r\n 11\r\n523499.4508888406\r\n 21\r\n178938.1841891197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2077\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523591.893854295\r\n 20\r\n178848.8970607549\r\n 30\r\n0.0\r\n 11\r\n523616.3980502818\r\n 21\r\n178874.6174438973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2078\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523585.0129347177\r\n 20\r\n179058.1373172804\r\n 30\r\n0.0\r\n 11\r\n523523.4110875841\r\n 21\r\n179128.2590159926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2079\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523549.5590820407\r\n 20\r\n179104.7681989575\r\n 30\r\n0.0\r\n 11\r\n523469.0912701507\r\n 21\r\n179126.6202810466\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523542.1162144856\r\n 20\r\n179093.9573370996\r\n 30\r\n0.0\r\n 11\r\n523521.0952816062\r\n 21\r\n179171.3024597549\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523649.360992273\r\n 20\r\n179278.540149505\r\n 30\r\n0.0\r\n 11\r\n523516.1540374569\r\n 21\r\n179159.6855738952\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523335.6977949764\r\n 20\r\n178749.7824630303\r\n 30\r\n0.0\r\n 11\r\n523356.4080963917\r\n 21\r\n178791.9866494723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523407.4561459401\r\n 20\r\n178753.6926912383\r\n 30\r\n0.0\r\n 11\r\n523354.5104915972\r\n 21\r\n178791.870634271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523402.0375425117\r\n 20\r\n178704.4361760988\r\n 30\r\n0.0\r\n 11\r\n523472.2215485359\r\n 21\r\n178781.6187410497\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n207F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523569.5295937877\r\n 20\r\n178666.1028311331\r\n 30\r\n0.0\r\n 11\r\n523372.7418774964\r\n 21\r\n178890.6764851088\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2080\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523274.2136426055\r\n 20\r\n178889.281620349\r\n 30\r\n0.0\r\n 11\r\n523312.8897520948\r\n 21\r\n178946.2353059817\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2081\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523338.6708325046\r\n 20\r\n178927.5461697877\r\n 30\r\n0.0\r\n 11\r\n523289.0487180073\r\n 21\r\n178961.4610295014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2082\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523330.453997045\r\n 20\r\n178924.9872687913\r\n 30\r\n0.0\r\n 11\r\n523371.3575600804\r\n 21\r\n178983.4284738455\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2083\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523372.2800436911\r\n 20\r\n178979.8273128224\r\n 30\r\n0.0\r\n 11\r\n523326.7427159016\r\n 21\r\n179012.6593333595\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2084\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523289.0086319607\r\n 20\r\n178952.42564142\r\n 30\r\n0.0\r\n 11\r\n523332.7394576793\r\n 21\r\n179016.4076910938\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2085\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523198.3538800154\r\n 20\r\n178611.042650443\r\n 30\r\n0.0\r\n 11\r\n522964.4065476657\r\n 21\r\n178734.6646365355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2086\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524738.0077992766\r\n 20\r\n178705.4710425049\r\n 30\r\n0.0\r\n 11\r\n524586.8667262392\r\n 21\r\n178293.1118015007\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2087\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524758.5993848548\r\n 20\r\n178957.9025597381\r\n 30\r\n0.0\r\n 11\r\n524445.747518893\r\n 21\r\n178322.7063720054\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2088\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524459.2215830315\r\n 20\r\n178644.1973088366\r\n 30\r\n0.0\r\n 11\r\n525002.3886547115\r\n 21\r\n178361.5835693572\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2089\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524823.6695363629\r\n 20\r\n178469.1375592657\r\n 30\r\n0.0\r\n 11\r\n524726.1370328227\r\n 21\r\n178251.1394343973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524864.5810622931\r\n 20\r\n178645.0206934348\r\n 30\r\n0.0\r\n 11\r\n525061.4539381199\r\n 21\r\n178431.2255060558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524343.9905950533\r\n 20\r\n178414.3796104963\r\n 30\r\n0.0\r\n 11\r\n524729.0724628618\r\n 21\r\n178252.1444554355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524808.6039906535\r\n 20\r\n178661.9782852946\r\n 30\r\n0.0\r\n 11\r\n524654.8301096539\r\n 21\r\n178266.7709727712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525390.9100109588\r\n 20\r\n178239.0326645809\r\n 30\r\n0.0\r\n 11\r\n524649.4001813499\r\n 21\r\n178271.1492320292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525116.8958157751\r\n 20\r\n178519.6602617097\r\n 30\r\n0.0\r\n 11\r\n524857.3147946125\r\n 21\r\n178236.5020363899\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n208F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524824.6597237038\r\n 20\r\n178302.720810087\r\n 30\r\n0.0\r\n 11\r\n524820.9101242572\r\n 21\r\n178257.5535910312\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2090\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524817.3224011424\r\n 20\r\n178316.4134863543\r\n 30\r\n0.0\r\n 11\r\n524826.9711914755\r\n 21\r\n178294.3670064145\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2091\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524755.3290416091\r\n 20\r\n178332.7013119114\r\n 30\r\n0.0\r\n 11\r\n524824.2599803013\r\n 21\r\n178312.4432749316\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2092\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524761.8016675394\r\n 20\r\n178555.5680322682\r\n 30\r\n0.0\r\n 11\r\n524803.0665951361\r\n 21\r\n178533.0443627539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2093\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524822.6693148313\r\n 20\r\n178593.7737953252\r\n 30\r\n0.0\r\n 11\r\n524801.4497121466\r\n 21\r\n178532.0443363133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2094\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524441.6662571833\r\n 20\r\n178845.7581638587\r\n 30\r\n0.0\r\n 11\r\n524891.6806406799\r\n 21\r\n178608.329156404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2095\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524904.5164691505\r\n 20\r\n178758.8217562954\r\n 30\r\n0.0\r\n 11\r\n524867.3512457227\r\n 21\r\n178404.7561514077\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2096\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524292.5001459931\r\n 20\r\n178237.2916223235\r\n 30\r\n0.0\r\n 11\r\n524262.8974638588\r\n 21\r\n177997.536803959\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2097\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524743.7613223771\r\n 20\r\n178187.8571337603\r\n 30\r\n0.0\r\n 11\r\n524226.9901518362\r\n 21\r\n178250.4398286003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2098\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524736.0750984626\r\n 20\r\n178079.329675156\r\n 30\r\n0.0\r\n 11\r\n523987.7301282686\r\n 21\r\n178183.4997569488\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2099\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524202.146601295\r\n 20\r\n178084.5243154731\r\n 30\r\n0.0\r\n 11\r\n524051.0055282573\r\n 21\r\n177672.1650744688\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524134.0058635479\r\n 20\r\n178098.1796033321\r\n 30\r\n0.0\r\n 11\r\n524322.6283647658\r\n 21\r\n178053.1122077325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524118.1994916559\r\n 20\r\n178027.3096039344\r\n 30\r\n0.0\r\n 11\r\n524180.8690639548\r\n 21\r\n178012.8814921389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524108.7047100372\r\n 20\r\n178080.8550439858\r\n 30\r\n0.0\r\n 11\r\n524127.939476443\r\n 21\r\n178014.7696501053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524130.046502145\r\n 20\r\n178035.1074034045\r\n 30\r\n0.0\r\n 11\r\n523968.1415224852\r\n 21\r\n177665.8055278164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524021.02369991\r\n 20\r\n177972.5616731266\r\n 30\r\n0.0\r\n 11\r\n524284.6983858481\r\n 21\r\n177835.2438175031\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n209F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524287.8083383811\r\n 20\r\n177848.1908322338\r\n 30\r\n0.0\r\n 11\r\n524190.2758348411\r\n 21\r\n177630.1927073653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524477.6094411748\r\n 20\r\n177864.9640889815\r\n 30\r\n0.0\r\n 11\r\n524272.075554444\r\n 21\r\n177839.2210645568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524427.7633272846\r\n 20\r\n177936.4997400382\r\n 30\r\n0.0\r\n 11\r\n524417.803992296\r\n 21\r\n177851.6933050936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523881.3621119936\r\n 20\r\n177765.1408410339\r\n 30\r\n0.0\r\n 11\r\n524193.21126488\r\n 21\r\n177631.1977284036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524272.7427926718\r\n 20\r\n178041.0315582626\r\n 30\r\n0.0\r\n 11\r\n524118.9689116724\r\n 21\r\n177645.8242457393\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524656.740906261\r\n 20\r\n177628.458690205\r\n 30\r\n0.0\r\n 11\r\n524113.5389833685\r\n 21\r\n177650.2025049972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524622.4271487831\r\n 20\r\n177718.1928094959\r\n 30\r\n0.0\r\n 11\r\n524561.6286626985\r\n 21\r\n177617.7285281862\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524560.4117291013\r\n 20\r\n177721.2089921625\r\n 30\r\n0.0\r\n 11\r\n524595.1923233731\r\n 21\r\n177617.0172883553\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524371.664348211\r\n 20\r\n177743.0654572557\r\n 30\r\n0.0\r\n 11\r\n524569.4370217646\r\n 21\r\n177701.916934115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524495.7318062599\r\n 20\r\n177959.7817268529\r\n 30\r\n0.0\r\n 11\r\n524408.6525428254\r\n 21\r\n177636.196909216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524406.7893995179\r\n 20\r\n177988.8652669207\r\n 30\r\n0.0\r\n 11\r\n524519.7244190173\r\n 21\r\n177944.220593137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524423.4153081321\r\n 20\r\n178040.2284633169\r\n 30\r\n0.0\r\n 11\r\n524407.3290128842\r\n 21\r\n177986.760229771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524560.6933372315\r\n 20\r\n178349.1236382285\r\n 30\r\n0.0\r\n 11\r\n524456.725047904\r\n 21\r\n177796.2148181869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524446.0942685496\r\n 20\r\n177788.5979753106\r\n 30\r\n0.0\r\n 11\r\n524469.9950757708\r\n 21\r\n177784.2961168499\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524288.7985257223\r\n 20\r\n177681.7740830548\r\n 30\r\n0.0\r\n 11\r\n524285.0489262757\r\n 21\r\n177636.6068639992\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524281.4612031608\r\n 20\r\n177695.4667593225\r\n 30\r\n0.0\r\n 11\r\n524291.1099934939\r\n 21\r\n177673.4202793828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524219.4678436274\r\n 20\r\n177711.7545848795\r\n 30\r\n0.0\r\n 11\r\n524288.3987823195\r\n 21\r\n177691.4965478998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524427.0436683059\r\n 20\r\n177862.9287246882\r\n 30\r\n0.0\r\n 11\r\n524769.475248697\r\n 21\r\n177769.1499368164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524719.5010690223\r\n 20\r\n178090.2214557565\r\n 30\r\n0.0\r\n 11\r\n524786.0175886017\r\n 21\r\n177897.3427348676\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524810.9911650572\r\n 20\r\n177915.8808419147\r\n 30\r\n0.0\r\n 11\r\n524468.3876208303\r\n 21\r\n177875.2103215432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524492.3818808952\r\n 20\r\n178001.4726224788\r\n 30\r\n0.0\r\n 11\r\n524527.2356194102\r\n 21\r\n177994.6016224428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524607.4787635174\r\n 20\r\n177826.5968390907\r\n 30\r\n0.0\r\n 11\r\n524597.618183188\r\n 21\r\n177733.7819202675\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524605.4231027638\r\n 20\r\n177768.0546401694\r\n 30\r\n0.0\r\n 11\r\n524552.304701948\r\n 21\r\n177703.7816463328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524593.1067007006\r\n 20\r\n177772.5908557468\r\n 30\r\n0.0\r\n 11\r\n524620.5597418726\r\n 21\r\n177697.2882784462\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524735.2765859546\r\n 20\r\n177692.3886915756\r\n 30\r\n0.0\r\n 11\r\n524609.8216280412\r\n 21\r\n177703.9261125934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524726.363351182\r\n 20\r\n178287.7086387874\r\n 30\r\n0.0\r\n 11\r\n524731.1969941583\r\n 21\r\n178018.2169832271\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524225.9404695578\r\n 20\r\n177934.6213052363\r\n 30\r\n0.0\r\n 11\r\n524267.2053971543\r\n 21\r\n177912.0976357217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524286.8081168498\r\n 20\r\n177972.8270682933\r\n 30\r\n0.0\r\n 11\r\n524265.5885141649\r\n 21\r\n177911.0976092813\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524253.9646341658\r\n 20\r\n178009.9332832979\r\n 30\r\n0.0\r\n 11\r\n524355.8194426984\r\n 21\r\n177987.3824293719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524368.6552711687\r\n 20\r\n178137.8750292635\r\n 30\r\n0.0\r\n 11\r\n524337.4839301416\r\n 21\r\n177840.9119358636\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524256.2020210389\r\n 20\r\n177785.207268455\r\n 30\r\n0.0\r\n 11\r\n524320.6507359999\r\n 21\r\n177761.0013416544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524330.9262008103\r\n 20\r\n177791.1403984032\r\n 30\r\n0.0\r\n 11\r\n524309.9617375784\r\n 21\r\n177734.8104486604\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524322.7384384093\r\n 20\r\n177788.4899444518\r\n 30\r\n0.0\r\n 11\r\n524389.8647176601\r\n 21\r\n177764.3541090383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524388.540574712\r\n 20\r\n177767.8277213047\r\n 30\r\n0.0\r\n 11\r\n524370.2878131228\r\n 21\r\n177714.7388666447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524304.7162010103\r\n 20\r\n177742.1673631482\r\n 30\r\n0.0\r\n 11\r\n524377.3484529812\r\n 21\r\n177715.1369400639\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524604.9653448457\r\n 20\r\n178209.65318257\r\n 30\r\n0.0\r\n 11\r\n524584.6821974333\r\n 21\r\n178098.7786387176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524616.7122096681\r\n 20\r\n177643.0021215638\r\n 30\r\n0.0\r\n 11\r\n525046.1476847069\r\n 21\r\n177260.7352351909\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524683.1261485707\r\n 20\r\n177660.8398771929\r\n 30\r\n0.0\r\n 11\r\n524854.3010716392\r\n 21\r\n177511.278349791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524730.0863801362\r\n 20\r\n177841.6950095487\r\n 30\r\n0.0\r\n 11\r\n524891.8195255732\r\n 21\r\n177789.9718299717\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524886.5205772781\r\n 20\r\n178270.1374980642\r\n 30\r\n0.0\r\n 11\r\n524664.3607069593\r\n 21\r\n177547.9764409759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524796.2582747829\r\n 20\r\n177743.868231316\r\n 30\r\n0.0\r\n 11\r\n525270.7473973083\r\n 21\r\n177530.0606981159\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524771.912748007\r\n 20\r\n177678.7765855139\r\n 30\r\n0.0\r\n 11\r\n524846.4791452751\r\n 21\r\n177857.7999653004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524839.355750728\r\n 20\r\n177651.8723183613\r\n 30\r\n0.0\r\n 11\r\n524863.5918447558\r\n 21\r\n177711.4395698372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524784.9814290404\r\n 20\r\n177651.036753114\r\n 30\r\n0.0\r\n 11\r\n524853.2882977952\r\n 21\r\n177659.4882147568\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524833.5467029925\r\n 20\r\n177664.8111088192\r\n 30\r\n0.0\r\n 11\r\n525069.6851025939\r\n 21\r\n177449.3179554017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524901.0465769525\r\n 20\r\n177904.3281639453\r\n 30\r\n0.0\r\n 11\r\n525242.8844973097\r\n 21\r\n177659.7068234534\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524980.7580986971\r\n 20\r\n178089.9583921551\r\n 30\r\n0.0\r\n 11\r\n524961.961184173\r\n 21\r\n177969.9828049263\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524866.1857902924\r\n 20\r\n178005.3533362377\r\n 30\r\n0.0\r\n 11\r\n524933.5177864408\r\n 21\r\n178105.6236372292\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524928.058427062\r\n 20\r\n178101.6777518159\r\n 30\r\n0.0\r\n 11\r\n524982.2986856754\r\n 21\r\n178088.4257618186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524592.2139268167\r\n 20\r\n178140.017783274\r\n 30\r\n0.0\r\n 11\r\n524592.2256251614\r\n 21\r\n178140.013565991\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524729.9026557909\r\n 20\r\n178090.3806476191\r\n 30\r\n0.0\r\n 11\r\n525304.5419744521\r\n 21\r\n177825.2009968782\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525031.4395001166\r\n 20\r\n177779.6791227352\r\n 30\r\n0.0\r\n 11\r\n525186.0575622661\r\n 21\r\n178254.7713664581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525159.7267250844\r\n 20\r\n178479.6984389388\r\n 30\r\n0.0\r\n 11\r\n525012.5646530729\r\n 21\r\n177947.2602766442\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524924.525016998\r\n 20\r\n178017.1478391817\r\n 30\r\n0.0\r\n 11\r\n524936.8654889531\r\n 21\r\n178050.4600964139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524985.3770249892\r\n 20\r\n177600.3362702277\r\n 30\r\n0.0\r\n 11\r\n524976.8524993605\r\n 21\r\n177780.6014976812\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524920.025649624\r\n 20\r\n177809.6366444678\r\n 30\r\n0.0\r\n 11\r\n524977.5819220661\r\n 21\r\n177778.845847944\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524770.1396820498\r\n 20\r\n177916.7533229772\r\n 30\r\n0.0\r\n 11\r\n524996.7215091665\r\n 21\r\n177855.3320279399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524906.0587970422\r\n 20\r\n178202.5636635308\r\n 30\r\n0.0\r\n 11\r\n524708.0816721999\r\n 21\r\n178134.8693976615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524924.8530914603\r\n 20\r\n177792.5003773588\r\n 30\r\n0.0\r\n 11\r\n524975.4606124475\r\n 21\r\n177898.1842098137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524462.8484862399\r\n 20\r\n178642.3102049752\r\n 30\r\n0.0\r\n 11\r\n524266.6743453862\r\n 21\r\n178614.3835392793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526557.2525553547\r\n 20\r\n175535.8312332927\r\n 30\r\n0.0\r\n 11\r\n523999.9723634475\r\n 21\r\n176912.9282941857\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525747.934562985\r\n 20\r\n175742.1415793237\r\n 30\r\n0.0\r\n 11\r\n526031.2914894814\r\n 21\r\n175652.8044649422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526139.8954430117\r\n 20\r\n176128.0346140474\r\n 30\r\n0.0\r\n 11\r\n525830.2490952948\r\n 21\r\n175696.8619054419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526215.600250218\r\n 20\r\n175902.2688151789\r\n 30\r\n0.0\r\n 11\r\n525996.0746696981\r\n 21\r\n175977.801639612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525901.2081771194\r\n 20\r\n176101.1901361145\r\n 30\r\n0.0\r\n 11\r\n525721.8916498757\r\n 21\r\n175837.2967542493\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525472.2889781802\r\n 20\r\n176224.7491658278\r\n 30\r\n0.0\r\n 11\r\n525345.2077450251\r\n 21\r\n176037.1569429094\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526047.6612660637\r\n 20\r\n175951.2440488057\r\n 30\r\n0.0\r\n 11\r\n525864.820922853\r\n 21\r\n176112.3398447609\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525948.9023176328\r\n 20\r\n175776.5868444847\r\n 30\r\n0.0\r\n 11\r\n525700.5448251069\r\n 21\r\n175926.5019602293\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524165.3240109262\r\n 20\r\n176815.8237554785\r\n 30\r\n0.0\r\n 11\r\n521210.3972538704\r\n 21\r\n178690.0947664428\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524841.8039351653\r\n 20\r\n177414.2638539312\r\n 30\r\n0.0\r\n 11\r\n524993.9825398388\r\n 21\r\n177620.3972736916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524639.5732319613\r\n 20\r\n176760.1462516073\r\n 30\r\n0.0\r\n 11\r\n524236.7794549726\r\n 21\r\n176935.191790881\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524516.5374395311\r\n 20\r\n176553.6620460306\r\n 30\r\n0.0\r\n 11\r\n524699.9462885679\r\n 21\r\n176869.0391801092\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524540.2416766282\r\n 20\r\n176738.8417321735\r\n 30\r\n0.0\r\n 11\r\n524573.0288028847\r\n 21\r\n176794.1648742926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524402.8939127689\r\n 20\r\n176600.5870943258\r\n 30\r\n0.0\r\n 11\r\n524516.0534906659\r\n 21\r\n176991.8754843581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524527.5719386363\r\n 20\r\n176985.1954879848\r\n 30\r\n0.0\r\n 11\r\n524302.4685832363\r\n 21\r\n177064.9717443567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524670.6487831715\r\n 20\r\n177111.0319585387\r\n 30\r\n0.0\r\n 11\r\n524510.2250134501\r\n 21\r\n176979.9934298166\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524688.051171811\r\n 20\r\n177025.5969463264\r\n 30\r\n0.0\r\n 11\r\n524619.7847107993\r\n 21\r\n177076.8903188255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524292.1288232022\r\n 20\r\n176610.8372527493\r\n 30\r\n0.0\r\n 11\r\n524321.6894533681\r\n 21\r\n176695.9739671731\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524139.9292285851\r\n 20\r\n176624.1064543491\r\n 30\r\n0.0\r\n 11\r\n524305.2211714586\r\n 21\r\n177066.4035526116\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524656.7870192897\r\n 20\r\n176841.2580737571\r\n 30\r\n0.0\r\n 11\r\n524264.5942312336\r\n 21\r\n177002.5653685276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524582.1070008542\r\n 20\r\n177359.7590511446\r\n 30\r\n0.0\r\n 11\r\n524264.0180729551\r\n 21\r\n176995.6140149074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524733.7490608754\r\n 20\r\n177562.7061247043\r\n 30\r\n0.0\r\n 11\r\n524397.2012674127\r\n 21\r\n177141.1576589432\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524664.2950752848\r\n 20\r\n177317.1232182147\r\n 30\r\n0.0\r\n 11\r\n524549.6217916453\r\n 21\r\n177342.4128553935\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524623.6974913797\r\n 20\r\n177270.1461406419\r\n 30\r\n0.0\r\n 11\r\n524572.2606837746\r\n 21\r\n177367.2020817456\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524509.3137337471\r\n 20\r\n177118.4239113903\r\n 30\r\n0.0\r\n 11\r\n524615.9569827252\r\n 21\r\n177289.9886187415\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524914.8712808239\r\n 20\r\n176967.8159134291\r\n 30\r\n0.0\r\n 11\r\n524457.4619183516\r\n 21\r\n177218.9246693036\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524593.6225003369\r\n 20\r\n177140.8973427732\r\n 30\r\n0.0\r\n 11\r\n524606.9960536835\r\n 21\r\n177161.1680764284\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524407.7767810743\r\n 20\r\n177100.7144695549\r\n 30\r\n0.0\r\n 11\r\n524372.4910968508\r\n 21\r\n177129.1584084896\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524412.6280308329\r\n 20\r\n177085.9567237407\r\n 30\r\n0.0\r\n 11\r\n524403.3235628415\r\n 21\r\n177108.1507163518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524381.65373712\r\n 20\r\n177029.8402108713\r\n 30\r\n0.0\r\n 11\r\n524414.5396461155\r\n 21\r\n177093.7180580547\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524634.2926135871\r\n 20\r\n177075.8287054672\r\n 30\r\n0.0\r\n 11\r\n524847.2935574429\r\n 21\r\n177454.3625650186\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524851.722458845\r\n 20\r\n177422.913336713\r\n 30\r\n0.0\r\n 11\r\n524661.6272607795\r\n 21\r\n177489.0807602579\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524948.4464482099\r\n 20\r\n177380.2715990563\r\n 30\r\n0.0\r\n 11\r\n524671.7049472782\r\n 21\r\n177097.2874407387\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524732.4626112492\r\n 20\r\n177231.5190425282\r\n 30\r\n0.0\r\n 11\r\n524658.4664940188\r\n 21\r\n177288.4085392337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524688.6626025321\r\n 20\r\n177270.4160094029\r\n 30\r\n0.0\r\n 11\r\n524605.488267369\r\n 21\r\n177276.2992238412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524683.4501827937\r\n 20\r\n177258.3701930328\r\n 30\r\n0.0\r\n 11\r\n524647.8729103227\r\n 21\r\n177330.192232138\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n20FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524752.9868462255\r\n 20\r\n177460.2040589644\r\n 30\r\n0.0\r\n 11\r\n524645.2707455659\r\n 21\r\n177317.8392296933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2100\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524547.4643337807\r\n 20\r\n176880.782114935\r\n 30\r\n0.0\r\n 11\r\n524559.6247061727\r\n 21\r\n176926.1939556954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2101\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524617.112963295\r\n 20\r\n176898.4914126176\r\n 30\r\n0.0\r\n 11\r\n524557.7853298208\r\n 21\r\n176925.7132706436\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2102\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524621.3192077346\r\n 20\r\n176849.1165905469\r\n 30\r\n0.0\r\n 11\r\n524675.2576602958\r\n 21\r\n176938.4115308814\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2103\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524793.0622890275\r\n 20\r\n176843.8871924073\r\n 30\r\n0.0\r\n 11\r\n524556.5709138037\r\n 21\r\n177026.1797067567\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2104\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524460.1711436096\r\n 20\r\n177005.7629728102\r\n 30\r\n0.0\r\n 11\r\n524487.1069085343\r\n 21\r\n177069.1193325565\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2105\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524516.0147297351\r\n 20\r\n177055.7669622723\r\n 30\r\n0.0\r\n 11\r\n524460.7721051657\r\n 21\r\n177079.4486933603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2106\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524508.447615311\r\n 20\r\n177051.6677991172\r\n 30\r\n0.0\r\n 11\r\n524537.2812335059\r\n 21\r\n177116.9142425369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2107\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524538.8825161087\r\n 20\r\n177113.5593609073\r\n 30\r\n0.0\r\n 11\r\n524487.8569583077\r\n 21\r\n177136.9683815156\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2108\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524462.4795613218\r\n 20\r\n177070.5760140498\r\n 30\r\n0.0\r\n 11\r\n524493.0159082682\r\n 21\r\n177141.8053571161\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2109\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524058.9354562361\r\n 20\r\n176546.2668424607\r\n 30\r\n0.0\r\n 11\r\n523284.4721244596\r\n 21\r\n176707.4414788887\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523923.4040826801\r\n 20\r\n176571.4619758116\r\n 30\r\n0.0\r\n 11\r\n523976.5578845037\r\n 21\r\n176709.4198246509\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524084.29885898\r\n 20\r\n176606.317185652\r\n 30\r\n0.0\r\n 11\r\n523600.0276661482\r\n 21\r\n176706.1471339956\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523973.9147379101\r\n 20\r\n176676.8808630096\r\n 30\r\n0.0\r\n 11\r\n523958.3406354409\r\n 21\r\n176757.3702758966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524050.4510301497\r\n 20\r\n176699.1858307063\r\n 30\r\n0.0\r\n 11\r\n523963.9833528352\r\n 21\r\n176683.6690894231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524223.3875588055\r\n 20\r\n176606.9660273341\r\n 30\r\n0.0\r\n 11\r\n523799.3071688467\r\n 21\r\n176904.554215737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n210F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524230.9032869689\r\n 20\r\n177064.4254319837\r\n 30\r\n0.0\r\n 11\r\n524135.8105514784\r\n 21\r\n177125.7048981491\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2110\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524184.9417980438\r\n 20\r\n177190.6889400043\r\n 30\r\n0.0\r\n 11\r\n523744.1125567359\r\n 21\r\n176577.0594260767\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2111\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523820.3733984538\r\n 20\r\n176800.5652334753\r\n 30\r\n0.0\r\n 11\r\n523351.0133256151\r\n 21\r\n176974.2901895443\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2112\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523783.2525142218\r\n 20\r\n176741.8143442817\r\n 30\r\n0.0\r\n 11\r\n523880.7464550603\r\n 21\r\n176909.458161977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2113\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523721.0418431207\r\n 20\r\n176779.2607140414\r\n 30\r\n0.0\r\n 11\r\n523753.8289693772\r\n 21\r\n176834.5838561607\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2114\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523753.256382862\r\n 20\r\n176735.448746983\r\n 30\r\n0.0\r\n 11\r\n523718.6825823592\r\n 21\r\n176794.9626767961\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2115\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523734.8597260975\r\n 20\r\n176782.4581261431\r\n 30\r\n0.0\r\n 11\r\n523602.716445313\r\n 21\r\n176830.4106796125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2116\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523583.6940792614\r\n 20\r\n176641.0060761937\r\n 30\r\n0.0\r\n 11\r\n523807.7711164501\r\n 21\r\n177405.5927394266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2117\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523708.3721051288\r\n 20\r\n177025.6144698526\r\n 30\r\n0.0\r\n 11\r\n523414.0942205851\r\n 21\r\n177128.0965747663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2118\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523459.628059891\r\n 20\r\n176658.2462745898\r\n 30\r\n0.0\r\n 11\r\n523489.188690057\r\n 21\r\n176743.3829890131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2119\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523837.5871857822\r\n 20\r\n176881.6770556252\r\n 30\r\n0.0\r\n 11\r\n523401.4561761059\r\n 21\r\n177061.0559618133\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523932.59431452\r\n 20\r\n177099.1610338265\r\n 30\r\n0.0\r\n 11\r\n523560.8438708927\r\n 21\r\n177311.7893333251\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524259.2738640755\r\n 20\r\n176877.6038259502\r\n 30\r\n0.0\r\n 11\r\n523787.2705317197\r\n 21\r\n177183.7580725489\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523815.0927800796\r\n 20\r\n177116.2476873352\r\n 30\r\n0.0\r\n 11\r\n524065.686859798\r\n 21\r\n177581.6040589463\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524181.393408924\r\n 20\r\n177171.1764242468\r\n 30\r\n0.0\r\n 11\r\n524087.6441325976\r\n 21\r\n177352.3882382578\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524118.2928397489\r\n 20\r\n177357.6795220147\r\n 30\r\n0.0\r\n 11\r\n523852.5051137707\r\n 21\r\n177137.7064226066\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n211F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523913.2627777417\r\n 20\r\n177271.938024396\r\n 30\r\n0.0\r\n 11\r\n523742.3935641112\r\n 21\r\n177401.888449398\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2120\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523904.2630915616\r\n 20\r\n177457.0410117514\r\n 30\r\n0.0\r\n 11\r\n523778.0512849523\r\n 21\r\n177349.0241465069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2121\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524329.0991662258\r\n 20\r\n177039.9084249556\r\n 30\r\n0.0\r\n 11\r\n524137.3338132791\r\n 21\r\n177229.3158322298\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2122\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523728.264500273\r\n 20\r\n176921.2010968029\r\n 30\r\n0.0\r\n 11\r\n523740.4248726654\r\n 21\r\n176966.6129375633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2123\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523797.9131297873\r\n 20\r\n176938.9103944856\r\n 30\r\n0.0\r\n 11\r\n523738.5854963134\r\n 21\r\n176966.1322525115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2124\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523802.119374227\r\n 20\r\n176889.5355724147\r\n 30\r\n0.0\r\n 11\r\n523856.0578267882\r\n 21\r\n176978.8305127494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2125\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524188.8444531574\r\n 20\r\n177005.8680716988\r\n 30\r\n0.0\r\n 11\r\n524094.5840014705\r\n 21\r\n177067.6704809664\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2126\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523620.3338423907\r\n 20\r\n176758.5263917544\r\n 30\r\n0.0\r\n 11\r\n523286.1844197433\r\n 21\r\n176841.7763756921\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2127\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523845.4473361947\r\n 20\r\n177441.0503041714\r\n 30\r\n0.0\r\n 11\r\n523897.8522793977\r\n 21\r\n177789.229920805\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2128\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524426.8624672233\r\n 20\r\n177167.9764499862\r\n 30\r\n0.0\r\n 11\r\n523718.9633067363\r\n 21\r\n177521.2064889649\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2129\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524334.9515202315\r\n 20\r\n177490.9462293093\r\n 30\r\n0.0\r\n 11\r\n524165.8798881372\r\n 21\r\n177657.0770312377\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524253.3843285075\r\n 20\r\n177460.1439943853\r\n 30\r\n0.0\r\n 11\r\n524293.136478182\r\n 21\r\n177535.7157242692\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524537.393008504\r\n 20\r\n177530.0796005514\r\n 30\r\n0.0\r\n 11\r\n524544.0746081126\r\n 21\r\n177647.3181776323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524484.5437187272\r\n 20\r\n177562.6673621539\r\n 30\r\n0.0\r\n 11\r\n524572.1564254478\r\n 21\r\n177628.9215280699\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524294.1932385935\r\n 20\r\n177444.0753259245\r\n 30\r\n0.0\r\n 11\r\n524419.0163395771\r\n 21\r\n177658.572912265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524361.4303963406\r\n 20\r\n177360.4962275396\r\n 30\r\n0.0\r\n 11\r\n524261.6064725267\r\n 21\r\n177429.6529319217\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n212F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524221.1427565949\r\n 20\r\n177335.9155954373\r\n 30\r\n0.0\r\n 11\r\n524340.1827309195\r\n 21\r\n177315.4897422352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2130\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524333.559963647\r\n 20\r\n177314.2594698381\r\n 30\r\n0.0\r\n 11\r\n524361.383610597\r\n 21\r\n177362.6688239315\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2131\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524129.6350283636\r\n 20\r\n177044.6744051055\r\n 30\r\n0.0\r\n 11\r\n524129.6400453109\r\n 21\r\n177044.6857834614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2132\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524188.6841623029\r\n 20\r\n177178.5968868009\r\n 30\r\n0.0\r\n 11\r\n524356.6121674477\r\n 21\r\n177559.4548891945\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2133\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524294.4017108166\r\n 20\r\n177521.2241593916\r\n 30\r\n0.0\r\n 11\r\n524622.3728336955\r\n 21\r\n177395.4280272024\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2134\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524559.5723787072\r\n 20\r\n177317.5318105132\r\n 30\r\n0.0\r\n 11\r\n524321.55125031\r\n 21\r\n177487.7120341687\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2135\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524269.9265987363\r\n 20\r\n177370.0141645893\r\n 30\r\n0.0\r\n 11\r\n524302.556213675\r\n 21\r\n177355.9677430189\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2136\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524463.7532463389\r\n 20\r\n177449.1347225002\r\n 30\r\n0.0\r\n 11\r\n524508.1163394164\r\n 21\r\n177531.2550986146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2137\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524495.1687271976\r\n 20\r\n177498.5764291668\r\n 30\r\n0.0\r\n 11\r\n524487.7146466169\r\n 21\r\n177581.6247218925\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2138\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524482.4459093658\r\n 20\r\n177501.8014745882\r\n 30\r\n0.0\r\n 11\r\n524547.6763303283\r\n 21\r\n177548.3754995245\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2139\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524692.7850811292\r\n 20\r\n177465.3365624116\r\n 30\r\n0.0\r\n 11\r\n524535.0664578412\r\n 21\r\n177548.9747045653\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524090.7431950936\r\n 20\r\n177327.5030085241\r\n 30\r\n0.0\r\n 11\r\n524232.9952976152\r\n 21\r\n177590.0350459429\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524834.4925108826\r\n 20\r\n176585.5479530126\r\n 30\r\n0.0\r\n 11\r\n524868.7902796302\r\n 21\r\n176059.7556749212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524853.1503024604\r\n 20\r\n176384.6466599991\r\n 30\r\n0.0\r\n 11\r\n524078.0846057808\r\n 21\r\n176542.899247733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524718.7041122123\r\n 20\r\n176415.1059753282\r\n 30\r\n0.0\r\n 11\r\n524712.9644557525\r\n 21\r\n176267.373950877\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524852.6970118399\r\n 20\r\n176319.461228776\r\n 30\r\n0.0\r\n 11\r\n524368.4258190082\r\n 21\r\n176419.2911771196\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n213F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524723.4054065664\r\n 20\r\n176298.3054363685\r\n 30\r\n0.0\r\n 11\r\n524677.2688056228\r\n 21\r\n176230.5373590165\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2140\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524784.8807047635\r\n 20\r\n176247.5501083199\r\n 30\r\n0.0\r\n 11\r\n524711.5990661153\r\n 21\r\n176295.9983272473\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2141\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524775.536839776\r\n 20\r\n176264.1154968722\r\n 30\r\n0.0\r\n 11\r\n524785.5094619859\r\n 21\r\n176065.4831742494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2142\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524896.866258793\r\n 20\r\n176246.5082128524\r\n 30\r\n0.0\r\n 11\r\n524472.992057353\r\n 21\r\n176158.2479008623\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2143\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524730.2782279649\r\n 20\r\n176055.8036672147\r\n 30\r\n0.0\r\n 11\r\n524677.5515472646\r\n 21\r\n176234.8559944898\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2144\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524789.3457741364\r\n 20\r\n176069.3918539262\r\n 30\r\n0.0\r\n 11\r\n524729.562001381\r\n 21\r\n176056.2571214818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2145\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524818.4673709424\r\n 20\r\n175773.411979897\r\n 30\r\n0.0\r\n 11\r\n524749.4999268523\r\n 21\r\n176062.5303947511\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2146\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524806.1751753408\r\n 20\r\n175840.7214848734\r\n 30\r\n0.0\r\n 11\r\n524694.6000474236\r\n 21\r\n175822.0455070709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2147\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524714.0256908267\r\n 20\r\n175742.9288244858\r\n 30\r\n0.0\r\n 11\r\n524528.7710855574\r\n 21\r\n176593.1214276208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2148\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524533.4667132535\r\n 20\r\n176245.4276602987\r\n 30\r\n0.0\r\n 11\r\n524094.2838498115\r\n 21\r\n176243.951157889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2149\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524522.6071595965\r\n 20\r\n176314.069463317\r\n 30\r\n0.0\r\n 11\r\n524545.8524346704\r\n 21\r\n176121.53589404\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524450.6589154366\r\n 20\r\n176304.2792452722\r\n 30\r\n0.0\r\n 11\r\n524458.8936444774\r\n 21\r\n176240.4996643729\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524497.5740018673\r\n 20\r\n176331.7790578808\r\n 30\r\n0.0\r\n 11\r\n524442.2821362541\r\n 21\r\n176290.7904604414\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524462.085748693\r\n 20\r\n176295.877768269\r\n 30\r\n0.0\r\n 11\r\n524059.5419547112\r\n 21\r\n176319.4487605732\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524379.1860456042\r\n 20\r\n176485.5811537055\r\n 30\r\n0.0\r\n 11\r\n524328.3721347721\r\n 21\r\n176081.4405337352\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524341.5933468728\r\n 20\r\n176083.0205798669\r\n 30\r\n0.0\r\n 11\r\n524103.2917748921\r\n 21\r\n176098.7728014375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n214F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524423.2393996213\r\n 20\r\n175910.8586710884\r\n 30\r\n0.0\r\n 11\r\n524327.7179864655\r\n 21\r\n176094.6589472851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2150\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524473.0111335692\r\n 20\r\n175982.4460927623\r\n 30\r\n0.0\r\n 11\r\n524390.0245524959\r\n 21\r\n175962.3327359273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2151\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524196.0482056268\r\n 20\r\n176524.5876792396\r\n 30\r\n0.0\r\n 11\r\n524189.5287195957\r\n 21\r\n176434.7011546625\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2152\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524128.358509373\r\n 20\r\n176567.9773459235\r\n 30\r\n0.0\r\n 11\r\n524105.2536975196\r\n 21\r\n176096.3691216743\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2153\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524517.1987594172\r\n 20\r\n176164.1208595706\r\n 30\r\n0.0\r\n 11\r\n524093.1858645262\r\n 21\r\n176171.0700549083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2154\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524179.8018907191\r\n 20\r\n175836.4304880299\r\n 30\r\n0.0\r\n 11\r\n524110.3161840115\r\n 21\r\n176113.4995720353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2155\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524401.0527004668\r\n 20\r\n175571.5431528407\r\n 30\r\n0.0\r\n 11\r\n524337.5341966459\r\n 21\r\n175803.6260353005\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2156\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524906.1175838838\r\n 20\r\n176001.0920467013\r\n 30\r\n0.0\r\n 11\r\n524351.516314391\r\n 21\r\n175906.5669159554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2157\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524185.8788921953\r\n 20\r\n176024.2964495397\r\n 30\r\n0.0\r\n 11\r\n524125.3963942551\r\n 21\r\n176008.8910432083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2158\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524196.1710747265\r\n 20\r\n176035.9324567793\r\n 30\r\n0.0\r\n 11\r\n524178.8478202819\r\n 21\r\n176019.2276284931\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2159\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524189.9151486143\r\n 20\r\n176099.7237828048\r\n 30\r\n0.0\r\n 11\r\n524194.857365465\r\n 21\r\n176028.0478672973\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524689.4772944703\r\n 20\r\n175581.5310930009\r\n 30\r\n0.0\r\n 11\r\n524505.877293696\r\n 21\r\n175447.0535606886\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524718.4834610751\r\n 20\r\n175762.2538761273\r\n 30\r\n0.0\r\n 11\r\n524684.3756495151\r\n 21\r\n175549.7453183631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524401.1577066231\r\n 20\r\n176171.0543626083\r\n 30\r\n0.0\r\n 11\r\n524394.3670665881\r\n 21\r\n176124.5355798873\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524458.1243808401\r\n 20\r\n176127.2439888799\r\n 30\r\n0.0\r\n 11\r\n524392.8677514518\r\n 21\r\n176125.7045185535\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524481.5146127438\r\n 20\r\n176170.9299431248\r\n 30\r\n0.0\r\n 11\r\n524495.7409961227\r\n 21\r\n176067.5831819273\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n215F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524641.3241762692\r\n 20\r\n176107.8115148906\r\n 30\r\n0.0\r\n 11\r\n524352.0195627142\r\n 21\r\n176033.9090662238\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2160\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524271.5534269223\r\n 20\r\n176090.7857724328\r\n 30\r\n0.0\r\n 11\r\n524271.2368351342\r\n 21\r\n176021.9420107544\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2161\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524303.0685325427\r\n 20\r\n176022.7732501209\r\n 30\r\n0.0\r\n 11\r\n524242.9639349946\r\n 21\r\n176022.8697395756\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2162\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524297.7394902733\r\n 20\r\n176029.5308878573\r\n 30\r\n0.0\r\n 11\r\n524298.4185297348\r\n 21\r\n175958.2005659559\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2163\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524301.2160640311\r\n 20\r\n175960.6486547176\r\n 30\r\n0.0\r\n 11\r\n524245.0925818655\r\n 21\r\n175959.3278427067\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2164\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524248.0411827285\r\n 20\r\n176030.3437880178\r\n 30\r\n0.0\r\n 11\r\n524247.917997139\r\n 21\r\n175952.8449323889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2165\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523955.0072537066\r\n 20\r\n176585.1613932447\r\n 30\r\n0.0\r\n 11\r\n523908.8706527628\r\n 21\r\n176517.3933158926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2166\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524016.4825519034\r\n 20\r\n176534.4060651959\r\n 30\r\n0.0\r\n 11\r\n523943.2009132551\r\n 21\r\n176582.8542841236\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2167\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524007.0495175071\r\n 20\r\n176549.1513555462\r\n 30\r\n0.0\r\n 11\r\n524017.0221397171\r\n 21\r\n176350.5190329231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2168\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524211.791502212\r\n 20\r\n176550.7140082577\r\n 30\r\n0.0\r\n 11\r\n523704.593904493\r\n 21\r\n176445.1038577385\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2169\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523961.8800751049\r\n 20\r\n176342.6596240908\r\n 30\r\n0.0\r\n 11\r\n523909.1533944044\r\n 21\r\n176521.7119513658\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524020.9476212765\r\n 20\r\n176356.2478108022\r\n 30\r\n0.0\r\n 11\r\n523961.163848521\r\n 21\r\n176343.1130783577\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524050.0692180822\r\n 20\r\n176060.2679367731\r\n 30\r\n0.0\r\n 11\r\n523981.1017739921\r\n 21\r\n176349.3863516272\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523925.7303676276\r\n 20\r\n176133.255429937\r\n 30\r\n0.0\r\n 11\r\n523783.4177929851\r\n 21\r\n176767.7275968893\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523765.0685603935\r\n 20\r\n176532.2836171748\r\n 30\r\n0.0\r\n 11\r\n523499.6512491019\r\n 21\r\n176531.3913025323\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523754.2090067364\r\n 20\r\n176600.925420193\r\n 30\r\n0.0\r\n 11\r\n523777.4542818105\r\n 21\r\n176408.3918509162\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n216F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523682.2607625766\r\n 20\r\n176591.1352021484\r\n 30\r\n0.0\r\n 11\r\n523690.4954916173\r\n 21\r\n176527.3556212487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2170\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523729.1758490071\r\n 20\r\n176618.635014757\r\n 30\r\n0.0\r\n 11\r\n523673.883983394\r\n 21\r\n176577.6464173176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2171\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523693.6875958331\r\n 20\r\n176582.7337251451\r\n 30\r\n0.0\r\n 11\r\n523291.1438018511\r\n 21\r\n176606.3047174492\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2172\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523597.1719588192\r\n 20\r\n176663.2487647028\r\n 30\r\n0.0\r\n 11\r\n523559.9739819122\r\n 21\r\n176368.2964906114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2173\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523573.1951940131\r\n 20\r\n176369.8765367431\r\n 30\r\n0.0\r\n 11\r\n523334.893622032\r\n 21\r\n176385.6287583135\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2174\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523654.8412467612\r\n 20\r\n176197.7146279646\r\n 30\r\n0.0\r\n 11\r\n523559.3198336054\r\n 21\r\n176381.5149041611\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2175\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523905.9258672462\r\n 20\r\n176331.1066862747\r\n 30\r\n0.0\r\n 11\r\n523621.6263996359\r\n 21\r\n176249.1886928035\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2176\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523748.8006065571\r\n 20\r\n176450.9768164465\r\n 30\r\n0.0\r\n 11\r\n523287.6327858075\r\n 21\r\n176455.5451722603\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2177\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523581.6567369846\r\n 20\r\n176045.7597572108\r\n 30\r\n0.0\r\n 11\r\n523601.3255771891\r\n 21\r\n176409.2881804986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2178\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523665.9868155602\r\n 20\r\n176111.4283174921\r\n 30\r\n0.0\r\n 11\r\n523550.6608481276\r\n 21\r\n176133.5518110002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2179\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523647.2776624665\r\n 20\r\n176170.6311656222\r\n 30\r\n0.0\r\n 11\r\n523561.6503440895\r\n 21\r\n176101.8302700779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524137.7194310238\r\n 20\r\n176287.9480035772\r\n 30\r\n0.0\r\n 11\r\n523822.669511242\r\n 21\r\n176239.4880524337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523912.551407782\r\n 20\r\n176284.3224058519\r\n 30\r\n0.0\r\n 11\r\n523764.8411344153\r\n 21\r\n175991.2301637763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523834.274537764\r\n 20\r\n176080.7292277792\r\n 30\r\n0.0\r\n 11\r\n523684.4955315352\r\n 21\r\n176154.1947352304\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523706.8396502355\r\n 20\r\n176144.6906932061\r\n 30\r\n0.0\r\n 11\r\n523628.1195368675\r\n 21\r\n176172.1811641599\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523706.8160992776\r\n 20\r\n176157.8158772775\r\n 30\r\n0.0\r\n 11\r\n523645.7349219852\r\n 21\r\n176105.9194670136\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n217F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523680.9808014415\r\n 20\r\n175996.6414351451\r\n 30\r\n0.0\r\n 11\r\n523648.2303072941\r\n 21\r\n176118.2944814773\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2180\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524137.66337269\r\n 20\r\n176111.2608435002\r\n 30\r\n0.0\r\n 11\r\n523998.6574924492\r\n 21\r\n176056.9264262539\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2181\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523632.759553763\r\n 20\r\n176457.9103194846\r\n 30\r\n0.0\r\n 11\r\n523625.9689137283\r\n 21\r\n176411.3915367633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2182\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523689.7262279803\r\n 20\r\n176414.0999457557\r\n 30\r\n0.0\r\n 11\r\n523624.4695985917\r\n 21\r\n176412.5604754293\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2183\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523713.1164598839\r\n 20\r\n176457.7859000009\r\n 30\r\n0.0\r\n 11\r\n523727.3428432626\r\n 21\r\n176354.4391388034\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2184\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523872.9260234091\r\n 20\r\n176394.6674717667\r\n 30\r\n0.0\r\n 11\r\n523583.6214098542\r\n 21\r\n176320.7650230998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2185\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523503.1552740625\r\n 20\r\n176377.641729309\r\n 30\r\n0.0\r\n 11\r\n523502.8386822742\r\n 21\r\n176308.7979676306\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2186\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523534.6703796825\r\n 20\r\n176309.629206997\r\n 30\r\n0.0\r\n 11\r\n523474.5657821348\r\n 21\r\n176309.7256964516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2187\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524022.3055568426\r\n 20\r\n176197.9943693747\r\n 30\r\n0.0\r\n 11\r\n523911.2880441574\r\n 21\r\n176178.5089281253\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2188\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523593.4915151983\r\n 20\r\n176090.6742454528\r\n 30\r\n0.0\r\n 11\r\n523384.1588268988\r\n 21\r\n175555.2093770923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2189\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523633.2841588868\r\n 20\r\n176034.5891109277\r\n 30\r\n0.0\r\n 11\r\n523552.479969169\r\n 21\r\n175822.1269079588\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523819.1912007304\r\n 20\r\n176053.3618049566\r\n 30\r\n0.0\r\n 11\r\n523826.85645502\r\n 21\r\n175883.7323808723\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523958.7285697965\r\n 20\r\n176038.1395985702\r\n 30\r\n0.0\r\n 11\r\n522674.7588793094\r\n 21\r\n175965.1831478631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523750.4346482233\r\n 20\r\n175957.3340242478\r\n 30\r\n0.0\r\n 11\r\n523681.8651927528\r\n 21\r\n175523.5345344176\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523680.9394918868\r\n 20\r\n175957.5582406125\r\n 30\r\n0.0\r\n 11\r\n523874.7162583049\r\n 21\r\n175949.8069240586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523679.132413508\r\n 20\r\n175884.9694489518\r\n 30\r\n0.0\r\n 11\r\n523743.4090293628\r\n 21\r\n175882.9292635791\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n218F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523659.4649690731\r\n 20\r\n175935.669120131\r\n 30\r\n0.0\r\n 11\r\n523691.1129608358\r\n 21\r\n175874.5490731707\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2190\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523689.2483959566\r\n 20\r\n175894.910486785\r\n 30\r\n0.0\r\n 11\r\n523601.7939436437\r\n 21\r\n175501.2751015337\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2191\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523488.7537930343\r\n 20\r\n175843.3193110165\r\n 30\r\n0.0\r\n 11\r\n523879.6217311897\r\n 21\r\n175728.7158679355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2192\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523880.170002799\r\n 20\r\n175742.0198670875\r\n 30\r\n0.0\r\n 11\r\n523826.6224728135\r\n 21\r\n175509.2787368043\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2193\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524063.14765777\r\n 20\r\n175795.1703943184\r\n 30\r\n0.0\r\n 11\r\n523866.4681278443\r\n 21\r\n175730.1777454313\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2194\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524000.4121388068\r\n 20\r\n175855.7198708024\r\n 30\r\n0.0\r\n 11\r\n524007.0360807248\r\n 21\r\n175770.5879546085\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2195\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523421.0452457656\r\n 20\r\n175668.7440261316\r\n 30\r\n0.0\r\n 11\r\n523508.7422612466\r\n 21\r\n175647.9756734188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2196\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523367.4176725549\r\n 20\r\n175608.8387546992\r\n 30\r\n0.0\r\n 11\r\n523829.3082261822\r\n 21\r\n175510.8322958291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2197\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523828.1073277839\r\n 20\r\n175928.3099477495\r\n 30\r\n0.0\r\n 11\r\n523753.6388003021\r\n 21\r\n175510.8298107797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2198\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524225.4539202574\r\n 20\r\n175586.9361729005\r\n 30\r\n0.0\r\n 11\r\n523747.4648746935\r\n 21\r\n175514.0757186803\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2199\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524426.7050617454\r\n 20\r\n175585.5475623332\r\n 30\r\n0.0\r\n 11\r\n523941.7571189213\r\n 21\r\n175548.2990942904\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524233.6081600306\r\n 20\r\n175679.1652475025\r\n 30\r\n0.0\r\n 11\r\n524193.379151646\r\n 21\r\n175568.8422915338\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524172.1795916705\r\n 20\r\n175670.1352627065\r\n 30\r\n0.0\r\n 11\r\n524226.4471139384\r\n 21\r\n175574.6332370366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523982.767604884\r\n 20\r\n175655.0893954719\r\n 30\r\n0.0\r\n 11\r\n524184.7642951671\r\n 21\r\n175652.9519961581\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524060.8920527418\r\n 20\r\n175857.5198199396\r\n 30\r\n0.0\r\n 11\r\n524039.718586377\r\n 21\r\n175557.3878150962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524163.9828436678\r\n 20\r\n175862.6319814055\r\n 30\r\n0.0\r\n 11\r\n524262.2482765593\r\n 21\r\n175978.5874908516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n219F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523952.5760344381\r\n 20\r\n176185.7681188406\r\n 30\r\n0.0\r\n 11\r\n523952.5761424223\r\n 21\r\n176185.7556840073\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524065.176651165\r\n 20\r\n175980.5472814888\r\n 30\r\n0.0\r\n 11\r\n524055.9483637536\r\n 21\r\n175723.6806028601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524046.9906836203\r\n 20\r\n175714.1522382722\r\n 30\r\n0.0\r\n 11\r\n524071.272252612\r\n 21\r\n175714.5522124547\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523913.3143877621\r\n 20\r\n175578.9341085931\r\n 30\r\n0.0\r\n 11\r\n523918.3675773197\r\n 21\r\n175533.8940991734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523903.4683223095\r\n 20\r\n175590.9499598256\r\n 30\r\n0.0\r\n 11\r\n523917.1972653579\r\n 21\r\n175571.1847743874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523839.4956288376\r\n 20\r\n175594.9455045419\r\n 30\r\n0.0\r\n 11\r\n523911.0425692246\r\n 21\r\n175588.3958715355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524013.929332411\r\n 20\r\n175783.3976910387\r\n 30\r\n0.0\r\n 11\r\n524364.9122806743\r\n 21\r\n175769.2310278912\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524244.1416690661\r\n 20\r\n175847.5570144723\r\n 30\r\n0.0\r\n 11\r\n524052.1189380022\r\n 21\r\n175803.4404966425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523779.0412053739\r\n 20\r\n176109.8391314804\r\n 30\r\n0.0\r\n 11\r\n524379.9318991116\r\n 21\r\n175749.9532929654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524197.9843422059\r\n 20\r\n175782.6342354071\r\n 30\r\n0.0\r\n 11\r\n524206.2534331876\r\n 21\r\n175689.6640125672\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524207.2852601229\r\n 20\r\n175724.7990582087\r\n 30\r\n0.0\r\n 11\r\n524167.5946882196\r\n 21\r\n175651.4693865612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524194.3242413292\r\n 20\r\n175726.8686000381\r\n 30\r\n0.0\r\n 11\r\n524235.8173966716\r\n 21\r\n175658.294073591\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524401.936399934\r\n 20\r\n175677.1750531974\r\n 30\r\n0.0\r\n 11\r\n524223.9985907147\r\n 21\r\n175662.7307115722\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523802.7599534706\r\n 20\r\n175814.8590331944\r\n 30\r\n0.0\r\n 11\r\n523847.6008284282\r\n 21\r\n175800.7379188267\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523855.0930810568\r\n 20\r\n175864.1113892261\r\n 30\r\n0.0\r\n 11\r\n523846.207781267\r\n 21\r\n175799.4441711348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523903.4878811873\r\n 20\r\n176041.8688909265\r\n 30\r\n0.0\r\n 11\r\n523930.3156404951\r\n 21\r\n175744.4819331198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523861.3363930202\r\n 20\r\n175674.1141696465\r\n 30\r\n0.0\r\n 11\r\n524026.3704793484\r\n 21\r\n175650.4719839854\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523607.5722573438\r\n 20\r\n175811.1374939353\r\n 30\r\n0.0\r\n 11\r\n523535.6810956624\r\n 21\r\n175556.489873426\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524601.8591509933\r\n 20\r\n175937.3279469695\r\n 30\r\n0.0\r\n 11\r\n524563.5006805631\r\n 21\r\n176099.1916535255\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524649.1081246048\r\n 20\r\n175849.7935343369\r\n 30\r\n0.0\r\n 11\r\n524802.8262932069\r\n 21\r\n175951.8810185483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523840.6999827257\r\n 20\r\n175853.6330990243\r\n 30\r\n0.0\r\n 11\r\n523957.3813533612\r\n 21\r\n175842.8789663575\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524378.6760047676\r\n 20\r\n176481.5246224025\r\n 30\r\n0.0\r\n 11\r\n524284.3574541301\r\n 21\r\n176655.7893727172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523147.326013239\r\n 20\r\n178931.9640315077\r\n 30\r\n0.0\r\n 11\r\n522765.2641434303\r\n 21\r\n179342.3537138884\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523139.8670581723\r\n 20\r\n178951.3058347943\r\n 30\r\n0.0\r\n 11\r\n522719.7578980884\r\n 21\r\n178281.0230517039\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523069.1709018637\r\n 20\r\n178832.9605710714\r\n 30\r\n0.0\r\n 11\r\n522958.2600799692\r\n 21\r\n178930.7178433913\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522987.8557439687\r\n 20\r\n178916.9386227657\r\n 30\r\n0.0\r\n 11\r\n522906.9675008426\r\n 21\r\n178930.2874196615\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522993.5197341839\r\n 20\r\n178996.4573930566\r\n 30\r\n0.0\r\n 11\r\n522978.0409297662\r\n 21\r\n178909.9829165099\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522999.0664906292\r\n 20\r\n178978.2652682841\r\n 30\r\n0.0\r\n 11\r\n522862.1452156581\r\n 21\r\n179122.5109519096\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523070.0183710327\r\n 20\r\n179078.2486420859\r\n 30\r\n0.0\r\n 11\r\n522713.7134417443\r\n 21\r\n178832.2689301503\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522817.0365754428\r\n 20\r\n179089.20340553\r\n 30\r\n0.0\r\n 11\r\n522910.289047065\r\n 21\r\n178927.5129132409\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522867.6213930463\r\n 20\r\n179122.5918774449\r\n 30\r\n0.0\r\n 11\r\n522816.8707690084\r\n 21\r\n179088.3720755601\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522673.4347394771\r\n 20\r\n179347.8554936956\r\n 30\r\n0.0\r\n 11\r\n522835.1664587846\r\n 21\r\n179098.4786360647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522713.6840544283\r\n 20\r\n179292.5232230136\r\n 30\r\n0.0\r\n 11\r\n522623.1936961966\r\n 21\r\n179224.6314239237\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522579.3175052096\r\n 20\r\n179293.273138277\r\n 30\r\n0.0\r\n 11\r\n523008.5346679032\r\n 21\r\n178704.9826767926\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522818.5459361698\r\n 20\r\n178815.9091448761\r\n 30\r\n0.0\r\n 11\r\n522514.5079408377\r\n 21\r\n178498.9790816208\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522860.7480789847\r\n 20\r\n178760.6949603847\r\n 30\r\n0.0\r\n 11\r\n522737.3981294931\r\n 21\r\n178910.3422392513\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522804.027106139\r\n 20\r\n178715.3614248236\r\n 30\r\n0.0\r\n 11\r\n522763.5342653316\r\n 21\r\n178765.321164069\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522856.299974217\r\n 20\r\n178730.3551665571\r\n 30\r\n0.0\r\n 11\r\n522788.4831353206\r\n 21\r\n178718.6022143702\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522805.8275840294\r\n 20\r\n178729.429673239\r\n 30\r\n0.0\r\n 11\r\n522545.1982073443\r\n 21\r\n178421.7457026453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522885.9761669452\r\n 20\r\n178538.5476681291\r\n 30\r\n0.0\r\n 11\r\n522558.3427148113\r\n 21\r\n178780.5559640336\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522568.6072133998\r\n 20\r\n178789.0375360528\r\n 30\r\n0.0\r\n 11\r\n522415.6194376418\r\n 21\r\n178605.6512983969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522500.2930428026\r\n 20\r\n178966.9110159738\r\n 30\r\n0.0\r\n 11\r\n522567.4609888394\r\n 21\r\n178770.9637043657\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522586.4540056679\r\n 20\r\n178953.5591277127\r\n 30\r\n0.0\r\n 11\r\n522514.6447790618\r\n 21\r\n178907.3557216087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522837.8959411886\r\n 20\r\n178438.2368376785\r\n 30\r\n0.0\r\n 11\r\n522768.3246941651\r\n 21\r\n178495.5249916571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522772.5946245916\r\n 20\r\n178300.1190388134\r\n 30\r\n0.0\r\n 11\r\n522415.2327085451\r\n 21\r\n178608.7298138516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522748.4610696767\r\n 20\r\n178860.2211483888\r\n 30\r\n0.0\r\n 11\r\n522460.9878607667\r\n 21\r\n178548.4610154204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522236.2976158708\r\n 20\r\n178970.2618921646\r\n 30\r\n0.0\r\n 11\r\n522467.3064393924\r\n 21\r\n178545.5065544425\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522098.6471478465\r\n 20\r\n179182.9475232887\r\n 30\r\n0.0\r\n 11\r\n522377.0757368185\r\n 21\r\n178720.9463900508\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522304.8230768771\r\n 20\r\n179032.5270912898\r\n 30\r\n0.0\r\n 11\r\n522241.2821931961\r\n 21\r\n178933.7744516778\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522334.7768169362\r\n 20\r\n178978.1415868549\r\n 30\r\n0.0\r\n 11\r\n522225.8982985945\r\n 21\r\n178963.6133686634\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522437.3304620526\r\n 20\r\n178818.1852530238\r\n 30\r\n0.0\r\n 11\r\n522313.4811757963\r\n 21\r\n178977.7740548083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522577.5095443722\r\n 20\r\n179024.845603684\r\n 30\r\n0.0\r\n 11\r\n522325.0774155249\r\n 21\r\n178804.4642236829\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522642.7098597427\r\n 20\r\n178957.7224117491\r\n 30\r\n0.0\r\n 11\r\n522552.9901757035\r\n 21\r\n179039.5627674574\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522635.311412092\r\n 20\r\n179099.9549407722\r\n 30\r\n0.0\r\n 11\r\n522681.828355844\r\n 21\r\n178988.4923689815\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522681.547176797\r\n 20\r\n178995.2225662195\r\n 30\r\n0.0\r\n 11\r\n522640.581774166\r\n 21\r\n178957.2823938343\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522898.7301144073\r\n 20\r\n179254.2458431046\r\n 30\r\n0.0\r\n 11\r\n522447.7080348636\r\n 21\r\n178917.9473860314\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522445.5358098579\r\n 20\r\n178905.0512159173\r\n 30\r\n0.0\r\n 11\r\n522431.1713612153\r\n 21\r\n178924.6322574431\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522418.6744038956\r\n 20\r\n178716.8179575967\r\n 30\r\n0.0\r\n 11\r\n522379.7464089774\r\n 21\r\n178693.6070036115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522434.198382797\r\n 20\r\n178716.2419673135\r\n 30\r\n0.0\r\n 11\r\n522410.1544402602\r\n 21\r\n178715.2244900878\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522476.0647982307\r\n 20\r\n178667.7066899749\r\n 30\r\n0.0\r\n 11\r\n522427.5840362466\r\n 21\r\n178720.7300630164\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522520.6788244482\r\n 20\r\n178920.5919054432\r\n 30\r\n0.0\r\n 11\r\n522239.6803424068\r\n 21\r\n179251.7974881269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522270.7101836271\r\n 20\r\n179245.0285825652\r\n 30\r\n0.0\r\n 11\r\n522142.6423063304\r\n 21\r\n179089.7451930127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522596.3831531044\r\n 20\r\n179283.1690302777\r\n 30\r\n0.0\r\n 11\r\n522237.4258900137\r\n 21\r\n179230.8789917106\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522344.2894211447\r\n 20\r\n179320.9228756008\r\n 30\r\n0.0\r\n 11\r\n522513.5488495037\r\n 21\r\n178963.1280487681\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522616.433556044\r\n 20\r\n179040.1516186263\r\n 30\r\n0.0\r\n 11\r\n522594.9493916457\r\n 21\r\n179068.44339146\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522408.7731163578\r\n 20\r\n179066.7217860012\r\n 30\r\n0.0\r\n 11\r\n522329.726212972\r\n 21\r\n179017.088860783\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522357.0857537812\r\n 20\r\n179039.1567475365\r\n 30\r\n0.0\r\n 11\r\n522322.6827665701\r\n 21\r\n178963.2027041097\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522366.5715496863\r\n 20\r\n179030.0853260603\r\n 30\r\n0.0\r\n 11\r\n522286.8642047714\r\n 21\r\n179021.6658970797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522201.450268929\r\n 20\r\n179165.3895005678\r\n 30\r\n0.0\r\n 11\r\n522297.5445928094\r\n 21\r\n179014.9355744889\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522694.7693225394\r\n 20\r\n179484.036566723\r\n 30\r\n0.0\r\n 11\r\n522776.714635701\r\n 21\r\n179327.5713947966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522757.6709378034\r\n 20\r\n179388.2454918792\r\n 30\r\n0.0\r\n 11\r\n522526.5609187225\r\n 21\r\n179262.0433512364\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522673.4300169945\r\n 20\r\n178771.4295917444\r\n 30\r\n0.0\r\n 11\r\n522635.0680081422\r\n 21\r\n178798.6043266053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522681.0115798427\r\n 20\r\n178842.8933638417\r\n 30\r\n0.0\r\n 11\r\n522634.8799687523\r\n 21\r\n178796.7125008545\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522728.7739305676\r\n 20\r\n178829.6902051285\r\n 30\r\n0.0\r\n 11\r\n522663.7695582929\r\n 21\r\n178911.2829414423\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522793.3232115586\r\n 20\r\n178988.9272074254\r\n 30\r\n0.0\r\n 11\r\n522540.2451840974\r\n 21\r\n178830.46508779\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522525.9120197558\r\n 20\r\n178732.9749902497\r\n 30\r\n0.0\r\n 11\r\n522475.8538351816\r\n 21\r\n178780.2374691257\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522498.4146227873\r\n 20\r\n178802.708757059\r\n 30\r\n0.0\r\n 11\r\n522457.0214877424\r\n 21\r\n178759.1291709232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522499.6306233752\r\n 20\r\n178794.1890327764\r\n 30\r\n0.0\r\n 11\r\n522448.4591145681\r\n 21\r\n178843.8876504995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21ED\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522452.1612918723\r\n 20\r\n178844.2241321974\r\n 30\r\n0.0\r\n 11\r\n522412.4884557117\r\n 21\r\n178804.5044158627\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21EE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522465.9348875831\r\n 20\r\n178757.6489182592\r\n 30\r\n0.0\r\n 11\r\n522409.7442253048\r\n 21\r\n178811.0221069516\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21EF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522753.9897929319\r\n 20\r\n179232.745657081\r\n 30\r\n0.0\r\n 11\r\n522663.2980889141\r\n 21\r\n179165.8159524214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522788.4955386514\r\n 20\r\n178613.7209607204\r\n 30\r\n0.0\r\n 11\r\n522629.152581096\r\n 21\r\n178402.478039806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523087.4314069828\r\n 20\r\n178627.8710157389\r\n 30\r\n0.0\r\n 11\r\n522397.3513749961\r\n 21\r\n177526.8505945155\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522746.7643787713\r\n 20\r\n178078.788113883\r\n 30\r\n0.0\r\n 11\r\n522635.8535568769\r\n 21\r\n178176.5453862029\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522769.9565157756\r\n 20\r\n178241.7732036145\r\n 30\r\n0.0\r\n 11\r\n522508.1557723742\r\n 21\r\n177822.3152467851\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522665.4492208762\r\n 20\r\n178162.7661655775\r\n 30\r\n0.0\r\n 11\r\n522584.5609777499\r\n 21\r\n178176.1149624734\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522671.1132110915\r\n 20\r\n178242.2849358682\r\n 30\r\n0.0\r\n 11\r\n522655.6344066736\r\n 21\r\n178155.8104593216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522675.2807850979\r\n 20\r\n178225.2838461286\r\n 30\r\n0.0\r\n 11\r\n522538.3595101266\r\n 21\r\n178369.5295297541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522817.6527627173\r\n 20\r\n178372.429835449\r\n 30\r\n0.0\r\n 11\r\n522391.3069186522\r\n 21\r\n178078.096472962\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522494.6300523502\r\n 20\r\n178335.0309483416\r\n 30\r\n0.0\r\n 11\r\n522587.8825239725\r\n 21\r\n178173.3404560525\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21F9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522545.2148699541\r\n 20\r\n178368.4194202566\r\n 30\r\n0.0\r\n 11\r\n522494.4642459159\r\n 21\r\n178334.199618372\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21FA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522351.0282163845\r\n 20\r\n178593.6830365074\r\n 30\r\n0.0\r\n 11\r\n522512.7599356921\r\n 21\r\n178344.3061788763\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21FB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522391.2775313359\r\n 20\r\n178538.3507658254\r\n 30\r\n0.0\r\n 11\r\n522300.7871731041\r\n 21\r\n178470.4589667354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21FC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522256.9109821169\r\n 20\r\n178539.1006810888\r\n 30\r\n0.0\r\n 11\r\n522679.2484233736\r\n 21\r\n177912.6003330697\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21FD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522496.1394130775\r\n 20\r\n178061.7366876876\r\n 30\r\n0.0\r\n 11\r\n522192.1014177453\r\n 21\r\n177744.8066244325\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21FE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522538.3415558925\r\n 20\r\n178006.5225031963\r\n 30\r\n0.0\r\n 11\r\n522414.991606401\r\n 21\r\n178156.1697820629\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n21FF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522481.6205830464\r\n 20\r\n177961.1889676354\r\n 30\r\n0.0\r\n 11\r\n522441.1277422392\r\n 21\r\n178011.1487068806\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2200\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522533.8934511245\r\n 20\r\n177976.1827093689\r\n 30\r\n0.0\r\n 11\r\n522466.0766122282\r\n 21\r\n177964.429757182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2201\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522483.4210609369\r\n 20\r\n177975.2572160508\r\n 30\r\n0.0\r\n 11\r\n522222.7916842517\r\n 21\r\n177667.5732454571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2202\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522738.9858306533\r\n 20\r\n177585.8169169486\r\n 30\r\n0.0\r\n 11\r\n522176.1206057709\r\n 21\r\n177987.17906715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2203\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522246.2006903077\r\n 20\r\n178034.8650788645\r\n 30\r\n0.0\r\n 11\r\n522093.2129145495\r\n 21\r\n177851.4788412087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2204\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522177.8865197101\r\n 20\r\n178212.7385587857\r\n 30\r\n0.0\r\n 11\r\n522245.0544657469\r\n 21\r\n178016.7912471776\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2205\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522264.0474825756\r\n 20\r\n178199.3866705242\r\n 30\r\n0.0\r\n 11\r\n522192.2382559694\r\n 21\r\n178153.1832644204\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2206\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522465.4714841699\r\n 20\r\n177624.8831154229\r\n 30\r\n0.0\r\n 11\r\n522395.9002371468\r\n 21\r\n177682.1712694014\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2207\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522450.1881014992\r\n 20\r\n177545.9465816251\r\n 30\r\n0.0\r\n 11\r\n522092.8261854525\r\n 21\r\n177854.5573566635\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2208\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522426.0545465842\r\n 20\r\n178106.0486912007\r\n 30\r\n0.0\r\n 11\r\n522138.5813376741\r\n 21\r\n177794.2885582321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2209\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521976.6627601065\r\n 20\r\n178103.1017202797\r\n 30\r\n0.0\r\n 11\r\n522144.8999162999\r\n 21\r\n177791.3340972542\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522255.1030212797\r\n 20\r\n178270.6731464957\r\n 30\r\n0.0\r\n 11\r\n522002.6708924326\r\n 21\r\n178050.2917664946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522320.3033366504\r\n 20\r\n178203.5499545608\r\n 30\r\n0.0\r\n 11\r\n522230.5836526111\r\n 21\r\n178285.390310269\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522312.9048889996\r\n 20\r\n178345.782483584\r\n 30\r\n0.0\r\n 11\r\n522359.4218327516\r\n 21\r\n178234.3199117933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522359.1406537046\r\n 20\r\n178241.0501090313\r\n 30\r\n0.0\r\n 11\r\n522318.1752510736\r\n 21\r\n178203.1099366461\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522576.3235913146\r\n 20\r\n178500.0733859163\r\n 30\r\n0.0\r\n 11\r\n522125.301511771\r\n 21\r\n178163.7749288433\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n220F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522123.1292867654\r\n 20\r\n178150.8787587293\r\n 30\r\n0.0\r\n 11\r\n522108.7648381229\r\n 21\r\n178170.4598002547\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2210\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522096.2678808032\r\n 20\r\n177962.6455004086\r\n 30\r\n0.0\r\n 11\r\n522057.339885885\r\n 21\r\n177939.4345464232\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2211\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522111.7918597045\r\n 20\r\n177962.0695101251\r\n 30\r\n0.0\r\n 11\r\n522087.7479171678\r\n 21\r\n177961.0520328995\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2212\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522153.6582751383\r\n 20\r\n177913.5342327866\r\n 30\r\n0.0\r\n 11\r\n522105.1775131542\r\n 21\r\n177966.5576058281\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2213\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522198.2723013558\r\n 20\r\n178166.4194482549\r\n 30\r\n0.0\r\n 11\r\n521963.5928772264\r\n 21\r\n178432.8390725215\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2214\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522273.9766300119\r\n 20\r\n178528.9965730892\r\n 30\r\n0.0\r\n 11\r\n522071.4855426733\r\n 21\r\n178504.0164230226\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2215\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522077.167727447\r\n 20\r\n178534.5950709659\r\n 30\r\n0.0\r\n 11\r\n522191.142326411\r\n 21\r\n178208.9555915796\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2216\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522294.0270329515\r\n 20\r\n178285.979161438\r\n 30\r\n0.0\r\n 11\r\n522272.5428685532\r\n 21\r\n178314.2709342715\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2217\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522448.3713688994\r\n 20\r\n178621.9199470397\r\n 30\r\n0.0\r\n 11\r\n522204.1543956301\r\n 21\r\n178507.8708940481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2218\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522351.0234939022\r\n 20\r\n178017.2571345561\r\n 30\r\n0.0\r\n 11\r\n522312.66148505\r\n 21\r\n178044.4318694172\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2219\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522358.6050567503\r\n 20\r\n178088.7209066533\r\n 30\r\n0.0\r\n 11\r\n522312.47344566\r\n 21\r\n178042.5400436663\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522406.3674074755\r\n 20\r\n178075.5177479402\r\n 30\r\n0.0\r\n 11\r\n522341.3630352003\r\n 21\r\n178157.1104842541\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522470.9166884662\r\n 20\r\n178234.7547502371\r\n 30\r\n0.0\r\n 11\r\n522217.8386610046\r\n 21\r\n178076.2926306018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522431.5832698395\r\n 20\r\n178478.573199893\r\n 30\r\n0.0\r\n 11\r\n522340.8915658216\r\n 21\r\n178411.6434952332\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522444.7021691809\r\n 20\r\n177827.9780981021\r\n 30\r\n0.0\r\n 11\r\n522306.7460580036\r\n 21\r\n177648.3055826175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522046.0666304656\r\n 20\r\n178429.3247346246\r\n 30\r\n0.0\r\n 11\r\n521928.5504172098\r\n 21\r\n178551.8924190301\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n221F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522362.2274122185\r\n 20\r\n178758.0753758135\r\n 30\r\n0.0\r\n 11\r\n521811.0834485826\r\n 21\r\n178241.2466501194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2220\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521929.1153236254\r\n 20\r\n178445.7925823553\r\n 30\r\n0.0\r\n 11\r\n521567.7615717663\r\n 21\r\n178695.4067518605\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2221\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521881.3366063116\r\n 20\r\n178395.3265422981\r\n 30\r\n0.0\r\n 11\r\n522009.4013641621\r\n 21\r\n178540.9594228863\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2222\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521827.5389805842\r\n 20\r\n178444.093474467\r\n 30\r\n0.0\r\n 11\r\n521870.4030224746\r\n 21\r\n178492.034267274\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2223\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521850.6757286721\r\n 20\r\n178394.8801031518\r\n 30\r\n0.0\r\n 11\r\n521828.2598447447\r\n 21\r\n178459.9553186394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2224\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521841.714326795\r\n 20\r\n178444.559193175\r\n 30\r\n0.0\r\n 11\r\n521496.4098163296\r\n 21\r\n178652.7943794518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2225\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521666.0539948833\r\n 20\r\n178335.0001542468\r\n 30\r\n0.0\r\n 11\r\n521852.7254182287\r\n 21\r\n178697.029813184\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2226\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521862.7351384069\r\n 20\r\n178688.2490104224\r\n 30\r\n0.0\r\n 11\r\n521657.3014221008\r\n 21\r\n178810.0388289521\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2227\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522027.4403528741\r\n 20\r\n178784.0508532594\r\n 30\r\n0.0\r\n 11\r\n521844.7097751325\r\n 21\r\n178686.4987243258\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2228\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522027.9975254821\r\n 20\r\n178696.8632738643\r\n 30\r\n0.0\r\n 11\r\n521970.9353580419\r\n 21\r\n178760.3867247183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2229\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521412.5972422444\r\n 20\r\n178408.9140228072\r\n 30\r\n0.0\r\n 11\r\n521660.2788883792\r\n 21\r\n178810.9114751353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521961.6854801614\r\n 20\r\n178522.0462843632\r\n 30\r\n0.0\r\n 11\r\n521608.076746813\r\n 21\r\n178756.1319311876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521988.6546724721\r\n 20\r\n179045.2030786144\r\n 30\r\n0.0\r\n 11\r\n521606.1675726558\r\n 21\r\n178749.4231064354\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522147.8980355549\r\n 20\r\n179190.6462879181\r\n 30\r\n0.0\r\n 11\r\n521764.9757191689\r\n 21\r\n178866.4730453769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522061.0495505812\r\n 20\r\n178987.4824111563\r\n 30\r\n0.0\r\n 11\r\n521953.4288271045\r\n 21\r\n179034.4644035328\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522012.1359214122\r\n 20\r\n178949.2402025678\r\n 30\r\n0.0\r\n 11\r\n521980.4330525875\r\n 21\r\n179054.4092521422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n222F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521870.5780597225\r\n 20\r\n178822.4937996476\r\n 30\r\n0.0\r\n 11\r\n522008.3775325211\r\n 21\r\n178970.2047899548\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2230\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522071.0225076675\r\n 20\r\n178739.4063192945\r\n 30\r\n0.0\r\n 11\r\n521839.1339891647\r\n 21\r\n178931.1229095936\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2231\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522158.9666137042\r\n 20\r\n178763.5770516162\r\n 30\r\n0.0\r\n 11\r\n522059.4462119843\r\n 21\r\n178693.9842706105\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2232\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522133.2961670834\r\n 20\r\n178623.4847338028\r\n 30\r\n0.0\r\n 11\r\n522193.7925335648\r\n 21\r\n178728.0214288374\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2233\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522192.6461803232\r\n 20\r\n178721.3836211599\r\n 30\r\n0.0\r\n 11\r\n522156.9129995139\r\n 21\r\n178764.2877081752\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2234\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522374.6292981416\r\n 20\r\n178436.5264092339\r\n 30\r\n0.0\r\n 11\r\n522374.6203703744\r\n 21\r\n178436.5350655447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2235\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522269.5500816715\r\n 20\r\n178538.4106061858\r\n 30\r\n0.0\r\n 11\r\n521970.7185488986\r\n 21\r\n178828.1559217988\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2236\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521957.6410111656\r\n 20\r\n178828.2440803406\r\n 30\r\n0.0\r\n 11\r\n521974.6811471498\r\n 21\r\n178845.5469222367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2237\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521767.5329517585\r\n 20\r\n178824.7483090856\r\n 30\r\n0.0\r\n 11\r\n521738.4119410404\r\n 21\r\n178859.4773158093\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2238\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521769.4396063798\r\n 20\r\n178809.3310994195\r\n 30\r\n0.0\r\n 11\r\n521764.6013748971\r\n 21\r\n178832.9051942855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2239\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521728.2008166475\r\n 20\r\n178760.2614335449\r\n 30\r\n0.0\r\n 11\r\n521772.8156345441\r\n 21\r\n178816.5764439355\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521984.9643210763\r\n 20\r\n178756.5403676881\r\n 30\r\n0.0\r\n 11\r\n522216.8329030719\r\n 21\r\n179020.4090566216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522268.0703291239\r\n 20\r\n178934.4646333423\r\n 30\r\n0.0\r\n 11\r\n522025.8194031096\r\n 21\r\n178770.3614495457\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522118.262368564\r\n 20\r\n178681.074321181\r\n 30\r\n0.0\r\n 11\r\n522142.766564551\r\n 21\r\n178706.7947043234\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522111.3814489866\r\n 20\r\n178890.3145777064\r\n 30\r\n0.0\r\n 11\r\n522049.7796018531\r\n 21\r\n178960.4362764188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522075.9275963096\r\n 20\r\n178936.9454593836\r\n 30\r\n0.0\r\n 11\r\n521995.4597844196\r\n 21\r\n178958.7975414727\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n223F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522068.4847287545\r\n 20\r\n178926.1345975258\r\n 30\r\n0.0\r\n 11\r\n522047.4637958751\r\n 21\r\n179003.4797201811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2240\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522175.729506542\r\n 20\r\n179110.717409931\r\n 30\r\n0.0\r\n 11\r\n522042.522551726\r\n 21\r\n178991.8628343214\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2241\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521862.0663092455\r\n 20\r\n178581.9597234564\r\n 30\r\n0.0\r\n 11\r\n521882.7766106609\r\n 21\r\n178624.1639098984\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2242\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521933.824660209\r\n 20\r\n178585.8699516644\r\n 30\r\n0.0\r\n 11\r\n521880.879005866\r\n 21\r\n178624.0478946972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2243\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521928.4060567806\r\n 20\r\n178536.6134365247\r\n 30\r\n0.0\r\n 11\r\n521998.5900628049\r\n 21\r\n178613.7960014759\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2244\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522095.8981080569\r\n 20\r\n178498.2800915594\r\n 30\r\n0.0\r\n 11\r\n521899.1103917653\r\n 21\r\n178722.8537455348\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2245\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521800.5821568744\r\n 20\r\n178721.4588807749\r\n 30\r\n0.0\r\n 11\r\n521839.2582663639\r\n 21\r\n178778.4125664076\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2246\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521865.0393467737\r\n 20\r\n178759.7234302135\r\n 30\r\n0.0\r\n 11\r\n521815.4172322763\r\n 21\r\n178793.6382899275\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2247\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521856.8225113138\r\n 20\r\n178757.1645292175\r\n 30\r\n0.0\r\n 11\r\n521897.7260743494\r\n 21\r\n178815.6057342713\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2248\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521898.6485579601\r\n 20\r\n178812.0045732485\r\n 30\r\n0.0\r\n 11\r\n521853.1112301707\r\n 21\r\n178844.8365937855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2249\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521815.3771462296\r\n 20\r\n178784.6029018461\r\n 30\r\n0.0\r\n 11\r\n521859.1079719484\r\n 21\r\n178848.5849515198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n521724.7223942844\r\n 20\r\n178443.219910869\r\n 30\r\n0.0\r\n 11\r\n521490.7750619347\r\n 21\r\n178566.8418969614\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523117.2926295911\r\n 20\r\n178560.6644605667\r\n 30\r\n0.0\r\n 11\r\n523044.0169703556\r\n 21\r\n178443.2619738169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523264.3763135458\r\n 20\r\n178537.648302931\r\n 30\r\n0.0\r\n 11\r\n523113.2352405079\r\n 21\r\n178125.2890619266\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523192.2762143955\r\n 20\r\n178488.2313908624\r\n 30\r\n0.0\r\n 11\r\n523030.3712347359\r\n 21\r\n178118.9295152746\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522985.5900973007\r\n 20\r\n178476.3745692628\r\n 30\r\n0.0\r\n 11\r\n523297.0399504419\r\n 21\r\n178314.3249674994\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n224F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522885.4087712395\r\n 20\r\n178318.1826624708\r\n 30\r\n0.0\r\n 11\r\n522967.4362385638\r\n 21\r\n178280.8519029954\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2250\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522821.2116009624\r\n 20\r\n178269.7752097155\r\n 30\r\n0.0\r\n 11\r\n523255.4409771307\r\n 21\r\n178084.3217158616\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2251\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523334.9725049224\r\n 20\r\n178494.1555457205\r\n 30\r\n0.0\r\n 11\r\n523181.1986239229\r\n 21\r\n178098.9482331972\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2252\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523564.082167775\r\n 20\r\n178086.5077055402\r\n 30\r\n0.0\r\n 11\r\n523175.7686956189\r\n 21\r\n178103.3264924552\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2253\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523288.1701818084\r\n 20\r\n178387.7452926942\r\n 30\r\n0.0\r\n 11\r\n523329.4351094049\r\n 21\r\n178365.2216231799\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2254\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523349.0378291003\r\n 20\r\n178425.9510557512\r\n 30\r\n0.0\r\n 11\r\n523327.8182264157\r\n 21\r\n178364.2215967394\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2255\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522866.3761997883\r\n 20\r\n178342.019559905\r\n 30\r\n0.0\r\n 11\r\n522789.2659781276\r\n 21\r\n177829.7140643849\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2256\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523270.1298366463\r\n 20\r\n178020.0343941863\r\n 30\r\n0.0\r\n 11\r\n522887.4587682224\r\n 21\r\n178066.3771239369\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2257\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523262.4436127314\r\n 20\r\n177911.5069355821\r\n 30\r\n0.0\r\n 11\r\n522514.0986425375\r\n 21\r\n178015.677017375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2258\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522728.5151155639\r\n 20\r\n177916.7015758992\r\n 30\r\n0.0\r\n 11\r\n522577.3740425265\r\n 21\r\n177504.3423348947\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2259\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522660.374377817\r\n 20\r\n177930.3568637583\r\n 30\r\n0.0\r\n 11\r\n522848.9968790347\r\n 21\r\n177885.2894681586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522644.5680059249\r\n 20\r\n177859.4868643608\r\n 30\r\n0.0\r\n 11\r\n522707.2375782236\r\n 21\r\n177845.0587525647\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522635.0732243063\r\n 20\r\n177913.0323044117\r\n 30\r\n0.0\r\n 11\r\n522654.3079907121\r\n 21\r\n177846.9469105315\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522590.2211719876\r\n 20\r\n177716.2978878188\r\n 30\r\n0.0\r\n 11\r\n522494.5100367545\r\n 21\r\n177497.9827882424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522954.1318415535\r\n 20\r\n177768.6770004641\r\n 30\r\n0.0\r\n 11\r\n522944.1725065651\r\n 21\r\n177683.8705655197\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522407.7306262626\r\n 20\r\n177597.3181014599\r\n 30\r\n0.0\r\n 11\r\n522615.1644193533\r\n 21\r\n177534.1094386737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n225F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522799.1113069407\r\n 20\r\n177873.2088186888\r\n 30\r\n0.0\r\n 11\r\n522645.3374259413\r\n 21\r\n177478.0015061654\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2260\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523022.100320529\r\n 20\r\n177791.958987279\r\n 30\r\n0.0\r\n 11\r\n522935.0210570945\r\n 21\r\n177468.3741696419\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2261\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522933.1579137868\r\n 20\r\n177821.0425273467\r\n 30\r\n0.0\r\n 11\r\n523046.0929332863\r\n 21\r\n177776.3978535631\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2262\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522949.7838224009\r\n 20\r\n177872.405723743\r\n 30\r\n0.0\r\n 11\r\n522933.6975271531\r\n 21\r\n177818.9374901971\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2263\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523087.0618515006\r\n 20\r\n178181.3008986546\r\n 30\r\n0.0\r\n 11\r\n522983.093562173\r\n 21\r\n177628.3920786128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2264\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522972.4627828186\r\n 20\r\n177620.7752357368\r\n 30\r\n0.0\r\n 11\r\n522996.3635900396\r\n 21\r\n177616.473377276\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2265\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522953.4121825747\r\n 20\r\n177695.1059851142\r\n 30\r\n0.0\r\n 11\r\n523295.8437629662\r\n 21\r\n177601.3271972424\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2266\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523245.8695832916\r\n 20\r\n177922.3987161826\r\n 30\r\n0.0\r\n 11\r\n523312.3861028709\r\n 21\r\n177729.5199952934\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2267\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523337.3596793261\r\n 20\r\n177748.0581023406\r\n 30\r\n0.0\r\n 11\r\n522994.7561350993\r\n 21\r\n177707.3875819691\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2268\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523252.7318654509\r\n 20\r\n178119.8858992136\r\n 30\r\n0.0\r\n 11\r\n523257.5655084273\r\n 21\r\n177850.3942436533\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2269\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522752.3089838269\r\n 20\r\n177766.7985656624\r\n 30\r\n0.0\r\n 11\r\n522793.5739114233\r\n 21\r\n177744.2748961479\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522813.1766311186\r\n 20\r\n177805.0043287195\r\n 30\r\n0.0\r\n 11\r\n522791.957028434\r\n 21\r\n177743.2748697074\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522780.3331484347\r\n 20\r\n177842.1105437243\r\n 30\r\n0.0\r\n 11\r\n522882.1879569673\r\n 21\r\n177819.5596897982\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523131.3338591148\r\n 20\r\n178041.830442996\r\n 30\r\n0.0\r\n 11\r\n523111.0507117023\r\n 21\r\n177930.9558991438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523256.4548944052\r\n 20\r\n177673.8722699746\r\n 30\r\n0.0\r\n 11\r\n523418.1880398422\r\n 21\r\n177622.1490903978\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523412.8890915473\r\n 20\r\n178102.3147584902\r\n 30\r\n0.0\r\n 11\r\n523190.7292212283\r\n 21\r\n177380.1537014019\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n226F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523322.6267890519\r\n 20\r\n177576.0454917421\r\n 30\r\n0.0\r\n 11\r\n523797.1159115772\r\n 21\r\n177362.2379585418\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2270\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523298.2812622759\r\n 20\r\n177510.9538459399\r\n 30\r\n0.0\r\n 11\r\n523372.8476595442\r\n 21\r\n177689.9772257265\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2271\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523222.927963442\r\n 20\r\n177531.0523223896\r\n 30\r\n0.0\r\n 11\r\n523379.6568120642\r\n 21\r\n177491.6654751828\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2272\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523359.9152172615\r\n 20\r\n177496.9883692452\r\n 30\r\n0.0\r\n 11\r\n523596.0536168629\r\n 21\r\n177281.4952158278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2273\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523427.4150912213\r\n 20\r\n177736.5054243714\r\n 30\r\n0.0\r\n 11\r\n523769.2530115786\r\n 21\r\n177491.8840838794\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2274\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523507.126612966\r\n 20\r\n177922.1356525813\r\n 30\r\n0.0\r\n 11\r\n523488.329698442\r\n 21\r\n177802.1600653523\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2275\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523392.5543045613\r\n 20\r\n177837.5305966636\r\n 30\r\n0.0\r\n 11\r\n523459.8863007098\r\n 21\r\n177937.800897655\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2276\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523454.426941331\r\n 20\r\n177933.855012242\r\n 30\r\n0.0\r\n 11\r\n523508.6671999444\r\n 21\r\n177920.6030222447\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2277\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523118.5824410856\r\n 20\r\n177972.1950437001\r\n 30\r\n0.0\r\n 11\r\n523118.5941394303\r\n 21\r\n177972.1908264169\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2278\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523256.2711700598\r\n 20\r\n177922.5579080452\r\n 30\r\n0.0\r\n 11\r\n524206.9096920682\r\n 21\r\n177483.8653524531\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2279\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523557.8080143858\r\n 20\r\n177611.8563831612\r\n 30\r\n0.0\r\n 11\r\n523689.0873473517\r\n 21\r\n177951.6823052399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523580.5831528878\r\n 20\r\n178047.796043503\r\n 30\r\n0.0\r\n 11\r\n523538.933167342\r\n 21\r\n177779.4375370703\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523450.8935312671\r\n 20\r\n177849.3250996077\r\n 30\r\n0.0\r\n 11\r\n523463.2340032221\r\n 21\r\n177882.6373568399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523511.7455392582\r\n 20\r\n177432.5135306539\r\n 30\r\n0.0\r\n 11\r\n523503.2210136295\r\n 21\r\n177612.7787581072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523446.394163893\r\n 20\r\n177641.8139048939\r\n 30\r\n0.0\r\n 11\r\n523503.9504363352\r\n 21\r\n177611.02310837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523296.5081963189\r\n 20\r\n177748.9305834032\r\n 30\r\n0.0\r\n 11\r\n523523.0900234353\r\n 21\r\n177687.5092883659\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n227F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523432.4273113113\r\n 20\r\n178034.7409239569\r\n 30\r\n0.0\r\n 11\r\n523234.4501864689\r\n 21\r\n177967.0466580876\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2280\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523451.2216057295\r\n 20\r\n177624.6776377849\r\n 30\r\n0.0\r\n 11\r\n523501.8291267167\r\n 21\r\n177730.3614702396\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2281\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522989.217000509\r\n 20\r\n178474.4874654012\r\n 30\r\n0.0\r\n 11\r\n522793.0428596554\r\n 21\r\n178446.5607997053\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2282\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524372.789972169\r\n 20\r\n175674.8090526176\r\n 30\r\n0.0\r\n 11\r\n524656.1468986651\r\n 21\r\n175585.4719382363\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2283\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524609.9276783371\r\n 20\r\n175845.1157330388\r\n 30\r\n0.0\r\n 11\r\n524455.1045044787\r\n 21\r\n175629.5293787359\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2284\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524837.1252858419\r\n 20\r\n175691.9315692493\r\n 30\r\n0.0\r\n 11\r\n524522.4431839671\r\n 21\r\n175809.978900038\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2285\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524477.787930299\r\n 20\r\n175895.319111842\r\n 30\r\n0.0\r\n 11\r\n524346.7470590595\r\n 21\r\n175769.9642275434\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2286\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524062.1636056715\r\n 20\r\n176105.7794112304\r\n 30\r\n0.0\r\n 11\r\n523970.0631542091\r\n 21\r\n175969.8244162033\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2287\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524574.029780333\r\n 20\r\n175783.4213092316\r\n 30\r\n0.0\r\n 11\r\n524391.1894371221\r\n 21\r\n175944.5171051869\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2288\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524475.2708319019\r\n 20\r\n175608.7641049108\r\n 30\r\n0.0\r\n 11\r\n524226.9133393759\r\n 21\r\n175758.6792206554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2289\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523564.0490320267\r\n 20\r\n177477.8787289761\r\n 30\r\n0.0\r\n 11\r\n523802.7362644429\r\n 21\r\n177848.6042946811\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523932.823944941\r\n 20\r\n177859.2898223397\r\n 30\r\n0.0\r\n 11\r\n524279.7674590437\r\n 21\r\n177779.3509319115\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523183.9420759116\r\n 20\r\n178234.5704337749\r\n 30\r\n0.0\r\n 11\r\n523502.8945818244\r\n 21\r\n178227.2281691125\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n525106.4182794202\r\n 20\r\n176431.403902401\r\n 30\r\n0.0\r\n 11\r\n525008.4747173305\r\n 21\r\n176216.1914333139\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523366.006484977\r\n 20\r\n176426.2010255347\r\n 30\r\n0.0\r\n 11\r\n523009.6530059661\r\n 21\r\n176602.0695102401\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522712.3374426255\r\n 20\r\n175087.5753245441\r\n 30\r\n0.0\r\n 11\r\n523600.7708103929\r\n 21\r\n177556.09968367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n228F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522618.6029150704\r\n 20\r\n177570.0955422215\r\n 30\r\n0.0\r\n 11\r\n522409.733756899\r\n 21\r\n177698.6243181571\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2290\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522592.7488602845\r\n 20\r\n177591.5478147034\r\n 30\r\n0.0\r\n 11\r\n522563.14617815\r\n 21\r\n177351.7929963389\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2291\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523036.3238127537\r\n 20\r\n177433.5858675359\r\n 30\r\n0.0\r\n 11\r\n522287.97884256\r\n 21\r\n177537.755949329\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2292\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522502.3953155862\r\n 20\r\n177438.780507853\r\n 30\r\n0.0\r\n 11\r\n522351.2542425488\r\n 21\r\n177026.4212668487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2293\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522434.2545778394\r\n 20\r\n177452.4357957124\r\n 30\r\n0.0\r\n 11\r\n522622.8770790572\r\n 21\r\n177407.3684001126\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2294\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522418.4482059472\r\n 20\r\n177381.5657963146\r\n 30\r\n0.0\r\n 11\r\n522481.1177782461\r\n 21\r\n177367.1376845188\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2295\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522430.2952164364\r\n 20\r\n177389.3635957844\r\n 30\r\n0.0\r\n 11\r\n522268.3902367768\r\n 21\r\n177020.0617201964\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2296\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522321.2724142016\r\n 20\r\n177326.8178655068\r\n 30\r\n0.0\r\n 11\r\n522584.9471001396\r\n 21\r\n177189.5000098832\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2297\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522588.0570526725\r\n 20\r\n177202.4470246138\r\n 30\r\n0.0\r\n 11\r\n522490.5245491324\r\n 21\r\n176984.4488997454\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2298\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522777.8581554662\r\n 20\r\n177219.2202813615\r\n 30\r\n0.0\r\n 11\r\n522572.3242687356\r\n 21\r\n177193.4772569366\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2299\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522728.0120415759\r\n 20\r\n177290.7559324181\r\n 30\r\n0.0\r\n 11\r\n522718.0527065875\r\n 21\r\n177205.9494974737\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229A\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522181.6108262849\r\n 20\r\n177119.3970334139\r\n 30\r\n0.0\r\n 11\r\n522493.4599791716\r\n 21\r\n176985.4539207836\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229B\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522572.9915069632\r\n 20\r\n177395.2877506425\r\n 30\r\n0.0\r\n 11\r\n522419.2176259636\r\n 21\r\n177000.0804381194\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229C\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522956.9896205523\r\n 20\r\n176982.7148825853\r\n 30\r\n0.0\r\n 11\r\n522413.7876976597\r\n 21\r\n177004.4586973774\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229D\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522922.6758630746\r\n 20\r\n177072.4490018759\r\n 30\r\n0.0\r\n 11\r\n522861.8773769898\r\n 21\r\n176971.984720566\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229E\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522860.6604433927\r\n 20\r\n177075.4651845424\r\n 30\r\n0.0\r\n 11\r\n522895.4410376646\r\n 21\r\n176971.2734807353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n229F\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522671.9130625024\r\n 20\r\n177097.3216496357\r\n 30\r\n0.0\r\n 11\r\n522869.6857360561\r\n 21\r\n177056.1731264949\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522795.9805205514\r\n 20\r\n177314.0379192328\r\n 30\r\n0.0\r\n 11\r\n522708.9012571168\r\n 21\r\n176990.453101596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522707.0381138093\r\n 20\r\n177343.1214593006\r\n 30\r\n0.0\r\n 11\r\n522819.9731333086\r\n 21\r\n177298.4767855171\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522723.6640224234\r\n 20\r\n177394.484655697\r\n 30\r\n0.0\r\n 11\r\n522707.5777271754\r\n 21\r\n177341.016422151\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522930.7351701595\r\n 20\r\n178092.0130773293\r\n 30\r\n0.0\r\n 11\r\n522756.9737621957\r\n 21\r\n177150.4710105668\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522746.3429828408\r\n 20\r\n177142.8541676907\r\n 30\r\n0.0\r\n 11\r\n522770.2437900621\r\n 21\r\n177138.5523092299\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522589.0472400136\r\n 20\r\n177036.0302754347\r\n 30\r\n0.0\r\n 11\r\n522585.2976405672\r\n 21\r\n176990.8630563793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522581.7099174523\r\n 20\r\n177049.7229517024\r\n 30\r\n0.0\r\n 11\r\n522591.3587077851\r\n 21\r\n177027.6764717624\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522519.7165579189\r\n 20\r\n177066.0107772594\r\n 30\r\n0.0\r\n 11\r\n522588.647496611\r\n 21\r\n177045.7527402797\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522727.2923825973\r\n 20\r\n177217.1849170681\r\n 30\r\n0.0\r\n 11\r\n523069.7239629884\r\n 21\r\n177123.4061291966\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22A9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523019.7497833138\r\n 20\r\n177444.4776481365\r\n 30\r\n0.0\r\n 11\r\n523086.2663028933\r\n 21\r\n177251.5989272474\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22AA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523111.2398793484\r\n 20\r\n177270.1370342946\r\n 30\r\n0.0\r\n 11\r\n522768.6363351217\r\n 21\r\n177229.466513923\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22AB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522792.6305951866\r\n 20\r\n177355.728814859\r\n 30\r\n0.0\r\n 11\r\n522827.4843337016\r\n 21\r\n177348.8578148228\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22AC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522907.727477809\r\n 20\r\n177180.8530314709\r\n 30\r\n0.0\r\n 11\r\n522897.8668974793\r\n 21\r\n177088.0381126475\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22AD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522905.6718170554\r\n 20\r\n177122.3108325493\r\n 30\r\n0.0\r\n 11\r\n522852.5534162397\r\n 21\r\n177058.0378387128\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22AE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522893.3554149922\r\n 20\r\n177126.8470481271\r\n 30\r\n0.0\r\n 11\r\n522920.808456164\r\n 21\r\n177051.5444708262\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22AF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523035.5253002461\r\n 20\r\n177046.6448839554\r\n 30\r\n0.0\r\n 11\r\n522910.0703423325\r\n 21\r\n177058.1823049736\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523118.8441793682\r\n 20\r\n177673.3885298317\r\n 30\r\n0.0\r\n 11\r\n523031.4457084499\r\n 21\r\n177372.4731756072\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522526.1891838492\r\n 20\r\n177288.8774976165\r\n 30\r\n0.0\r\n 11\r\n522567.4541114458\r\n 21\r\n177266.3538281018\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522587.0568311411\r\n 20\r\n177327.0832606734\r\n 30\r\n0.0\r\n 11\r\n522565.8372284563\r\n 21\r\n177265.3538016613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522554.2133484569\r\n 20\r\n177364.1894756781\r\n 30\r\n0.0\r\n 11\r\n522656.0681569896\r\n 21\r\n177341.6386217522\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522668.9039854603\r\n 20\r\n177492.1312216434\r\n 30\r\n0.0\r\n 11\r\n522637.7326444329\r\n 21\r\n177195.1681282435\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522556.4507353304\r\n 20\r\n177139.4634608348\r\n 30\r\n0.0\r\n 11\r\n522620.8994502913\r\n 21\r\n177115.2575340343\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522631.1749151017\r\n 20\r\n177145.3965907832\r\n 30\r\n0.0\r\n 11\r\n522610.21045187\r\n 21\r\n177089.0666410405\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522622.9871527007\r\n 20\r\n177142.7461368318\r\n 30\r\n0.0\r\n 11\r\n522690.1134319515\r\n 21\r\n177118.6103014182\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522688.7892890037\r\n 20\r\n177122.0839136846\r\n 30\r\n0.0\r\n 11\r\n522670.5365274142\r\n 21\r\n177068.9950590248\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22B9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522604.9649153015\r\n 20\r\n177096.4235555283\r\n 30\r\n0.0\r\n 11\r\n522677.5971672725\r\n 21\r\n177069.393132444\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22BA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522905.2140591371\r\n 20\r\n177563.9093749503\r\n 30\r\n0.0\r\n 11\r\n522884.9309117248\r\n 21\r\n177453.0348310975\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22BB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522916.9609239598\r\n 20\r\n176997.2583139437\r\n 30\r\n0.0\r\n 11\r\n523309.4597069945\r\n 21\r\n176690.1548750701\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22BC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522983.3748628622\r\n 20\r\n177015.0960695728\r\n 30\r\n0.0\r\n 11\r\n523154.5497859308\r\n 21\r\n176865.5345421712\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22BD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523030.3350944276\r\n 20\r\n177195.9512019287\r\n 30\r\n0.0\r\n 11\r\n523192.0682398648\r\n 21\r\n177144.2280223518\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22BE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523149.8577154443\r\n 20\r\n177504.407561558\r\n 30\r\n0.0\r\n 11\r\n522964.6094212506\r\n 21\r\n176902.2326333558\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22BF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523072.1614622984\r\n 20\r\n177033.0327778939\r\n 30\r\n0.0\r\n 11\r\n523146.7278595665\r\n 21\r\n177212.0561576804\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523139.6044650193\r\n 20\r\n177006.1285107414\r\n 30\r\n0.0\r\n 11\r\n523163.8405590469\r\n 21\r\n177065.6957622174\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523085.2301433318\r\n 20\r\n177005.292945494\r\n 30\r\n0.0\r\n 11\r\n523153.5370120867\r\n 21\r\n177013.7444071367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523133.7954172838\r\n 20\r\n177019.0673011991\r\n 30\r\n0.0\r\n 11\r\n523369.9338168852\r\n 21\r\n176803.5741477818\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523201.2952912438\r\n 20\r\n177258.5843563253\r\n 30\r\n0.0\r\n 11\r\n523469.6868838103\r\n 21\r\n177102.9976669321\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522892.4626411082\r\n 20\r\n177494.273975654\r\n 30\r\n0.0\r\n 11\r\n522892.4743394529\r\n 21\r\n177494.2697583709\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523370.9808339675\r\n 20\r\n177511.3258745974\r\n 30\r\n0.0\r\n 11\r\n523229.2729998291\r\n 21\r\n177132.4780320576\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523285.6257392806\r\n 20\r\n176954.5924626077\r\n 30\r\n0.0\r\n 11\r\n523277.1012136519\r\n 21\r\n177134.8576900612\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523220.2743639153\r\n 20\r\n177163.8928368478\r\n 30\r\n0.0\r\n 11\r\n523277.8306363575\r\n 21\r\n177133.1020403241\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523070.3883963411\r\n 20\r\n177271.0095153573\r\n 30\r\n0.0\r\n 11\r\n523296.9702234576\r\n 21\r\n177209.5882203198\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22C9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523142.0526494567\r\n 20\r\n176768.5200463112\r\n 30\r\n0.0\r\n 11\r\n523294.2312541298\r\n 21\r\n176974.6534660719\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22CA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522970.8974974627\r\n 20\r\n176465.2881509185\r\n 30\r\n0.0\r\n 11\r\n522810.4737277414\r\n 21\r\n176334.2496221969\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22CB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522882.3557151454\r\n 20\r\n176714.0152435247\r\n 30\r\n0.0\r\n 11\r\n522564.2667872466\r\n 21\r\n176349.8702072874\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22CC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523033.9977751668\r\n 20\r\n176916.9623170844\r\n 30\r\n0.0\r\n 11\r\n522697.4499817042\r\n 21\r\n176495.4138513231\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22CD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522964.5437895761\r\n 20\r\n176671.3794105949\r\n 30\r\n0.0\r\n 11\r\n522849.8705059365\r\n 21\r\n176696.6690477735\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22CE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522923.946205671\r\n 20\r\n176624.402333022\r\n 30\r\n0.0\r\n 11\r\n522872.5093980661\r\n 21\r\n176721.4582741256\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22CF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522809.5624480385\r\n 20\r\n176472.6801037702\r\n 30\r\n0.0\r\n 11\r\n522916.2056970165\r\n 21\r\n176644.2448111216\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523215.1199951155\r\n 20\r\n176322.0721058092\r\n 30\r\n0.0\r\n 11\r\n522757.7106326434\r\n 21\r\n176573.1808616837\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522893.8712146281\r\n 20\r\n176495.1535351531\r\n 30\r\n0.0\r\n 11\r\n522907.2447679747\r\n 21\r\n176515.4242688083\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522934.5413278785\r\n 20\r\n176430.0848978472\r\n 30\r\n0.0\r\n 11\r\n523147.5422717344\r\n 21\r\n176808.6187573986\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523151.9711731364\r\n 20\r\n176777.1695290931\r\n 30\r\n0.0\r\n 11\r\n522961.8759750708\r\n 21\r\n176843.336952638\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523258.3890803028\r\n 20\r\n176748.837564359\r\n 30\r\n0.0\r\n 11\r\n522971.9536615696\r\n 21\r\n176451.5436331187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523032.7113255405\r\n 20\r\n176585.7752349081\r\n 30\r\n0.0\r\n 11\r\n522958.7152083104\r\n 21\r\n176642.6647316137\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522988.9113168237\r\n 20\r\n176624.6722017828\r\n 30\r\n0.0\r\n 11\r\n522905.7369816604\r\n 21\r\n176630.5554162212\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522983.6988970849\r\n 20\r\n176612.6263854128\r\n 30\r\n0.0\r\n 11\r\n522948.121624614\r\n 21\r\n176684.4484245179\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n523053.235560517\r\n 20\r\n176814.4602513443\r\n 30\r\n0.0\r\n 11\r\n522945.5194598575\r\n 21\r\n176672.0954220733\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22D9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522635.2002345229\r\n 20\r\n176845.2024216892\r\n 30\r\n0.0\r\n 11\r\n522466.1286024288\r\n 21\r\n177011.3332236175\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22DA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522553.6330427988\r\n 20\r\n176814.4001867653\r\n 30\r\n0.0\r\n 11\r\n522593.3851924734\r\n 21\r\n176889.9719166494\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22DB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522837.6417227955\r\n 20\r\n176884.3357929314\r\n 30\r\n0.0\r\n 11\r\n522844.323322404\r\n 21\r\n177001.5743700122\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22DC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522784.7924330184\r\n 20\r\n176916.9235545342\r\n 30\r\n0.0\r\n 11\r\n522872.4051397392\r\n 21\r\n176983.1777204499\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22DD\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522594.441952885\r\n 20\r\n176798.3315183045\r\n 30\r\n0.0\r\n 11\r\n522719.2650538682\r\n 21\r\n177012.829104645\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22DE\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522661.679110632\r\n 20\r\n176714.7524199197\r\n 30\r\n0.0\r\n 11\r\n522561.8551868182\r\n 21\r\n176783.9091243017\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22DF\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522521.3914708863\r\n 20\r\n176690.1717878172\r\n 30\r\n0.0\r\n 11\r\n522640.4314452108\r\n 21\r\n176669.7459346153\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E0\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522633.8086779382\r\n 20\r\n176668.5156622181\r\n 30\r\n0.0\r\n 11\r\n522661.6323248885\r\n 21\r\n176716.9250163114\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E1\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522488.9328765944\r\n 20\r\n176532.853079181\r\n 30\r\n0.0\r\n 11\r\n522656.8608817391\r\n 21\r\n176913.7110815744\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E2\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522594.650425108\r\n 20\r\n176875.4803517717\r\n 30\r\n0.0\r\n 11\r\n522922.6215479869\r\n 21\r\n176749.6842195823\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E3\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522859.8210929988\r\n 20\r\n176671.7880028932\r\n 30\r\n0.0\r\n 11\r\n522621.7999646015\r\n 21\r\n176841.9682265487\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E4\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522570.1753130277\r\n 20\r\n176724.2703569694\r\n 30\r\n0.0\r\n 11\r\n522602.804927966\r\n 21\r\n176710.223935399\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E5\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522764.0019606305\r\n 20\r\n176803.3909148802\r\n 30\r\n0.0\r\n 11\r\n522808.3650537079\r\n 21\r\n176885.5112909946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E6\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522795.4174414889\r\n 20\r\n176852.8326215467\r\n 30\r\n0.0\r\n 11\r\n522787.9633609084\r\n 21\r\n176935.8809142724\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E7\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522782.6946236574\r\n 20\r\n176856.0576669683\r\n 30\r\n0.0\r\n 11\r\n522847.9250446198\r\n 21\r\n176902.6316919044\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E8\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522993.0337954206\r\n 20\r\n176819.5927547916\r\n 30\r\n0.0\r\n 11\r\n522835.3151721327\r\n 21\r\n176903.2308969453\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22E9\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522390.9919093851\r\n 20\r\n176681.7592009042\r\n 30\r\n0.0\r\n 11\r\n522533.2440119064\r\n 21\r\n176944.2912383229\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22EA\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n522233.0726592325\r\n 20\r\n177213.5460147199\r\n 30\r\n0.0\r\n 11\r\n522580.016173335\r\n 21\r\n177133.6071242916\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22EB\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n524709.0037862509\r\n 20\r\n178824.6619104634\r\n 30\r\n0.0\r\n 11\r\n524537.941867023\r\n 21\r\n178950.6289273412\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n22EC\r\n330\r\n6F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n526843.0193992567\r\n 20\r\n179583.5671331468\r\n 30\r\n0.0\r\n 11\r\n527269.5564950807\r\n 21\r\n179979.6252205521\r\n 31\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nOBJECTS\r\n  0\r\nDICTIONARY\r\n  5\r\nC\r\n330\r\n0\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nACAD_CIP_PREVIOUS_PRODUCT_INFO\r\n350\r\nB4\r\n  3\r\nACAD_COLOR\r\n350\r\n62\r\n  3\r\nACAD_DETAILVIEWSTYLE\r\n350\r\n69\r\n  3\r\nACAD_GROUP\r\n350\r\nD\r\n  3\r\nACAD_LAYOUT\r\n350\r\n61\r\n  3\r\nACAD_MATERIAL\r\n350\r\n10\r\n  3\r\nACAD_MLEADERSTYLE\r\n350\r\n65\r\n  3\r\nACAD_MLINESTYLE\r\n350\r\n5E\r\n  3\r\nACAD_PLOTSETTINGS\r\n350\r\n60\r\n  3\r\nACAD_PLOTSTYLENAME\r\n350\r\nE\r\n  3\r\nACAD_SCALELIST\r\n350\r\n42\r\n  3\r\nACAD_SECTIONVIEWSTYLE\r\n350\r\n67\r\n  3\r\nACAD_TABLESTYLE\r\n350\r\n63\r\n  3\r\nACAD_VISUALSTYLE\r\n350\r\n29\r\n  3\r\nACDB_RECOMPOSE_DATA\r\n350\r\n22F5\r\n  3\r\nAcDbVariableDictionary\r\n350\r\n34B\r\n  0\r\nDICTIONARY\r\n  5\r\n345\r\n330\r\n2\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_LAYERSTATES\r\n360\r\n346\r\n  0\r\nDICTIONARY\r\n  5\r\n340\r\n330\r\n54\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nADSK_XREC_LAYER_RECONCILED\r\n360\r\n341\r\n  0\r\nDICTIONARY\r\n  5\r\n135\r\n330\r\n6F\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_SORTENTS\r\n360\r\n136\r\n  0\r\nXRECORD\r\n  5\r\nB4\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n300\r\nACDMAC\r\n300\r\n2018\r\n300\r\nACDMAC_F_S\r\n  0\r\nDICTIONARY\r\n  5\r\n62\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n69\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nImperial24\r\n350\r\n6A\r\n  0\r\nDICTIONARY\r\n  5\r\nD\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n61\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nLayout1\r\n350\r\n6E\r\n  3\r\nModel\r\n350\r\n72\r\n  0\r\nDICTIONARY\r\n  5\r\n10\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nByBlock\r\n350\r\n19\r\n  3\r\nByLayer\r\n350\r\n11\r\n  3\r\nGlobal\r\n350\r\n21\r\n  0\r\nDICTIONARY\r\n  5\r\n65\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n66\r\n  0\r\nDICTIONARY\r\n  5\r\n5E\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n5F\r\n  0\r\nDICTIONARY\r\n  5\r\n60\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nACDBDICTIONARYWDFLT\r\n  5\r\nE\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nNormal\r\n350\r\nF\r\n100\r\nAcDbDictionaryWithDefault\r\n340\r\nF\r\n  0\r\nDICTIONARY\r\n  5\r\n42\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nA0\r\n350\r\n43\r\n  3\r\nA1\r\n350\r\n44\r\n  3\r\nA2\r\n350\r\n45\r\n  3\r\nA3\r\n350\r\n46\r\n  3\r\nA4\r\n350\r\n47\r\n  3\r\nA5\r\n350\r\n48\r\n  3\r\nA6\r\n350\r\n49\r\n  3\r\nA7\r\n350\r\n4A\r\n  3\r\nA8\r\n350\r\n4B\r\n  3\r\nA9\r\n350\r\n4C\r\n  3\r\nB0\r\n350\r\n4D\r\n  3\r\nB1\r\n350\r\n4E\r\n  3\r\nB2\r\n350\r\n4F\r\n  3\r\nB3\r\n350\r\n50\r\n  3\r\nB4\r\n350\r\n51\r\n  3\r\nB5\r\n350\r\n52\r\n  3\r\nB6\r\n350\r\n53\r\n  0\r\nDICTIONARY\r\n  5\r\n67\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nImperial24\r\n350\r\n68\r\n  0\r\nDICTIONARY\r\n  5\r\n63\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n64\r\n  0\r\nDICTIONARY\r\n  5\r\n29\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n2dWireframe\r\n350\r\n2F\r\n  3\r\nBasic\r\n350\r\n2E\r\n  3\r\nBrighten\r\n350\r\n35\r\n  3\r\nColorChange\r\n350\r\n39\r\n  3\r\nConceptual\r\n350\r\n32\r\n  3\r\nDim\r\n350\r\n34\r\n  3\r\nEdgeColorOff\r\n350\r\n41\r\n  3\r\nFacepattern\r\n350\r\n38\r\n  3\r\nFlat\r\n350\r\n2A\r\n  3\r\nFlatWithEdges\r\n350\r\n2B\r\n  3\r\nGouraud\r\n350\r\n2C\r\n  3\r\nGouraudWithEdges\r\n350\r\n2D\r\n  3\r\nHidden\r\n350\r\n31\r\n  3\r\nJitterOff\r\n350\r\n3F\r\n  3\r\nLinepattern\r\n350\r\n37\r\n  3\r\nOverhangOff\r\n350\r\n40\r\n  3\r\nRealistic\r\n350\r\n33\r\n  3\r\nShaded\r\n350\r\n3E\r\n  3\r\nShaded with edges\r\n350\r\n3D\r\n  3\r\nShades of Gray\r\n350\r\n3A\r\n  3\r\nSketchy\r\n350\r\n3B\r\n  3\r\nThicken\r\n350\r\n36\r\n  3\r\nWireframe\r\n350\r\n30\r\n  3\r\nX-Ray\r\n350\r\n3C\r\n  0\r\nXRECORD\r\n  5\r\n22F5\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 90\r\n        1\r\n330\r\n64\r\n  0\r\nDICTIONARY\r\n  5\r\n34B\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nCANNOSCALE\r\n350\r\n351\r\n  3\r\nCMLEADERSTYLE\r\n350\r\n34D\r\n  3\r\nCTABLESTYLE\r\n350\r\n34C\r\n  3\r\nCVIEWDETAILSTYLE\r\n350\r\n34E\r\n  3\r\nCVIEWSECTIONSTYLE\r\n350\r\n34F\r\n  3\r\nLAYEREVAL\r\n350\r\n353\r\n  3\r\nLAYERNOTIFY\r\n350\r\n354\r\n  3\r\nLIGHTINGUNITS\r\n350\r\n352\r\n  3\r\nMSLTSCALE\r\n350\r\n350\r\n  0\r\nDICTIONARY\r\n  5\r\n346\r\n102\r\n{ACAD_REACTORS\r\n330\r\n345\r\n102\r\n}\r\n330\r\n345\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n341\r\n102\r\n{ACAD_REACTORS\r\n330\r\n340\r\n102\r\n}\r\n330\r\n340\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n290\r\n     1\r\n  0\r\nSORTENTSTABLE\r\n  5\r\n136\r\n102\r\n{ACAD_REACTORS\r\n330\r\n135\r\n102\r\n}\r\n330\r\n135\r\n100\r\nAcDbSortentsTable\r\n330\r\n6F\r\n331\r\n324\r\n  5\r\n1BF\r\n331\r\n320\r\n  5\r\n321\r\n331\r\n31C\r\n  5\r\n31D\r\n331\r\n147\r\n  5\r\n147\r\n331\r\nBD\r\n  5\r\nBD\r\n331\r\n318\r\n  5\r\n319\r\n331\r\n143\r\n  5\r\n143\r\n331\r\nB9\r\n  5\r\nB9\r\n331\r\n17C\r\n  5\r\n17C\r\n331\r\n13F\r\n  5\r\n13F\r\n331\r\nAD\r\n  5\r\nAD\r\n331\r\nA9\r\n  5\r\nA9\r\n331\r\n13B\r\n  5\r\n13B\r\n331\r\n1B6\r\n  5\r\n1B6\r\n331\r\n1F7\r\n  5\r\n1F8\r\n331\r\n1F3\r\n  5\r\n1F4\r\n331\r\n1B2\r\n  5\r\n1B2\r\n331\r\n237\r\n  5\r\n238\r\n331\r\n233\r\n  5\r\n234\r\n331\r\n2AE\r\n  5\r\n2AF\r\n331\r\n22F\r\n  5\r\n230\r\n331\r\n26C\r\n  5\r\n26D\r\n331\r\n268\r\n  5\r\n269\r\n331\r\n2AA\r\n  5\r\n2AB\r\n331\r\n22B\r\n  5\r\n22C\r\n331\r\n2E7\r\n  5\r\n2E8\r\n331\r\n2A6\r\n  5\r\n2A7\r\n331\r\n2A2\r\n  5\r\n2A3\r\n331\r\n2E3\r\n  5\r\n2E4\r\n331\r\n310\r\n  5\r\n311\r\n331\r\nEE\r\n  5\r\nEE\r\n331\r\n12F\r\n  5\r\n130\r\n331\r\nA5\r\n  5\r\nA5\r\n331\r\nEA\r\n  5\r\nEA\r\n331\r\n308\r\n  5\r\n309\r\n331\r\n170\r\n  5\r\n170\r\n331\r\n12B\r\n  5\r\n12C\r\n331\r\nA1\r\n  5\r\nA1\r\n331\r\nE6\r\n  5\r\nE6\r\n331\r\nE2\r\n  5\r\nE2\r\n331\r\n16C\r\n  5\r\n16C\r\n331\r\n127\r\n  5\r\n128\r\n331\r\n9D\r\n  5\r\n9D\r\n331\r\n168\r\n  5\r\n168\r\n331\r\n99\r\n  5\r\n99\r\n331\r\n1AE\r\n  5\r\n1AE\r\n331\r\n1EF\r\n  5\r\n1F0\r\n331\r\n123\r\n  5\r\n124\r\n331\r\n1EB\r\n  5\r\n1EC\r\n331\r\n1A6\r\n  5\r\n1A6\r\n331\r\n1E7\r\n  5\r\n1E8\r\n331\r\n1A2\r\n  5\r\n1A2\r\n331\r\n227\r\n  5\r\n228\r\n331\r\n264\r\n  5\r\n265\r\n331\r\n223\r\n  5\r\n224\r\n331\r\n260\r\n  5\r\n261\r\n331\r\n21F\r\n  5\r\n220\r\n331\r\n2DF\r\n  5\r\n2E0\r\n331\r\n25C\r\n  5\r\n25D\r\n331\r\n258\r\n  5\r\n259\r\n331\r\n29A\r\n  5\r\n29B\r\n331\r\n21B\r\n  5\r\n21C\r\n331\r\n2DB\r\n  5\r\n2DC\r\n331\r\n2D7\r\n  5\r\n2D8\r\n331\r\n296\r\n  5\r\n297\r\n331\r\n292\r\n  5\r\n293\r\n331\r\n2D3\r\n  5\r\n2D4\r\n331\r\n74\r\n  5\r\n74\r\n331\r\n134\r\n  5\r\n11B\r\n331\r\n130\r\n  5\r\n131\r\n331\r\nDE\r\n  5\r\nDE\r\n331\r\nDA\r\n  5\r\nDA\r\n331\r\n2F8\r\n  5\r\n2F9\r\n331\r\n11F\r\n  5\r\n120\r\n331\r\n160\r\n  5\r\n160\r\n331\r\n11B\r\n  5\r\n11C\r\n331\r\n91\r\n  5\r\n91\r\n331\r\nD6\r\n  5\r\nD6\r\n331\r\nD2\r\n  5\r\nD2\r\n331\r\n15C\r\n  5\r\n15C\r\n331\r\n117\r\n  5\r\n117\r\n331\r\n8D\r\n  5\r\n8D\r\n331\r\n89\r\n  5\r\n89\r\n331\r\n19E\r\n  5\r\n19E\r\n331\r\n113\r\n  5\r\n113\r\n331\r\n1D7\r\n  5\r\n1DC\r\n331\r\n1D3\r\n  5\r\n1D4\r\n331\r\n217\r\n  5\r\n218\r\n331\r\n254\r\n  5\r\n255\r\n331\r\n213\r\n  5\r\n214\r\n331\r\n250\r\n  5\r\n251\r\n331\r\n28E\r\n  5\r\n28F\r\n331\r\n20F\r\n  5\r\n210\r\n331\r\n2CF\r\n  5\r\n2D0\r\n331\r\n24C\r\n  5\r\n24D\r\n331\r\n248\r\n  5\r\n249\r\n331\r\n28A\r\n  5\r\n28B\r\n331\r\n20B\r\n  5\r\n20C\r\n331\r\n2CB\r\n  5\r\n2CC\r\n331\r\n2C7\r\n  5\r\n2C8\r\n331\r\n286\r\n  5\r\n287\r\n331\r\n282\r\n  5\r\n283\r\n331\r\nF0\r\n  5\r\nF0\r\n331\r\n2F4\r\n  5\r\n2F5\r\n331\r\n2F0\r\n  5\r\n2F1\r\n331\r\n2EC\r\n  5\r\n2ED\r\n331\r\n85\r\n  5\r\n85\r\n331\r\nCA\r\n  5\r\nCA\r\n331\r\n2E8\r\n  5\r\n2E9\r\n331\r\n10F\r\n  5\r\n10F\r\n331\r\n150\r\n  5\r\n150\r\n331\r\n10B\r\n  5\r\n10B\r\n331\r\n81\r\n  5\r\n81\r\n331\r\nC6\r\n  5\r\nC6\r\n331\r\nC2\r\n  5\r\nC2\r\n331\r\n14C\r\n  5\r\n14C\r\n331\r\n107\r\n  5\r\n107\r\n331\r\n7D\r\n  5\r\n7D\r\n331\r\n148\r\n  5\r\n148\r\n331\r\n1CF\r\n  5\r\n1D0\r\n331\r\n18E\r\n  5\r\n18E\r\n331\r\n79\r\n  5\r\n79\r\n331\r\n1CB\r\n  5\r\n1CC\r\n331\r\n186\r\n  5\r\n186\r\n331\r\n1C7\r\n  5\r\n1C8\r\n331\r\n182\r\n  5\r\n182\r\n331\r\n1C3\r\n  5\r\n1C4\r\n331\r\n244\r\n  5\r\n245\r\n331\r\n207\r\n  5\r\n208\r\n331\r\n203\r\n  5\r\n204\r\n331\r\n240\r\n  5\r\n241\r\n331\r\n27E\r\n  5\r\n27F\r\n331\r\n1FF\r\n  5\r\n200\r\n331\r\n23C\r\n  5\r\n23D\r\n331\r\n27A\r\n  5\r\n27B\r\n331\r\n1FB\r\n  5\r\n1FC\r\n331\r\n2BB\r\n  5\r\n2BC\r\n331\r\n238\r\n  5\r\n239\r\n331\r\n2B7\r\n  5\r\n2B8\r\n331\r\n276\r\n  5\r\n277\r\n331\r\n2B3\r\n  5\r\n2B4\r\n331\r\n272\r\n  5\r\n273\r\n331\r\nBE\r\n  5\r\nBE\r\n331\r\n31D\r\n  5\r\n31E\r\n331\r\n319\r\n  5\r\n31A\r\n331\r\n144\r\n  5\r\n144\r\n331\r\nBA\r\n  5\r\nBA\r\n331\r\nFF\r\n  5\r\nFF\r\n331\r\n140\r\n  5\r\n140\r\n331\r\nAE\r\n  5\r\nAE\r\n331\r\nFB\r\n  5\r\nFB\r\n331\r\n13C\r\n  5\r\n13C\r\n331\r\n17D\r\n  5\r\n17D\r\n331\r\nAA\r\n  5\r\nAA\r\n331\r\n179\r\n  5\r\n179\r\n331\r\n1BF\r\n  5\r\n1C0\r\n331\r\n138\r\n  5\r\n138\r\n331\r\n1BB\r\n  5\r\n1BB\r\n331\r\n1B7\r\n  5\r\n1B7\r\n331\r\n1F4\r\n  5\r\n1F5\r\n331\r\n1F0\r\n  5\r\n1F1\r\n331\r\n1B3\r\n  5\r\n1B3\r\n331\r\n234\r\n  5\r\n235\r\n331\r\n230\r\n  5\r\n231\r\n331\r\n22C\r\n  5\r\n22D\r\n331\r\n2AF\r\n  5\r\n2B0\r\n331\r\n26D\r\n  5\r\n26E\r\n331\r\n269\r\n  5\r\n26A\r\n331\r\n2AB\r\n  5\r\n2AC\r\n331\r\n228\r\n  5\r\n229\r\n331\r\n2E4\r\n  5\r\n2E5\r\n331\r\n2A7\r\n  5\r\n2A8\r\n331\r\n2A3\r\n  5\r\n2A4\r\n331\r\n2E0\r\n  5\r\n2E1\r\n331\r\n311\r\n  5\r\n312\r\n331\r\nA6\r\n  5\r\nA6\r\n331\r\nEF\r\n  5\r\nEF\r\n331\r\nA2\r\n  5\r\nA2\r\n331\r\n12C\r\n  5\r\n12D\r\n331\r\nEB\r\n  5\r\nEB\r\n331\r\n309\r\n  5\r\n30A\r\n331\r\n9E\r\n  5\r\n9E\r\n331\r\n171\r\n  5\r\n171\r\n331\r\nE7\r\n  5\r\nE7\r\n331\r\nE3\r\n  5\r\nE3\r\n331\r\n124\r\n  5\r\n125\r\n331\r\n16D\r\n  5\r\n16D\r\n331\r\n9A\r\n  5\r\n9A\r\n331\r\n169\r\n  5\r\n169\r\n331\r\n1AF\r\n  5\r\n1AF\r\n331\r\n1EC\r\n  5\r\n1ED\r\n331\r\n1AB\r\n  5\r\n1AB\r\n331\r\n1E8\r\n  5\r\n1E9\r\n331\r\n1A7\r\n  5\r\n1A7\r\n331\r\n1E4\r\n  5\r\n1E5\r\n331\r\n1E0\r\n  5\r\n1E1\r\n331\r\n1A3\r\n  5\r\n1A3\r\n331\r\n224\r\n  5\r\n225\r\n331\r\n265\r\n  5\r\n266\r\n331\r\n220\r\n  5\r\n221\r\n331\r\n261\r\n  5\r\n262\r\n331\r\n21C\r\n  5\r\n21D\r\n331\r\n29F\r\n  5\r\n2A0\r\n331\r\n2DC\r\n  5\r\n2DD\r\n331\r\n25D\r\n  5\r\n25E\r\n331\r\n218\r\n  5\r\n219\r\n331\r\n29B\r\n  5\r\n29C\r\n331\r\n2D8\r\n  5\r\n2D9\r\n331\r\n2D4\r\n  5\r\n2D5\r\n331\r\n297\r\n  5\r\n298\r\n331\r\n293\r\n  5\r\n294\r\n331\r\n2D0\r\n  5\r\n2D1\r\n331\r\n75\r\n  5\r\n75\r\n331\r\n131\r\n  5\r\n132\r\n331\r\nDF\r\n  5\r\nDF\r\n331\r\n92\r\n  5\r\n92\r\n331\r\n11C\r\n  5\r\n11D\r\n331\r\nDB\r\n  5\r\nDB\r\n331\r\n2F9\r\n  5\r\n2FA\r\n331\r\n8E\r\n  5\r\n8E\r\n331\r\n118\r\n  5\r\n118\r\n331\r\nD7\r\n  5\r\nD7\r\n331\r\nD3\r\n  5\r\nD3\r\n331\r\n114\r\n  5\r\n114\r\n331\r\n15D\r\n  5\r\n15D\r\n331\r\n8A\r\n  5\r\n8A\r\n331\r\n159\r\n  5\r\n159\r\n331\r\n19F\r\n  5\r\n19F\r\n331\r\n1DC\r\n  5\r\n1DD\r\n331\r\n110\r\n  5\r\n110\r\n331\r\n1D4\r\n  5\r\n1D6\r\n331\r\n1D0\r\n  5\r\n1D1\r\n331\r\n214\r\n  5\r\n215\r\n331\r\n255\r\n  5\r\n256\r\n331\r\n210\r\n  5\r\n211\r\n331\r\n251\r\n  5\r\n252\r\n331\r\n20C\r\n  5\r\n20D\r\n331\r\n28F\r\n  5\r\n290\r\n331\r\n2CC\r\n  5\r\n2CD\r\n331\r\n24D\r\n  5\r\n24E\r\n331\r\n249\r\n  5\r\n24A\r\n331\r\n208\r\n  5\r\n209\r\n331\r\n28B\r\n  5\r\n28C\r\n331\r\n2C8\r\n  5\r\n2C9\r\n331\r\n287\r\n  5\r\n288\r\n331\r\n283\r\n  5\r\n284\r\n331\r\nF1\r\n  5\r\nF1\r\n331\r\n2F5\r\n  5\r\n2F6\r\n331\r\n2F1\r\n  5\r\n2F2\r\n331\r\n86\r\n  5\r\n86\r\n331\r\n2ED\r\n  5\r\n2EE\r\n331\r\n82\r\n  5\r\n82\r\n331\r\nCB\r\n  5\r\nCB\r\n331\r\n2E9\r\n  5\r\n2EA\r\n331\r\n10C\r\n  5\r\n10C\r\n331\r\n7E\r\n  5\r\n7E\r\n331\r\n108\r\n  5\r\n108\r\n331\r\n151\r\n  5\r\n151\r\n331\r\nC7\r\n  5\r\nC7\r\n331\r\nC3\r\n  5\r\nC3\r\n331\r\n104\r\n  5\r\n104\r\n331\r\n14D\r\n  5\r\n14D\r\n331\r\n7A\r\n  5\r\n7A\r\n331\r\n1CC\r\n  5\r\n1CD\r\n331\r\n149\r\n  5\r\n149\r\n331\r\n18B\r\n  5\r\n18B\r\n331\r\n1C8\r\n  5\r\n1C9\r\n331\r\n187\r\n  5\r\n187\r\n331\r\n1C0\r\n  5\r\n1C1\r\n331\r\n183\r\n  5\r\n183\r\n331\r\n204\r\n  5\r\n205\r\n331\r\n245\r\n  5\r\n246\r\n331\r\n200\r\n  5\r\n201\r\n331\r\n241\r\n  5\r\n242\r\n331\r\n1FC\r\n  5\r\n1FD\r\n331\r\n27F\r\n  5\r\n280\r\n331\r\n2BC\r\n  5\r\n2BD\r\n331\r\n23D\r\n  5\r\n23E\r\n331\r\n239\r\n  5\r\n23A\r\n331\r\n1F8\r\n  5\r\n1F9\r\n331\r\n27B\r\n  5\r\n27C\r\n331\r\n2B8\r\n  5\r\n2B9\r\n331\r\n2B4\r\n  5\r\n2B5\r\n331\r\n277\r\n  5\r\n278\r\n331\r\n273\r\n  5\r\n274\r\n331\r\n2B0\r\n  5\r\n2B1\r\n331\r\n322\r\n  5\r\n323\r\n331\r\n31E\r\n  5\r\n31F\r\n331\r\nBF\r\n  5\r\nBF\r\n331\r\nBB\r\n  5\r\nBB\r\n331\r\n141\r\n  5\r\n141\r\n331\r\nAF\r\n  5\r\nAF\r\n331\r\nAB\r\n  5\r\nAB\r\n331\r\n13D\r\n  5\r\n13D\r\n331\r\n17A\r\n  5\r\n17A\r\n331\r\n1BC\r\n  5\r\n1BC\r\n331\r\n139\r\n  5\r\n139\r\n331\r\n1B8\r\n  5\r\n1B8\r\n331\r\n1F5\r\n  5\r\n1F6\r\n331\r\n1B4\r\n  5\r\n1B4\r\n331\r\n1F1\r\n  5\r\n1F2\r\n331\r\n1B0\r\n  5\r\n1B0\r\n331\r\n235\r\n  5\r\n236\r\n331\r\n231\r\n  5\r\n232\r\n331\r\n26E\r\n  5\r\n26F\r\n331\r\n26A\r\n  5\r\n26B\r\n331\r\n2AC\r\n  5\r\n2AD\r\n331\r\n22D\r\n  5\r\n22E\r\n331\r\n2A8\r\n  5\r\n2A9\r\n331\r\n229\r\n  5\r\n22A\r\n331\r\n2A4\r\n  5\r\n2A5\r\n331\r\n2E5\r\n  5\r\n2E6\r\n331\r\n2A0\r\n  5\r\n2A1\r\n331\r\n2E1\r\n  5\r\n2E2\r\n331\r\n312\r\n  5\r\n313\r\n331\r\nA7\r\n  5\r\nA7\r\n331\r\nEC\r\n  5\r\nEC\r\n331\r\n30A\r\n  5\r\n30B\r\n331\r\n12D\r\n  5\r\n12E\r\n331\r\nA3\r\n  5\r\nA3\r\n331\r\nE8\r\n  5\r\nE8\r\n331\r\nE4\r\n  5\r\nE4\r\n331\r\n16E\r\n  5\r\n16E\r\n331\r\n129\r\n  5\r\n12A\r\n331\r\n9F\r\n  5\r\n9F\r\n331\r\nE0\r\n  5\r\nE0\r\n331\r\n16A\r\n  5\r\n16A\r\n331\r\n125\r\n  5\r\n126\r\n331\r\n9B\r\n  5\r\n9B\r\n331\r\n1ED\r\n  5\r\n1EE\r\n331\r\n1E9\r\n  5\r\n1EA\r\n331\r\n1A4\r\n  5\r\n1A4\r\n331\r\n1E5\r\n  5\r\n1E6\r\n331\r\n1E1\r\n  5\r\n1E2\r\n331\r\n1A0\r\n  5\r\n1A0\r\n331\r\n225\r\n  5\r\n226\r\n331\r\n262\r\n  5\r\n263\r\n331\r\n221\r\n  5\r\n222\r\n331\r\n25E\r\n  5\r\n25F\r\n331\r\n29C\r\n  5\r\n29D\r\n331\r\n21D\r\n  5\r\n21E\r\n331\r\n2DD\r\n  5\r\n2DE\r\n331\r\n25A\r\n  5\r\n25B\r\n331\r\n2D9\r\n  5\r\n2DA\r\n331\r\n298\r\n  5\r\n299\r\n331\r\n219\r\n  5\r\n21A\r\n331\r\n2D5\r\n  5\r\n2D6\r\n331\r\n294\r\n  5\r\n295\r\n331\r\n290\r\n  5\r\n291\r\n331\r\n76\r\n  5\r\n76\r\n331\r\n2D1\r\n  5\r\n2D2\r\n331\r\n97\r\n  5\r\n97\r\n331\r\nDC\r\n  5\r\nDC\r\n331\r\n11D\r\n  5\r\n11E\r\n331\r\n93\r\n  5\r\n93\r\n331\r\nD8\r\n  5\r\nD8\r\n331\r\n15E\r\n  5\r\n15E\r\n331\r\n119\r\n  5\r\n119\r\n331\r\n8F\r\n  5\r\n8F\r\n331\r\nD4\r\n  5\r\nD4\r\n331\r\nD0\r\n  5\r\nD0\r\n331\r\n15A\r\n  5\r\n15A\r\n331\r\n115\r\n  5\r\n115\r\n331\r\n8B\r\n  5\r\n8B\r\n331\r\n1DD\r\n  5\r\n1DE\r\n331\r\n111\r\n  5\r\n111\r\n331\r\n194\r\n  5\r\n194\r\n331\r\n1D1\r\n  5\r\n1D2\r\n331\r\n256\r\n  5\r\n257\r\n331\r\n215\r\n  5\r\n216\r\n331\r\n252\r\n  5\r\n253\r\n331\r\n211\r\n  5\r\n212\r\n331\r\n24E\r\n  5\r\n24F\r\n331\r\n28C\r\n  5\r\n28D\r\n331\r\n20D\r\n  5\r\n20E\r\n331\r\n2CD\r\n  5\r\n2CE\r\n331\r\n24A\r\n  5\r\n24B\r\n331\r\n288\r\n  5\r\n289\r\n331\r\n209\r\n  5\r\n20A\r\n331\r\n2C9\r\n  5\r\n2CA\r\n331\r\n2C5\r\n  5\r\n2C6\r\n331\r\n284\r\n  5\r\n285\r\n331\r\n280\r\n  5\r\n281\r\n331\r\n2F6\r\n  5\r\n2F7\r\n331\r\n2F2\r\n  5\r\n2F3\r\n331\r\n2EE\r\n  5\r\n2EF\r\n331\r\n87\r\n  5\r\n87\r\n331\r\n2EA\r\n  5\r\n2EB\r\n331\r\n10D\r\n  5\r\n10D\r\n331\r\n83\r\n  5\r\n83\r\n331\r\nC8\r\n  5\r\nC8\r\n331\r\n14E\r\n  5\r\n14E\r\n331\r\n109\r\n  5\r\n109\r\n331\r\n7F\r\n  5\r\n7F\r\n331\r\nC4\r\n  5\r\nC4\r\n331\r\nC0\r\n  5\r\nC0\r\n331\r\n14A\r\n  5\r\n14A\r\n331\r\n105\r\n  5\r\n105\r\n331\r\n7B\r\n  5\r\n7B\r\n331\r\n18C\r\n  5\r\n18C\r\n331\r\n1CD\r\n  5\r\n1CE\r\n331\r\n188\r\n  5\r\n188\r\n331\r\n1C9\r\n  5\r\n1CA\r\n331\r\n184\r\n  5\r\n184\r\n331\r\n1C1\r\n  5\r\n1C2\r\n331\r\n180\r\n  5\r\n180\r\n331\r\n246\r\n  5\r\n247\r\n331\r\n205\r\n  5\r\n206\r\n331\r\n242\r\n  5\r\n243\r\n331\r\n201\r\n  5\r\n202\r\n331\r\n23E\r\n  5\r\n23F\r\n331\r\n27C\r\n  5\r\n27D\r\n331\r\n1FD\r\n  5\r\n1FE\r\n331\r\n2BD\r\n  5\r\n2BE\r\n331\r\n23A\r\n  5\r\n23B\r\n331\r\n278\r\n  5\r\n279\r\n331\r\n1F9\r\n  5\r\n1FA\r\n331\r\n2B9\r\n  5\r\n2BA\r\n331\r\n2B5\r\n  5\r\n2B6\r\n331\r\n274\r\n  5\r\n275\r\n331\r\n270\r\n  5\r\n271\r\n331\r\n2B1\r\n  5\r\n2B2\r\n331\r\n323\r\n  5\r\n324\r\n331\r\n31F\r\n  5\r\n320\r\n331\r\n146\r\n  5\r\n146\r\n331\r\nBC\r\n  5\r\nBC\r\n331\r\n142\r\n  5\r\n142\r\n331\r\nB8\r\n  5\r\nB8\r\n331\r\n17F\r\n  5\r\n17F\r\n331\r\nAC\r\n  5\r\nAC\r\n331\r\nA8\r\n  5\r\nA8\r\n331\r\nF9\r\n  5\r\nF9\r\n331\r\n17B\r\n  5\r\n17B\r\n331\r\n13A\r\n  5\r\n13A\r\n331\r\n1BD\r\n  5\r\n1BD\r\n331\r\n1B9\r\n  5\r\n1B9\r\n331\r\n1F6\r\n  5\r\n1F7\r\n331\r\n1F2\r\n  5\r\n1F3\r\n331\r\n1B5\r\n  5\r\n1B5\r\n331\r\n1B1\r\n  5\r\n1B1\r\n331\r\n236\r\n  5\r\n237\r\n331\r\n232\r\n  5\r\n233\r\n331\r\n22E\r\n  5\r\n22F\r\n331\r\n26F\r\n  5\r\n270\r\n331\r\n26B\r\n  5\r\n26C\r\n331\r\n22A\r\n  5\r\n22B\r\n331\r\n2E6\r\n  5\r\n2E7\r\n331\r\n2A9\r\n  5\r\n2AA\r\n331\r\n2A5\r\n  5\r\n2A6\r\n331\r\n2E2\r\n  5\r\n2E3\r\n331\r\n2A1\r\n  5\r\n2A2\r\n331\r\n317\r\n  5\r\n318\r\n331\r\nA4\r\n  5\r\nA4\r\n331\r\nED\r\n  5\r\nED\r\n331\r\n30B\r\n  5\r\n30C\r\n331\r\n12E\r\n  5\r\n12F\r\n331\r\nA0\r\n  5\r\nA0\r\n331\r\n12A\r\n  5\r\n12B\r\n331\r\nE9\r\n  5\r\nE9\r\n331\r\n126\r\n  5\r\n127\r\n331\r\n16F\r\n  5\r\n16F\r\n331\r\n9C\r\n  5\r\n9C\r\n331\r\n98\r\n  5\r\n98\r\n331\r\nE1\r\n  5\r\nE1\r\n331\r\n122\r\n  5\r\n123\r\n331\r\n1EE\r\n  5\r\n1EF\r\n331\r\n16B\r\n  5\r\n16B\r\n331\r\n1AD\r\n  5\r\n1AD\r\n331\r\n1EA\r\n  5\r\n1EB\r\n331\r\n1E6\r\n  5\r\n1E7\r\n331\r\n1E2\r\n  5\r\n1E3\r\n331\r\n1A5\r\n  5\r\n1A5\r\n331\r\n1A1\r\n  5\r\n1A1\r\n331\r\n226\r\n  5\r\n227\r\n331\r\n267\r\n  5\r\n268\r\n331\r\n222\r\n  5\r\n223\r\n331\r\n263\r\n  5\r\n264\r\n331\r\n21E\r\n  5\r\n21F\r\n331\r\n2DE\r\n  5\r\n2DF\r\n331\r\n25F\r\n  5\r\n260\r\n331\r\n25B\r\n  5\r\n25C\r\n331\r\n21A\r\n  5\r\n21B\r\n331\r\n29D\r\n  5\r\n29E\r\n331\r\n2DA\r\n  5\r\n2DB\r\n331\r\n2D6\r\n  5\r\n2D7\r\n331\r\n299\r\n  5\r\n29A\r\n331\r\n295\r\n  5\r\n296\r\n331\r\n2D2\r\n  5\r\n2D3\r\n331\r\n291\r\n  5\r\n292\r\n331\r\n77\r\n  5\r\n77\r\n331\r\n73\r\n  5\r\n73\r\n331\r\n137\r\n  5\r\n137\r\n331\r\n133\r\n  5\r\n134\r\n331\r\n307\r\n  5\r\n308\r\n331\r\n94\r\n  5\r\n94\r\n331\r\n2FB\r\n  5\r\n2FC\r\n331\r\n167\r\n  5\r\n167\r\n331\r\n11E\r\n  5\r\n11F\r\n331\r\n90\r\n  5\r\n90\r\n331\r\n11A\r\n  5\r\n11A\r\n331\r\nD9\r\n  5\r\nD9\r\n331\r\nD5\r\n  5\r\nD5\r\n331\r\n116\r\n  5\r\n116\r\n331\r\n8C\r\n  5\r\n8C\r\n331\r\nD1\r\n  5\r\nD1\r\n331\r\n112\r\n  5\r\n112\r\n331\r\n1DE\r\n  5\r\n1DF\r\n331\r\n15B\r\n  5\r\n15B\r\n331\r\n88\r\n  5\r\n88\r\n331\r\n19D\r\n  5\r\n19D\r\n331\r\n199\r\n  5\r\n199\r\n331\r\n1D6\r\n  5\r\n1D7\r\n331\r\n1D2\r\n  5\r\n1D3\r\n331\r\n257\r\n  5\r\n258\r\n331\r\n216\r\n  5\r\n217\r\n331\r\n212\r\n  5\r\n213\r\n331\r\n253\r\n  5\r\n254\r\n331\r\n20E\r\n  5\r\n20F\r\n331\r\n2CE\r\n  5\r\n2CF\r\n331\r\n24F\r\n  5\r\n250\r\n331\r\n20A\r\n  5\r\n20B\r\n331\r\n28D\r\n  5\r\n28E\r\n331\r\n2CA\r\n  5\r\n2CB\r\n331\r\n24B\r\n  5\r\n24C\r\n331\r\n2C6\r\n  5\r\n2C7\r\n331\r\n289\r\n  5\r\n28A\r\n331\r\n2C2\r\n  5\r\n2C3\r\n331\r\n285\r\n  5\r\n286\r\n331\r\n281\r\n  5\r\n282\r\n331\r\nB7\r\n  5\r\nB7\r\n331\r\n2F7\r\n  5\r\n2F8\r\n331\r\n2F3\r\n  5\r\n2F4\r\n331\r\n2EF\r\n  5\r\n2F0\r\n331\r\n84\r\n  5\r\n84\r\n331\r\nCD\r\n  5\r\nCD\r\n331\r\n2EB\r\n  5\r\n2EC\r\n331\r\n80\r\n  5\r\n80\r\n331\r\n10A\r\n  5\r\n10A\r\n331\r\nC9\r\n  5\r\nC9\r\n331\r\n7C\r\n  5\r\n7C\r\n331\r\n106\r\n  5\r\n106\r\n331\r\n14F\r\n  5\r\n14F\r\n331\r\nC5\r\n  5\r\nC5\r\n331\r\nC1\r\n  5\r\nC1\r\n331\r\n1CE\r\n  5\r\n1CF\r\n331\r\n14B\r\n  5\r\n14B\r\n331\r\n78\r\n  5\r\n78\r\n331\r\n18D\r\n  5\r\n18D\r\n331\r\n1CA\r\n  5\r\n1CB\r\n331\r\n1C6\r\n  5\r\n1C7\r\n331\r\n185\r\n  5\r\n185\r\n331\r\n1C2\r\n  5\r\n1C3\r\n331\r\n181\r\n  5\r\n181\r\n331\r\n247\r\n  5\r\n248\r\n331\r\n206\r\n  5\r\n207\r\n331\r\n202\r\n  5\r\n203\r\n331\r\n243\r\n  5\r\n244\r\n331\r\n1FE\r\n  5\r\n1FF\r\n331\r\n2BE\r\n  5\r\n2BF\r\n331\r\n23F\r\n  5\r\n240\r\n331\r\n1FA\r\n  5\r\n1FB\r\n331\r\n27D\r\n  5\r\n27E\r\n331\r\n2BA\r\n  5\r\n2BB\r\n331\r\n23B\r\n  5\r\n23C\r\n331\r\n279\r\n  5\r\n27A\r\n331\r\n2B6\r\n  5\r\n2B7\r\n331\r\n2B2\r\n  5\r\n2B3\r\n331\r\n275\r\n  5\r\n276\r\n331\r\n271\r\n  5\r\n272\r\n  0\r\nACDBDETAILVIEWSTYLE\r\n  5\r\n6A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n69\r\n102\r\n}\r\n330\r\n69\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nImperial24\r\n290\r\n     0\r\n300\r\nImperial24\r\n 90\r\n        0\r\n100\r\nAcDbDetailViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n        3\r\n 71\r\n     1\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n0.24\r\n300\r\n\r\n 40\r\n0.36\r\n280\r\n     3\r\n 71\r\n     2\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n 71\r\n     3\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 90\r\n        1\r\n 40\r\n0.75\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewType \\f \"%tc1\">% %<\\AcVar ViewDetailId>%\\PSCALE %<\\AcVar ViewScale \\f \"%sn\">%\r\n 71\r\n     4\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n280\r\n     0\r\n  0\r\nLAYOUT\r\n  5\r\n6E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n61\r\n102\r\n}\r\n330\r\n61\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\n\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout1\r\n 70\r\n     1\r\n 71\r\n     1\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n1.000000000000000E+20\r\n 24\r\n1.000000000000000E+20\r\n 34\r\n1.000000000000000E+20\r\n 15\r\n-1.000000000000000E+20\r\n 25\r\n-1.000000000000000E+20\r\n 35\r\n-1.000000000000000E+20\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n6B\r\n  0\r\nLAYOUT\r\n  5\r\n72\r\n102\r\n{ACAD_REACTORS\r\n330\r\n61\r\n102\r\n}\r\n330\r\n61\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\n\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n  1712\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     0\r\n  7\r\n\r\n 75\r\n     0\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nModel\r\n 70\r\n     1\r\n 71\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n6F\r\n331\r\nB3\r\n  0\r\nMATERIAL\r\n  5\r\n19\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1A\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10\r\n102\r\n}\r\n330\r\n10\r\n100\r\nAcDbMaterial\r\n  1\r\nByBlock\r\n 72\r\n     0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMATERIAL\r\n  5\r\n11\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n12\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10\r\n102\r\n}\r\n330\r\n10\r\n100\r\nAcDbMaterial\r\n  1\r\nByLayer\r\n 72\r\n     0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMATERIAL\r\n  5\r\n21\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n22\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10\r\n102\r\n}\r\n330\r\n10\r\n100\r\nAcDbMaterial\r\n  1\r\nGlobal\r\n 72\r\n     0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0208333333333333\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0208333333333333\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0208333333333333\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0208333333333333\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0208333333333333\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0208333333333333\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n66\r\n102\r\n{ACAD_REACTORS\r\n330\r\n65\r\n102\r\n}\r\n330\r\n65\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n5A\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n0.09\r\n291\r\n     1\r\n 43\r\n0.36\r\n  3\r\nStandard\r\n 44\r\n0.18\r\n300\r\n\r\n342\r\n55\r\n174\r\n     1\r\n178\r\n     6\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n0.18\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n0.18\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     0\r\n143\r\n0.125\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLINESTYLE\r\n  5\r\n5F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nAcDbMlineStyle\r\n  2\r\nSTANDARD\r\n 70\r\n     0\r\n  3\r\n\r\n 62\r\n   256\r\n 51\r\n90.0\r\n 52\r\n90.0\r\n 71\r\n     2\r\n 49\r\n0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n 49\r\n-0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n  0\r\nACDBPLACEHOLDER\r\n  5\r\nF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nE\r\n102\r\n}\r\n330\r\nE\r\n  0\r\nSCALE\r\n  5\r\n43\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:1\r\n140\r\n1.0\r\n141\r\n1.0\r\n290\r\n     1\r\n  0\r\nSCALE\r\n  5\r\n44\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/128\" = 1'-0\"\r\n140\r\n0.0078125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n45\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/64\" = 1'-0\"\r\n140\r\n0.015625\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n46\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/32\" = 1'-0\"\r\n140\r\n0.03125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n47\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/16\" = 1'-0\"\r\n140\r\n0.0625\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n48\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/32\" = 1'-0\"\r\n140\r\n0.09375\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n49\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/8\" = 1'-0\"\r\n140\r\n0.125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/16\" = 1'-0\"\r\n140\r\n0.1875\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/4\" = 1'-0\"\r\n140\r\n0.25\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/8\" = 1'-0\"\r\n140\r\n0.375\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/2\" = 1'-0\"\r\n140\r\n0.5\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/4\" = 1'-0\"\r\n140\r\n0.75\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n4F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1\" = 1'-0\"\r\n140\r\n1.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n50\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1-1/2\" = 1'-0\"\r\n140\r\n1.5\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n51\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3\" = 1'-0\"\r\n140\r\n3.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n52\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n6\" = 1'-0\"\r\n140\r\n6.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n53\r\n102\r\n{ACAD_REACTORS\r\n330\r\n42\r\n102\r\n}\r\n330\r\n42\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1'-0\" = 1'-0\"\r\n140\r\n12.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nACDBSECTIONVIEWSTYLE\r\n  5\r\n68\r\n102\r\n{ACAD_REACTORS\r\n330\r\n67\r\n102\r\n}\r\n330\r\n67\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nImperial24\r\n290\r\n     0\r\n300\r\nImperial24\r\n 90\r\n        0\r\n100\r\nAcDbSectionViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n       78\r\n 71\r\n     1\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n340\r\n0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n0.24\r\n300\r\nI, O, Q, S, X, Z\r\n 40\r\n0.48\r\n 90\r\n        3\r\n 40\r\n0.18\r\n 90\r\n        1\r\n 71\r\n     2\r\n340\r\n5C\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n5C\r\n 90\r\n       50\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 40\r\n0.0\r\n 40\r\n0.24\r\n 71\r\n     3\r\n340\r\n55\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 90\r\n        1\r\n 40\r\n0.75\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewType \\f \"%tc1\">% %<\\AcVar ViewSectionStartId>%-%<\\AcVar ViewSectionEndId>%\\PSCALE %<\\AcVar ViewScale \\f \"%sn\">%\r\n 71\r\n     4\r\n 62\r\n   256\r\n 62\r\n   257\r\n300\r\nANSI31\r\n 40\r\n1.0\r\n 90\r\n        0\r\n290\r\n     0\r\n290\r\n     0\r\n 90\r\n        6\r\n 40\r\n0.0\r\n 40\r\n1.570796326794896\r\n 40\r\n0.2617993877991494\r\n 40\r\n1.308996938995747\r\n 40\r\n-0.2617993877991494\r\n 40\r\n1.832595714594045\r\n  0\r\nTABLESTYLE\r\n  5\r\n64\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n656\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n63\r\n102\r\n}\r\n330\r\n63\r\n100\r\nAcDbTableStyle\r\n280\r\n     0\r\n  3\r\nStandard\r\n 70\r\n     0\r\n 71\r\n     0\r\n 40\r\n0.06\r\n 41\r\n0.06\r\n280\r\n     0\r\n281\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.18\r\n170\r\n     2\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.25\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.18\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\n2dWireframe\r\n 70\r\n     4\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBasic\r\n 70\r\n     7\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n35\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBrighten\r\n 70\r\n    12\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n39\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nColorChange\r\n 70\r\n    16\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n32\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nConceptual\r\n 70\r\n     9\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n179.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n34\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nDim\r\n 70\r\n    11\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n-50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n41\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nEdgeColorOff\r\n 70\r\n    22\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        8\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n38\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFacepattern\r\n 70\r\n    15\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlat\r\n 70\r\n     0\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlatWithEdges\r\n 70\r\n     1\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraud\r\n 70\r\n     2\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n2D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraudWithEdges\r\n 70\r\n     3\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n31\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nHidden\r\n 70\r\n     6\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nJitterOff\r\n 70\r\n    20\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n       10\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n37\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nLinepattern\r\n 70\r\n    14\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n40\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nOverhangOff\r\n 70\r\n    21\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        9\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n33\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nRealistic\r\n 70\r\n     8\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded\r\n 70\r\n    27\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  7895160\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded with edges\r\n 70\r\n    26\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShades of Gray\r\n 70\r\n    23\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nSketchy\r\n 70\r\n    24\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n       11\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n36\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nThicken\r\n 70\r\n    13\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n       12\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n30\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nWireframe\r\n 70\r\n     5\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n3C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n29\r\n102\r\n}\r\n330\r\n29\r\n100\r\nAcDbVisualStyle\r\n  2\r\nX-Ray\r\n 70\r\n    25\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.5\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n351\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1:1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nImperial24\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n34F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nImperial24\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n353\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n354\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n15\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n352\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n350\r\n102\r\n{ACAD_REACTORS\r\n330\r\n34B\r\n102\r\n}\r\n330\r\n34B\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARY\r\n  5\r\n1A\r\n330\r\n19\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n1C\r\n  3\r\nDIFFUSETILE\r\n360\r\n1B\r\n  3\r\nOPACITYTILE\r\n360\r\n1F\r\n  3\r\nREFLECTIONTILE\r\n360\r\n1E\r\n  3\r\nREFRACTIONTILE\r\n360\r\n20\r\n  3\r\nSPECULARTILE\r\n360\r\n1D\r\n  0\r\nDICTIONARY\r\n  5\r\n12\r\n330\r\n11\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n14\r\n  3\r\nDIFFUSETILE\r\n360\r\n13\r\n  3\r\nOPACITYTILE\r\n360\r\n17\r\n  3\r\nREFLECTIONTILE\r\n360\r\n16\r\n  3\r\nREFRACTIONTILE\r\n360\r\n18\r\n  3\r\nSPECULARTILE\r\n360\r\n15\r\n  0\r\nDICTIONARY\r\n  5\r\n22\r\n330\r\n21\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n24\r\n  3\r\nDIFFUSETILE\r\n360\r\n23\r\n  3\r\nOPACITYTILE\r\n360\r\n27\r\n  3\r\nREFLECTIONTILE\r\n360\r\n26\r\n  3\r\nREFRACTIONTILE\r\n360\r\n28\r\n  3\r\nSPECULARTILE\r\n360\r\n25\r\n  0\r\nDICTIONARY\r\n  5\r\n656\r\n330\r\n64\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP\r\n360\r\n22F4\r\n  0\r\nXRECORD\r\n  5\r\n1C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n20\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n14\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n13\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n17\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n16\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n18\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n15\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12\r\n102\r\n}\r\n330\r\n12\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n24\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n23\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n27\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n26\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n28\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n25\r\n102\r\n{ACAD_REACTORS\r\n330\r\n22\r\n102\r\n}\r\n330\r\n22\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nCELLSTYLEMAP\r\n  5\r\n22F4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n656\r\n102\r\n}\r\n330\r\n656\r\n100\r\nAcDbCellStyleMap\r\n 90\r\n        3\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n    32768\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n55\r\n144\r\n0.25\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.18\r\n 40\r\n0.18\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        1\r\n 91\r\n        1\r\n300\r\n_TITLE\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n55\r\n144\r\n0.18\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.18\r\n 40\r\n0.18\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        2\r\n 91\r\n        1\r\n300\r\n_HEADER\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        2\r\n 62\r\n     0\r\n340\r\n55\r\n144\r\n0.18\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.18\r\n 40\r\n0.18\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        3\r\n 91\r\n        2\r\n300\r\n_DATA\r\n309\r\nCELLSTYLE_END\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nACDSDATA\r\n 70\r\n     2\r\n 71\r\n     8\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        0\r\n  1\r\nAcDb_Thumbnail_Schema\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n 91\r\n        8\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 91\r\n        0\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        1\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        2\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        3\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        4\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n282\r\n     1\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        1\r\n  1\r\nAcDbDs::TreatedAsObjectDataSchema\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        2\r\n  1\r\nAcDbDs::LegacySchema\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        3\r\n  1\r\nAcDbDs::IndexedPropertySchema\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        4\r\n  1\r\nAcDbDs::HandleAttributeSchema\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n 91\r\n        1\r\n284\r\n     1\r\n  0\r\nACDSRECORD\r\n 90\r\n        0\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n320\r\n72\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 94\r\n     3606\r\n310\r\n89504E470D0A1A0A0000000D4948445200000100000000A90803000000F3C813C600000300504C5445212830FFFFFF2128300000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099\r\n310\r\n000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00\r\n310\r\n33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066\r\n310\r\nFF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00\r\n310\r\n33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333\r\n310\r\nFF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB\r\n310\r\nBBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF0000000000000000000000000000000000000000000000000000000000002E4550F1000003144944415478DAED9DDB6EC3300C43F5FFFFCBF7614B93D66D7C4D065424893DACC3024CC7B22EB6E34558966559D67708B65FDB7E0380BAFDD204200D008724231F5EA539EE4A0036\r\n310\r\n13B17D4912D8BCFE0F82A6FD7BC67F9AAC1803509B00323E109F63AF63FEAFE58503C4014327FDC9A680A8CF7D4900A11902C45DA066BA0C0140DC07CE47FEF8640FD0280251F7037BC013953000665F68A7C1C782C9A34150F400D0AF91B62A61899CD02A032418605EC40042CFFE689741E709821E40B429B04F817A85CC\r\n310\r\n0FE0BDF81B03002E0003D9E1CD702E00134B65D8FBC9DCED70D9158F1608C7C32459011B838922797F2A755844F91DA63BE5EC8901AD38DEAD8F8220356204408C14C9E9E7C0589744571EE2C6463171F4BFA9514E39FCE8DA1FB4001E6DDFF944285AC36E00CC48E0E52CC8C9822FD694AF053886570DC0D99A37AE9A9F87\r\n310\r\n40E7AF6F053E8E7AA8BD0DBA60762E02BD1677C9FCC803606D60795CE0BFCCCFE2020B937AF291ACF35FC2FFD732DB8CF97816D949FC3F2ECEF8F267DF7C9404CBB5CDDC637A11E0AD98867004CC1A04075D9CE3E8C0BD1E9FD205E2BA8F67B63FAE8D6F6E00E55ED68A79BDADF3CC8B21CFA3A08860063057C47C567A4D8E\r\n310\r\nA91743FA00EA9BE704FE5F037014F7A74783722F060E0378FDC402E09637E5E91C801FC0CD356CAAB3B3FD22E8E2026B86E15706B0E7B1DBABF87C9B01F73732548BE1173C4C9B40EEA530FE7B73E6B6799901C00006167FB5C7DFEF45DA030C801940D8050658A8CC017502513B03457957CAD9B887C28BE16B89401700E7\r\n310\r\n85F233AFBCF000C0E0D0735EA0788CE440D02304F0F95EEFCC01788578C77D8DF2B88F73029899E27C0030653F21806A713B7A02263F80E606608C00E08E810200A2F9D65B281098ACF308DB40AC2250E97D2BBF4F746BEE6CBFB3B7C1122E10151F287A683A00D1BBE882FA7EC09133A1F417242A1C01586B89150884B8FD\r\n310\r\n277130F895FCDDBEFF0E030AFF4F765B0509D9F1DF93BB3080D636908E030494E74015807A080899FFA1595C98C7DCFBD401284BDD7E03B02CCBB22CCBB22CCBB22CCBB22CCBB22CCBB22CCBB2AC2FD60F04D22D723269A5C90000000049454E44AE426082DFDB9A0DF2F568874EB03CCE032F0404EEDD83125D01A852492D\r\n310\r\nEF63CC4740DF35A17DBC700F61A0F28C06645295189A5037B9FB4F0984DCB20E8EFE5B8E6BB40F2D529EDF4877AAB92D00D2E147BBBBE44E15B4C4C1C89F00654D681F5E7D23FBE53FE1CF8E12A039551715EE53A778806CFF4EFB94036216C23BE03961BFE6776060A98AE6389976F2E93AF0ECADBF99D03E860CB423AE59\r\n310\r\n9CD6D48DDD5980A7A8106D81A21E1EFCEA47B48FE23B2AC42EEA0668996D800756368ECA19D5A42591C3D964049ABE9B06EFCE62DD5E3EA7310A10A2E10BA3F35009ADF3090E10675F13325CD1D9E73F55C5558850EE95A3D14284898A8DF6E82F8EAE84B45F71F0CF334D894AC922FF81EB8124C11A93F120AEDE191EA089\r\n310\r\n13F7BB41984BD006740F50444113D6421D11F51F0AEC405F8EF3800C546E13F88654510008B9B27AEC0E5110F2A380BCAB100A81238B78F4AFEF5B931A8E91DF51020081CE050611E03CA11389C5146FA56175A911F414BF7705E26FA2EF9A08B6931FEE9EAE08A9D843E4C81990686201D3DE0B15D9B0085BED23BBA0F26A\r\n310\r\n043805986F737AF77D870012F0291E22EA696B3A70A7786487B502AD139110B706B4AF6008AD7740CD509440A9A019823F089C79BB157E81EAB8FD23E9D86938004A329C45E3D00A96CBC09A52260BC24E427A99E824E2910668999D20A7835FAE8AF44E824A08A9FA90442265BC5056845AB71D94C171AD50B017EE1168E0\r\n310\r\n90FF58F56380320B656EC65914DC419F372530775815E4618711DCF7AF11F445F2B38A6532549213A8AC3CBE9277710B39E14E00ED8846B8A0DA7422B7880218D8A9FA5E0DDF0493211614CB48E60082003A7016D95D0D3AA7860238F759DFAAE15BEFC8B0E215EE88B48EC27B8516E2B3034280F8B314128F6747EBE9F6D5\r\n310\r\nF0ADE225D217C88B438BAA2E9E22C9769C053CD99722B17BA062A7E0DC61658F4CEC03F87761CA4806BB3615FEF19A4AA7EA0BDBB7E41CCC664B9C5FA8E1A3ED909AA984BA93D07A33F1818488B3F55EC11837D0045073357CC570915D6CEA4891F4CA61D1D11BBB1CB78E0C84A87CCB8FC67E8A718EC00E77D5F0AEAB055D\r\n310\r\nA2E050C46A802D918E2745C07023CB95E7AE4C5354C3430BE089DE815F844E20EED1358CE2E1F83123FA80C880C44F9CE8463C21209CBFC79542CD986D2E206097E344DD7C6439EC099BC894C8FA89B478BAB247EEBDD84603C02812A090D219AA89361393D32F3302FB276AF81EDB3CAE5A928751440EF60CFDD450BE5BA8\r\n310\r\n4E4C203090E0CD70ED2115989E7509B9DF47CC2CDA9CA40C495D405292A99B54277A29064536534C5125E75621ADB53B70A67C6E3800077C2C034EAF8232FD830A8202A89470A21AF52DAFB689B99FA48FB1C8D3AAF40AD6BC122B6A9DEC8ECCA2DD3397E62B84D9670928A34AA93851474A03FEFD420D3FA7BEC97E26F718\r\n310\r\n22A3B36E8072FC0F92A8F8D1BCA70D070292C7D16AD451A5404BED7F550D3F3F2906FA152D0F465FAA3EECBB34A1BE890729439C729E26C42027CC97B2F776A14A8C3E29F1390EBF886A7182F9E2F015E4F4C416831D3AE9F00392953B63FEA44AD904026891F42F4E0CC5CCD9BCBB0E51D239812FE8BA06E8A53C9CDA078C\r\n310\r\n96841ABE280D7628BA89A75C28A2130A604D1A63F93381D10D00A30BF82349DC16DD425E18D85FFAC909B324D25E472062BEE6C8D1B256A310C890A954A12E0C40A0F7BDE68A3A77FB0DE49023C0217E5012AB5D0D4F42201E9EF420CBD92429F431272E35051CB8DD89FA2388601AD7F37D506C22E292028D9322E00E3E5A\r\n310\r\n5358122C6AED68237D77224B50607E434114E16EE799CE935C80905C6A9BD42B810A892CC4D0D5F875A06A21C4FEEE929E668050252803C477CC6FC5E86C8F6DC8217BA7AD7F1004C8D21AB09F7DF10EF38B71A3E87571417E3600A0F33DC047E4F8469604C01339CC107CBC1E33D11E63DA96D2C07FBFBA845D2168F0915F\r\n310\r\n777947892805E8738813CEF03223933DB687A4C5A442F1B6000EBB1044013C03E4BA9801F27D1455F87A390DD4FE13BCAC01569CF45045C577A5D77438F518C783C93E95A274A83E0112F3507307B9D4FC78F062D6F5785914FD820D7C021129529E2D354C5EDEB99607B497C27CB681D46ED33D16F8D47D76E45A2160E201\r\n310\r\nC6EAF9CC200D10121A1A804F08B559B46B3DC59FF296E87330E5132C09852431171D89C5BBECAB3900B27B8AC4BD36267096F0A14702C602CA108F9580FEBF34E828B9F80E6A84B8D0C756BCB335354010AF357D8AF20A06988A3551C8CCB0644B1C7DF07EC68EE8626FEAA953251487A97A4F3F796CD6C135C57C503C9671\r\n310\r\nDDE7B4829BDD1D5F8A2701E403103153E5D335B841573540E9275A657F56D00B65764DDE4E4A670D44FFFEBDD8A7D5F28925E5749CFBC7E9DCF7C1D44A80E4B17D3EA50A16FE091FB880FDF0F1B5AAD600544D3E8FE4EE06C81931A2E83E0E10BCCBFDFDBFAA7FDC9A889EA1F46DEF6C3DE10ECCC61DB726A9BD3618EFF2D5\r\n310\r\nE3AE00E66B85F767DB8353F51C03B48A08A2378C57DEED51E9BF2A131C2C76DD77710AF24EEFAAFFAD01381E335308B89CFC710600D1998C5F3CA2F09C8F1E532F8A82EEEEA0D3931CA07FBCD4D70D8E1E5300ED18E0874F3E3DC8049AB486BFD265DE32067CF8A7AE7FFC87CEAFB5D65A6BADB5D65A6BADB5D65A6BADB5D6\r\n310\r\n5A6BADB5D65A6BADB5D65A6BADB5D65A6BADB5D65A6BADB5D65A07AEFF00554FE27454DCB1F00000000049454E44AE426082\r\n  0\r\nENDSEC\r\n  0\r\nEOF\r\n"
  },
  {
    "path": "testdata/barnsbury_segment_lines.mid",
    "content": "0,2.0012004,0,3,66.173325,365,4156801.8,88.617859,6618.5718,178,357.53516,22549.607,12216.636\n1,1.7398858,0,4,82.40506,983,9028389,89.036148,6680.416,178,355.85547,22340.854,12216.636\n2,2.0232198,0,4,243.39876,1211,9372838,87.789162,6583.7954,178,360.91016,22668.717,12216.636\n3,1.2413905,0,3,138.96246,487,4206866.5,84.789192,6377.4712,178,373.67969,23402.096,12216.636\n4,1.9381289,1,3,130.18936,330,4186343.2,89.3825,6714.5283,178,354.47656,22227.355,12216.636\n5,2.1624684,1,4,162.06264,692,5878021,90.132393,6768.0562,178,351.52734,22051.561,12216.636\n6,1.7826266,1,4,184.86253,1342,11232938,93.362,7145.4531,178,339.36719,20886.877,12216.636\n7,2.0335331,1,4,186.81696,1021,8303167,94.585724,7241.9897,178,334.97656,20608.453,12216.636\n8,2.0149293,1,3,70.41478,795,5818716.5,94.632072,7246.8599,178,334.8125,20594.604,12216.636\n9,4,2,5,64.546532,308,1653464.4,67.747787,4992.2837,178,467.67578,29895.375,12216.636\n10,2.6528366,2,5,53.262371,385,1758330.9,66.705902,4920.8042,178,474.98047,30329.635,12216.636\n11,3.3471634,2,4,10.496307,238,1142586.6,66.317581,4891.7046,178,477.76172,30510.059,12216.636\n12,4,3,5,136.73875,450,4882207.5,80.08831,6026.8027,178,395.61328,24763.744,12216.636\n13,4,3,6,144.35603,309,4674048.5,80.518425,6047.978,178,393.5,24677.041,12216.636\n14,4,3,5,208.19673,618,6827499,82.457573,6239.9404,178,384.24609,23917.889,12216.636\n15,3.6441982,4,4,8.9747467,0,86300.844,54.864071,3917.8215,178,577.5,38094.18,12216.636\n16,0.91864121,4,3,62.642906,408,1356859.4,61.200176,4461.4165,178,517.71094,33452.648,12216.636\n17,1.5875411,5,3,68.832535,189,772664.94,57.446114,4183.127,178,551.54297,35678.145,12216.636\n18,3.0086384,5,4,5.5661507,55,472367.16,57.439606,4182.6602,178,551.60547,35682.125,12216.636\n19,2.5961795,6,4,31.722631,347,1240084.2,67.549751,4859.6494,178,469.04688,30711.309,12216.636\n20,2.8942552,6,4,153.36557,17,792264.5,64.708687,4663.2021,178,489.64062,32005.088,12216.636\n21,4,7,5,78.798721,521,3768654.8,94.541626,6940.915,178,335.13281,21502.381,12216.636\n22,4,7,6,92.622635,1212,6392349,94.387596,6921.416,178,335.67969,21562.957,12216.636\n23,4,7,6,72.328705,2026,9513038,94.350273,6925.3647,178,335.8125,21550.662,12216.636\n24,3.0542002,7,5,78.076729,2484,10539197,94.411774,6929.8618,178,335.59375,21536.678,12216.636\n25,1.086924,7,4,38.178894,2364,9562418,94.596756,6949.0996,178,334.9375,21477.057,12216.636\n26,3.8588758,7,4,19.806421,183,1061214.2,70.44252,5291.4692,178,449.78516,28205.059,12216.636\n27,2.9553642,8,4,152.64659,251,1603799.8,67.250679,4869.6396,178,471.13281,30648.303,12216.636\n28,2.5628395,8,4,30.569248,568,1731472.4,65.794159,4767.6074,178,481.5625,31304.215,12216.636\n29,1.9056505,9,3,36.273235,29,378006.91,60.132584,4206.0908,178,526.90234,35483.352,12216.636\n30,1.9439689,9,3,20.292385,218,1091423.4,60.404408,4222.1895,178,524.53125,35348.059,12216.636\n31,2.9565058,10,4,63.638454,179,1265680.5,76.827156,5356.625,178,412.40625,27861.982,12216.636\n32,2.0050292,10,4,72.13398,318,1992266.2,76.798058,5353.8901,178,412.5625,27876.215,12216.636\n33,3.038465,10,5,69.456345,451,2690610.5,76.773346,5351.5645,178,412.69531,27888.332,12216.636\n34,4,10,5,85.215919,289,1667870.4,75.121597,5252.0879,178,421.76953,28416.547,12216.636\n35,4,11,4,107.46763,2,838417.31,63.447308,4644.291,178,499.375,32135.412,12216.636\n36,3.2855186,12,4,11.691815,194,1175906.4,91.489624,6918.437,178,346.3125,21572.242,12216.636\n37,1.7466468,12,4,67.515892,1345,8545044,93.415764,7065.1655,178,339.17188,21124.232,12216.636\n38,1.9949708,12,4,71.218079,1564,10169552,93.450203,7068.7441,178,339.04688,21113.537,12216.636\n39,2.9728639,12,5,69.910538,1838,11861826,93.480362,7072.0098,178,338.9375,21103.789,12216.636\n40,3.021472,12,5,149.26498,2287,15157395,92.603081,7028.9722,178,342.14844,21233.004,12216.636\n41,2.9785283,12,5,84.025612,2172,14630360,92.644333,7033.8105,178,341.99609,21218.398,12216.636\n42,4,12,6,193.21144,1244,11365588,92.635872,7033.4829,178,342.02734,21219.387,12216.636\n43,4,12,5,69.391472,768,7140941.5,93.896996,7157.6016,178,337.43359,20851.426,12216.636\n44,1.8460462,13,3,72.605972,316,1933160.2,78.073212,5514.459,178,405.82422,27064.521,12216.636\n45,3.079603,13,5,109.37788,478,2846059,77.863358,5500.2261,178,406.91797,27134.557,12216.636\n46,4,13,5,236.42712,473,4039082.2,78.030403,5565.8442,178,406.04688,26814.656,12216.636\n47,2.9256492,14,3,73.804344,175,1367621.2,65.590919,4713.0044,178,483.05469,31666.893,12216.636\n48,3.118978,15,4,1.1576769,21,52568.5,54.646725,3815.7188,178,579.79688,39113.523,12216.636\n49,2.881022,15,4,51.738968,143,588109.5,57.167553,4008.4851,178,554.23047,37232.57,12216.636\n50,0.67563176,16,2,57.332561,0,576803.94,65.119614,4571.0322,178,486.55078,32650.436,12216.636\n51,3.3243682,16,4,1.773312,279,1124254.5,64.529015,4523.1011,178,491.00391,32996.434,12216.636\n52,3.5566537,17,4,1.5755012,185,842638.75,76.248665,5384.1821,178,415.53516,27719.381,12216.636\n53,2.4433463,17,5,94.138809,909,2878055.8,76.660873,5397.0391,178,413.30078,27653.35,12216.636\n54,4,17,5,240.50478,375,3247603.5,76.669571,5422.1479,178,413.25391,27525.291,12216.636\n55,2.9502037,18,4,63.214619,480,4244460.5,103.37621,7594.2671,178,306.49219,19652.482,12216.636\n56,2.043396,18,4,55.795689,1247,10353393,102.60077,7508.9897,178,308.80859,19875.67,12216.636\n57,3.0064003,18,5,61.844196,1345,9701150,102.59558,7507.5396,178,308.82422,19879.51,12216.636\n58,4,18,6,57.726696,1684,8941627,102.73723,7506.4736,178,308.39844,19882.332,12216.636\n59,4,18,6,78.380333,1829,7873546.5,102.76196,7497.6934,178,308.32422,19905.615,12216.636\n60,2.3847485,18,5,76.566856,2421,9062067,103.37885,7527.7261,178,306.48438,19826.199,12216.636\n61,3.6152513,18,4,7.2528086,254,949294.31,80.944298,6096.1309,178,391.42969,24482.119,12216.636\n62,3.0376058,19,4,4.8203835,969,3415459,88.060799,6053.9453,178,359.79688,24652.717,12216.636\n63,2.0014875,19,4,57.263824,1257,4270006.5,88.909271,6120.3413,178,356.36328,24385.273,12216.636\n64,2.0467546,19,4,81.338486,1219,4250588,89.006836,6125.0562,178,355.97266,24366.502,12216.636\n65,2.9141521,19,5,69.343399,1026,3768641.5,89.135948,6129.8477,178,355.45703,24347.457,12216.636\n66,2.9891434,19,4,15.855036,146,408590.09,92.881973,6344.1655,178,341.12109,23524.953,12216.636\n67,4,20,5,0.50094116,218,1162905.5,95.223106,6722.3511,178,332.73438,22201.488,12216.636\n68,3.7623262,20,5,31.326914,1285,4497112,96.855942,6966.7446,178,327.125,21422.658,12216.636\n69,1.3914185,20,4,20.039038,3505,11620107,109.44092,7678.6113,178,289.50781,19436.613,12216.636\n70,1.9921591,20,4,80.945,3493,11790712,109.55621,7688.1909,178,289.20312,19412.395,12216.636\n71,1.5069535,20,4,54.103935,3332,11531442,110.02882,7732.5884,178,287.96094,19300.938,12216.636\n72,3.3471429,20,4,8.468255,2263,8132306,104.11933,7376.3535,178,304.30469,20233.059,12216.636\n73,2,21,2,79.482445,0,724714.19,68.040466,4773.4067,178,465.66406,31266.18,12216.636\n74,2,22,2,84.41777,0,884771.5,61.031174,4482.9517,178,519.14453,33291.949,12216.636\n75,2.0549963,23,3,141.50713,807,5807270,108.51846,7723.2334,178,291.96875,19324.314,12216.636\n76,2.0359912,23,4,75.595688,1018,8256845,108.48653,7714.8027,178,292.05469,19345.434,12216.636\n77,2.0393751,23,4,72.215797,1600,11373205,108.45172,7712.0181,178,292.14844,19352.418,12216.636\n78,2.9666958,23,5,73.287651,2234,14429388,108.67695,7731.8662,178,291.54297,19302.74,12216.636\n79,4,23,6,30.462101,3298,17047350,109.00117,7758.3276,178,290.67578,19236.904,12216.636\n80,2.9891434,23,4,41.801193,7,305486.44,81.780823,6039.9316,178,387.42578,24709.916,12216.636\n81,3.0975204,24,4,19.99411,1982,8221255.5,94.571388,6882.4766,178,335.02734,21684.955,12216.636\n82,1.8206327,24,4,81.959412,2197,8739249,94.774712,6903.2329,178,334.30859,21619.754,12216.636\n83,3.081847,24,5,61.298454,2277,8390308,94.681778,6897.7725,178,334.63672,21636.869,12216.636\n84,4,24,6,230.26486,1424,6303539,94.330521,6897.4736,178,335.88281,21637.807,12216.636\n85,3.2086754,24,4,11.345068,44,144973.97,94.284462,6899.8101,178,336.04688,21630.479,12216.636\n86,4,25,5,21.704504,197,477300.16,96.725426,6661.9341,178,327.56641,22402.832,12216.636\n87,4,25,6,156.13542,1787,5874959,98.494301,6724.2876,178,321.68359,22195.096,12216.636\n88,3.1397986,25,5,4.3709054,2150,9321218,104.76485,7310.2856,178,302.42969,20415.92,12216.636\n89,1.8853738,25,4,123.53465,3623,16552666,109.2331,7622.9595,178,290.05859,19578.512,12216.636\n90,2.9748278,25,5,88.042221,3490,16621146,109.28609,7624.9824,178,289.91797,19573.316,12216.636\n91,4,25,6,44.959156,3443,16985778,113.6598,7907.6191,178,278.76172,18873.721,12216.636\n92,3.2086754,25,4,32.158134,68,200538.19,101.16245,6671.1152,178,313.19922,22372,12216.636\n93,1.5234891,26,3,156.51314,880,4697371,104.36852,7220.9028,178,303.57812,20668.635,12216.636\n94,2.5515666,26,4,28.49353,680,4084668.8,101.46744,7087.5713,178,312.25781,21057.453,12216.636\n95,2.7092693,26,5,152.589,817,4337584,103.78361,7169.0215,178,305.28906,20818.209,12216.636\n96,4,26,5,4.3323708,614,2229197,76.315384,5204.4497,178,415.17188,28676.652,12216.636\n97,3.2741685,27,4,5.734199,492,997931.38,80.218208,5351.3374,178,394.97266,27889.516,12216.636\n98,2.7258315,27,5,58.77298,1042,3266476.5,81.474419,5444.9028,178,388.88281,27410.258,12216.636\n99,4,27,6,26.602385,1344,4041288.8,82.973801,5525.2549,178,381.85547,27011.643,12216.636\n100,4,27,5,7.6956849,33,207832.08,82.114479,5449.6763,178,385.85156,27386.25,12216.636\n101,3.3356996,28,4,14.008615,194,486196.19,70.869667,4749.543,178,447.07422,31423.277,12216.636\n102,2.6643004,28,5,51.947716,511,1172606.5,75.637886,5014.8662,178,418.89062,29760.754,12216.636\n103,3.2326641,28,5,24.983932,284,761697.12,76.392288,5051.4565,178,414.75391,29545.182,12216.636\n104,2.7673359,28,4,8.5771065,207,681293.75,82.713196,5482.2207,178,383.05859,27223.676,12216.636\n105,4,29,5,55.623226,382,1242717.2,74.394005,4952.0566,178,425.89453,30138.227,12216.636\n106,2.6909027,29,5,122.1385,689,2199216.8,73.854805,4909.8218,178,429.00391,30397.479,12216.636\n107,3.3090973,29,4,13.437029,331,745346.69,72.762947,4875.8032,178,435.44141,30609.561,12216.636\n108,2.9276934,30,4,81.830719,222,678286.44,89.582893,5963.4609,178,353.68359,25026.775,12216.636\n109,2.7533221,30,5,11.665026,481,3171357.2,90.295944,6051.2231,178,350.89062,24663.807,12216.636\n110,3.2466779,30,5,6.1998625,338,2045784.5,86.868698,5836.5537,178,364.73438,25570.945,12216.636\n111,4,30,6,5.4097123,2668,11407769,105.92642,7445.8682,178,299.11328,20044.162,12216.636\n112,3.0539846,30,5,67.115707,2883,12051203,105.87665,7443.2124,178,299.25391,20051.316,12216.636\n113,2.9460154,30,5,59.932568,2769,11646952,105.91536,7444.0581,178,299.14453,20049.037,12216.636\n114,3.1116269,30,5,95.806824,2047,9289722,105.9901,7445.4268,178,298.93359,20045.352,12216.636\n115,2.8883731,30,4,0.19636907,1405,6988613.5,107.35222,7529.5103,178,295.14062,19821.502,12216.636\n116,2.9463861,31,4,85.111755,76,584308.75,69.896194,4771.4482,178,453.30078,31279.014,12216.636\n117,2.9276934,31,4,7.8116097,118,404667.56,71.989281,4957.4209,178,440.12109,30105.613,12216.636\n118,2.7760887,32,3,80.504349,40,465632.84,67.132118,4718.7378,178,471.96484,31628.416,12216.636\n119,1.7224751,33,2,51.585476,7,210206.28,53.71521,3717.9077,178,589.85156,40142.523,12216.636\n120,4,34,5,100.73653,1167,7415106.5,108.31992,7600.376,178,292.50391,19636.688,12216.636\n121,4,34,6,104.9296,1762,9997418,108.30835,7603.0674,178,292.53516,19629.736,12216.636\n122,2.8438091,34,5,68.548241,2983,14175580,108.05441,7573.5566,178,293.22266,19706.225,12216.636\n123,2.1506054,34,4,42.451733,3055,14141106,107.82458,7557.7256,178,293.84766,19747.502,12216.636\n124,3.0055857,34,5,44.519382,3227,14320575,107.82172,7557.6279,178,293.85547,19747.756,12216.636\n125,3.1265831,34,5,83.344948,3250,14420084,107.70002,7561.4126,178,294.1875,19737.873,12216.636\n126,2.8734171,34,5,11.506542,3430,13727606,107.9753,7599.6616,178,293.4375,19638.531,12216.636\n127,4,34,6,6.0284462,2657,10569333,105.04842,7428.769,178,301.61328,20090.301,12216.636\n128,4,34,5,5.419879,326,1180875.9,86.131653,6176.9673,178,367.85547,24161.727,12216.636\n129,2,35,2,20.824474,0,212491.75,66.399551,4603.9497,178,477.17188,32416.992,12216.636\n130,2.315361,36,3,36.565041,182,517014.62,69.343452,4775.4722,178,456.91406,31252.656,12216.636\n131,0.87075675,37,2,15.346227,109,383297.66,64.659164,4430.2266,178,490.01562,33688.164,12216.636\n132,2.5553956,38,3,58.902714,107,482010.88,60.524754,4128.2837,178,523.48828,36152.117,12216.636\n133,4,39,5,29.471209,2132,7106502.5,102.01877,7046.436,178,310.57031,21180.381,12216.636\n134,3.0400231,39,5,0.41702437,1868,6555843,102.04957,7047.5352,178,310.47656,21177.078,12216.636\n135,1.8690072,39,4,143.56969,2082,7028887,103.00992,7118.877,178,307.58203,20964.852,12216.636\n136,3.0909696,39,5,220.49948,633,2843580.8,102.03416,7091.9126,178,310.52344,21044.562,12216.636\n137,3.3558173,39,4,4.6648011,60,48442.176,102.77367,7156.9517,178,308.28906,20853.32,12216.636\n138,4,40,5,5.8880019,1198,6602856.5,92.347939,6651.4351,178,343.09375,22438.195,12216.636\n139,2.8008873,40,5,86.80928,1314,6988477.5,90.596497,6541.2188,178,349.72656,22816.268,12216.636\n140,1.9834378,40,3,83.826813,874,4874680,89.554214,6493.5498,178,353.79688,22983.762,12216.636\n141,3.7738943,41,4,33.475399,963,7042259,84.994438,6210.7104,178,372.77734,24030.455,12216.636\n142,1.4153167,41,4,178.53447,1362,8652835,90.345222,6721.4429,178,350.69922,22204.488,12216.636\n143,1.2796584,41,4,116.47486,1233,6833815.5,91.196457,6782.4829,178,347.42578,22004.656,12216.636\n144,2.8869476,41,3,6.8355722,0,32039.699,81.984169,6130.0171,178,386.46484,24346.783,12216.636\n145,3.9999998,42,5,314.13025,147,2550125.8,75.341393,5244.0146,178,420.53906,28460.293,12216.636\n146,4,42,5,1.4020742,28,787264.31,73.82859,5159.4937,178,429.15625,28926.521,12216.636\n147,2,43,2,32.635479,0,340282.88,67.405479,4677.939,178,470.05078,31904.262,12216.636\n148,2.372308,44,4,55.385048,1325,2879153,77.915718,5145.1392,178,406.64453,29007.223,12216.636\n149,3.6276922,44,4,8.0672827,538,1295412.9,74.798775,5021.2231,178,423.58984,29723.076,12216.636\n150,2.6622484,45,4,4.1139636,523,1247895.5,72.8479,4776.5571,178,434.93359,31245.559,12216.636\n151,1.9825487,45,4,56.198662,461,1198154.6,72.054512,4745.6021,178,439.72266,31449.371,12216.636\n152,3.3552032,45,4,13.687597,169,627264.94,69.173141,4584.3516,178,458.03906,32555.576,12216.636\n153,3.7100596,46,4,5.1633153,55,157636.45,69.908241,4694.3491,178,453.22266,31792.736,12216.636\n154,0.85895824,46,4,48.794411,682,1540374.1,74.486237,4990.52,178,425.36719,29905.941,12216.636\n155,3.4309821,46,4,5.8241816,177,671997.44,69.014816,4629.6465,178,459.08984,32237.061,12216.636\n156,2.7051506,47,4,166.88625,383,2285897.5,70.657295,4891.9014,178,448.41797,30508.834,12216.636\n157,3.2948494,47,4,4.9959264,274,1980018.8,69.792152,4865.7471,178,453.97656,30672.824,12216.636\n158,0.98894149,48,2,114.23679,0,1195344.4,80.295242,6018.9507,178,394.59375,24796.049,12216.636\n159,1.182127,48,3,55.910877,274,2741649,80.140541,6005.0312,178,395.35547,24853.525,12216.636\n160,3.0480838,49,4,81.635147,126,1503485.5,81.069695,6023.3394,178,390.82422,24777.984,12216.636\n161,2.0113289,49,4,108.93696,334,2477706.5,81.778351,6069.8652,178,387.4375,24588.059,12216.636\n162,2.940587,49,4,30.296598,330,1952532.9,82.620514,6154.3496,178,383.48828,24250.523,12216.636\n163,3.1072955,50,3,40.717644,287,1715661.2,62.152149,4446.2324,178,509.78125,33566.891,12216.636\n164,1.1072954,51,1,63.598595,0,651424.19,44.939854,3176.8967,178,705.03125,46978.613,12216.636\n165,3.0436037,52,4,4.4063578,96,605797.19,66.459404,4746.5186,178,476.74219,31443.299,12216.636\n166,2.9563963,52,4,90.654068,109,1062591.8,67.1894,4814.7637,178,471.5625,30997.617,12216.636\n167,3.0721309,53,4,143.34143,93,2134044,75.842278,5481.8882,178,417.76172,27225.328,12216.636\n168,2.9278691,53,4,141.29507,294,2936599.2,76.411003,5523.6138,178,414.65234,27019.666,12216.636\n169,4,54,4,64.827652,299,1046788.9,60.478722,4116.709,178,523.88672,36253.766,12216.636\n170,1.9948233,55,3,26.562881,53,334537.75,46.611523,3140.5879,178,679.74609,47521.742,12216.636\n171,1.9981046,55,3,23.211634,55,313906.69,46.611523,3140.5879,178,679.74609,47521.742,12216.636\n172,1.9839985,56,2,62.202236,0,264440.84,42.862148,2839.1758,178,739.20703,52566.734,12216.636\n173,2.0713086,57,3,25.08102,68,396381.09,52.447456,3490.3325,178,604.10938,42759.883,12216.636\n174,1.9357636,57,3,25.400402,91,432314.75,55.001724,3657.7,178,576.05469,40803.289,12216.636\n175,2.0160015,58,2,63.467106,26,283843.69,43.754169,2897.7686,178,724.13672,51503.84,12216.636\n176,4,59,4,106.14331,8,866621.44,63.394745,4639.7456,178,499.78906,32166.893,12216.636\n177,4,60,4,245.73332,0,2100469,73.744011,5285.8833,178,429.64844,28234.865,12216.636\n"
  },
  {
    "path": "testdata/barnsbury_segment_lines.mif",
    "content": "Version 300\nCharset \"WindowsLatin1\"\nDelimiter \",\"\nIndex 1\nCoordSys NonEarth Units \"m\" Bounds (530635.696268, 183499.852969) (531446.820644, 184583.962646)\nColumns 13\n  Depthmap_Ref Integer\n  Angular_Connectivity Float\n  Axial_Line_Ref Float\n  Connectivity Float\n  Segment_Length Float\n  T1024_Choice Float\n  T1024_Choice_Segment_Length_Wgt_ Float\n  T1024_Integration Float\n  T1024_Integration_Segment_Length_Wgt_ Float\n  T1024_Node_Count Float\n  T1024_Total_Depth Float\n  T1024_Total_Depth_Segment_Length_Wgt_ Float\n  T1024_Total_Segment_Length Float\nData\n\nLINE 530661.6919780188 184270.5626832811 530670.3012171048 184204.951785912\n    PEN (1,2,0)\nLINE 530670.3012171048 184204.951785912 530681.0222267658 184123.2471128816\n    PEN (1,2,0)\nLINE 530681.0222267658 184123.2471128816 530712.6887355548 183881.9170676302\n    PEN (1,2,0)\nLINE 530712.6887355548 183881.9170676302 530730.7679409641 183744.1356819843\n    PEN (1,2,0)\nLINE 530661.6919780187 184270.562683281 530782.0935715765 184320.087685171\n    PEN (1,2,0)\nLINE 530782.0935715765 184320.087685171 530931.9721717195 184381.7375166726\n    PEN (1,2,0)\nLINE 530931.9721717195 184381.7375166726 531102.9365496121 184452.0605986855\n    PEN (1,2,0)\nLINE 531102.9365496121 184452.0605986855 531275.7084119404 184523.1271564901\n    PEN (1,2,0)\nLINE 531275.7084119404 184523.1271564901 531340.8293390643 184549.9134634117\n    PEN (1,2,0)\nLINE 530782.0935715765 184320.087685171 530796.6615005322 184257.2066049815\n    PEN (1,2,0)\nLINE 530796.6615005322 184257.2066049815 530808.6826332469 184205.3185286112\n    PEN (1,2,0)\nLINE 530808.6826332469 184205.3185286112 530811.0516134852 184195.09305066\n    PEN (1,2,0)\nLINE 530670.3012171047 184204.9517859119 530796.6615005322 184257.2066049815\n    PEN (1,2,0)\nLINE 530796.6615005322 184257.2066049815 530930.0609102942 184312.3723725155\n    PEN (1,2,0)\nLINE 530930.0609102942 184312.3723725155 531122.4555083865 184391.9349110013\n    PEN (1,2,0)\nLINE 530804.6982026402 184201.4318404568 530811.0516134852 184195.0930506599\n    PEN (1,2,0)\nLINE 530811.0516134852 184195.0930506599 530855.3978358759 184150.8488818384\n    PEN (1,2,0)\nLINE 530755.4256480751 184153.3679956899 530804.6982026402 184201.4318404567\n    PEN (1,2,0)\nLINE 530804.6982026402 184201.4318404567 530808.6826332469 184205.3185286112\n    PEN (1,2,0)\nLINE 530755.4256480752 184153.36799569 530759.8102694125 184121.9498409454\n    PEN (1,2,0)\nLINE 530759.8102694125 184121.9498409454 530781.0080675455 183970.0562905679\n    PEN (1,2,0)\nLINE 530681.0222267658 184123.2471128815 530759.8102694125 184121.9498409453\n    PEN (1,2,0)\nLINE 530759.8102694125 184121.9498409453 530852.4203537111 184120.4249843892\n    PEN (1,2,0)\nLINE 530852.4203537111 184120.4249843892 530924.739253607 184119.2342290901\n    PEN (1,2,0)\nLINE 530924.739253607 184119.2342290901 531002.80539858 184117.9488434448\n    PEN (1,2,0)\nLINE 531002.80539858 184117.9488434448 531040.9791199062 184117.3203001314\n    PEN (1,2,0)\nLINE 531040.9791199062 184117.3203001314 531060.7828570851 184116.994224859\n    PEN (1,2,0)\nLINE 530837.552389062 183968.5041980529 530852.4203537111 184120.4249843893\n    PEN (1,2,0)\nLINE 530852.4203537111 184120.4249843893 530855.3978358759 184150.8488818385\n    PEN (1,2,0)\nLINE 530781.0080675455 183970.0562905679 530817.2676436539 183969.0609966963\n    PEN (1,2,0)\nLINE 530817.2676436539 183969.0609966963 530837.5523890621 183968.5041980528\n    PEN (1,2,0)\nLINE 530804.1027903862 183678.9148130685 530806.9873013139 183742.4878602049\n    PEN (1,2,0)\nLINE 530806.9873013139 183742.4878602049 530810.2568850133 183814.5477011403\n    PEN (1,2,0)\nLINE 530810.2568850133 183814.5477011403 530813.4051007051 183883.9326574047\n    PEN (1,2,0)\nLINE 530813.4051007051 183883.9326574047 530817.2676436539 183969.0609966964\n    PEN (1,2,0)\nLINE 530806.9873013139 183742.4878602049 530914.4265599075 183744.9570759712\n    PEN (1,2,0)\nLINE 530912.2449280558 183665.7794156555 530912.5669577819 183677.46679556\n    PEN (1,2,0)\nLINE 530912.5669577819 183677.46679556 530914.4265599076 183744.9570759712\n    PEN (1,2,0)\nLINE 530914.4265599076 183744.9570759712 530916.3881318528 183816.1481328081\n    PEN (1,2,0)\nLINE 530916.3881318528 183816.1481328081 530918.3136899534 183886.0321442102\n    PEN (1,2,0)\nLINE 530918.3136899534 183886.0321442102 530922.4249214346 184035.2404945642\n    PEN (1,2,0)\nLINE 530922.4249214346 184035.2404945642 530924.739253607 184119.2342290901\n    PEN (1,2,0)\nLINE 530924.739253607 184119.2342290901 530930.0609102943 184312.3723725156\n    PEN (1,2,0)\nLINE 530930.0609102943 184312.3723725156 530931.9721717195 184381.7375166726\n    PEN (1,2,0)\nLINE 530997.7409700139 184191.5792263541 531069.1018140045 184204.9679402672\n    PEN (1,2,0)\nLINE 531069.1018140045 184204.9679402672 531176.6039484286 184225.1374792238\n    PEN (1,2,0)\nLINE 531176.6039484286 184225.1374792238 531408.9765464333 184268.7352011949\n    PEN (1,2,0)\nLINE 530997.7409700138 184191.5792263541 531002.8053985799 184117.9488434448\n    PEN (1,2,0)\nLINE 531065.9075465151 184257.7680519287 531065.9774551002 184256.612487747\n    PEN (1,2,0)\nLINE 531065.9774551002 184256.612487747 531069.1018140046 184204.9679402672\n    PEN (1,2,0)\nLINE 531014.260003 184282.658893 531065.9075465151 184257.7680519287\n    PEN (1,2,0)\nLINE 531065.9075465151 184257.7680519287 531067.5050192737 184256.9981713527\n    PEN (1,2,0)\nLINE 531065.9774551002 184256.612487747 531067.5050192737 184256.9981713527\n    PEN (1,2,0)\nLINE 531067.5050192737 184256.9981713527 531158.7795115133 184280.0434063022\n    PEN (1,2,0)\nLINE 531158.7795115133 184280.0434063022 531391.9665625809 184338.919114588\n    PEN (1,2,0)\nLINE 531102.9365496121 184452.0605986855 531122.4555083866 184391.9349110013\n    PEN (1,2,0)\nLINE 531122.4555083866 184391.9349110013 531139.6837024501 184338.8656347355\n    PEN (1,2,0)\nLINE 531139.6837024501 184338.8656347355 531158.7795115134 184280.0434063022\n    PEN (1,2,0)\nLINE 531158.7795115134 184280.0434063022 531176.6039484288 184225.1374792239\n    PEN (1,2,0)\nLINE 531176.6039484288 184225.1374792239 531200.8056679327 184150.5871384435\n    PEN (1,2,0)\nLINE 531200.8056679327 184150.5871384435 531224.4474343648 184077.7616623912\n    PEN (1,2,0)\nLINE 531224.4474343648 184077.7616623912 531226.6869048447 184070.8632563747\n    PEN (1,2,0)\nLINE 531222.0221921728 184069.6481218071 531226.6869048446 184070.8632563747\n    PEN (1,2,0)\nLINE 531226.6869048446 184070.8632563747 531282.1014374334 184085.2984678934\n    PEN (1,2,0)\nLINE 531282.1014374334 184085.2984678934 531360.8131579099 184105.8024815699\n    PEN (1,2,0)\nLINE 531360.8131579099 184105.8024815699 531427.9171605199 184123.2827421834\n    PEN (1,2,0)\nLINE 531427.9171605199 184123.2827421834 531443.2601697572 184127.2795201643\n    PEN (1,2,0)\nLINE 531168.4909565911 183890.5617386632 531168.6344222261 183891.0416966056\n    PEN (1,2,0)\nLINE 531168.6344222261 183891.0416966056 531177.6062062277 183921.056403528\n    PEN (1,2,0)\nLINE 531177.6062062277 183921.056403528 531183.345230286 183940.256054913\n    PEN (1,2,0)\nLINE 531183.345230286 183940.256054913 531206.5272470647 184017.8104676549\n    PEN (1,2,0)\nLINE 531206.5272470647 184017.8104676549 531222.0221921728 184069.6481218071\n    PEN (1,2,0)\nLINE 531222.0221921728 184069.6481218071 531224.4474343648 184077.7616623912\n    PEN (1,2,0)\nLINE 531103.958023 183944.145791 531183.3452302859 183940.256054913\n    PEN (1,2,0)\nLINE 531275.7084119404 184523.1271564901 531297.5108320001 184441.573404\n    PEN (1,2,0)\nLINE 531340.8293390643 184549.9134634118 531374.1604658248 184412.3878235204\n    PEN (1,2,0)\nLINE 531374.1604658248 184412.3878235204 531391.9665625809 184338.9191145881\n    PEN (1,2,0)\nLINE 531391.9665625809 184338.9191145881 531408.9765464333 184268.7352011949\n    PEN (1,2,0)\nLINE 531408.9765464333 184268.7352011949 531426.238998241 184197.5095943315\n    PEN (1,2,0)\nLINE 531426.238998241 184197.5095943315 531433.4141573964 184167.9045839381\n    PEN (1,2,0)\nLINE 531433.4141573964 184167.9045839381 531443.2601697572 184127.2795201643\n    PEN (1,2,0)\nLINE 531040.9791199062 184117.3203001315 531060.55370366 184121.3946202041\n    PEN (1,2,0)\nLINE 531060.55370366 184121.3946202041 531140.7934071338 184138.0959834922\n    PEN (1,2,0)\nLINE 531140.7934071338 184138.0959834922 531200.8056679327 184150.5871384435\n    PEN (1,2,0)\nLINE 531200.8056679327 184150.5871384435 531426.238998241 184197.5095943315\n    PEN (1,2,0)\nLINE 531426.238998241 184197.5095943315 531437.3460188021 184199.8214471601\n    PEN (1,2,0)\nLINE 531379.770131822 183732.4495029183 531382.4238646072 183753.9911641308\n    PEN (1,2,0)\nLINE 531382.4238646072 183753.9911641308 531401.5139900263 183908.9551516768\n    PEN (1,2,0)\nLINE 531401.5139900263 183908.9551516768 531402.0484051576 183913.2932635508\n    PEN (1,2,0)\nLINE 531402.0484051576 183913.2932635508 531417.1525502533 184035.9010778593\n    PEN (1,2,0)\nLINE 531417.1525502533 184035.9010778593 531427.9171605199 184123.2827421833\n    PEN (1,2,0)\nLINE 531427.9171605199 184123.2827421833 531433.4141573964 184167.9045839381\n    PEN (1,2,0)\nLINE 531433.4141573964 184167.9045839381 531437.346018802 184199.8214471601\n    PEN (1,2,0)\nLINE 531375.1001237407 183572.3943911834 531387.3458877866 183728.4277266877\n    PEN (1,2,0)\nLINE 531387.3458877866 183728.4277266877 531389.5752537736 183756.833909406\n    PEN (1,2,0)\nLINE 531389.5752537736 183756.833909406 531401.5139900263 183908.9551516768\n    PEN (1,2,0)\nLINE 531401.5139900263 183908.9551516768 531401.8529595991 183913.2742413547\n    PEN (1,2,0)\nLINE 531297.7582437188 183720.3357738068 531303.0868777729 183722.4539565722\n    PEN (1,2,0)\nLINE 531303.0868777729 183722.4539565722 531357.7029968201 183744.1643838416\n    PEN (1,2,0)\nLINE 531357.7029968201 183744.1643838416 531382.4238646072 183753.9911641308\n    PEN (1,2,0)\nLINE 531382.4238646072 183753.9911641308 531389.5752537737 183756.8339094061\n    PEN (1,2,0)\nLINE 531299.4468674023 183775.0910818076 531311.8200189774 183768.5224902194\n    PEN (1,2,0)\nLINE 531311.8200189774 183768.5224902194 531357.7029968201 183744.1643838416\n    PEN (1,2,0)\nLINE 531357.7029968201 183744.1643838416 531379.7701318221 183732.4495029183\n    PEN (1,2,0)\nLINE 531379.7701318221 183732.4495029183 531387.3458877866 183728.4277266877\n    PEN (1,2,0)\nLINE 531304.3126897123 183959.5738054356 531306.4967095837 183903.9934713184\n    PEN (1,2,0)\nLINE 531306.4967095837 183903.9934713184 531311.2924203729 183781.9491568425\n    PEN (1,2,0)\nLINE 531311.2924203729 183781.9491568425 531311.8200189773 183768.5224902195\n    PEN (1,2,0)\nLINE 531075.4349141666 183881.5048417101 531156.8807901648 183889.4317520639\n    PEN (1,2,0)\nLINE 531156.8807901648 183889.4317520639 531168.4909565911 183890.5617386632\n    PEN (1,2,0)\nLINE 531168.4909565911 183890.5617386632 531174.6616614035 183891.1623169401\n    PEN (1,2,0)\nLINE 531174.6616614035 183891.1623169401 531180.0459325081 183891.6863537172\n    PEN (1,2,0)\nLINE 531180.0459325081 183891.6863537172 531246.8460016274 183898.1878266653\n    PEN (1,2,0)\nLINE 531246.8460016274 183898.1878266653 531306.4967095837 183903.9934713184\n    PEN (1,2,0)\nLINE 531306.4967095837 183903.9934713184 531401.8529595992 183913.2742413547\n    PEN (1,2,0)\nLINE 531401.8529595992 183913.2742413547 531402.0484051576 183913.2932635508\n    PEN (1,2,0)\nLINE 531056.0095225013 183972.3751082587 531073.8019170946 183889.1438577853\n    PEN (1,2,0)\nLINE 531073.8019170946 183889.1438577853 531075.4349141666 183881.5048417101\n    PEN (1,2,0)\nLINE 530986.8482115235 183887.4036937163 531004.8354864263 183965.872851334\n    PEN (1,2,0)\nLINE 531004.8354864263 183965.872851334 531056.0095225013 183972.3751082587\n    PEN (1,2,0)\nLINE 530712.6887355547 183881.9170676303 530813.4051007051 183883.9326574047\n    PEN (1,2,0)\nLINE 530813.4051007051 183883.9326574047 530918.3136899534 183886.0321442102\n    PEN (1,2,0)\nLINE 530918.3136899534 183886.0321442102 530986.8482115236 183887.4036937163\n    PEN (1,2,0)\nLINE 530986.8482115236 183887.4036937163 531029.2914457454 183888.2530904232\n    PEN (1,2,0)\nLINE 531029.2914457454 183888.2530904232 531073.8019170945 183889.1438577853\n    PEN (1,2,0)\nLINE 531073.8019170945 183889.1438577853 531157.1301833935 183890.8114676243\n    PEN (1,2,0)\nLINE 531157.1301833935 183890.8114676243 531168.6344222261 183891.0416966057\n    PEN (1,2,0)\nLINE 531168.6344222261 183891.0416966057 531174.6616614035 183891.1623169401\n    PEN (1,2,0)\nLINE 531174.6616614035 183891.1623169401 531180.0804551976 183891.2707607402\n    PEN (1,2,0)\nLINE 531246.8460016274 183898.1878266653 531247.100529 183877.364907\n    PEN (1,2,0)\nLINE 531380.713483092 184038.9336762212 531417.1525502533 184035.9010778593\n    PEN (1,2,0)\nLINE 531367.8635018886 184047.3232328322 531380.713483092 184038.9336762213\n    PEN (1,2,0)\nLINE 531360.8131579099 184105.8024815699 531367.8635018887 184047.323232832\n    PEN (1,2,0)\nLINE 531177.6062062277 183921.056403528 531180.0459325082 183891.6863537173\n    PEN (1,2,0)\nLINE 531180.0459325082 183891.6863537173 531180.0804551976 183891.2707607402\n    PEN (1,2,0)\nLINE 531180.0804551976 183891.2707607402 531191.9656390148 183748.1938739985\n    PEN (1,2,0)\nLINE 531191.9656390148 183748.1938739985 531210.2193315655 183528.4512480644\n    PEN (1,2,0)\nLINE 531210.2193315655 183528.4512480644 531210.6054995636 183523.8024588018\n    PEN (1,2,0)\nLINE 531204.5299233167 183526.934937537 531210.2193315655 183528.4512480644\n    PEN (1,2,0)\nLINE 531210.2193315655 183528.4512480644 531294.1006655393 183550.8068506498\n    PEN (1,2,0)\nLINE 531294.1006655393 183550.8068506498 531375.1001237407 183572.3943911835\n    PEN (1,2,0)\nLINE 530912.5669577818 183677.4667955601 530942.3204781786 183662.1263132498\n    PEN (1,2,0)\nLINE 530942.3204781786 183662.1263132498 531101.0050300843 183580.3108665743\n    PEN (1,2,0)\nLINE 531101.0050300843 183580.3108665743 531204.5299233167 183526.9349375371\n    PEN (1,2,0)\nLINE 531204.5299233167 183526.9349375371 531210.6054995636 183523.8024588018\n    PEN (1,2,0)\nLINE 531101.0050300843 183580.3108665743 531156.8807901648 183889.4317520638\n    PEN (1,2,0)\nLINE 531156.8807901648 183889.4317520638 531157.1301833934 183890.8114676243\n    PEN (1,2,0)\nLINE 531029.2914457454 183888.2530904232 531030.230687 183855.631128\n    PEN (1,2,0)\nLINE 531191.9656390148 183748.1938739985 531247.2509705561 183744.8718613147\n    PEN (1,2,0)\nLINE 531247.2509705561 183744.8718613147 531255.3037282097 183744.3879831807\n    PEN (1,2,0)\nLINE 531247.2509705561 183744.8718613147 531250.8112866409 183746.9331340065\n    PEN (1,2,0)\nLINE 531250.8112866409 183746.9331340065 531299.4468674023 183775.0910818077\n    PEN (1,2,0)\nLINE 531299.4468674023 183775.0910818077 531311.2924203731 183781.9491568425\n    PEN (1,2,0)\nLINE 531250.8112866409 183746.9331340066 531255.3037282097 183744.3879831806\n    PEN (1,2,0)\nLINE 531255.3037282097 183744.3879831806 531297.7582437188 183720.3357738067\n    PEN (1,2,0)\nLINE 531297.7582437188 183720.3357738067 531302.8256845656 183717.4648625085\n    PEN (1,2,0)\nLINE 531294.1006655394 183550.8068506498 531302.8256845657 183717.4648625084\n    PEN (1,2,0)\nLINE 531302.8256845657 183717.4648625084 531303.0868777729 183722.4539565722\n    PEN (1,2,0)\nLINE 530707.321114 183575.611283 530723.063264805 183688.7582135932\n    PEN (1,2,0)\nLINE 530723.063264805 183688.7582135932 530730.7679409641 183744.1356819843\n    PEN (1,2,0)\nLINE 530723.0632648049 183688.7582135932 530804.1027903862 183678.9148130685\n    PEN (1,2,0)\nLINE 530804.1027903862 183678.9148130685 530912.2449280557 183665.7794156555\n    PEN (1,2,0)\nLINE 530912.2449280557 183665.7794156555 530942.3204781786 183662.1263132498\n    PEN (1,2,0)\nLINE 531140.7934071338 184138.0959834922 531154.1331188128 184099.6254937419\n    PEN (1,2,0)\nLINE 531091.400795 184089.16428 531154.1331188127 184099.6254937418\n    PEN (1,2,0)\nLINE 531060.55370366 184121.3946202041 531060.7828570851 184116.994224859\n    PEN (1,2,0)\nLINE 531060.7828570851 184116.994224859 531065.4973380617 184026.4628259328\n    PEN (1,2,0)\nLINE 530922.4249214346 184035.2404945642 531065.4973380617 184026.4628259328\n    PEN (1,2,0)\nLINE 531065.4973380617 184026.4628259328 531206.5272470647 184017.8104676549\n    PEN (1,2,0)\nLINE 531282.1014374334 184085.2984678934 531294.5626424844 184021.6797343292\n    PEN (1,2,0)\nLINE 531268.4799450308 184016.6518545878 531294.5626424844 184021.6797343292\n    PEN (1,2,0)\nLINE 531294.5626424844 184021.6797343292 531317.3546726417 184026.0732824619\n    PEN (1,2,0)\nLINE 531268.4799450306 184016.6518545878 531279.5735313552 183955.446866539\n    PEN (1,2,0)\nLINE 531279.5735313554 183955.446866539 531304.3126897124 183959.5738054357\n    PEN (1,2,0)\nLINE 531304.3126897124 183959.5738054357 531329.3668766369 183963.7532967931\n    PEN (1,2,0)\nLINE 531317.3546726417 184026.0732824619 531329.3668766369 183963.7532967931\n    PEN (1,2,0)\nLINE 530810.2568850133 183814.5477011403 530916.3881318528 183816.148132808\n    PEN (1,2,0)\nLINE 531139.68370245 184338.8656347354 531374.1604658248 184412.3878235204\n    PEN (1,2,0)\n"
  },
  {
    "path": "testdata/barnsbury_segment_pline.mid",
    "content": "0,2.0012004,0,3,66.173325,365,4156801.8,88.617859,6618.5718,178,357.53516,22549.607,12216.636\n1,1.7398858,0,4,82.40506,983,9028389,89.036148,6680.416,178,355.85547,22340.854,12216.636\n2,2.0232198,0,4,243.39876,1211,9372838,87.789162,6583.7954,178,360.91016,22668.717,12216.636\n3,1.2413905,0,3,138.96246,487,4206866.5,84.789192,6377.4712,178,373.67969,23402.096,12216.636\n4,1.9381289,1,3,130.18936,330,4186343.2,89.3825,6714.5283,178,354.47656,22227.355,12216.636\n5,2.1624684,1,4,162.06264,692,5878021,90.132393,6768.0562,178,351.52734,22051.561,12216.636\n6,1.7826266,1,4,184.86253,1342,11232938,93.362,7145.4531,178,339.36719,20886.877,12216.636\n7,2.0335331,1,4,186.81696,1021,8303167,94.585724,7241.9897,178,334.97656,20608.453,12216.636\n9,4,2,5,64.546532,308,1653464.4,67.747787,4992.2837,178,467.67578,29895.375,12216.636\n10,2.6528366,2,5,53.262371,385,1758330.9,66.705902,4920.8042,178,474.98047,30329.635,12216.636\n11,3.3471634,2,4,10.496307,238,1142586.6,66.317581,4891.7046,178,477.76172,30510.059,12216.636\n12,4,3,5,136.73875,450,4882207.5,80.08831,6026.8027,178,395.61328,24763.744,12216.636\n13,4,3,6,144.35603,309,4674048.5,80.518425,6047.978,178,393.5,24677.041,12216.636\n14,4,3,5,208.19673,618,6827499,82.457573,6239.9404,178,384.24609,23917.889,12216.636\n15,3.6441982,4,4,8.9747467,0,86300.844,54.864071,3917.8215,178,577.5,38094.18,12216.636\n16,0.91864121,4,3,62.642906,408,1356859.4,61.200176,4461.4165,178,517.71094,33452.648,12216.636\n17,1.5875411,5,3,68.832535,189,772664.94,57.446114,4183.127,178,551.54297,35678.145,12216.636\n18,3.0086384,5,4,5.5661507,55,472367.16,57.439606,4182.6602,178,551.60547,35682.125,12216.636\n19,2.5961795,6,4,31.722631,347,1240084.2,67.549751,4859.6494,178,469.04688,30711.309,12216.636\n20,2.8942552,6,4,153.36557,17,792264.5,64.708687,4663.2021,178,489.64062,32005.088,12216.636\n21,4,7,5,78.798721,521,3768654.8,94.541626,6940.915,178,335.13281,21502.381,12216.636\n22,4,7,6,92.622635,1212,6392349,94.387596,6921.416,178,335.67969,21562.957,12216.636\n23,4,7,6,72.328705,2026,9513038,94.350273,6925.3647,178,335.8125,21550.662,12216.636\n24,3.0542002,7,5,78.076729,2484,10539197,94.411774,6929.8618,178,335.59375,21536.678,12216.636\n25,1.086924,7,4,38.178894,2364,9562418,94.596756,6949.0996,178,334.9375,21477.057,12216.636\n26,3.8588758,7,4,19.806421,183,1061214.2,70.44252,5291.4692,178,449.78516,28205.059,12216.636\n27,2.9553642,8,4,152.64659,251,1603799.8,67.250679,4869.6396,178,471.13281,30648.303,12216.636\n28,2.5628395,8,4,30.569248,568,1731472.4,65.794159,4767.6074,178,481.5625,31304.215,12216.636\n29,1.9056505,9,3,36.273235,29,378006.91,60.132584,4206.0908,178,526.90234,35483.352,12216.636\n30,1.9439689,9,3,20.292385,218,1091423.4,60.404408,4222.1895,178,524.53125,35348.059,12216.636\n31,2.9565058,10,4,63.638454,179,1265680.5,76.827156,5356.625,178,412.40625,27861.982,12216.636\n32,2.0050292,10,4,72.13398,318,1992266.2,76.798058,5353.8901,178,412.5625,27876.215,12216.636\n33,3.038465,10,5,69.456345,451,2690610.5,76.773346,5351.5645,178,412.69531,27888.332,12216.636\n34,4,10,5,85.215919,289,1667870.4,75.121597,5252.0879,178,421.76953,28416.547,12216.636\n35,4,11,4,107.46763,2,838417.31,63.447308,4644.291,178,499.375,32135.412,12216.636\n36,3.2855186,12,4,11.691815,194,1175906.4,91.489624,6918.437,178,346.3125,21572.242,12216.636\n37,1.7466468,12,4,67.515892,1345,8545044,93.415764,7065.1655,178,339.17188,21124.232,12216.636\n38,1.9949708,12,4,71.218079,1564,10169552,93.450203,7068.7441,178,339.04688,21113.537,12216.636\n39,2.9728639,12,5,69.910538,1838,11861826,93.480362,7072.0098,178,338.9375,21103.789,12216.636\n40,3.021472,12,5,149.26498,2287,15157395,92.603081,7028.9722,178,342.14844,21233.004,12216.636\n41,2.9785283,12,5,84.025612,2172,14630360,92.644333,7033.8105,178,341.99609,21218.398,12216.636\n42,4,12,6,193.21144,1244,11365588,92.635872,7033.4829,178,342.02734,21219.387,12216.636\n43,4,12,5,69.391472,768,7140941.5,93.896996,7157.6016,178,337.43359,20851.426,12216.636\n44,1.8460462,13,3,72.605972,316,1933160.2,78.073212,5514.459,178,405.82422,27064.521,12216.636\n45,3.079603,13,5,109.37788,478,2846059,77.863358,5500.2261,178,406.91797,27134.557,12216.636\n46,4,13,5,236.42712,473,4039082.2,78.030403,5565.8442,178,406.04688,26814.656,12216.636\n47,2.9256492,14,3,73.804344,175,1367621.2,65.590919,4713.0044,178,483.05469,31666.893,12216.636\n48,3.118978,15,4,1.1576769,21,52568.5,54.646725,3815.7188,178,579.79688,39113.523,12216.636\n49,2.881022,15,4,51.738968,143,588109.5,57.167553,4008.4851,178,554.23047,37232.57,12216.636\n50,0.67563176,16,2,57.332561,0,576803.94,65.119614,4571.0322,178,486.55078,32650.436,12216.636\n51,3.3243682,16,4,1.773312,279,1124254.5,64.529015,4523.1011,178,491.00391,32996.434,12216.636\n52,3.5566537,17,4,1.5755012,185,842638.75,76.248665,5384.1821,178,415.53516,27719.381,12216.636\n53,2.4433463,17,5,94.138809,909,2878055.8,76.660873,5397.0391,178,413.30078,27653.35,12216.636\n54,4,17,5,240.50478,375,3247603.5,76.669571,5422.1479,178,413.25391,27525.291,12216.636\n55,2.9502037,18,4,63.214619,480,4244460.5,103.37621,7594.2671,178,306.49219,19652.482,12216.636\n56,2.043396,18,4,55.795689,1247,10353393,102.60077,7508.9897,178,308.80859,19875.67,12216.636\n57,3.0064003,18,5,61.844196,1345,9701150,102.59558,7507.5396,178,308.82422,19879.51,12216.636\n58,4,18,6,57.726696,1684,8941627,102.73723,7506.4736,178,308.39844,19882.332,12216.636\n59,4,18,6,78.380333,1829,7873546.5,102.76196,7497.6934,178,308.32422,19905.615,12216.636\n60,2.3847485,18,5,76.566856,2421,9062067,103.37885,7527.7261,178,306.48438,19826.199,12216.636\n61,3.6152513,18,4,7.2528086,254,949294.31,80.944298,6096.1309,178,391.42969,24482.119,12216.636\n62,3.0376058,19,4,4.8203835,969,3415459,88.060799,6053.9453,178,359.79688,24652.717,12216.636\n63,2.0014875,19,4,57.263824,1257,4270006.5,88.909271,6120.3413,178,356.36328,24385.273,12216.636\n64,2.0467546,19,4,81.338486,1219,4250588,89.006836,6125.0562,178,355.97266,24366.502,12216.636\n65,2.9141521,19,5,69.343399,1026,3768641.5,89.135948,6129.8477,178,355.45703,24347.457,12216.636\n66,2.9891434,19,4,15.855036,146,408590.09,92.881973,6344.1655,178,341.12109,23524.953,12216.636\n67,4,20,5,0.50094116,218,1162905.5,95.223106,6722.3511,178,332.73438,22201.488,12216.636\n68,3.7623262,20,5,31.326914,1285,4497112,96.855942,6966.7446,178,327.125,21422.658,12216.636\n69,1.3914185,20,4,20.039038,3505,11620107,109.44092,7678.6113,178,289.50781,19436.613,12216.636\n70,1.9921591,20,4,80.945,3493,11790712,109.55621,7688.1909,178,289.20312,19412.395,12216.636\n71,1.5069535,20,4,54.103935,3332,11531442,110.02882,7732.5884,178,287.96094,19300.938,12216.636\n72,3.3471429,20,4,8.468255,2263,8132306,104.11933,7376.3535,178,304.30469,20233.059,12216.636\n73,2,21,2,79.482445,0,724714.19,68.040466,4773.4067,178,465.66406,31266.18,12216.636\n74,2,22,2,84.41777,0,884771.5,61.031174,4482.9517,178,519.14453,33291.949,12216.636\n75,2.0549963,23,3,141.50713,807,5807270,108.51846,7723.2334,178,291.96875,19324.314,12216.636\n76,2.0359912,23,4,75.595688,1018,8256845,108.48653,7714.8027,178,292.05469,19345.434,12216.636\n77,2.0393751,23,4,72.215797,1600,11373205,108.45172,7712.0181,178,292.14844,19352.418,12216.636\n78,2.9666958,23,5,73.287651,2234,14429388,108.67695,7731.8662,178,291.54297,19302.74,12216.636\n79,4,23,6,30.462101,3298,17047350,109.00117,7758.3276,178,290.67578,19236.904,12216.636\n80,2.9891434,23,4,41.801193,7,305486.44,81.780823,6039.9316,178,387.42578,24709.916,12216.636\n81,3.0975204,24,4,19.99411,1982,8221255.5,94.571388,6882.4766,178,335.02734,21684.955,12216.636\n82,1.8206327,24,4,81.959412,2197,8739249,94.774712,6903.2329,178,334.30859,21619.754,12216.636\n83,3.081847,24,5,61.298454,2277,8390308,94.681778,6897.7725,178,334.63672,21636.869,12216.636\n84,4,24,6,230.26486,1424,6303539,94.330521,6897.4736,178,335.88281,21637.807,12216.636\n85,3.2086754,24,4,11.345068,44,144973.97,94.284462,6899.8101,178,336.04688,21630.479,12216.636\n86,4,25,5,21.704504,197,477300.16,96.725426,6661.9341,178,327.56641,22402.832,12216.636\n87,4,25,6,156.13542,1787,5874959,98.494301,6724.2876,178,321.68359,22195.096,12216.636\n88,3.1397986,25,5,4.3709054,2150,9321218,104.76485,7310.2856,178,302.42969,20415.92,12216.636\n89,1.8853738,25,4,123.53465,3623,16552666,109.2331,7622.9595,178,290.05859,19578.512,12216.636\n90,2.9748278,25,5,88.042221,3490,16621146,109.28609,7624.9824,178,289.91797,19573.316,12216.636\n91,4,25,6,44.959156,3443,16985778,113.6598,7907.6191,178,278.76172,18873.721,12216.636\n92,3.2086754,25,4,32.158134,68,200538.19,101.16245,6671.1152,178,313.19922,22372,12216.636\n93,1.5234891,26,3,156.51314,880,4697371,104.36852,7220.9028,178,303.57812,20668.635,12216.636\n94,2.5515666,26,4,28.49353,680,4084668.8,101.46744,7087.5713,178,312.25781,21057.453,12216.636\n95,2.7092693,26,5,152.589,817,4337584,103.78361,7169.0215,178,305.28906,20818.209,12216.636\n96,4,26,5,4.3323708,614,2229197,76.315384,5204.4497,178,415.17188,28676.652,12216.636\n97,3.2741685,27,4,5.734199,492,997931.38,80.218208,5351.3374,178,394.97266,27889.516,12216.636\n98,2.7258315,27,5,58.77298,1042,3266476.5,81.474419,5444.9028,178,388.88281,27410.258,12216.636\n99,4,27,6,26.602385,1344,4041288.8,82.973801,5525.2549,178,381.85547,27011.643,12216.636\n100,4,27,5,7.6956849,33,207832.08,82.114479,5449.6763,178,385.85156,27386.25,12216.636\n101,3.3356996,28,4,14.008615,194,486196.19,70.869667,4749.543,178,447.07422,31423.277,12216.636\n102,2.6643004,28,5,51.947716,511,1172606.5,75.637886,5014.8662,178,418.89062,29760.754,12216.636\n103,3.2326641,28,5,24.983932,284,761697.12,76.392288,5051.4565,178,414.75391,29545.182,12216.636\n104,2.7673359,28,4,8.5771065,207,681293.75,82.713196,5482.2207,178,383.05859,27223.676,12216.636\n105,4,29,5,55.623226,382,1242717.2,74.394005,4952.0566,178,425.89453,30138.227,12216.636\n106,2.6909027,29,5,122.1385,689,2199216.8,73.854805,4909.8218,178,429.00391,30397.479,12216.636\n107,3.3090973,29,4,13.437029,331,745346.69,72.762947,4875.8032,178,435.44141,30609.561,12216.636\n108,2.9276934,30,4,81.830719,222,678286.44,89.582893,5963.4609,178,353.68359,25026.775,12216.636\n109,2.7533221,30,5,11.665026,481,3171357.2,90.295944,6051.2231,178,350.89062,24663.807,12216.636\n110,3.2466779,30,5,6.1998625,338,2045784.5,86.868698,5836.5537,178,364.73438,25570.945,12216.636\n111,4,30,6,5.4097123,2668,11407769,105.92642,7445.8682,178,299.11328,20044.162,12216.636\n112,3.0539846,30,5,67.115707,2883,12051203,105.87665,7443.2124,178,299.25391,20051.316,12216.636\n113,2.9460154,30,5,59.932568,2769,11646952,105.91536,7444.0581,178,299.14453,20049.037,12216.636\n114,3.1116269,30,5,95.806824,2047,9289722,105.9901,7445.4268,178,298.93359,20045.352,12216.636\n115,2.8883731,30,4,0.19636907,1405,6988613.5,107.35222,7529.5103,178,295.14062,19821.502,12216.636\n116,2.9463861,31,4,85.111755,76,584308.75,69.896194,4771.4482,178,453.30078,31279.014,12216.636\n117,2.9276934,31,4,7.8116097,118,404667.56,71.989281,4957.4209,178,440.12109,30105.613,12216.636\n118,2.7760887,32,3,80.504349,40,465632.84,67.132118,4718.7378,178,471.96484,31628.416,12216.636\n119,1.7224751,33,2,51.585476,7,210206.28,53.71521,3717.9077,178,589.85156,40142.523,12216.636\n120,4,34,5,100.73653,1167,7415106.5,108.31992,7600.376,178,292.50391,19636.688,12216.636\n121,4,34,6,104.9296,1762,9997418,108.30835,7603.0674,178,292.53516,19629.736,12216.636\n122,2.8438091,34,5,68.548241,2983,14175580,108.05441,7573.5566,178,293.22266,19706.225,12216.636\n123,2.1506054,34,4,42.451733,3055,14141106,107.82458,7557.7256,178,293.84766,19747.502,12216.636\n124,3.0055857,34,5,44.519382,3227,14320575,107.82172,7557.6279,178,293.85547,19747.756,12216.636\n125,3.1265831,34,5,83.344948,3250,14420084,107.70002,7561.4126,178,294.1875,19737.873,12216.636\n126,2.8734171,34,5,11.506542,3430,13727606,107.9753,7599.6616,178,293.4375,19638.531,12216.636\n127,4,34,6,6.0284462,2657,10569333,105.04842,7428.769,178,301.61328,20090.301,12216.636\n128,4,34,5,5.419879,326,1180875.9,86.131653,6176.9673,178,367.85547,24161.727,12216.636\n129,2,35,2,20.824474,0,212491.75,66.399551,4603.9497,178,477.17188,32416.992,12216.636\n130,2.315361,36,3,36.565041,182,517014.62,69.343452,4775.4722,178,456.91406,31252.656,12216.636\n131,0.87075675,37,2,15.346227,109,383297.66,64.659164,4430.2266,178,490.01562,33688.164,12216.636\n132,2.5553956,38,3,58.902714,107,482010.88,60.524754,4128.2837,178,523.48828,36152.117,12216.636\n133,4,39,5,29.471209,2132,7106502.5,102.01877,7046.436,178,310.57031,21180.381,12216.636\n134,3.0400231,39,5,0.41702437,1868,6555843,102.04957,7047.5352,178,310.47656,21177.078,12216.636\n135,1.8690072,39,4,143.56969,2082,7028887,103.00992,7118.877,178,307.58203,20964.852,12216.636\n136,3.0909696,39,5,220.49948,633,2843580.8,102.03416,7091.9126,178,310.52344,21044.562,12216.636\n137,3.3558173,39,4,4.6648011,60,48442.176,102.77367,7156.9517,178,308.28906,20853.32,12216.636\n138,4,40,5,5.8880019,1198,6602856.5,92.347939,6651.4351,178,343.09375,22438.195,12216.636\n139,2.8008873,40,5,86.80928,1314,6988477.5,90.596497,6541.2188,178,349.72656,22816.268,12216.636\n140,1.9834378,40,3,83.826813,874,4874680,89.554214,6493.5498,178,353.79688,22983.762,12216.636\n141,3.7738943,41,4,33.475399,963,7042259,84.994438,6210.7104,178,372.77734,24030.455,12216.636\n142,1.4153167,41,4,178.53447,1362,8652835,90.345222,6721.4429,178,350.69922,22204.488,12216.636\n143,1.2796584,41,4,116.47486,1233,6833815.5,91.196457,6782.4829,178,347.42578,22004.656,12216.636\n144,2.8869476,41,3,6.8355722,0,32039.699,81.984169,6130.0171,178,386.46484,24346.783,12216.636\n145,3.9999998,42,5,314.13025,147,2550125.8,75.341393,5244.0146,178,420.53906,28460.293,12216.636\n146,4,42,5,1.4020742,28,787264.31,73.82859,5159.4937,178,429.15625,28926.521,12216.636\n147,2,43,2,32.635479,0,340282.88,67.405479,4677.939,178,470.05078,31904.262,12216.636\n148,2.372308,44,4,55.385048,1325,2879153,77.915718,5145.1392,178,406.64453,29007.223,12216.636\n149,3.6276922,44,4,8.0672827,538,1295412.9,74.798775,5021.2231,178,423.58984,29723.076,12216.636\n150,2.6622484,45,4,4.1139636,523,1247895.5,72.8479,4776.5571,178,434.93359,31245.559,12216.636\n151,1.9825487,45,4,56.198662,461,1198154.6,72.054512,4745.6021,178,439.72266,31449.371,12216.636\n152,3.3552032,45,4,13.687597,169,627264.94,69.173141,4584.3516,178,458.03906,32555.576,12216.636\n153,3.7100596,46,4,5.1633153,55,157636.45,69.908241,4694.3491,178,453.22266,31792.736,12216.636\n154,0.85895824,46,4,48.794411,682,1540374.1,74.486237,4990.52,178,425.36719,29905.941,12216.636\n155,3.4309821,46,4,5.8241816,177,671997.44,69.014816,4629.6465,178,459.08984,32237.061,12216.636\n156,2.7051506,47,4,166.88625,383,2285897.5,70.657295,4891.9014,178,448.41797,30508.834,12216.636\n157,3.2948494,47,4,4.9959264,274,1980018.8,69.792152,4865.7471,178,453.97656,30672.824,12216.636\n158,0.98894149,48,2,114.23679,0,1195344.4,80.295242,6018.9507,178,394.59375,24796.049,12216.636\n159,1.182127,48,3,55.910877,274,2741649,80.140541,6005.0312,178,395.35547,24853.525,12216.636\n160,3.0480838,49,4,81.635147,126,1503485.5,81.069695,6023.3394,178,390.82422,24777.984,12216.636\n161,2.0113289,49,4,108.93696,334,2477706.5,81.778351,6069.8652,178,387.4375,24588.059,12216.636\n162,2.940587,49,4,30.296598,330,1952532.9,82.620514,6154.3496,178,383.48828,24250.523,12216.636\n163,3.1072955,50,3,40.717644,287,1715661.2,62.152149,4446.2324,178,509.78125,33566.891,12216.636\n164,1.1072954,51,1,63.598595,0,651424.19,44.939854,3176.8967,178,705.03125,46978.613,12216.636\n165,3.0436037,52,4,4.4063578,96,605797.19,66.459404,4746.5186,178,476.74219,31443.299,12216.636\n166,2.9563963,52,4,90.654068,109,1062591.8,67.1894,4814.7637,178,471.5625,30997.617,12216.636\n167,3.0721309,53,4,143.34143,93,2134044,75.842278,5481.8882,178,417.76172,27225.328,12216.636\n168,2.9278691,53,4,141.29507,294,2936599.2,76.411003,5523.6138,178,414.65234,27019.666,12216.636\n169,4,54,4,64.827652,299,1046788.9,60.478722,4116.709,178,523.88672,36253.766,12216.636\n170,1.9948233,55,3,26.562881,53,334537.75,46.611523,3140.5879,178,679.74609,47521.742,12216.636\n171,1.9981046,55,3,23.211634,55,313906.69,46.611523,3140.5879,178,679.74609,47521.742,12216.636\n172,1.9839985,56,2,62.202236,0,264440.84,42.862148,2839.1758,178,739.20703,52566.734,12216.636\n173,2.0713086,57,3,25.08102,68,396381.09,52.447456,3490.3325,178,604.10938,42759.883,12216.636\n174,1.9357636,57,3,25.400402,91,432314.75,55.001724,3657.7,178,576.05469,40803.289,12216.636\n175,2.0160015,58,2,63.467106,26,283843.69,43.754169,2897.7686,178,724.13672,51503.84,12216.636\n176,4,59,4,106.14331,8,866621.44,63.394745,4639.7456,178,499.78906,32166.893,12216.636\n177,4,60,4,245.73332,0,2100469,73.744011,5285.8833,178,429.64844,28234.865,12216.636\n"
  },
  {
    "path": "testdata/barnsbury_segment_pline.mif",
    "content": "Version 300\nCharset \"WindowsLatin1\"\nDelimiter \",\"\nIndex 1\nCoordSys NonEarth Units \"m\" Bounds (530635.696268, 183499.852969) (531446.820644, 184583.962646)\nColumns 13\n  Depthmap_Ref Integer\n  Angular_Connectivity Float\n  Axial_Line_Ref Float\n  Connectivity Float\n  Segment_Length Float\n  T1024_Choice Float\n  T1024_Choice_Segment_Length_Wgt_ Float\n  T1024_Integration Float\n  T1024_Integration_Segment_Length_Wgt_ Float\n  T1024_Node_Count Float\n  T1024_Total_Depth Float\n  T1024_Total_Depth_Segment_Length_Wgt_ Float\n  T1024_Total_Segment_Length Float\nData\n\nLINE 530661.6919780188 184270.5626832811 530670.3012171048 184204.951785912\n    PEN (1,2,0)\nLINE 530670.3012171048 184204.951785912 530681.0222267658 184123.2471128816\n    PEN (1,2,0)\nLINE 530681.0222267658 184123.2471128816 530712.6887355548 183881.9170676302\n    PEN (1,2,0)\nLINE 530712.6887355548 183881.9170676302 530730.7679409641 183744.1356819843\n    PEN (1,2,0)\nLINE 530661.6919780187 184270.562683281 530782.0935715765 184320.087685171\n    PEN (1,2,0)\nLINE 530782.0935715765 184320.087685171 530931.9721717195 184381.7375166726\n    PEN (1,2,0)\nLINE 530931.9721717195 184381.7375166726 531102.9365496121 184452.0605986855\n    PEN (1,2,0)\nLINE 531102.9365496121 184452.0605986855 531275.7084119404 184523.1271564901\n    PEN (1,2,0)\nLINE 530782.0935715765 184320.087685171 530796.6615005322 184257.2066049815\n    PEN (1,2,0)\nLINE 530796.6615005322 184257.2066049815 530808.6826332469 184205.3185286112\n    PEN (1,2,0)\nLINE 530808.6826332469 184205.3185286112 530811.0516134852 184195.09305066\n    PEN (1,2,0)\nLINE 530670.3012171047 184204.9517859119 530796.6615005322 184257.2066049815\n    PEN (1,2,0)\nLINE 530796.6615005322 184257.2066049815 530930.0609102942 184312.3723725155\n    PEN (1,2,0)\nLINE 530930.0609102942 184312.3723725155 531122.4555083865 184391.9349110013\n    PEN (1,2,0)\nLINE 530804.6982026402 184201.4318404568 530811.0516134852 184195.0930506599\n    PEN (1,2,0)\nLINE 530811.0516134852 184195.0930506599 530855.3978358759 184150.8488818384\n    PEN (1,2,0)\nLINE 530755.4256480751 184153.3679956899 530804.6982026402 184201.4318404567\n    PEN (1,2,0)\nLINE 530804.6982026402 184201.4318404567 530808.6826332469 184205.3185286112\n    PEN (1,2,0)\nLINE 530755.4256480752 184153.36799569 530759.8102694125 184121.9498409454\n    PEN (1,2,0)\nLINE 530759.8102694125 184121.9498409454 530781.0080675455 183970.0562905679\n    PEN (1,2,0)\nLINE 530681.0222267658 184123.2471128815 530759.8102694125 184121.9498409453\n    PEN (1,2,0)\nLINE 530759.8102694125 184121.9498409453 530852.4203537111 184120.4249843892\n    PEN (1,2,0)\nLINE 530852.4203537111 184120.4249843892 530924.739253607 184119.2342290901\n    PEN (1,2,0)\nLINE 530924.739253607 184119.2342290901 531002.80539858 184117.9488434448\n    PEN (1,2,0)\nLINE 531002.80539858 184117.9488434448 531040.9791199062 184117.3203001314\n    PEN (1,2,0)\nLINE 531040.9791199062 184117.3203001314 531060.7828570851 184116.994224859\n    PEN (1,2,0)\nLINE 530837.552389062 183968.5041980529 530852.4203537111 184120.4249843893\n    PEN (1,2,0)\nLINE 530852.4203537111 184120.4249843893 530855.3978358759 184150.8488818385\n    PEN (1,2,0)\nLINE 530781.0080675455 183970.0562905679 530817.2676436539 183969.0609966963\n    PEN (1,2,0)\nLINE 530817.2676436539 183969.0609966963 530837.5523890621 183968.5041980528\n    PEN (1,2,0)\nLINE 530804.1027903862 183678.9148130685 530806.9873013139 183742.4878602049\n    PEN (1,2,0)\nLINE 530806.9873013139 183742.4878602049 530810.2568850133 183814.5477011403\n    PEN (1,2,0)\nLINE 530810.2568850133 183814.5477011403 530813.4051007051 183883.9326574047\n    PEN (1,2,0)\nLINE 530813.4051007051 183883.9326574047 530817.2676436539 183969.0609966964\n    PEN (1,2,0)\nLINE 530806.9873013139 183742.4878602049 530914.4265599075 183744.9570759712\n    PEN (1,2,0)\nLINE 530912.2449280558 183665.7794156555 530912.5669577819 183677.46679556\n    PEN (1,2,0)\nLINE 530912.5669577819 183677.46679556 530914.4265599076 183744.9570759712\n    PEN (1,2,0)\nLINE 530914.4265599076 183744.9570759712 530916.3881318528 183816.1481328081\n    PEN (1,2,0)\nLINE 530916.3881318528 183816.1481328081 530918.3136899534 183886.0321442102\n    PEN (1,2,0)\nLINE 530918.3136899534 183886.0321442102 530922.4249214346 184035.2404945642\n    PEN (1,2,0)\nLINE 530922.4249214346 184035.2404945642 530924.739253607 184119.2342290901\n    PEN (1,2,0)\nLINE 530924.739253607 184119.2342290901 530930.0609102943 184312.3723725156\n    PEN (1,2,0)\nLINE 530930.0609102943 184312.3723725156 530931.9721717195 184381.7375166726\n    PEN (1,2,0)\nLINE 530997.7409700139 184191.5792263541 531069.1018140045 184204.9679402672\n    PEN (1,2,0)\nLINE 531069.1018140045 184204.9679402672 531176.6039484286 184225.1374792238\n    PEN (1,2,0)\nLINE 531176.6039484286 184225.1374792238 531408.9765464333 184268.7352011949\n    PEN (1,2,0)\nLINE 530997.7409700138 184191.5792263541 531002.8053985799 184117.9488434448\n    PEN (1,2,0)\nLINE 531065.9075465151 184257.7680519287 531065.9774551002 184256.612487747\n    PEN (1,2,0)\nLINE 531065.9774551002 184256.612487747 531069.1018140046 184204.9679402672\n    PEN (1,2,0)\nLINE 531014.260003 184282.658893 531065.9075465151 184257.7680519287\n    PEN (1,2,0)\nLINE 531065.9075465151 184257.7680519287 531067.5050192737 184256.9981713527\n    PEN (1,2,0)\nLINE 531065.9774551002 184256.612487747 531067.5050192737 184256.9981713527\n    PEN (1,2,0)\nLINE 531067.5050192737 184256.9981713527 531158.7795115133 184280.0434063022\n    PEN (1,2,0)\nLINE 531158.7795115133 184280.0434063022 531391.9665625809 184338.919114588\n    PEN (1,2,0)\nLINE 531102.9365496121 184452.0605986855 531122.4555083866 184391.9349110013\n    PEN (1,2,0)\nLINE 531122.4555083866 184391.9349110013 531139.6837024501 184338.8656347355\n    PEN (1,2,0)\nLINE 531139.6837024501 184338.8656347355 531158.7795115134 184280.0434063022\n    PEN (1,2,0)\nLINE 531158.7795115134 184280.0434063022 531176.6039484288 184225.1374792239\n    PEN (1,2,0)\nLINE 531176.6039484288 184225.1374792239 531200.8056679327 184150.5871384435\n    PEN (1,2,0)\nLINE 531200.8056679327 184150.5871384435 531224.4474343648 184077.7616623912\n    PEN (1,2,0)\nLINE 531224.4474343648 184077.7616623912 531226.6869048447 184070.8632563747\n    PEN (1,2,0)\nLINE 531222.0221921728 184069.6481218071 531226.6869048446 184070.8632563747\n    PEN (1,2,0)\nLINE 531226.6869048446 184070.8632563747 531282.1014374334 184085.2984678934\n    PEN (1,2,0)\nLINE 531282.1014374334 184085.2984678934 531360.8131579099 184105.8024815699\n    PEN (1,2,0)\nLINE 531360.8131579099 184105.8024815699 531427.9171605199 184123.2827421834\n    PEN (1,2,0)\nLINE 531427.9171605199 184123.2827421834 531443.2601697572 184127.2795201643\n    PEN (1,2,0)\nLINE 531168.4909565911 183890.5617386632 531168.6344222261 183891.0416966056\n    PEN (1,2,0)\nLINE 531168.6344222261 183891.0416966056 531177.6062062277 183921.056403528\n    PEN (1,2,0)\nLINE 531177.6062062277 183921.056403528 531183.345230286 183940.256054913\n    PEN (1,2,0)\nLINE 531183.345230286 183940.256054913 531206.5272470647 184017.8104676549\n    PEN (1,2,0)\nLINE 531206.5272470647 184017.8104676549 531222.0221921728 184069.6481218071\n    PEN (1,2,0)\nLINE 531222.0221921728 184069.6481218071 531224.4474343648 184077.7616623912\n    PEN (1,2,0)\nLINE 531103.958023 183944.145791 531183.3452302859 183940.256054913\n    PEN (1,2,0)\nPLINE 3\n531297.5108320001 184441.573404\n531275.7084119404 184523.1271564901\n531340.8293390643 184549.9134634117\n    PEN (1,2,0)\nLINE 531340.8293390643 184549.9134634118 531374.1604658248 184412.3878235204\n    PEN (1,2,0)\nLINE 531374.1604658248 184412.3878235204 531391.9665625809 184338.9191145881\n    PEN (1,2,0)\nLINE 531391.9665625809 184338.9191145881 531408.9765464333 184268.7352011949\n    PEN (1,2,0)\nLINE 531408.9765464333 184268.7352011949 531426.238998241 184197.5095943315\n    PEN (1,2,0)\nLINE 531426.238998241 184197.5095943315 531433.4141573964 184167.9045839381\n    PEN (1,2,0)\nLINE 531433.4141573964 184167.9045839381 531443.2601697572 184127.2795201643\n    PEN (1,2,0)\nLINE 531040.9791199062 184117.3203001315 531060.55370366 184121.3946202041\n    PEN (1,2,0)\nLINE 531060.55370366 184121.3946202041 531140.7934071338 184138.0959834922\n    PEN (1,2,0)\nLINE 531140.7934071338 184138.0959834922 531200.8056679327 184150.5871384435\n    PEN (1,2,0)\nLINE 531200.8056679327 184150.5871384435 531426.238998241 184197.5095943315\n    PEN (1,2,0)\nLINE 531426.238998241 184197.5095943315 531437.3460188021 184199.8214471601\n    PEN (1,2,0)\nLINE 531379.770131822 183732.4495029183 531382.4238646072 183753.9911641308\n    PEN (1,2,0)\nLINE 531382.4238646072 183753.9911641308 531401.5139900263 183908.9551516768\n    PEN (1,2,0)\nLINE 531401.5139900263 183908.9551516768 531402.0484051576 183913.2932635508\n    PEN (1,2,0)\nLINE 531402.0484051576 183913.2932635508 531417.1525502533 184035.9010778593\n    PEN (1,2,0)\nLINE 531417.1525502533 184035.9010778593 531427.9171605199 184123.2827421833\n    PEN (1,2,0)\nLINE 531427.9171605199 184123.2827421833 531433.4141573964 184167.9045839381\n    PEN (1,2,0)\nLINE 531433.4141573964 184167.9045839381 531437.346018802 184199.8214471601\n    PEN (1,2,0)\nLINE 531375.1001237407 183572.3943911834 531387.3458877866 183728.4277266877\n    PEN (1,2,0)\nLINE 531387.3458877866 183728.4277266877 531389.5752537736 183756.833909406\n    PEN (1,2,0)\nLINE 531389.5752537736 183756.833909406 531401.5139900263 183908.9551516768\n    PEN (1,2,0)\nLINE 531401.5139900263 183908.9551516768 531401.8529595991 183913.2742413547\n    PEN (1,2,0)\nLINE 531297.7582437188 183720.3357738068 531303.0868777729 183722.4539565722\n    PEN (1,2,0)\nLINE 531303.0868777729 183722.4539565722 531357.7029968201 183744.1643838416\n    PEN (1,2,0)\nLINE 531357.7029968201 183744.1643838416 531382.4238646072 183753.9911641308\n    PEN (1,2,0)\nLINE 531382.4238646072 183753.9911641308 531389.5752537737 183756.8339094061\n    PEN (1,2,0)\nLINE 531299.4468674023 183775.0910818076 531311.8200189774 183768.5224902194\n    PEN (1,2,0)\nLINE 531311.8200189774 183768.5224902194 531357.7029968201 183744.1643838416\n    PEN (1,2,0)\nLINE 531357.7029968201 183744.1643838416 531379.7701318221 183732.4495029183\n    PEN (1,2,0)\nLINE 531379.7701318221 183732.4495029183 531387.3458877866 183728.4277266877\n    PEN (1,2,0)\nLINE 531304.3126897123 183959.5738054356 531306.4967095837 183903.9934713184\n    PEN (1,2,0)\nLINE 531306.4967095837 183903.9934713184 531311.2924203729 183781.9491568425\n    PEN (1,2,0)\nLINE 531311.2924203729 183781.9491568425 531311.8200189773 183768.5224902195\n    PEN (1,2,0)\nLINE 531075.4349141666 183881.5048417101 531156.8807901648 183889.4317520639\n    PEN (1,2,0)\nLINE 531156.8807901648 183889.4317520639 531168.4909565911 183890.5617386632\n    PEN (1,2,0)\nLINE 531168.4909565911 183890.5617386632 531174.6616614035 183891.1623169401\n    PEN (1,2,0)\nLINE 531174.6616614035 183891.1623169401 531180.0459325081 183891.6863537172\n    PEN (1,2,0)\nLINE 531180.0459325081 183891.6863537172 531246.8460016274 183898.1878266653\n    PEN (1,2,0)\nLINE 531246.8460016274 183898.1878266653 531306.4967095837 183903.9934713184\n    PEN (1,2,0)\nLINE 531306.4967095837 183903.9934713184 531401.8529595992 183913.2742413547\n    PEN (1,2,0)\nLINE 531401.8529595992 183913.2742413547 531402.0484051576 183913.2932635508\n    PEN (1,2,0)\nLINE 531056.0095225013 183972.3751082587 531073.8019170946 183889.1438577853\n    PEN (1,2,0)\nLINE 531073.8019170946 183889.1438577853 531075.4349141666 183881.5048417101\n    PEN (1,2,0)\nLINE 530986.8482115235 183887.4036937163 531004.8354864263 183965.872851334\n    PEN (1,2,0)\nLINE 531004.8354864263 183965.872851334 531056.0095225013 183972.3751082587\n    PEN (1,2,0)\nLINE 530712.6887355547 183881.9170676303 530813.4051007051 183883.9326574047\n    PEN (1,2,0)\nLINE 530813.4051007051 183883.9326574047 530918.3136899534 183886.0321442102\n    PEN (1,2,0)\nLINE 530918.3136899534 183886.0321442102 530986.8482115236 183887.4036937163\n    PEN (1,2,0)\nLINE 530986.8482115236 183887.4036937163 531029.2914457454 183888.2530904232\n    PEN (1,2,0)\nLINE 531029.2914457454 183888.2530904232 531073.8019170945 183889.1438577853\n    PEN (1,2,0)\nLINE 531073.8019170945 183889.1438577853 531157.1301833935 183890.8114676243\n    PEN (1,2,0)\nLINE 531157.1301833935 183890.8114676243 531168.6344222261 183891.0416966057\n    PEN (1,2,0)\nLINE 531168.6344222261 183891.0416966057 531174.6616614035 183891.1623169401\n    PEN (1,2,0)\nLINE 531174.6616614035 183891.1623169401 531180.0804551976 183891.2707607402\n    PEN (1,2,0)\nLINE 531246.8460016274 183898.1878266653 531247.100529 183877.364907\n    PEN (1,2,0)\nLINE 531380.713483092 184038.9336762212 531417.1525502533 184035.9010778593\n    PEN (1,2,0)\nLINE 531367.8635018886 184047.3232328322 531380.713483092 184038.9336762213\n    PEN (1,2,0)\nLINE 531360.8131579099 184105.8024815699 531367.8635018887 184047.323232832\n    PEN (1,2,0)\nLINE 531177.6062062277 183921.056403528 531180.0459325082 183891.6863537173\n    PEN (1,2,0)\nLINE 531180.0459325082 183891.6863537173 531180.0804551976 183891.2707607402\n    PEN (1,2,0)\nLINE 531180.0804551976 183891.2707607402 531191.9656390148 183748.1938739985\n    PEN (1,2,0)\nLINE 531191.9656390148 183748.1938739985 531210.2193315655 183528.4512480644\n    PEN (1,2,0)\nLINE 531210.2193315655 183528.4512480644 531210.6054995636 183523.8024588018\n    PEN (1,2,0)\nLINE 531204.5299233167 183526.934937537 531210.2193315655 183528.4512480644\n    PEN (1,2,0)\nLINE 531210.2193315655 183528.4512480644 531294.1006655393 183550.8068506498\n    PEN (1,2,0)\nLINE 531294.1006655393 183550.8068506498 531375.1001237407 183572.3943911835\n    PEN (1,2,0)\nLINE 530912.5669577818 183677.4667955601 530942.3204781786 183662.1263132498\n    PEN (1,2,0)\nLINE 530942.3204781786 183662.1263132498 531101.0050300843 183580.3108665743\n    PEN (1,2,0)\nLINE 531101.0050300843 183580.3108665743 531204.5299233167 183526.9349375371\n    PEN (1,2,0)\nLINE 531204.5299233167 183526.9349375371 531210.6054995636 183523.8024588018\n    PEN (1,2,0)\nLINE 531101.0050300843 183580.3108665743 531156.8807901648 183889.4317520638\n    PEN (1,2,0)\nLINE 531156.8807901648 183889.4317520638 531157.1301833934 183890.8114676243\n    PEN (1,2,0)\nLINE 531029.2914457454 183888.2530904232 531030.230687 183855.631128\n    PEN (1,2,0)\nLINE 531191.9656390148 183748.1938739985 531247.2509705561 183744.8718613147\n    PEN (1,2,0)\nLINE 531247.2509705561 183744.8718613147 531255.3037282097 183744.3879831807\n    PEN (1,2,0)\nLINE 531247.2509705561 183744.8718613147 531250.8112866409 183746.9331340065\n    PEN (1,2,0)\nLINE 531250.8112866409 183746.9331340065 531299.4468674023 183775.0910818077\n    PEN (1,2,0)\nLINE 531299.4468674023 183775.0910818077 531311.2924203731 183781.9491568425\n    PEN (1,2,0)\nLINE 531250.8112866409 183746.9331340066 531255.3037282097 183744.3879831806\n    PEN (1,2,0)\nLINE 531255.3037282097 183744.3879831806 531297.7582437188 183720.3357738067\n    PEN (1,2,0)\nLINE 531297.7582437188 183720.3357738067 531302.8256845656 183717.4648625085\n    PEN (1,2,0)\nLINE 531294.1006655394 183550.8068506498 531302.8256845657 183717.4648625084\n    PEN (1,2,0)\nLINE 531302.8256845657 183717.4648625084 531303.0868777729 183722.4539565722\n    PEN (1,2,0)\nLINE 530707.321114 183575.611283 530723.063264805 183688.7582135932\n    PEN (1,2,0)\nLINE 530723.063264805 183688.7582135932 530730.7679409641 183744.1356819843\n    PEN (1,2,0)\nLINE 530723.0632648049 183688.7582135932 530804.1027903862 183678.9148130685\n    PEN (1,2,0)\nLINE 530804.1027903862 183678.9148130685 530912.2449280557 183665.7794156555\n    PEN (1,2,0)\nLINE 530912.2449280557 183665.7794156555 530942.3204781786 183662.1263132498\n    PEN (1,2,0)\nLINE 531140.7934071338 184138.0959834922 531154.1331188128 184099.6254937419\n    PEN (1,2,0)\nLINE 531091.400795 184089.16428 531154.1331188127 184099.6254937418\n    PEN (1,2,0)\nLINE 531060.55370366 184121.3946202041 531060.7828570851 184116.994224859\n    PEN (1,2,0)\nLINE 531060.7828570851 184116.994224859 531065.4973380617 184026.4628259328\n    PEN (1,2,0)\nLINE 530922.4249214346 184035.2404945642 531065.4973380617 184026.4628259328\n    PEN (1,2,0)\nLINE 531065.4973380617 184026.4628259328 531206.5272470647 184017.8104676549\n    PEN (1,2,0)\nLINE 531282.1014374334 184085.2984678934 531294.5626424844 184021.6797343292\n    PEN (1,2,0)\nLINE 531268.4799450308 184016.6518545878 531294.5626424844 184021.6797343292\n    PEN (1,2,0)\nLINE 531294.5626424844 184021.6797343292 531317.3546726417 184026.0732824619\n    PEN (1,2,0)\nLINE 531268.4799450306 184016.6518545878 531279.5735313552 183955.446866539\n    PEN (1,2,0)\nLINE 531279.5735313554 183955.446866539 531304.3126897124 183959.5738054357\n    PEN (1,2,0)\nLINE 531304.3126897124 183959.5738054357 531329.3668766369 183963.7532967931\n    PEN (1,2,0)\nLINE 531317.3546726417 184026.0732824619 531329.3668766369 183963.7532967931\n    PEN (1,2,0)\nLINE 530810.2568850133 183814.5477011403 530916.3881318528 183816.148132808\n    PEN (1,2,0)\nLINE 531139.68370245 184338.8656347354 531374.1604658248 184412.3878235204\n    PEN (1,2,0)\n"
  },
  {
    "path": "testdata/gallery.dxf",
    "content": "  0\r\nSECTION\r\n  2\r\nHEADER\r\n  9\r\n$ACADVER\r\n  1\r\nAC1027\r\n  9\r\n$ACADMAINTVER\r\n 70\r\n   125\r\n  9\r\n$DWGCODEPAGE\r\n  3\r\nANSI_1252\r\n  9\r\n$LASTSAVEDBY\r\n  1\r\npetros\r\n  9\r\n$REQUIREDVERSIONS\r\n160\r\n                 0\r\n  9\r\n$INSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$EXTMIN\r\n 10\r\n0.6503430354694331\r\n 20\r\n4.789033837593649\r\n 30\r\n-0.0015258207003583\r\n  9\r\n$EXTMAX\r\n 10\r\n5.202540408442473\r\n 20\r\n7.78257348780491\r\n 30\r\n0.0000000349246037\r\n  9\r\n$LIMMIN\r\n 10\r\n-12.695893\r\n 20\r\n-8.793292999999998\r\n  9\r\n$LIMMAX\r\n 10\r\n17.347693\r\n 20\r\n21.250293\r\n  9\r\n$ORTHOMODE\r\n 70\r\n     0\r\n  9\r\n$REGENMODE\r\n 70\r\n     1\r\n  9\r\n$FILLMODE\r\n 70\r\n     1\r\n  9\r\n$QTEXTMODE\r\n 70\r\n     0\r\n  9\r\n$MIRRTEXT\r\n 70\r\n     1\r\n  9\r\n$LTSCALE\r\n 40\r\n1.0\r\n  9\r\n$ATTMODE\r\n 70\r\n     1\r\n  9\r\n$TEXTSIZE\r\n 40\r\n0.2\r\n  9\r\n$TRACEWID\r\n 40\r\n0.05\r\n  9\r\n$TEXTSTYLE\r\n  7\r\nStandard\r\n  9\r\n$CLAYER\r\n  8\r\n0\r\n  9\r\n$CELTYPE\r\n  6\r\nByLayer\r\n  9\r\n$CECOLOR\r\n 62\r\n     7\r\n  9\r\n$CELTSCALE\r\n 40\r\n1.0\r\n  9\r\n$DISPSILH\r\n 70\r\n     0\r\n  9\r\n$DIMSCALE\r\n 40\r\n1.0\r\n  9\r\n$DIMASZ\r\n 40\r\n0.25\r\n  9\r\n$DIMEXO\r\n 40\r\n0.125\r\n  9\r\n$DIMDLI\r\n 40\r\n0.0\r\n  9\r\n$DIMRND\r\n 40\r\n0.0\r\n  9\r\n$DIMDLE\r\n 40\r\n0.0\r\n  9\r\n$DIMEXE\r\n 40\r\n0.125\r\n  9\r\n$DIMTP\r\n 40\r\n0.0\r\n  9\r\n$DIMTM\r\n 40\r\n0.0\r\n  9\r\n$DIMTXT\r\n 40\r\n0.25\r\n  9\r\n$DIMCEN\r\n 40\r\n0.0\r\n  9\r\n$DIMTSZ\r\n 40\r\n0.0\r\n  9\r\n$DIMTOL\r\n 70\r\n     0\r\n  9\r\n$DIMLIM\r\n 70\r\n     0\r\n  9\r\n$DIMTIH\r\n 70\r\n     0\r\n  9\r\n$DIMTOH\r\n 70\r\n     0\r\n  9\r\n$DIMSE1\r\n 70\r\n     0\r\n  9\r\n$DIMSE2\r\n 70\r\n     0\r\n  9\r\n$DIMTAD\r\n 70\r\n     1\r\n  9\r\n$DIMZIN\r\n 70\r\n     2\r\n  9\r\n$DIMBLK\r\n  1\r\nTerminatorOpen\r\n  9\r\n$DIMASO\r\n 70\r\n     1\r\n  9\r\n$DIMSHO\r\n 70\r\n     1\r\n  9\r\n$DIMPOST\r\n  1\r\n\r\n  9\r\n$DIMAPOST\r\n  1\r\n\r\n  9\r\n$DIMALT\r\n 70\r\n     0\r\n  9\r\n$DIMALTD\r\n 70\r\n     4\r\n  9\r\n$DIMALTF\r\n 40\r\n1.0\r\n  9\r\n$DIMLFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMTOFL\r\n 70\r\n     0\r\n  9\r\n$DIMTVP\r\n 40\r\n0.125\r\n  9\r\n$DIMTIX\r\n 70\r\n     0\r\n  9\r\n$DIMSOXD\r\n 70\r\n     0\r\n  9\r\n$DIMSAH\r\n 70\r\n     0\r\n  9\r\n$DIMBLK1\r\n  1\r\n\r\n  9\r\n$DIMBLK2\r\n  1\r\n\r\n  9\r\n$DIMSTYLE\r\n  2\r\nStandard\r\n  9\r\n$DIMCLRD\r\n 70\r\n     0\r\n  9\r\n$DIMCLRE\r\n 70\r\n     0\r\n  9\r\n$DIMCLRT\r\n 70\r\n     0\r\n  9\r\n$DIMTFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMGAP\r\n 40\r\n0.125\r\n  9\r\n$DIMJUST\r\n 70\r\n     0\r\n  9\r\n$DIMSD1\r\n 70\r\n     0\r\n  9\r\n$DIMSD2\r\n 70\r\n     0\r\n  9\r\n$DIMTOLJ\r\n 70\r\n     1\r\n  9\r\n$DIMTZIN\r\n 70\r\n     2\r\n  9\r\n$DIMALTZ\r\n 70\r\n    12\r\n  9\r\n$DIMALTTZ\r\n 70\r\n    12\r\n  9\r\n$DIMUPT\r\n 70\r\n     0\r\n  9\r\n$DIMDEC\r\n 70\r\n     4\r\n  9\r\n$DIMTDEC\r\n 70\r\n     4\r\n  9\r\n$DIMALTU\r\n 70\r\n     2\r\n  9\r\n$DIMALTTD\r\n 70\r\n     4\r\n  9\r\n$DIMTXSTY\r\n  7\r\nStandard\r\n  9\r\n$DIMAUNIT\r\n 70\r\n     0\r\n  9\r\n$DIMADEC\r\n 70\r\n     4\r\n  9\r\n$DIMALTRND\r\n 40\r\n0.0\r\n  9\r\n$DIMAZIN\r\n 70\r\n     3\r\n  9\r\n$DIMDSEP\r\n 70\r\n     0\r\n  9\r\n$DIMATFIT\r\n 70\r\n     3\r\n  9\r\n$DIMFRAC\r\n 70\r\n     0\r\n  9\r\n$DIMLDRBLK\r\n  1\r\n\r\n  9\r\n$DIMLUNIT\r\n 70\r\n     2\r\n  9\r\n$DIMLWD\r\n 70\r\n    -2\r\n  9\r\n$DIMLWE\r\n 70\r\n    -2\r\n  9\r\n$DIMTMOVE\r\n 70\r\n     0\r\n  9\r\n$DIMFXL\r\n 40\r\n1.0\r\n  9\r\n$DIMFXLON\r\n 70\r\n     0\r\n  9\r\n$DIMJOGANG\r\n 40\r\n0.7853981633974483\r\n  9\r\n$DIMTFILL\r\n 70\r\n     0\r\n  9\r\n$DIMTFILLCLR\r\n 70\r\n     0\r\n  9\r\n$DIMARCSYM\r\n 70\r\n     0\r\n  9\r\n$DIMLTYPE\r\n  6\r\n\r\n  9\r\n$DIMLTEX1\r\n  6\r\n\r\n  9\r\n$DIMLTEX2\r\n  6\r\n\r\n  9\r\n$DIMTXTDIRECTION\r\n 70\r\n     0\r\n  9\r\n$LUNITS\r\n 70\r\n     2\r\n  9\r\n$LUPREC\r\n 70\r\n     4\r\n  9\r\n$SKETCHINC\r\n 40\r\n0.1\r\n  9\r\n$FILLETRAD\r\n 40\r\n0.5\r\n  9\r\n$AUNITS\r\n 70\r\n     0\r\n  9\r\n$AUPREC\r\n 70\r\n     4\r\n  9\r\n$MENU\r\n  1\r\n.\r\n  9\r\n$ELEVATION\r\n 40\r\n0.0\r\n  9\r\n$PELEVATION\r\n 40\r\n0.0\r\n  9\r\n$THICKNESS\r\n 40\r\n0.0\r\n  9\r\n$LIMCHECK\r\n 70\r\n     0\r\n  9\r\n$CHAMFERA\r\n 40\r\n0.5\r\n  9\r\n$CHAMFERB\r\n 40\r\n0.5\r\n  9\r\n$CHAMFERC\r\n 40\r\n1.0\r\n  9\r\n$CHAMFERD\r\n 40\r\n0.0\r\n  9\r\n$SKPOLY\r\n 70\r\n     0\r\n  9\r\n$TDCREATE\r\n 40\r\n2458060.813564815\r\n  9\r\n$TDUCREATE\r\n 40\r\n2458060.730231482\r\n  9\r\n$TDUPDATE\r\n 40\r\n2459045.696041667\r\n  9\r\n$TDUUPDATE\r\n 40\r\n2459045.571041666\r\n  9\r\n$TDINDWG\r\n 40\r\n0.0057293403\r\n  9\r\n$TDUSRTIMER\r\n 40\r\n0.0057291667\r\n  9\r\n$USRTIMER\r\n 70\r\n     1\r\n  9\r\n$ANGBASE\r\n 50\r\n0.0\r\n  9\r\n$ANGDIR\r\n 70\r\n     0\r\n  9\r\n$PDMODE\r\n 70\r\n     0\r\n  9\r\n$PDSIZE\r\n 40\r\n0.0\r\n  9\r\n$PLINEWID\r\n 40\r\n0.0\r\n  9\r\n$SPLFRAME\r\n 70\r\n     0\r\n  9\r\n$SPLINETYPE\r\n 70\r\n     6\r\n  9\r\n$SPLINESEGS\r\n 70\r\n     8\r\n  9\r\n$HANDSEED\r\n  5\r\n615\r\n  9\r\n$SURFTAB1\r\n 70\r\n     6\r\n  9\r\n$SURFTAB2\r\n 70\r\n     6\r\n  9\r\n$SURFTYPE\r\n 70\r\n     6\r\n  9\r\n$SURFU\r\n 70\r\n     6\r\n  9\r\n$SURFV\r\n 70\r\n     6\r\n  9\r\n$UCSBASE\r\n  2\r\n\r\n  9\r\n$UCSNAME\r\n  2\r\n\r\n  9\r\n$UCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORTHOREF\r\n  2\r\n\r\n  9\r\n$UCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$UCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSBASE\r\n  2\r\n\r\n  9\r\n$PUCSNAME\r\n  2\r\n\r\n  9\r\n$PUCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORTHOREF\r\n  2\r\n\r\n  9\r\n$PUCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$PUCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$USERI1\r\n 70\r\n     0\r\n  9\r\n$USERI2\r\n 70\r\n     0\r\n  9\r\n$USERI3\r\n 70\r\n     0\r\n  9\r\n$USERI4\r\n 70\r\n     0\r\n  9\r\n$USERI5\r\n 70\r\n     0\r\n  9\r\n$USERR1\r\n 40\r\n0.0\r\n  9\r\n$USERR2\r\n 40\r\n0.0\r\n  9\r\n$USERR3\r\n 40\r\n0.0\r\n  9\r\n$USERR4\r\n 40\r\n0.0\r\n  9\r\n$USERR5\r\n 40\r\n0.0\r\n  9\r\n$WORLDVIEW\r\n 70\r\n     1\r\n  9\r\n$SHADEDGE\r\n 70\r\n     3\r\n  9\r\n$SHADEDIF\r\n 70\r\n    70\r\n  9\r\n$TILEMODE\r\n 70\r\n     1\r\n  9\r\n$MAXACTVP\r\n 70\r\n    64\r\n  9\r\n$PINSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMCHECK\r\n 70\r\n     0\r\n  9\r\n$PEXTMIN\r\n 10\r\n1.000000000000000E+20\r\n 20\r\n1.000000000000000E+20\r\n 30\r\n1.000000000000000E+20\r\n  9\r\n$PEXTMAX\r\n 10\r\n-1.000000000000000E+20\r\n 20\r\n-1.000000000000000E+20\r\n 30\r\n-1.000000000000000E+20\r\n  9\r\n$PLIMMIN\r\n 10\r\n-0.1666668268639272\r\n 20\r\n-0.1666666766789955\r\n  9\r\n$PLIMMAX\r\n 10\r\n11.52777724378691\r\n 20\r\n8.097222545954187\r\n  9\r\n$UNITMODE\r\n 70\r\n     0\r\n  9\r\n$VISRETAIN\r\n 70\r\n     1\r\n  9\r\n$PLINEGEN\r\n 70\r\n     0\r\n  9\r\n$PSLTSCALE\r\n 70\r\n     1\r\n  9\r\n$TREEDEPTH\r\n 70\r\n  3020\r\n  9\r\n$CMLSTYLE\r\n  2\r\nSTANDARD\r\n  9\r\n$CMLJUST\r\n 70\r\n     0\r\n  9\r\n$CMLSCALE\r\n 40\r\n1.0\r\n  9\r\n$PROXYGRAPHICS\r\n 70\r\n     1\r\n  9\r\n$MEASUREMENT\r\n 70\r\n     0\r\n  9\r\n$CELWEIGHT\r\n370\r\n    -3\r\n  9\r\n$ENDCAPS\r\n280\r\n     0\r\n  9\r\n$JOINSTYLE\r\n280\r\n     0\r\n  9\r\n$LWDISPLAY\r\n290\r\n     1\r\n  9\r\n$INSUNITS\r\n 70\r\n     6\r\n  9\r\n$HYPERLINKBASE\r\n  1\r\n\r\n  9\r\n$STYLESHEET\r\n  1\r\n\r\n  9\r\n$XEDIT\r\n290\r\n     1\r\n  9\r\n$CEPSNTYPE\r\n380\r\n     0\r\n  9\r\n$PSTYLEMODE\r\n290\r\n     1\r\n  9\r\n$FINGERPRINTGUID\r\n  2\r\n{FDEAD576-A652-11D2-9A35-0060089B3A3F}\r\n  9\r\n$VERSIONGUID\r\n  2\r\n{428ACE74-CD25-2547-919F-2857E59BC59A}\r\n  9\r\n$EXTNAMES\r\n290\r\n     1\r\n  9\r\n$PSVPSCALE\r\n 40\r\n0.0\r\n  9\r\n$OLESTARTUP\r\n290\r\n     0\r\n  9\r\n$SORTENTS\r\n280\r\n   127\r\n  9\r\n$INDEXCTL\r\n280\r\n     0\r\n  9\r\n$HIDETEXT\r\n280\r\n     0\r\n  9\r\n$XCLIPFRAME\r\n280\r\n     2\r\n  9\r\n$HALOGAP\r\n280\r\n     0\r\n  9\r\n$OBSCOLOR\r\n 70\r\n   257\r\n  9\r\n$OBSLTYPE\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONDISPLAY\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONCOLOR\r\n 70\r\n   257\r\n  9\r\n$DIMASSOC\r\n280\r\n     1\r\n  9\r\n$PROJECTNAME\r\n  1\r\n\r\n  9\r\n$CAMERADISPLAY\r\n290\r\n     0\r\n  9\r\n$LENSLENGTH\r\n 40\r\n50.0\r\n  9\r\n$CAMERAHEIGHT\r\n 40\r\n0.0\r\n  9\r\n$STEPSPERSEC\r\n 40\r\n2.0\r\n  9\r\n$STEPSIZE\r\n 40\r\n6.0\r\n  9\r\n$3DDWFPREC\r\n 40\r\n2.0\r\n  9\r\n$PSOLWIDTH\r\n 40\r\n0.25\r\n  9\r\n$PSOLHEIGHT\r\n 40\r\n4.0\r\n  9\r\n$LOFTANG1\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTANG2\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTMAG1\r\n 40\r\n0.0\r\n  9\r\n$LOFTMAG2\r\n 40\r\n0.0\r\n  9\r\n$LOFTPARAM\r\n 70\r\n     7\r\n  9\r\n$LOFTNORMALS\r\n280\r\n     1\r\n  9\r\n$LATITUDE\r\n 40\r\n37.795\r\n  9\r\n$LONGITUDE\r\n 40\r\n-122.394\r\n  9\r\n$NORTHDIRECTION\r\n 40\r\n0.0\r\n  9\r\n$TIMEZONE\r\n 70\r\n -8000\r\n  9\r\n$LIGHTGLYPHDISPLAY\r\n280\r\n     1\r\n  9\r\n$TILEMODELIGHTSYNCH\r\n280\r\n     1\r\n  9\r\n$CMATERIAL\r\n347\r\n56D\r\n  9\r\n$SOLIDHIST\r\n280\r\n     0\r\n  9\r\n$SHOWHIST\r\n280\r\n     1\r\n  9\r\n$DWFFRAME\r\n280\r\n     2\r\n  9\r\n$DGNFRAME\r\n280\r\n     0\r\n  9\r\n$REALWORLDSCALE\r\n290\r\n     1\r\n  9\r\n$INTERFERECOLOR\r\n 62\r\n     1\r\n  9\r\n$INTERFEREOBJVS\r\n345\r\n58F\r\n  9\r\n$INTERFEREVPVS\r\n346\r\n58C\r\n  9\r\n$CSHADOW\r\n280\r\n     0\r\n  9\r\n$SHADOWPLANELOCATION\r\n 40\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nCLASSES\r\n  0\r\nCLASS\r\n  1\r\nACDBDICTIONARYWDFLT\r\n  2\r\nAcDbDictionaryWithDefault\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nIMAGE\r\n  2\r\nAcDbRasterImage\r\n  3\r\nISM\r\n 90\r\n     2175\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     1\r\n  0\r\nCLASS\r\n  1\r\nDICTIONARYVAR\r\n  2\r\nAcDbDictionaryVar\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        9\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nRASTERVARIABLES\r\n  2\r\nAcDbRasterVariables\r\n  3\r\nISM\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nIMAGEDEF\r\n  2\r\nAcDbRasterImageDef\r\n  3\r\nISM\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nIMAGEDEF_REACTOR\r\n  2\r\nAcDbRasterImageDefReactor\r\n  3\r\nISM\r\n 90\r\n        1\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nIDBUFFER\r\n  2\r\nAcDbIdBuffer\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSPATIAL_FILTER\r\n  2\r\nAcDbSpatialFilter\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSORTENTSTABLE\r\n  2\r\nAcDbSortentsTable\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nLAYER_INDEX\r\n  2\r\nAcDbLayerIndex\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSPATIAL_INDEX\r\n  2\r\nAcDbSpatialIndex\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nOBJECT_PTR\r\n  2\r\nCAseDLPNTableRecord\r\n  3\r\n\"ASE-LPNTableRecord\"\r\n 90\r\n        1\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nPLOTSETTINGS\r\n  2\r\nAcDbPlotSettings\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nWIPEOUT\r\n  2\r\nAcDbWipeout\r\n  3\r\nWipeOut|Product Desc: Object Enabler for WipeOut entity | Company: Autodesk, Inc. | WEB Address: www.autodesk.com\r\n 90\r\n     2175\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     1\r\n  0\r\nCLASS\r\n  1\r\nWIPEOUTVARIABLES\r\n  2\r\nAcDbWipeoutVariables\r\n  3\r\n\"WipeOut|Product Desc:     WipeOut Dbx Application|Company:          Autodesk, Inc.|WEB Address:      www.autodesk.com\"\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nRTEXT\r\n  2\r\nRText\r\n  3\r\nRText|AutoCAD Express Tool|expresstools@autodesk.com\r\n 90\r\n     3071\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     1\r\n  0\r\nCLASS\r\n  1\r\nARCALIGNEDTEXT\r\n  2\r\nAcDbArcAlignedText\r\n  3\r\nATEXT|AutoCAD Express Tool|expresstools@autodesk.com\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     1\r\n  0\r\nCLASS\r\n  1\r\nMATERIAL\r\n  2\r\nAcDbMaterial\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nVISUALSTYLE\r\n  2\r\nAcDbVisualStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n       24\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nTABLESTYLE\r\n  2\r\nAcDbTableStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSCALE\r\n  2\r\nAcDbScale\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n       17\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMLEADERSTYLE\r\n  2\r\nAcDbMLeaderStyle\r\n  3\r\nACDB_MLEADERSTYLE_CLASS\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBSECTIONVIEWSTYLE\r\n  2\r\nAcDbSectionViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBDETAILVIEWSTYLE\r\n  2\r\nAcDbDetailViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nCELLSTYLEMAP\r\n  2\r\nAcDbCellStyleMap\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1152\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nTABLES\r\n  0\r\nTABLE\r\n  2\r\nVPORT\r\n  5\r\n520\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n1001\r\nACAD\r\n1000\r\nDbSaveVer\r\n1071\r\n       70\r\n  0\r\nVPORT\r\n  5\r\n4B\r\n330\r\n520\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbViewportTableRecord\r\n  2\r\n*ACTIVE\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n1.0\r\n 12\r\n2.926441721955953\r\n 22\r\n6.285803662699279\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 14\r\n0.1\r\n 24\r\n0.1\r\n 15\r\n0.1\r\n 25\r\n0.1\r\n 16\r\n0.0\r\n 26\r\n0.0\r\n 36\r\n1.0\r\n 17\r\n0.0\r\n 27\r\n0.0\r\n 37\r\n0.0\r\n 40\r\n3.124113918573451\r\n 41\r\n1.463288521199586\r\n 42\r\n50.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 50\r\n0.0\r\n 51\r\n0.0\r\n 71\r\n     0\r\n 72\r\n   100\r\n 73\r\n     1\r\n 74\r\n     2\r\n 75\r\n     0\r\n 76\r\n     1\r\n 77\r\n     0\r\n 78\r\n     1\r\n281\r\n     0\r\n 65\r\n     1\r\n110\r\n0.0\r\n120\r\n0.0\r\n130\r\n0.0\r\n111\r\n1.0\r\n121\r\n0.0\r\n131\r\n0.0\r\n112\r\n0.0\r\n122\r\n1.0\r\n132\r\n0.0\r\n 79\r\n     0\r\n146\r\n0.0\r\n348\r\n58B\r\n 60\r\n     3\r\n 61\r\n     5\r\n292\r\n     1\r\n282\r\n     1\r\n141\r\n0.0\r\n142\r\n0.0\r\n 63\r\n   250\r\n421\r\n  3355443\r\n1001\r\nACAD_NAV_VCDISPLAY\r\n1070\r\n     3\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLTYPE\r\n  5\r\n51D\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nLTYPE\r\n  5\r\n52C\r\n330\r\n51D\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByBlock\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n52D\r\n330\r\n51D\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByLayer\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n52E\r\n330\r\n51D\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nContinuous\r\n 70\r\n     0\r\n  3\r\nSolid line\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLAYER\r\n  5\r\n51A\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n5C3\r\n102\r\n}\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nLAYER\r\n  5\r\n6\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n5D5\r\n102\r\n}\r\n330\r\n51A\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLayerTableRecord\r\n  2\r\n0\r\n 70\r\n     0\r\n 62\r\n     2\r\n  6\r\nContinuous\r\n370\r\n     0\r\n390\r\n527\r\n347\r\n57D\r\n348\r\n0\r\n  0\r\nLAYER\r\n  5\r\n293\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n5D7\r\n102\r\n}\r\n330\r\n51A\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLayerTableRecord\r\n  2\r\nImage\r\n 70\r\n     0\r\n 62\r\n     7\r\n  6\r\nContinuous\r\n370\r\n     0\r\n390\r\n527\r\n347\r\n57D\r\n348\r\n0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nSTYLE\r\n  5\r\n51B\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nSTYLE\r\n  5\r\n529\r\n330\r\n51B\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n0.2\r\n  3\r\ntxt\r\n  4\r\n\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nVIEW\r\n  5\r\n51E\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nUCS\r\n  5\r\n51F\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nAPPID\r\n  5\r\n521\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     3\r\n  0\r\nAPPID\r\n  5\r\n52A\r\n330\r\n521\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n5CA\r\n330\r\n521\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_NAV_VCDISPLAY\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n5D0\r\n330\r\n521\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_PSEXT\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nDIMSTYLE\r\n  5\r\n522\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n100\r\nAcDbDimStyleTable\r\n 71\r\n     0\r\n  0\r\nDIMSTYLE\r\n105\r\n2\r\n330\r\n522\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n 41\r\n0.25\r\n 42\r\n0.125\r\n 43\r\n0.0\r\n 44\r\n0.125\r\n 73\r\n     0\r\n 74\r\n     0\r\n 77\r\n     1\r\n 78\r\n     2\r\n 79\r\n     3\r\n140\r\n0.25\r\n141\r\n0.0\r\n143\r\n1.0\r\n145\r\n0.125\r\n147\r\n0.125\r\n171\r\n     4\r\n179\r\n     4\r\n274\r\n     4\r\n278\r\n     0\r\n284\r\n     2\r\n285\r\n    12\r\n286\r\n    12\r\n340\r\n529\r\n342\r\n562\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nBLOCK_RECORD\r\n  5\r\n519\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n518\r\n330\r\n519\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*MODEL_SPACE\r\n340\r\n4A\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n5BC\r\n330\r\n519\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space\r\n340\r\n5BD\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n562\r\n330\r\n519\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\nTerminatorOpen\r\n340\r\n0\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n568\r\n330\r\n519\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*PAPER_SPACE1\r\n340\r\n569\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nBLOCKS\r\n  0\r\nBLOCK\r\n  5\r\n538\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*MODEL_SPACE\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*MODEL_SPACE\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n539\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\n5BE\r\n330\r\n5BC\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n 62\r\n     7\r\n370\r\n    -3\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n5BF\r\n330\r\n5BC\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n 62\r\n     7\r\n370\r\n    -3\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\n563\r\n330\r\n562\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n 62\r\n     0\r\n370\r\n    -2\r\n100\r\nAcDbBlockBegin\r\n  2\r\nTerminatorOpen\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\nTerminatorOpen\r\n  1\r\n\r\n  0\r\nLINE\r\n  5\r\n564\r\n330\r\n562\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n 62\r\n     0\r\n370\r\n    -2\r\n100\r\nAcDbLine\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n 11\r\n-1.0\r\n 21\r\n0.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n565\r\n330\r\n562\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n 62\r\n     0\r\n370\r\n    -2\r\n100\r\nAcDbLine\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n 11\r\n-1.0\r\n 21\r\n0.25\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n566\r\n330\r\n562\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n 62\r\n     0\r\n370\r\n    -2\r\n100\r\nAcDbLine\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n 11\r\n-1.0\r\n 21\r\n-0.25\r\n 31\r\n0.0\r\n  0\r\nENDBLK\r\n  5\r\n567\r\n330\r\n562\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n 62\r\n     0\r\n370\r\n    -2\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\n534\r\n330\r\n568\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*PAPER_SPACE1\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*PAPER_SPACE1\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n535\r\n330\r\n568\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nENTITIES\r\n  0\r\nLINE\r\n  5\r\n250\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.8973459999999999\r\n 20\r\n5.496596\r\n 30\r\n0.0\r\n 11\r\n0.8973459999999999\r\n 21\r\n5.096047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n259\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.393770999999999\r\n 20\r\n5.096047\r\n 30\r\n0.0\r\n 11\r\n1.393770999999999\r\n 21\r\n4.919208999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.393770999999999\r\n 20\r\n4.919208999999998\r\n 30\r\n0.0\r\n 11\r\n1.568479\r\n 21\r\n4.919208999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.568479\r\n 20\r\n5.264362999999998\r\n 30\r\n0.0\r\n 11\r\n1.472603\r\n 21\r\n5.264362999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n260\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.472603\r\n 20\r\n5.102437999999998\r\n 30\r\n0.0\r\n 11\r\n1.527998\r\n 21\r\n5.102437999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n261\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.527998\r\n 20\r\n5.102437999999998\r\n 30\r\n0.0\r\n 11\r\n1.527998\r\n 21\r\n5.079002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n262\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.527998\r\n 20\r\n5.079002\r\n 30\r\n0.0\r\n 11\r\n1.453427\r\n 21\r\n5.079002\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n251\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.8973459999999999\r\n 20\r\n5.096047\r\n 30\r\n0.0\r\n 11\r\n1.393770999999999\r\n 21\r\n5.096047\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n263\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.472603\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n1.453427\r\n 21\r\n5.235732999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n264\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.472603\r\n 20\r\n5.177674999999998\r\n 30\r\n0.0\r\n 11\r\n1.453427\r\n 21\r\n5.177674999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n252\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.453427\r\n 20\r\n5.079002\r\n 30\r\n0.0\r\n 11\r\n1.453427\r\n 21\r\n5.177674999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n265\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.453427\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n1.453427\r\n 21\r\n5.496596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.472603\r\n 20\r\n5.264362999999998\r\n 30\r\n0.0\r\n 11\r\n1.472603\r\n 21\r\n5.235732999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n26B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     1\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n4.973271999999998\r\n 10\r\n2.210849\r\n 20\r\n4.973271999999998\r\n 10\r\n2.210849\r\n 20\r\n4.973271999999998\r\n 10\r\n2.210849\r\n 20\r\n4.973271999999998\r\n  0\r\nLINE\r\n  5\r\n266\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.472603\r\n 20\r\n5.177674999999998\r\n 30\r\n0.0\r\n 11\r\n1.472603\r\n 21\r\n5.102437999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n25B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.568479\r\n 20\r\n4.919208999999998\r\n 30\r\n0.0\r\n 11\r\n1.568479\r\n 21\r\n5.177674999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.568479\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n1.568479\r\n 21\r\n5.264362999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n270\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.587118\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n1.587903\r\n 21\r\n5.235732999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.568479\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n1.587654\r\n 21\r\n5.235732999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.568479\r\n 20\r\n5.177674999999998\r\n 30\r\n0.0\r\n 11\r\n1.587654\r\n 21\r\n5.177674999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n26E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.914697999999999\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n1.947722\r\n 21\r\n5.235732999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n272\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.914697999999999\r\n 20\r\n5.177674999999998\r\n 30\r\n0.0\r\n 11\r\n1.947722\r\n 21\r\n5.177674999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n275\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n5.177674999999998\r\n 10\r\n2.210849\r\n 20\r\n4.973271999999998\r\n 10\r\n1.947722\r\n 20\r\n4.973271999999998\r\n 10\r\n1.947722\r\n 20\r\n5.177674999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n271\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.587654\r\n 20\r\n5.235732999999998\r\n 10\r\n1.587654\r\n 20\r\n5.44413\r\n 10\r\n1.914697999999999\r\n 20\r\n5.44413\r\n 10\r\n1.914697999999999\r\n 20\r\n5.235732999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n277\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.914697999999999\r\n 20\r\n5.177674999999998\r\n 10\r\n1.914697999999999\r\n 20\r\n4.973271999999998\r\n 10\r\n1.587654\r\n 20\r\n4.973271999999998\r\n 10\r\n1.587654\r\n 20\r\n5.177674999999998\r\n  0\r\nLINE\r\n  5\r\n274\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.210849\r\n 20\r\n5.177674999999998\r\n 30\r\n0.0\r\n 11\r\n2.248133999999998\r\n 21\r\n5.177674999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n273\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.210849\r\n 20\r\n5.235732999999998\r\n 30\r\n0.0\r\n 11\r\n2.248133999999998\r\n 21\r\n5.235732999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n282\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.581479\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n2.581479\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.613071999999998\r\n 20\r\n5.092559999999998\r\n 30\r\n0.0\r\n 11\r\n4.613071999999998\r\n 21\r\n5.116278\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.180502999999998\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n2.180502999999998\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.178199\r\n 20\r\n7.01353\r\n 30\r\n0.0\r\n 11\r\n2.178199\r\n 21\r\n6.869946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.907386999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n2.907386999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.195667999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n3.195667999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.313600999999998\r\n 20\r\n6.49248\r\n 30\r\n0.0\r\n 11\r\n2.313600999999998\r\n 21\r\n6.147992999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.313600999999998\r\n 20\r\n6.49248\r\n 30\r\n0.0\r\n 11\r\n2.636331\r\n 21\r\n6.49248\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2FA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.636331\r\n 20\r\n6.49248\r\n 30\r\n0.0\r\n 11\r\n2.636331\r\n 21\r\n6.438087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2FF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.434088999999998\r\n 20\r\n6.465205999999998\r\n 30\r\n0.0\r\n 11\r\n3.434088999999998\r\n 21\r\n6.336554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.954269\r\n 20\r\n6.683991999999999\r\n 30\r\n0.0\r\n 11\r\n0.954269\r\n 21\r\n6.663596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.003459\r\n 20\r\n6.683991999999999\r\n 30\r\n0.0\r\n 11\r\n1.003459\r\n 21\r\n6.663596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.350190999999999\r\n 20\r\n6.564016\r\n 30\r\n0.0\r\n 11\r\n1.432172\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n313\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.335906999999999\r\n 20\r\n6.803855\r\n 30\r\n0.0\r\n 11\r\n1.42334\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n315\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.106638999999999\r\n 20\r\n6.733183\r\n 30\r\n0.0\r\n 11\r\n1.159428\r\n 21\r\n6.733183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n316\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.106638999999999\r\n 20\r\n6.821964999999998\r\n 30\r\n0.0\r\n 11\r\n1.229014999999998\r\n 21\r\n6.821964999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n318\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.229014999999998\r\n 20\r\n6.821964999999998\r\n 30\r\n0.0\r\n 11\r\n1.229014999999998\r\n 21\r\n6.802769\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n319\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.071845999999998\r\n 20\r\n6.761977\r\n 30\r\n0.0\r\n 11\r\n1.106638999999999\r\n 21\r\n6.761977\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.106638999999999\r\n 20\r\n6.807567999999997\r\n 30\r\n0.0\r\n 11\r\n1.071845999999998\r\n 21\r\n6.807567999999997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.071845999999998\r\n 20\r\n6.529222999999999\r\n 30\r\n0.0\r\n 11\r\n1.146230999999998\r\n 21\r\n6.529222999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.113837\r\n 20\r\n6.615605999999998\r\n 30\r\n0.0\r\n 11\r\n1.159428\r\n 21\r\n6.615605999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n320\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.350190999999999\r\n 20\r\n6.564016\r\n 30\r\n0.0\r\n 11\r\n1.232613999999998\r\n 21\r\n6.564016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.268049999999998\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n4.268049999999998\r\n 21\r\n6.054211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.231456999999998\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n4.231456999999998\r\n 21\r\n6.054211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n32C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.268049999999998\r\n 20\r\n5.902955999999998\r\n 30\r\n0.0\r\n 11\r\n4.268049999999998\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n32B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.231456999999998\r\n 20\r\n5.902955999999998\r\n 30\r\n0.0\r\n 11\r\n4.231456999999998\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n329\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.231456999999998\r\n 20\r\n6.054211\r\n 30\r\n0.0\r\n 11\r\n4.268049999999998\r\n 21\r\n6.054211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.809408\r\n 20\r\n6.054211\r\n 30\r\n0.0\r\n 11\r\n3.836244\r\n 21\r\n6.054211\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.268049999999998\r\n 20\r\n5.902955999999998\r\n 30\r\n0.0\r\n 11\r\n4.231456999999998\r\n 21\r\n5.902955999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n330\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.836244\r\n 20\r\n5.902955999999998\r\n 30\r\n0.0\r\n 11\r\n3.809408\r\n 21\r\n5.902955999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n32F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.809408\r\n 20\r\n6.054211\r\n 30\r\n0.0\r\n 11\r\n3.809408\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n333\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.836244\r\n 20\r\n6.054211\r\n 30\r\n0.0\r\n 11\r\n3.836244\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.836244\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n3.836244\r\n 21\r\n5.902955999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.809408\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n3.809408\r\n 21\r\n5.902955999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.970420999999998\r\n 20\r\n6.200586\r\n 30\r\n0.0\r\n 11\r\n3.970420999999998\r\n 21\r\n6.17375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.107037999999998\r\n 20\r\n6.200586\r\n 30\r\n0.0\r\n 11\r\n4.107037999999998\r\n 21\r\n6.17375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.17795\r\n 20\r\n6.17375\r\n 30\r\n0.0\r\n 11\r\n4.107037999999998\r\n 21\r\n6.17375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n33A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.970420999999998\r\n 20\r\n6.17375\r\n 30\r\n0.0\r\n 11\r\n3.890559999999998\r\n 21\r\n6.17375\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.890559999999998\r\n 20\r\n6.200586\r\n 30\r\n0.0\r\n 11\r\n3.970420999999998\r\n 21\r\n6.200586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n33B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.107037999999998\r\n 20\r\n6.200586\r\n 30\r\n0.0\r\n 11\r\n4.17795\r\n 21\r\n6.200586\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n33D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.17795\r\n 20\r\n6.17375\r\n 30\r\n0.0\r\n 11\r\n4.231456999999998\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n33E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.890559999999998\r\n 20\r\n6.17375\r\n 30\r\n0.0\r\n 11\r\n3.836244\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.890559999999998\r\n 20\r\n5.771219\r\n 30\r\n0.0\r\n 11\r\n3.970420999999998\r\n 21\r\n5.771219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n341\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.107037999999998\r\n 20\r\n5.771219\r\n 30\r\n0.0\r\n 11\r\n4.17795\r\n 21\r\n5.771219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2DE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.173843999999998\r\n 20\r\n5.739504\r\n 30\r\n0.0\r\n 11\r\n4.107037999999998\r\n 21\r\n5.739504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n342\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.970420999999998\r\n 20\r\n5.739504\r\n 30\r\n0.0\r\n 11\r\n3.886454\r\n 21\r\n5.739504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n343\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.970420999999998\r\n 20\r\n5.771219\r\n 30\r\n0.0\r\n 11\r\n3.970420999999998\r\n 21\r\n5.739504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n345\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.107037999999998\r\n 20\r\n5.771219\r\n 30\r\n0.0\r\n 11\r\n4.107037999999998\r\n 21\r\n5.739504\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n347\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.836244\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n3.890559999999998\r\n 21\r\n5.771219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n348\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.231456999999998\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n4.17795\r\n 21\r\n5.771219\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n34F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.107412999999998\r\n 30\r\n0.0\r\n 11\r\n3.521799999999998\r\n 21\r\n5.107412999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n326\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.68334\r\n 20\r\n6.865889999999998\r\n 30\r\n0.0\r\n 11\r\n4.637979\r\n 21\r\n6.820528999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n322\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.958679\r\n 20\r\n6.865889999999998\r\n 30\r\n0.0\r\n 11\r\n5.012307999999999\r\n 21\r\n6.812261\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n327\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n5.012307999999999\r\n 20\r\n6.547321\r\n 30\r\n0.0\r\n 11\r\n4.964686\r\n 21\r\n6.499698999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n324\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.637979\r\n 20\r\n6.537698999999999\r\n 30\r\n0.0\r\n 11\r\n4.675978999999998\r\n 21\r\n6.499698999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n359\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.68334\r\n 20\r\n6.865889999999998\r\n 10\r\n4.958679\r\n 20\r\n6.865889999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n35A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n5.012307999999999\r\n 20\r\n6.812261\r\n 10\r\n5.012307999999999\r\n 20\r\n6.547321\r\n  0\r\nLINE\r\n  5\r\n35E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.637979\r\n 20\r\n6.645997999999998\r\n 30\r\n0.0\r\n 11\r\n4.637979\r\n 21\r\n6.537698999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n35C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.610913\r\n 20\r\n6.645997999999998\r\n 30\r\n0.0\r\n 11\r\n4.637979\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n35D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.610913\r\n 20\r\n6.716422\r\n 30\r\n0.0\r\n 11\r\n4.637979\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n303\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.637979\r\n 20\r\n6.820528999999998\r\n 30\r\n0.0\r\n 11\r\n4.637979\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n304\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.610913\r\n 20\r\n6.865889999999998\r\n 30\r\n0.0\r\n 11\r\n4.610913\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n361\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.610913\r\n 20\r\n6.645997999999998\r\n 30\r\n0.0\r\n 11\r\n4.610913\r\n 21\r\n6.499698999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n35B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.964686\r\n 20\r\n6.499698999999998\r\n 10\r\n4.863308999999999\r\n 20\r\n6.499698999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n362\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.785242\r\n 20\r\n6.499698999999998\r\n 10\r\n4.675978999999998\r\n 20\r\n6.499698999999998\r\n  0\r\nLINE\r\n  5\r\n2D1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.785242\r\n 20\r\n6.499698999999998\r\n 30\r\n0.0\r\n 11\r\n4.785242\r\n 21\r\n6.416262999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n365\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.863308999999999\r\n 20\r\n6.416262999999998\r\n 30\r\n0.0\r\n 11\r\n4.863308999999999\r\n 21\r\n6.499698999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n367\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.609034999999998\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n4.627576\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.627576\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n4.609034999999998\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n331\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.268049999999998\r\n 20\r\n6.114967\r\n 10\r\n4.609034999999998\r\n 20\r\n6.114967\r\n 10\r\n4.609034999999998\r\n 20\r\n6.002978999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n368\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.609034999999998\r\n 20\r\n5.939549999999998\r\n 10\r\n4.609034999999998\r\n 20\r\n5.841483\r\n 10\r\n4.268049999999998\r\n 20\r\n5.841483\r\n  0\r\nLWPOLYLINE\r\n  5\r\n369\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.627576\r\n 20\r\n6.002978999999998\r\n 10\r\n4.627576\r\n 20\r\n6.416262999999998\r\n 10\r\n4.785242\r\n 20\r\n6.416262999999998\r\n  0\r\nLINE\r\n  5\r\n2D2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.863308999999999\r\n 20\r\n5.49826\r\n 30\r\n0.0\r\n 11\r\n4.863308999999999\r\n 21\r\n5.526280999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n36B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.785242\r\n 20\r\n5.526280999999999\r\n 30\r\n0.0\r\n 11\r\n4.785242\r\n 21\r\n5.49826\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n363\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.863308999999999\r\n 20\r\n6.416262999999998\r\n 10\r\n5.007673\r\n 20\r\n6.416262999999998\r\n 10\r\n5.007673\r\n 20\r\n5.526280999999999\r\n 10\r\n4.863308999999999\r\n 20\r\n5.526280999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n36C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.785242\r\n 20\r\n5.526280999999999\r\n 10\r\n4.627576\r\n 20\r\n5.526280999999999\r\n 10\r\n4.627576\r\n 20\r\n5.939549999999998\r\n  0\r\nLINE\r\n  5\r\n370\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.563755\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n4.649888999999999\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n371\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.543783\r\n 20\r\n5.399455\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n372\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.543783\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n5.399455\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n373\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.563755\r\n 20\r\n5.246368\r\n 10\r\n4.563755\r\n 20\r\n5.44413\r\n  0\r\nLINE\r\n  5\r\n2A1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.543783\r\n 20\r\n4.971473999999998\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n378\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.676102999999998\r\n 20\r\n5.246368\r\n 10\r\n4.676102999999998\r\n 20\r\n5.49826\r\n 10\r\n4.785242\r\n 20\r\n5.49826\r\n  0\r\nLWPOLYLINE\r\n  5\r\n36F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.649888999999999\r\n 20\r\n5.44413\r\n 10\r\n4.649888999999999\r\n 20\r\n5.246368\r\n  0\r\nLINE\r\n  5\r\n34D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.676102999999998\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n4.649888999999999\r\n 21\r\n5.246368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.563755\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n5.246368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.563755\r\n 20\r\n5.174494999999998\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n380\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.676102999999998\r\n 20\r\n5.174494999999998\r\n 30\r\n0.0\r\n 11\r\n4.649888999999999\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n382\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.563755\r\n 20\r\n5.116278\r\n 10\r\n4.563755\r\n 20\r\n5.174494999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n383\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.741014999999999\r\n 20\r\n5.092559999999998\r\n 10\r\n4.741014999999999\r\n 20\r\n4.936522\r\n 10\r\n4.563755\r\n 20\r\n4.936522\r\n 10\r\n4.563755\r\n 20\r\n5.116278\r\n  0\r\nLWPOLYLINE\r\n  5\r\n36D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.863308999999999\r\n 20\r\n5.49826\r\n 10\r\n5.200391999999999\r\n 20\r\n5.49826\r\n 10\r\n5.200391999999999\r\n 20\r\n5.092559999999998\r\n 10\r\n4.741014999999999\r\n 20\r\n5.092559999999998\r\n  0\r\nLINE\r\n  5\r\n2A9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.676102999999998\r\n 20\r\n5.092559999999998\r\n 30\r\n0.0\r\n 11\r\n4.613071999999998\r\n 21\r\n5.092559999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n384\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.676102999999998\r\n 20\r\n5.092559999999998\r\n 10\r\n4.676102999999998\r\n 20\r\n5.174494999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n385\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.649888999999999\r\n 20\r\n5.116278\r\n 10\r\n4.613071999999998\r\n 20\r\n5.116278\r\n  0\r\nLWPOLYLINE\r\n  5\r\n376\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.649888999999999\r\n 20\r\n5.174494999999998\r\n 10\r\n4.649888999999999\r\n 20\r\n5.116278\r\n  0\r\nLWPOLYLINE\r\n  5\r\n381\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.619930999999998\r\n 20\r\n5.116278\r\n 10\r\n4.640336\r\n 20\r\n5.116278\r\n  0\r\nLINE\r\n  5\r\n387\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.214229\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n3.869697\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.985652999999998\r\n 20\r\n5.472863999999998\r\n 30\r\n0.0\r\n 11\r\n3.985652999999998\r\n 21\r\n5.454234999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n38D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.081484999999998\r\n 20\r\n5.454234999999998\r\n 30\r\n0.0\r\n 11\r\n4.081484999999998\r\n 21\r\n5.472863999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n340\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.173843999999998\r\n 20\r\n5.739504\r\n 10\r\n4.173843999999998\r\n 20\r\n5.472863999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n38E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.186766999999998\r\n 20\r\n5.454234999999998\r\n 10\r\n4.081484999999998\r\n 20\r\n5.454234999999998\r\n  0\r\nLINE\r\n  5\r\n388\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.081484999999998\r\n 20\r\n5.472863999999998\r\n 30\r\n0.0\r\n 11\r\n4.173843999999998\r\n 21\r\n5.472863999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n352\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.886454\r\n 20\r\n5.472863999999998\r\n 30\r\n0.0\r\n 11\r\n3.985652999999998\r\n 21\r\n5.472863999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n38F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.886454\r\n 20\r\n5.472863999999998\r\n 10\r\n3.886454\r\n 20\r\n5.739504\r\n  0\r\nLWPOLYLINE\r\n  5\r\n389\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.985652999999998\r\n 20\r\n5.454234999999998\r\n 10\r\n3.885924999999998\r\n 20\r\n5.454234999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n390\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.17795\r\n 20\r\n6.465205999999998\r\n 10\r\n4.17795\r\n 20\r\n6.200586\r\n  0\r\nLWPOLYLINE\r\n  5\r\n336\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.890559999999998\r\n 20\r\n6.200586\r\n 10\r\n3.890559999999998\r\n 20\r\n6.465205999999998\r\n  0\r\nLINE\r\n  5\r\n349\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.985652999999998\r\n 20\r\n6.499698999999998\r\n 30\r\n0.0\r\n 11\r\n3.985652999999998\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n392\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.081484999999998\r\n 20\r\n6.465205999999998\r\n 30\r\n0.0\r\n 11\r\n4.081484999999998\r\n 21\r\n6.499698999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n358\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n4.610913\r\n 20\r\n6.499698999999998\r\n 10\r\n4.081484999999998\r\n 20\r\n6.499698999999998\r\n  0\r\nLINE\r\n  5\r\n395\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.890559999999998\r\n 20\r\n6.465205999999998\r\n 30\r\n0.0\r\n 11\r\n3.985652999999998\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n393\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.081484999999998\r\n 20\r\n6.465205999999998\r\n 30\r\n0.0\r\n 11\r\n4.17795\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n397\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.885924999999998\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n3.869697\r\n 21\r\n5.246368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.885924999999998\r\n 20\r\n5.454234999999998\r\n 30\r\n0.0\r\n 11\r\n3.885924999999998\r\n 21\r\n5.246368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n399\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.869697\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n3.869697\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.885924999999998\r\n 20\r\n5.174494999999998\r\n 30\r\n0.0\r\n 11\r\n3.869697\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n37B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.214229\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n4.186766999999998\r\n 21\r\n5.246368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.214229\r\n 20\r\n5.174494999999998\r\n 30\r\n0.0\r\n 11\r\n4.186766999999998\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.186766999999998\r\n 20\r\n5.246368\r\n 30\r\n0.0\r\n 11\r\n4.186766999999998\r\n 21\r\n5.454234999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.214229\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n4.214229\r\n 21\r\n5.246368\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.186766999999998\r\n 20\r\n4.971473999999998\r\n 30\r\n0.0\r\n 11\r\n4.186766999999998\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.214229\r\n 20\r\n4.971473999999998\r\n 30\r\n0.0\r\n 11\r\n4.543783\r\n 21\r\n4.971473999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n4.214229\r\n 20\r\n5.174494999999998\r\n 30\r\n0.0\r\n 11\r\n4.214229\r\n 21\r\n4.971473999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n4.971473999999998\r\n 30\r\n0.0\r\n 11\r\n3.869697\r\n 21\r\n4.971473999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.885924999999998\r\n 20\r\n4.971473999999998\r\n 30\r\n0.0\r\n 11\r\n4.186766999999998\r\n 21\r\n4.971473999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n39B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.885924999999998\r\n 20\r\n5.174494999999998\r\n 30\r\n0.0\r\n 11\r\n3.885924999999998\r\n 21\r\n4.971473999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.869697\r\n 20\r\n4.971473999999998\r\n 30\r\n0.0\r\n 11\r\n3.869697\r\n 21\r\n5.174494999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n350\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.054705999999998\r\n 30\r\n0.0\r\n 11\r\n3.521799999999998\r\n 21\r\n5.054705999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.054705999999998\r\n 30\r\n0.0\r\n 11\r\n3.541391999999998\r\n 21\r\n4.971473999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.521799999999998\r\n 20\r\n5.054705999999998\r\n 30\r\n0.0\r\n 11\r\n3.521799999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.521799999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n3.521799999999998\r\n 21\r\n5.107412999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n3.541391999999998\r\n 21\r\n5.340262999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.273177999999998\r\n 30\r\n0.0\r\n 11\r\n3.541391999999998\r\n 21\r\n5.107412999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.404884999999998\r\n 20\r\n5.273177999999998\r\n 30\r\n0.0\r\n 11\r\n3.404884999999998\r\n 21\r\n5.155383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n287\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.404884999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n3.404884999999998\r\n 21\r\n5.340262999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.552807\r\n 20\r\n5.340262999999998\r\n 30\r\n0.0\r\n 11\r\n2.699643999999998\r\n 21\r\n5.340262999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3A9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.404884999999998\r\n 20\r\n5.340262999999998\r\n 30\r\n0.0\r\n 11\r\n3.541391999999998\r\n 21\r\n5.340262999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2ED\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.541391999999998\r\n 20\r\n5.273177999999998\r\n 30\r\n0.0\r\n 11\r\n3.404884999999998\r\n 21\r\n5.273177999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3AA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.699643999999998\r\n 20\r\n5.273177999999998\r\n 30\r\n0.0\r\n 11\r\n2.552807\r\n 21\r\n5.273177999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3AB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.478844999999998\r\n 20\r\n6.114967\r\n 10\r\n3.809408\r\n 20\r\n6.114967\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3AC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.264524\r\n 20\r\n6.114967\r\n 10\r\n3.449501\r\n 20\r\n6.114967\r\n  0\r\nLWPOLYLINE\r\n  5\r\n335\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.809408\r\n 20\r\n5.841483\r\n 10\r\n3.478844999999998\r\n 20\r\n5.841483\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3AF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.449501\r\n 20\r\n5.841483\r\n 10\r\n3.264524\r\n 20\r\n5.841483\r\n  0\r\nLINE\r\n  5\r\n2E3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.478844999999998\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.478844999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n3.449501\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3AE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n3.449501\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.478844999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n3.449501\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n34C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.264524\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n3.264524\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.264524\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n3.264524\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.264524\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n3.242329\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.242329\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n3.264524\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n6.499698999999998\r\n 30\r\n0.0\r\n 11\r\n3.449501\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n6.716422\r\n 30\r\n0.0\r\n 11\r\n3.449501\r\n 21\r\n6.865889999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.478844999999998\r\n 20\r\n6.499698999999998\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.478844999999998\r\n 20\r\n6.716422\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n6.865889999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n6.716422\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3BC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.449501\r\n 20\r\n6.645997999999998\r\n 30\r\n0.0\r\n 11\r\n3.478844999999998\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n394\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.985652999999998\r\n 20\r\n6.499698999999998\r\n 10\r\n3.478844999999998\r\n 20\r\n6.499698999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3C1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.478844999999998\r\n 20\r\n6.865889999999998\r\n 10\r\n4.610913\r\n 20\r\n6.865889999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3C2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        6\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.024554\r\n 20\r\n6.899961\r\n 10\r\n2.809111999999998\r\n 20\r\n6.899961\r\n 10\r\n2.809111999999998\r\n 20\r\n7.169407999999998\r\n 10\r\n3.306194999999998\r\n 20\r\n7.169407999999998\r\n 10\r\n3.306194999999998\r\n 20\r\n6.899961\r\n 10\r\n3.090943\r\n 20\r\n6.899961\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3C3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.090943\r\n 20\r\n6.865889999999998\r\n 10\r\n3.449501\r\n 20\r\n6.865889999999998\r\n  0\r\nLINE\r\n  5\r\n2AC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.024554\r\n 20\r\n6.899961\r\n 30\r\n0.0\r\n 11\r\n3.024554\r\n 21\r\n6.865889999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.090943\r\n 20\r\n6.899961\r\n 30\r\n0.0\r\n 11\r\n3.090943\r\n 21\r\n6.865889999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3C0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.449501\r\n 20\r\n6.499698999999998\r\n 10\r\n3.090943\r\n 20\r\n6.499698999999998\r\n  0\r\nLINE\r\n  5\r\n3C9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.024554\r\n 20\r\n6.499698999999998\r\n 30\r\n0.0\r\n 11\r\n3.024554\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.090943\r\n 20\r\n6.499698999999998\r\n 30\r\n0.0\r\n 11\r\n3.090943\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3C7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.090943\r\n 20\r\n6.465205999999998\r\n 10\r\n3.242329\r\n 20\r\n6.465205999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3CD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.242329\r\n 20\r\n6.465205999999998\r\n 10\r\n3.242329\r\n 20\r\n6.409078\r\n  0\r\nLINE\r\n  5\r\n300\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.434088999999998\r\n 20\r\n6.336554\r\n 30\r\n0.0\r\n 11\r\n3.242329\r\n 21\r\n6.336554\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.303547\r\n 20\r\n6.409078\r\n 30\r\n0.0\r\n 11\r\n3.303547\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n301\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.242329\r\n 20\r\n6.409078\r\n 30\r\n0.0\r\n 11\r\n3.303547\r\n 21\r\n6.409078\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.303547\r\n 20\r\n6.465205999999998\r\n 30\r\n0.0\r\n 11\r\n3.434088999999998\r\n 21\r\n6.465205999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3C6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.024554\r\n 20\r\n6.499698999999998\r\n 10\r\n2.67147\r\n 20\r\n6.499698999999998\r\n 10\r\n2.67147\r\n 20\r\n6.645997999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3D1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.67147\r\n 20\r\n6.716422\r\n 10\r\n2.67147\r\n 20\r\n6.865889999999998\r\n 10\r\n3.024554\r\n 20\r\n6.865889999999998\r\n  0\r\nLINE\r\n  5\r\n2B0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.432172\r\n 20\r\n6.645997999999998\r\n 30\r\n0.0\r\n 11\r\n1.506941\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.642733\r\n 20\r\n6.645997999999998\r\n 30\r\n0.0\r\n 11\r\n2.67147\r\n 21\r\n6.645997999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3D5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.642733\r\n 20\r\n6.716422\r\n 30\r\n0.0\r\n 11\r\n2.67147\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3D6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.859698999999998\r\n 20\r\n6.438087\r\n 10\r\n2.859698999999998\r\n 20\r\n6.465205999999998\r\n 10\r\n3.024554\r\n 20\r\n6.465205999999998\r\n  0\r\nLINE\r\n  5\r\n2FE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.737864\r\n 20\r\n6.332927999999999\r\n 30\r\n0.0\r\n 11\r\n2.859698999999998\r\n 21\r\n6.332927999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2FB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.636331\r\n 20\r\n6.438087\r\n 30\r\n0.0\r\n 11\r\n2.859698999999998\r\n 21\r\n6.438087\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.737864\r\n 20\r\n6.332927999999999\r\n 30\r\n0.0\r\n 11\r\n2.737864\r\n 21\r\n6.147992999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3D9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.859698999999998\r\n 20\r\n6.308450999999998\r\n 10\r\n2.859698999999998\r\n 20\r\n6.332927999999999\r\n  0\r\nLINE\r\n  5\r\n2E6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.242329\r\n 20\r\n6.308450999999998\r\n 30\r\n0.0\r\n 11\r\n3.090943\r\n 21\r\n6.308450999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3DA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.024554\r\n 20\r\n6.308450999999998\r\n 30\r\n0.0\r\n 11\r\n2.859698999999998\r\n 21\r\n6.308450999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.859698999999998\r\n 20\r\n6.283068\r\n 30\r\n0.0\r\n 11\r\n3.024554\r\n 21\r\n6.283068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3DB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.090943\r\n 20\r\n6.283068\r\n 30\r\n0.0\r\n 11\r\n3.242329\r\n 21\r\n6.283068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3C8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.024554\r\n 20\r\n6.308450999999998\r\n 30\r\n0.0\r\n 11\r\n3.024554\r\n 21\r\n6.283068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3CB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.090943\r\n 20\r\n6.308450999999998\r\n 30\r\n0.0\r\n 11\r\n3.090943\r\n 21\r\n6.283068\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.631797999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n2.631797999999998\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.631797999999998\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n2.631797999999998\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.313600999999998\r\n 20\r\n6.147992999999998\r\n 30\r\n0.0\r\n 11\r\n2.737864\r\n 21\r\n6.147992999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3E9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.237594\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n2.237594\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.237594\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n2.237594\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.210849\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n2.237594\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.237594\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n2.210849\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3EE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.631797999999998\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n2.859698999999998\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3EA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.237594\r\n 20\r\n6.114967\r\n 10\r\n2.631797999999998\r\n 20\r\n6.114967\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3F3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.859698999999998\r\n 20\r\n6.002978999999998\r\n 10\r\n2.859698999999998\r\n 20\r\n6.283068\r\n  0\r\nLINE\r\n  5\r\n3F6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.720638999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n2.631797999999998\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3B6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.859698999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n2.789536999999998\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.789536999999998\r\n 20\r\n5.807481\r\n 30\r\n0.0\r\n 11\r\n2.789536999999998\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2E9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.720638999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n2.720638999999998\r\n 21\r\n5.807481\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3F7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.789536999999998\r\n 20\r\n5.807481\r\n 10\r\n2.829689\r\n 20\r\n5.807481\r\n 10\r\n2.829689\r\n 20\r\n5.472367\r\n 10\r\n2.789536999999998\r\n 20\r\n5.472367\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3FC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.720638999999998\r\n 20\r\n5.472367\r\n 10\r\n2.367031\r\n 20\r\n5.472367\r\n 10\r\n2.367031\r\n 20\r\n5.807481\r\n 10\r\n2.720638999999998\r\n 20\r\n5.807481\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3CE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.242329\r\n 20\r\n6.336554\r\n 10\r\n3.242329\r\n 20\r\n6.308450999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3FE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.242329\r\n 20\r\n6.283068\r\n 10\r\n3.242329\r\n 20\r\n6.002978999999998\r\n  0\r\nLINE\r\n  5\r\n401\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.925183\r\n 20\r\n6.027503\r\n 30\r\n0.0\r\n 11\r\n2.012647\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n402\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.152429999999998\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n2.210849\r\n 21\r\n5.899901999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n403\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.925183\r\n 20\r\n5.918417999999999\r\n 30\r\n0.0\r\n 11\r\n2.002116999999999\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n404\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.131067999999999\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n2.210849\r\n 21\r\n6.035187\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n407\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.165754999999998\r\n 20\r\n6.719113\r\n 30\r\n0.0\r\n 11\r\n1.165754999999998\r\n 21\r\n6.630874999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n411\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.868974\r\n 20\r\n6.761185\r\n 10\r\n1.922299\r\n 20\r\n6.761185\r\n  0\r\nLWPOLYLINE\r\n  5\r\n415\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.922299\r\n 20\r\n6.597127\r\n 10\r\n1.868974\r\n 20\r\n6.597127\r\n  0\r\nLINE\r\n  5\r\n416\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.83398\r\n 20\r\n6.841110999999998\r\n 30\r\n0.0\r\n 11\r\n1.868974\r\n 21\r\n6.761185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n417\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.868974\r\n 20\r\n6.761185\r\n 30\r\n0.0\r\n 11\r\n1.922299\r\n 21\r\n6.761185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n418\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.922299\r\n 20\r\n6.761185\r\n 30\r\n0.0\r\n 11\r\n1.957292999999999\r\n 21\r\n6.841110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n419\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.957292999999999\r\n 20\r\n6.521406999999999\r\n 30\r\n0.0\r\n 11\r\n1.922299\r\n 21\r\n6.597127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.868974\r\n 20\r\n6.597127\r\n 30\r\n0.0\r\n 11\r\n1.83398\r\n 21\r\n6.521406999999999\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n41B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.235615999999998\r\n 20\r\n6.761185\r\n 10\r\n2.28894\r\n 20\r\n6.761185\r\n  0\r\nLWPOLYLINE\r\n  5\r\n41C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.28894\r\n 20\r\n6.597127\r\n 10\r\n2.235615999999998\r\n 20\r\n6.597127\r\n  0\r\nLINE\r\n  5\r\n41D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.200620999999999\r\n 20\r\n6.841110999999998\r\n 30\r\n0.0\r\n 11\r\n2.235615999999998\r\n 21\r\n6.761185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.235615999999998\r\n 20\r\n6.761185\r\n 30\r\n0.0\r\n 11\r\n2.28894\r\n 21\r\n6.761185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n41F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.28894\r\n 20\r\n6.761185\r\n 30\r\n0.0\r\n 11\r\n2.323934999999999\r\n 21\r\n6.841110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n420\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.323934999999999\r\n 20\r\n6.521406999999999\r\n 30\r\n0.0\r\n 11\r\n2.28894\r\n 21\r\n6.597127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n421\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.235615999999998\r\n 20\r\n6.597127\r\n 30\r\n0.0\r\n 11\r\n2.200620999999999\r\n 21\r\n6.521406999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n426\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.546932999999999\r\n 20\r\n6.761185\r\n 30\r\n0.0\r\n 11\r\n1.581927\r\n 21\r\n6.841110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n427\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.581927\r\n 20\r\n6.521406999999999\r\n 30\r\n0.0\r\n 11\r\n1.546932999999999\r\n 21\r\n6.597127\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.569261999999999\r\n 20\r\n6.841110999999998\r\n 30\r\n0.0\r\n 11\r\n2.604256\r\n 21\r\n6.761185\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n42F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.604256\r\n 20\r\n6.597127\r\n 30\r\n0.0\r\n 11\r\n2.569261999999999\r\n 21\r\n6.521406999999999\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n431\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.604256\r\n 20\r\n6.761185\r\n 10\r\n2.642733\r\n 20\r\n6.761185\r\n 10\r\n2.642733\r\n 20\r\n6.716422\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3D3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.642733\r\n 20\r\n6.645997999999998\r\n 10\r\n2.642733\r\n 20\r\n6.597127\r\n 10\r\n2.604256\r\n 20\r\n6.597127\r\n  0\r\nLWPOLYLINE\r\n  5\r\n412\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.83398\r\n 20\r\n6.521406999999999\r\n 10\r\n1.581927\r\n 20\r\n6.521406999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n433\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.581927\r\n 20\r\n6.841110999999998\r\n 10\r\n1.83398\r\n 20\r\n6.841110999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n434\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.050577999999998\r\n 20\r\n6.521406999999999\r\n 10\r\n1.957292999999999\r\n 20\r\n6.521406999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n438\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.323934999999999\r\n 20\r\n6.841110999999998\r\n 10\r\n2.569261999999999\r\n 20\r\n6.841110999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n430\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.569261999999999\r\n 20\r\n6.521406999999999\r\n 10\r\n2.323934999999999\r\n 20\r\n6.521406999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n439\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.200620999999999\r\n 20\r\n6.521406999999999\r\n 10\r\n2.108791999999998\r\n 20\r\n6.521406999999999\r\n  0\r\nLINE\r\n  5\r\n2D5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.356290999999999\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n1.470920999999998\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.905634999999999\r\n 20\r\n6.002978999999998\r\n 30\r\n0.0\r\n 11\r\n1.925183\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3F0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.925183\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n1.905634999999999\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.470920999999998\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n1.356290999999999\r\n 21\r\n5.939549999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n406\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.905634999999999\r\n 20\r\n6.114967\r\n 30\r\n0.0\r\n 11\r\n1.905634999999999\r\n 21\r\n6.002978999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n43E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.905634999999999\r\n 20\r\n5.939549999999998\r\n 30\r\n0.0\r\n 11\r\n1.905634999999999\r\n 21\r\n5.841483\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.925183\r\n 20\r\n6.147992999999998\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n6.147992999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n440\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n6.147992999999998\r\n 30\r\n0.0\r\n 11\r\n2.210849\r\n 21\r\n6.147992999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n441\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.925183\r\n 20\r\n6.147992999999998\r\n 10\r\n1.925183\r\n 20\r\n6.485793\r\n 10\r\n2.050577999999998\r\n 20\r\n6.485793\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3EB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n5.939549999999998\r\n 10\r\n2.210849\r\n 20\r\n5.899901999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n435\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.108791999999998\r\n 20\r\n6.485793\r\n 10\r\n2.210849\r\n 20\r\n6.485793\r\n 10\r\n2.210849\r\n 20\r\n6.147992999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n444\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n6.035187\r\n 10\r\n2.210849\r\n 20\r\n6.002978999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n445\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.108791999999998\r\n 20\r\n6.114967\r\n 10\r\n2.131067999999999\r\n 20\r\n6.114967\r\n  0\r\nLWPOLYLINE\r\n  5\r\n43B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.470920999999998\r\n 20\r\n6.002978999999998\r\n 10\r\n1.470920999999998\r\n 20\r\n6.114967\r\n 10\r\n1.905634999999999\r\n 20\r\n6.114967\r\n  0\r\nLWPOLYLINE\r\n  5\r\n446\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.012647\r\n 20\r\n6.114967\r\n 10\r\n2.050577999999998\r\n 20\r\n6.114967\r\n  0\r\nLWPOLYLINE\r\n  5\r\n447\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.905634999999999\r\n 20\r\n5.841483\r\n 10\r\n1.470920999999998\r\n 20\r\n5.841483\r\n 10\r\n1.470920999999998\r\n 20\r\n5.939549999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n448\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.050577999999998\r\n 20\r\n5.841483\r\n 10\r\n2.002116999999999\r\n 20\r\n5.841483\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3F4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.631797999999998\r\n 20\r\n5.841483\r\n 10\r\n2.237594\r\n 20\r\n5.841483\r\n  0\r\nLWPOLYLINE\r\n  5\r\n449\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.152429999999998\r\n 20\r\n5.841483\r\n 10\r\n2.108791999999998\r\n 20\r\n5.841483\r\n  0\r\nLWPOLYLINE\r\n  5\r\n442\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.925183\r\n 20\r\n5.918417999999999\r\n 10\r\n1.925183\r\n 20\r\n5.939549999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n44A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.925183\r\n 20\r\n6.002978999999998\r\n 10\r\n1.925183\r\n 20\r\n6.027503\r\n  0\r\nLINE\r\n  5\r\n2F4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.210849\r\n 20\r\n5.807481\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n5.807481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n5.807481\r\n 30\r\n0.0\r\n 11\r\n1.925183\r\n 21\r\n5.807481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n436\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n6.147992999999998\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n437\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n6.147992999999998\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n6.114967\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n5.807481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n5.472367\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n5.456914\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n5.841483\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n5.807481\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n44F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n5.472367\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n5.456914\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n43A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.356290999999999\r\n 20\r\n5.939549999999998\r\n 10\r\n1.356290999999999\r\n 20\r\n5.524291\r\n 10\r\n1.214617\r\n 20\r\n5.524291\r\n  0\r\nLINE\r\n  5\r\n253\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.453427\r\n 20\r\n5.496596\r\n 30\r\n0.0\r\n 11\r\n1.214617\r\n 21\r\n5.496596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n451\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.146230999999998\r\n 20\r\n5.496596\r\n 30\r\n0.0\r\n 11\r\n0.8973459999999999\r\n 21\r\n5.496596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.214617\r\n 20\r\n5.496596\r\n 30\r\n0.0\r\n 11\r\n1.214617\r\n 21\r\n5.524291\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n452\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.214617\r\n 20\r\n6.41633\r\n 30\r\n0.0\r\n 11\r\n1.214617\r\n 21\r\n6.560417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.146230999999998\r\n 20\r\n6.529222999999999\r\n 30\r\n0.0\r\n 11\r\n1.146230999999998\r\n 21\r\n6.41633\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n453\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.146230999999998\r\n 20\r\n5.524291\r\n 30\r\n0.0\r\n 11\r\n1.146230999999998\r\n 21\r\n5.496596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n454\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n5.472367\r\n 30\r\n0.0\r\n 11\r\n1.925183\r\n 21\r\n5.472367\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n276\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.947722\r\n 20\r\n5.235732999999998\r\n 10\r\n1.947722\r\n 20\r\n5.456914\r\n 10\r\n2.050577999999998\r\n 20\r\n5.456914\r\n  0\r\nLWPOLYLINE\r\n  5\r\n443\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n5.807481\r\n 10\r\n2.210849\r\n 20\r\n5.472367\r\n  0\r\nLWPOLYLINE\r\n  5\r\n458\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n5.456914\r\n 10\r\n2.210849\r\n 20\r\n5.235732999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n457\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.210849\r\n 20\r\n5.456914\r\n 10\r\n2.108791999999998\r\n 20\r\n5.456914\r\n  0\r\nLINE\r\n  5\r\n2F5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.210849\r\n 20\r\n5.472367\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n5.472367\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n456\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.925183\r\n 20\r\n5.472367\r\n 10\r\n1.925183\r\n 20\r\n5.807481\r\n  0\r\nLINE\r\n  5\r\n2B2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n0.6511700000000002\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n0.6511700000000002\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n460\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.934619999999999\r\n 20\r\n7.572438\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.781322\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n45E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.572438\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.781322\r\n 10\r\n1.139782999999998\r\n 20\r\n7.781322\r\n  0\r\nLWPOLYLINE\r\n  5\r\n461\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.175679\r\n 20\r\n7.781322\r\n 10\r\n1.415836999999999\r\n 20\r\n7.781322\r\n  0\r\nLWPOLYLINE\r\n  5\r\n462\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.450026\r\n 20\r\n7.781322\r\n 10\r\n1.934619999999999\r\n 20\r\n7.781322\r\n  0\r\nLINE\r\n  5\r\n2CC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.781322\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.705807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n465\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.175679\r\n 20\r\n7.705807\r\n 30\r\n0.0\r\n 11\r\n1.175679\r\n 21\r\n7.781322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n466\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.415836999999999\r\n 20\r\n7.705807\r\n 30\r\n0.0\r\n 11\r\n1.415836999999999\r\n 21\r\n7.781322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n467\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.705807\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.781322\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.641708\r\n 30\r\n0.0\r\n 11\r\n1.175679\r\n 21\r\n7.641708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n468\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.415836999999999\r\n 20\r\n7.641708\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.641708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.705807\r\n 30\r\n0.0\r\n 11\r\n1.415836999999999\r\n 21\r\n7.705807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n469\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.175679\r\n 20\r\n7.705807\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.705807\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n464\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.641708\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.572438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n470\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.572438\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.641708\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n45D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.934619999999999\r\n 20\r\n7.572438\r\n 10\r\n1.852572\r\n 20\r\n7.572438\r\n  0\r\nLWPOLYLINE\r\n  5\r\n472\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.798727999999999\r\n 20\r\n7.572438\r\n 10\r\n1.450026\r\n 20\r\n7.572438\r\n  0\r\nLINE\r\n  5\r\n471\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n1.798727999999999\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n473\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.852572\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.798727999999999\r\n 20\r\n7.572438\r\n 30\r\n0.0\r\n 11\r\n1.798727999999999\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n474\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.798727999999999\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n1.798727999999999\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2D0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.852572\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n1.852572\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n475\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.852572\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n1.852572\r\n 21\r\n7.572438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n476\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.415836999999999\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.415836999999999\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n477\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.415836999999999\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.415836999999999\r\n 21\r\n7.641708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.175679\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.175679\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.175679\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.175679\r\n 21\r\n7.641708\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n46C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n46A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.139782999999998\r\n 20\r\n7.572438\r\n 10\r\n0.788516\r\n 20\r\n7.572438\r\n  0\r\nLWPOLYLINE\r\n  5\r\n47F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n0.729544\r\n 20\r\n7.572438\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.572438\r\n  0\r\nLINE\r\n  5\r\n459\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n0.729544\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n480\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.788516\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.6511700000000002\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n0.729544\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n481\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.788516\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n0.788516\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n482\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.729544\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n0.6511700000000002\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.729544\r\n 20\r\n7.572438\r\n 30\r\n0.0\r\n 11\r\n0.729544\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n483\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.729544\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n0.729544\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.788516\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n0.788516\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n484\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.788516\r\n 20\r\n7.52656\r\n 30\r\n0.0\r\n 11\r\n0.788516\r\n 21\r\n7.572438\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.175679\r\n 21\r\n7.169933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n486\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.175679\r\n 20\r\n7.118653999999998\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n47D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.169933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n487\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.139782999999998\r\n 20\r\n7.118653999999998\r\n 30\r\n0.0\r\n 11\r\n1.139782999999998\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n479\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n1.798727999999999\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n488\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.852572\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.303872\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n489\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.798727999999999\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.180502999999998\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.934619999999999\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n1.852572\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n7.259110999999998\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n7.169933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n7.118653999999998\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.934619999999999\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n485\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.415836999999999\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.169933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.934619999999999\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n7.169933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2CE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n7.118653999999998\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.118653999999998\r\n 30\r\n0.0\r\n 11\r\n1.415836999999999\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.118653999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.450026\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n48C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.934619999999999\r\n 20\r\n7.169933\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.259110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n490\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.934619999999999\r\n 20\r\n7.303872\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.52656\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n491\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.450026\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.934619999999999\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2B9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.447461999999999\r\n 20\r\n7.01353\r\n 30\r\n0.0\r\n 11\r\n1.685913\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n494\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.708988999999999\r\n 20\r\n7.01353\r\n 30\r\n0.0\r\n 11\r\n1.950004\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.685913\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.685913\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n496\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.685913\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.685913\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.708988999999999\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.708988999999999\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n497\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.708988999999999\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.708988999999999\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.950004\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.950004\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n498\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.950004\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.950004\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2C3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n499\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.950004\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.708988999999999\r\n 21\r\n6.869946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.685913\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.447461999999999\r\n 21\r\n6.869946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n6.921225999999998\r\n 30\r\n0.0\r\n 11\r\n1.950004\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.950004\r\n 21\r\n6.967378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49D\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.708988999999999\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.685913\r\n 21\r\n6.967378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.447461999999999\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.359099999999999\r\n 21\r\n6.967378\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49C\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.708988999999999\r\n 20\r\n6.921225999999998\r\n 30\r\n0.0\r\n 11\r\n1.685913\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n49F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.447461999999999\r\n 20\r\n6.921225999999998\r\n 30\r\n0.0\r\n 11\r\n1.359099999999999\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n492\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n2.180502999999998\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n493\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.978208\r\n 20\r\n7.01353\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n7.01353\r\n 30\r\n0.0\r\n 11\r\n2.178199\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n400\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.178199\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n6.869946\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.978208\r\n 21\r\n6.869946\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n410\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.957292999999999\r\n 20\r\n6.841110999999998\r\n 10\r\n2.050577999999998\r\n 20\r\n6.841110999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4A5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.108791999999998\r\n 20\r\n6.841110999999998\r\n 10\r\n2.200620999999999\r\n 20\r\n6.841110999999998\r\n  0\r\nLINE\r\n  5\r\n2AF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.42334\r\n 20\r\n6.716422\r\n 30\r\n0.0\r\n 11\r\n1.506941\r\n 21\r\n6.716422\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n6.841110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.050577999999998\r\n 20\r\n6.521406999999999\r\n 30\r\n0.0\r\n 11\r\n2.050577999999998\r\n 21\r\n6.485793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n6.841110999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4A8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.108791999999998\r\n 20\r\n6.521406999999999\r\n 30\r\n0.0\r\n 11\r\n2.108791999999998\r\n 21\r\n6.485793\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2BD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.447461999999999\r\n 20\r\n6.869946\r\n 30\r\n0.0\r\n 11\r\n1.447461999999999\r\n 21\r\n6.921225999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.447461999999999\r\n 20\r\n6.967378\r\n 30\r\n0.0\r\n 11\r\n1.447461999999999\r\n 21\r\n7.01353\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4B2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.335906999999999\r\n 20\r\n7.00008\r\n 10\r\n1.359099999999999\r\n 20\r\n7.00008\r\n 10\r\n1.359099999999999\r\n 20\r\n6.967378\r\n  0\r\nLINE\r\n  5\r\n47E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.175679\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.266328\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.335906999999999\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.415836999999999\r\n 21\r\n7.035305999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4B0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.359099999999999\r\n 20\r\n6.921225999999998\r\n 10\r\n1.359099999999999\r\n 20\r\n6.884114999999998\r\n 10\r\n1.335906999999999\r\n 20\r\n6.884114999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4B4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.266328\r\n 20\r\n6.884114999999998\r\n 10\r\n1.229219\r\n 20\r\n6.884114999999998\r\n 10\r\n1.229219\r\n 20\r\n7.00008\r\n 10\r\n1.266328\r\n 20\r\n7.00008\r\n  0\r\nLINE\r\n  5\r\n45A\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.266328\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.266328\r\n 21\r\n7.00008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.266328\r\n 20\r\n6.884114999999998\r\n 30\r\n0.0\r\n 11\r\n1.266328\r\n 21\r\n6.819685999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n45B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.335906999999999\r\n 20\r\n7.035305999999998\r\n 30\r\n0.0\r\n 11\r\n1.335906999999999\r\n 21\r\n7.00008\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.335906999999999\r\n 20\r\n6.884114999999998\r\n 30\r\n0.0\r\n 11\r\n1.335906999999999\r\n 21\r\n6.803855\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.212377\r\n 20\r\n6.786131\r\n 30\r\n0.0\r\n 11\r\n1.222574999999998\r\n 21\r\n6.775933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.176703\r\n 20\r\n6.750457\r\n 30\r\n0.0\r\n 11\r\n1.186900999999998\r\n 21\r\n6.740259\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4B9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.211170999999998\r\n 20\r\n6.563863999999998\r\n 30\r\n0.0\r\n 11\r\n1.221967999999999\r\n 21\r\n6.574660999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.176217\r\n 20\r\n6.598816999999998\r\n 30\r\n0.0\r\n 11\r\n1.187014999999999\r\n 21\r\n6.609614999999998\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n413\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.546932999999999\r\n 20\r\n6.597127\r\n 10\r\n1.506941\r\n 20\r\n6.597127\r\n 10\r\n1.506941\r\n 20\r\n6.645997999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4BB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.506941\r\n 20\r\n6.716422\r\n 10\r\n1.506941\r\n 20\r\n6.761185\r\n 10\r\n1.546932999999999\r\n 20\r\n6.761185\r\n  0\r\nLINE\r\n  5\r\n312\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.159428\r\n 20\r\n6.615605999999998\r\n 30\r\n0.0\r\n 11\r\n1.176217\r\n 21\r\n6.598816999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.211170999999998\r\n 20\r\n6.563863999999998\r\n 30\r\n0.0\r\n 11\r\n1.214617\r\n 21\r\n6.560417\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n311\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.165754999999998\r\n 20\r\n6.630874999999998\r\n 30\r\n0.0\r\n 11\r\n1.187014999999999\r\n 21\r\n6.609614999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.221967999999999\r\n 20\r\n6.574660999999998\r\n 30\r\n0.0\r\n 11\r\n1.232613999999998\r\n 21\r\n6.564016\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n30F\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.266328\r\n 20\r\n6.819685999999999\r\n 30\r\n0.0\r\n 11\r\n1.222574999999998\r\n 21\r\n6.775933\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.186900999999998\r\n 20\r\n6.740259\r\n 30\r\n0.0\r\n 11\r\n1.165754999999998\r\n 21\r\n6.719113\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n310\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.229014999999998\r\n 20\r\n6.802769\r\n 30\r\n0.0\r\n 11\r\n1.212377\r\n 21\r\n6.786131\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4BF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.176703\r\n 20\r\n6.750457\r\n 30\r\n0.0\r\n 11\r\n1.159428\r\n 21\r\n6.733183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n314\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.106638999999999\r\n 20\r\n6.821964999999998\r\n 30\r\n0.0\r\n 11\r\n1.106638999999999\r\n 21\r\n6.807567999999997\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.106638999999999\r\n 20\r\n6.761977\r\n 30\r\n0.0\r\n 11\r\n1.106638999999999\r\n 21\r\n6.733183\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n308\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.8774840000000001\r\n 20\r\n6.683991999999999\r\n 30\r\n0.0\r\n 11\r\n0.954269\r\n 21\r\n6.683991999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.003459\r\n 20\r\n6.683991999999999\r\n 30\r\n0.0\r\n 11\r\n1.071845999999998\r\n 21\r\n6.683991999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n309\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.071845999999998\r\n 20\r\n6.663596\r\n 30\r\n0.0\r\n 11\r\n1.003459\r\n 21\r\n6.663596\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4C3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n0.954269\r\n 20\r\n6.663596\r\n 30\r\n0.0\r\n 11\r\n0.8774840000000001\r\n 21\r\n6.663596\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4C4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n0.8774840000000001\r\n 20\r\n6.683991999999999\r\n 10\r\n0.8774840000000001\r\n 20\r\n6.831563\r\n 10\r\n1.071845999999998\r\n 20\r\n6.831563\r\n 10\r\n1.071845999999998\r\n 20\r\n6.807567999999997\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4C1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.071845999999998\r\n 20\r\n6.761977\r\n 10\r\n1.071845999999998\r\n 20\r\n6.683991999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4C5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.071845999999998\r\n 20\r\n6.663596\r\n 10\r\n1.071845999999998\r\n 20\r\n6.579613\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4C6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.071845999999998\r\n 20\r\n6.529222999999999\r\n 10\r\n1.071845999999998\r\n 20\r\n6.432042\r\n 10\r\n0.8774840000000001\r\n 20\r\n6.432042\r\n 10\r\n0.8774840000000001\r\n 20\r\n6.663596\r\n  0\r\nLINE\r\n  5\r\n31B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.071845999999998\r\n 20\r\n6.579613\r\n 30\r\n0.0\r\n 11\r\n1.113837\r\n 21\r\n6.579613\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n31E\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n1.113837\r\n 20\r\n6.615605999999998\r\n 30\r\n0.0\r\n 11\r\n1.113837\r\n 21\r\n6.579613\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n450\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.146230999999998\r\n 20\r\n5.524291\r\n 10\r\n0.9827949999999999\r\n 20\r\n5.524291\r\n 10\r\n0.9827949999999999\r\n 20\r\n6.41633\r\n 10\r\n1.146230999999998\r\n 20\r\n6.41633\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4C9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n1.214617\r\n 20\r\n6.41633\r\n 10\r\n1.356290999999999\r\n 20\r\n6.41633\r\n 10\r\n1.356290999999999\r\n 20\r\n6.002978999999998\r\n  0\r\nLINE\r\n  5\r\n4CA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.699643999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n2.720638999999998\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n279\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.248133999999998\r\n 20\r\n5.235732999999998\r\n 10\r\n2.248133999999998\r\n 20\r\n5.44413\r\n 10\r\n2.552807\r\n 20\r\n5.44413\r\n 10\r\n2.552807\r\n 20\r\n5.340262999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4CB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.552807\r\n 20\r\n5.273177999999998\r\n 10\r\n2.552807\r\n 20\r\n4.973271999999998\r\n 10\r\n2.248133999999998\r\n 20\r\n4.973271999999998\r\n 10\r\n2.248133999999998\r\n 20\r\n5.177674999999998\r\n  0\r\nLINE\r\n  5\r\n286\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.699643999999998\r\n 20\r\n5.155383\r\n 30\r\n0.0\r\n 11\r\n2.699643999999998\r\n 21\r\n5.273177999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.699643999999998\r\n 20\r\n5.340262999999998\r\n 30\r\n0.0\r\n 11\r\n2.699643999999998\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n3FA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.720638999999998\r\n 20\r\n5.472367\r\n 30\r\n0.0\r\n 11\r\n2.720638999999998\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.720638999999998\r\n 20\r\n5.155383\r\n 30\r\n0.0\r\n 11\r\n2.720638999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.789536999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n2.789536999999998\r\n 21\r\n5.155383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.789536999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n2.789536999999998\r\n 21\r\n5.472367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.581479\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n2.720638999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4CF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.699643999999998\r\n 20\r\n5.155383\r\n 30\r\n0.0\r\n 11\r\n2.720638999999998\r\n 21\r\n5.155383\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4D2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.859698999999998\r\n 20\r\n5.675683999999998\r\n 10\r\n2.859698999999998\r\n 20\r\n5.939549999999998\r\n  0\r\nLWPOLYLINE\r\n  5\r\n3B5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.242329\r\n 20\r\n5.939549999999998\r\n 10\r\n3.242329\r\n 20\r\n5.675683999999998\r\n  0\r\nLINE\r\n  5\r\n4D4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.927222\r\n 20\r\n5.654929\r\n 30\r\n0.0\r\n 11\r\n2.927222\r\n 21\r\n5.675683999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.177306999999998\r\n 20\r\n5.654929\r\n 30\r\n0.0\r\n 11\r\n3.177306999999998\r\n 21\r\n5.675683999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.177306999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n3.177306999999998\r\n 21\r\n5.472367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.927222\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n2.927222\r\n 21\r\n5.472367\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2EB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.859698999999998\r\n 20\r\n5.675683999999998\r\n 30\r\n0.0\r\n 11\r\n2.927222\r\n 21\r\n5.675683999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n28B\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.859698999999998\r\n 20\r\n5.654929\r\n 30\r\n0.0\r\n 11\r\n2.927222\r\n 21\r\n5.654929\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.177306999999998\r\n 20\r\n5.675683999999998\r\n 30\r\n0.0\r\n 11\r\n3.242329\r\n 21\r\n5.675683999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4DD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.177306999999998\r\n 20\r\n5.654929\r\n 30\r\n0.0\r\n 11\r\n3.242329\r\n 21\r\n5.654929\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4D3\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.242329\r\n 20\r\n5.654929\r\n 10\r\n3.242329\r\n 20\r\n5.472367\r\n 10\r\n3.177306999999998\r\n 20\r\n5.472367\r\n  0\r\nLINE\r\n  5\r\n4DF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.177306999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n3.404884999999998\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4E0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        3\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.927222\r\n 20\r\n5.472367\r\n 10\r\n2.859698999999998\r\n 20\r\n5.472367\r\n 10\r\n2.859698999999998\r\n 20\r\n5.654929\r\n  0\r\nLINE\r\n  5\r\n3FD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.789536999999998\r\n 20\r\n5.44413\r\n 30\r\n0.0\r\n 11\r\n2.927222\r\n 21\r\n5.44413\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.938502\r\n 20\r\n4.818522999999999\r\n 30\r\n0.0\r\n 11\r\n2.938502\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4E7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.167405\r\n 20\r\n4.818522999999999\r\n 30\r\n0.0\r\n 11\r\n3.167405\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n283\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.581479\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n2.907386999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4EB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.927222\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n2.977863999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4EC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.126770999999998\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n3.177306999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4ED\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.195667999999998\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n3.521799999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4EE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.195667999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n3.521799999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D0\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.789536999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n2.907386999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n289\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.177306999999998\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n3.177306999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n288\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.927222\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n2.927222\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4D1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.789536999999998\r\n 20\r\n5.155383\r\n 30\r\n0.0\r\n 11\r\n2.977863999999998\r\n 21\r\n5.155383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F4\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.126770999999998\r\n 20\r\n5.155383\r\n 30\r\n0.0\r\n 11\r\n3.404884999999998\r\n 21\r\n5.155383\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4EF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.927222\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n2.977863999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F5\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.126770999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n3.177306999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F1\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.977863999999998\r\n 20\r\n5.155383\r\n 30\r\n0.0\r\n 11\r\n2.977863999999998\r\n 21\r\n5.133570999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F6\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.977863999999998\r\n 20\r\n4.909673999999998\r\n 30\r\n0.0\r\n 11\r\n2.977863999999998\r\n 21\r\n4.883771\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2F2\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.126770999999998\r\n 20\r\n4.883771\r\n 30\r\n0.0\r\n 11\r\n3.126770999999998\r\n 21\r\n4.909673999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4F7\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.126770999999998\r\n 20\r\n5.133570999999998\r\n 30\r\n0.0\r\n 11\r\n3.126770999999998\r\n 21\r\n5.155383\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4F8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.126770999999998\r\n 20\r\n4.883771\r\n 10\r\n3.318223\r\n 20\r\n4.883771\r\n 10\r\n3.318223\r\n 20\r\n4.818522999999999\r\n 10\r\n3.167405\r\n 20\r\n4.818522999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4F9\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.107829999999998\r\n 20\r\n4.818522999999999\r\n 10\r\n3.090943\r\n 20\r\n4.818522999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4FA\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n3.024554\r\n 20\r\n4.818522999999999\r\n 10\r\n3.007271999999998\r\n 20\r\n4.818522999999999\r\n  0\r\nLWPOLYLINE\r\n  5\r\n4FB\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n2.938502\r\n 20\r\n4.818522999999999\r\n 10\r\n2.774847999999998\r\n 20\r\n4.818522999999999\r\n 10\r\n2.774847999999998\r\n 20\r\n4.883771\r\n 10\r\n2.977863999999998\r\n 20\r\n4.883771\r\n  0\r\nLINE\r\n  5\r\n4E8\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n2.938502\r\n 20\r\n4.789642999999998\r\n 30\r\n0.0\r\n 11\r\n3.007271999999998\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FC\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.024554\r\n 20\r\n4.789642999999998\r\n 30\r\n0.0\r\n 11\r\n3.090943\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FD\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.107829999999998\r\n 20\r\n4.789642999999998\r\n 30\r\n0.0\r\n 11\r\n3.167405\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FE\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.007271999999998\r\n 20\r\n4.818522999999999\r\n 30\r\n0.0\r\n 11\r\n3.007271999999998\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n4FF\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.024554\r\n 20\r\n4.818522999999999\r\n 30\r\n0.0\r\n 11\r\n3.024554\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n500\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.090943\r\n 20\r\n4.818522999999999\r\n 30\r\n0.0\r\n 11\r\n3.090943\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n501\r\n330\r\n518\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n100\r\nAcDbLine\r\n 10\r\n3.107829999999998\r\n 20\r\n4.818522999999999\r\n 30\r\n0.0\r\n 11\r\n3.107829999999998\r\n 21\r\n4.789642999999998\r\n 31\r\n0.0\r\n  0\r\nVIEWPORT\r\n  5\r\n5CD\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n5CE\r\n102\r\n}\r\n330\r\n5BC\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n 62\r\n     7\r\n370\r\n    -3\r\n348\r\n58B\r\n100\r\nAcDbViewport\r\n 10\r\n5.680555208461489\r\n 20\r\n3.965277934637595\r\n 30\r\n0.0\r\n 40\r\n12.37272182674859\r\n 41\r\n8.867483582758532\r\n 68\r\n     1\r\n 69\r\n     1\r\n 12\r\n5.680555208461489\r\n 22\r\n3.965277934637595\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 14\r\n10.0\r\n 24\r\n10.0\r\n 15\r\n10.0\r\n 25\r\n10.0\r\n 16\r\n0.0\r\n 26\r\n0.0\r\n 36\r\n1.0\r\n 17\r\n0.0\r\n 27\r\n0.0\r\n 37\r\n0.0\r\n 42\r\n50.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n8.867483582758532\r\n 50\r\n0.0\r\n 51\r\n0.0\r\n 72\r\n   100\r\n 90\r\n   819232\r\n  1\r\n\r\n281\r\n     0\r\n 71\r\n     1\r\n 74\r\n     0\r\n110\r\n0.0\r\n120\r\n0.0\r\n130\r\n0.0\r\n111\r\n1.0\r\n121\r\n0.0\r\n131\r\n0.0\r\n112\r\n0.0\r\n122\r\n1.0\r\n132\r\n0.0\r\n 79\r\n     0\r\n146\r\n0.0\r\n170\r\n     0\r\n 61\r\n     5\r\n292\r\n     1\r\n282\r\n     1\r\n141\r\n0.0\r\n142\r\n0.0\r\n 63\r\n   250\r\n421\r\n  3355443\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nOBJECTS\r\n  0\r\nDICTIONARY\r\n  5\r\n524\r\n330\r\n0\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nACAD_CIP_PREVIOUS_PRODUCT_INFO\r\n350\r\n5BB\r\n  3\r\nACAD_COLOR\r\n350\r\n59E\r\n  3\r\nACAD_DETAILVIEWSTYLE\r\n350\r\n5B7\r\n  3\r\nACAD_GROUP\r\n350\r\n525\r\n  3\r\nACAD_LAYOUT\r\n350\r\n532\r\n  3\r\nACAD_MATERIAL\r\n350\r\n56C\r\n  3\r\nACAD_MLEADERSTYLE\r\n350\r\n5B3\r\n  3\r\nACAD_MLINESTYLE\r\n350\r\n52F\r\n  3\r\nACAD_PLOTSETTINGS\r\n350\r\n531\r\n  3\r\nACAD_PLOTSTYLENAME\r\n350\r\n526\r\n  3\r\nACAD_SCALELIST\r\n350\r\n5A1\r\n  3\r\nACAD_SECTIONVIEWSTYLE\r\n350\r\n5B5\r\n  3\r\nACAD_TABLESTYLE\r\n350\r\n59F\r\n  3\r\nACAD_VISUALSTYLE\r\n350\r\n585\r\n  3\r\nACDB_RECOMPOSE_DATA\r\n350\r\n608\r\n  3\r\nAcDbVariableDictionary\r\n350\r\n5E0\r\n  3\r\nAcDsDecomposeData\r\n350\r\n60E\r\n  0\r\nDICTIONARY\r\n  5\r\n5C3\r\n330\r\n51A\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_LAYERSTATES\r\n360\r\n5C4\r\n  0\r\nDICTIONARY\r\n  5\r\n5D5\r\n330\r\n6\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nADSK_XREC_LAYER_RECONCILED\r\n360\r\n5D6\r\n  0\r\nDICTIONARY\r\n  5\r\n5D7\r\n330\r\n293\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nADSK_XREC_LAYER_RECONCILED\r\n360\r\n5D8\r\n  0\r\nDICTIONARY\r\n  5\r\n5CE\r\n330\r\n5CD\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nASDK_XREC_ANNOTATION_SCALE_INFO\r\n360\r\n5CF\r\n  0\r\nXRECORD\r\n  5\r\n5BB\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n300\r\nACDMAC\r\n300\r\n2018\r\n300\r\nACDMAC_F_S\r\n  0\r\nDICTIONARY\r\n  5\r\n59E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n5B7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nImperial24\r\n350\r\n5B8\r\n  0\r\nDICTIONARY\r\n  5\r\n525\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n532\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n\r\n350\r\n569\r\n  3\r\nDefault\r\n350\r\n4A\r\n  3\r\nLayout1\r\n350\r\n5BD\r\n  0\r\nDICTIONARY\r\n  5\r\n56C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nByBlock\r\n350\r\n575\r\n  3\r\nByLayer\r\n350\r\n56D\r\n  3\r\nGlobal\r\n350\r\n57D\r\n  0\r\nDICTIONARY\r\n  5\r\n5B3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n5B4\r\n  0\r\nDICTIONARY\r\n  5\r\n52F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nSTANDARD\r\n350\r\n530\r\n  0\r\nDICTIONARY\r\n  5\r\n531\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nACDBDICTIONARYWDFLT\r\n  5\r\n526\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nNormal\r\n350\r\n527\r\n100\r\nAcDbDictionaryWithDefault\r\n340\r\n527\r\n  0\r\nDICTIONARY\r\n  5\r\n5A1\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nA0\r\n350\r\n5A2\r\n  3\r\nA1\r\n350\r\n5A3\r\n  3\r\nA2\r\n350\r\n5A4\r\n  3\r\nA3\r\n350\r\n5A5\r\n  3\r\nA4\r\n350\r\n5A6\r\n  3\r\nA5\r\n350\r\n5A7\r\n  3\r\nA6\r\n350\r\n5A8\r\n  3\r\nA7\r\n350\r\n5A9\r\n  3\r\nA8\r\n350\r\n5AA\r\n  3\r\nA9\r\n350\r\n5AB\r\n  3\r\nB0\r\n350\r\n5AC\r\n  3\r\nB1\r\n350\r\n5AD\r\n  3\r\nB2\r\n350\r\n5AE\r\n  3\r\nB3\r\n350\r\n5AF\r\n  3\r\nB4\r\n350\r\n5B0\r\n  3\r\nB5\r\n350\r\n5B1\r\n  3\r\nB6\r\n350\r\n5B2\r\n  0\r\nDICTIONARY\r\n  5\r\n5B5\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nImperial24\r\n350\r\n5B6\r\n  0\r\nDICTIONARY\r\n  5\r\n59F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n5A0\r\n  0\r\nDICTIONARY\r\n  5\r\n585\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n2dWireframe\r\n350\r\n58B\r\n  3\r\nBasic\r\n350\r\n58A\r\n  3\r\nBrighten\r\n350\r\n591\r\n  3\r\nColorChange\r\n350\r\n595\r\n  3\r\nConceptual\r\n350\r\n58E\r\n  3\r\nDim\r\n350\r\n590\r\n  3\r\nEdgeColorOff\r\n350\r\n59D\r\n  3\r\nFacepattern\r\n350\r\n594\r\n  3\r\nFlat\r\n350\r\n586\r\n  3\r\nFlatWithEdges\r\n350\r\n587\r\n  3\r\nGouraud\r\n350\r\n588\r\n  3\r\nGouraudWithEdges\r\n350\r\n589\r\n  3\r\nHidden\r\n350\r\n58D\r\n  3\r\nJitterOff\r\n350\r\n59B\r\n  3\r\nLinepattern\r\n350\r\n593\r\n  3\r\nOverhangOff\r\n350\r\n59C\r\n  3\r\nRealistic\r\n350\r\n58F\r\n  3\r\nShaded\r\n350\r\n59A\r\n  3\r\nShaded with edges\r\n350\r\n599\r\n  3\r\nShades of Gray\r\n350\r\n596\r\n  3\r\nSketchy\r\n350\r\n597\r\n  3\r\nThicken\r\n350\r\n592\r\n  3\r\nWireframe\r\n350\r\n58C\r\n  3\r\nX-Ray\r\n350\r\n598\r\n  0\r\nXRECORD\r\n  5\r\n608\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 90\r\n        1\r\n330\r\n5A0\r\n  0\r\nDICTIONARY\r\n  5\r\n5E0\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nCANNOSCALE\r\n350\r\n5E6\r\n  3\r\nCMLEADERSTYLE\r\n350\r\n5E2\r\n  3\r\nCTABLESTYLE\r\n350\r\n5E1\r\n  3\r\nCVIEWDETAILSTYLE\r\n350\r\n5E3\r\n  3\r\nCVIEWSECTIONSTYLE\r\n350\r\n5E4\r\n  3\r\nLAYEREVAL\r\n350\r\n5E8\r\n  3\r\nLAYERNOTIFY\r\n350\r\n5E9\r\n  3\r\nLIGHTINGUNITS\r\n350\r\n5E7\r\n  3\r\nMSLTSCALE\r\n350\r\n5E5\r\n  0\r\nDICTIONARY\r\n  5\r\n60E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n524\r\n102\r\n}\r\n330\r\n524\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nAcDsRecords\r\n350\r\n610\r\n  3\r\nAcDsSchemas\r\n350\r\n60F\r\n1001\r\nACAD\r\n1070\r\n     2\r\n  0\r\nDICTIONARY\r\n  5\r\n5C4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5C3\r\n102\r\n}\r\n330\r\n5C3\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n5D6\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5D5\r\n102\r\n}\r\n330\r\n5D5\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n290\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n5D8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5D7\r\n102\r\n}\r\n330\r\n5D7\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n290\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n5CF\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5CE\r\n102\r\n}\r\n330\r\n5CE\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 90\r\n        1\r\n340\r\n5A2\r\n  0\r\nACDBDETAILVIEWSTYLE\r\n  5\r\n5B8\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n613\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5B7\r\n102\r\n}\r\n330\r\n5B7\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nImperial24\r\n290\r\n     0\r\n100\r\nAcDbDetailViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n        3\r\n 71\r\n     1\r\n340\r\n529\r\n 62\r\n   256\r\n 40\r\n0.24\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n0.24\r\n300\r\n\r\n 40\r\n0.36\r\n280\r\n     3\r\n 71\r\n     2\r\n340\r\n52E\r\n 90\r\n       25\r\n 62\r\n   256\r\n 71\r\n     3\r\n340\r\n529\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 90\r\n        1\r\n 40\r\n0.75\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewType \\f \"%tc1\">% %<\\AcVar ViewDetailId>%\\PSCALE %<\\AcVar ViewScale \\f \"%sn\">%\r\n 71\r\n     4\r\n340\r\n52E\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n52E\r\n 90\r\n       25\r\n 62\r\n   256\r\n280\r\n     0\r\n  0\r\nLAYOUT\r\n  5\r\n569\r\n330\r\n532\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\n\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout\r\n 70\r\n     1\r\n 71\r\n     1\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n1.000000000000000E+20\r\n 24\r\n1.000000000000000E+20\r\n 34\r\n1.000000000000000E+20\r\n 15\r\n-1.000000000000000E+20\r\n 25\r\n-1.000000000000000E+20\r\n 35\r\n-1.000000000000000E+20\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n568\r\n  0\r\nLAYOUT\r\n  5\r\n4A\r\n330\r\n532\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\n\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n  1712\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     0\r\n  7\r\n\r\n 75\r\n     0\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nDefault\r\n 70\r\n     1\r\n 71\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n518\r\n331\r\n4B\r\n  0\r\nLAYOUT\r\n  5\r\n5BD\r\n102\r\n{ACAD_REACTORS\r\n330\r\n532\r\n102\r\n}\r\n330\r\n532\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nprint-UCL\r\n  4\r\niso-a4\r\n  6\r\n\r\n 40\r\n4.233333587646483\r\n 41\r\n4.233306884765625\r\n 42\r\n4.23333740234375\r\n 43\r\n4.23333740234375\r\n 44\r\n209.9027862548828\r\n 45\r\n297.0388793945312\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     1\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout1\r\n 70\r\n     1\r\n 71\r\n     2\r\n 10\r\n-0.1666668268639272\r\n 20\r\n-0.1666666766789955\r\n 11\r\n11.52777724378691\r\n 21\r\n8.097222545954187\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n1.000000000000000E+20\r\n 24\r\n1.000000000000000E+20\r\n 34\r\n1.000000000000000E+20\r\n 15\r\n-1.000000000000000E+20\r\n 25\r\n-1.000000000000000E+20\r\n 35\r\n-1.000000000000000E+20\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n5BC\r\n331\r\n5CD\r\n1001\r\nACAD_PSEXT\r\n1000\r\nprint-UCL\r\n1000\r\nXerox WorkCentre 7655, 3.81.1\r\n1000\r\nlocalhost\r\n1000\r\n\r\n1070\r\n     0\r\n  0\r\nMATERIAL\r\n  5\r\n575\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n576\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56C\r\n102\r\n}\r\n330\r\n56C\r\n100\r\nAcDbMaterial\r\n  1\r\nByBlock\r\n 72\r\n     0\r\n 43\r\n0.820209973753281\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.820209973753281\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.820209973753281\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.820209973753281\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.820209973753281\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.820209973753281\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.820209973753281\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.820209973753281\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.820209973753281\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.820209973753281\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.820209973753281\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.820209973753281\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMATERIAL\r\n  5\r\n56D\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n56E\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56C\r\n102\r\n}\r\n330\r\n56C\r\n100\r\nAcDbMaterial\r\n  1\r\nByLayer\r\n 72\r\n     0\r\n 43\r\n0.820209973753281\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.820209973753281\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.820209973753281\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.820209973753281\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.820209973753281\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.820209973753281\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.820209973753281\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.820209973753281\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.820209973753281\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.820209973753281\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.820209973753281\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.820209973753281\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMATERIAL\r\n  5\r\n57D\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n57E\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56C\r\n102\r\n}\r\n330\r\n56C\r\n100\r\nAcDbMaterial\r\n  1\r\nGlobal\r\n 72\r\n     0\r\n 43\r\n0.820209973753281\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.820209973753281\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 77\r\n     0\r\n 47\r\n0.820209973753281\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.820209973753281\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n0.0\r\n 47\r\n1.0\r\n171\r\n     0\r\n 49\r\n0.820209973753281\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.820209973753281\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n175\r\n     0\r\n142\r\n0.820209973753281\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.820209973753281\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n179\r\n     0\r\n144\r\n0.820209973753281\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.820209973753281\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n147\r\n0.820209973753281\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.820209973753281\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n0.0\r\n147\r\n1.0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n5B4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5B3\r\n102\r\n}\r\n330\r\n5B3\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n52C\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n0.09\r\n291\r\n     1\r\n 43\r\n0.36\r\n  3\r\nStandard\r\n 44\r\n0.18\r\n300\r\n\r\n342\r\n529\r\n174\r\n     1\r\n178\r\n     6\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n0.18\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n0.18\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     0\r\n143\r\n0.125\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLINESTYLE\r\n  5\r\n530\r\n102\r\n{ACAD_REACTORS\r\n330\r\n52F\r\n102\r\n}\r\n330\r\n52F\r\n100\r\nAcDbMlineStyle\r\n  2\r\nSTANDARD\r\n 70\r\n     0\r\n  3\r\n\r\n 62\r\n   256\r\n 51\r\n90.0\r\n 52\r\n90.0\r\n 71\r\n     2\r\n 49\r\n0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n 49\r\n-0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n  0\r\nACDBPLACEHOLDER\r\n  5\r\n527\r\n102\r\n{ACAD_REACTORS\r\n330\r\n526\r\n102\r\n}\r\n330\r\n526\r\n  0\r\nSCALE\r\n  5\r\n5A2\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:1\r\n140\r\n1.0\r\n141\r\n1.0\r\n290\r\n     1\r\n  0\r\nSCALE\r\n  5\r\n5A3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/128\" = 1'-0\"\r\n140\r\n0.0078125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5A4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/64\" = 1'-0\"\r\n140\r\n0.015625\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5A5\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/32\" = 1'-0\"\r\n140\r\n0.03125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5A6\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/16\" = 1'-0\"\r\n140\r\n0.0625\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5A7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/32\" = 1'-0\"\r\n140\r\n0.09375\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5A8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/8\" = 1'-0\"\r\n140\r\n0.125\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5A9\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/16\" = 1'-0\"\r\n140\r\n0.1875\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5AA\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/4\" = 1'-0\"\r\n140\r\n0.25\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5AB\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/8\" = 1'-0\"\r\n140\r\n0.375\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5AC\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1/2\" = 1'-0\"\r\n140\r\n0.5\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5AD\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3/4\" = 1'-0\"\r\n140\r\n0.75\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5AE\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1\" = 1'-0\"\r\n140\r\n1.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5AF\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1-1/2\" = 1'-0\"\r\n140\r\n1.5\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5B0\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n3\" = 1'-0\"\r\n140\r\n3.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5B1\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n6\" = 1'-0\"\r\n140\r\n6.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n5B2\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5A1\r\n102\r\n}\r\n330\r\n5A1\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1'-0\" = 1'-0\"\r\n140\r\n12.0\r\n141\r\n12.0\r\n290\r\n     0\r\n  0\r\nACDBSECTIONVIEWSTYLE\r\n  5\r\n5B6\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n611\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5B5\r\n102\r\n}\r\n330\r\n5B5\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nImperial24\r\n290\r\n     0\r\n100\r\nAcDbSectionViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n       78\r\n 71\r\n     1\r\n340\r\n529\r\n 62\r\n   256\r\n 40\r\n0.24\r\n340\r\n0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n0.24\r\n300\r\nI, O, Q, S, X, Z\r\n 40\r\n0.48\r\n 90\r\n        3\r\n 40\r\n0.18\r\n 90\r\n        1\r\n 71\r\n     2\r\n340\r\n52E\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n52E\r\n 90\r\n       50\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 40\r\n0.0\r\n 40\r\n0.24\r\n 71\r\n     3\r\n340\r\n529\r\n 62\r\n   256\r\n 40\r\n0.24\r\n 90\r\n        1\r\n 40\r\n0.75\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewType \\f \"%tc1\">% %<\\AcVar ViewSectionStartId>%-%<\\AcVar ViewSectionEndId>%\\PSCALE %<\\AcVar ViewScale \\f \"%sn\">%\r\n 71\r\n     4\r\n 62\r\n   256\r\n 62\r\n   257\r\n300\r\nANSI31\r\n 40\r\n1.0\r\n 90\r\n        0\r\n290\r\n     0\r\n290\r\n     0\r\n 90\r\n        6\r\n 40\r\n0.0\r\n 40\r\n1.570796326794896\r\n 40\r\n0.2617993877991494\r\n 40\r\n1.308996938995747\r\n 40\r\n-0.2617993877991494\r\n 40\r\n1.832595714594045\r\n  0\r\nTABLESTYLE\r\n  5\r\n5A0\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n5EA\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n59F\r\n102\r\n}\r\n330\r\n59F\r\n100\r\nAcDbTableStyle\r\n280\r\n     0\r\n  3\r\nStandard\r\n 70\r\n     0\r\n 71\r\n     0\r\n 40\r\n0.06\r\n 41\r\n0.06\r\n280\r\n     0\r\n281\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.18\r\n170\r\n     2\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.25\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n0.18\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n58B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\n2dWireframe\r\n 70\r\n     4\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n58A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBasic\r\n 70\r\n     7\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n591\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBrighten\r\n 70\r\n    12\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n595\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nColorChange\r\n 70\r\n    16\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n58E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nConceptual\r\n 70\r\n     9\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n179.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n590\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nDim\r\n 70\r\n    11\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n-50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n59D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nEdgeColorOff\r\n 70\r\n    22\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        8\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n594\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFacepattern\r\n 70\r\n    15\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n586\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlat\r\n 70\r\n     0\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n587\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlatWithEdges\r\n 70\r\n     1\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n588\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraud\r\n 70\r\n     2\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n589\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraudWithEdges\r\n 70\r\n     3\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n58D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nHidden\r\n 70\r\n     6\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n59B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nJitterOff\r\n 70\r\n    20\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n       10\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n593\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nLinepattern\r\n 70\r\n    14\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n59C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nOverhangOff\r\n 70\r\n    21\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        9\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 62\r\n    18\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n        3\r\n176\r\n     0\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n 90\r\n       50\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     0\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n58F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nRealistic\r\n 70\r\n     8\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n59A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded\r\n 70\r\n    27\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  7895160\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n599\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded with edges\r\n 70\r\n    26\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n596\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShades of Gray\r\n 70\r\n    23\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n597\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nSketchy\r\n 70\r\n    24\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n       11\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n592\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nThicken\r\n 70\r\n    13\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n       12\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n58C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nWireframe\r\n 70\r\n     5\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\n598\r\n102\r\n{ACAD_REACTORS\r\n330\r\n585\r\n102\r\n}\r\n330\r\n585\r\n100\r\nAcDbVisualStyle\r\n  2\r\nX-Ray\r\n 70\r\n    25\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.5\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n1001\r\nACAD\r\n1000\r\nAcDbSavedByObjectVersion\r\n1070\r\n     0\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E6\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1:1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E2\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E1\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nImperial24\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nImperial24\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E9\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n15\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5E5\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E0\r\n102\r\n}\r\n330\r\n5E0\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARY\r\n  5\r\n610\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60E\r\n102\r\n}\r\n330\r\n60E\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n60F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60E\r\n102\r\n}\r\n330\r\n60E\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n140648618144912\r\n350\r\n609\r\n  3\r\n140648618144928\r\n350\r\n60A\r\n  3\r\n140648618144944\r\n350\r\n60B\r\n  3\r\n140648618144960\r\n350\r\n60C\r\n  3\r\n140648618144976\r\n350\r\n60D\r\n  0\r\nDICTIONARY\r\n  5\r\n613\r\n330\r\n5B8\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_XREC_ROUNDTRIP\r\n360\r\n614\r\n  0\r\nDICTIONARY\r\n  5\r\n576\r\n330\r\n575\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n578\r\n  3\r\nDIFFUSETILE\r\n360\r\n577\r\n  3\r\nOPACITYTILE\r\n360\r\n57B\r\n  3\r\nREFLECTIONTILE\r\n360\r\n57A\r\n  3\r\nREFRACTIONTILE\r\n360\r\n57C\r\n  3\r\nSPECULARTILE\r\n360\r\n579\r\n  0\r\nDICTIONARY\r\n  5\r\n56E\r\n330\r\n56D\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n570\r\n  3\r\nDIFFUSETILE\r\n360\r\n56F\r\n  3\r\nOPACITYTILE\r\n360\r\n573\r\n  3\r\nREFLECTIONTILE\r\n360\r\n572\r\n  3\r\nREFRACTIONTILE\r\n360\r\n574\r\n  3\r\nSPECULARTILE\r\n360\r\n571\r\n  0\r\nDICTIONARY\r\n  5\r\n57E\r\n330\r\n57D\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n580\r\n  3\r\nDIFFUSETILE\r\n360\r\n57F\r\n  3\r\nOPACITYTILE\r\n360\r\n583\r\n  3\r\nREFLECTIONTILE\r\n360\r\n582\r\n  3\r\nREFRACTIONTILE\r\n360\r\n584\r\n  3\r\nSPECULARTILE\r\n360\r\n581\r\n  0\r\nDICTIONARY\r\n  5\r\n611\r\n330\r\n5B6\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_XREC_ROUNDTRIP\r\n360\r\n612\r\n  0\r\nDICTIONARY\r\n  5\r\n5EA\r\n330\r\n5A0\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP\r\n360\r\n607\r\n  0\r\nXRECORD\r\n  5\r\n609\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60F\r\n102\r\n}\r\n330\r\n60F\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n  1\r\nAcDb_Thumbnail_Schema\r\n102\r\n{ATTRRECORD\r\n341\r\n60A\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n291\r\n     1\r\n102\r\nATTRRECORD}\r\n102\r\n{ATTRRECORD\r\n341\r\n60B\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n291\r\n     1\r\n102\r\nATTRRECORD}\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n 91\r\n        8\r\n102\r\n{ATTRRECORD\r\n341\r\n60C\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n291\r\n     1\r\n102\r\nATTRRECORD}\r\n102\r\n{ATTRRECORD\r\n341\r\n60D\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n282\r\n     1\r\n102\r\nATTRRECORD}\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 91\r\n        0\r\n  0\r\nXRECORD\r\n  5\r\n60A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60F\r\n102\r\n}\r\n330\r\n60F\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n  1\r\nAcDbDs::TreatedAsObjectDataSchema\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nXRECORD\r\n  5\r\n60B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60F\r\n102\r\n}\r\n330\r\n60F\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n  1\r\nAcDbDs::LegacySchema\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nXRECORD\r\n  5\r\n60C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60F\r\n102\r\n}\r\n330\r\n60F\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n  1\r\nAcDbDs::IndexedPropertySchema\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nXRECORD\r\n  5\r\n60D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n60F\r\n102\r\n}\r\n330\r\n60F\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n  1\r\nAcDbDs::HandleAttributeSchema\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n 91\r\n        1\r\n284\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n614\r\n102\r\n{ACAD_REACTORS\r\n330\r\n613\r\n102\r\n}\r\n330\r\n613\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n102\r\nDISPLAYNAME\r\n  1\r\nImperial24\r\n102\r\nFLAGS\r\n 90\r\n        0\r\n  0\r\nXRECORD\r\n  5\r\n578\r\n102\r\n{ACAD_REACTORS\r\n330\r\n576\r\n102\r\n}\r\n330\r\n576\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n577\r\n102\r\n{ACAD_REACTORS\r\n330\r\n576\r\n102\r\n}\r\n330\r\n576\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n57B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n576\r\n102\r\n}\r\n330\r\n576\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n57A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n576\r\n102\r\n}\r\n330\r\n576\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n57C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n576\r\n102\r\n}\r\n330\r\n576\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n579\r\n102\r\n{ACAD_REACTORS\r\n330\r\n576\r\n102\r\n}\r\n330\r\n576\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n570\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56E\r\n102\r\n}\r\n330\r\n56E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n56F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56E\r\n102\r\n}\r\n330\r\n56E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n573\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56E\r\n102\r\n}\r\n330\r\n56E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n572\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56E\r\n102\r\n}\r\n330\r\n56E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n574\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56E\r\n102\r\n}\r\n330\r\n56E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n571\r\n102\r\n{ACAD_REACTORS\r\n330\r\n56E\r\n102\r\n}\r\n330\r\n56E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n580\r\n102\r\n{ACAD_REACTORS\r\n330\r\n57E\r\n102\r\n}\r\n330\r\n57E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n57F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n57E\r\n102\r\n}\r\n330\r\n57E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n583\r\n102\r\n{ACAD_REACTORS\r\n330\r\n57E\r\n102\r\n}\r\n330\r\n57E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n582\r\n102\r\n{ACAD_REACTORS\r\n330\r\n57E\r\n102\r\n}\r\n330\r\n57E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n584\r\n102\r\n{ACAD_REACTORS\r\n330\r\n57E\r\n102\r\n}\r\n330\r\n57E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n581\r\n102\r\n{ACAD_REACTORS\r\n330\r\n57E\r\n102\r\n}\r\n330\r\n57E\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n612\r\n102\r\n{ACAD_REACTORS\r\n330\r\n611\r\n102\r\n}\r\n330\r\n611\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n102\r\nDISPLAYNAME\r\n  1\r\nImperial24\r\n102\r\nFLAGS\r\n 90\r\n        0\r\n  0\r\nCELLSTYLEMAP\r\n  5\r\n607\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5EA\r\n102\r\n}\r\n330\r\n5EA\r\n100\r\nAcDbCellStyleMap\r\n 90\r\n        3\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n    32768\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n529\r\n144\r\n0.25\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.18\r\n 40\r\n0.18\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        1\r\n 91\r\n        1\r\n300\r\n_TITLE\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n529\r\n144\r\n0.18\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.18\r\n 40\r\n0.18\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        2\r\n 91\r\n        1\r\n300\r\n_HEADER\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        2\r\n 62\r\n     0\r\n340\r\n529\r\n144\r\n0.18\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.06\r\n 40\r\n0.18\r\n 40\r\n0.18\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n0\r\n 93\r\n        0\r\n 40\r\n0.045\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        3\r\n 91\r\n        2\r\n300\r\n_DATA\r\n309\r\nCELLSTYLE_END\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nACDSDATA\r\n 70\r\n     2\r\n 71\r\n     8\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        0\r\n  1\r\nAcDb_Thumbnail_Schema\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n 91\r\n        8\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 91\r\n        0\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        1\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        2\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        3\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        4\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n282\r\n     1\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        1\r\n  1\r\nAcDbDs::TreatedAsObjectDataSchema\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        2\r\n  1\r\nAcDbDs::LegacySchema\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        3\r\n  1\r\nAcDbDs::IndexedPropertySchema\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        4\r\n  1\r\nAcDbDs::HandleAttributeSchema\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n 91\r\n        1\r\n284\r\n     1\r\n  0\r\nACDSRECORD\r\n 90\r\n        0\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n320\r\n4A\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 94\r\n     1878\r\n310\r\n89504E470D0A1A0A0000000D4948445200000100000000AF08030000002591F0DB00000300504C5445212830FFFFFF2128300000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099\r\n310\r\n000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00\r\n310\r\n33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066\r\n310\r\nFF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00\r\n310\r\n33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333\r\n310\r\nFF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB\r\n310\r\nBBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF0000000000000000000000000000000000000000000000000000000000002E4550F1000004114944415478DAED9D5B82A4200C45D9FF1AEF62E6A7A7AA14F20023CF9B9F6E2D143C989044D0942814CAD9024592BA79FB715900DA4F5036DDA72100025816C055B35545DF12C080\r\n310\r\nD3100055804690000860802B2C78C41980B20FBCB62BFCD77DB0FB1575C7120055804690000880000880000880000880000880B100A34102D85F05167D541A6704B1A6492400022000C53E2A9BB92DAD028059A69B60D049D1BB4D04309B0AAC00E04D23480004300B007BA2E42762D047AEBAE0781A00BEA6A200ABB8B91F\r\n310\r\n80FF7740213A9637B702F0F3E76800D99DAD6D6E08605F4F9000A802838CE02DFC9D76F5C565180CF403CA9EC6B42913F8CBA2C1F3B41224AD52AA300240E994578F18624154DD7D8FBB2E3F059CBD932E0F07A09C03E2BED2CEBE00501BFEE546BDE804DB3A026FC1FE009426406E034E03F051EDFC37B82A42F2EE9C1440\r\n310\r\nD65D5F5B270C95B93DF1ED9C1640E6FA4538690B01C84B4638697D012016C02E02DD0FF8E96902380E006D8006E0B451E0DEDF48A70138DC11925DE1048F870B6FC1E983A13C8F704A3004B1BDB02F1652C165F2015A7B57CA08D55CBF1B80B74AFBCD3C8F7282C93CECB7634AA9FD4000B7A7E4526FCB5392D1D2BFEEC39C\r\n310\r\n659F00F0D588B226DDACAD95C0ADEAD59901187703AA2A0B0170539F17009829FAA1008C3B330080B3F6280082C16C8916BB01705D576BC1B66B2100028806A01A41C773CCF5013CA8682B002DC30D01500508800008E07800F7A413019C05C09FE7EB09A09812D31746C601908EEA08E05BCC1F0135565491EA0E07602C76\r\n310\r\nFDBB03B4A27645AE6470A17D3565DB01B8524E70C2170094FFD7F625E119485F003FB501070280DD9E570160300034D4DD04A02AA544008100AC6735EE3BD57A2E3029809D840086AB8016C39C60048DC9176B02C82755BE0460563F20F95EB6F01E80341500DD15DE14C06D51CDA600CC094B1F6DD4CA25FF0CB4C9C2E198\r\n310\r\n84880E60EA8448654A2CA92B65F74A8949A97A6D5AEA5E49D18E00D6498B13C05B00BCC7100001CC0DA0F05E1610005580000880000880008602085B30311E40D3820947666B1500792ACEDDF9E5E57C0B02D0A72C55D68EE08C50B32758B16C0E5517D40E2009002CD5426DEF977BB53300F37B2CE52CEDE768C92009C51D\r\n310\r\n776EE3B70A9A01D80A0DF9E4A833ABA5C587F69EEF3B20098000088000260150E789CAC5570510260440151806406ED32146105275191425D25A18C043D58D0210DF24022000DA80A7006A46815BAA4D0AEAF703507AC5D715802BFBB13000EB30B8BABB02407D46C8F935B1C500C47CDB73108087B140E040828A2B218049\r\n310\r\n548000088000DE01E078596A72B9341E008F3EB3F40E80A8D0C305606083570710FCF1B6E7E7EB0C603E114C87110CA52D057A389CB6173CF8950008602B1BF0CD91354CE4DB6E6448140A85D255FE018C226AD45137F4BE0000000049454E44AE426082\r\n  0\r\nACDSRECORD\r\n 90\r\n        0\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n320\r\n5BD\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 94\r\n     1136\r\n310\r\n89504E470D0A1A0A0000000D4948445200000100000000B408030000004C80028300000300504C5445FFFFFF0000000000000000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099\r\n310\r\n000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00\r\n310\r\n33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066\r\n310\r\nFF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00\r\n310\r\n33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333\r\n310\r\nFF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB\r\n310\r\nBBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF00000000000000000000000000000000000000000000000000000000000056B0F76B0000012B4944415478DAEDD5B10DC0201004C1EFBF4C628A30929DD080939D17A2800D6E66C76FF6844F0001DE00EBBC73B1FF0ED0BB7C8011203E824B002328801114C0080A600405308202\r\n310\r\n50C006082000052840011B20800014A000056C80000250800214B001020840010A50C006082000052840011B20800014A000056C80000250800214B001020840010A50C006082000052840011B20800014A000056C80000250800214B001020840010A50C006082000052840011B20800014A000056C80000250800214B001\r\n310\r\n020840010A50C006082000052840011B20800014A000056C80000250800214B001020840010A50C006082000052840011B20800014A000056C80000250800214B001020840010A50C006082000052840011B20C06F01CEF5FEFA060820C017207EF9000FEEB63A2E11E155860000000049454E44AE426082\r\n  0\r\nENDSEC\r\n  0\r\nEOF\r\n"
  },
  {
    "path": "testdata/gallery_connected_merge_links.txt",
    "content": "x1\ty1\tx2\ty2\n1.32\t7.24\t4.88\t5.24\n1.16\t5.28\t3.28\t7.12"
  },
  {
    "path": "testdata/gallery_graph_vga.txt",
    "content": "Ref\tx\ty\tConnectivity\tPoint First Moment\tPoint Second Moment\n65592\t0.68\t7.04\t91\t28.691513\t11.32\n65593\t0.68\t7.08\t102\t38.375195\t22.076799\n65594\t0.68\t7.12\t135\t73.011009\t62.731201\n65595\t0.68\t7.16\t136\t72.054672\t61.1968\n65596\t0.68\t7.2\t106\t42.236126\t26.406401\n65597\t0.68\t7.24\t84\t27.227448\t11.824\n65599\t0.68\t7.32\t81\t22.344883\t7.3119998\n65600\t0.68\t7.36\t89\t23.430403\t7.4815998\n65601\t0.68\t7.4\t91\t23.329962\t7.2992001\n65602\t0.68\t7.44\t90\t23.028296\t7.2096\n65603\t0.68\t7.48\t84\t22.413893\t7.2863998\n65604\t0.68\t7.52\t82\t23.040989\t7.7199998\n65606\t0.68\t7.6\t87\t38.340282\t26.313601\n65607\t0.68\t7.64\t97\t44.365986\t32.124802\n65608\t0.68\t7.68\t108\t51.783161\t38.5056\n65609\t0.68\t7.72\t109\t53.244698\t39.591999\n65610\t0.68\t7.76\t95\t38.697723\t23.264\n131128\t0.72\t7.04\t102\t32.769993\t13.744\n131129\t0.72\t7.08\t113\t40.958103\t22.486401\n131130\t0.72\t7.12\t145\t73.255661\t59.785599\n131131\t0.72\t7.16\t143\t70.484398\t57.271999\n131132\t0.72\t7.2\t115\t40.43277\t22.9568\n131133\t0.72\t7.24\t100\t27.023703\t9.5056\n131135\t0.72\t7.32\t96\t23.956745\t7.1680002\n131136\t0.72\t7.36\t100\t23.603025\t6.7919998\n131137\t0.72\t7.4\t99\t23.024195\t6.5760002\n131138\t0.72\t7.44\t101\t23.552282\t6.744\n131139\t0.72\t7.48\t99\t23.681519\t6.9759998\n131140\t0.72\t7.52\t84\t21.68857\t6.8175998\n131142\t0.72\t7.6\t102\t39.809086\t25.363199\n131143\t0.72\t7.64\t111\t45.547054\t30.568001\n131144\t0.72\t7.68\t120\t53.093029\t36.9744\n131145\t0.72\t7.72\t122\t55.905392\t38.9072\n131146\t0.72\t7.76\t107\t43.013672\t25.2064\n196664\t0.76\t7.04\t102\t30.459377\t12.1008\n196665\t0.76\t7.08\t112\t37.266163\t19.3776\n196666\t0.76\t7.12\t149\t72.022911\t57.112\n196667\t0.76\t7.16\t148\t68.984161\t53.7952\n196668\t0.76\t7.2\t124\t40.585949\t21.235201\n196669\t0.76\t7.24\t117\t30.89657\t10.6496\n196670\t0.76\t7.28\t93\t20.425934\t5.5376\n196671\t0.76\t7.32\t109\t24.63987\t6.7328\n196672\t0.76\t7.36\t104\t22.756449\t6.072\n196673\t0.76\t7.4\t101\t21.336105\t5.552\n196674\t0.76\t7.44\t101\t21.455666\t5.6431999\n196675\t0.76\t7.48\t102\t22.463762\t6.1328001\n196676\t0.76\t7.52\t108\t24.524914\t6.9071999\n196677\t0.76\t7.56\t89\t20.552114\t6.0367999\n196678\t0.76\t7.6\t120\t41.944683\t23.112\n196679\t0.76\t7.64\t123\t48.517162\t30.854401\n196680\t0.76\t7.68\t126\t54.098293\t36.628799\n196681\t0.76\t7.72\t123\t52.332752\t34.1856\n196682\t0.76\t7.76\t105\t38.426586\t20.742399\n262200\t0.8\t7.04\t102\t29.137228\t11.4064\n262201\t0.8\t7.08\t110\t33.311489\t15.5616\n262202\t0.8\t7.12\t146\t66.708405\t51.478401\n262203\t0.8\t7.16\t141\t62.477539\t47.959999\n262204\t0.8\t7.2\t109\t31.902433\t15.9952\n262205\t0.8\t7.24\t86\t19.30418\t5.7951999\n262207\t0.8\t7.32\t86\t18.253939\t4.7839999\n262208\t0.8\t7.36\t95\t18.948063\t4.6799998\n262209\t0.8\t7.4\t100\t19.752245\t4.8271999\n262210\t0.8\t7.44\t99\t19.693623\t4.8992\n262211\t0.8\t7.48\t97\t19.821554\t5.0976\n262212\t0.8\t7.52\t84\t18.721516\t5.2048001\n262214\t0.8\t7.6\t91\t28.888416\t15.744\n262215\t0.8\t7.64\t106\t38.802296\t24.692801\n262216\t0.8\t7.68\t121\t48.852211\t32.195202\n262217\t0.8\t7.72\t117\t45.911297\t28.656\n262218\t0.8\t7.76\t101\t32.795208\t15.568\n327736\t0.84\t7.04\t92\t22.003006\t6.9120002\n327737\t0.84\t7.08\t94\t22.683102\t8.4639997\n327738\t0.84\t7.12\t137\t60.210972\t46.257599\n327739\t0.84\t7.16\t128\t54.657177\t41.9856\n327740\t0.84\t7.2\t95\t25.367149\t12.0608\n327741\t0.84\t7.24\t81\t17.433615\t4.9295998\n327743\t0.84\t7.32\t81\t16.459587\t4.0864\n327744\t0.84\t7.36\t83\t14.9294\t3.3248\n327745\t0.84\t7.4\t83\t14.046597\t2.9375999\n327746\t0.84\t7.44\t85\t14.626451\t3.1312001\n327747\t0.84\t7.48\t82\t15.306084\t3.6256001\n327748\t0.84\t7.52\t82\t17.155693\t4.4944\n327750\t0.84\t7.6\t82\t23.939941\t12.0352\n327751\t0.84\t7.64\t94\t33.640411\t21.4272\n327752\t0.84\t7.68\t109\t42.131927\t27.832001\n327753\t0.84\t7.72\t105\t37.923157\t22.9296\n327754\t0.84\t7.76\t85\t21.76741\t8.0607996\n393257\t0.88\t6.44\t42\t8.7469444\t2.3471999\n393258\t0.88\t6.48\t60\t21.750759\t13.072\n393259\t0.88\t6.52\t52\t14.967987\t8.0271997\n393260\t0.88\t6.56\t38\t5.786551\t1.1824\n393261\t0.88\t6.6\t36\t5.377718\t0.99040002\n393262\t0.88\t6.64\t32\t5.0924959\t0.95520002\n393264\t0.88\t6.72\t19\t2.6990466\t0.50400001\n393265\t0.88\t6.76\t23\t3.3436391\t0.63840002\n393266\t0.88\t6.8\t41\t15.748744\t11.216\n393272\t0.88\t7.04\t87\t19.072384\t5.4000001\n393273\t0.88\t7.08\t89\t19.278217\t6.4335999\n393274\t0.88\t7.12\t133\t56.964733\t42.820801\n393275\t0.88\t7.16\t126\t51.609089\t38.284801\n393276\t0.88\t7.2\t91\t22.262644\t9.2992001\n393277\t0.88\t7.24\t82\t17.050226\t4.5455999\n393279\t0.88\t7.32\t78\t15.038219\t3.52\n393280\t0.88\t7.36\t76\t12.657201\t2.5504\n393281\t0.88\t7.4\t77\t11.78551\t2.1296\n393282\t0.88\t7.44\t74\t11.138371\t1.9904\n393283\t0.88\t7.48\t76\t12.657201\t2.5504\n393284\t0.88\t7.52\t79\t15.342851\t3.6127999\n393286\t0.88\t7.6\t77\t19.342884\t7.9136\n393287\t0.88\t7.64\t95\t33.131908\t20.52\n393288\t0.88\t7.68\t104\t38.88245\t24.937599\n393289\t0.88\t7.72\t100\t34.074253\t19.812799\n393290\t0.88\t7.76\t80\t17.995335\t5.3839998\n458760\t0.92\t5.12\t165\t66.93367\t33.513599\n458761\t0.92\t5.16\t183\t85.820915\t58.868801\n458762\t0.92\t5.2\t188\t92.159378\t70.945602\n458763\t0.92\t5.24\t176\t77.418388\t53.990398\n458764\t0.92\t5.28\t162\t58.95348\t29.9216\n458765\t0.92\t5.32\t158\t54.271576\t24.651199\n458766\t0.92\t5.36\t154\t52.546402\t23.444799\n458767\t0.92\t5.4\t148\t49.678761\t20.870399\n458768\t0.92\t5.44\t148\t51.960201\t22.4608\n458769\t0.92\t5.48\t146\t53.062256\t22.820801\n458793\t0.92\t6.44\t39\t6.8312845\t1.576\n458794\t0.92\t6.48\t63\t21.049376\t11.9184\n458795\t0.92\t6.52\t61\t18.974976\t10.8656\n458796\t0.92\t6.56\t43\t6.1693482\t1.2431999\n458797\t0.92\t6.6\t39\t5.2229948\t0.87840003\n458798\t0.92\t6.64\t34\t4.710113\t0.78399998\n458800\t0.92\t6.72\t23\t2.7589223\t0.44319999\n458801\t0.92\t6.76\t26\t3.3965585\t0.60159999\n458802\t0.92\t6.8\t50\t20.402479\t15.1504\n458808\t0.92\t7.04\t86\t18.348515\t4.9503999\n458809\t0.92\t7.08\t85\t16.344223\t4.1072001\n458810\t0.92\t7.12\t132\t54.408939\t39.214401\n458811\t0.92\t7.16\t124\t49.052952\t35.003201\n458812\t0.92\t7.2\t87\t18.252306\t5.7312002\n458813\t0.92\t7.24\t82\t16.702732\t4.2672\n458815\t0.92\t7.32\t75\t13.818519\t3.0064001\n458816\t0.92\t7.36\t74\t11.961161\t2.296\n458817\t0.92\t7.4\t71\t10.338152\t1.7664\n458818\t0.92\t7.44\t74\t11.186681\t2.0128\n458819\t0.92\t7.48\t75\t12.361161\t2.4560001\n458820\t0.92\t7.52\t75\t13.795877\t2.9888\n458822\t0.92\t7.6\t73\t15.458254\t4.5840001\n458823\t0.92\t7.64\t96\t32.269508\t18.8832\n458824\t0.92\t7.68\t106\t38.398075\t23.4496\n458825\t0.92\t7.72\t96\t30.719749\t16.9056\n458826\t0.92\t7.76\t77\t16.528574\t4.6464\n524296\t0.96\t5.12\t170\t65.611618\t31.686399\n524297\t0.96\t5.16\t185\t80.567383\t52.260799\n524298\t0.96\t5.2\t190\t87.514908\t65.3424\n524299\t0.96\t5.24\t178\t72.879311\t49.139198\n524300\t0.96\t5.28\t165\t55.563362\t27.107201\n524301\t0.96\t5.32\t158\t49.380257\t21.0224\n524302\t0.96\t5.36\t154\t47.384045\t19.467199\n524303\t0.96\t5.4\t154\t49.08913\t20.5168\n524304\t0.96\t5.44\t147\t46.757408\t18.3888\n524305\t0.96\t5.48\t147\t49.904499\t20.448\n524329\t0.96\t6.44\t39\t6.4416518\t1.3728\n524330\t0.96\t6.48\t46\t7.9989877\t2.0544\n524331\t0.96\t6.52\t66\t20.554316\t11.4752\n524332\t0.96\t6.56\t45\t6.0541601\t1.128\n524333\t0.96\t6.6\t43\t5.1857195\t0.75040001\n524334\t0.96\t6.64\t41\t5.1097188\t0.75199997\n524335\t0.96\t6.68\t41\t5.6790199\t0.94400001\n524336\t0.96\t6.72\t37\t5.1659374\t0.93440002\n524337\t0.96\t6.76\t36\t5.5656357\t1.1727999\n524338\t0.96\t6.8\t62\t24.947359\t17.566401\n524344\t0.96\t7.04\t83\t17.354012\t4.5071998\n524345\t0.96\t7.08\t85\t16.445538\t4.0672002\n524346\t0.96\t7.12\t132\t53.135281\t36.686401\n524347\t0.96\t7.16\t125\t48.64756\t33.326401\n524348\t0.96\t7.2\t84\t16.055588\t3.9375999\n524349\t0.96\t7.24\t81\t16.333506\t4.0256\n524351\t0.96\t7.32\t74\t13.893401\t3.1024001\n524352\t0.96\t7.36\t71\t11.475163\t2.2272\n524353\t0.96\t7.4\t71\t10.798904\t1.9967999\n524354\t0.96\t7.44\t71\t10.798904\t1.9967999\n524355\t0.96\t7.48\t74\t12.493398\t2.5792\n524356\t0.96\t7.52\t74\t13.893401\t3.1024001\n524358\t0.96\t7.6\t71\t14.112141\t3.536\n524359\t0.96\t7.64\t98\t32.997417\t18.627199\n524360\t0.96\t7.68\t107\t37.744858\t21.912001\n524361\t0.96\t7.72\t96\t29.768179\t15.5696\n524362\t0.96\t7.76\t73\t14.958081\t3.9247999\n589832\t1\t5.12\t174\t65.324028\t31.7024\n589833\t1\t5.16\t191\t80.142052\t50.982399\n589834\t1\t5.2\t196\t86.54007\t63.283199\n589835\t1\t5.24\t185\t71.888695\t46.6544\n589836\t1\t5.28\t168\t52.231857\t23.878401\n589837\t1\t5.32\t162\t46.649288\t18.4704\n589838\t1\t5.36\t155\t43.29681\t16.132799\n589839\t1\t5.4\t152\t43.631756\t16.4608\n589840\t1\t5.44\t147\t43.177715\t15.8464\n589841\t1\t5.48\t146\t45.879856\t17.52\n589843\t1\t5.56\t212\t107.25992\t67.764801\n589844\t1\t5.6\t216\t101.99606\t61.403198\n589845\t1\t5.64\t220\t100.21715\t60.7136\n589846\t1\t5.68\t230\t100.38043\t58.627201\n589847\t1\t5.72\t241\t106.37511\t65.305603\n589848\t1\t5.76\t241\t99.900703\t55.569599\n589849\t1\t5.8\t252\t105.71748\t60.641602\n589850\t1\t5.84\t256\t105.91825\t59.209599\n589851\t1\t5.88\t264\t109.86177\t61.683201\n589852\t1\t5.92\t281\t125.52368\t78.787201\n589853\t1\t5.96\t414\t484.10068\t1121.304\n589854\t1\t6\t427\t514.89673\t1218.8016\n589855\t1\t6.04\t253\t99.349129\t51.179199\n589856\t1\t6.08\t240\t90.816658\t44.7328\n589857\t1\t6.12\t233\t88.308632\t43.911999\n589858\t1\t6.16\t229\t89.718727\t47.023998\n589859\t1\t6.2\t225\t91.70388\t50.416\n589860\t1\t6.24\t224\t95.526314\t54.923199\n589861\t1\t6.28\t222\t99.456749\t59.547199\n589862\t1\t6.32\t221\t105.13754\t66.409599\n589863\t1\t6.36\t218\t109.76509\t72.201599\n589864\t1\t6.4\t218\t116.79842\t80.283203\n589865\t1\t6.44\t38\t6.3326063\t1.3472\n589866\t1\t6.48\t39\t5.4957714\t1.008\n589867\t1\t6.52\t68\t19.654495\t9.8448\n589868\t1\t6.56\t47\t6.4240294\t1.1440001\n589869\t1\t6.6\t42\t5.0604815\t0.72000003\n589870\t1\t6.64\t43\t5.5340395\t0.83359998\n589871\t1\t6.68\t41\t5.8814182\t1.0048\n589872\t1\t6.72\t39\t5.7991133\t1.112\n589873\t1\t6.76\t38\t6.1722555\t1.3552001\n589874\t1\t6.8\t69\t27.144375\t17.591999\n589880\t1\t7.04\t83\t17.990992\t4.8112001\n589881\t1\t7.08\t85\t16.966961\t4.2816\n589882\t1\t7.12\t131\t51.405739\t33.8176\n589883\t1\t7.16\t127\t48.663898\t31.766399\n589884\t1\t7.2\t84\t16.444794\t4.0560002\n589885\t1\t7.24\t77\t15.48338\t3.7423999\n589887\t1\t7.32\t71\t13.650023\t3.1487999\n589888\t1\t7.36\t71\t12.374516\t2.688\n589889\t1\t7.4\t71\t11.717723\t2.4576001\n589890\t1\t7.44\t71\t11.717723\t2.4576001\n589891\t1\t7.48\t71\t12.374516\t2.688\n589892\t1\t7.52\t74\t14.837963\t3.6256001\n589894\t1\t7.6\t72\t14.669329\t3.6896\n589895\t1\t7.64\t99\t33.070095\t17.879999\n589896\t1\t7.68\t109\t37.3717\t20.3248\n589897\t1\t7.72\t92\t25.653166\t11.376\n589898\t1\t7.76\t76\t16.4391\t4.4688001\n655368\t1.04\t5.12\t185\t70.707703\t36.068802\n655369\t1.04\t5.16\t200\t82.991837\t52.3008\n655370\t1.04\t5.2\t203\t87.04554\t61.891201\n655371\t1.04\t5.24\t191\t71.526306\t45.0224\n655372\t1.04\t5.28\t174\t50.286263\t20.8176\n655373\t1.04\t5.32\t163\t43.158165\t15.6176\n655374\t1.04\t5.36\t158\t40.13126\t13.1984\n655375\t1.04\t5.4\t154\t40.521576\t13.8096\n655376\t1.04\t5.44\t149\t40.65221\t13.8448\n655377\t1.04\t5.48\t149\t45.182354\t16.939199\n655379\t1.04\t5.56\t213\t104.11543\t64.856003\n655380\t1.04\t5.6\t219\t99.478401\t58.495998\n655381\t1.04\t5.64\t228\t97.976906\t54.903999\n655382\t1.04\t5.68\t238\t99.395859\t54.068802\n655383\t1.04\t5.72\t244\t98.362595\t51.804798\n655384\t1.04\t5.76\t243\t94.415054\t48.214401\n655385\t1.04\t5.8\t249\t96.081779\t49.919998\n655386\t1.04\t5.84\t251\t94.582077\t47.883202\n655387\t1.04\t5.88\t263\t103.27004\t56.969601\n655388\t1.04\t5.92\t278\t114.54057\t66.804802\n655389\t1.04\t5.96\t422\t479.3187\t1093.4528\n655390\t1.04\t6\t435\t512.56006\t1198.8096\n655391\t1.04\t6.04\t260\t99.806122\t52.195202\n655392\t1.04\t6.08\t245\t89.754799\t44.1744\n655393\t1.04\t6.12\t237\t86.903336\t43.299198\n655394\t1.04\t6.16\t230\t85.214706\t43.187199\n655395\t1.04\t6.2\t226\t87.20829\t46.649601\n655396\t1.04\t6.24\t224\t91.479836\t51.872002\n655397\t1.04\t6.28\t224\t97.737518\t59.113602\n655398\t1.04\t6.32\t221\t102.05476\t64.420799\n655399\t1.04\t6.36\t222\t110.06548\t73.523201\n655400\t1.04\t6.4\t220\t115.99121\t80.251198\n655401\t1.04\t6.44\t36\t6.2744389\t1.3408\n655402\t1.04\t6.48\t36\t5.3756485\t1.0064\n655403\t1.04\t6.52\t65\t18.366755\t8.4927998\n655404\t1.04\t6.56\t57\t14.743288\t7.4591999\n655405\t1.04\t6.6\t37\t5.0503135\t0.81279999\n655406\t1.04\t6.64\t31\t4.4612322\t0.74400002\n655408\t1.04\t6.72\t18\t2.0062213\t0.2608\n655409\t1.04\t6.76\t29\t4.2443638\t0.83520001\n655410\t1.04\t6.8\t62\t22.122965\t12.3728\n655416\t1.04\t7.04\t78\t17.31529\t4.7168002\n655417\t1.04\t7.08\t82\t16.922358\t4.3968\n655418\t1.04\t7.12\t134\t51.703262\t32.113602\n655419\t1.04\t7.16\t129\t48.897488\t30.327999\n655420\t1.04\t7.2\t83\t17.000641\t4.3712001\n655421\t1.04\t7.24\t78\t17.008938\t4.5071998\n655423\t1.04\t7.32\t71\t14.932616\t3.8399999\n655424\t1.04\t7.36\t71\t13.714247\t3.3792\n655425\t1.04\t7.4\t71\t13.088058\t3.1487999\n655426\t1.04\t7.44\t71\t13.088058\t3.1487999\n655427\t1.04\t7.48\t71\t13.714247\t3.3792\n655428\t1.04\t7.52\t72\t15.301398\t3.9760001\n655430\t1.04\t7.6\t69\t14.367953\t3.6784\n655431\t1.04\t7.64\t101\t33.710976\t17.348801\n655432\t1.04\t7.68\t111\t38.165024\t19.993601\n655433\t1.04\t7.72\t89\t23.107052\t8.8240004\n655434\t1.04\t7.76\t74\t16.567806\t4.6016002\n720904\t1.08\t5.12\t201\t85.265106\t52.6576\n720905\t1.08\t5.16\t219\t96.503235\t64.750397\n720906\t1.08\t5.2\t221\t97.311829\t68.9888\n720907\t1.08\t5.24\t208\t80.383865\t50.900799\n720908\t1.08\t5.28\t186\t54.491756\t22.559999\n720909\t1.08\t5.32\t175\t46.611843\t17.1024\n720910\t1.08\t5.36\t170\t43.306866\t14.6224\n720911\t1.08\t5.4\t157\t38.037258\t11.4528\n720912\t1.08\t5.44\t154\t40.53104\t13.4224\n720913\t1.08\t5.48\t151\t44.117947\t15.9408\n720915\t1.08\t5.56\t217\t103.57859\t64.193604\n720916\t1.08\t5.6\t233\t103.64909\t60.2896\n720917\t1.08\t5.64\t249\t107.57411\t60.627201\n720918\t1.08\t5.68\t250\t102.89072\t55.972801\n720919\t1.08\t5.72\t247\t96.681618\t50.2416\n720920\t1.08\t5.76\t246\t91.196266\t44.812801\n720921\t1.08\t5.8\t239\t83.17421\t38.007999\n720922\t1.08\t5.84\t246\t84.507332\t37.819199\n720923\t1.08\t5.88\t255\t88.889984\t40.588799\n720924\t1.08\t5.92\t271\t100.64622\t50.7808\n720925\t1.08\t5.96\t420\t464.32104\t1053.4784\n720926\t1.08\t6\t438\t502.4375\t1162.8032\n720927\t1.08\t6.04\t262\t97.8004\t51.7584\n720928\t1.08\t6.08\t249\t89.923332\t45.880001\n720929\t1.08\t6.12\t244\t89.665329\t46.944\n720930\t1.08\t6.16\t240\t90.501976\t48.556801\n720931\t1.08\t6.2\t236\t90.68074\t49.062401\n720932\t1.08\t6.24\t229\t91.16906\t51.459202\n720933\t1.08\t6.28\t223\t92.68647\t54.448002\n720934\t1.08\t6.32\t222\t99.409882\t61.992001\n720935\t1.08\t6.36\t221\t106.10816\t69.472\n720936\t1.08\t6.4\t220\t113.45081\t77.686401\n720940\t1.08\t6.56\t71\t20.965086\t9.7296\n720946\t1.08\t6.8\t58\t19.021942\t9.3984003\n720952\t1.08\t7.04\t75\t17.761301\t5.1423998\n720953\t1.08\t7.08\t81\t18.331873\t5.2160001\n720954\t1.08\t7.12\t139\t52.725243\t30.7488\n720955\t1.08\t7.16\t133\t49.985279\t29.2656\n720956\t1.08\t7.2\t79\t17.34952\t4.7792001\n720957\t1.08\t7.24\t73\t17.017426\t4.848\n720959\t1.08\t7.32\t71\t16.617079\t4.7616\n720960\t1.08\t7.36\t71\t15.479453\t4.3007998\n720961\t1.08\t7.4\t71\t14.896123\t4.0704002\n720962\t1.08\t7.44\t71\t14.896123\t4.0704002\n720963\t1.08\t7.48\t71\t15.479453\t4.3007998\n720964\t1.08\t7.52\t71\t16.617079\t4.7616\n720966\t1.08\t7.6\t64\t14.093885\t3.8624001\n720967\t1.08\t7.64\t104\t34.644493\t16.924801\n720968\t1.08\t7.68\t117\t39.738735\t19.649599\n720969\t1.08\t7.72\t81\t18.180265\t5.0896001\n720970\t1.08\t7.76\t71\t17.073963\t5.1023998\n786440\t1.12\t5.12\t222\t105.24494\t74.950401\n786441\t1.12\t5.16\t240\t115.82227\t85.521599\n786442\t1.12\t5.2\t253\t123.48015\t94.019203\n786443\t1.12\t5.24\t241\t108.07349\t77.270401\n786444\t1.12\t5.28\t224\t83.020248\t47.596802\n786445\t1.12\t5.32\t215\t73.595093\t38.5728\n786446\t1.12\t5.36\t203\t62.694839\t28.452801\n786447\t1.12\t5.4\t186\t50.151707\t17.6096\n786448\t1.12\t5.44\t170\t43.757755\t13.9776\n786449\t1.12\t5.48\t152\t41.806175\t14.0688\n786451\t1.12\t5.56\t242\t113.68269\t70.447998\n786452\t1.12\t5.6\t262\t117.61987\t69.388802\n786453\t1.12\t5.64\t258\t109.08047\t61.127998\n786454\t1.12\t5.68\t253\t101.17253\t54.131199\n786455\t1.12\t5.72\t246\t92.258011\t46.4496\n786456\t1.12\t5.76\t244\t87.631058\t42.244801\n786457\t1.12\t5.8\t244\t84.167381\t38.785599\n786458\t1.12\t5.84\t247\t82.466782\t36.235199\n786459\t1.12\t5.88\t253\t84.713264\t37.368\n786460\t1.12\t5.92\t273\t96.743423\t45.743999\n786461\t1.12\t5.96\t426\t458.5546\t1023.6816\n786462\t1.12\t6\t442\t494.19498\t1128.5728\n786463\t1.12\t6.04\t258\t88.356987\t40.793598\n786464\t1.12\t6.08\t246\t82.552757\t37.849602\n786465\t1.12\t6.12\t241\t82.612152\t39.492802\n786466\t1.12\t6.16\t239\t86.160301\t44.464001\n786467\t1.12\t6.2\t244\t95.288597\t54.080002\n786468\t1.12\t6.24\t242\t98.977119\t58.5168\n786469\t1.12\t6.28\t243\t104.77968\t64.435204\n786470\t1.12\t6.32\t241\t109.4513\t69.924797\n786471\t1.12\t6.36\t228\t109.72643\t73.9328\n786472\t1.12\t6.4\t225\t117.03373\t82.486397\n786476\t1.12\t6.56\t62\t18.218618\t7.9503999\n786477\t1.12\t6.6\t20\t5.7555542\t2.3664\n786481\t1.12\t6.76\t26\t9.8878822\t7.0176001\n786482\t1.12\t6.8\t52\t15.839282\t7.1055999\n786488\t1.12\t7.04\t71\t18.672298\t5.9136\n786489\t1.12\t7.08\t72\t17.730001\t5.4608002\n786490\t1.12\t7.12\t146\t54.847942\t30.200001\n786491\t1.12\t7.16\t138\t51.301807\t28.3536\n786492\t1.12\t7.2\t72\t17.730001\t5.4608002\n786493\t1.12\t7.24\t71\t18.672298\t5.9136\n786495\t1.12\t7.32\t71\t18.672298\t5.9136\n786496\t1.12\t7.36\t71\t17.640558\t5.4527998\n786497\t1.12\t7.4\t71\t17.111734\t5.2224002\n786498\t1.12\t7.44\t71\t17.111734\t5.2224002\n786499\t1.12\t7.48\t71\t17.640558\t5.4527998\n786500\t1.12\t7.52\t71\t18.672298\t5.9136\n786502\t1.12\t7.6\t59\t14.904503\t4.6240001\n786503\t1.12\t7.64\t96\t29.163681\t12.432\n786504\t1.12\t7.68\t126\t42.3022\t19.742399\n786505\t1.12\t7.72\t79\t20.070566\t6.2848001\n786506\t1.12\t7.76\t60\t15.316328\t4.7936001\n851976\t1.16\t5.12\t247\t137.85081\t120.576\n851977\t1.16\t5.16\t270\t151.72148\t132.2672\n851978\t1.16\t5.2\t292\t165.85542\t144.75681\n851979\t1.16\t5.24\t287\t154.61871\t129.496\n851980\t1.16\t5.28\t276\t134.90776\t104.0944\n851981\t1.16\t5.32\t274\t129.03339\t95.625603\n851982\t1.16\t5.36\t281\t130.14626\t92.582397\n851983\t1.16\t5.4\t293\t133.61781\t90.351997\n851984\t1.16\t5.44\t308\t140.19199\t90.9888\n851985\t1.16\t5.48\t338\t153.3654\t94.945602\n851986\t1.16\t5.52\t323\t145.52142\t87.147202\n851987\t1.16\t5.56\t291\t130.96355\t77.620796\n851988\t1.16\t5.6\t270\t117.02744\t67.513603\n851989\t1.16\t5.64\t256\t105.24823\t58.243198\n851990\t1.16\t5.68\t251\t98.281158\t52.102402\n851991\t1.16\t5.72\t247\t92.117355\t46.6432\n851992\t1.16\t5.76\t246\t87.953003\t42.596802\n851993\t1.16\t5.8\t245\t84.261154\t39.119999\n851994\t1.16\t5.84\t244\t81.195435\t36.302399\n851995\t1.16\t5.88\t253\t83.914749\t37.035198\n851996\t1.16\t5.92\t272\t93.959808\t43.112\n851997\t1.16\t5.96\t430\t453.24344\t995.08478\n851998\t1.16\t6\t445\t490.14673\t1106.0176\n851999\t1.16\t6.04\t257\t86.69474\t39.7728\n852000\t1.16\t6.08\t244\t81.058929\t37.406399\n852001\t1.16\t6.12\t240\t81.971413\t39.647999\n852002\t1.16\t6.16\t239\t84.279007\t42.436798\n852003\t1.16\t6.2\t237\t87.589386\t46.651199\n852004\t1.16\t6.24\t236\t91.037178\t50.579201\n852005\t1.16\t6.28\t236\t96.239716\t56.395199\n852006\t1.16\t6.32\t235\t100.86439\t61.4944\n852007\t1.16\t6.36\t243\t113.20556\t73.472\n852008\t1.16\t6.4\t243\t119.58923\t80.463997\n852009\t1.16\t6.44\t230\t124.9934\t88.265602\n852010\t1.16\t6.48\t202\t120.33929\t91.358398\n852011\t1.16\t6.52\t186\t112.75641\t89.536003\n852012\t1.16\t6.56\t205\t121.87601\t97.833603\n852013\t1.16\t6.6\t147\t104.7407\t93.800003\n852017\t1.16\t6.76\t57\t24.833809\t15.8864\n852018\t1.16\t6.8\t44\t9.9302855\t3.1168001\n852026\t1.16\t7.12\t163\t64.784515\t34.340801\n852027\t1.16\t7.16\t144\t52.896118\t27.5376\n852040\t1.16\t7.68\t161\t54.438843\t23.993601\n917512\t1.2\t5.12\t246\t137.57756\t120.8672\n917513\t1.2\t5.16\t266\t145.94574\t125.0512\n917514\t1.2\t5.2\t291\t163.59375\t141.66879\n917515\t1.2\t5.24\t292\t157.85568\t132.1456\n917516\t1.2\t5.28\t281\t139.88554\t109.5632\n917517\t1.2\t5.32\t288\t139.58795\t104.5824\n917518\t1.2\t5.36\t294\t140.4044\t101.4096\n917519\t1.2\t5.4\t306\t143.38818\t98.267197\n917520\t1.2\t5.44\t326\t151.76048\t99.255997\n917521\t1.2\t5.48\t343\t154.67224\t95.127998\n917522\t1.2\t5.52\t324\t146.0336\t87.472\n917523\t1.2\t5.56\t283\t126.25783\t74.622398\n917524\t1.2\t5.6\t266\t114.69285\t65.886398\n917525\t1.2\t5.64\t256\t105.75358\t58.568001\n917526\t1.2\t5.68\t251\t98.867958\t52.4944\n917527\t1.2\t5.72\t246\t92.229454\t46.787201\n917528\t1.2\t5.76\t246\t88.418091\t42.8592\n917529\t1.2\t5.8\t244\t84.38665\t39.264\n917530\t1.2\t5.84\t244\t81.63163\t36.543999\n917531\t1.2\t5.88\t249\t81.821136\t35.728001\n917532\t1.2\t5.92\t267\t90.160553\t40.088001\n917533\t1.2\t5.96\t431\t446.59192\t965.71362\n917534\t1.2\t6\t448\t484.36115\t1074.9744\n917535\t1.2\t6.04\t253\t84.029564\t37.750401\n917536\t1.2\t6.08\t243\t80.949265\t37.364799\n917537\t1.2\t6.12\t239\t81.516022\t39.057598\n917538\t1.2\t6.16\t237\t84.236641\t42.568001\n917539\t1.2\t6.2\t236\t87.061523\t45.857601\n917540\t1.2\t6.24\t236\t91.572906\t50.911999\n917541\t1.2\t6.28\t235\t95.593376\t55.372799\n917542\t1.2\t6.32\t235\t101.39097\t61.849602\n917543\t1.2\t6.36\t235\t107.81452\t69.081596\n917544\t1.2\t6.4\t236\t115.03149\t77.115196\n917545\t1.2\t6.44\t224\t120.73614\t85.5616\n917546\t1.2\t6.48\t204\t122.0304\t92.711998\n917547\t1.2\t6.52\t206\t128.2571\t101.7552\n917548\t1.2\t6.56\t209\t127.82599\t104.0576\n917549\t1.2\t6.6\t225\t138.94206\t115.36\n917550\t1.2\t6.64\t296\t281.39178\t393.31039\n917551\t1.2\t6.68\t408\t566.22046\t1167.9471\n917552\t1.2\t6.72\t284\t336.39551\t594.68323\n917553\t1.2\t6.76\t150\t103.21446\t103.5504\n917554\t1.2\t6.8\t104\t81.547478\t91.2304\n917560\t1.2\t7.04\t123\t48.489231\t23.683201\n917561\t1.2\t7.08\t136\t51.483582\t24.532801\n917562\t1.2\t7.12\t211\t81.96315\t41.385601\n917563\t1.2\t7.16\t214\t79.477837\t38.636799\n917564\t1.2\t7.2\t145\t46.551247\t19.3232\n917565\t1.2\t7.24\t133\t37.725071\t13.4416\n917566\t1.2\t7.28\t125\t32.879261\t10.5744\n917567\t1.2\t7.32\t127\t33.38826\t10.8032\n917568\t1.2\t7.36\t126\t33.146534\t10.9888\n917569\t1.2\t7.4\t129\t34.862225\t12.0784\n917570\t1.2\t7.44\t130\t36.19965\t13.2736\n917571\t1.2\t7.48\t133\t39.013191\t15.4656\n917572\t1.2\t7.52\t133\t40.155506\t16.511999\n917573\t1.2\t7.56\t139\t45.493504\t20.4928\n917574\t1.2\t7.6\t153\t56.11797\t28.1824\n917575\t1.2\t7.64\t196\t75.505066\t38.720001\n917576\t1.2\t7.68\t223\t89.657806\t47.004799\n917577\t1.2\t7.72\t166\t71.787148\t41.1152\n917578\t1.2\t7.76\t143\t65.271507\t38.875198\n983048\t1.24\t5.12\t226\t111.19139\t83.587196\n983049\t1.24\t5.16\t244\t115.20014\t82.891197\n983050\t1.24\t5.2\t269\t131.98523\t98.745598\n983051\t1.24\t5.24\t258\t117.84138\t83.568001\n983052\t1.24\t5.28\t238\t93.102699\t56.872002\n983053\t1.24\t5.32\t228\t83.389168\t47.502399\n983054\t1.24\t5.36\t219\t74.208733\t37.777599\n983055\t1.24\t5.4\t200\t58.768185\t23.524799\n983056\t1.24\t5.44\t179\t46.988922\t14.9984\n983057\t1.24\t5.48\t153\t41.388813\t13.384\n983059\t1.24\t5.56\t241\t114.04466\t70.736\n983060\t1.24\t5.6\t253\t112.82687\t66.112\n983061\t1.24\t5.64\t253\t107.04154\t59.937599\n983062\t1.24\t5.68\t251\t100.87364\t53.915199\n983063\t1.24\t5.72\t247\t94.982964\t48.672001\n983064\t1.24\t5.76\t243\t88.497856\t42.731201\n983065\t1.24\t5.8\t243\t85.190964\t39.4352\n983066\t1.24\t5.84\t241\t81.150291\t35.723202\n983067\t1.24\t5.88\t241\t79.221191\t34.001598\n983068\t1.24\t5.92\t260\t86.263924\t36.848\n983069\t1.24\t5.96\t430\t439.03693\t935.7392\n983070\t1.24\t6\t444\t474.38684\t1040.9856\n983071\t1.24\t6.04\t243\t78.911758\t34.075199\n983072\t1.24\t6.08\t235\t78.057892\t35.360001\n983073\t1.24\t6.12\t233\t80.854286\t39.060799\n983074\t1.24\t6.16\t233\t84.477333\t43.348801\n983075\t1.24\t6.2\t232\t88.26947\t47.9856\n983076\t1.24\t6.24\t232\t93.976311\t54.705601\n983077\t1.24\t6.28\t232\t98.922691\t60.209599\n983078\t1.24\t6.32\t231\t104.93917\t67.223999\n983079\t1.24\t6.36\t229\t111.31284\t74.912003\n983080\t1.24\t6.4\t225\t118.26382\t83.3936\n983085\t1.24\t6.6\t104\t43.611366\t27.625601\n983086\t1.24\t6.64\t182\t145.63892\t183.8288\n983087\t1.24\t6.68\t342\t482.53427\t1052.408\n983088\t1.24\t6.72\t237\t254.80272\t457.22079\n983089\t1.24\t6.76\t119\t58.939407\t44.348801\n983093\t1.24\t6.92\t56\t19.161268\t9.5200005\n983094\t1.24\t6.96\t64\t24.614416\t13.7424\n983095\t1.24\t7\t27\t5.9395099\t1.7312\n983096\t1.24\t7.04\t122\t46.055771\t22.236799\n983097\t1.24\t7.08\t140\t49.332321\t22.590401\n983098\t1.24\t7.12\t215\t81.874825\t40.316799\n983099\t1.24\t7.16\t217\t80.37545\t38.715199\n983100\t1.24\t7.2\t162\t49.517242\t19.7696\n983101\t1.24\t7.24\t141\t39.438698\t14.2912\n983102\t1.24\t7.28\t136\t36.811031\t13.0736\n983103\t1.24\t7.32\t134\t35.556854\t12.4656\n983104\t1.24\t7.36\t133\t35.167522\t12.48\n983105\t1.24\t7.4\t133\t35.704964\t13.1248\n983106\t1.24\t7.44\t134\t37.18478\t14.4752\n983107\t1.24\t7.48\t134\t38.123543\t15.3792\n983108\t1.24\t7.52\t138\t41.564789\t18.019199\n983109\t1.24\t7.56\t141\t44.655117\t20.534401\n983110\t1.24\t7.6\t159\t54.966751\t27.019199\n983111\t1.24\t7.64\t197\t75.319725\t38.248001\n983112\t1.24\t7.68\t226\t91.852943\t48.383999\n983113\t1.24\t7.72\t182\t76.349548\t43.209599\n983114\t1.24\t7.76\t148\t67.077255\t41.273602\n1048584\t1.28\t5.12\t209\t93.102089\t62.768002\n1048585\t1.28\t5.16\t217\t89.114914\t55.596802\n1048586\t1.28\t5.2\t245\t106.78829\t71.027199\n1048587\t1.28\t5.24\t230\t88.319824\t51.944\n1048588\t1.28\t5.28\t196\t57.961826\t24.448\n1048589\t1.28\t5.32\t182\t47.71101\t16.6448\n1048590\t1.28\t5.36\t173\t42.742016\t13.232\n1048591\t1.28\t5.4\t165\t40.523712\t12.0752\n1048592\t1.28\t5.44\t158\t40.868656\t12.7616\n1048593\t1.28\t5.48\t150\t42.373661\t14.2864\n1048595\t1.28\t5.56\t214\t102.63988\t62.616001\n1048596\t1.28\t5.6\t226\t100.09044\t56.753601\n1048597\t1.28\t5.64\t236\t99.220131\t53.332802\n1048598\t1.28\t5.68\t239\t95.853226\t49.156799\n1048599\t1.28\t5.72\t235\t89.537338\t43.737598\n1048600\t1.28\t5.76\t238\t87.294296\t40.855999\n1048601\t1.28\t5.8\t234\t82.135612\t36.68\n1048602\t1.28\t5.84\t235\t80.193428\t34.782398\n1048603\t1.28\t5.88\t233\t77.306694\t32.566399\n1048604\t1.28\t5.92\t251\t83.852402\t35.529598\n1048605\t1.28\t5.96\t428\t432.6178\t907.65442\n1048606\t1.28\t6\t442\t470.89304\t1020.136\n1048607\t1.28\t6.04\t234\t77.957451\t34.4576\n1048608\t1.28\t6.08\t229\t78.982841\t36.689602\n1048609\t1.28\t6.12\t229\t81.513191\t39.556801\n1048610\t1.28\t6.16\t228\t84.608826\t43.396801\n1048611\t1.28\t6.2\t226\t86.842445\t46.264\n1048612\t1.28\t6.24\t226\t91.560692\t51.551998\n1048613\t1.28\t6.28\t225\t96.369446\t56.9408\n1048614\t1.28\t6.32\t222\t101.70502\t63.504002\n1048615\t1.28\t6.36\t221\t108.27577\t70.984001\n1048616\t1.28\t6.4\t219\t114.38089\t78.006401\n1048621\t1.28\t6.6\t132\t68.690628\t51.454399\n1048622\t1.28\t6.64\t207\t143.63159\t142.1248\n1048623\t1.28\t6.68\t371\t499.48904\t1044.0352\n1048624\t1.28\t6.72\t248\t227.57787\t347.01279\n1048625\t1.28\t6.76\t149\t69.554604\t45.5952\n1048626\t1.28\t6.8\t136\t66.618172\t44.636799\n1048627\t1.28\t6.84\t145\t73.476318\t49.832001\n1048628\t1.28\t6.88\t121\t56.253052\t35.812801\n1048629\t1.28\t6.92\t142\t63.874481\t36.979198\n1048630\t1.28\t6.96\t162\t71.059273\t39.633598\n1048631\t1.28\t7\t135\t52.015049\t25.959999\n1048632\t1.28\t7.04\t148\t51.471992\t23.6224\n1048633\t1.28\t7.08\t166\t55.420589\t23.856001\n1048634\t1.28\t7.12\t234\t88.156425\t42.119999\n1048635\t1.28\t7.16\t228\t84.057312\t39.763199\n1048636\t1.28\t7.2\t175\t53.544636\t21.0256\n1048637\t1.28\t7.24\t147\t40.873219\t14.9568\n1048638\t1.28\t7.28\t139\t37.449818\t13.4544\n1048639\t1.28\t7.32\t138\t36.900146\t13.3536\n1048640\t1.28\t7.36\t138\t37.113739\t13.7744\n1048641\t1.28\t7.4\t138\t37.787434\t14.6288\n1048642\t1.28\t7.44\t139\t39.226917\t16.0128\n1048643\t1.28\t7.48\t139\t40.738644\t17.683201\n1048644\t1.28\t7.52\t141\t43.232285\t19.915199\n1048645\t1.28\t7.56\t146\t47.168365\t22.915199\n1048646\t1.28\t7.6\t162\t55.673046\t28.040001\n1048647\t1.28\t7.64\t201\t78.53611\t41.547199\n1048648\t1.28\t7.68\t229\t95.11747\t51.694401\n1048649\t1.28\t7.72\t189\t79.816925\t45.9072\n1048650\t1.28\t7.76\t151\t68.058823\t42.790401\n1114120\t1.32\t5.12\t182\t70.116104\t38.315201\n1114121\t1.32\t5.16\t195\t67.469933\t32.398399\n1114122\t1.32\t5.2\t226\t87.010475\t49.745602\n1114123\t1.32\t5.24\t212\t73.673073\t38.233601\n1114124\t1.32\t5.28\t179\t47.304089\t16.1472\n1114125\t1.32\t5.32\t168\t41.540936\t12.8416\n1114126\t1.32\t5.36\t164\t40.57835\t12.3152\n1114127\t1.32\t5.4\t157\t39.820122\t12.3136\n1114128\t1.32\t5.44\t152\t40.880169\t13.3136\n1114129\t1.32\t5.48\t147\t42.7761\t14.8096\n1114131\t1.32\t5.56\t208\t102.36168\t62.4352\n1114132\t1.32\t5.6\t215\t98.448242\t56.524799\n1114133\t1.32\t5.64\t220\t94.703163\t51.3232\n1114134\t1.32\t5.68\t226\t93.009445\t47.881599\n1114135\t1.32\t5.72\t231\t91.326996\t44.980801\n1114136\t1.32\t5.76\t231\t87.690491\t41.439999\n1114137\t1.32\t5.8\t232\t85.2547\t38.852798\n1114138\t1.32\t5.84\t231\t82.473885\t36.476799\n1114139\t1.32\t5.88\t230\t80.176353\t34.614399\n1114140\t1.32\t5.92\t232\t79.473091\t33.911999\n1114141\t1.32\t5.96\t428\t428.37463\t881.52478\n1114142\t1.32\t6\t443\t466.76746\t991.65601\n1114143\t1.32\t6.04\t228\t80.650223\t36.6912\n1114144\t1.32\t6.08\t227\t81.790878\t38.337601\n1114145\t1.32\t6.12\t226\t83.452751\t40.443199\n1114146\t1.32\t6.16\t226\t87.262276\t44.952\n1114147\t1.32\t6.2\t225\t90.326309\t48.636799\n1114148\t1.32\t6.24\t224\t95.340904\t54.867199\n1114149\t1.32\t6.28\t222\t99.427879\t59.774399\n1114150\t1.32\t6.32\t222\t106.40266\t68.003197\n1114151\t1.32\t6.36\t222\t113.03217\t75.639999\n1114152\t1.32\t6.4\t220\t118.75793\t82.367996\n1114157\t1.32\t6.6\t125\t66.421387\t51.248001\n1114158\t1.32\t6.64\t194\t119.09392\t99.211197\n1114159\t1.32\t6.68\t381\t495.27811\t1013.448\n1114160\t1.32\t6.72\t222\t153.69417\t154.79201\n1114161\t1.32\t6.76\t134\t62.4729\t41.855999\n1114162\t1.32\t6.8\t122\t56.932026\t37.403198\n1114163\t1.32\t6.84\t125\t57.596317\t35.848\n1114164\t1.32\t6.88\t132\t61.76355\t37.944\n1114165\t1.32\t6.92\t163\t75.791054\t45.419201\n1114166\t1.32\t6.96\t188\t88.060272\t53.433601\n1114167\t1.32\t7\t162\t75.290657\t48.504002\n1114168\t1.32\t7.04\t159\t62.77639\t36.352001\n1114169\t1.32\t7.08\t164\t54.729908\t23.6304\n1114170\t1.32\t7.12\t235\t87.942726\t41.4688\n1114171\t1.32\t7.16\t230\t84.276009\t39.302399\n1114172\t1.32\t7.2\t175\t53.388916\t20.937599\n1114173\t1.32\t7.24\t150\t41.781322\t15.2704\n1114174\t1.32\t7.28\t141\t38.018353\t13.6176\n1114175\t1.32\t7.32\t138\t36.92532\t13.3728\n1114176\t1.32\t7.36\t139\t37.527416\t13.944\n1114177\t1.32\t7.4\t137\t37.50066\t14.5472\n1114178\t1.32\t7.44\t138\t38.960922\t15.9424\n1114179\t1.32\t7.48\t139\t40.888668\t17.775999\n1114180\t1.32\t7.52\t141\t43.463345\t20.073601\n1114181\t1.32\t7.56\t146\t47.31134\t23.032\n1114182\t1.32\t7.6\t161\t55.668659\t28.156799\n1114183\t1.32\t7.64\t202\t78.641563\t41.534401\n1114184\t1.32\t7.68\t229\t95.039886\t51.6432\n1114185\t1.32\t7.72\t190\t80.14769\t46.019199\n1114186\t1.32\t7.76\t150\t67.770378\t42.707199\n1179656\t1.36\t5.12\t170\t59.568604\t27.475201\n1179657\t1.36\t5.16\t186\t59.43066\t24.624001\n1179658\t1.36\t5.2\t221\t82.084381\t44.030399\n1179659\t1.36\t5.24\t201\t63.314827\t26.819201\n1179660\t1.36\t5.28\t166\t43.148964\t14.064\n1179661\t1.36\t5.32\t163\t41.788754\t13.2096\n1179662\t1.36\t5.36\t156\t40.355309\t12.848\n1179663\t1.36\t5.4\t150\t40.130451\t13.1568\n1179664\t1.36\t5.44\t148\t42.268894\t14.6064\n1179665\t1.36\t5.48\t149\t46.076447\t16.846399\n1179677\t1.36\t5.96\t427\t424.7395\t856.65277\n1179678\t1.36\t6\t380\t441.20587\t955.65277\n1179693\t1.36\t6.6\t86\t36.484356\t23.952\n1179694\t1.36\t6.64\t143\t69.055405\t47.563202\n1179695\t1.36\t6.68\t331\t446.42902\t954.2912\n1179696\t1.36\t6.72\t130\t61.522186\t45.057598\n1179697\t1.36\t6.76\t45\t7.919024\t1.8784\n1179702\t1.36\t6.96\t81\t28.399715\t14.1872\n1179704\t1.36\t7.04\t123\t46.49823\t22.419201\n1179705\t1.36\t7.08\t140\t49.672371\t22.854401\n1179706\t1.36\t7.12\t229\t90.67083\t47.7216\n1179707\t1.36\t7.16\t240\t99.617096\t58.9072\n1179708\t1.36\t7.2\t170\t59.986076\t32.6208\n1179709\t1.36\t7.24\t148\t44.573105\t19.1824\n1179710\t1.36\t7.28\t141\t38.716789\t13.8336\n1179711\t1.36\t7.32\t135\t36.006298\t12.6304\n1179712\t1.36\t7.36\t133\t35.388229\t12.6496\n1179713\t1.36\t7.4\t135\t36.867722\t13.8016\n1179714\t1.36\t7.44\t136\t38.251236\t15.0672\n1179715\t1.36\t7.48\t136\t39.525829\t16.363199\n1179716\t1.36\t7.52\t140\t43.300285\t19.3424\n1179717\t1.36\t7.56\t144\t47.16922\t22.382401\n1179718\t1.36\t7.6\t160\t57.462002\t29.382401\n1179719\t1.36\t7.64\t201\t78.48597\t41.177601\n1179720\t1.36\t7.68\t229\t93.863861\t50.284801\n1179721\t1.36\t7.72\t181\t77.797424\t45.487999\n1179722\t1.36\t7.76\t151\t69.687874\t43.947201\n1245187\t1.4\t4.92\t42\t10.417987\t3.576\n1245188\t1.4\t4.96\t42\t9.2337847\t2.9024\n1245189\t1.4\t5\t42\t8.3405771\t2.3664\n1245190\t1.4\t5.04\t45\t8.9505377\t2.4560001\n1245191\t1.4\t5.08\t58\t12.344558\t3.3296001\n1245192\t1.4\t5.12\t179\t61.151897\t26.8032\n1245193\t1.4\t5.16\t182\t57.639931\t23.233601\n1245194\t1.4\t5.2\t219\t80.398125\t41.292801\n1245195\t1.4\t5.24\t188\t56.081787\t21.0208\n1245196\t1.4\t5.28\t166\t46.143532\t15.8352\n1245197\t1.4\t5.32\t156\t42.973881\t14.5408\n1245198\t1.4\t5.36\t155\t43.596321\t14.9776\n1245199\t1.4\t5.4\t152\t44.38921\t15.704\n1245200\t1.4\t5.44\t149\t45.984169\t16.983999\n1245201\t1.4\t5.48\t149\t49.333725\t19.143999\n1245213\t1.4\t5.96\t289\t362.39203\t803.15997\n1245214\t1.4\t6\t296\t401.52319\t915.71838\n1245230\t1.4\t6.64\t88\t25.849367\t10.1696\n1245231\t1.4\t6.68\t327\t434.84845\t920.24957\n1245232\t1.4\t6.72\t86\t26.045444\t11.0544\n1245238\t1.4\t6.96\t50\t16.939228\t8.0640001\n1245240\t1.4\t7.04\t123\t48.747078\t23.927999\n1245241\t1.4\t7.08\t136\t52.084644\t25.0016\n1245242\t1.4\t7.12\t213\t80.430267\t38.1744\n1245243\t1.4\t7.16\t220\t79.317871\t35.936001\n1245244\t1.4\t7.2\t147\t47.4258\t19.7216\n1245245\t1.4\t7.24\t136\t39.925068\t14.8896\n1245246\t1.4\t7.28\t147\t54.313828\t34.947201\n1245247\t1.4\t7.32\t144\t53.348759\t36.188801\n1245248\t1.4\t7.36\t139\t45.266205\t25.497601\n1245249\t1.4\t7.4\t134\t40.167675\t18.913601\n1245250\t1.4\t7.44\t130\t36.19965\t13.2736\n1245251\t1.4\t7.48\t132\t38.587986\t15.2848\n1245252\t1.4\t7.52\t137\t43.072994\t18.7008\n1245253\t1.4\t7.56\t141\t47.125225\t21.857599\n1245254\t1.4\t7.6\t153\t56.67968\t28.5984\n1245255\t1.4\t7.64\t193\t74.230766\t38.187199\n1245256\t1.4\t7.68\t227\t91.081612\t47.9216\n1245257\t1.4\t7.72\t166\t72.843925\t42.150398\n1245258\t1.4\t7.76\t147\t67.652451\t40.462399\n1310723\t1.44\t4.92\t53\t14.966986\t5.8256001\n1310724\t1.44\t4.96\t58\t15.419645\t5.7168002\n1310725\t1.44\t5\t70\t22.676468\t11.5968\n1310726\t1.44\t5.04\t100\t36.472126\t19.1504\n1310727\t1.44\t5.08\t150\t54.785149\t25.799999\n1310728\t1.44\t5.12\t165\t59.108219\t26.041599\n1310729\t1.44\t5.16\t161\t54.014061\t22.3328\n1310730\t1.44\t5.2\t217\t80.499725\t40.547199\n1310731\t1.44\t5.24\t172\t52.289356\t19.625601\n1310732\t1.44\t5.28\t154\t46.425999\t17.024\n1310733\t1.44\t5.32\t154\t46.648079\t17.0928\n1310734\t1.44\t5.36\t151\t46.328548\t17.1136\n1310735\t1.44\t5.4\t150\t47.680454\t18.084801\n1310736\t1.44\t5.44\t149\t49.8955\t19.672001\n1310737\t1.44\t5.48\t149\t53.050331\t21.832001\n1310749\t1.44\t5.96\t268\t347.24921\t773.9776\n1310750\t1.44\t6\t272\t384.58774\t882.5072\n1310767\t1.44\t6.68\t339\t432.88809\t899.40961\n1310774\t1.44\t6.96\t54\t16.141594\t7.0144\n1310778\t1.44\t7.12\t149\t54.254265\t25.247999\n1310779\t1.44\t7.16\t143\t49.218288\t22.3328\n1310792\t1.44\t7.68\t144\t46.916862\t20.499201\n1376259\t1.48\t4.92\t59\t21.449614\t12.296\n1376260\t1.48\t4.96\t77\t32.645191\t20.784\n1376261\t1.48\t5\t78\t30.294525\t17.431999\n1376262\t1.48\t5.04\t75\t26.076345\t12.4912\n1376264\t1.48\t5.12\t31\t7.9562602\t2.7664001\n1376265\t1.48\t5.16\t42\t10.491853\t3.4463999\n1376266\t1.48\t5.2\t195\t78.081009\t40.409599\n1376267\t1.48\t5.24\t63\t21.245878\t10.696\n1376283\t1.48\t5.88\t88\t32.133827\t16.995199\n1376284\t1.48\t5.92\t112\t60.299961\t54.708801\n1376285\t1.48\t5.96\t263\t336.78943\t747.2912\n1376286\t1.48\t6\t284\t378.37604\t854.23041\n1376287\t1.48\t6.04\t89\t32.786522\t18.4624\n1376288\t1.48\t6.08\t82\t26.918541\t12.1744\n1376303\t1.48\t6.68\t345\t424.33478\t867.51038\n1376308\t1.48\t6.88\t32\t6.0233135\t1.5312001\n1376309\t1.48\t6.92\t44\t10.319736\t3.7823999\n1376310\t1.48\t6.96\t55\t14.817451\t6.0064001\n1376311\t1.48\t7\t33\t6.6905565\t1.832\n1376312\t1.48\t7.04\t81\t24.144417\t9.1728001\n1376313\t1.48\t7.08\t83\t23.289831\t8.5103998\n1376314\t1.48\t7.12\t142\t48.784927\t22.68\n1376315\t1.48\t7.16\t135\t45.952545\t21.291201\n1376316\t1.48\t7.2\t82\t23.409365\t8.7264004\n1376317\t1.48\t7.24\t80\t23.538675\t8.7872\n1376319\t1.48\t7.32\t71\t18.672298\t5.9136\n1376320\t1.48\t7.36\t71\t17.640558\t5.4527998\n1376321\t1.48\t7.4\t71\t17.111734\t5.2224002\n1376322\t1.48\t7.44\t71\t17.111734\t5.2224002\n1376323\t1.48\t7.48\t71\t17.640558\t5.4527998\n1376324\t1.48\t7.52\t72\t19.104965\t6.1008\n1376326\t1.48\t7.6\t61\t15.138167\t4.6528001\n1376327\t1.48\t7.64\t102\t32.652061\t14.488\n1376328\t1.48\t7.68\t123\t41.494232\t19.455999\n1376329\t1.48\t7.72\t82\t20.283421\t6.1855998\n1376330\t1.48\t7.76\t62\t15.90697\t5.0528002\n1441795\t1.52\t4.92\t69\t29.836424\t19.060801\n1441796\t1.52\t4.96\t72\t30.148283\t18.6896\n1441797\t1.52\t5\t60\t19.974895\t10.0096\n1441798\t1.52\t5.04\t42\t10.739431\t4.6143999\n1441800\t1.52\t5.12\t34\t8.0922527\t2.9568\n1441801\t1.52\t5.16\t108\t38.321426\t17.4032\n1441802\t1.52\t5.2\t173\t69.179703\t35.827202\n1441803\t1.52\t5.24\t90\t27.271202\t10.3648\n1441819\t1.52\t5.88\t85\t26.072828\t11.5984\n1441820\t1.52\t5.92\t125\t57.490608\t45.028801\n1441821\t1.52\t5.96\t258\t328.18991\t722.13599\n1441822\t1.52\t6\t282\t372.82413\t833.58398\n1441823\t1.52\t6.04\t89\t29.179459\t15.4368\n1441824\t1.52\t6.08\t80\t22.520805\t8.5439997\n1441837\t1.52\t6.6\t249\t258.19824\t422.97119\n1441838\t1.52\t6.64\t291\t354.75665\t722.50879\n1441839\t1.52\t6.68\t350\t418.0278\t839.58081\n1441840\t1.52\t6.72\t296\t341.0491\t672.70239\n1441841\t1.52\t6.76\t243\t264.82916\t453.92801\n1441844\t1.52\t6.88\t33\t5.3463125\t1.1984\n1441845\t1.52\t6.92\t45\t9.7776852\t3.3487999\n1441846\t1.52\t6.96\t56\t14.085178\t5.3407998\n1441847\t1.52\t7\t34\t5.8544292\t1.424\n1441848\t1.52\t7.04\t84\t22.699131\t7.8495998\n1441849\t1.52\t7.08\t91\t23.144194\t7.7184\n1441850\t1.52\t7.12\t135\t46.039051\t22.1248\n1441851\t1.52\t7.16\t130\t43.464912\t20.576\n1441852\t1.52\t7.2\t90\t22.396355\t7.3712001\n1441853\t1.52\t7.24\t80\t21.188469\t7.2816\n1441855\t1.52\t7.32\t71\t16.617079\t4.7616\n1441856\t1.52\t7.36\t71\t15.479453\t4.3007998\n1441857\t1.52\t7.4\t71\t14.896123\t4.0704002\n1441858\t1.52\t7.44\t71\t14.896123\t4.0704002\n1441859\t1.52\t7.48\t72\t15.856812\t4.4432001\n1441860\t1.52\t7.52\t72\t17.017078\t4.9215999\n1441862\t1.52\t7.6\t67\t14.759789\t4.0208001\n1441863\t1.52\t7.64\t102\t33.809765\t16.4272\n1441864\t1.52\t7.68\t114\t39.028557\t19.467199\n1441865\t1.52\t7.72\t80\t17.924141\t5.0240002\n1441866\t1.52\t7.76\t72\t17.330088\t5.1680002\n1507331\t1.56\t4.92\t55\t19.384987\t9.8304005\n1507332\t1.56\t4.96\t56\t19.041708\t9.6767998\n1507333\t1.56\t5\t49\t14.817757\t7.2416\n1507334\t1.56\t5.04\t34\t5.1768894\t1.1792001\n1507335\t1.56\t5.08\t47\t11.980098\t5.0911999\n1507336\t1.56\t5.12\t60\t19.768717\t9.4960003\n1507337\t1.56\t5.16\t82\t30.850124\t15.0352\n1507338\t1.56\t5.2\t187\t70.128418\t34.537601\n1507339\t1.56\t5.24\t83\t25.144419\t9.7600002\n1507355\t1.56\t5.88\t86\t23.537201\t9.1887999\n1507356\t1.56\t5.92\t128\t52.324951\t35.703999\n1507357\t1.56\t5.96\t255\t320.36963\t697.77917\n1507358\t1.56\t6\t279\t364.2807\t805.88641\n1507359\t1.56\t6.04\t97\t30.145798\t14.9648\n1507360\t1.56\t6.08\t79\t19.716049\t6.744\n1507373\t1.56\t6.6\t256\t247.30463\t393.91199\n1507374\t1.56\t6.64\t308\t352.36646\t700.72803\n1507375\t1.56\t6.68\t341\t403.74146\t806.86078\n1507376\t1.56\t6.72\t303\t334.56653\t648.84961\n1507377\t1.56\t6.76\t255\t251.64864\t414.01761\n1507380\t1.56\t6.88\t35\t5.4053993\t1.1328\n1507381\t1.56\t6.92\t44\t8.8297749\t2.8176\n1507382\t1.56\t6.96\t57\t13.521199\t4.7663999\n1507383\t1.56\t7\t33\t4.8911719\t0.98879999\n1507384\t1.56\t7.04\t89\t22.59363\t7.3856001\n1507385\t1.56\t7.08\t91\t21.454315\t6.7584\n1507386\t1.56\t7.12\t135\t45.790794\t22.7328\n1507387\t1.56\t7.16\t128\t41.85854\t20.1968\n1507388\t1.56\t7.2\t92\t21.333698\t6.5071998\n1507389\t1.56\t7.24\t87\t21.345631\t6.8000002\n1507391\t1.56\t7.32\t72\t15.301398\t3.9760001\n1507392\t1.56\t7.36\t71\t13.714247\t3.3792\n1507393\t1.56\t7.4\t71\t13.088058\t3.1487999\n1507394\t1.56\t7.44\t71\t13.088058\t3.1487999\n1507395\t1.56\t7.48\t72\t14.058339\t3.4976001\n1507396\t1.56\t7.52\t72\t15.301398\t3.9760001\n1507398\t1.56\t7.6\t69\t14.38336\t3.6847999\n1507399\t1.56\t7.64\t100\t32.941559\t16.7568\n1507400\t1.56\t7.68\t111\t37.828407\t19.6752\n1507401\t1.56\t7.72\t88\t23.215038\t9.2816\n1507402\t1.56\t7.76\t75\t16.691599\t4.5999999\n1572869\t1.6\t5\t106\t33.540142\t12.8672\n1572870\t1.6\t5.04\t107\t30.979067\t11.024\n1572871\t1.6\t5.08\t107\t28.700459\t9.6000004\n1572872\t1.6\t5.12\t107\t26.962923\t8.5248003\n1572873\t1.6\t5.16\t120\t34.218254\t13.8896\n1572874\t1.6\t5.2\t188\t65.33342\t31.360001\n1572875\t1.6\t5.24\t126\t35.454872\t15.08\n1572876\t1.6\t5.28\t111\t28.607075\t9.8479996\n1572877\t1.6\t5.32\t108\t27.579021\t8.8992004\n1572878\t1.6\t5.36\t107\t28.906731\t9.8079996\n1572879\t1.6\t5.4\t106\t30.775557\t11.08\n1572880\t1.6\t5.44\t105\t33.095074\t12.6864\n1572891\t1.6\t5.88\t92\t23.914549\t8.5551996\n1572892\t1.6\t5.92\t128\t47.565628\t28.489599\n1572893\t1.6\t5.96\t253\t313.45911\t674.4848\n1572894\t1.6\t6\t277\t356.535\t779.16479\n1572895\t1.6\t6.04\t102\t29.904795\t13.5808\n1572896\t1.6\t6.08\t80\t18.453127\t5.8000002\n1572908\t1.6\t6.56\t149\t70.874908\t50.177601\n1572909\t1.6\t6.6\t263\t238.03102\t367.18561\n1572910\t1.6\t6.64\t311\t347.41339\t684.33759\n1572911\t1.6\t6.68\t337\t391.76797\t775.95203\n1572912\t1.6\t6.72\t306\t329.27002\t629.23358\n1572913\t1.6\t6.76\t261\t240.27705\t382.0752\n1572914\t1.6\t6.8\t136\t57.111465\t34.755199\n1572915\t1.6\t6.84\t110\t38.981159\t18.876801\n1572916\t1.6\t6.88\t33\t4.6216531\t0.84640002\n1572917\t1.6\t6.92\t45\t8.6902657\t2.5616\n1572918\t1.6\t6.96\t58\t13.140449\t4.3056002\n1572919\t1.6\t7\t33\t4.7784972\t0.93120003\n1572920\t1.6\t7.04\t88\t20.590557\t6.1631999\n1572921\t1.6\t7.08\t90\t19.80237\t5.8304\n1572922\t1.6\t7.12\t132\t44.50029\t22.9568\n1572923\t1.6\t7.16\t126\t40.586376\t20.041599\n1572924\t1.6\t7.2\t93\t20.631918\t6.0528002\n1572925\t1.6\t7.24\t89\t20.796692\t6.2463999\n1572927\t1.6\t7.32\t74\t14.837963\t3.6256001\n1572928\t1.6\t7.36\t72\t12.686926\t2.7855999\n1572929\t1.6\t7.4\t71\t11.717723\t2.4576001\n1572930\t1.6\t7.44\t72\t12.006167\t2.5408001\n1572931\t1.6\t7.48\t73\t13.112132\t2.9663999\n1572932\t1.6\t7.52\t72\t13.989435\t3.2639999\n1572934\t1.6\t7.6\t72\t14.727295\t3.72\n1572935\t1.6\t7.64\t100\t33.323078\t17.944\n1572936\t1.6\t7.68\t107\t36.607193\t20.0128\n1572937\t1.6\t7.72\t93\t27.004366\t12.648\n1572938\t1.6\t7.76\t74\t15.634545\t4.1343999\n1638405\t1.64\t5\t104\t30.228973\t10.8096\n1638406\t1.64\t5.04\t104\t27.305202\t9.0383997\n1638407\t1.64\t5.08\t111\t28.036549\t9.1552\n1638408\t1.64\t5.12\t111\t25.956234\t7.8720002\n1638409\t1.64\t5.16\t132\t36.346493\t14.768\n1638410\t1.64\t5.2\t179\t60.948643\t29.4592\n1638411\t1.64\t5.24\t156\t47.01733\t20.636801\n1638412\t1.64\t5.28\t113\t25.170645\t7.4159999\n1638413\t1.64\t5.32\t110\t25.870001\t7.9439998\n1638414\t1.64\t5.36\t108\t26.879467\t8.6927996\n1638415\t1.64\t5.4\t106\t28.628239\t9.9055996\n1638416\t1.64\t5.44\t105\t31.102196\t11.4848\n1638427\t1.64\t5.88\t94\t23.992495\t8.4432001\n1638428\t1.64\t5.92\t125\t43.138798\t23.3424\n1638429\t1.64\t5.96\t253\t307.89032\t652.4176\n1638430\t1.64\t6\t278\t352.75854\t760.00641\n1638431\t1.64\t6.04\t104\t29.407681\t12.7568\n1638432\t1.64\t6.08\t81\t18.045052\t5.4768\n1638444\t1.64\t6.56\t144\t57.998772\t32.8368\n1638445\t1.64\t6.6\t266\t227.04224\t336.66241\n1638446\t1.64\t6.64\t314\t341.94354\t663.04962\n1638447\t1.64\t6.68\t333\t380.26965\t746.05762\n1638448\t1.64\t6.72\t307\t322.71463\t608.48962\n1638449\t1.64\t6.76\t273\t236.95343\t361.0416\n1638450\t1.64\t6.8\t133\t50.103779\t27.867201\n1638451\t1.64\t6.84\t104\t31.712662\t13.048\n1638452\t1.64\t6.88\t31\t4.7147136\t0.98879999\n1638453\t1.64\t6.92\t46\t8.7453232\t2.4096\n1638454\t1.64\t6.96\t59\t12.948497\t3.9807999\n1638455\t1.64\t7\t30\t4.3493905\t0.86720002\n1638456\t1.64\t7.04\t91\t20.792582\t6.0288\n1638457\t1.64\t7.08\t91\t19.30509\t5.4496002\n1638458\t1.64\t7.12\t131\t44.178627\t23.636801\n1638459\t1.64\t7.16\t125\t39.764809\t20.049601\n1638460\t1.64\t7.2\t93\t19.760447\t5.5423999\n1638461\t1.64\t7.24\t89\t19.733002\t5.5215998\n1638463\t1.64\t7.32\t73\t13.555484\t2.9935999\n1638464\t1.64\t7.36\t74\t12.493398\t2.5792\n1638465\t1.64\t7.4\t72\t11.032143\t2.0511999\n1638466\t1.64\t7.44\t73\t11.423811\t2.1984\n1638467\t1.64\t7.48\t72\t11.758007\t2.3072\n1638468\t1.64\t7.52\t75\t14.467733\t3.4159999\n1638470\t1.64\t7.6\t72\t14.480923\t3.6719999\n1638471\t1.64\t7.64\t97\t32.189903\t18.132799\n1638472\t1.64\t7.68\t105\t36.462269\t21.060801\n1638473\t1.64\t7.72\t95\t29.151518\t15.1136\n1638474\t1.64\t7.76\t76\t15.959687\t4.2495999\n1703941\t1.68\t5\t105\t29.200998\t10.1936\n1703942\t1.68\t5.04\t107\t27.045214\t8.8079996\n1703943\t1.68\t5.08\t109\t25.14806\t7.5455999\n1703944\t1.68\t5.12\t113\t24.302929\t6.8080001\n1703945\t1.68\t5.16\t153\t46.73637\t22.5776\n1703946\t1.68\t5.2\t174\t57.118546\t27.3424\n1703947\t1.68\t5.24\t160\t49.564838\t22.819201\n1703948\t1.68\t5.28\t114\t23.127714\t6.0447998\n1703949\t1.68\t5.32\t112\t24.111921\t6.7680001\n1703950\t1.68\t5.36\t108\t25.181557\t7.7375998\n1703951\t1.68\t5.4\t105\t26.410864\t8.5872002\n1703952\t1.68\t5.44\t102\t27.662252\t9.3168001\n1703963\t1.68\t5.88\t99\t25.978851\t9.4768\n1703964\t1.68\t5.92\t123\t39.686211\t19.396799\n1703965\t1.68\t5.96\t253\t302.30261\t630.64478\n1703966\t1.68\t6\t277\t345.99835\t734.73279\n1703967\t1.68\t6.04\t104\t28.348246\t11.6176\n1703968\t1.68\t6.08\t87\t20.595198\t6.816\n1703980\t1.68\t6.56\t142\t52.088741\t26.739201\n1703981\t1.68\t6.6\t272\t220.76434\t315.83359\n1703982\t1.68\t6.64\t319\t339.36288\t649.55042\n1703983\t1.68\t6.68\t332\t371.40356\t721.13599\n1703984\t1.68\t6.72\t310\t321.1333\t604.36481\n1703985\t1.68\t6.76\t273\t226.19142\t331.97281\n1703986\t1.68\t6.8\t131\t44.717018\t22.5264\n1703987\t1.68\t6.84\t101\t27.331169\t9.5696001\n1703988\t1.68\t6.88\t29\t5.1940899\t1.2464\n1703989\t1.68\t6.92\t38\t6.1805968\t1.3712\n1703990\t1.68\t6.96\t63\t13.561599\t3.9424\n1703991\t1.68\t7\t28\t4.8462081\t1.128\n1703992\t1.68\t7.04\t92\t20.882935\t6.0560002\n1703993\t1.68\t7.08\t96\t20.797064\t5.9583998\n1703994\t1.68\t7.12\t132\t45.530884\t25.5296\n1703995\t1.68\t7.16\t124\t39.94175\t21.1408\n1703996\t1.68\t7.2\t99\t23.633528\t8.4560003\n1703997\t1.68\t7.24\t90\t19.842379\t5.5408001\n1703999\t1.68\t7.32\t75\t13.918261\t3.0880001\n1704000\t1.68\t7.36\t74\t12.024062\t2.3408\n1704001\t1.68\t7.4\t75\t11.386681\t2.0527999\n1704002\t1.68\t7.44\t73\t10.989633\t1.9984\n1704003\t1.68\t7.48\t75\t12.480132\t2.5488\n1704004\t1.68\t7.52\t76\t14.21991\t3.1744001\n1704006\t1.68\t7.6\t76\t17.451048\t6.0079999\n1704007\t1.68\t7.64\t94\t31.444889\t18.5296\n1704008\t1.68\t7.68\t104\t37.434654\t22.972799\n1704009\t1.68\t7.72\t98\t31.624578\t17.375999\n1704010\t1.68\t7.76\t77\t16.366362\t4.5232\n1769477\t1.72\t5\t104\t27.828571\t9.3520002\n1769478\t1.72\t5.04\t107\t26.115921\t8.2687998\n1769479\t1.72\t5.08\t109\t23.909519\t6.8368001\n1769480\t1.72\t5.12\t115\t23.969769\t6.48\n1769481\t1.72\t5.16\t157\t52.41098\t30.694401\n1769482\t1.72\t5.2\t172\t56.30455\t27.428801\n1769483\t1.72\t5.24\t161\t50.035015\t23.524799\n1769484\t1.72\t5.28\t117\t23.370098\t6.0159998\n1769485\t1.72\t5.32\t111\t22.800392\t6.1040001\n1769486\t1.72\t5.36\t110\t24.599094\t7.2128\n1769487\t1.72\t5.4\t103\t24.164181\t7.2416\n1769488\t1.72\t5.44\t101\t26.450563\t8.6176004\n1769499\t1.72\t5.88\t99\t26.225559\t9.7440004\n1769500\t1.72\t5.92\t119\t36.350471\t16.476801\n1769501\t1.72\t5.96\t253\t296.9805\t609.47357\n1769502\t1.72\t6\t278\t341.36322\t712.56317\n1769503\t1.72\t6.04\t100\t25.783735\t9.8319998\n1769504\t1.72\t6.08\t89\t21.901335\t7.6575999\n1769516\t1.72\t6.56\t136\t45.587566\t21.0112\n1769517\t1.72\t6.6\t276\t216.16621\t300.0704\n1769518\t1.72\t6.64\t320\t331.69208\t625.56641\n1769519\t1.72\t6.68\t335\t364.71262\t695.82721\n1769520\t1.72\t6.72\t309\t313.14508\t582.6192\n1769521\t1.72\t6.76\t274\t218.25392\t310.328\n1769522\t1.72\t6.8\t130\t41.241798\t18.681601\n1769523\t1.72\t6.84\t96\t24.043129\t7.5888\n1769524\t1.72\t6.88\t32\t6.4472461\t1.7728\n1769525\t1.72\t6.92\t43\t7.6804147\t1.8559999\n1769526\t1.72\t6.96\t62\t13.317303\t3.8640001\n1769527\t1.72\t7\t32\t6.3409433\t1.704\n1769528\t1.72\t7.04\t99\t23.866726\t7.3807998\n1769529\t1.72\t7.08\t100\t23.496498\t8.1087999\n1769530\t1.72\t7.12\t134\t46.609406\t26.844801\n1769531\t1.72\t7.16\t126\t41.599094\t22.995199\n1769532\t1.72\t7.2\t102\t26.495483\t11.4896\n1769533\t1.72\t7.24\t90\t19.942865\t5.6431999\n1769535\t1.72\t7.32\t78\t15.039348\t3.5248001\n1769536\t1.72\t7.36\t78\t13.208932\t2.7456\n1769537\t1.72\t7.4\t78\t12.398946\t2.4128001\n1769538\t1.72\t7.44\t79\t12.46011\t2.3648\n1769539\t1.72\t7.48\t78\t13.548032\t2.9584\n1769540\t1.72\t7.52\t80\t15.901108\t3.9119999\n1769542\t1.72\t7.6\t80\t21.251511\t9.5472002\n1769543\t1.72\t7.64\t93\t31.716228\t19.288\n1769544\t1.72\t7.68\t106\t39.049652\t24.7792\n1769545\t1.72\t7.72\t102\t34.570621\t19.812799\n1769546\t1.72\t7.76\t80\t18.046577\t5.4335999\n1835013\t1.76\t5\t101\t26.05162\t8.3039999\n1835014\t1.76\t5.04\t107\t25.628706\t7.8592\n1835015\t1.76\t5.08\t111\t24.651609\t7.1184001\n1835016\t1.76\t5.12\t121\t27.610903\t9.0112\n1835017\t1.76\t5.16\t162\t57.684177\t37.942402\n1835018\t1.76\t5.2\t171\t55.9403\t27.5616\n1835019\t1.76\t5.24\t159\t49.683365\t23.7952\n1835020\t1.76\t5.28\t121\t25.352613\t7.0479999\n1835021\t1.76\t5.32\t114\t23.753483\t6.4015999\n1835022\t1.76\t5.36\t105\t22.397604\t6.1664\n1835023\t1.76\t5.4\t103\t23.960836\t7.0416002\n1835024\t1.76\t5.44\t100\t25.66605\t8.1183996\n1835035\t1.76\t5.88\t96\t25.94153\t10.0576\n1835036\t1.76\t5.92\t117\t34.954933\t15.296\n1835037\t1.76\t5.96\t253\t291.51703\t588.4624\n1835038\t1.76\t6\t281\t339.24445\t694.93439\n1835039\t1.76\t6.04\t98\t25.734337\t10.1456\n1835040\t1.76\t6.08\t91\t23.990833\t9.1087999\n1835052\t1.76\t6.56\t124\t37.176418\t14.7504\n1835053\t1.76\t6.6\t275\t204.99234\t273.18719\n1835054\t1.76\t6.64\t325\t330.60281\t615.20319\n1835055\t1.76\t6.68\t340\t358.13306\t670.29279\n1835056\t1.76\t6.72\t308\t307.33923\t568.32642\n1835057\t1.76\t6.76\t278\t211.53795\t287.45441\n1835058\t1.76\t6.8\t122\t36.062725\t15.272\n1835059\t1.76\t6.84\t91\t21.8431\t6.4784002\n1835060\t1.76\t6.88\t33\t5.4359469\t1.2496001\n1835061\t1.76\t6.92\t46\t9.0090227\t2.5552001\n1835062\t1.76\t6.96\t59\t12.71044\t3.8271999\n1835063\t1.76\t7\t35\t5.8348846\t1.3552001\n1835064\t1.76\t7.04\t97\t23.469893\t7.3104\n1835065\t1.76\t7.08\t108\t28.393246\t11.2704\n1835066\t1.76\t7.12\t141\t50.746086\t30.087999\n1835067\t1.76\t7.16\t132\t44.860577\t25.608\n1835068\t1.76\t7.2\t108\t29.933138\t13.9648\n1835069\t1.76\t7.24\t88\t19.7896\t5.7328\n1835071\t1.76\t7.32\t80\t16.159086\t3.9935999\n1835072\t1.76\t7.36\t85\t15.91521\t3.8144\n1835073\t1.76\t7.4\t88\t15.695617\t3.5072\n1835074\t1.76\t7.44\t90\t16.425106\t3.7872\n1835075\t1.76\t7.48\t85\t15.936421\t3.8080001\n1835076\t1.76\t7.52\t82\t17.138847\t4.4752002\n1835078\t1.76\t7.6\t82\t24.284025\t12.528\n1835079\t1.76\t7.64\t98\t34.506317\t21.625601\n1835080\t1.76\t7.68\t110\t41.497154\t26.8256\n1835081\t1.76\t7.72\t106\t38.104664\t22.912001\n1835082\t1.76\t7.76\t86\t22.483219\t8.5567999\n1900549\t1.8\t5\t100\t26.4561\t8.6496\n1900550\t1.8\t5.04\t102\t23.898556\t6.9679999\n1900551\t1.8\t5.08\t110\t24.664074\t6.9856\n1900552\t1.8\t5.12\t129\t34.880669\t14.5136\n1900553\t1.8\t5.16\t161\t56.145508\t34.743999\n1900554\t1.8\t5.2\t171\t56.466873\t28.131201\n1900555\t1.8\t5.24\t160\t50.736176\t24.6336\n1900556\t1.8\t5.28\t127\t29.618959\t9.6831999\n1900557\t1.8\t5.32\t110\t22.760733\t5.9359999\n1900558\t1.8\t5.36\t104\t22.435322\t6.0544\n1900559\t1.8\t5.4\t101\t23.589909\t6.8319998\n1900560\t1.8\t5.44\t99\t25.783669\t8.1775999\n1900571\t1.8\t5.88\t98\t28.379307\t11.672\n1900572\t1.8\t5.92\t110\t31.884623\t13.44\n1900573\t1.8\t5.96\t255\t287.25287\t568.5968\n1900574\t1.8\t6\t282\t334.46167\t672.2688\n1900575\t1.8\t6.04\t99\t27.694965\t11.672\n1900576\t1.8\t6.08\t90\t25.715246\t10.8512\n1900588\t1.8\t6.56\t111\t31.011696\t11.2704\n1900589\t1.8\t6.6\t277\t199.17665\t257.48639\n1900590\t1.8\t6.64\t327\t325.68964\t598.82562\n1900591\t1.8\t6.68\t344\t355.06354\t655.96802\n1900592\t1.8\t6.72\t313\t301.82709\t547.06079\n1900593\t1.8\t6.76\t276\t203.60538\t270.92801\n1900594\t1.8\t6.8\t112\t32.74004\t14.088\n1900595\t1.8\t6.84\t88\t22.689419\t7.4496002\n1900596\t1.8\t6.88\t35\t5.268044\t1.056\n1900597\t1.8\t6.92\t47\t9.388896\t2.8064001\n1900598\t1.8\t6.96\t58\t12.74391\t4.0496001\n1900599\t1.8\t7\t39\t6.6145105\t1.512\n1900600\t1.8\t7.04\t114\t33.698605\t13.3504\n1900601\t1.8\t7.08\t128\t40.336849\t18.996799\n1900602\t1.8\t7.12\t157\t59.214581\t35.335999\n1900603\t1.8\t7.16\t155\t55.868698\t32.0448\n1900604\t1.8\t7.2\t138\t41.540627\t19.5536\n1900605\t1.8\t7.24\t123\t30.408176\t9.7088003\n1900606\t1.8\t7.28\t65\t14.382514\t4.1360002\n1900607\t1.8\t7.32\t109\t23.232391\t6\n1900608\t1.8\t7.36\t107\t21.784542\t5.4144001\n1900609\t1.8\t7.4\t105\t20.855827\t5.1087999\n1900610\t1.8\t7.44\t105\t20.937033\t5.1728001\n1900611\t1.8\t7.48\t106\t21.799471\t5.5711999\n1900612\t1.8\t7.52\t109\t23.548716\t6.3392\n1900613\t1.8\t7.56\t59\t13.16826\t4.0128002\n1900614\t1.8\t7.6\t122\t39.86166\t20.7696\n1900615\t1.8\t7.64\t126\t46.456577\t27.948799\n1900616\t1.8\t7.68\t132\t53.049545\t34.032001\n1900617\t1.8\t7.72\t128\t50.90974\t31.184\n1900618\t1.8\t7.76\t109\t36.358337\t17.318399\n1966085\t1.84\t5\t99\t26.850645\t8.7040005\n1966086\t1.84\t5.04\t100\t24.458662\t7.2736001\n1966087\t1.84\t5.08\t108\t26.779778\t9.2159996\n1966088\t1.84\t5.12\t127\t35.266022\t14.5696\n1966089\t1.84\t5.16\t150\t45.680565\t21.374399\n1966090\t1.84\t5.2\t171\t57.256329\t28.7712\n1966091\t1.84\t5.24\t163\t53.083187\t26.041599\n1966092\t1.84\t5.28\t129\t33.709217\t12.8064\n1966093\t1.84\t5.32\t106\t22.898537\t6.1231999\n1966094\t1.84\t5.36\t102\t22.927736\t6.296\n1966095\t1.84\t5.4\t100\t24.672245\t7.4271998\n1966096\t1.84\t5.44\t99\t27.050997\t8.8559999\n1966107\t1.84\t5.88\t97\t30.470633\t13.5824\n1966108\t1.84\t5.92\t111\t34.395092\t15.3888\n1966109\t1.84\t5.96\t260\t284.88397\t550.59363\n1966110\t1.84\t6\t285\t331.16534\t651.99042\n1966111\t1.84\t6.04\t96\t28.830515\t12.9936\n1966112\t1.84\t6.08\t84\t25.357422\t11.24\n1966124\t1.84\t6.56\t94\t27.003283\t10.392\n1966125\t1.84\t6.6\t279\t194.35161\t242.76801\n1966126\t1.84\t6.64\t333\t321.65436\t579.19843\n1966127\t1.84\t6.68\t350\t350.92413\t635.12958\n1966128\t1.84\t6.72\t317\t299.18933\t534.95038\n1966129\t1.84\t6.76\t274\t194.16458\t248.25121\n1966130\t1.84\t6.8\t93\t28.727888\t13.7808\n1966132\t1.84\t6.88\t38\t6.2843246\t1.4016\n1966133\t1.84\t6.92\t47\t9.7038107\t3.0752001\n1966134\t1.84\t6.96\t58\t13.296454\t4.5167999\n1966135\t1.84\t7\t40\t6.6949558\t1.4848\n1966136\t1.84\t7.04\t107\t32.256802\t12.96\n1966137\t1.84\t7.08\t125\t42.16502\t21.742399\n1966138\t1.84\t7.12\t155\t60.218964\t36.9664\n1966139\t1.84\t7.16\t154\t57.981598\t34.787201\n1966140\t1.84\t7.2\t135\t43.48848\t22.1168\n1966141\t1.84\t7.24\t125\t33.053497\t11.2848\n1966142\t1.84\t7.28\t107\t25.425043\t7.2031999\n1966143\t1.84\t7.32\t110\t24.544771\t6.5872002\n1966144\t1.84\t7.36\t102\t21.595726\t5.6064\n1966145\t1.84\t7.4\t101\t20.972654\t5.3983998\n1966146\t1.84\t7.44\t101\t21.091574\t5.4896002\n1966147\t1.84\t7.48\t102\t21.915285\t5.8559999\n1966148\t1.84\t7.52\t107\t23.942425\t6.5696001\n1966149\t1.84\t7.56\t103\t25.240126\t7.9456\n1966150\t1.84\t7.6\t120\t41.738804\t23.448\n1966151\t1.84\t7.64\t122\t47.411034\t29.937599\n1966152\t1.84\t7.68\t127\t53.163315\t35.3088\n1966153\t1.84\t7.72\t127\t54.339512\t35.659199\n1966154\t1.84\t7.76\t109\t40.036774\t21.5072\n2031621\t1.88\t5\t98\t28.47743\t9.6543999\n2031622\t1.88\t5.04\t100\t26.474697\t8.2959995\n2031623\t1.88\t5.08\t105\t28.455574\t10.5104\n2031624\t1.88\t5.12\t121\t37.4762\t17.430401\n2031625\t1.88\t5.16\t148\t48.271687\t23.496\n2031626\t1.88\t5.2\t178\t60.292068\t30.108801\n2031627\t1.88\t5.24\t161\t52.860703\t25.995199\n2031628\t1.88\t5.28\t122\t35.239731\t15.0976\n2031629\t1.88\t5.32\t106\t26.174126\t8.1744003\n2031630\t1.88\t5.36\t100\t24.396278\t7.0799999\n2031631\t1.88\t5.4\t100\t26.684328\t8.4560003\n2031632\t1.88\t5.44\t100\t29.367298\t10.0928\n2031643\t1.88\t5.88\t85\t28.823233\t13.672\n2031644\t1.88\t5.92\t105\t36.08765\t17.7216\n2031645\t1.88\t5.96\t271\t284.88239\t534.18402\n2031646\t1.88\t6\t291\t331.03284\t636.43518\n2031647\t1.88\t6.04\t89\t30.737764\t15.7184\n2031648\t1.88\t6.08\t81\t27.145617\t12.8144\n2031661\t1.88\t6.6\t276\t184.20358\t215.608\n2031662\t1.88\t6.64\t336\t317.6022\t563.86078\n2031663\t1.88\t6.68\t353\t344.26614\t611.34082\n2031664\t1.88\t6.72\t320\t295.76074\t521.44159\n2031665\t1.88\t6.76\t262\t185.78323\t230.26559\n2031668\t1.88\t6.88\t36\t6.1236434\t1.4112\n2031669\t1.88\t6.92\t46\t9.9162254\t3.3504\n2031670\t1.88\t6.96\t56\t13.305697\t4.8207998\n2031671\t1.88\t7\t46\t10.687746\t3.8432\n2031672\t1.88\t7.04\t96\t28.237085\t10.6816\n2031673\t1.88\t7.08\t109\t37.478687\t20.3696\n2031674\t1.88\t7.12\t144\t56.910702\t36.84\n2031675\t1.88\t7.16\t139\t54.334923\t34.9184\n2031676\t1.88\t7.2\t116\t39.979095\t22.5968\n2031677\t1.88\t7.24\t85\t23.883541\t9.0240002\n2031679\t1.88\t7.32\t82\t20.204309\t6.0511999\n2031680\t1.88\t7.36\t96\t22.505251\t6.4847999\n2031681\t1.88\t7.4\t96\t22.107399\t6.3248\n2031682\t1.88\t7.44\t95\t21.712606\t6.1855998\n2031683\t1.88\t7.48\t93\t22.221878\t6.5823998\n2031684\t1.88\t7.52\t83\t21.09626\t6.5247998\n2031686\t1.88\t7.6\t94\t37.365715\t24.559999\n2031687\t1.88\t7.64\t102\t42.217468\t29.1472\n2031688\t1.88\t7.68\t109\t48.096294\t34.571201\n2031689\t1.88\t7.72\t112\t50.42522\t35.9776\n2031690\t1.88\t7.76\t96\t35.598904\t20.099199\n2097162\t1.92\t5.2\t201\t67.989166\t33.211201\n2097181\t1.92\t5.96\t281\t284.27429\t518.04163\n2097182\t1.92\t6\t289\t327.13849\t616.2384\n2097197\t1.92\t6.6\t278\t173.26363\t188.62241\n2097198\t1.92\t6.64\t338\t311.96161\t543.48322\n2097199\t1.92\t6.68\t357\t340.14005\t592.12799\n2097200\t1.92\t6.72\t327\t292.79022\t504.04639\n2097201\t1.92\t6.76\t270\t177.71747\t208.10561\n2097204\t1.92\t6.88\t33\t6.2336969\t1.6016001\n2097205\t1.92\t6.92\t48\t11.146693\t3.9647999\n2097206\t1.92\t6.96\t59\t15.541656\t6.2416\n2097207\t1.92\t7\t33\t6.6905565\t1.832\n2097208\t1.92\t7.04\t91\t28.672241\t11.3232\n2097209\t1.92\t7.08\t101\t37.928616\t21.792\n2097210\t1.92\t7.12\t140\t58.013214\t38.756802\n2097211\t1.92\t7.16\t137\t56.931339\t38.3344\n2097212\t1.92\t7.2\t101\t41.643024\t27.3216\n2097213\t1.92\t7.24\t85\t28.036398\t12.4784\n2097215\t1.92\t7.32\t80\t21.99575\t7.1968002\n2097216\t1.92\t7.36\t79\t20.201742\t6.3456001\n2097217\t1.92\t7.4\t86\t21.884943\t6.8576002\n2097218\t1.92\t7.44\t88\t22.62866\t7.1616001\n2097219\t1.92\t7.48\t82\t21.420656\t6.8927999\n2097220\t1.92\t7.52\t82\t23.021715\t7.7231998\n2097222\t1.92\t7.6\t86\t37.489185\t25.532801\n2097223\t1.92\t7.64\t98\t44.414448\t32.102402\n2097224\t1.92\t7.68\t104\t49.48093\t36.644798\n2097225\t1.92\t7.72\t109\t53.157696\t39.5536\n2097226\t1.92\t7.76\t95\t39.239952\t24.120001\n2162693\t1.96\t5\t110\t39.920303\t18.7248\n2162694\t1.96\t5.04\t111\t36.994022\t16.257601\n2162695\t1.96\t5.08\t113\t35.361492\t14.792\n2162696\t1.96\t5.12\t133\t50.736244\t30.208\n2162697\t1.96\t5.16\t148\t62.688541\t44.700802\n2162698\t1.96\t5.2\t205\t72.598892\t37.3344\n2162699\t1.96\t5.24\t141\t36.297443\t11.68\n2162700\t1.96\t5.28\t107\t26.263237\t8.1104002\n2162701\t1.96\t5.32\t102\t25.007254\t7.7136002\n2162702\t1.96\t5.36\t102\t26.610947\t8.7728004\n2162703\t1.96\t5.4\t96\t26.51631\t9.2256002\n2162704\t1.96\t5.44\t91\t27.06925\t9.7840004\n2162705\t1.96\t5.48\t72\t18.980307\t6.2736001\n2162706\t1.96\t5.52\t75\t18.038202\t5.5664001\n2162707\t1.96\t5.56\t75\t16.364847\t4.5696001\n2162708\t1.96\t5.6\t80\t16.92267\t4.4784002\n2162709\t1.96\t5.64\t81\t17.221333\t4.6128001\n2162710\t1.96\t5.68\t85\t19.726995\t5.9632001\n2162711\t1.96\t5.72\t81\t20.35327\t6.9903998\n2162712\t1.96\t5.76\t80\t22.439497\t8.8495998\n2162713\t1.96\t5.8\t83\t26.678169\t11.7392\n2162716\t1.96\t5.92\t97\t32.592308\t16.1392\n2162717\t1.96\t5.96\t280\t281.72928\t502.0784\n2162718\t1.96\t6\t296\t324.54831\t597.87842\n2162719\t1.96\t6.04\t74\t21.185783\t8.3056002\n2162722\t1.96\t6.16\t77\t22.41048\t8.6303997\n2162723\t1.96\t6.2\t77\t20.162447\t7.1184001\n2162724\t1.96\t6.24\t82\t19.800385\t6.3792\n2162725\t1.96\t6.28\t83\t19.184225\t5.8592\n2162726\t1.96\t6.32\t81\t17.617865\t4.9424\n2162727\t1.96\t6.36\t85\t20.31863\t6.5472002\n2162728\t1.96\t6.4\t83\t21.311005\t7.4768\n2162729\t1.96\t6.44\t72\t17.018276\t5.1343999\n2162730\t1.96\t6.48\t72\t18.980307\t6.2736001\n2162732\t1.96\t6.56\t184\t100.2803\t85.260803\n2162733\t1.96\t6.6\t278\t163.8279\t164.92\n2162734\t1.96\t6.64\t339\t308.28836\t529.08643\n2162735\t1.96\t6.68\t364\t336.99185\t571.76959\n2162736\t1.96\t6.72\t332\t292.57672\t493.8576\n2162737\t1.96\t6.76\t276\t166.83261\t176.8688\n2162738\t1.96\t6.8\t173\t92.199066\t76.5728\n2162739\t1.96\t6.84\t118\t41.931713\t18.867201\n2162742\t1.96\t6.96\t71\t20.761024\t8.8048\n2162746\t1.96\t7.12\t113\t54.289612\t40.416\n2162747\t1.96\t7.16\t134\t59.605541\t41.964802\n2228229\t2\t5\t111\t40.659767\t20.854401\n2228230\t2\t5.04\t114\t37.4846\t17.153601\n2228231\t2\t5.08\t114\t34.044781\t14.3616\n2228232\t2\t5.12\t139\t48.850243\t27.027201\n2228233\t2\t5.16\t171\t64.671761\t40.131199\n2228234\t2\t5.2\t198\t76.011169\t45.454399\n2228235\t2\t5.24\t162\t47.443104\t19.728001\n2228236\t2\t5.28\t125\t30.794863\t9.8448\n2228237\t2\t5.32\t114\t27.402746\t8.4848003\n2228238\t2\t5.36\t104\t25.143894\t7.8800001\n2228239\t2\t5.4\t97\t23.653833\t7.3200002\n2228240\t2\t5.44\t90\t24.419842\t8.2016001\n2228241\t2\t5.48\t76\t20.466681\t7.7872\n2228242\t2\t5.52\t79\t17.924244\t5.4527998\n2228243\t2\t5.56\t85\t17.818701\t4.9376001\n2228244\t2\t5.6\t92\t19.968998\t5.7616\n2228245\t2\t5.64\t94\t21.843006\t7.1696\n2228246\t2\t5.68\t98\t24.54838\t8.8752003\n2228247\t2\t5.72\t98\t26.629082\t10.6064\n2228248\t2\t5.76\t94\t28.408993\t12.5392\n2228249\t2\t5.8\t89\t29.495028\t14.0352\n2228251\t2\t5.88\t87\t25.399734\t9.8895998\n2228252\t2\t5.92\t119\t37.875122\t16.2992\n2228253\t2\t5.96\t293\t284.00552\t488.728\n2228254\t2\t6\t310\t327.03973\t584.3584\n2228255\t2\t6.04\t96\t26.366732\t9.8095999\n2228256\t2\t6.08\t73\t20.246466\t7.6384001\n2228258\t2\t6.16\t79\t22.093275\t8.4960003\n2228259\t2\t6.2\t89\t23.173359\t8.4560003\n2228260\t2\t6.24\t90\t21.391472\t7.1343999\n2228261\t2\t6.28\t91\t20.484171\t6.3856001\n2228262\t2\t6.32\t90\t19.628683\t5.8671999\n2228263\t2\t6.36\t89\t19.283873\t5.6208\n2228264\t2\t6.4\t90\t20.785023\t6.4671998\n2228265\t2\t6.44\t89\t23.490685\t8.448\n2228266\t2\t6.48\t76\t20.575188\t7.8895998\n2228268\t2\t6.56\t194\t92.469322\t68.771202\n2228269\t2\t6.6\t285\t159.87183\t150.69279\n2228270\t2\t6.64\t352\t309.03357\t514.0752\n2228271\t2\t6.68\t374\t334.96548\t552.47998\n2228272\t2\t6.72\t340\t294.10104\t485.59039\n2228273\t2\t6.76\t282\t161.97426\t159.77119\n2228274\t2\t6.8\t190\t87.811859\t64.727997\n2228275\t2\t6.84\t121\t39.456356\t16.4928\n2228276\t2\t6.88\t29\t4.8961244\t1.08\n2228277\t2\t6.92\t60\t16.335417\t6.3903999\n2228278\t2\t6.96\t79\t23.211899\t9.8224001\n2228279\t2\t7\t36\t8.0005789\t2.4288001\n2228280\t2\t7.04\t29\t4.2823467\t0.72799999\n2228281\t2\t7.08\t32\t4.0847077\t0.60479999\n2228282\t2\t7.12\t123\t57.08083\t43.734402\n2228283\t2\t7.16\t127\t59.629173\t44.944\n2228284\t2\t7.2\t37\t5.8038549\t1.168\n2228285\t2\t7.24\t40\t8.8077078\t2.7679999\n2293765\t2.04\t5\t134\t74.655685\t71.681602\n2293766\t2.04\t5.04\t139\t69.089783\t60.136002\n2293767\t2.04\t5.08\t142\t64.216743\t52.302399\n2293768\t2.04\t5.12\t159\t66.225967\t48.369598\n2293769\t2.04\t5.16\t194\t85.424156\t62.827202\n2293770\t2.04\t5.2\t220\t103.32905\t77.975998\n2293771\t2.04\t5.24\t184\t70.973579\t45.414398\n2293772\t2.04\t5.28\t153\t46.023476\t21.382401\n2293773\t2.04\t5.32\t136\t36.30093\t13.4336\n2293774\t2.04\t5.36\t125\t32.022083\t10.88\n2293775\t2.04\t5.4\t114\t27.555025\t8.2992001\n2293776\t2.04\t5.44\t98\t24.019798\t7.4288001\n2293777\t2.04\t5.48\t102\t42.813881\t30.8064\n2293778\t2.04\t5.52\t129\t46.813576\t28.628799\n2293779\t2.04\t5.56\t133\t46.413982\t26.535999\n2293780\t2.04\t5.6\t131\t44.488884\t24.216\n2293781\t2.04\t5.64\t131\t43.646503\t23.0144\n2293782\t2.04\t5.68\t123\t37.386662\t16.704\n2293783\t2.04\t5.72\t117\t34.943401\t15.5056\n2293784\t2.04\t5.76\t111\t32.838509\t14.536\n2293785\t2.04\t5.8\t93\t30.814243\t15.0208\n2293787\t2.04\t5.88\t121\t42.077148\t21.5504\n2293788\t2.04\t5.92\t160\t57.061874\t27.7456\n2293789\t2.04\t5.96\t329\t302.06073\t487.82721\n2293790\t2.04\t6\t350\t345.94989\t581.54718\n2293791\t2.04\t6.04\t139\t48.130466\t23.728001\n2293792\t2.04\t6.08\t113\t39.215134\t20.8272\n2293794\t2.04\t6.16\t102\t35.857304\t20.247999\n2293795\t2.04\t6.2\t110\t35.003597\t18.3696\n2293796\t2.04\t6.24\t115\t35.517448\t17.3808\n2293797\t2.04\t6.28\t117\t35.62397\t17.087999\n2293798\t2.04\t6.32\t128\t44.468655\t26.120001\n2293799\t2.04\t6.36\t127\t46.050823\t29.1616\n2293800\t2.04\t6.4\t126\t46.283455\t30.118401\n2293801\t2.04\t6.44\t129\t50.70475\t35.134399\n2293802\t2.04\t6.48\t104\t49.171303\t39.9744\n2293804\t2.04\t6.56\t213\t87.989754\t54.347198\n2293805\t2.04\t6.6\t309\t164.61203\t144.55521\n2293806\t2.04\t6.64\t383\t323.78207\t517.52802\n2293807\t2.04\t6.68\t400\t346.32837\t545.57599\n2293808\t2.04\t6.72\t370\t310.27881\t486.88321\n2293809\t2.04\t6.76\t314\t181.96284\t172.576\n2293810\t2.04\t6.8\t216\t104.75198\t83.0784\n2293811\t2.04\t6.84\t154\t70.988571\t55.849602\n2293812\t2.04\t6.88\t54\t13.969804\t4.9439998\n2293813\t2.04\t6.92\t84\t22.507929\t8.5087996\n2293814\t2.04\t6.96\t96\t29.211536\t12.7632\n2293815\t2.04\t7\t56\t16.001844\t7.0864\n2293816\t2.04\t7.04\t30\t3.9217474\t0.60479999\n2293817\t2.04\t7.08\t49\t7.6117167\t1.6447999\n2293818\t2.04\t7.12\t132\t64.113037\t49.916801\n2293819\t2.04\t7.16\t139\t70.363998\t54.5952\n2293820\t2.04\t7.2\t66\t20.17219\t10.7664\n2293821\t2.04\t7.24\t61\t24.034628\t16.339199\n2359301\t2.08\t5\t140\t89.178246\t106.8192\n2359302\t2.08\t5.04\t144\t86.597389\t101.264\n2359303\t2.08\t5.08\t161\t89.297523\t98.152\n2359304\t2.08\t5.12\t173\t89.888542\t93.968002\n2359305\t2.08\t5.16\t204\t106.62606\t105.088\n2359306\t2.08\t5.2\t245\t141.67859\t137.91521\n2359307\t2.08\t5.24\t211\t109.78284\t103.9632\n2359308\t2.08\t5.28\t180\t83.301079\t77.574402\n2359309\t2.08\t5.32\t175\t81.785873\t74.950401\n2359310\t2.08\t5.36\t171\t79.140343\t71.134399\n2359311\t2.08\t5.4\t174\t79.907494\t68.912003\n2359312\t2.08\t5.44\t181\t80.494835\t66.014397\n2359313\t2.08\t5.48\t187\t80.558868\t63.6768\n2359314\t2.08\t5.52\t177\t79.014824\t61.700802\n2359315\t2.08\t5.56\t169\t76.21579\t59.169601\n2359316\t2.08\t5.6\t161\t71.684547\t55.220798\n2359317\t2.08\t5.64\t157\t70.12706\t53.764801\n2359318\t2.08\t5.68\t154\t68.081177\t51.091202\n2359319\t2.08\t5.72\t154\t68.053848\t49.939201\n2359320\t2.08\t5.76\t159\t69.41954\t49.264\n2359321\t2.08\t5.8\t168\t71.818077\t48.737598\n2359322\t2.08\t5.84\t177\t76.555298\t49.9888\n2359323\t2.08\t5.88\t181\t79.60157\t51.374401\n2359324\t2.08\t5.92\t206\t91.585045\t57.318401\n2359325\t2.08\t5.96\t360\t326.33109\t499.02719\n2359326\t2.08\t6\t385\t371.35223\t590.36798\n2359327\t2.08\t6.04\t185\t82.286728\t52.484798\n2359328\t2.08\t6.08\t174\t76.432861\t49.287998\n2359329\t2.08\t6.12\t178\t75.893166\t48.923199\n2359330\t2.08\t6.16\t166\t72.165901\t48.472\n2359331\t2.08\t6.2\t159\t69.575966\t48.0928\n2359332\t2.08\t6.24\t152\t66.923538\t47.655998\n2359333\t2.08\t6.28\t149\t65.81337\t48.497601\n2359334\t2.08\t6.32\t149\t65.67643\t49.1856\n2359335\t2.08\t6.36\t149\t65.871277\t49.911999\n2359336\t2.08\t6.4\t150\t66.308228\t50.526402\n2359337\t2.08\t6.44\t157\t68.673302\t51.934399\n2359338\t2.08\t6.48\t171\t73.634361\t55.358398\n2359339\t2.08\t6.52\t236\t100.42136\t67.2192\n2359340\t2.08\t6.56\t256\t114.98533\t79.512001\n2359341\t2.08\t6.6\t350\t194.10223\t161.6288\n2359342\t2.08\t6.64\t421\t359.96951\t550.40637\n2359343\t2.08\t6.68\t425\t370.25702\t564.79199\n2359344\t2.08\t6.72\t397\t337.42932\t513.79041\n2359345\t2.08\t6.76\t326\t186.69667\t170.65601\n2359346\t2.08\t6.8\t222\t98.901466\t75.222397\n2359347\t2.08\t6.84\t189\t84.594917\t68.835197\n2359348\t2.08\t6.88\t137\t68.860207\t65.795197\n2359349\t2.08\t6.92\t138\t75.5821\t73.990402\n2359350\t2.08\t6.96\t146\t82.2967\t81.288002\n2359351\t2.08\t7\t121\t69.863831\t76.846397\n2359352\t2.08\t7.04\t117\t69.892143\t80.582397\n2359353\t2.08\t7.08\t114\t71.953468\t85.310402\n2359354\t2.08\t7.12\t184\t128.3018\t140.29601\n2359355\t2.08\t7.16\t179\t129.79042\t145.48959\n2359356\t2.08\t7.2\t112\t79.37368\t100.7408\n2359357\t2.08\t7.24\t100\t77.669327\t103.9776\n2424837\t2.12\t5\t133\t71.801277\t66.491203\n2424838\t2.12\t5.04\t139\t69.060364\t60.056\n2424839\t2.12\t5.08\t148\t66.837822\t52.688\n2424840\t2.12\t5.12\t157\t64.488396\t46.585602\n2424841\t2.12\t5.16\t192\t82.185387\t58.142399\n2424842\t2.12\t5.2\t232\t115.39113\t90.076797\n2424843\t2.12\t5.24\t187\t76.510239\t52.112\n2424844\t2.12\t5.28\t152\t45.777275\t21.316799\n2424845\t2.12\t5.32\t138\t37.462227\t14.0768\n2424846\t2.12\t5.36\t124\t31.479498\t10.52\n2424847\t2.12\t5.4\t114\t27.555025\t8.2992001\n2424848\t2.12\t5.44\t98\t24.019798\t7.4288001\n2424849\t2.12\t5.48\t102\t41.739704\t29.3808\n2424850\t2.12\t5.52\t128\t45.991562\t27.854401\n2424851\t2.12\t5.56\t132\t45.855312\t26.052799\n2424852\t2.12\t5.6\t130\t43.537373\t23.489599\n2424853\t2.12\t5.64\t128\t41.241177\t20.844801\n2424854\t2.12\t5.68\t123\t37.209629\t16.5648\n2424855\t2.12\t5.72\t116\t34.29842\t15.0896\n2424856\t2.12\t5.76\t111\t32.838509\t14.536\n2424857\t2.12\t5.8\t93\t30.814243\t15.0208\n2424859\t2.12\t5.88\t122\t42.213745\t21.2528\n2424860\t2.12\t5.92\t159\t57.539261\t28.8064\n2424861\t2.12\t5.96\t327\t293.11151\t457.0528\n2424862\t2.12\t6\t350\t338.32288\t548.6944\n2424863\t2.12\t6.04\t134\t46.746914\t23.396799\n2424864\t2.12\t6.08\t114\t40.609035\t22.1024\n2424866\t2.12\t6.16\t105\t36.963699\t20.662399\n2424867\t2.12\t6.2\t110\t34.535542\t17.614401\n2424868\t2.12\t6.24\t113\t33.954453\t16.1408\n2424869\t2.12\t6.28\t117\t34.976231\t16.2416\n2424870\t2.12\t6.32\t125\t41.704193\t23.164801\n2424871\t2.12\t6.36\t127\t45.438385\t28.4496\n2424872\t2.12\t6.4\t125\t45.362587\t29.270399\n2424873\t2.12\t6.44\t127\t49.167938\t33.7584\n2424874\t2.12\t6.48\t102\t46.729992\t36.993599\n2424876\t2.12\t6.56\t197\t69.768814\t32.8368\n2424877\t2.12\t6.6\t306\t149.74509\t106.4064\n2424878\t2.12\t6.64\t388\t320.78146\t491.95999\n2424879\t2.12\t6.68\t401\t338.81396\t513.0816\n2424880\t2.12\t6.72\t373\t306.29239\t462.29599\n2424881\t2.12\t6.76\t304\t157.34274\t121.9168\n2424882\t2.12\t6.8\t195\t84.032906\t60.529598\n2424883\t2.12\t6.84\t158\t73.568115\t58.4352\n2424884\t2.12\t6.88\t60\t16.015747\t5.6336002\n2424885\t2.12\t6.92\t83\t24.141743\t10.1424\n2424886\t2.12\t6.96\t93\t30.897537\t14.8256\n2424887\t2.12\t7\t64\t18.660824\t7.9664001\n2424888\t2.12\t7.04\t35\t5.6108823\t1.1776\n2424889\t2.12\t7.08\t55\t11.071246\t3.3584001\n2424890\t2.12\t7.12\t127\t68.909927\t58.487999\n2424891\t2.12\t7.16\t129\t71.71521\t60.903999\n2424892\t2.12\t7.2\t77\t26.489727\t14.0592\n2424893\t2.12\t7.24\t68\t25.926464\t16.681601\n2490373\t2.16\t5\t110\t39.382359\t19.433599\n2490374\t2.16\t5.04\t116\t39.060928\t18.416\n2490375\t2.16\t5.08\t118\t36.635838\t16.056\n2490376\t2.16\t5.12\t125\t36.000813\t14.1776\n2490377\t2.16\t5.16\t160\t52.733555\t26.3696\n2490378\t2.16\t5.2\t215\t94.393799\t64.8592\n2490379\t2.16\t5.24\t174\t63.712208\t38.5504\n2490380\t2.16\t5.28\t127\t32.327065\t10.864\n2490381\t2.16\t5.32\t117\t29.393942\t9.7279997\n2490382\t2.16\t5.36\t105\t25.809628\t8.3232002\n2490383\t2.16\t5.4\t99\t24.648048\t7.8175998\n2490384\t2.16\t5.44\t89\t24.29335\t8.1856003\n2490385\t2.16\t5.48\t76\t20.466681\t7.7872\n2490386\t2.16\t5.52\t79\t17.924244\t5.4527998\n2490387\t2.16\t5.56\t86\t18.484432\t5.3807998\n2490388\t2.16\t5.6\t90\t19.322777\t5.5296001\n2490389\t2.16\t5.64\t94\t21.843006\t7.1696\n2490390\t2.16\t5.68\t96\t23.902161\t8.6431999\n2490391\t2.16\t5.72\t96\t25.722212\t10.1936\n2490392\t2.16\t5.76\t96\t28.999216\t12.6304\n2490393\t2.16\t5.8\t89\t29.495028\t14.0352\n2490395\t2.16\t5.88\t84\t25.890617\t10.8112\n2490396\t2.16\t5.92\t118\t39.995693\t19.212799\n2490397\t2.16\t5.96\t293\t268.75092\t429.12799\n2490398\t2.16\t6\t310\t311.20053\t516.39038\n2490399\t2.16\t6.04\t93\t27.482956\t11.2416\n2490400\t2.16\t6.08\t75\t21.836847\t8.5872002\n2490402\t2.16\t6.16\t79\t22.093275\t8.4960003\n2490403\t2.16\t6.2\t92\t24.449011\t9.0047998\n2490404\t2.16\t6.24\t91\t21.816679\t7.3151999\n2490405\t2.16\t6.28\t91\t20.484171\t6.3856001\n2490406\t2.16\t6.32\t89\t19.084623\t5.5711999\n2490407\t2.16\t6.36\t90\t19.677826\t5.776\n2490408\t2.16\t6.4\t90\t20.810917\t6.4944\n2490409\t2.16\t6.44\t88\t22.952539\t8.1583996\n2490410\t2.16\t6.48\t75\t20.049068\t7.6128001\n2490412\t2.16\t6.56\t168\t61.781628\t31.1408\n2490413\t2.16\t6.6\t279\t136.63336\t96.6576\n2490414\t2.16\t6.64\t361\t306.23697\t473.97281\n2490415\t2.16\t6.68\t379\t321.98416\t488.336\n2490416\t2.16\t6.72\t352\t293.013\t447.84799\n2490417\t2.16\t6.76\t273\t133.3428\t94.924797\n2490418\t2.16\t6.8\t161\t56.290684\t26.6432\n2490419\t2.16\t6.84\t126\t41.77129\t17.6528\n2490420\t2.16\t6.88\t36\t7.4910388\t2.0192001\n2490421\t2.16\t6.92\t62\t21.87215\t11.1136\n2490422\t2.16\t6.96\t76\t28.231615\t14.9424\n2490423\t2.16\t7\t46\t11.753185\t3.8527999\n2490424\t2.16\t7.04\t37\t7.2004895\t1.8448\n2490425\t2.16\t7.08\t53\t13.739306\t5.3007998\n2490426\t2.16\t7.12\t113\t66.988457\t60.980801\n2490427\t2.16\t7.16\t109\t65.056038\t59.8368\n2490428\t2.16\t7.2\t61\t17.38118\t7.1631999\n2490429\t2.16\t7.24\t47\t10.978067\t3.4175999\n2555909\t2.2\t5\t113\t42.029846\t20.236799\n2555910\t2.2\t5.04\t113\t38.414845\t17.2672\n2555911\t2.2\t5.08\t116\t37.204807\t15.944\n2555912\t2.2\t5.12\t118\t35.474571\t14.232\n2555913\t2.2\t5.16\t134\t48.33107\t27.260799\n2555914\t2.2\t5.2\t218\t93.742989\t62.9744\n2555915\t2.2\t5.24\t165\t62.776459\t39.903999\n2555916\t2.2\t5.28\t111\t28.723185\t9.6239996\n2555917\t2.2\t5.32\t104\t26.315592\t8.5696001\n2555918\t2.2\t5.36\t105\t28.512197\t9.9968004\n2555919\t2.2\t5.4\t98\t27.693491\t9.9535999\n2555920\t2.2\t5.44\t92\t27.720402\t10.208\n2555921\t2.2\t5.48\t72\t18.980307\t6.2736001\n2555922\t2.2\t5.52\t75\t18.038202\t5.5664001\n2555923\t2.2\t5.56\t75\t16.364847\t4.5696001\n2555924\t2.2\t5.6\t79\t16.578577\t4.3600001\n2555925\t2.2\t5.64\t81\t17.221333\t4.6128001\n2555926\t2.2\t5.68\t82\t18.363094\t5.3232002\n2555927\t2.2\t5.72\t84\t21.715763\t7.6304002\n2555928\t2.2\t5.76\t79\t21.642504\t8.2144003\n2555929\t2.2\t5.8\t82\t25.930908\t11.1808\n2555932\t2.2\t5.92\t94\t37.022778\t21.4576\n2555933\t2.2\t5.96\t280\t260.80179\t418.40161\n2555934\t2.2\t6\t297\t302.47021\t498.55679\n2555935\t2.2\t6.04\t77\t24.45722\t10.6784\n2555938\t2.2\t6.16\t77\t22.41048\t8.6303997\n2555939\t2.2\t6.2\t77\t20.162447\t7.1184001\n2555940\t2.2\t6.24\t85\t21.245399\t7.0816002\n2555941\t2.2\t6.28\t83\t19.184225\t5.8592\n2555942\t2.2\t6.32\t81\t17.617865\t4.9424\n2555943\t2.2\t6.36\t84\t20.014\t6.4544001\n2555944\t2.2\t6.4\t83\t21.311005\t7.4768\n2555945\t2.2\t6.44\t72\t17.018276\t5.1343999\n2555946\t2.2\t6.48\t72\t18.980307\t6.2736001\n2555948\t2.2\t6.56\t146\t59.417389\t34.028801\n2555949\t2.2\t6.6\t265\t128.44019\t88.660797\n2555950\t2.2\t6.64\t355\t301.33881\t459.28961\n2555951\t2.2\t6.68\t375\t321.34589\t482.1232\n2555952\t2.2\t6.72\t347\t289.32343\t436.65759\n2555953\t2.2\t6.76\t267\t130.33327\t91.145599\n2555954\t2.2\t6.8\t143\t54.44194\t28.1968\n2555955\t2.2\t6.84\t119\t42.222919\t18.952\n2621450\t2.24\t5.2\t202\t84.652992\t57.161598\n2621467\t2.24\t5.88\t78\t25.895033\t12.512\n2621468\t2.24\t5.92\t119\t84.370705\t110.9232\n2621469\t2.24\t5.96\t276\t257.06857\t409.7616\n2621470\t2.24\t6\t294\t297.31488\t483.71841\n2621471\t2.24\t6.04\t80\t27.622271\t14.904\n2621472\t2.24\t6.08\t72\t22.196745\t10.0976\n2621485\t2.24\t6.6\t262\t127.48661\t86.440002\n2621486\t2.24\t6.64\t354\t295.53598\t434.9184\n2621487\t2.24\t6.68\t372\t316.90759\t466.7088\n2621488\t2.24\t6.72\t349\t287.5694\t424.39359\n2621489\t2.24\t6.76\t247\t123.65753\t85.820801\n2686981\t2.28\t5\t84\t23.211514\t7.5952001\n2686982\t2.28\t5.04\t86\t21.663166\t6.5440001\n2686983\t2.28\t5.08\t86\t19.688118\t5.4095998\n2686984\t2.28\t5.12\t87\t18.261698\t4.5616002\n2686985\t2.28\t5.16\t111\t26.696648\t9.0207996\n2686986\t2.28\t5.2\t182\t77.99823\t55.9296\n2686987\t2.28\t5.24\t157\t57.453087\t34.0144\n2686988\t2.28\t5.28\t175\t99.033318\t89.540802\n2686989\t2.28\t5.32\t171\t98.229385\t89.463997\n2686990\t2.28\t5.36\t139\t61.185558\t41.478401\n2686991\t2.28\t5.4\t112\t40.286095\t21.372801\n2686992\t2.28\t5.44\t94\t28.659739\t11.0352\n2687003\t2.28\t5.88\t79\t23.500954\t10.7184\n2687004\t2.28\t5.92\t126\t66.872566\t71.289597\n2687005\t2.28\t5.96\t263\t251.60129\t400.74399\n2687006\t2.28\t6\t289\t291.47525\t467.99841\n2687007\t2.28\t6.04\t86\t26.192947\t12.9488\n2687008\t2.28\t6.08\t70\t17.86659\t6.664\n2687021\t2.28\t6.6\t255\t124.92155\t84.081596\n2687022\t2.28\t6.64\t347\t278.71524\t384.66559\n2687023\t2.28\t6.68\t373\t315.67099\t454.37601\n2687024\t2.28\t6.72\t348\t288.46765\t417.8432\n2687025\t2.28\t6.76\t239\t120.48944\t82.9776\n2752517\t2.32\t5\t85\t22.023762\t6.9488001\n2752518\t2.32\t5.04\t85\t19.515556\t5.5664001\n2752519\t2.32\t5.08\t88\t18.479792\t4.8112001\n2752520\t2.32\t5.12\t97\t19.965464\t5.112\n2752521\t2.32\t5.16\t108\t21.574352\t5.224\n2752522\t2.32\t5.2\t167\t71.883057\t54.649601\n2752523\t2.32\t5.24\t164\t63.913261\t41.419201\n2752524\t2.32\t5.28\t188\t99.227203\t85.456001\n2752525\t2.32\t5.32\t175\t95.433533\t84.222397\n2752526\t2.32\t5.36\t138\t56.511669\t36.529598\n2752527\t2.32\t5.4\t108\t33.706818\t15.3984\n2752528\t2.32\t5.44\t93\t25.81868\t9.1359997\n2752539\t2.32\t5.88\t86\t23.378195\t9.4608002\n2752540\t2.32\t5.92\t118\t50.599609\t43.639999\n2752541\t2.32\t5.96\t258\t250.10574\t397.39999\n2752542\t2.32\t6\t286\t286.75342\t453.58401\n2752543\t2.32\t6.04\t90\t25.158506\t11.6272\n2752544\t2.32\t6.08\t74\t16.805161\t5.2463999\n2752546\t2.32\t6.16\t102\t31.047518\t11.5488\n2752547\t2.32\t6.2\t105\t31.124329\t11.8848\n2752548\t2.32\t6.24\t112\t34.870495\t15.0704\n2752549\t2.32\t6.28\t120\t40.177811\t19.5312\n2752550\t2.32\t6.32\t136\t54.215992\t32.528\n2752551\t2.32\t6.36\t140\t57.908974\t35.528\n2752552\t2.32\t6.4\t142\t60.458412\t37.2752\n2752553\t2.32\t6.44\t134\t55.885948\t33.366402\n2752554\t2.32\t6.48\t118\t43.341579\t20.8992\n2752556\t2.32\t6.56\t119\t45.353798\t24.9888\n2752557\t2.32\t6.6\t255\t124.69859\t83.939201\n2752558\t2.32\t6.64\t345\t267.16428\t347.77121\n2752559\t2.32\t6.68\t370\t312.37186\t440.31201\n2752560\t2.32\t6.72\t348\t289.70126\t411.25601\n2752561\t2.32\t6.76\t250\t122.13171\t82.950401\n2752562\t2.32\t6.8\t117\t45.499245\t26.7264\n2818053\t2.36\t5\t85\t21.170202\t6.5359998\n2818054\t2.36\t5.04\t88\t19.809267\t5.6896\n2818055\t2.36\t5.08\t94\t20.11404\t5.6160002\n2818056\t2.36\t5.12\t98\t19.376902\t4.8927999\n2818057\t2.36\t5.16\t108\t21.485765\t5.5999999\n2818058\t2.36\t5.2\t159\t68.333122\t54.387199\n2818059\t2.36\t5.24\t165\t66.732353\t45.876801\n2818060\t2.36\t5.28\t194\t98.245445\t81.496002\n2818061\t2.36\t5.32\t184\t96.21595\t81.136002\n2818062\t2.36\t5.36\t141\t54.049385\t32.819199\n2818063\t2.36\t5.4\t101\t27.076134\t10.424\n2818064\t2.36\t5.44\t88\t21.92823\t6.7184\n2818075\t2.36\t5.88\t84\t20.133968\t7.0847998\n2818076\t2.36\t5.92\t114\t39.15403\t23.112\n2818077\t2.36\t5.96\t255\t246.96518\t389.15839\n2818078\t2.36\t6\t282\t280.18747\t437.34079\n2818079\t2.36\t6.04\t91\t24.42363\t10.9664\n2818080\t2.36\t6.08\t72\t14.299877\t3.5632\n2818082\t2.36\t6.16\t100\t27.15284\t9.0095997\n2818083\t2.36\t6.2\t105\t28.232088\t10.0448\n2818084\t2.36\t6.24\t111\t30.729425\t12.0864\n2818085\t2.36\t6.28\t120\t36.371861\t16.576\n2818086\t2.36\t6.32\t136\t49.887554\t28.6768\n2818087\t2.36\t6.36\t140\t53.443562\t31.408001\n2818088\t2.36\t6.4\t143\t56.591671\t33.396801\n2818089\t2.36\t6.44\t134\t51.857227\t29.604799\n2818090\t2.36\t6.48\t115\t37.895733\t16.5952\n2818092\t2.36\t6.56\t131\t44.555428\t20.968\n2818093\t2.36\t6.6\t252\t121.90993\t80.806396\n2818094\t2.36\t6.64\t339\t257.42096\t321.53601\n2818095\t2.36\t6.68\t371\t312.40714\t430.72479\n2818096\t2.36\t6.72\t345\t286.63297\t398.95679\n2818097\t2.36\t6.76\t247\t119.73451\t80.523201\n2818098\t2.36\t6.8\t124\t40.670734\t19.5536\n2818099\t2.36\t6.84\t101\t30.889687\t12.8016\n2883589\t2.4\t5\t87\t21.76808\t6.8192\n2883590\t2.4\t5.04\t92\t21.417067\t6.5056\n2883591\t2.4\t5.08\t95\t20.425541\t5.8512001\n2883592\t2.4\t5.12\t98\t19.338196\t4.9871998\n2883593\t2.4\t5.16\t110\t23.548876\t7.2672\n2883594\t2.4\t5.2\t149\t63.79744\t53.396801\n2883595\t2.4\t5.24\t166\t72.14373\t55.459202\n2883596\t2.4\t5.28\t196\t96.457588\t77.075203\n2883597\t2.4\t5.32\t192\t96.139763\t77.020798\n2883598\t2.4\t5.36\t138\t49.180237\t27.649599\n2883599\t2.4\t5.4\t99\t24.355532\t8.1968002\n2883600\t2.4\t5.44\t89\t22.076612\t6.8239999\n2883601\t2.4\t5.48\t99\t28.338076\t9.3936005\n2883602\t2.4\t5.52\t99\t26.283968\t8.2575998\n2883603\t2.4\t5.56\t98\t24.314575\t7.2336001\n2883604\t2.4\t5.6\t98\t23.407227\t6.7584\n2883605\t2.4\t5.64\t99\t24.140123\t7.6767998\n2883606\t2.4\t5.68\t106\t29.500341\t11.568\n2883607\t2.4\t5.72\t107\t31.035128\t12.4\n2883608\t2.4\t5.76\t111\t36.073177\t16.4576\n2883609\t2.4\t5.8\t117\t43.332603\t22.2864\n2883611\t2.4\t5.88\t81\t17.579962\t5.1231999\n2883612\t2.4\t5.92\t116\t38.129456\t19.742399\n2883613\t2.4\t5.96\t254\t246.81224\t385.8176\n2883614\t2.4\t6\t281\t277.85074\t426.63199\n2883615\t2.4\t6.04\t88\t21.146307\t8.0847998\n2883616\t2.4\t6.08\t73\t13.954205\t3.2576001\n2883618\t2.4\t6.16\t98\t23.925661\t7.0640001\n2883619\t2.4\t6.2\t103\t24.620855\t7.7663999\n2883620\t2.4\t6.24\t108\t26.172426\t9.0640001\n2883621\t2.4\t6.28\t118\t31.93001\t13.32\n2883622\t2.4\t6.32\t136\t46.120518\t25.264\n2883623\t2.4\t6.36\t141\t50.217499\t28.203199\n2883624\t2.4\t6.4\t143\t52.627251\t29.5632\n2883625\t2.4\t6.44\t135\t48.889046\t26.559999\n2883626\t2.4\t6.48\t112\t33.37841\t13.2912\n2883628\t2.4\t6.56\t140\t46.455849\t20.4496\n2883629\t2.4\t6.6\t250\t122.30885\t81.734398\n2883630\t2.4\t6.64\t333\t246.16293\t295.42719\n2883631\t2.4\t6.68\t376\t315.11633\t423.06079\n2883632\t2.4\t6.72\t346\t286.73163\t391.32321\n2883633\t2.4\t6.76\t245\t119.48609\t80.689598\n2883634\t2.4\t6.8\t133\t42.102222\t18.5056\n2883635\t2.4\t6.84\t102\t27.904093\t9.9904003\n2949125\t2.44\t5\t91\t24.069202\t7.9791999\n2949126\t2.44\t5.04\t93\t22.6196\t7.2512002\n2949127\t2.44\t5.08\t95\t20.936886\t6.1152\n2949128\t2.44\t5.12\t99\t20.556149\t5.6399999\n2949129\t2.44\t5.16\t108\t25.568607\t9.5120001\n2949130\t2.44\t5.2\t146\t65.384041\t57.155201\n2949131\t2.44\t5.24\t157\t69.650795\t57.556801\n2949132\t2.44\t5.28\t199\t95.012352\t72.447998\n2949133\t2.44\t5.32\t196\t96.458672\t74.358398\n2949134\t2.44\t5.36\t136\t44.814804\t22.3088\n2949135\t2.44\t5.4\t93\t21.479176\t6.4112\n2949136\t2.44\t5.44\t91\t23.507652\t7.6128001\n2949137\t2.44\t5.48\t99\t25.868111\t7.9408002\n2949138\t2.44\t5.52\t99\t23.656672\t6.8048\n2949139\t2.44\t5.56\t99\t22.028542\t5.9888\n2949140\t2.44\t5.6\t101\t22.955265\t7.2704\n2949141\t2.44\t5.64\t104\t24.870157\t8.7679996\n2949142\t2.44\t5.68\t107\t27.143057\t10.2272\n2949143\t2.44\t5.72\t110\t30.178013\t12.1952\n2949144\t2.44\t5.76\t117\t37.633255\t18.0592\n2949145\t2.44\t5.8\t117\t41.247566\t21.555201\n2949147\t2.44\t5.88\t79\t16.4041\t4.3280001\n2949148\t2.44\t5.92\t113\t36.26059\t18.2752\n2949149\t2.44\t5.96\t255\t248.32645\t383.55841\n2949150\t2.44\t6\t281\t275.1554\t414.90399\n2949151\t2.44\t6.04\t87\t20.586992\t7.6176\n2949152\t2.44\t6.08\t72\t13.940583\t3.3840001\n2949154\t2.44\t6.16\t98\t22.458633\t6.2016001\n2949155\t2.44\t6.2\t100\t21.186428\t5.6799998\n2949156\t2.44\t6.24\t106\t22.930782\t6.9520001\n2949157\t2.44\t6.28\t116\t28.086861\t10.4752\n2949158\t2.44\t6.32\t135\t42.002838\t21.3664\n2949159\t2.44\t6.36\t141\t46.87661\t24.9328\n2949160\t2.44\t6.4\t143\t49.256073\t26.190399\n2949161\t2.44\t6.44\t135\t45.918346\t23.6224\n2949162\t2.44\t6.48\t108\t28.810131\t9.9407997\n2949164\t2.44\t6.56\t151\t53.251259\t25.142401\n2949165\t2.44\t6.6\t244\t119.00291\t79.587196\n2949166\t2.44\t6.64\t327\t238.09438\t278.47839\n2949167\t2.44\t6.68\t378\t314.86804\t412.784\n2949168\t2.44\t6.72\t341\t267.39624\t334.8576\n2949169\t2.44\t6.76\t236\t114.9444\t78.233597\n2949170\t2.44\t6.8\t139\t45.787209\t20.9408\n2949171\t2.44\t6.84\t105\t28.342794\t9.7296\n3014661\t2.48\t5\t93\t26.343472\t9.3439999\n3014662\t2.48\t5.04\t94\t23.997847\t7.848\n3014663\t2.48\t5.08\t96\t22.414553\t6.7584\n3014664\t2.48\t5.12\t99\t21.962479\t6.3392\n3014665\t2.48\t5.16\t110\t28.677963\t11.6144\n3014666\t2.48\t5.2\t143\t68.010849\t61.513599\n3014667\t2.48\t5.24\t138\t61.245945\t54.243198\n3014668\t2.48\t5.28\t201\t93.792572\t68.136002\n3014669\t2.48\t5.32\t205\t99.893875\t73.563202\n3014670\t2.48\t5.36\t119\t33.049381\t12.7136\n3014671\t2.48\t5.4\t95\t23.788391\t7.7168002\n3014672\t2.48\t5.44\t90\t24.336477\t8.2096004\n3014673\t2.48\t5.48\t99\t23.890995\t6.8080001\n3014674\t2.48\t5.52\t99\t21.55685\t5.6719999\n3014675\t2.48\t5.56\t99\t19.836058\t4.8559999\n3014676\t2.48\t5.6\t102\t21.354502\t6.5888\n3014677\t2.48\t5.64\t107\t24.065447\t8.2287998\n3014678\t2.48\t5.68\t110\t26.175636\t9.4927998\n3014679\t2.48\t5.72\t117\t32.794746\t14.5872\n3014680\t2.48\t5.76\t118\t36.913143\t18.593599\n3014681\t2.48\t5.8\t120\t41.129978\t21.5984\n3014683\t2.48\t5.88\t80\t17.537695\t5.0159998\n3014684\t2.48\t5.92\t115\t39.088902\t21.027201\n3014685\t2.48\t5.96\t257\t250.46022\t381.34879\n3014686\t2.48\t6\t280\t271.25156\t401.6976\n3014687\t2.48\t6.04\t87\t22.522314\t9.8752003\n3014688\t2.48\t6.08\t73\t15.164352\t4.0879998\n3014690\t2.48\t6.16\t96\t20.586645\t5.1968002\n3014691\t2.48\t6.2\t98\t19.164841\t4.5728002\n3014692\t2.48\t6.24\t104\t20.403437\t5.3263998\n3014693\t2.48\t6.28\t114\t25.351692\t8.5888004\n3014694\t2.48\t6.32\t132\t36.997169\t16.7808\n3014695\t2.48\t6.36\t141\t44.165913\t22.1168\n3014696\t2.48\t6.4\t144\t46.904133\t23.440001\n3014697\t2.48\t6.44\t135\t43.542473\t21.120001\n3014698\t2.48\t6.48\t102\t24.23518\t7.0128002\n3014700\t2.48\t6.56\t153\t57.65152\t29.739201\n3014701\t2.48\t6.6\t232\t113.18958\t76.792\n3014702\t2.48\t6.64\t316\t216.93454\t229.54559\n3014703\t2.48\t6.68\t387\t319.26297\t406.25919\n3014704\t2.48\t6.72\t336\t250.19733\t290.2048\n3014705\t2.48\t6.76\t228\t110.93597\t76.228798\n3014706\t2.48\t6.8\t143\t50.915245\t26.024\n3014707\t2.48\t6.84\t109\t30.73826\t11.0784\n3080197\t2.52\t5\t92\t27.492918\t9.9807997\n3080198\t2.52\t5.04\t92\t24.954393\t8.4015999\n3080199\t2.52\t5.08\t98\t25.468073\t8.3456001\n3080200\t2.52\t5.12\t98\t23.871679\t7.408\n3080201\t2.52\t5.16\t112\t33.886379\t16.351999\n3080202\t2.52\t5.2\t143\t72.09565\t66.588799\n3080203\t2.52\t5.24\t133\t62.650902\t56.481602\n3080204\t2.52\t5.28\t209\t96.720192\t66.649597\n3080205\t2.52\t5.32\t213\t102.5191\t71.6912\n3080206\t2.52\t5.36\t98\t24.545853\t7.9744\n3080207\t2.52\t5.4\t95\t26.026886\t9.0752001\n3080208\t2.52\t5.44\t92\t27.531065\t10.1632\n3080209\t2.52\t5.48\t99\t22.448984\t5.9952002\n3080210\t2.52\t5.52\t99\t20.027828\t4.8592\n3080211\t2.52\t5.56\t99\t18.23999\t4.0432\n3080212\t2.52\t5.6\t108\t23.114809\t7.7536001\n3080213\t2.52\t5.64\t112\t24.451399\t8.1904001\n3080214\t2.52\t5.68\t117\t29.080223\t11.8704\n3080215\t2.52\t5.72\t121\t34.797466\t17.0704\n3080216\t2.52\t5.76\t121\t36.525146\t17.945601\n3080217\t2.52\t5.8\t118\t36.525784\t17\n3080219\t2.52\t5.88\t77\t17.906757\t5.5823998\n3080220\t2.52\t5.92\t113\t40.990875\t24.180799\n3080221\t2.52\t5.96\t260\t252.92873\t378.81921\n3080222\t2.52\t6\t281\t270.72192\t393.29599\n3080223\t2.52\t6.04\t85\t22.815947\t10.3744\n3080224\t2.52\t6.08\t72\t16.118212\t4.8080001\n3080226\t2.52\t6.16\t95\t19.840269\t4.8207998\n3080227\t2.52\t6.2\t97\t18.326664\t4.1264\n3080228\t2.52\t6.24\t102\t18.849606\t4.4303999\n3080229\t2.52\t6.28\t111\t22.382889\t6.3776002\n3080230\t2.52\t6.32\t131\t34.457516\t14.3072\n3080231\t2.52\t6.36\t142\t42.616314\t20.027201\n3080232\t2.52\t6.4\t144\t44.738503\t20.958401\n3080233\t2.52\t6.44\t135\t41.774498\t19.052799\n3080234\t2.52\t6.48\t97\t21.706116\t5.6960001\n3080236\t2.52\t6.56\t152\t60.740761\t33.8176\n3080237\t2.52\t6.6\t220\t109.53291\t77.198402\n3080238\t2.52\t6.64\t306\t195.06593\t186.5696\n3080239\t2.52\t6.68\t400\t325.23215\t400.6608\n3080240\t2.52\t6.72\t327\t236.74025\t265.18079\n3080241\t2.52\t6.76\t219\t108.00165\t76.419197\n3080242\t2.52\t6.8\t143\t53.766697\t29.2736\n3080243\t2.52\t6.84\t107\t32.848911\t13.4768\n3145740\t2.56\t5.28\t193\t96.018463\t65.720001\n3145741\t2.56\t5.32\t223\t106.57522\t70.559998\n3145745\t2.56\t5.48\t100\t22.015041\t5.7024002\n3145746\t2.56\t5.52\t99\t19.094389\t4.3663998\n3145747\t2.56\t5.56\t104\t20.665718\t5.9424\n3145748\t2.56\t5.6\t111\t23.1805\t7.4032001\n3145749\t2.56\t5.64\t120\t28.053198\t10.6688\n3145750\t2.56\t5.68\t122\t31.910679\t14.4912\n3145751\t2.56\t5.72\t120\t31.543627\t13.9184\n3145752\t2.56\t5.76\t116\t30.527962\t12.5392\n3145753\t2.56\t5.8\t115\t31.318863\t11.5856\n3145755\t2.56\t5.88\t77\t20.508144\t7.8783998\n3145756\t2.56\t5.92\t107\t42.286747\t28.382401\n3145757\t2.56\t5.96\t264\t255.88359\t376.22079\n3145758\t2.56\t6\t283\t269.96823\t384.19199\n3145759\t2.56\t6.04\t85\t26.858656\t14.1808\n3145760\t2.56\t6.08\t72\t18.031601\t5.9856\n3145762\t2.56\t6.16\t95\t20.142962\t4.9903998\n3145763\t2.56\t6.2\t96\t18.240326\t4.1264\n3145764\t2.56\t6.24\t98\t17.296539\t3.6656001\n3145765\t2.56\t6.28\t107\t20.187422\t4.9823999\n3145766\t2.56\t6.32\t129\t32.257652\t12.2928\n3145767\t2.56\t6.36\t142\t41.14254\t18.08\n3145768\t2.56\t6.4\t145\t43.569824\t19.076799\n3145769\t2.56\t6.44\t135\t40.618332\t17.420799\n3145770\t2.56\t6.48\t92\t20.469498\t5.2575998\n3145772\t2.56\t6.56\t147\t63.753483\t38.316799\n3145773\t2.56\t6.6\t206\t107.17625\t79.827202\n3145774\t2.56\t6.64\t279\t159.04871\t130.0768\n3145775\t2.56\t6.68\t413\t329.58594\t395.19199\n3145776\t2.56\t6.72\t311\t206.54886\t204.6944\n3145777\t2.56\t6.76\t208\t107.22983\t79.923203\n3145778\t2.56\t6.8\t139\t58.079079\t35.065601\n3145779\t2.56\t6.84\t110\t39.836937\t19.856001\n3211267\t2.6\t4.92\t98\t48.64201\t36.0256\n3211268\t2.6\t4.96\t95\t43.277508\t29.6112\n3211269\t2.6\t5\t82\t29.831656\t16.628799\n3211270\t2.6\t5.04\t66\t18.134392\t7.6672001\n3211271\t2.6\t5.08\t57\t14.110662\t5.5760002\n3211272\t2.6\t5.12\t47\t9.1046562\t2.0480001\n3211276\t2.6\t5.28\t172\t89.331169\t61.200001\n3211277\t2.6\t5.32\t204\t103.39691\t67.7472\n3211281\t2.6\t5.48\t101\t22.249674\t5.8256001\n3211282\t2.6\t5.52\t100\t19.163813\t4.3488002\n3211283\t2.6\t5.56\t113\t24.38604\t7.6592002\n3211284\t2.6\t5.6\t121\t27.538715\t9.7376003\n3211285\t2.6\t5.64\t125\t31.26116\t13.1584\n3211286\t2.6\t5.68\t124\t30.814224\t12.776\n3211287\t2.6\t5.72\t116\t26.17038\t8.6960001\n3211288\t2.6\t5.76\t115\t27.651682\t9.2639999\n3211289\t2.6\t5.8\t113\t29.450909\t10.232\n3211291\t2.6\t5.88\t79\t24.460316\t10.5664\n3211292\t2.6\t5.92\t105\t48.894188\t38.396801\n3211293\t2.6\t5.96\t267\t258.28711\t373.12961\n3211294\t2.6\t6\t285\t269.24326\t375.68961\n3211295\t2.6\t6.04\t84\t30.326359\t17.601601\n3211296\t2.6\t6.08\t72\t20.171656\t7.3376002\n3211298\t2.6\t6.16\t93\t20.431986\t5.3039999\n3211299\t2.6\t6.2\t95\t18.749771\t4.4432001\n3211300\t2.6\t6.24\t96\t17.480474\t3.8448\n3211301\t2.6\t6.28\t103\t19.029057\t4.3712001\n3211302\t2.6\t6.32\t127\t31.005703\t11.04\n3211303\t2.6\t6.36\t143\t40.692532\t16.752001\n3211304\t2.6\t6.4\t145\t42.608047\t17.496\n3211305\t2.6\t6.44\t133\t38.505741\t15.0032\n3211306\t2.6\t6.48\t89\t21.076752\t5.6960001\n3211309\t2.6\t6.6\t193\t108.80457\t85.924797\n3211310\t2.6\t6.64\t257\t136.99849\t101.128\n3211311\t2.6\t6.68\t434\t340.03873\t402.28961\n3211312\t2.6\t6.72\t268\t142.80251\t104.4944\n3211313\t2.6\t6.76\t190\t106.15475\t84.361603\n3276803\t2.64\t4.92\t89\t39.030582\t28.2768\n3276804\t2.64\t4.96\t100\t45.446362\t32.950401\n3276805\t2.64\t5\t104\t45.810898\t31.0256\n3276806\t2.64\t5.04\t87\t29.249048\t15.3072\n3276807\t2.64\t5.08\t63\t15.819238\t6.4640002\n3276808\t2.64\t5.12\t47\t7.9607825\t1.5872\n3276812\t2.64\t5.28\t175\t86.442856\t56.364799\n3276813\t2.64\t5.32\t205\t100.8286\t63.350399\n3276817\t2.64\t5.48\t103\t23.44799\t6.4000001\n3276818\t2.64\t5.52\t111\t25.572342\t8.1071997\n3276819\t2.64\t5.56\t128\t31.362982\t11.1584\n3276820\t2.64\t5.6\t131\t33.340488\t13.3296\n3276821\t2.64\t5.64\t125\t28.586546\t10.0576\n3276822\t2.64\t5.68\t117\t24.177649\t6.8656001\n3276823\t2.64\t5.72\t117\t25.811478\t7.8544002\n3276824\t2.64\t5.76\t116\t28.05913\t9.2335997\n3276825\t2.64\t5.8\t116\t31.020525\t10.8896\n3276829\t2.64\t5.96\t269\t257.93427\t365.048\n3276830\t2.64\t6\t279\t267.87546\t368.20319\n3276834\t2.64\t6.16\t93\t21.876867\t6.1135998\n3276835\t2.64\t6.2\t93\t19.774544\t5.1216002\n3276836\t2.64\t6.24\t95\t18.680397\t4.5103998\n3276837\t2.64\t6.28\t98\t18.644131\t4.3424001\n3276838\t2.64\t6.32\t121\t27.859432\t8.4720001\n3276839\t2.64\t6.36\t144\t40.846245\t15.8976\n3276840\t2.64\t6.4\t145\t42.221409\t16.382401\n3276845\t2.64\t6.6\t180\t112.16918\t93.377602\n3276846\t2.64\t6.64\t183\t109.00253\t89.897598\n3276847\t2.64\t6.68\t451\t341.84482\t396.02719\n3276848\t2.64\t6.72\t185\t107.38881\t87.731201\n3276849\t2.64\t6.76\t172\t108.93419\t91.822403\n3342339\t2.68\t4.92\t68\t16.231276\t5.3600001\n3342340\t2.68\t4.96\t83\t28.388485\t17.971201\n3342341\t2.68\t5\t101\t41.172039\t28.590401\n3342342\t2.68\t5.04\t114\t47.761585\t31.385599\n3342343\t2.68\t5.08\t106\t38.255936\t20.491199\n3342344\t2.68\t5.12\t53\t9.8327141\t2.7360001\n3342348\t2.68\t5.28\t208\t96.584366\t58.201599\n3342349\t2.68\t5.32\t231\t105.43041\t61.998402\n3342353\t2.68\t5.48\t104\t24.78664\t7.1087999\n3342354\t2.68\t5.52\t140\t38.764961\t14.3152\n3342355\t2.68\t5.56\t140\t36.986313\t13.7792\n3342356\t2.68\t5.6\t129\t28.843645\t8.5791998\n3342357\t2.68\t5.64\t125\t26.718136\t7.4352002\n3342358\t2.68\t5.68\t124\t27.455744\t8.1456003\n3342359\t2.68\t5.72\t121\t28.394812\t9.1775999\n3342360\t2.68\t5.76\t122\t32.382023\t12.0912\n3342361\t2.68\t5.8\t121\t35.528988\t14.176\n3342365\t2.68\t5.96\t269\t260.9852\t362.992\n3342366\t2.68\t6\t269\t263.84412\t360.03839\n3342370\t2.68\t6.16\t93\t23.828762\t7.224\n3342371\t2.68\t6.2\t93\t21.847223\t6.2319999\n3342372\t2.68\t6.24\t93\t20.44768\t5.5408001\n3342373\t2.68\t6.28\t95\t19.957327\t5.1919999\n3342374\t2.68\t6.32\t112\t25.204681\t7.0464001\n3342375\t2.68\t6.36\t145\t41.330524\t15.3424\n3342376\t2.68\t6.4\t144\t42.226788\t15.7232\n3342379\t2.68\t6.52\t246\t162.1927\t154.55521\n3342380\t2.68\t6.56\t256\t180.69125\t191.7504\n3342381\t2.68\t6.6\t267\t198.45714\t225.9744\n3342382\t2.68\t6.64\t294\t232.48856\t300.12\n3342383\t2.68\t6.68\t457\t346.3465\t400.44958\n3342384\t2.68\t6.72\t293\t225.49335\t287.52802\n3342385\t2.68\t6.76\t266\t197.77563\t226.744\n3342386\t2.68\t6.8\t258\t183.93323\t197.68159\n3342387\t2.68\t6.84\t243\t162.47705\t158.35361\n3407875\t2.72\t4.92\t86\t31.022507\t18.2416\n3407876\t2.72\t4.96\t88\t29.352249\t16.4704\n3407877\t2.72\t5\t91\t28.34428\t14.9472\n3407878\t2.72\t5.04\t119\t48.332653\t31.846399\n3407879\t2.72\t5.08\t148\t62.577179\t38.535999\n3407880\t2.72\t5.12\t176\t70.439438\t37.915199\n3407881\t2.72\t5.16\t241\t110.62124\t63.755199\n3407882\t2.72\t5.2\t236\t104.97357\t59.617599\n3407883\t2.72\t5.24\t226\t97.36895\t54.023998\n3407884\t2.72\t5.28\t259\t108.34807\t59.5312\n3407885\t2.72\t5.32\t264\t111.97591\t61.7024\n3407886\t2.72\t5.36\t225\t100.81319\t62.6464\n3407887\t2.72\t5.4\t220\t106.24221\t75.436798\n3407888\t2.72\t5.44\t208\t101.02329\t69.496002\n3407889\t2.72\t5.48\t188\t58.596161\t22.3456\n3407890\t2.72\t5.52\t161\t46.732681\t17.4048\n3407891\t2.72\t5.56\t142\t36.218613\t11.8112\n3407892\t2.72\t5.6\t137\t34.348446\t11.456\n3407893\t2.72\t5.64\t134\t33.812729\t11.7664\n3407894\t2.72\t5.68\t132\t34.142315\t12.472\n3407895\t2.72\t5.72\t132\t36.046364\t14.0032\n3407896\t2.72\t5.76\t129\t36.989223\t15.0144\n3407897\t2.72\t5.8\t128\t39.44965\t16.889601\n3407901\t2.72\t5.96\t310\t286.4483\t377.23999\n3407902\t2.72\t6\t314\t289.42984\t372.87201\n3407906\t2.72\t6.16\t92\t26.002573\t8.5760002\n3407907\t2.72\t6.2\t92\t24.211964\t7.6016002\n3407908\t2.72\t6.24\t92\t22.958916\t6.9247999\n3407909\t2.72\t6.28\t93\t22.41054\t6.5616002\n3407910\t2.72\t6.32\t96\t22.667059\t6.5279999\n3407911\t2.72\t6.36\t144\t41.810989\t15.1216\n3407912\t2.72\t6.4\t143\t42.580166\t15.504\n3407915\t2.72\t6.52\t241\t147.74417\t133.74561\n3407916\t2.72\t6.56\t262\t174.20126\t178.008\n3407917\t2.72\t6.6\t278\t193.54166\t214.84\n3407918\t2.72\t6.64\t339\t248.11678\t300.37119\n3407919\t2.72\t6.68\t451\t344.42502\t397.18561\n3407920\t2.72\t6.72\t353\t258.95291\t306.55359\n3407921\t2.72\t6.76\t277\t194.16962\t216.08\n3407922\t2.72\t6.8\t256\t172.25639\t178.9872\n3407923\t2.72\t6.84\t241\t150.56526\t140.424\n3473411\t2.76\t4.92\t97\t38.222267\t23.8736\n3473412\t2.76\t4.96\t97\t35.21537\t21.134399\n3473413\t2.76\t5\t99\t33.788208\t19.32\n3473414\t2.76\t5.04\t103\t33.022175\t17.591999\n3473415\t2.76\t5.08\t106\t32.294415\t15.9456\n3473416\t2.76\t5.12\t166\t68.0877\t40.543999\n3473417\t2.76\t5.16\t281\t121.87315\t68.416\n3473418\t2.76\t5.2\t265\t112.50618\t61.156799\n3473419\t2.76\t5.24\t256\t104.76728\t55.414398\n3473420\t2.76\t5.28\t281\t112.43497\t58.971199\n3473421\t2.76\t5.32\t284\t114.44407\t59.993599\n3473422\t2.76\t5.36\t267\t111.49501\t65.422401\n3473423\t2.76\t5.4\t257\t113.30338\t74.876801\n3473424\t2.76\t5.44\t275\t120.11343\t75.907204\n3473425\t2.76\t5.48\t171\t50.516453\t18.1952\n3473426\t2.76\t5.52\t149\t40.779076\t13.6848\n3473427\t2.76\t5.56\t145\t39.255268\t13.4112\n3473428\t2.76\t5.6\t142\t38.608486\t13.6496\n3473429\t2.76\t5.64\t140\t38.307564\t13.9168\n3473430\t2.76\t5.68\t140\t39.751347\t15.2464\n3473431\t2.76\t5.72\t138\t41.198982\t16.816\n3473432\t2.76\t5.76\t137\t42.997688\t18.2864\n3473433\t2.76\t5.8\t137\t45.90205\t20.649599\n3473434\t2.76\t5.84\t104\t40.100235\t20.5856\n3473435\t2.76\t5.88\t80\t34.294888\t19.867201\n3473436\t2.76\t5.92\t96\t41.426548\t24.2976\n3473437\t2.76\t5.96\t339\t300.6102\t381.67841\n3473438\t2.76\t6\t340\t301.94342\t375.94879\n3473447\t2.76\t6.36\t135\t41.202343\t15.0608\n3473448\t2.76\t6.4\t140\t42.740696\t15.5952\n3473451\t2.76\t6.52\t244\t138.44972\t116.2112\n3473452\t2.76\t6.56\t269\t167.47571\t164.93919\n3473453\t2.76\t6.6\t290\t189.93753\t200.73759\n3473454\t2.76\t6.64\t362\t262.75052\t307.9296\n3473455\t2.76\t6.68\t447\t341.43793\t391.95679\n3473456\t2.76\t6.72\t371\t271.96927\t316.992\n3473457\t2.76\t6.76\t285\t189.21687\t204.9696\n3473458\t2.76\t6.8\t261\t163.38513\t163.24159\n3473459\t2.76\t6.84\t241\t138.76552\t120.3728\n3538945\t2.8\t4.84\t26\t6.7065015\t2.2368\n3538946\t2.8\t4.88\t26\t6.5531263\t2.1472001\n3538947\t2.8\t4.92\t83\t28.496723\t15.6704\n3538948\t2.8\t4.96\t80\t23.925625\t12.1648\n3538949\t2.8\t5\t78\t21.16482\t10.2432\n3538950\t2.8\t5.04\t72\t15.67489\t5.7856002\n3538951\t2.8\t5.08\t62\t9.9602785\t2.184\n3538952\t2.8\t5.12\t50\t7.4355497\t1.304\n3538953\t2.8\t5.16\t260\t124.12385\t74.337601\n3538954\t2.8\t5.2\t275\t117.29893\t64.307198\n3538955\t2.8\t5.24\t280\t112.5738\t58.2896\n3538956\t2.8\t5.28\t289\t112.39914\t56.792\n3538957\t2.8\t5.32\t280\t107.39648\t54.017601\n3538958\t2.8\t5.36\t285\t117.72711\t67.961601\n3538959\t2.8\t5.4\t259\t107.3278\t65.120003\n3538960\t2.8\t5.44\t206\t93.585457\t61.366402\n3538961\t2.8\t5.48\t106\t31.140366\t10.648\n3538962\t2.8\t5.52\t117\t31.289972\t9.9152002\n3538963\t2.8\t5.56\t126\t34.094898\t11.168\n3538964\t2.8\t5.6\t129\t35.049408\t11.6688\n3538965\t2.8\t5.64\t132\t37.212387\t13.1856\n3538966\t2.8\t5.68\t133\t39.371006\t15.104\n3538967\t2.8\t5.72\t133\t41.114185\t16.6112\n3538968\t2.8\t5.76\t131\t42.996151\t18.4464\n3538969\t2.8\t5.8\t126\t45.285759\t20.7376\n3538973\t2.8\t5.96\t294\t272.00146\t357.16479\n3538974\t2.8\t6\t322\t281.62576\t353.504\n3538983\t2.8\t6.36\t117\t36.949284\t13.9008\n3538984\t2.8\t6.4\t133\t42.106956\t15.8176\n3538987\t2.8\t6.52\t247\t129.5679\t101.3136\n3538988\t2.8\t6.56\t268\t157.72998\t148.89439\n3538989\t2.8\t6.6\t297\t185.45547\t189.7664\n3538990\t2.8\t6.64\t379\t275.80621\t319.26721\n3538991\t2.8\t6.68\t444\t340.36185\t391.10721\n3538992\t2.8\t6.72\t382\t281.42587\t325\n3538993\t2.8\t6.76\t291\t184.13937\t192.4608\n3538994\t2.8\t6.8\t266\t157.36371\t150.59039\n3538995\t2.8\t6.84\t246\t131.83324\t106.7088\n3604481\t2.84\t4.84\t27\t6.093677\t1.8368\n3604482\t2.84\t4.88\t26\t5.6515098\t1.6752\n3604483\t2.84\t4.92\t57\t11.497465\t2.8975999\n3604484\t2.84\t4.96\t56\t9.8414907\t2.2\n3604485\t2.84\t5\t54\t8.3163071\t1.592\n3604486\t2.84\t5.04\t52\t7.6277027\t1.3744\n3604487\t2.84\t5.08\t50\t7.4611697\t1.3424\n3604488\t2.84\t5.12\t47\t7.9607825\t1.5872\n3604489\t2.84\t5.16\t277\t136.71858\t87.1744\n3604490\t2.84\t5.2\t277\t124.14661\t73.121597\n3604491\t2.84\t5.24\t296\t121.54653\t65.060799\n3604492\t2.84\t5.28\t302\t117.67924\t59.284801\n3604493\t2.84\t5.32\t289\t109.03543\t53.807999\n3604494\t2.84\t5.36\t292\t120.48146\t70.7472\n3604495\t2.84\t5.4\t241\t97.944984\t59.056\n3604496\t2.84\t5.44\t209\t90.072014\t56.2384\n3604509\t2.84\t5.96\t357\t292.26901\t361.384\n3604510\t2.84\t6\t388\t323.79016\t380.65759\n3604519\t2.84\t6.36\t108\t33.510082\t12.7024\n3604520\t2.84\t6.4\t123\t40.08849\t15.7376\n3604523\t2.84\t6.52\t245\t119.31032\t85.467201\n3604524\t2.84\t6.56\t273\t150.6747\t133.26401\n3604525\t2.84\t6.6\t302\t180.11603\t176.5936\n3604526\t2.84\t6.64\t389\t281.88303\t322.81281\n3604527\t2.84\t6.68\t452\t344.49945\t394.25601\n3604528\t2.84\t6.72\t390\t287.9043\t332.4848\n3604529\t2.84\t6.76\t298\t178.45212\t177.5264\n3604530\t2.84\t6.8\t270\t149.62213\t135.3024\n3604531\t2.84\t6.84\t240\t118.1138\t87.705597\n3604533\t2.84\t6.92\t83\t22.786308\t7.4144001\n3604534\t2.84\t6.96\t83\t21.408356\t6.7424002\n3604535\t2.84\t7\t85\t21.418526\t6.7600002\n3604536\t2.84\t7.04\t91\t24.370354\t8.4879999\n3604537\t2.84\t7.08\t95\t27.755751\t10.9856\n3604538\t2.84\t7.12\t96\t29.312677\t11.8704\n3604539\t2.84\t7.16\t100\t33.079517\t14.008\n3670017\t2.88\t4.84\t30\t5.9509678\t1.5728\n3670018\t2.88\t4.88\t28\t5.2330184\t1.3487999\n3670019\t2.88\t4.92\t54\t11.487489\t2.8831999\n3670020\t2.88\t4.96\t52\t9.7762432\t2.2176001\n3670021\t2.88\t5\t50\t8.514657\t1.744\n3670022\t2.88\t5.04\t50\t8.4282379\t1.7072001\n3670023\t2.88\t5.08\t48\t8.4430065\t1.7728\n3670024\t2.88\t5.12\t47\t9.1046562\t2.0480001\n3670025\t2.88\t5.16\t312\t163.02496\t111.3744\n3670026\t2.88\t5.2\t314\t151.51718\t96.8144\n3670027\t2.88\t5.24\t326\t146.46187\t87.718399\n3670028\t2.88\t5.28\t344\t146.73788\t82.524803\n3670029\t2.88\t5.32\t332\t133.28098\t70.120003\n3670030\t2.88\t5.36\t316\t131.34325\t76.972801\n3670031\t2.88\t5.4\t247\t96.807465\t55.708801\n3670032\t2.88\t5.44\t216\t89.959999\t53.062401\n3670033\t2.88\t5.48\t150\t64.653793\t34.686401\n3670034\t2.88\t5.52\t207\t86.033112\t43.936001\n3670035\t2.88\t5.56\t199\t76.41256\t35.590401\n3670036\t2.88\t5.6\t176\t65.001961\t28.9664\n3670037\t2.88\t5.64\t152\t61.369392\t30.2528\n3670038\t2.88\t5.68\t177\t74.408974\t38.4464\n3670039\t2.88\t5.72\t202\t76.720749\t35.785599\n3670040\t2.88\t5.76\t245\t94.979286\t44.507198\n3670041\t2.88\t5.8\t256\t97.916206\t45.203201\n3670042\t2.88\t5.84\t268\t105.376\t51.0144\n3670043\t2.88\t5.88\t290\t124.66447\t69.939201\n3670044\t2.88\t5.92\t344\t187.12149\t148.88161\n3670045\t2.88\t5.96\t503\t376.34308\t419.7536\n3670046\t2.88\t6\t514\t384.3222\t422.47681\n3670047\t2.88\t6.04\t318\t166.44257\t119.4352\n3670048\t2.88\t6.08\t302\t156.61765\t111.2592\n3670049\t2.88\t6.12\t296\t160.57521\t119.816\n3670050\t2.88\t6.16\t295\t167.1246\t129.6032\n3670051\t2.88\t6.2\t294\t176.49124\t143.27521\n3670052\t2.88\t6.24\t289\t182.5011\t153.976\n3670053\t2.88\t6.28\t288\t191.16454\t166.7536\n3670054\t2.88\t6.32\t71\t22.495737\t9.7200003\n3670055\t2.88\t6.36\t110\t35.567551\t14.4432\n3670056\t2.88\t6.4\t120\t39.479145\t16.062401\n3670057\t2.88\t6.44\t116\t38.260769\t15.3984\n3670059\t2.88\t6.52\t247\t113.14834\t75.171204\n3670060\t2.88\t6.56\t276\t142.98814\t118.4576\n3670061\t2.88\t6.6\t312\t179.97034\t169.392\n3670062\t2.88\t6.64\t397\t287.1626\t326.19519\n3670063\t2.88\t6.68\t452\t343.83701\t392.6976\n3670064\t2.88\t6.72\t402\t292.3714\t333.94241\n3670065\t2.88\t6.76\t310\t180.29175\t172.1328\n3670066\t2.88\t6.8\t269\t140.29514\t119.2512\n3670067\t2.88\t6.84\t241\t110.88404\t75.633598\n3670069\t2.88\t6.92\t83\t20.4732\t6.0704002\n3670070\t2.88\t6.96\t84\t19.183294\t5.4447999\n3670071\t2.88\t7\t89\t20.759233\t6.368\n3670072\t2.88\t7.04\t96\t24.871632\t9.1232004\n3670073\t2.88\t7.08\t97\t25.77951\t9.5951996\n3670074\t2.88\t7.12\t102\t29.413937\t11.5408\n3670075\t2.88\t7.16\t102\t31.487103\t12.8192\n3735553\t2.92\t4.84\t34\t5.8792844\t1.3376\n3735554\t2.92\t4.88\t28\t4.5862141\t1.0304\n3735561\t2.92\t5.16\t358\t212.15204\t171.88161\n3735562\t2.92\t5.2\t379\t210.00166\t162.07359\n3735563\t2.92\t5.24\t398\t209.23906\t153.424\n3735564\t2.92\t5.28\t422\t212.07173\t147.45599\n3735565\t2.92\t5.32\t414\t198.07924\t130.6416\n3735566\t2.92\t5.36\t428\t213.42834\t149.5696\n3735567\t2.92\t5.4\t375\t167.29056\t101.1056\n3735568\t2.92\t5.44\t236\t93.123802\t52.246399\n3735569\t2.92\t5.48\t273\t135.15883\t88.478401\n3735570\t2.92\t5.52\t320\t146.57327\t85.662399\n3735571\t2.92\t5.56\t314\t140.19608\t79.2864\n3735572\t2.92\t5.6\t301\t132.3887\t73.584\n3735573\t2.92\t5.64\t237\t94.256035\t46.361599\n3735574\t2.92\t5.68\t198\t79.710411\t41.547199\n3735575\t2.92\t5.72\t310\t131.13956\t69.406403\n3735576\t2.92\t5.76\t324\t140.14577\t77.084801\n3735577\t2.92\t5.8\t326\t141.29926\t78.660797\n3735578\t2.92\t5.84\t322\t140.28928\t79.876801\n3735579\t2.92\t5.88\t330\t148.23357\t89.142403\n3735580\t2.92\t5.92\t374\t199.45123\t153.99519\n3735581\t2.92\t5.96\t520\t386.2941\t426.78241\n3735582\t2.92\t6\t528\t392.22583\t428.31201\n3735583\t2.92\t6.04\t331\t170.52539\t123.1584\n3735584\t2.92\t6.08\t309\t158.33998\t114.616\n3735585\t2.92\t6.12\t308\t164.93591\t124.9456\n3735586\t2.92\t6.16\t304\t170.90851\t134.80479\n3735587\t2.92\t6.2\t300\t177.83286\t146.2592\n3735588\t2.92\t6.24\t292\t182.70215\t156.056\n3735589\t2.92\t6.28\t290\t191.18771\t169.0656\n3735590\t2.92\t6.32\t90\t28.14035\t11.672\n3735591\t2.92\t6.36\t121\t41.322639\t18.1152\n3735592\t2.92\t6.4\t120\t39.718739\t16.719999\n3735593\t2.92\t6.44\t119\t40.707737\t17.417601\n3735595\t2.92\t6.52\t246\t106.26759\t64.956802\n3735596\t2.92\t6.56\t277\t134.53978\t103.4864\n3735597\t2.92\t6.6\t316\t175.88043\t159.17599\n3735598\t2.92\t6.64\t410\t299.52469\t342.104\n3735599\t2.92\t6.68\t456\t343.86163\t389.88321\n3735600\t2.92\t6.72\t405\t293.24362\t333.58081\n3735601\t2.92\t6.76\t320\t178.73674\t162.84801\n3735602\t2.92\t6.8\t271\t133.84842\t107.1408\n3735603\t2.92\t6.84\t241\t103.35139\t64.139198\n3735605\t2.92\t6.92\t83\t18.575243\t4.9952002\n3735606\t2.92\t6.96\t87\t18.707726\t5.3072\n3735607\t2.92\t7\t97\t22.903288\t7.6799998\n3735608\t2.92\t7.04\t102\t24.907566\t8.7552004\n3735609\t2.92\t7.08\t104\t26.486828\t9.592\n3735610\t2.92\t7.12\t105\t28.274229\t10.5248\n3735611\t2.92\t7.16\t103\t29.388485\t11.184\n3801088\t2.96\t4.8\t85\t41.581909\t29.2064\n3801089\t2.96\t4.84\t58\t13.859875\t4.7536001\n3801090\t2.96\t4.88\t30\t4.5404897\t0.89279997\n3801091\t2.96\t4.92\t193\t129.37222\t117.2784\n3801092\t2.96\t4.96\t192\t116.09351\t98.3424\n3801093\t2.96\t5\t186\t101.59654\t79.564796\n3801094\t2.96\t5.04\t172\t81.4235\t56.063999\n3801095\t2.96\t5.08\t127\t39.823441\t15.872\n3801096\t2.96\t5.12\t92\t27.770664\t11.2768\n3801097\t2.96\t5.16\t382\t235.87764\t206.4128\n3801098\t2.96\t5.2\t420\t239.7036\t198.6656\n3801099\t2.96\t5.24\t435\t237.36275\t188.4384\n3801100\t2.96\t5.28\t455\t238.19411\t178.72\n3801101\t2.96\t5.32\t447\t223.56174\t159.5744\n3801102\t2.96\t5.36\t467\t241.29996\t178.06081\n3801103\t2.96\t5.4\t468\t236.99042\t168.29601\n3801104\t2.96\t5.44\t450\t216.2874\t144.16319\n3801105\t2.96\t5.48\t405\t188.88159\t117.4624\n3801106\t2.96\t5.52\t374\t170.54704\t102.6848\n3801107\t2.96\t5.56\t362\t161.16765\t93.444801\n3801108\t2.96\t5.6\t356\t155.45341\t87.601601\n3801109\t2.96\t5.64\t352\t150.75609\t82.908798\n3801110\t2.96\t5.68\t352\t149.30342\t81.737602\n3801111\t2.96\t5.72\t350\t148.8269\t81.806396\n3801112\t2.96\t5.76\t343\t145.94128\t80.6912\n3801113\t2.96\t5.8\t339\t144.5766\t81.065598\n3801114\t2.96\t5.84\t337\t143.96118\t82.239998\n3801115\t2.96\t5.88\t339\t147.61288\t87.367996\n3801116\t2.96\t5.92\t397\t206.3087\t154.8752\n3801117\t2.96\t5.96\t539\t395.32129\t430.9584\n3801118\t2.96\t6\t540\t396.14984\t428.86081\n3801119\t2.96\t6.04\t334\t165.94984\t117.4064\n3801120\t2.96\t6.08\t316\t157.32072\t113.0928\n3801121\t2.96\t6.12\t312\t163.14531\t122.9376\n3801122\t2.96\t6.16\t308\t168.91061\t132.6864\n3801123\t2.96\t6.2\t305\t175.74461\t143.5296\n3801124\t2.96\t6.24\t297\t181.3558\t153.93919\n3801125\t2.96\t6.28\t291\t188.44608\t165.8096\n3801126\t2.96\t6.32\t104\t33.364124\t13.9712\n3801127\t2.96\t6.36\t125\t41.763016\t18.164801\n3801128\t2.96\t6.4\t139\t47.316441\t20.624001\n3801129\t2.96\t6.44\t130\t46.336147\t21.084801\n3801131\t2.96\t6.52\t249\t102.71947\t58.257599\n3801132\t2.96\t6.56\t277\t126.43604\t89.457603\n3801133\t2.96\t6.6\t325\t175.80861\t153.2128\n3801134\t2.96\t6.64\t419\t304.79086\t346.74399\n3801135\t2.96\t6.68\t459\t343.69019\t387.80161\n3801136\t2.96\t6.72\t414\t295.46216\t332.00961\n3801137\t2.96\t6.76\t338\t186.93533\t164.0448\n3801138\t2.96\t6.8\t293\t141.04265\t105.7984\n3801139\t2.96\t6.84\t255\t110.78763\t68.323196\n3801141\t2.96\t6.92\t83\t17.128313\t4.1887999\n3801142\t2.96\t6.96\t100\t23.130611\t7.3568001\n3801143\t2.96\t7\t106\t24.39456\t7.9424\n3801144\t2.96\t7.04\t109\t25.525942\t8.4848003\n3801145\t2.96\t7.08\t107\t25.276199\t8.3936005\n3801146\t2.96\t7.12\t107\t27.00593\t9.4239998\n3801147\t2.96\t7.16\t108\t29.962065\t11.1632\n3866624\t3\t4.8\t269\t285.2059\t384.064\n3866625\t3\t4.84\t306\t286.14209\t368.616\n3866626\t3\t4.88\t316\t281.14218\t351.73761\n3866627\t3\t4.92\t310\t273.35226\t332.5968\n3866628\t3\t4.96\t312\t263.85147\t309.83679\n3866629\t3\t5\t322\t259.8038\t294.31039\n3866630\t3\t5.04\t332\t252.69942\t273.3168\n3866631\t3\t5.08\t345\t246.62799\t253.92641\n3866632\t3\t5.12\t374\t249.69357\t243.4688\n3866633\t3\t5.16\t444\t264.87527\t236.3136\n3866634\t3\t5.2\t457\t263.85822\t226.2016\n3866635\t3\t5.24\t465\t258.03333\t211.2928\n3866636\t3\t5.28\t477\t255.05229\t198.79201\n3866637\t3\t5.32\t469\t244.33694\t187.384\n3866638\t3\t5.36\t484\t255.58507\t195.84801\n3866639\t3\t5.4\t481\t246.41516\t180.75681\n3866640\t3\t5.44\t466\t227.62523\t158.5632\n3866641\t3\t5.48\t428\t200.38931\t132.008\n3866642\t3\t5.52\t408\t190.89244\t123.6544\n3866643\t3\t5.56\t393\t181.09453\t115.0656\n3866644\t3\t5.6\t373\t168.28201\t104.6224\n3866645\t3\t5.64\t369\t164.16472\t100.4464\n3866646\t3\t5.68\t365\t159.90039\t96.188797\n3866647\t3\t5.72\t358\t156.15387\t93.7808\n3866648\t3\t5.76\t357\t155.86826\t93.590401\n3866649\t3\t5.8\t353\t153.51762\t92.344002\n3866650\t3\t5.84\t352\t155.09401\t94.873596\n3866651\t3\t5.88\t356\t158.59486\t98.5504\n3866652\t3\t5.92\t410\t208.02751\t150.216\n3866653\t3\t5.96\t547\t397.59076\t430.3584\n3866654\t3\t6\t550\t397.54211\t425.90079\n3866655\t3\t6.04\t345\t165.2907\t112.7184\n3866656\t3\t6.08\t331\t162.29266\t114.8864\n3866657\t3\t6.12\t324\t166.16064\t123.1776\n3866658\t3\t6.16\t318\t169.6765\t131.0864\n3866659\t3\t6.2\t308\t172.95802\t140.13921\n3866660\t3\t6.24\t306\t181.82072\t152.93919\n3866661\t3\t6.28\t293\t187.83348\t164.7776\n3866662\t3\t6.32\t111\t35.56448\t14.9712\n3866663\t3\t6.36\t155\t51.711483\t22.249599\n3866664\t3\t6.4\t184\t68.285156\t31.9744\n3866665\t3\t6.44\t185\t75.544006\t39.409599\n3866667\t3\t6.52\t251\t96.904282\t49.8288\n3866668\t3\t6.56\t280\t119.34347\t76.624001\n3866669\t3\t6.6\t344\t183.02953\t153.0768\n3866670\t3\t6.64\t446\t321.07849\t356.39679\n3866671\t3\t6.68\t497\t375.69952\t419.1568\n3866672\t3\t6.72\t463\t339.43518\t376.8544\n3866673\t3\t6.76\t392\t235.65625\t216.6208\n3866674\t3\t6.8\t346\t186.42545\t155.37601\n3866675\t3\t6.84\t314\t167.43939\t139.81599\n3866677\t3\t6.92\t99\t21.90798\t6.0256\n3866678\t3\t6.96\t117\t27.258326\t8.4175997\n3866679\t3\t7\t118\t26.564445\t8.0880003\n3866680\t3\t7.04\t113\t24.881172\t7.5567999\n3866681\t3\t7.08\t111\t25.387308\t8.1280003\n3866682\t3\t7.12\t111\t27.838657\t9.8559999\n3866683\t3\t7.16\t122\t46.272751\t35.766399\n3932160\t3.04\t4.8\t300\t306.1478\t405.21759\n3932161\t3.04\t4.84\t320\t299.5354\t383.90561\n3932162\t3.04\t4.88\t326\t291.02536\t363.00641\n3932163\t3.04\t4.92\t317\t279.61249\t341.9024\n3932164\t3.04\t4.96\t321\t271.3609\t322.09921\n3932165\t3.04\t5\t329\t265.8786\t305.0528\n3932166\t3.04\t5.04\t339\t259.02194\t286.44321\n3932167\t3.04\t5.08\t375\t268.3595\t279.59201\n3932168\t3.04\t5.12\t408\t269.8913\t265.90561\n3932169\t3.04\t5.16\t456\t277.92145\t257.24799\n3932170\t3.04\t5.2\t459\t270.13348\t241.696\n3932171\t3.04\t5.24\t468\t265.42044\t228.4496\n3932172\t3.04\t5.28\t478\t262.75681\t217.336\n3932173\t3.04\t5.32\t474\t253.80664\t205.7744\n3932174\t3.04\t5.36\t492\t264.13156\t211.27679\n3932175\t3.04\t5.4\t492\t260.94006\t203.70239\n3932176\t3.04\t5.44\t474\t238.14188\t176.0368\n3932177\t3.04\t5.48\t444\t215.88725\t153.2832\n3932178\t3.04\t5.52\t418\t200.89526\t140.26241\n3932179\t3.04\t5.56\t404\t193.81007\t133.39841\n3932180\t3.04\t5.6\t396\t187.50414\t126.7472\n3932181\t3.04\t5.64\t385\t179.59515\t119.5456\n3932182\t3.04\t5.68\t376\t171.62955\t112.3072\n3932183\t3.04\t5.72\t367\t166.64774\t108.1744\n3932184\t3.04\t5.76\t366\t165.46899\t106.4592\n3932185\t3.04\t5.8\t366\t165.85594\t106.4912\n3932186\t3.04\t5.84\t366\t165.61865\t106.4048\n3932187\t3.04\t5.88\t367\t166.86472\t107.7472\n3932188\t3.04\t5.92\t421\t212.84048\t151.0224\n3932189\t3.04\t5.96\t567\t413.94699\t444.96799\n3932190\t3.04\t6\t569\t414.15894\t442.37439\n3932191\t3.04\t6.04\t367\t182.38228\t128.2368\n3932192\t3.04\t6.08\t353\t179.01418\t129.6944\n3932193\t3.04\t6.12\t351\t184.35657\t137.70399\n3932194\t3.04\t6.16\t346\t187.8327\t144.6608\n3932195\t3.04\t6.2\t346\t194.46359\t154.0704\n3932196\t3.04\t6.24\t346\t201.18672\t164.336\n3932197\t3.04\t6.28\t358\t212.4406\t177.3904\n3932198\t3.04\t6.32\t393\t239.18513\t200.5632\n3932199\t3.04\t6.36\t380\t243.6611\t213.416\n3932200\t3.04\t6.4\t373\t245.28171\t222.8448\n3932201\t3.04\t6.44\t368\t244.07941\t227.6848\n3932202\t3.04\t6.48\t369\t243.03621\t232.216\n3932203\t3.04\t6.52\t431\t271.83929\t255.4704\n3932204\t3.04\t6.56\t443\t289.05621\t281.936\n3932205\t3.04\t6.6\t490\t349.74985\t365.2384\n3932206\t3.04\t6.64\t579\t486.22412\t579.52161\n3932207\t3.04\t6.68\t618\t535.16101\t647.20001\n3932208\t3.04\t6.72\t565\t481.20602\t587.50403\n3932209\t3.04\t6.76\t483\t365.36923\t417.08801\n3932210\t3.04\t6.8\t432\t306.61496\t348.7168\n3932211\t3.04\t6.84\t407\t281.94812\t326.86401\n3932212\t3.04\t6.88\t356\t259.74207\t320.87521\n3932213\t3.04\t6.92\t282\t224.78014\t308.26559\n3932214\t3.04\t6.96\t259\t218.97029\t315.37921\n3932215\t3.04\t7\t247\t214.1096\t317.09439\n3932216\t3.04\t7.04\t238\t211.9409\t321.4256\n3932217\t3.04\t7.08\t232\t212.01784\t328.0144\n3932218\t3.04\t7.12\t226\t209.70573\t327.16641\n3932219\t3.04\t7.16\t222\t212.46121\t336.21921\n3997696\t3.08\t4.8\t297\t303.10629\t401.19519\n3997697\t3.08\t4.84\t316\t295.11691\t378.4512\n3997698\t3.08\t4.88\t324\t287.88385\t358.95041\n3997699\t3.08\t4.92\t314\t276.25323\t337.832\n3997700\t3.08\t4.96\t319\t269.50211\t319.76001\n3997701\t3.08\t5\t326\t263.26926\t302.33759\n3997702\t3.08\t5.04\t352\t269.14133\t294.09439\n3997703\t3.08\t5.08\t369\t265.4147\t277.82559\n3997704\t3.08\t5.12\t402\t268.10809\t265.43359\n3997705\t3.08\t5.16\t447\t272.81335\t253.97279\n3997706\t3.08\t5.2\t455\t267.15765\t239.6192\n3997707\t3.08\t5.24\t463\t263.10223\t227.0896\n3997708\t3.08\t5.28\t478\t262.97372\t217.4512\n3997709\t3.08\t5.32\t477\t255.58261\t206.26401\n3997710\t3.08\t5.36\t493\t264.64627\t210.8416\n3997711\t3.08\t5.4\t488\t257.13675\t198.8528\n3997712\t3.08\t5.44\t467\t234.63095\t174.0096\n3997713\t3.08\t5.48\t436\t211.99486\t151.1264\n3997714\t3.08\t5.52\t420\t202.09621\t141.024\n3997715\t3.08\t5.56\t404\t193.03607\t132.71201\n3997716\t3.08\t5.6\t392\t186.21957\t126.4448\n3997717\t3.08\t5.64\t387\t182.71283\t122.4976\n3997718\t3.08\t5.68\t385\t179.71841\t118.8912\n3997719\t3.08\t5.72\t373\t171.39308\t111.7968\n3997720\t3.08\t5.76\t368\t168.05602\t108.9632\n3997721\t3.08\t5.8\t367\t167.604\t108.488\n3997722\t3.08\t5.84\t368\t169.01961\t110.008\n3997723\t3.08\t5.88\t371\t171.03979\t111.8784\n3997724\t3.08\t5.92\t415\t203.6002\t138.0192\n3997725\t3.08\t5.96\t574\t419.28796\t449.4368\n3997726\t3.08\t6\t571\t415.51892\t443.40961\n3997727\t3.08\t6.04\t375\t188.35931\t133.28\n3997728\t3.08\t6.08\t357\t183.07394\t133.9088\n3997729\t3.08\t6.12\t352\t186.59917\t140.7952\n3997730\t3.08\t6.16\t351\t191.35672\t147.8976\n3997731\t3.08\t6.2\t350\t197.88655\t157.8\n3997732\t3.08\t6.24\t350\t204.04774\t167.1904\n3997733\t3.08\t6.28\t358\t214.15875\t179.8624\n3997734\t3.08\t6.32\t387\t239.15179\t202.976\n3997735\t3.08\t6.36\t369\t239.0824\t211.744\n3997736\t3.08\t6.4\t362\t238.38428\t216.6848\n3997737\t3.08\t6.44\t362\t240.58443\t224.13921\n3997738\t3.08\t6.48\t375\t248.6382\t233.8096\n3997739\t3.08\t6.52\t429\t267.45822\t250.0208\n3997740\t3.08\t6.56\t446\t289.85107\t281.40161\n3997741\t3.08\t6.6\t493\t350.22226\t364.064\n3997742\t3.08\t6.64\t583\t487.20367\t577.44958\n3997743\t3.08\t6.68\t624\t539.53442\t651.18878\n3997744\t3.08\t6.72\t568\t478.31674\t578.36157\n3997745\t3.08\t6.76\t481\t356.44235\t398.53439\n3997746\t3.08\t6.8\t419\t286.80704\t315.71359\n3997747\t3.08\t6.84\t394\t261.37863\t290.46881\n3997748\t3.08\t6.88\t318\t226.71831\t272.77759\n3997749\t3.08\t6.92\t282\t211.39117\t274.7088\n3997750\t3.08\t6.96\t254\t204.65642\t282.34079\n3997751\t3.08\t7\t243\t204.45125\t293.1264\n3997752\t3.08\t7.04\t237\t206.15927\t304.11359\n3997753\t3.08\t7.08\t233\t208.21883\t313.60959\n3997754\t3.08\t7.12\t229\t211.37726\t324.74399\n3997755\t3.08\t7.16\t227\t216.45682\t337.50879\n4063232\t3.12\t4.8\t247\t246.4873\t316.37439\n4063233\t3.12\t4.84\t273\t240.50584\t294.71841\n4063234\t3.12\t4.88\t281\t234.4556\t278.48959\n4063235\t3.12\t4.92\t271\t222.22125\t257.30881\n4063236\t3.12\t4.96\t287\t228.27834\t255.37601\n4063237\t3.12\t5\t304\t232.91679\t250.2464\n4063238\t3.12\t5.04\t313\t227.80765\t234.112\n4063239\t3.12\t5.08\t336\t235.28737\t231.79041\n4063240\t3.12\t5.12\t353\t232.49414\t218.30881\n4063241\t3.12\t5.16\t425\t245.85609\t210.9904\n4063242\t3.12\t5.2\t430\t241.84695\t201.8688\n4063243\t3.12\t5.24\t440\t238.49185\t190.44321\n4063244\t3.12\t5.28\t453\t237.72368\t181.9856\n4063245\t3.12\t5.32\t454\t233.30954\t174.44\n4063246\t3.12\t5.36\t473\t244.03697\t181.1008\n4063247\t3.12\t5.4\t470\t237.36023\t170.2128\n4063248\t3.12\t5.44\t452\t219.23354\t151.304\n4063249\t3.12\t5.48\t412\t191.60184\t124.9424\n4063250\t3.12\t5.52\t399\t185.56627\t119.4672\n4063251\t3.12\t5.56\t378\t173.86888\t109.96\n4063252\t3.12\t5.6\t376\t170.61494\t106.0528\n4063253\t3.12\t5.64\t372\t167.78447\t103.3648\n4063254\t3.12\t5.68\t371\t166.4176\t102.2128\n4063255\t3.12\t5.72\t365\t163.99062\t100.7472\n4063256\t3.12\t5.76\t359\t160.41261\t98.526398\n4063257\t3.12\t5.8\t354\t156.70488\t95.270401\n4063258\t3.12\t5.84\t348\t152.16412\t91.513603\n4063259\t3.12\t5.88\t355\t155.51407\t94.015999\n4063260\t3.12\t5.92\t388\t181.09587\t116.1984\n4063261\t3.12\t5.96\t556\t401.72137\t430.8848\n4063262\t3.12\t6\t550\t395.73163\t423.65121\n4063263\t3.12\t6.04\t349\t168.6797\t116.4256\n4063264\t3.12\t6.08\t323\t159.94722\t115.52\n4063265\t3.12\t6.12\t319\t164.16309\t123.4976\n4063266\t3.12\t6.16\t312\t168.40761\t132.57761\n4063267\t3.12\t6.2\t303\t171.78307\t140.7424\n4063268\t3.12\t6.24\t301\t180.11104\t153.0992\n4063269\t3.12\t6.28\t290\t186.83986\t165.37601\n4063270\t3.12\t6.32\t115\t41.985519\t21.104\n4063271\t3.12\t6.36\t142\t50.748955\t24.8944\n4063272\t3.12\t6.4\t167\t64.232712\t32.617599\n4063273\t3.12\t6.44\t158\t67.213646\t37.175999\n4063275\t3.12\t6.52\t241\t87.386703\t39.969601\n4063276\t3.12\t6.56\t274\t106.20513\t57.431999\n4063277\t3.12\t6.6\t333\t171.00977\t135.37601\n4063278\t3.12\t6.64\t446\t320.51633\t350.26401\n4063279\t3.12\t6.68\t505\t387.19986\t434.23361\n4063280\t3.12\t6.72\t464\t337.05276\t366.90561\n4063281\t3.12\t6.76\t390\t229.02234\t201.5984\n4063282\t3.12\t6.8\t333\t170.82875\t134.56799\n4063283\t3.12\t6.84\t297\t153.19315\t123.4096\n4063285\t3.12\t6.92\t93\t19.674591\t5.1567998\n4063286\t3.12\t6.96\t123\t29.640238\t9.5391998\n4063287\t3.12\t7\t114\t25.315889\t7.6528001\n4063288\t3.12\t7.04\t112\t24.913868\t7.7487998\n4063289\t3.12\t7.08\t111\t25.320509\t8.0704002\n4063290\t3.12\t7.12\t110\t26.996445\t9.2032003\n4063291\t3.12\t7.16\t108\t28.932966\t10.56\n4128768\t3.16\t4.8\t42\t13.327939\t5.7839999\n4128769\t3.16\t4.84\t39\t6.889689\t1.5776\n4128770\t3.16\t4.88\t29\t4.73382\t1.0592\n4128771\t3.16\t4.92\t168\t104.91836\t88.203201\n4128772\t3.16\t4.96\t168\t91.781197\t70.092796\n4128773\t3.16\t5\t150\t67.815201\t43.0784\n4128774\t3.16\t5.04\t127\t48.152073\t25.881599\n4128775\t3.16\t5.08\t113\t38.803425\t19.087999\n4128776\t3.16\t5.12\t69\t19.397087\t7.7600002\n4128777\t3.16\t5.16\t355\t215.65956\t186.3136\n4128778\t3.16\t5.2\t375\t211.64218\t174.64799\n4128779\t3.16\t5.24\t396\t210.51851\t163.48959\n4128780\t3.16\t5.28\t416\t213.29005\t156.7616\n4128781\t3.16\t5.32\t420\t211.78104\t152.424\n4128782\t3.16\t5.36\t436\t220.36288\t157.12959\n4128783\t3.16\t5.4\t425\t206.77844\t139.5824\n4128784\t3.16\t5.44\t413\t192.6102\t124.3616\n4128785\t3.16\t5.48\t362\t168.94011\t106.16\n4128786\t3.16\t5.52\t351\t160.44887\t97.444801\n4128787\t3.16\t5.56\t353\t159.13219\t93.531197\n4128788\t3.16\t5.6\t348\t154.98006\t89.2192\n4128789\t3.16\t5.64\t350\t152.74246\t84.956802\n4128790\t3.16\t5.68\t346\t148.50285\t82.171204\n4128791\t3.16\t5.72\t340\t146.15814\t81.227203\n4128792\t3.16\t5.76\t337\t146.00421\t82.6064\n4128793\t3.16\t5.8\t333\t144.77597\t83.649597\n4128794\t3.16\t5.84\t333\t143.80528\t83.420799\n4128795\t3.16\t5.88\t340\t148.97957\t88.5056\n4128796\t3.16\t5.92\t363\t165.87131\t104.3856\n4128797\t3.16\t5.96\t546\t394.01614\t422.9888\n4128798\t3.16\t6\t536\t385.72137\t414.896\n4128799\t3.16\t6.04\t333\t160.13019\t109.2224\n4128800\t3.16\t6.08\t310\t152.57179\t108.7024\n4128801\t3.16\t6.12\t305\t157.37149\t117.232\n4128802\t3.16\t6.16\t301\t163.42891\t127.32\n4128803\t3.16\t6.2\t300\t172.11256\t139.4464\n4128804\t3.16\t6.24\t293\t178.54353\t150.536\n4128805\t3.16\t6.28\t289\t186.43147\t162.8528\n4128806\t3.16\t6.32\t112\t43.682781\t23.568001\n4128807\t3.16\t6.36\t119\t45.730396\t24.8304\n4128808\t3.16\t6.4\t121\t47.800858\t26.420799\n4128809\t3.16\t6.44\t109\t44.055561\t24.5872\n4128811\t3.16\t6.52\t236\t88.245117\t42.123199\n4128812\t3.16\t6.56\t262\t103.58092\t56.768002\n4128813\t3.16\t6.6\t326\t166.77905\t130.99361\n4128814\t3.16\t6.64\t431\t310.00848\t340.59521\n4128815\t3.16\t6.68\t480\t370.276\t420.2496\n4128816\t3.16\t6.72\t427\t304.66785\t333.16\n4128817\t3.16\t6.76\t337\t178.358\t144.0032\n4128818\t3.16\t6.8\t273\t115.20872\t68.985603\n4128819\t3.16\t6.84\t243\t96.810638\t52.190399\n4128821\t3.16\t6.92\t83\t17.128313\t4.1887999\n4128822\t3.16\t6.96\t97\t21.272156\t6.2336001\n4128823\t3.16\t7\t111\t27.025276\t9.3535995\n4128824\t3.16\t7.04\t110\t26.065348\t8.7952003\n4128825\t3.16\t7.08\t107\t25.454184\t8.5727997\n4128826\t3.16\t7.12\t105\t26.04426\t8.9535999\n4128827\t3.16\t7.16\t106\t28.961067\t10.608\n4194305\t3.2\t4.84\t30\t5.7652979\t1.4912\n4194306\t3.2\t4.88\t27\t5.0522752\t1.3135999\n4194307\t3.2\t4.92\t75\t26.693171\t14.4528\n4194308\t3.2\t4.96\t83\t32.136166\t19.524799\n4194309\t3.2\t5\t77\t25.613506\t13.4784\n4194310\t3.2\t5.04\t68\t17.73901\t6.552\n4194311\t3.2\t5.08\t68\t18.388031\t6.9200001\n4194312\t3.2\t5.12\t68\t19.094198\t7.0704002\n4194313\t3.2\t5.16\t326\t189.39143\t154.87041\n4194314\t3.2\t5.2\t335\t180.91406\t139.9456\n4194315\t3.2\t5.24\t340\t169.00072\t119.7968\n4194316\t3.2\t5.28\t347\t156.54019\t96.582397\n4194317\t3.2\t5.32\t343\t150.37836\t90.086403\n4194318\t3.2\t5.36\t333\t142.24568\t83.118401\n4194319\t3.2\t5.4\t265\t97.877777\t48.865601\n4194320\t3.2\t5.44\t204\t77.11097\t40.420799\n4194321\t3.2\t5.48\t208\t106.26859\t73.059196\n4194322\t3.2\t5.52\t248\t103.83669\t55.268799\n4194323\t3.2\t5.56\t251\t99.81015\t48.624001\n4194324\t3.2\t5.6\t241\t96.757286\t48.048\n4194325\t3.2\t5.64\t184\t76.418167\t40.326401\n4194326\t3.2\t5.68\t180\t72.889717\t37.633598\n4194327\t3.2\t5.72\t251\t101.16173\t52.2528\n4194328\t3.2\t5.76\t283\t115.87157\t60.712002\n4194329\t3.2\t5.8\t300\t127.66702\t71.083199\n4194330\t3.2\t5.84\t312\t136.29858\t79.152\n4194331\t3.2\t5.88\t326\t148.26349\t90.889603\n4194332\t3.2\t5.92\t351\t168.81058\t112.9264\n4194333\t3.2\t5.96\t538\t389.75046\t420.35519\n4194334\t3.2\t6\t526\t381.0748\t412.71841\n4194335\t3.2\t6.04\t320\t157.44823\t108.408\n4194336\t3.2\t6.08\t303\t152.73003\t108.7696\n4194337\t3.2\t6.12\t296\t155.50166\t115.5184\n4194338\t3.2\t6.16\t296\t163.6087\t126.7648\n4194339\t3.2\t6.2\t295\t171.69041\t138.35361\n4194340\t3.2\t6.24\t288\t177.28717\t148.6192\n4194341\t3.2\t6.28\t288\t187.5023\t162.936\n4194342\t3.2\t6.32\t101\t42.141998\t24.523199\n4194343\t3.2\t6.36\t104\t42.948174\t25.419201\n4194344\t3.2\t6.4\t103\t42.006329\t24.8992\n4194345\t3.2\t6.44\t93\t39.828022\t23.740801\n4194347\t3.2\t6.52\t230\t87.913895\t43.980801\n4194348\t3.2\t6.56\t255\t102.92833\t58.041599\n4194349\t3.2\t6.6\t313\t158.90723\t123.3424\n4194350\t3.2\t6.64\t428\t305.2117\t329.35681\n4194351\t3.2\t6.68\t488\t383.7525\t436.328\n4194352\t3.2\t6.72\t422\t303.99194\t332.65921\n4194353\t3.2\t6.76\t316\t165.76581\t133.7552\n4194354\t3.2\t6.8\t252\t102.16079\t59.1488\n4194355\t3.2\t6.84\t229\t86.95871\t43.279999\n4194357\t3.2\t6.92\t83\t18.575243\t4.9952002\n4194358\t3.2\t6.96\t86\t18.24155\t4.9552002\n4194359\t3.2\t7\t98\t23.307735\t7.8175998\n4194360\t3.2\t7.04\t106\t27.177498\t10.0816\n4194361\t3.2\t7.08\t103\t26.312174\t9.5967999\n4194362\t3.2\t7.12\t105\t28.274229\t10.5248\n4194363\t3.2\t7.16\t103\t29.424183\t11.2224\n4259841\t3.24\t4.84\t27\t6.0168109\t1.7920001\n4259842\t3.24\t4.88\t27\t5.832253\t1.7104\n4259843\t3.24\t4.92\t71\t21.333469\t10.1584\n4259844\t3.24\t4.96\t81\t28.698267\t16.9648\n4259845\t3.24\t5\t81\t26.454065\t14.4048\n4259846\t3.24\t5.04\t72\t18.256544\t7.2351999\n4259847\t3.24\t5.08\t70\t17.251848\t6.1167998\n4259848\t3.24\t5.12\t69\t17.703981\t6.1872001\n4259849\t3.24\t5.16\t275\t137.60223\t91.332802\n4259850\t3.24\t5.2\t274\t127.27692\t79.689598\n4259851\t3.24\t5.24\t275\t117.72443\t68.344002\n4259852\t3.24\t5.28\t280\t110.39739\t58.041599\n4259853\t3.24\t5.32\t272\t107.02144\t58.6464\n4259854\t3.24\t5.36\t260\t100.69891\t53.703999\n4259855\t3.24\t5.4\t215\t77.945946\t39.755199\n4259856\t3.24\t5.44\t195\t77.610741\t43.625599\n4259857\t3.24\t5.48\t128\t52.066845\t26.740801\n4259858\t3.24\t5.52\t173\t69.55941\t34.926399\n4259859\t3.24\t5.56\t172\t64.802238\t30.246401\n4259860\t3.24\t5.6\t157\t57.638287\t25.9984\n4259861\t3.24\t5.64\t142\t58.275364\t29.686399\n4259862\t3.24\t5.68\t174\t72.292641\t36.848\n4259863\t3.24\t5.72\t191\t70.891571\t31.915199\n4259864\t3.24\t5.76\t227\t88.659538\t43.513599\n4259865\t3.24\t5.8\t245\t97.323059\t49.073601\n4259866\t3.24\t5.84\t259\t103.53677\t52.870399\n4259867\t3.24\t5.88\t282\t121.46165\t68.430397\n4259868\t3.24\t5.92\t311\t151.72411\t102.344\n4259869\t3.24\t5.96\t525\t377.97293\t410.08319\n4259870\t3.24\t6\t511\t370.18506\t403.18561\n4259871\t3.24\t6.04\t298\t147.75584\t99.7136\n4259872\t3.24\t6.08\t287\t145.1375\t101.1264\n4259873\t3.24\t6.12\t283\t148.22972\t107.0688\n4259874\t3.24\t6.16\t282\t155.47636\t117.5696\n4259875\t3.24\t6.2\t280\t164.30658\t131.0304\n4259876\t3.24\t6.24\t284\t177.65083\t148.83681\n4259877\t3.24\t6.28\t282\t185.34163\t160.6432\n4259878\t3.24\t6.32\t89\t41.818237\t26.312\n4259879\t3.24\t6.36\t96\t40.436947\t24.856001\n4259880\t3.24\t6.4\t97\t42.221485\t26.504\n4259881\t3.24\t6.44\t87\t40.034889\t25.028799\n4259883\t3.24\t6.52\t229\t91.553207\t48.7808\n4259884\t3.24\t6.56\t250\t104.68884\t62.9328\n4259885\t3.24\t6.6\t300\t151.96605\t118.9456\n4259886\t3.24\t6.64\t418\t296.58411\t316.95999\n4259887\t3.24\t6.68\t494\t390.99408\t442.4512\n4259888\t3.24\t6.72\t416\t303.50266\t332.92319\n4259889\t3.24\t6.76\t305\t159.99535\t129.94881\n4259890\t3.24\t6.8\t250\t105.62165\t64.900803\n4259891\t3.24\t6.84\t227\t91.348122\t50.1936\n4259893\t3.24\t6.92\t83\t20.4732\t6.0704002\n4259894\t3.24\t6.96\t84\t19.183294\t5.4447999\n4259895\t3.24\t7\t90\t21.136593\t6.5103998\n4259896\t3.24\t7.04\t97\t25.44014\t9.4463997\n4259897\t3.24\t7.08\t105\t30.302172\t12.344\n4259898\t3.24\t7.12\t100\t28.700823\t11.272\n4259899\t3.24\t7.16\t100\t30.329388\t12.056\n4325377\t3.28\t4.84\t26\t6.6675682\t2.2096\n4325378\t3.28\t4.88\t26\t6.5166049\t2.1328001\n4325379\t3.28\t4.92\t67\t16.109274\t5.7407999\n4325380\t3.28\t4.96\t79\t24.191868\t12.7184\n4325381\t3.28\t5\t84\t26.795893\t14.72\n4325382\t3.28\t5.04\t75\t18.343124\t7.3376002\n4325383\t3.28\t5.08\t70\t15.504112\t5.0367999\n4325384\t3.28\t5.12\t69\t16.066582\t5.1536002\n4325385\t3.28\t5.16\t242\t113.23853\t69.006401\n4325386\t3.28\t5.2\t231\t97.006844\t53.731201\n4325387\t3.28\t5.24\t231\t89.743546\t46.231998\n4325388\t3.28\t5.28\t244\t91.149643\t45.248001\n4325389\t3.28\t5.32\t250\t99.231262\t55.019199\n4325390\t3.28\t5.36\t236\t92.355324\t49.454399\n4325391\t3.28\t5.4\t194\t72.953621\t39.428799\n4325392\t3.28\t5.44\t187\t76.101768\t43.548801\n4325403\t3.28\t5.88\t44\t10.038424\t3.0864\n4325404\t3.28\t5.92\t104\t46.874172\t31.5504\n4325405\t3.28\t5.96\t348\t284.89667\t348.78879\n4325406\t3.28\t6\t340\t279.56198\t342.44159\n4325407\t3.28\t6.04\t62\t20.797184\t10.968\n4325408\t3.28\t6.08\t38\t7.4723382\t1.9152\n4325415\t3.28\t6.36\t92\t42.082451\t27.617599\n4325416\t3.28\t6.4\t87\t42.028797\t27.992001\n4325419\t3.28\t6.52\t226\t95.450111\t54.820801\n4325420\t3.28\t6.56\t242\t105.59325\t67.059196\n4325421\t3.28\t6.6\t290\t149.43929\t120.7184\n4325422\t3.28\t6.64\t407\t289.14459\t310.24481\n4325423\t3.28\t6.68\t503\t400.80969\t451.27521\n4325424\t3.28\t6.72\t420\t307.24136\t335.78561\n4325425\t3.28\t6.76\t291\t152.99718\t127.0768\n4325426\t3.28\t6.8\t245\t109.38222\t73.422401\n4325427\t3.28\t6.84\t220\t92.002289\t53.076801\n4325429\t3.28\t6.92\t83\t22.786308\t7.4144001\n4325430\t3.28\t6.96\t83\t21.408356\t6.7424002\n4325431\t3.28\t7\t85\t21.686769\t7.1487999\n4325432\t3.28\t7.04\t90\t24.00281\t8.368\n4325433\t3.28\t7.08\t96\t28.436926\t11.4496\n4325434\t3.28\t7.12\t102\t33.125443\t14.4032\n4325435\t3.28\t7.16\t100\t33.578781\t14.5904\n4390915\t3.32\t4.92\t66\t14.990209\t5.2031999\n4390916\t3.32\t4.96\t73\t18.611401\t8.4736004\n4390917\t3.32\t5\t85\t25.633595\t13.5424\n4390918\t3.32\t5.04\t81\t20.973816\t9.2720003\n4390919\t3.32\t5.08\t71\t14.538219\t4.3151999\n4390920\t3.32\t5.12\t71\t15.570145\t4.6367998\n4390921\t3.32\t5.16\t215\t96.697273\t55.492802\n4390922\t3.32\t5.2\t209\t87.671967\t48.099201\n4390923\t3.32\t5.24\t209\t81.504868\t42.265598\n4390924\t3.32\t5.28\t230\t88.296219\t45.4384\n4390925\t3.32\t5.32\t240\t98.161697\t55.152\n4390926\t3.32\t5.36\t219\t87.66909\t47.380798\n4390927\t3.32\t5.4\t184\t73.970482\t42.9744\n4390928\t3.32\t5.44\t181\t77.149773\t45.563202\n4390939\t3.32\t5.88\t58\t14.61967\t5.0960002\n4390940\t3.32\t5.92\t115\t40.677982\t19.937599\n4390941\t3.32\t5.96\t318\t275.23666\t347.33441\n4390942\t3.32\t6\t305\t262.57748\t335.11041\n4390943\t3.32\t6.04\t82\t24.917185\t10.4352\n4390944\t3.32\t6.08\t73\t33.350075\t25.6304\n4390951\t3.32\t6.36\t87\t42.554436\t29.0832\n4390952\t3.32\t6.4\t86\t44.204044\t31.132799\n4390953\t3.32\t6.44\t9\t0.67803377\t0.056000002\n4390955\t3.32\t6.52\t226\t100.44596\t60.798401\n4390956\t3.32\t6.56\t239\t110.97665\t75.731201\n4390957\t3.32\t6.6\t275\t147.229\t126.8944\n4390958\t3.32\t6.64\t400\t285.42752\t308.70721\n4390959\t3.32\t6.68\t511\t403.04703\t446.608\n4390960\t3.32\t6.72\t412\t296.58502\t318.10559\n4390961\t3.32\t6.76\t282\t154.54916\t136.1696\n4390962\t3.32\t6.8\t237\t112.16035\t80.5504\n4390963\t3.32\t6.84\t221\t98.028473\t60.2048\n4456451\t3.36\t4.92\t69\t15.808177\t5.4559999\n4456452\t3.36\t4.96\t68\t13.359553\t4.0208001\n4456453\t3.36\t5\t86\t25.114708\t12.7104\n4456454\t3.36\t5.04\t87\t23.729494\t10.9536\n4456455\t3.36\t5.08\t72\t13.885287\t3.7423999\n4456456\t3.36\t5.12\t72\t15.037488\t4.1408\n4456457\t3.36\t5.16\t198\t89.29718\t50.431999\n4456458\t3.36\t5.2\t196\t84.911949\t47.492802\n4456459\t3.36\t5.24\t191\t78.324951\t42.464001\n4456460\t3.36\t5.28\t224\t89.980637\t48.547199\n4456461\t3.36\t5.32\t240\t102.23216\t58.2784\n4456462\t3.36\t5.36\t190\t77.044121\t42.475201\n4456463\t3.36\t5.4\t180\t77.433578\t46.313599\n4456464\t3.36\t5.44\t174\t77.778572\t47.454399\n4456475\t3.36\t5.88\t69\t18.826794\t7.1279998\n4456476\t3.36\t5.92\t98\t30.655605\t13.488\n4456477\t3.36\t5.96\t312\t273.68289\t350.03519\n4456478\t3.36\t6\t296\t259.03159\t337.02881\n4456479\t3.36\t6.04\t74\t19.497139\t7.2096\n4456480\t3.36\t6.08\t59\t17.626604\t7.888\n4456487\t3.36\t6.36\t86\t45.378212\t32.491199\n4456488\t3.36\t6.4\t82\t45.096119\t33.5536\n4456489\t3.36\t6.44\t12\t1.1826197\t0.16159999\n4456491\t3.36\t6.52\t219\t104.75481\t68.358398\n4456492\t3.36\t6.56\t235\t117.89436\t87.9776\n4456493\t3.36\t6.6\t260\t147.96555\t135.6864\n4456494\t3.36\t6.64\t386\t269.81708\t289.6528\n4456495\t3.36\t6.68\t521\t405.2955\t442.91199\n4456496\t3.36\t6.72\t402\t286.02222\t306.0864\n4456497\t3.36\t6.76\t269\t154.95058\t144.8736\n4456498\t3.36\t6.8\t236\t119.02737\t89.931198\n4456499\t3.36\t6.84\t216\t102.58612\t67.292801\n4521987\t3.4\t4.92\t65\t14.051261\t4.5344\n4521988\t3.4\t4.96\t71\t14.987683\t4.8319998\n4521989\t3.4\t5\t80\t19.29541\t7.8144002\n4521990\t3.4\t5.04\t91\t25.207209\t11.512\n4521991\t3.4\t5.08\t74\t14.03632\t3.5583999\n4521992\t3.4\t5.12\t71\t13.962708\t3.4400001\n4521993\t3.4\t5.16\t189\t88.361374\t50.763199\n4521994\t3.4\t5.2\t187\t85.483803\t49.832001\n4521995\t3.4\t5.24\t187\t82.760773\t47.348801\n4521996\t3.4\t5.28\t223\t93.70871\t52.366402\n4521997\t3.4\t5.32\t240\t107.04491\t63.015999\n4521998\t3.4\t5.36\t180\t80.270615\t47.3344\n4521999\t3.4\t5.4\t178\t83.948471\t54.700802\n4522000\t3.4\t5.44\t175\t83.726578\t52.9408\n4522011\t3.4\t5.88\t62\t17.826691\t7.2431998\n4522012\t3.4\t5.92\t79\t20.414181\t7.2607999\n4522013\t3.4\t5.96\t314\t273.72491\t353.00479\n4522014\t3.4\t6\t295\t263.09473\t347.19839\n4522015\t3.4\t6.04\t65\t17.114332\t6.5296001\n4522016\t3.4\t6.08\t57\t16.266886\t6.6528001\n4522023\t3.4\t6.36\t83\t46.978073\t35.073601\n4522024\t3.4\t6.4\t82\t48.138897\t37.248001\n4522025\t3.4\t6.44\t18\t3.034009\t0.70719999\n4522027\t3.4\t6.52\t215\t109.43261\t75.3936\n4522028\t3.4\t6.56\t226\t122.3838\t97.0784\n4522029\t3.4\t6.6\t255\t155.66858\t150.8848\n4522030\t3.4\t6.64\t364\t254.77324\t279.9664\n4522031\t3.4\t6.68\t532\t407.7717\t441.65121\n4522032\t3.4\t6.72\t383\t267.93436\t286.78079\n4522033\t3.4\t6.76\t257\t158.68805\t155.528\n4522034\t3.4\t6.8\t229\t126.30561\t102.7536\n4522035\t3.4\t6.84\t217\t111.39352\t77.7136\n4587523\t3.44\t4.92\t59\t11.272802\t2.8192\n4587524\t3.44\t4.96\t66\t13.404613\t4.0640001\n4587525\t3.44\t5\t73\t14.911999\t4.4400001\n4587526\t3.44\t5.04\t94\t25.628658\t10.8448\n4587527\t3.44\t5.08\t85\t19.23628\t6.2543998\n4587528\t3.44\t5.12\t70\t13.510636\t3.1503999\n4587532\t3.44\t5.28\t184\t87.265923\t53.387199\n4587533\t3.44\t5.32\t225\t107.50577\t65.248001\n4587547\t3.44\t5.88\t55\t16.347317\t6.7343998\n4587548\t3.44\t5.92\t61\t17.929689\t7.4432001\n4587549\t3.44\t5.96\t320\t274.43207\t356.784\n4587550\t3.44\t6\t305\t271.99124\t359.05759\n4587551\t3.44\t6.04\t59\t17.108496\t6.9679999\n4587552\t3.44\t6.08\t54\t16.288822\t6.8671999\n4587563\t3.44\t6.52\t214\t116.50597\t84.760002\n4587564\t3.44\t6.56\t227\t132.735\t111.3808\n4587565\t3.44\t6.6\t246\t162.22377\t163.20959\n4587566\t3.44\t6.64\t284\t209.13023\t251.856\n4587567\t3.44\t6.68\t541\t406.59702\t437.60159\n4587568\t3.44\t6.72\t296\t208.37917\t242.5984\n4587569\t3.44\t6.76\t249\t166.24361\t168.9968\n4587570\t3.44\t6.8\t230\t136.85611\t117.6336\n4587571\t3.44\t6.84\t216\t119.03523\t88.265602\n4653059\t3.48\t4.92\t53\t9.7860441\t2.1456001\n4653060\t3.48\t4.96\t55\t9.6227465\t2.1631999\n4653061\t3.48\t5\t65\t12.731128\t3.4576001\n4653062\t3.48\t5.04\t104\t29.844608\t12.288\n4653063\t3.48\t5.08\t107\t28.701813\t10.7264\n4653064\t3.48\t5.12\t67\t12.803747\t2.8943999\n4653068\t3.48\t5.28\t175\t87.678726\t57.439999\n4653069\t3.48\t5.32\t214\t105.90837\t66.776001\n4653083\t3.48\t5.88\t153\t91.236832\t75.337601\n4653084\t3.48\t5.92\t173\t111.46124\t98.939201\n4653085\t3.48\t5.96\t319\t273.52127\t361.29919\n4653086\t3.48\t6\t321\t279.25226\t368.31201\n4653087\t3.48\t6.04\t170\t106.83343\t92.526398\n4653088\t3.48\t6.08\t153\t93.950623\t81.172798\n4653099\t3.48\t6.52\t279\t184.00923\t156.0896\n4653100\t3.48\t6.56\t280\t182.20584\t155.1792\n4653101\t3.48\t6.6\t279\t178.2612\t150.56\n4653102\t3.48\t6.64\t279\t176.21028\t148.1264\n4653103\t3.48\t6.68\t546\t401.89478\t430.09439\n4653104\t3.48\t6.72\t279\t175.60222\t146.9856\n4653105\t3.48\t6.76\t281\t179.05898\t150.448\n4653106\t3.48\t6.8\t283\t183.84343\t155.7536\n4653107\t3.48\t6.84\t285\t189.1093\t160.8672\n4718595\t3.52\t4.92\t53\t11.153886\t2.7504001\n4718596\t3.52\t4.96\t53\t10.258481\t2.4047999\n4718597\t3.52\t5\t53\t9.7986956\t2.2320001\n4718598\t3.52\t5.04\t53\t9.7986956\t2.2320001\n4718599\t3.52\t5.08\t136\t36.515694\t12.8288\n4718600\t3.52\t5.12\t53\t11.153886\t2.7504001\n4718604\t3.52\t5.28\t197\t101.64323\t68.876801\n4718605\t3.52\t5.32\t228\t108.93305\t69.020798\n4718619\t3.52\t5.88\t154\t84.795479\t66.756798\n4718620\t3.52\t5.92\t185\t107.9444\t91.236801\n4718621\t3.52\t5.96\t315\t273.60031\t367.36639\n4718622\t3.52\t6\t320\t278.55991\t373.29761\n4718623\t3.52\t6.04\t176\t102.96487\t85.7584\n4718624\t3.52\t6.08\t150\t82.604904\t65.092796\n4718635\t3.52\t6.52\t279\t174.56334\t142.79359\n4718636\t3.52\t6.56\t281\t173.94872\t143.8768\n4718637\t3.52\t6.6\t285\t170.19998\t137.8992\n4718638\t3.52\t6.64\t350\t199.14301\t153.2128\n4718639\t3.52\t6.68\t529\t395.41711\t427.35999\n4718640\t3.52\t6.72\t365\t207.49899\t157.99519\n4718641\t3.52\t6.76\t286\t170.35776\t137.4144\n4718642\t3.52\t6.8\t284\t174.69962\t142.6832\n4718643\t3.52\t6.84\t284\t178.73549\t146.6992\n4784133\t3.56\t5\t113\t37.637146\t15.3488\n4784134\t3.56\t5.04\t115\t34.503574\t12.9872\n4784135\t3.56\t5.08\t154\t42.56052\t14.6336\n4784136\t3.56\t5.12\t132\t36.775688\t13.6352\n4784137\t3.56\t5.16\t152\t70.46386\t58.822399\n4784138\t3.56\t5.2\t167\t88.366745\t81.705597\n4784139\t3.56\t5.24\t183\t104.89032\t102.5216\n4784140\t3.56\t5.28\t234\t106.96112\t70.217598\n4784141\t3.56\t5.32\t233\t107.29855\t69.996803\n4784142\t3.56\t5.36\t114\t32.078686\t11.4752\n4784143\t3.56\t5.4\t114\t35.139694\t13.5712\n4784144\t3.56\t5.44\t111\t36.618893\t14.8096\n4784155\t3.56\t5.88\t154\t75.37542\t53.497601\n4784156\t3.56\t5.92\t191\t104.98361\t84.700798\n4784157\t3.56\t5.96\t315\t274.51901\t374.3056\n4784158\t3.56\t6\t322\t280.11679\t380.64001\n4784159\t3.56\t6.04\t181\t99.676407\t80.113602\n4784160\t3.56\t6.08\t151\t74.961555\t54.513599\n4784171\t3.56\t6.52\t283\t167.9126\t132.4944\n4784172\t3.56\t6.56\t286\t166.22685\t131.70399\n4784173\t3.56\t6.6\t297\t164.85274\t126.8512\n4784174\t3.56\t6.64\t368\t210.00127\t162.336\n4784175\t3.56\t6.68\t510\t386.5878\t425.73441\n4784176\t3.56\t6.72\t406\t261.6387\t241.1024\n4784177\t3.56\t6.76\t302\t167.18726\t127.6304\n4784178\t3.56\t6.8\t290\t169.08952\t133.6544\n4784179\t3.56\t6.84\t288\t171.28506\t134.8208\n4849669\t3.6\t5\t114\t35.091648\t13.5728\n4849670\t3.6\t5.04\t123\t34.921398\t12.784\n4849671\t3.6\t5.08\t144\t38.394089\t12.9232\n4849672\t3.6\t5.12\t143\t36.483582\t11.7696\n4849673\t3.6\t5.16\t158\t62.884594\t46.462399\n4849674\t3.6\t5.2\t171\t84.542656\t75.841599\n4849675\t3.6\t5.24\t186\t101.04\t96.783997\n4849676\t3.6\t5.28\t228\t104.20677\t71.198402\n4849677\t3.6\t5.32\t226\t105.26564\t72.255997\n4849678\t3.6\t5.36\t131\t36.904808\t13.7936\n4849679\t3.6\t5.4\t115\t32.951805\t12.2096\n4849680\t3.6\t5.44\t112\t34.515949\t13.2928\n4849691\t3.6\t5.88\t156\t68.553345\t43.372799\n4849692\t3.6\t5.92\t203\t107.34419\t82.113602\n4849693\t3.6\t5.96\t313\t273.23203\t379.952\n4849694\t3.6\t6\t325\t282.0802\t388.90881\n4849695\t3.6\t6.04\t186\t96.419052\t73.776001\n4849696\t3.6\t6.08\t146\t63.308136\t39.528\n4849707\t3.6\t6.52\t284\t159.94545\t121.0656\n4849708\t3.6\t6.56\t293\t160.14421\t120.928\n4849709\t3.6\t6.6\t307\t162.11749\t118.656\n4849710\t3.6\t6.64\t396\t245.95044\t220.4416\n4849711\t3.6\t6.68\t495\t376.45529\t422.52802\n4849712\t3.6\t6.72\t418\t283.85822\t285.47519\n4849713\t3.6\t6.76\t313\t164.95998\t119.7632\n4849714\t3.6\t6.8\t299\t163.69766\t123.0592\n4849715\t3.6\t6.84\t289\t162.56738\t121.9584\n4915205\t3.64\t5\t117\t34.660728\t12.9792\n4915206\t3.64\t5.04\t126\t34.173012\t11.968\n4915207\t3.64\t5.08\t142\t36.938423\t12.208\n4915208\t3.64\t5.12\t143\t35.345108\t11.1696\n4915209\t3.64\t5.16\t161\t57.077602\t36.708801\n4915210\t3.64\t5.2\t179\t82.745964\t70.935997\n4915211\t3.64\t5.24\t202\t105.2439\t95.414398\n4915212\t3.64\t5.28\t223\t102.25796\t72.734398\n4915213\t3.64\t5.32\t216\t100.42537\t71.982399\n4915214\t3.64\t5.36\t152\t48.425785\t21.9296\n4915215\t3.64\t5.4\t115\t30.590506\t10.6592\n4915216\t3.64\t5.44\t109\t31.153164\t11.192\n4915227\t3.64\t5.88\t151\t59.021183\t31.881599\n4915228\t3.64\t5.92\t210\t106.3511\t77.425598\n4915229\t3.64\t5.96\t315\t273.56274\t386.92319\n4915230\t3.64\t6\t324\t281.64362\t395.70239\n4915231\t3.64\t6.04\t195\t96.881264\t70.246399\n4915232\t3.64\t6.08\t146\t56.138435\t29.788799\n4915243\t3.64\t6.52\t289\t153.36447\t109.8448\n4915244\t3.64\t6.56\t298\t155.55373\t112.1152\n4915245\t3.64\t6.6\t319\t162.93791\t114.3536\n4915246\t3.64\t6.64\t408\t266.7323\t262.7648\n4915247\t3.64\t6.68\t481\t367.09738\t422.88321\n4915248\t3.64\t6.72\t428\t297.8053\t312.62561\n4915249\t3.64\t6.76\t323\t165.63701\t115.9424\n4915250\t3.64\t6.8\t304\t159.0667\t114.2512\n4915251\t3.64\t6.84\t296\t158.13094\t113.5072\n4980741\t3.68\t5\t115\t31.84926\t11.024\n4980742\t3.68\t5.04\t131\t35.147251\t11.9856\n4980743\t3.68\t5.08\t141\t36.435745\t12.0448\n4980744\t3.68\t5.12\t142\t34.554558\t10.8448\n4980745\t3.68\t5.16\t160\t51.591976\t29.384001\n4980746\t3.68\t5.2\t183\t81.420792\t67.038399\n4980747\t3.68\t5.24\t219\t109.21953\t93.384003\n4980748\t3.68\t5.28\t221\t101.8166\t75.070396\n4980749\t3.68\t5.32\t215\t101.41496\t75.440002\n4980750\t3.68\t5.36\t165\t57.301041\t29.283199\n4980751\t3.68\t5.4\t116\t29.788738\t10\n4980752\t3.68\t5.44\t108\t29.181211\t9.8319998\n4980763\t3.68\t5.88\t147\t53.296783\t26.1712\n4980764\t3.68\t5.92\t221\t108.55283\t75.374397\n4980765\t3.68\t5.96\t322\t276.4371\t395.84161\n4980766\t3.68\t6\t332\t285.353\t405.4592\n4980767\t3.68\t6.04\t206\t98.509697\t67.695999\n4980768\t3.68\t6.08\t141\t49.791374\t23.7904\n4980779\t3.68\t6.52\t290\t147.28296\t100.8576\n4980780\t3.68\t6.56\t304\t151.8914\t104.3744\n4980781\t3.68\t6.6\t329\t165.65765\t114.112\n4980782\t3.68\t6.64\t411\t275.94928\t288.4592\n4980783\t3.68\t6.68\t469\t357.26855\t422.10239\n4980784\t3.68\t6.72\t432\t311.68463\t352.74081\n4980785\t3.68\t6.76\t332\t167.49342\t114.6304\n4980786\t3.68\t6.8\t310\t155.25868\t106.3856\n4980787\t3.68\t6.84\t302\t154.88715\t106.1232\n5046277\t3.72\t5\t118\t33.841423\t12.3792\n5046278\t3.72\t5.04\t129\t34.548061\t11.728\n5046279\t3.72\t5.08\t140\t36.499531\t12.1664\n5046280\t3.72\t5.12\t141\t34.567535\t11.0064\n5046281\t3.72\t5.16\t155\t41.453159\t15.7424\n5046282\t3.72\t5.2\t198\t87.227699\t67.772797\n5046283\t3.72\t5.24\t230\t114.69283\t94.8144\n5046284\t3.72\t5.28\t219\t102.88044\t78.811203\n5046285\t3.72\t5.32\t214\t102.34213\t78.692802\n5046286\t3.72\t5.36\t164\t59.806667\t33.16\n5046287\t3.72\t5.4\t120\t32.692966\t12.0528\n5046288\t3.72\t5.44\t107\t28.217854\t9.1264\n5046299\t3.72\t5.88\t135\t43.395359\t18.096001\n5046300\t3.72\t5.92\t231\t110.6135\t74.047997\n5046301\t3.72\t5.96\t331\t280.10056\t405.60321\n5046302\t3.72\t6\t344\t290.0437\t414.82239\n5046303\t3.72\t6.04\t214\t99.142281\t64.971199\n5046304\t3.72\t6.08\t128\t39.405678\t15.5552\n5046315\t3.72\t6.52\t295\t144.21135\t94.32\n5046316\t3.72\t6.56\t309\t149.26927\t98.400002\n5046317\t3.72\t6.6\t335\t166.22925\t112.6432\n5046318\t3.72\t6.64\t414\t280.33197\t301.01599\n5046319\t3.72\t6.68\t463\t351.0303\t421.0896\n5046320\t3.72\t6.72\t436\t323.82007\t392.28961\n5046321\t3.72\t6.76\t339\t168.24883\t113.0608\n5046322\t3.72\t6.8\t318\t155.04358\t102.1008\n5046323\t3.72\t6.84\t305\t150.08501\t97.8256\n5111813\t3.76\t5\t121\t37.404617\t15.0848\n5111814\t3.76\t5.04\t132\t38.353199\t14.464\n5111815\t3.76\t5.08\t136\t36.413818\t12.5728\n5111816\t3.76\t5.12\t146\t37.00024\t12.0064\n5111817\t3.76\t5.16\t153\t39.571491\t13.8912\n5111818\t3.76\t5.2\t209\t92.075829\t69.183998\n5111819\t3.76\t5.24\t244\t121.80574\t97.644798\n5111820\t3.76\t5.28\t220\t105.93861\t83.608002\n5111821\t3.76\t5.32\t207\t103.07091\t82.9552\n5111822\t3.76\t5.36\t160\t61.18861\t36.084801\n5111823\t3.76\t5.4\t124\t36.65136\t15.1152\n5111824\t3.76\t5.44\t107\t29.307137\t9.8752003\n5111835\t3.76\t5.88\t122\t37.137108\t14.6672\n5111836\t3.76\t5.92\t240\t112.77154\t74.070396\n5111837\t3.76\t5.96\t347\t286.68719\t417.47198\n5111838\t3.76\t6\t358\t296.58817\t427.6416\n5111839\t3.76\t6.04\t224\t100.75686\t63.495998\n5111840\t3.76\t6.08\t114\t33.854713\t12.7936\n5111851\t3.76\t6.52\t299\t141.98611\t89.512001\n5111852\t3.76\t6.56\t314\t147.59059\t93.528\n5111853\t3.76\t6.6\t337\t164.26064\t109.52\n5111854\t3.76\t6.64\t417\t286.9361\t320.12799\n5111855\t3.76\t6.68\t453\t343.44788\t423.0816\n5111856\t3.76\t6.72\t432\t319.89462\t395.4624\n5111857\t3.76\t6.76\t344\t168.46283\t112.0896\n5111858\t3.76\t6.8\t323\t154.02339\t98.537598\n5111859\t3.76\t6.84\t313\t149.66727\t93.575996\n5177349\t3.8\t5\t109\t31.196402\t10.6544\n5177350\t3.8\t5.04\t126\t37.119129\t13.9024\n5177351\t3.8\t5.08\t139\t41.659462\t16.3696\n5177352\t3.8\t5.12\t141\t37.751297\t13.0432\n5177353\t3.8\t5.16\t155\t40.686817\t14.4128\n5177354\t3.8\t5.2\t224\t98.344856\t70.321602\n5177355\t3.8\t5.24\t253\t126.09697\t98.214401\n5177356\t3.8\t5.28\t217\t107.69743\t87.603203\n5177357\t3.8\t5.32\t197\t102.33067\t86.049599\n5177358\t3.8\t5.36\t161\t66.170029\t41.585602\n5177359\t3.8\t5.4\t128\t42.895687\t20.6224\n5177360\t3.8\t5.44\t111\t34.124973\t13.4512\n5177371\t3.8\t5.88\t74\t21.538057\t8.9119997\n5177372\t3.8\t5.92\t256\t119.12682\t78.294403\n5177373\t3.8\t5.96\t364\t292.68958\t429.51041\n5177374\t3.8\t6\t377\t304.03152\t440.52481\n5177375\t3.8\t6.04\t238\t102.69073\t61.422401\n5177376\t3.8\t6.08\t68\t17.727894\t6.0960002\n5177387\t3.8\t6.52\t303\t140.48882\t85.760002\n5177388\t3.8\t6.56\t319\t148.98289\t93.767998\n5177389\t3.8\t6.6\t338\t163.131\t108.5744\n5177390\t3.8\t6.64\t422\t296.21005\t346.5376\n5177391\t3.8\t6.68\t449\t339.70905\t427.8208\n5177392\t3.8\t6.72\t431\t318.48309\t402.37759\n5177393\t3.8\t6.76\t349\t169.20963\t111.9536\n5177394\t3.8\t6.8\t334\t157.92419\t99.395203\n5177395\t3.8\t6.84\t318\t148.97647\t90.487999\n5242885\t3.84\t5\t108\t33.18716\t12.0224\n5242886\t3.84\t5.04\t113\t33.364342\t12.0176\n5242887\t3.84\t5.08\t117\t33.362137\t11.9808\n5242888\t3.84\t5.12\t132\t37.969395\t14.1136\n5242889\t3.84\t5.16\t169\t51.739338\t21.5168\n5242890\t3.84\t5.2\t249\t107.68726\t73.529602\n5242891\t3.84\t5.24\t266\t132.55066\t100.816\n5242892\t3.84\t5.28\t203\t108.31637\t92.385597\n5242893\t3.84\t5.32\t190\t104.76852\t91.313599\n5242894\t3.84\t5.36\t158\t70.562195\t47.4272\n5242895\t3.84\t5.4\t130\t49.633965\t27.2768\n5242896\t3.84\t5.44\t110\t36.539612\t15.456\n5242906\t3.84\t5.84\t175\t73.942566\t41.2528\n5242907\t3.84\t5.88\t192\t83.670395\t49.5536\n5242908\t3.84\t5.92\t287\t129.009\t84.5728\n5242909\t3.84\t5.96\t377\t297.99008\t442.24799\n5242910\t3.84\t6\t388\t308.68948\t453.31839\n5242911\t3.84\t6.04\t268\t108.88148\t61.371201\n5242912\t3.84\t6.08\t187\t81.851807\t48.812801\n5242923\t3.84\t6.52\t308\t140.70105\t83.739197\n5242924\t3.84\t6.56\t324\t149.95047\t93.710403\n5242925\t3.84\t6.6\t343\t163.86635\t108.5312\n5242926\t3.84\t6.64\t424\t307.28412\t383.55521\n5242927\t3.84\t6.68\t451\t341.42999\t438.616\n5242928\t3.84\t6.72\t430\t313.43472\t399.44159\n5242929\t3.84\t6.76\t354\t170.25734\t112.2816\n5242930\t3.84\t6.8\t339\t158.73792\t99.094398\n5242931\t3.84\t6.84\t323\t149.0965\t88.708801\n5308426\t3.88\t5.2\t293\t123.93092\t79.9552\n5308427\t3.88\t5.24\t278\t137.9413\t102.7584\n5308441\t3.88\t5.8\t171\t69.020195\t35.774399\n5308442\t3.88\t5.84\t194\t78.37896\t43.075199\n5308443\t3.88\t5.88\t221\t87.895699\t48.6544\n5308444\t3.88\t5.92\t301\t137.89575\t94.939201\n5308445\t3.88\t5.96\t389\t304.30341\t456.36801\n5308446\t3.88\t6\t396\t312.4252\t464.72159\n5308447\t3.88\t6.04\t272\t107.62782\t58.720001\n5308448\t3.88\t6.08\t222\t90.24276\t51.558399\n5308449\t3.88\t6.12\t195\t84.316086\t49.7248\n5308450\t3.88\t6.16\t172\t73.635239\t41.383999\n5308459\t3.88\t6.52\t309\t139.67505\t82.152\n5308460\t3.88\t6.56\t325\t148.6674\t92.311996\n5308461\t3.88\t6.6\t345\t163.41258\t108.1808\n5308462\t3.88\t6.64\t429\t317.90216\t420.3056\n5308463\t3.88\t6.68\t454\t342.99234\t449.16479\n5308464\t3.88\t6.72\t429\t310.61417\t402.83679\n5308465\t3.88\t6.76\t358\t171.02823\t112.8048\n5308466\t3.88\t6.8\t347\t162.11028\t101.0112\n5308467\t3.88\t6.84\t334\t155.43756\t92.924797\n5373957\t3.92\t5\t150\t73.670654\t50.235199\n5373958\t3.92\t5.04\t149\t65.661499\t40.649601\n5373959\t3.92\t5.08\t153\t62.911175\t36.849602\n5373960\t3.92\t5.12\t159\t60.251488\t32.660801\n5373961\t3.92\t5.16\t210\t88.878517\t56.787201\n5373962\t3.92\t5.2\t286\t132.76213\t90.401604\n5373963\t3.92\t5.24\t265\t122.39809\t84.777603\n5373964\t3.92\t5.28\t150\t44.697933\t19.510401\n5373965\t3.92\t5.32\t127\t34.569172\t11.9024\n5373966\t3.92\t5.36\t119\t33.554199\t12.1136\n5373967\t3.92\t5.4\t108\t31.571213\t11.8128\n5373968\t3.92\t5.44\t99\t31.342567\t12.2672\n5373969\t3.92\t5.48\t107\t43.202358\t23.304001\n5373970\t3.92\t5.52\t110\t39.581543\t19.408001\n5373971\t3.92\t5.56\t120\t40.167877\t17.763201\n5373972\t3.92\t5.6\t124\t40.048847\t16.768\n5373973\t3.92\t5.64\t122\t38.610867\t15.7536\n5373974\t3.92\t5.68\t116\t37.749878\t16.0224\n5373975\t3.92\t5.72\t88\t29.603874\t13.4864\n5373977\t3.92\t5.8\t192\t78.458076\t43.134399\n5373978\t3.92\t5.84\t215\t84.097046\t45.220798\n5373979\t3.92\t5.88\t260\t103.63313\t57.129601\n5373980\t3.92\t5.92\t332\t159.71315\t117.008\n5373981\t3.92\t5.96\t419\t324.58228\t481.96161\n5373982\t3.92\t6\t430\t335.95377\t493.11359\n5373983\t3.92\t6.04\t302\t127.30866\t74.436798\n5373984\t3.92\t6.08\t261\t109.38262\t64.6912\n5373985\t3.92\t6.12\t223\t95.992752\t58.588799\n5373986\t3.92\t6.16\t192\t86.876244\t54.348801\n5373988\t3.92\t6.24\t103\t34.957153\t15.456\n5373989\t3.92\t6.28\t124\t41.605167\t17.787201\n5373990\t3.92\t6.32\t131\t44.179832\t18.812799\n5373991\t3.92\t6.36\t139\t49.607708\t22.2432\n5373992\t3.92\t6.4\t131\t51.785755\t26.467199\n5373993\t3.92\t6.44\t106\t42.808647\t23.443199\n5373995\t3.92\t6.52\t316\t143.47762\t85.1856\n5373996\t3.92\t6.56\t332\t151.53909\t95.012802\n5373997\t3.92\t6.6\t353\t165.08064\t109.2576\n5373998\t3.92\t6.64\t434\t320.62326\t434.1264\n5373999\t3.92\t6.68\t457\t344.6965\t459.79999\n5374000\t3.92\t6.72\t437\t316.72379\t416.3504\n5374001\t3.92\t6.76\t374\t182.48108\t122.9776\n5374002\t3.92\t6.8\t364\t175.40744\t113.352\n5374003\t3.92\t6.84\t355\t170.86453\t105.9072\n5439493\t3.96\t5\t185\t117.08573\t112.1152\n5439494\t3.96\t5.04\t191\t112.57703\t102.7488\n5439495\t3.96\t5.08\t197\t105.93747\t90.097603\n5439496\t3.96\t5.12\t204\t97.703293\t74.008003\n5439497\t3.96\t5.16\t261\t130.72487\t96.532799\n5439498\t3.96\t5.2\t297\t152.69493\t113.3136\n5439499\t3.96\t5.24\t273\t128.67374\t88.870399\n5439500\t3.96\t5.28\t198\t70.046379\t34.835201\n5439501\t3.96\t5.32\t170\t53.941669\t23.452801\n5439502\t3.96\t5.36\t145\t42.912868\t17.004801\n5439503\t3.96\t5.4\t122\t32.501381\t11.088\n5439504\t3.96\t5.44\t102\t29.026098\t10.304\n5439505\t3.96\t5.48\t153\t85.296722\t67.243202\n5439506\t3.96\t5.52\t175\t86.432487\t62.627201\n5439507\t3.96\t5.56\t191\t89.74118\t61.571201\n5439508\t3.96\t5.6\t194\t84.298515\t51.915199\n5439509\t3.96\t5.64\t190\t76.86618\t42.6096\n5439510\t3.96\t5.68\t171\t60.687313\t27.739201\n5439511\t3.96\t5.72\t141\t48.196354\t21.4816\n5439513\t3.96\t5.8\t225\t89.903557\t49.743999\n5439514\t3.96\t5.84\t278\t115.30897\t64.2976\n5439515\t3.96\t5.88\t332\t145.04651\t84.304001\n5439516\t3.96\t5.92\t400\t208.79576\t161.0544\n5439517\t3.96\t5.96\t483\t370.88358\t528.08801\n5439518\t3.96\t6\t490\t379.14676\t537.09277\n5439519\t3.96\t6.04\t363\t165.97176\t102.08\n5439520\t3.96\t6.08\t325\t145.84183\t89.228798\n5439521\t3.96\t6.12\t277\t120.31478\t72.9552\n5439522\t3.96\t6.16\t220\t97.325882\t61.363201\n5439524\t3.96\t6.24\t148\t48.530956\t20.2048\n5439525\t3.96\t6.28\t174\t65.999504\t33.8288\n5439526\t3.96\t6.32\t197\t88.172066\t56.905602\n5439527\t3.96\t6.36\t200\t96.457352\t67.919998\n5439528\t3.96\t6.4\t208\t108.07849\t81.5168\n5439529\t3.96\t6.44\t202\t115.37553\t91.830399\n5439531\t3.96\t6.52\t321\t143.32928\t84.496002\n5439532\t3.96\t6.56\t347\t156.30609\t98.302399\n5439533\t3.96\t6.6\t375\t176.51581\t117.7232\n5439534\t3.96\t6.64\t459\t337.15005\t455.4592\n5439535\t3.96\t6.68\t486\t366.6636\t487.15201\n5439536\t3.96\t6.72\t466\t340.78439\t444.74881\n5439537\t3.96\t6.76\t408\t211.69891\t151.90559\n5439538\t3.96\t6.8\t399\t210.28708\t152.4064\n5439539\t3.96\t6.84\t393\t212.45503\t156.064\n5505029\t4\t5\t221\t165.45439\t185.3392\n5505030\t4\t5.04\t229\t161.80005\t175.1456\n5505031\t4\t5.08\t241\t160.19992\t166.4976\n5505032\t4\t5.12\t258\t161.24843\t159.7424\n5505033\t4\t5.16\t310\t194.51041\t183.4832\n5505034\t4\t5.2\t344\t221.51744\t207.45441\n5505035\t4\t5.24\t341\t205.2357\t181.5984\n5505036\t4\t5.28\t286\t158.2099\t134.3568\n5505037\t4\t5.32\t265\t142.50206\t118.7968\n5505038\t4\t5.36\t258\t136.15849\t110.08\n5505039\t4\t5.4\t249\t129.25566\t101.6464\n5505040\t4\t5.44\t249\t125.07973\t94.492798\n5505041\t4\t5.48\t250\t121.78426\t88.390404\n5505042\t4\t5.52\t238\t115.8061\t82.091202\n5505043\t4\t5.56\t237\t113.90524\t78.416\n5505044\t4\t5.6\t236\t110.88589\t73.686401\n5505045\t4\t5.64\t242\t111.31292\t71.192001\n5505046\t4\t5.68\t249\t111.78013\t68.705597\n5505047\t4\t5.72\t260\t112.25354\t66.116798\n5505048\t4\t5.76\t282\t117.07362\t65.849602\n5505049\t4\t5.8\t293\t121.7231\t67.7808\n5505050\t4\t5.84\t310\t127.08616\t69.265602\n5505051\t4\t5.88\t363\t161.99287\t95.816002\n5505052\t4\t5.92\t414\t220.96396\t179.81599\n5505053\t4\t5.96\t490\t377.1395\t544.74561\n5505054\t4\t6\t498\t385.00595\t552.94562\n5505055\t4\t6.04\t379\t176.48697\t112.7952\n5505056\t4\t6.08\t354\t160.30405\t98.262398\n5505057\t4\t6.12\t305\t128.18185\t74.446404\n5505058\t4\t6.16\t289\t123.01432\t74.047997\n5505059\t4\t6.2\t272\t119.01837\t74.419197\n5505060\t4\t6.24\t248\t115.15382\t76.793602\n5505061\t4\t6.28\t239\t114.16952\t79.110397\n5505062\t4\t6.32\t228\t113.31559\t82.870399\n5505063\t4\t6.36\t227\t115.73747\t87.203201\n5505064\t4\t6.4\t233\t120.86758\t93.515198\n5505065\t4\t6.44\t255\t133.23369\t102.8464\n5505066\t4\t6.48\t334\t178.95193\t136.328\n5505067\t4\t6.52\t474\t257.5593\t195.4064\n5505068\t4\t6.56\t480\t269.66663\t215.0192\n5505069\t4\t6.6\t487\t282.43597\t234.9408\n5505070\t4\t6.64\t553\t437.64215\t581.55841\n5505071\t4\t6.68\t569\t463.68814\t617.95679\n5505072\t4\t6.72\t540\t431.9949\t570.9552\n5505073\t4\t6.76\t475\t297.66382\t270.85919\n5505074\t4\t6.8\t462\t292.99069\t269.37921\n5505075\t4\t6.84\t449\t288.84985\t267.944\n5570565\t4.04\t5\t226\t169.46622\t189.64481\n5570566\t4.04\t5.04\t236\t166.9639\t180.0096\n5570567\t4.04\t5.08\t248\t165.63522\t171.216\n5570568\t4.04\t5.12\t265\t165.21123\t162.3744\n5570569\t4.04\t5.16\t307\t191.85428\t181.63361\n5570570\t4.04\t5.2\t347\t225.13086\t212.25281\n5570571\t4.04\t5.24\t338\t202.77597\t178.88\n5570572\t4.04\t5.28\t289\t160.00456\t136.23039\n5570573\t4.04\t5.32\t272\t146.90936\t122.2992\n5570574\t4.04\t5.36\t261\t137.57834\t111.4464\n5570575\t4.04\t5.4\t258\t132.72009\t104.0336\n5570576\t4.04\t5.44\t257\t128.58575\t97.300797\n5570577\t4.04\t5.48\t257\t125.27472\t91.257599\n5570578\t4.04\t5.52\t254\t123.02786\t86.451202\n5570579\t4.04\t5.56\t249\t119.0877\t81.137604\n5570580\t4.04\t5.6\t247\t116.26254\t76.776001\n5570581\t4.04\t5.64\t253\t115.63113\t73.295998\n5570582\t4.04\t5.68\t261\t115.89314\t70.547203\n5570583\t4.04\t5.72\t279\t119.4416\t69.321602\n5570584\t4.04\t5.76\t288\t119.10681\t66.964798\n5570585\t4.04\t5.8\t297\t121.75052\t67.318398\n5570586\t4.04\t5.84\t312\t126.3956\t68.300797\n5570587\t4.04\t5.88\t364\t163.61322\t97.9776\n5570588\t4.04\t5.92\t420\t230.38477\t199.79201\n5570589\t4.04\t5.96\t494\t382.50961\t561.52319\n5570590\t4.04\t6\t501\t389.88315\t569.4624\n5570591\t4.04\t6.04\t387\t181.46663\t118.744\n5570592\t4.04\t6.08\t361\t164.21957\t101.552\n5570593\t4.04\t6.12\t306\t126.65654\t72.761597\n5570594\t4.04\t6.16\t289\t121.38583\t72.585602\n5570595\t4.04\t6.2\t274\t118.78155\t73.915199\n5570596\t4.04\t6.24\t268\t120.91976\t78.590401\n5570597\t4.04\t6.28\t238\t113.24891\t78.68\n5570598\t4.04\t6.32\t235\t116.26037\t84.414398\n5570599\t4.04\t6.36\t232\t117.85336\t88.519997\n5570600\t4.04\t6.4\t239\t123.75728\t95.662399\n5570601\t4.04\t6.44\t261\t133.78737\t102.9392\n5570602\t4.04\t6.48\t366\t185.87395\t136.06081\n5570603\t4.04\t6.52\t481\t262.01947\t200.776\n5570604\t4.04\t6.56\t487\t275.28873\t221.8736\n5570605\t4.04\t6.6\t489\t284.27887\t238.4016\n5570606\t4.04\t6.64\t556\t443.81863\t599.19202\n5570607\t4.04\t6.68\t566\t463.72784\t628.71039\n5570608\t4.04\t6.72\t539\t434.52194\t584.21118\n5570609\t4.04\t6.76\t480\t305.80246\t285.72321\n5570610\t4.04\t6.8\t466\t297.93945\t276.21759\n5570611\t4.04\t6.84\t456\t296.29083\t276.64319\n5636101\t4.08\t5\t226\t169.37532\t188.7856\n5636102\t4.08\t5.04\t232\t165.11362\t178.62399\n5636103\t4.08\t5.08\t246\t164.02502\t169.67039\n5636104\t4.08\t5.12\t276\t178.13734\t175.78239\n5636105\t4.08\t5.16\t303\t188.34338\t179.05119\n5636106\t4.08\t5.2\t351\t226.74525\t212.9216\n5636107\t4.08\t5.24\t332\t196.33717\t172.01601\n5636108\t4.08\t5.28\t285\t157.63307\t135.1344\n5636109\t4.08\t5.32\t275\t151.81807\t127.736\n5636110\t4.08\t5.36\t249\t132.66187\t109.5984\n5636111\t4.08\t5.4\t245\t129.65561\t104.7456\n5636112\t4.08\t5.44\t242\t125.59612\t97.798401\n5636113\t4.08\t5.48\t234\t120.2196\t91.334396\n5636114\t4.08\t5.52\t234\t117.21037\t85.7696\n5636115\t4.08\t5.56\t236\t115.60161\t81.905602\n5636116\t4.08\t5.6\t241\t115.46832\t78.487999\n5636117\t4.08\t5.64\t248\t115.23258\t74.896004\n5636118\t4.08\t5.68\t253\t114.50205\t71.499199\n5636119\t4.08\t5.72\t268\t118.02531\t71.225601\n5636120\t4.08\t5.76\t290\t123.14875\t71.047997\n5636121\t4.08\t5.8\t300\t127.12801\t71.982399\n5636122\t4.08\t5.84\t315\t132.60551\t74.024002\n5636123\t4.08\t5.88\t368\t169.48622\t103.9744\n5636124\t4.08\t5.92\t430\t246.19586\t227.9024\n5636125\t4.08\t5.96\t497\t391.44199\t583.22717\n5636126\t4.08\t6\t505\t399.48822\t591.59839\n5636127\t4.08\t6.04\t391\t188.57324\t126.8368\n5636128\t4.08\t6.08\t362\t168.52315\t106.2112\n5636129\t4.08\t6.12\t310\t132.42831\t77.928001\n5636130\t4.08\t6.16\t294\t127.83385\t78.015999\n5636131\t4.08\t6.2\t284\t127.00666\t80.620796\n5636132\t4.08\t6.24\t257\t121.75768\t82.401604\n5636133\t4.08\t6.28\t251\t122.72186\t86.468803\n5636134\t4.08\t6.32\t237\t120.19675\t89.199997\n5636135\t4.08\t6.36\t238\t124.23988\t95.675201\n5636136\t4.08\t6.4\t240\t128.13878\t101.4288\n5636137\t4.08\t6.44\t265\t143.87019\t114.632\n5636138\t4.08\t6.48\t316\t190.69547\t159.2608\n5636139\t4.08\t6.52\t474\t266.84833\t213.024\n5636140\t4.08\t6.56\t478\t275.44342\t229.0224\n5636141\t4.08\t6.6\t490\t294.9534\t262.9584\n5636142\t4.08\t6.64\t552\t445.46164\t613.39362\n5636143\t4.08\t6.68\t568\t472.28613\t653.48322\n5636144\t4.08\t6.72\t539\t438.18146\t598.27838\n5636145\t4.08\t6.76\t484\t318.10138\t313.42401\n5636146\t4.08\t6.8\t469\t304.20184\t288.2496\n5636147\t4.08\t6.84\t458\t301.13504\t286.3248\n5701637\t4.12\t5\t161\t88.065269\t72.468803\n5701638\t4.12\t5.04\t161\t78.387856\t56.952\n5701639\t4.12\t5.08\t168\t74.913773\t50.8592\n5701640\t4.12\t5.12\t198\t90.744408\t62.915199\n5701641\t4.12\t5.16\t223\t100.22327\t69.463997\n5701642\t4.12\t5.2\t268\t132.9408\t98.529602\n5701643\t4.12\t5.24\t248\t104.4622\t63.3312\n5701644\t4.12\t5.28\t182\t63.699406\t32.075199\n5701645\t4.12\t5.32\t155\t50.391361\t23.8752\n5701646\t4.12\t5.36\t131\t37.566898\t14.8752\n5701647\t4.12\t5.4\t117\t32.165054\t11.4128\n5701648\t4.12\t5.44\t101\t29.515745\t10.8608\n5701649\t4.12\t5.48\t153\t86.781372\t69.915199\n5701650\t4.12\t5.52\t165\t84.91188\t64.820801\n5701651\t4.12\t5.56\t176\t81.621719\t55.708801\n5701652\t4.12\t5.6\t181\t78.428665\t49.2048\n5701653\t4.12\t5.64\t180\t71.164207\t38.683201\n5701654\t4.12\t5.68\t166\t58.658363\t26.739201\n5701655\t4.12\t5.72\t137\t46.550293\t20.6896\n5701657\t4.12\t5.8\t217\t85.843216\t46.577599\n5701658\t4.12\t5.84\t267\t108.36539\t58.913601\n5701659\t4.12\t5.88\t331\t149.47006\t91.849602\n5701660\t4.12\t5.92\t413\t245.20995\t247.14079\n5701661\t4.12\t5.96\t477\t385.18423\t594.39362\n5701662\t4.12\t6\t486\t393.4194\t602.39838\n5701663\t4.12\t6.04\t369\t178.6145\t122.5456\n5701664\t4.12\t6.08\t321\t145.57776\t90.811203\n5701665\t4.12\t6.12\t265\t113.95901\t68.608002\n5701666\t4.12\t6.16\t215\t95.404579\t60.5504\n5701668\t4.12\t6.24\t145\t47.128368\t19.340799\n5701669\t4.12\t6.28\t166\t59.400635\t27.2512\n5701670\t4.12\t6.32\t188\t81.995392\t50.894402\n5701671\t4.12\t6.36\t195\t95.115013\t67.412804\n5701672\t4.12\t6.4\t201\t104.11246\t77.019203\n5701673\t4.12\t6.44\t185\t109.25976\t90.844803\n5701675\t4.12\t6.52\t326\t156.40135\t105.1872\n5701676\t4.12\t6.56\t346\t165.61223\t116.392\n5701677\t4.12\t6.6\t361\t182.82162\t149.2128\n5701678\t4.12\t6.64\t434\t333.6077\t495.93921\n5701679\t4.12\t6.68\t461\t363.35349\t533.12\n5701680\t4.12\t6.72\t439\t329.82837\t471.3728\n5701681\t4.12\t6.76\t393\t215.23076\t186.55521\n5701682\t4.12\t6.8\t381\t196.49121\t142.37759\n5701683\t4.12\t6.84\t374\t196.57542\t141.5248\n5767173\t4.16\t5\t142\t65.945488\t41.7584\n5767174\t4.16\t5.04\t144\t62.031853\t37.236801\n5767175\t4.16\t5.08\t145\t57.827065\t32.579201\n5767176\t4.16\t5.12\t162\t71.846611\t47.998402\n5767177\t4.16\t5.16\t195\t83.580711\t57.030399\n5767178\t4.16\t5.2\t253\t111.21772\t74.756798\n5767179\t4.16\t5.24\t228\t87.13903\t47.9408\n5767180\t4.16\t5.28\t145\t47.597496\t22.766399\n5767181\t4.16\t5.32\t136\t45.349697\t21.9632\n5767182\t4.16\t5.36\t129\t44.938625\t22.952\n5767183\t4.16\t5.4\t108\t32.534645\t12.616\n5767184\t4.16\t5.44\t101\t32.726177\t13.1536\n5767185\t4.16\t5.48\t108\t44.398624\t24.448\n5767186\t4.16\t5.52\t111\t40.359379\t19.8144\n5767187\t4.16\t5.56\t110\t35.026638\t14.7344\n5767188\t4.16\t5.6\t120\t39.162704\t16.7904\n5767189\t4.16\t5.64\t121\t39.326359\t16.743999\n5767190\t4.16\t5.68\t112\t36.203457\t15.4176\n5767191\t4.16\t5.72\t83\t26.558512\t11.5936\n5767193\t4.16\t5.8\t191\t79.883835\t44.459202\n5767194\t4.16\t5.84\t212\t84.571281\t45.6096\n5767195\t4.16\t5.88\t265\t113.1783\t69.467201\n5767196\t4.16\t5.92\t359\t219.05226\t250.504\n5767197\t4.16\t5.96\t422\t352.45587\t584.64478\n5767198\t4.16\t6\t429\t360.37619\t592.86877\n5767199\t4.16\t6.04\t318\t147.02336\t101.2272\n5767200\t4.16\t6.08\t258\t110.61761\t67.167999\n5767201\t4.16\t6.12\t218\t92.674591\t54.8368\n5767202\t4.16\t6.16\t195\t90.388054\t57.240002\n5767204\t4.16\t6.24\t101\t34.777298\t15.688\n5767205\t4.16\t6.28\t123\t42.524769\t18.799999\n5767206\t4.16\t6.32\t131\t45.948868\t20.489599\n5767207\t4.16\t6.36\t139\t50.996998\t23.604799\n5767208\t4.16\t6.4\t132\t52.454231\t26.9216\n5767209\t4.16\t6.44\t102\t40.242054\t21.136\n5767211\t4.16\t6.52\t326\t161.78127\t114.1424\n5767212\t4.16\t6.56\t336\t165.1707\t120.3552\n5767213\t4.16\t6.6\t357\t190.96338\t171.1888\n5767214\t4.16\t6.64\t418\t328.46304\t502.57599\n5767215\t4.16\t6.68\t440\t356.59857\t544.34241\n5767216\t4.16\t6.72\t414\t315.03564\t467.952\n5767217\t4.16\t6.76\t374\t209.02258\t196.9088\n5767218\t4.16\t6.8\t361\t182.35919\t132.2896\n5767219\t4.16\t6.84\t360\t185.48325\t132.0784\n5832714\t4.2\t5.2\t267\t111.08842\t71.167999\n5832715\t4.2\t5.24\t197\t76.277283\t41.7248\n5832730\t4.2\t5.84\t184\t74.762497\t39.4384\n5832731\t4.2\t5.88\t221\t96.870323\t62.327999\n5832732\t4.2\t5.92\t335\t215.7368\t274.74719\n5832733\t4.2\t5.96\t389\t339.23871\t591.96161\n5832734\t4.2\t6\t394\t344.5383\t597.44958\n5832735\t4.2\t6.04\t290\t130.81938\t91.118401\n5832736\t4.2\t6.08\t213\t89.157845\t52.748798\n5832737\t4.2\t6.12\t190\t82.602676\t47.857601\n5832747\t4.2\t6.52\t326\t165.80527\t120.8592\n5832748\t4.2\t6.56\t337\t170.68326\t128.5808\n5832749\t4.2\t6.6\t356\t201.09894\t196.0704\n5832750\t4.2\t6.64\t412\t330.11472\t514.57922\n5832751\t4.2\t6.68\t435\t361.34894\t564.6944\n5832752\t4.2\t6.72\t409\t316.79568\t478.66241\n5832753\t4.2\t6.76\t371\t219.94376\t230.7088\n5832754\t4.2\t6.8\t347\t174.92305\t129.4016\n5832755\t4.2\t6.84\t343\t175.53416\t127.2976\n5898245\t4.24\t5\t100\t29.432169\t10.1104\n5898246\t4.24\t5.04\t109\t33.32774\t13.6464\n5898247\t4.24\t5.08\t120\t39.281815\t18.9536\n5898248\t4.24\t5.12\t130\t43.879318\t22.232\n5898249\t4.24\t5.16\t174\t60.726379\t30.6336\n5898250\t4.24\t5.2\t227\t93.268677\t60.3344\n5898251\t4.24\t5.24\t213\t78.183037\t40.996799\n5898252\t4.24\t5.28\t136\t44.146149\t21.547199\n5898253\t4.24\t5.32\t115\t31.675648\t11.752\n5898254\t4.24\t5.36\t105\t27.410803\t8.8207998\n5898255\t4.24\t5.4\t99\t26.403931\t8.3456001\n5898256\t4.24\t5.44\t100\t29.556654\t10.2208\n5898268\t4.24\t5.92\t327\t226.07339\t313.664\n5898269\t4.24\t5.96\t379\t342.07089\t611.98077\n5898270\t4.24\t6\t385\t347.09174\t616.11841\n5898271\t4.24\t6.04\t284\t132.12675\t95.510399\n5898283\t4.24\t6.52\t323\t168.14743\t127.1136\n5898284\t4.24\t6.56\t333\t172.10799\t133.30721\n5898285\t4.24\t6.6\t359\t216.17926\t231.2832\n5898286\t4.24\t6.64\t410\t336.0787\t534.05121\n5898287\t4.24\t6.68\t433\t368.46088\t587.42877\n5898288\t4.24\t6.72\t403\t320.29135\t495.608\n5898289\t4.24\t6.76\t370\t226.68704\t248.48959\n5898290\t4.24\t6.8\t347\t180.93201\t139.808\n5898291\t4.24\t6.84\t341\t178.30933\t133.0032\n5963781\t4.28\t5\t101\t27.776957\t9.1168003\n5963782\t4.28\t5.04\t101\t24.927849\t7.4752002\n5963783\t4.28\t5.08\t132\t41.090939\t18.632\n5963784\t4.28\t5.12\t151\t48.945183\t23.740801\n5963785\t4.28\t5.16\t171\t55.987751\t27.395201\n5963786\t4.28\t5.2\t207\t81.966827\t51.779202\n5963787\t4.28\t5.24\t205\t73.530777\t37.996799\n5963788\t4.28\t5.28\t147\t43.889133\t19.695999\n5963789\t4.28\t5.32\t119\t28.863575\t9.1711998\n5963790\t4.28\t5.36\t105\t24.446136\t7.0447998\n5963791\t4.28\t5.4\t101\t25.049604\t7.5696001\n5963792\t4.28\t5.44\t101\t27.907068\t9.224\n5963803\t4.28\t5.88\t85\t26.684565\t11.544\n5963804\t4.28\t5.92\t306\t234.69208\t357.1824\n5963805\t4.28\t5.96\t369\t346.85681\t633.97278\n5963806\t4.28\t6\t375\t350.68781\t637.09601\n5963807\t4.28\t6.04\t253\t127.02579\t100.0368\n5963808\t4.28\t6.08\t81\t25.97006\t11.5248\n5963819\t4.28\t6.52\t326\t175.62921\t138.26241\n5963820\t4.28\t6.56\t332\t176.64764\t141.54559\n5963821\t4.28\t6.6\t360\t227.67424\t259.90079\n5963822\t4.28\t6.64\t406\t340.30609\t549.07843\n5963823\t4.28\t6.68\t431\t374.60123\t607.888\n5963824\t4.28\t6.72\t401\t324.87747\t509.2272\n5963825\t4.28\t6.76\t367\t233.79533\t268.1712\n5963826\t4.28\t6.8\t343\t183.34531\t146.31841\n5963827\t4.28\t6.84\t338\t182.40436\t142.0224\n6029317\t4.32\t5\t113\t33.072563\t12.4432\n6029318\t4.32\t5.04\t115\t30.512991\t10.5968\n6029319\t4.32\t5.08\t126\t34.017452\t13.2464\n6029320\t4.32\t5.12\t146\t43.317387\t19.4272\n6029321\t4.32\t5.16\t204\t93.96833\t76.508797\n6029322\t4.32\t5.2\t199\t74.461731\t43.763199\n6029323\t4.32\t5.24\t200\t70.972908\t36.492802\n6029324\t4.32\t5.28\t149\t40.737537\t16.3248\n6029325\t4.32\t5.32\t125\t29.022747\t8.7648001\n6029326\t4.32\t5.36\t108\t23.870008\t6.592\n6029327\t4.32\t5.4\t105\t25.177837\t7.4703999\n6029328\t4.32\t5.44\t101\t26.710073\t8.6096001\n6029339\t4.32\t5.88\t133\t43.602909\t18.3568\n6029340\t4.32\t5.92\t296\t242.15787\t386.54401\n6029341\t4.32\t5.96\t352\t348.90652\t655.41919\n6029342\t4.32\t6\t356\t351.93237\t658.3056\n6029343\t4.32\t6.04\t243\t127.67693\t106.296\n6029344\t4.32\t6.08\t136\t45.930676\t20.004801\n6029355\t4.32\t6.52\t324\t180.12865\t147.4496\n6029356\t4.32\t6.56\t332\t183.05551\t152.7056\n6029357\t4.32\t6.6\t360\t236.25809\t278.23999\n6029358\t4.32\t6.64\t406\t348.27011\t570.87842\n6029359\t4.32\t6.68\t428\t381.009\t629.64001\n6029360\t4.32\t6.72\t400\t329.20084\t519.61761\n6029361\t4.32\t6.76\t367\t242.24318\t287.1008\n6029362\t4.32\t6.8\t340\t187.72357\t155.5696\n6029363\t4.32\t6.84\t335\t187.72534\t153.5056\n6094853\t4.36\t5\t115\t32.928185\t12.0272\n6094854\t4.36\t5.04\t114\t28.351187\t8.9919996\n6094855\t4.36\t5.08\t117\t26.826647\t7.9520001\n6094856\t4.36\t5.12\t144\t40.038036\t16.684799\n6094857\t4.36\t5.16\t201\t89.973602\t71.790398\n6094858\t4.36\t5.2\t194\t69.31813\t37.551998\n6094859\t4.36\t5.24\t200\t70.336067\t35.812801\n6094860\t4.36\t5.28\t145\t37.248024\t13.8496\n6094861\t4.36\t5.32\t121\t26.648153\t7.6687999\n6094862\t4.36\t5.36\t114\t25.778414\t7.5120001\n6094863\t4.36\t5.4\t107\t25.610348\t7.7456002\n6094864\t4.36\t5.44\t104\t27.325058\t8.8191996\n6094875\t4.36\t5.88\t153\t53.67907\t24.2176\n6094876\t4.36\t5.92\t295\t249.49899\t405.69281\n6094877\t4.36\t5.96\t337\t351.19833\t677.45441\n6094878\t4.36\t6\t341\t353.40298\t679.62878\n6094879\t4.36\t6.04\t239\t130.80273\t114.6432\n6094880\t4.36\t6.08\t145\t49.995213\t22.143999\n6094891\t4.36\t6.52\t319\t182.7356\t154.3856\n6094892\t4.36\t6.56\t329\t186.2841\t159.28799\n6094893\t4.36\t6.6\t361\t245.0983\t296.65439\n6094894\t4.36\t6.64\t407\t355.77783\t588.44958\n6094895\t4.36\t6.68\t428\t391.04211\t656.64801\n6094896\t4.36\t6.72\t398\t334.92273\t534.5376\n6094897\t4.36\t6.76\t370\t254.26639\t311.0112\n6094898\t4.36\t6.8\t339\t192.65126\t164.2944\n6094899\t4.36\t6.84\t331\t191.39301\t162.416\n6160389\t4.4\t5\t112\t30.96237\t10.6128\n6160390\t4.4\t5.04\t116\t29.624048\t9.7664003\n6160391\t4.4\t5.08\t120\t28.221235\t8.6591997\n6160392\t4.4\t5.12\t137\t36.00132\t13.9728\n6160393\t4.4\t5.16\t199\t86.054825\t65.857597\n6160394\t4.4\t5.2\t195\t69.567558\t36.875198\n6160395\t4.4\t5.24\t199\t69.428581\t35.0224\n6160396\t4.4\t5.28\t137\t32.897663\t11.1216\n6160397\t4.4\t5.32\t121\t26.701374\t7.7712002\n6160398\t4.4\t5.36\t116\t27.003815\t8.2496004\n6160399\t4.4\t5.4\t111\t27.701252\t8.9007998\n6160400\t4.4\t5.44\t105\t28.02039\t9.2784004\n6160411\t4.4\t5.88\t169\t65.875565\t33.52\n6160412\t4.4\t5.92\t286\t253.49394\t424.2016\n6160413\t4.4\t5.96\t331\t356.86954\t701.61603\n6160414\t4.4\t6\t331\t356.37314\t701.01758\n6160415\t4.4\t6.04\t231\t132.81898\t123.768\n6160416\t4.4\t6.08\t162\t61.890392\t30.8976\n6160427\t4.4\t6.52\t320\t192.26317\t170.528\n6160428\t4.4\t6.56\t327\t191.96828\t169.7088\n6160429\t4.4\t6.6\t363\t258.77274\t326.37759\n6160430\t4.4\t6.64\t405\t363.65207\t611.33282\n6160431\t4.4\t6.68\t430\t401.91199\t684.41443\n6160432\t4.4\t6.72\t398\t341.07672\t548.34723\n6160433\t4.4\t6.76\t368\t264.02289\t337.02719\n6160434\t4.4\t6.8\t336\t196.82739\t172.0432\n6160435\t4.4\t6.84\t326\t194.93544\t170.7888\n6225925\t4.44\t5\t111\t31.884279\t11.4512\n6225926\t4.44\t5.04\t117\t31.191889\t10.7104\n6225927\t4.44\t5.08\t119\t28.695505\t8.9952002\n6225928\t4.44\t5.12\t123\t28.469143\t8.9024\n6225929\t4.44\t5.16\t195\t82.17366\t61.0896\n6225930\t4.44\t5.2\t195\t68.182961\t34.062401\n6225931\t4.44\t5.24\t199\t69.878426\t35.1824\n6225932\t4.44\t5.28\t135\t33.131821\t11.6656\n6225933\t4.44\t5.32\t120\t27.276447\t8.1456003\n6225934\t4.44\t5.36\t114\t27.670517\t8.9104004\n6225935\t4.44\t5.4\t114\t30.199787\t10.3376\n6225936\t4.44\t5.44\t108\t30.529306\t10.752\n6225947\t4.44\t5.88\t169\t69.207413\t37.675201\n6225948\t4.44\t5.92\t283\t260.10785\t444.78241\n6225949\t4.44\t5.96\t326\t362.24142\t725.66718\n6225950\t4.44\t6\t329\t363.40445\t726.07037\n6225951\t4.44\t6.04\t225\t134.24167\t129.696\n6225952\t4.44\t6.08\t164\t67.14035\t36.580799\n6225963\t4.44\t6.52\t314\t196.16574\t179.8416\n6225964\t4.44\t6.56\t323\t197.88448\t181.4944\n6225965\t4.44\t6.6\t363\t267.3703\t345.87039\n6225966\t4.44\t6.64\t406\t370.56467\t626.8432\n6225967\t4.44\t6.68\t432\t413.07578\t712.90723\n6225968\t4.44\t6.72\t397\t349.25906\t570.03998\n6225969\t4.44\t6.76\t368\t274.95758\t362.29919\n6225970\t4.44\t6.8\t332\t201.53105\t182.06239\n6225971\t4.44\t6.84\t324\t202.86435\t184.73599\n6291461\t4.48\t5\t113\t34.848801\t13.3504\n6291462\t4.48\t5.04\t114\t31.880829\t11.3248\n6291463\t4.48\t5.08\t119\t30.851049\t10.2912\n6291464\t4.48\t5.12\t122\t29.63176\t9.3839998\n6291465\t4.48\t5.16\t188\t78.624237\t57.796799\n6291466\t4.48\t5.2\t202\t72.784462\t36.5984\n6291467\t4.48\t5.24\t201\t71.295197\t35.875198\n6291468\t4.48\t5.28\t126\t33.017735\t12.8496\n6291469\t4.48\t5.32\t116\t27.761574\t8.6688004\n6291470\t4.48\t5.36\t115\t29.873531\t10.1024\n6291471\t4.48\t5.4\t113\t31.715975\t11.3792\n6291472\t4.48\t5.44\t108\t32.547211\t12.1872\n6291483\t4.48\t5.88\t174\t76.612839\t45.467201\n6291484\t4.48\t5.92\t284\t268.90042\t467.28961\n6291485\t4.48\t5.96\t326\t370.31882\t752.07843\n6291486\t4.48\t6\t330\t371.98257\t752.77283\n6291487\t4.48\t6.04\t229\t144.992\t148.84641\n6291488\t4.48\t6.08\t169\t74.357368\t43.996799\n6291499\t4.48\t6.52\t314\t204.57845\t193.60001\n6291500\t4.48\t6.56\t318\t202.94313\t191.9632\n6291501\t4.48\t6.6\t361\t278.01318\t371.02719\n6291502\t4.48\t6.64\t406\t377.67078\t643.43201\n6291503\t4.48\t6.68\t431\t422.06061\t738.32483\n6291504\t4.48\t6.72\t400\t358.49643\t587.5072\n6291505\t4.48\t6.76\t367\t283.78668\t383.74719\n6291506\t4.48\t6.8\t323\t204.91855\t191.632\n6291507\t4.48\t6.84\t322\t209.15439\t195.6944\n6356997\t4.52\t5\t112\t37.037148\t14.9888\n6356998\t4.52\t5.04\t113\t34.333866\t12.9712\n6356999\t4.52\t5.08\t112\t30.941305\t10.7552\n6357000\t4.52\t5.12\t133\t50.809017\t37.510399\n6357001\t4.52\t5.16\t151\t60.359173\t44.801601\n6357002\t4.52\t5.2\t210\t76.868217\t38.532799\n6357003\t4.52\t5.24\t199\t71.943649\t36.604801\n6357004\t4.52\t5.28\t127\t37.182869\t15.6608\n6357005\t4.52\t5.32\t113\t30.153872\t10.28\n6357006\t4.52\t5.36\t113\t31.989243\t11.4672\n6357007\t4.52\t5.4\t110\t33.171955\t12.5632\n6357008\t4.52\t5.44\t110\t36.106644\t14.5472\n6357019\t4.52\t5.88\t180\t87.496834\t57.745602\n6357020\t4.52\t5.92\t289\t279.39331\t491.28799\n6357021\t4.52\t5.96\t328\t379.33331\t779.53601\n6357022\t4.52\t6\t334\t381.28098\t779.76642\n6357023\t4.52\t6.04\t234\t154.06967\t162.8784\n6357024\t4.52\t6.08\t174\t86.327347\t59.852798\n6357035\t4.52\t6.52\t309\t211.89519\t207.0304\n6357036\t4.52\t6.56\t314\t209.3764\t203.80161\n6357037\t4.52\t6.6\t354\t289.15295\t400.42239\n6357038\t4.52\t6.64\t407\t384.19479\t657.26398\n6357039\t4.52\t6.68\t439\t437.18692\t771.10083\n6357040\t4.52\t6.72\t403\t369.09366\t611.41278\n6357041\t4.52\t6.76\t363\t298.44095\t422.46881\n6357042\t4.52\t6.8\t324\t221.27254\t224.16319\n6357043\t4.52\t6.84\t313\t213.7773\t207.1104\n6422538\t4.56\t5.2\t223\t83.248642\t41.5424\n6422539\t4.56\t5.24\t178\t68.536537\t36.481602\n6422555\t4.56\t5.88\t176\t95.444275\t72.457603\n6422556\t4.56\t5.92\t299\t293.95441\t518.896\n6422557\t4.56\t5.96\t343\t392.0264\t808.16803\n6422558\t4.56\t6\t344\t392.77533\t808.31519\n6422559\t4.56\t6.04\t233\t162.32092\t178.9792\n6422560\t4.56\t6.08\t172\t96.405861\t76.7808\n6422571\t4.56\t6.52\t306\t219.26566\t219.41119\n6422572\t4.56\t6.56\t311\t222.48582\t229.5248\n6422573\t4.56\t6.6\t348\t301.68768\t434.6528\n6422574\t4.56\t6.64\t405\t392.16751\t676.61603\n6422575\t4.56\t6.68\t450\t453.44873\t805.3136\n6422576\t4.56\t6.72\t402\t377.23257\t633.71039\n6422577\t4.56\t6.76\t356\t311.76816\t457.99841\n6422578\t4.56\t6.8\t315\t227.97002\t239.49921\n6422579\t4.56\t6.84\t308\t220.57246\t219.784\n6488068\t4.6\t4.96\t68\t25.342285\t12.0864\n6488069\t4.6\t5\t78\t30.417561\t15.4496\n6488070\t4.6\t5.04\t68\t23.030581\t10.6224\n6488071\t4.6\t5.08\t42\t9.1876049\t2.8896\n6488072\t4.6\t5.12\t48\t12.655054\t4.6448002\n6488073\t4.6\t5.16\t121\t39.643505\t16.3104\n6488074\t4.6\t5.2\t213\t84.75589\t43.987202\n6488075\t4.6\t5.24\t170\t68.420494\t38.385601\n6488076\t4.6\t5.28\t44\t8.063261\t1.8992\n6488077\t4.6\t5.32\t26\t4.0178785\t0.83359998\n6488078\t4.6\t5.36\t23\t3.8602643\t0.912\n6488079\t4.6\t5.4\t22\t4.1480699\t1.0928\n6488080\t4.6\t5.44\t22\t4.8933415\t1.4400001\n6488091\t4.6\t5.88\t159\t99.488785\t87.751999\n6488092\t4.6\t5.92\t273\t299.83093\t547.49762\n6488093\t4.6\t5.96\t397\t419.13861\t843.55518\n6488094\t4.6\t6\t387\t422.02542\t848.98718\n6488095\t4.6\t6.04\t193\t153.06657\t186.8576\n6488096\t4.6\t6.08\t156\t97.300621\t86.102402\n6488107\t4.6\t6.52\t304\t228.21217\t234.5744\n6488108\t4.6\t6.56\t311\t239.59021\t263.72961\n6488109\t4.6\t6.6\t341\t315.17841\t467.6864\n6488110\t4.6\t6.64\t389\t397.65375\t701.45758\n6488111\t4.6\t6.68\t463\t468.7627\t839.54559\n6488112\t4.6\t6.72\t395\t386.44653\t661.12158\n6488113\t4.6\t6.76\t347\t327.69431\t501.9584\n6488114\t4.6\t6.8\t316\t246.69366\t277.85281\n6488115\t4.6\t6.84\t309\t232.49518\t238.4752\n6553604\t4.64\t4.96\t101\t59.18145\t47.790401\n6553605\t4.64\t5\t79\t30.290758\t15.7552\n6553606\t4.64\t5.04\t80\t30.676332\t15.04\n6553607\t4.64\t5.08\t39\t10.798943\t4.3248\n6553608\t4.64\t5.12\t38\t9.8691807\t3.2\n6553609\t4.64\t5.16\t89\t32.254169\t15.5808\n6553610\t4.64\t5.2\t212\t83.828842\t43.982399\n6553611\t4.64\t5.24\t169\t70.059296\t40.824001\n6553612\t4.64\t5.28\t48\t11.352739\t3.5711999\n6553613\t4.64\t5.32\t35\t7.0392237\t1.9263999\n6553614\t4.64\t5.36\t28\t5.3873882\t1.4304\n6553615\t4.64\t5.4\t23\t4.4248018\t1.1568\n6553616\t4.64\t5.44\t24\t5.7206497\t1.7872\n6553619\t4.64\t5.56\t240\t129.23502\t88.150398\n6553620\t4.64\t5.6\t247\t124.67947\t80.843201\n6553621\t4.64\t5.64\t255\t122.22733\t75.508797\n6553622\t4.64\t5.68\t264\t121.43034\t71.984001\n6553623\t4.64\t5.72\t273\t122.24762\t70.465599\n6553624\t4.64\t5.76\t268\t114.8168\t63.4944\n6553625\t4.64\t5.8\t267\t110.01385\t58.187199\n6553626\t4.64\t5.84\t265\t105.78947\t54.035198\n6553627\t4.64\t5.88\t266\t104.1961\t51.993599\n6553628\t4.64\t5.92\t266\t101.82307\t49.712002\n6553629\t4.64\t5.96\t530\t486.02512\t904.32159\n6553630\t4.64\t6\t517\t483.37317\t904.39362\n6553631\t4.64\t6.04\t263\t100.76785\t49.451199\n6553632\t4.64\t6.08\t259\t100.15928\t49.7728\n6553633\t4.64\t6.12\t258\t101.60239\t51.632\n6553634\t4.64\t6.16\t255\t103.77785\t55.383999\n6553635\t4.64\t6.2\t250\t105.37714\t58.7808\n6553636\t4.64\t6.24\t247\t108.3482\t63.147202\n6553637\t4.64\t6.28\t243\t111.52805\t67.619202\n6553638\t4.64\t6.32\t244\t119.10101\t76.278397\n6553639\t4.64\t6.36\t242\t124.90104\t83.3088\n6553640\t4.64\t6.4\t243\t133.44257\t93.017601\n6553644\t4.64\t6.56\t86\t21.017136\t5.9871998\n6553645\t4.64\t6.6\t86\t19.644417\t5.3072\n6553646\t4.64\t6.64\t86\t18.818968\t4.9056001\n6553647\t4.64\t6.68\t470\t481.22058\t873.01282\n6553648\t4.64\t6.72\t96\t22.665855\t6.6799998\n6553649\t4.64\t6.76\t96\t25.354136\t8.6767998\n6553650\t4.64\t6.8\t99\t28.99967\t11.0304\n6619140\t4.68\t4.96\t116\t76.496078\t70.070396\n6619141\t4.68\t5\t122\t72.880157\t62.2048\n6619142\t4.68\t5.04\t147\t77.532501\t58.3088\n6619143\t4.68\t5.08\t186\t85.038689\t53.366402\n6619144\t4.68\t5.12\t188\t81.034576\t46.048\n6619145\t4.68\t5.16\t186\t73.813782\t38.003201\n6619146\t4.68\t5.2\t255\t104.20734\t57.335999\n6619147\t4.68\t5.24\t258\t105.37385\t58.863998\n6619148\t4.68\t5.28\t170\t54.604095\t21.4848\n6619149\t4.68\t5.32\t165\t51.228039\t19.176001\n6619150\t4.68\t5.36\t159\t49.167332\t18.1936\n6619151\t4.68\t5.4\t154\t48.720772\t18.327999\n6619152\t4.68\t5.44\t150\t49.658947\t19.361601\n6619153\t4.68\t5.48\t147\t51.928902\t21.203199\n6619155\t4.68\t5.56\t243\t129.09261\t89.127998\n6619156\t4.68\t5.6\t257\t127.25648\t83.0112\n6619157\t4.68\t5.64\t267\t124.83909\t76.934402\n6619158\t4.68\t5.68\t276\t123.72148\t72.865601\n6619159\t4.68\t5.72\t271\t115.44196\t65.028801\n6619160\t4.68\t5.76\t270\t109.92471\t58.953602\n6619161\t4.68\t5.8\t270\t106.49425\t55.32\n6619162\t4.68\t5.84\t269\t102.16472\t50.948799\n6619163\t4.68\t5.88\t274\t102.4071\t50.228802\n6619164\t4.68\t5.92\t286\t103.2551\t48.728001\n6619165\t4.68\t5.96\t531\t494.51569\t934.56158\n6619166\t4.68\t6\t505\t480.48798\t926.31842\n6619167\t4.68\t6.04\t271\t98.462234\t47.096001\n6619168\t4.68\t6.08\t265\t98.019562\t47.945599\n6619169\t4.68\t6.12\t264\t100.35928\t50.799999\n6619170\t4.68\t6.16\t263\t103.26722\t54.388802\n6619171\t4.68\t6.2\t259\t105.16183\t57.756802\n6619172\t4.68\t6.24\t254\t107.08556\t61.292801\n6619173\t4.68\t6.28\t249\t110.68029\t66.848\n6619174\t4.68\t6.32\t246\t117.08631\t75.289597\n6619175\t4.68\t6.36\t245\t123.35952\t82.472\n6619176\t4.68\t6.4\t244\t131.17125\t91.638397\n6619179\t4.68\t6.52\t85\t20.604757\t5.8031998\n6619180\t4.68\t6.56\t86\t18.7687\t4.8720002\n6619181\t4.68\t6.6\t92\t18.73526\t4.5535998\n6619182\t4.68\t6.64\t178\t68.29129\t40.9072\n6619183\t4.68\t6.68\t460\t492.63138\t909.49438\n6619184\t4.68\t6.72\t214\t95.186333\t63.534401\n6619185\t4.68\t6.76\t108\t28.651815\t10.8672\n6619186\t4.68\t6.8\t112\t35.156937\t16.0336\n6619187\t4.68\t6.84\t114\t41.505768\t21.865601\n6684676\t4.72\t4.96\t65\t35.133587\t30.753599\n6684677\t4.72\t5\t99\t66.120819\t64.288002\n6684678\t4.72\t5.04\t126\t81.993675\t75.2528\n6684679\t4.72\t5.08\t184\t98.092308\t75.619202\n6684680\t4.72\t5.12\t220\t102.6207\t69.431999\n6684681\t4.72\t5.16\t229\t99.171417\t62.3456\n6684682\t4.72\t5.2\t275\t123.76847\t78.659203\n6684683\t4.72\t5.24\t276\t120.74655\t74.398399\n6684684\t4.72\t5.28\t193\t64.193718\t28.673599\n6684685\t4.72\t5.32\t181\t55.958279\t22.028799\n6684686\t4.72\t5.36\t172\t50.440639\t18.030399\n6684687\t4.72\t5.4\t164\t47.884727\t16.809601\n6684688\t4.72\t5.44\t154\t46.856709\t17.003201\n6684689\t4.72\t5.48\t147\t48.212299\t18.5152\n6684691\t4.72\t5.56\t250\t127.4764\t85.569603\n6684692\t4.72\t5.6\t274\t131.18167\t82.865601\n6684693\t4.72\t5.64\t284\t129.80994\t78.926399\n6684694\t4.72\t5.68\t279\t121.1924\t70.676804\n6684695\t4.72\t5.72\t275\t113.68239\t63.4464\n6684696\t4.72\t5.76\t278\t110.60752\t59.510399\n6684697\t4.72\t5.8\t276\t105.55979\t54.476799\n6684698\t4.72\t5.84\t276\t102.26431\t50.916801\n6684699\t4.72\t5.88\t282\t101.94955\t49.4608\n6684700\t4.72\t5.92\t304\t110.66743\t53.161598\n6684701\t4.72\t5.96\t524\t498.63336\t962.88159\n6684702\t4.72\t6\t498\t477.83334\t944.90082\n6684703\t4.72\t6.04\t281\t99.655411\t47.3936\n6684704\t4.72\t6.08\t273\t98.293877\t47.694401\n6684705\t4.72\t6.12\t272\t101.05534\t50.956799\n6684706\t4.72\t6.16\t267\t101.45684\t52.662399\n6684707\t4.72\t6.2\t267\t105.67683\t57.439999\n6684708\t4.72\t6.24\t265\t109.35533\t62.212799\n6684709\t4.72\t6.28\t261\t112.79687\t67.167999\n6684710\t4.72\t6.32\t251\t115.44904\t72.878403\n6684711\t4.72\t6.36\t244\t118.9511\t78.155197\n6684712\t4.72\t6.4\t243\t126.9421\t87.222397\n6684715\t4.72\t6.52\t88\t19.925976\t5.2783999\n6684716\t4.72\t6.56\t91\t18.500883\t4.4928002\n6684717\t4.72\t6.6\t111\t23.400408\t6.1135998\n6684718\t4.72\t6.64\t215\t99.329002\t70.584\n6684719\t4.72\t6.68\t462\t505.23071\t939.67358\n6684720\t4.72\t6.72\t257\t142.36018\t120.2928\n6684721\t4.72\t6.76\t144\t49.295589\t26.784\n6684722\t4.72\t6.8\t140\t57.718628\t38.499199\n6684723\t4.72\t6.84\t144\t67.546402\t49.398399\n6750216\t4.76\t5.12\t241\t126.05138\t99.3312\n6750217\t4.76\t5.16\t260\t124.89553\t90.249603\n6750218\t4.76\t5.2\t301\t149.76447\t107.1792\n6750219\t4.76\t5.24\t310\t151.97447\t107.1696\n6750220\t4.76\t5.28\t240\t98.890892\t60.124802\n6750221\t4.76\t5.32\t234\t91.720634\t52.326401\n6750222\t4.76\t5.36\t221\t80.477577\t41.3344\n6750223\t4.76\t5.4\t203\t66.210129\t28.233601\n6750224\t4.76\t5.44\t177\t51.461433\t17.900801\n6750225\t4.76\t5.48\t153\t46.268379\t16.571199\n6750227\t4.76\t5.56\t292\t146.60869\t98.015999\n6750228\t4.76\t5.6\t300\t142.25043\t90.667198\n6750229\t4.76\t5.64\t293\t132.57094\t81.751999\n6750230\t4.76\t5.68\t289\t124.36207\t73.528\n6750231\t4.76\t5.72\t286\t117.16612\t65.848\n6750232\t4.76\t5.76\t283\t110.3746\t58.919998\n6750233\t4.76\t5.8\t281\t105.49039\t54.054401\n6750234\t4.76\t5.84\t282\t101.87502\t49.788799\n6750235\t4.76\t5.88\t290\t103.27867\t49.473598\n6750236\t4.76\t5.92\t318\t118.70315\t59.260799\n6750237\t4.76\t5.96\t524\t506.61371\t993.6944\n6750238\t4.76\t6\t501\t485.95761\t974.85602\n6750239\t4.76\t6.04\t291\t102.16702\t48.129601\n6750240\t4.76\t6.08\t281\t99.622826\t47.982399\n6750241\t4.76\t6.12\t276\t100.24689\t49.9408\n6750242\t4.76\t6.16\t279\t105.59521\t55.254398\n6750243\t4.76\t6.2\t278\t108.91234\t59.006401\n6750244\t4.76\t6.24\t276\t113.43774\t64.968002\n6750245\t4.76\t6.28\t277\t119.35275\t71.499199\n6750246\t4.76\t6.32\t275\t124.84217\t78.371201\n6750247\t4.76\t6.36\t265\t127.31407\t84.0336\n6750248\t4.76\t6.4\t249\t130.39983\t91.5056\n6750251\t4.76\t6.52\t90\t19.351294\t4.9152002\n6750252\t4.76\t6.56\t119\t27.59627\t8.1440001\n6750253\t4.76\t6.6\t155\t47.836914\t21.5888\n6750254\t4.76\t6.64\t279\t157.22244\t130.89439\n6750255\t4.76\t6.68\t492\t547.95569\t1007.3264\n6750256\t4.76\t6.72\t323\t235.73404\t273.04001\n6750257\t4.76\t6.76\t198\t94.422012\t69.400002\n6750258\t4.76\t6.8\t177\t88.234642\t69.0448\n6750259\t4.76\t6.84\t170\t93.665993\t79.620796\n6815752\t4.8\t5.12\t263\t159.85904\t149.56799\n6815753\t4.8\t5.16\t296\t170.63861\t152.12959\n6815754\t4.8\t5.2\t337\t199.5562\t175.5152\n6815755\t4.8\t5.24\t356\t208.22437\t179.6304\n6815756\t4.8\t5.28\t305\t162.67145\t133.48\n6815757\t4.8\t5.32\t297\t154.84575\t123.48\n6815758\t4.8\t5.36\t308\t157.63011\t120.4064\n6815759\t4.8\t5.4\t322\t161.47871\t117.9776\n6815760\t4.8\t5.44\t338\t168.22293\t117.9712\n6815761\t4.8\t5.48\t365\t178.1993\t118.4832\n6815762\t4.8\t5.52\t372\t176.33803\t112.5472\n6815763\t4.8\t5.56\t337\t158.6853\t100.2336\n6815764\t4.8\t5.6\t308\t140.68845\t87.193604\n6815765\t4.8\t5.64\t295\t128.88879\t77.203201\n6815766\t4.8\t5.68\t289\t121.40872\t70.515198\n6815767\t4.8\t5.72\t284\t114.04677\t63.563202\n6815768\t4.8\t5.76\t282\t108.58732\t57.982399\n6815769\t4.8\t5.8\t284\t105.49833\t53.987202\n6815770\t4.8\t5.84\t287\t103.8661\t51.465599\n6815771\t4.8\t5.88\t292\t103.55003\t49.675201\n6815772\t4.8\t5.92\t331\t131.87375\t73.582397\n6815773\t4.8\t5.96\t519\t512.55774\t1024.6016\n6815774\t4.8\t6\t500\t493.67084\t1005.7088\n6815775\t4.8\t6.04\t299\t106.83577\t51.619202\n6815776\t4.8\t6.08\t285\t100.41935\t48.195202\n6815777\t4.8\t6.12\t282\t102.10297\t50.886398\n6815778\t4.8\t6.16\t280\t104.44841\t54.1008\n6815779\t4.8\t6.2\t281\t108.43563\t58.246399\n6815780\t4.8\t6.24\t280\t112.68504\t63.363201\n6815781\t4.8\t6.28\t282\t118.8515\t69.857597\n6815782\t4.8\t6.32\t284\t125.54445\t77.057602\n6815783\t4.8\t6.36\t289\t133.24413\t84.452797\n6815784\t4.8\t6.4\t296\t142.41209\t93.569603\n6815785\t4.8\t6.44\t288\t148.97034\t102.744\n6815786\t4.8\t6.48\t275\t147.69745\t107.12\n6815787\t4.8\t6.52\t274\t144.17676\t108.08\n6815788\t4.8\t6.56\t266\t143.27884\t112.5472\n6815789\t4.8\t6.6\t278\t154.35132\t125.0736\n6815790\t4.8\t6.64\t370\t263.66269\t266.16479\n6815791\t4.8\t6.68\t542\t619.04669\t1116.88\n6815792\t4.8\t6.72\t398\t358.71567\t509.4144\n6815793\t4.8\t6.76\t252\t156.59021\t147.0448\n6815794\t4.8\t6.8\t217\t138.35579\t136.9872\n6815795\t4.8\t6.84\t208\t138.56532\t141.552\n6881288\t4.84\t5.12\t270\t162.44919\t150.7632\n6881289\t4.84\t5.16\t296\t171.38646\t153.6528\n6881290\t4.84\t5.2\t338\t200.93681\t178.056\n6881291\t4.84\t5.24\t354\t208.82271\t182.0912\n6881292\t4.84\t5.28\t310\t165.11208\t135.60001\n6881293\t4.84\t5.32\t309\t162.0493\t129.38721\n6881294\t4.84\t5.36\t316\t163.07828\t125.2048\n6881295\t4.84\t5.4\t336\t170.44125\t124.5024\n6881296\t4.84\t5.44\t354\t175.2309\t121.04\n6881297\t4.84\t5.48\t376\t178.02142\t115.3264\n6881298\t4.84\t5.52\t354\t165.15269\t104.392\n6881299\t4.84\t5.56\t318\t147.57974\t92.110397\n6881300\t4.84\t5.6\t307\t138.2617\t83.655998\n6881301\t4.84\t5.64\t299\t130.10788\t76.228798\n6881302\t4.84\t5.68\t295\t123.26687\t69.662399\n6881303\t4.84\t5.72\t289\t116.03209\t63.348801\n6881304\t4.84\t5.76\t288\t110.99865\t58.1632\n6881305\t4.84\t5.8\t289\t108.04501\t55.001598\n6881306\t4.84\t5.84\t289\t105.15712\t51.9744\n6881307\t4.84\t5.88\t297\t107.43253\t52.558399\n6881308\t4.84\t5.92\t334\t139.45978\t83.872002\n6881309\t4.84\t5.96\t513\t518.62866\t1056.0192\n6881310\t4.84\t6\t493\t497.91345\t1034.64\n6881311\t4.84\t6.04\t302\t110.50415\t55.030399\n6881312\t4.84\t6.08\t284\t99.370766\t47.097599\n6881313\t4.84\t6.12\t281\t100.59311\t49.2896\n6881314\t4.84\t6.16\t278\t102.07783\t51.580799\n6881315\t4.84\t6.2\t278\t105.88176\t55.756802\n6881316\t4.84\t6.24\t279\t110.23824\t60.051201\n6881317\t4.84\t6.28\t279\t115.27534\t65.700798\n6881318\t4.84\t6.32\t282\t121.21204\t71.260803\n6881319\t4.84\t6.36\t286\t128.93832\t79.056\n6881320\t4.84\t6.4\t292\t137.32787\t87.444801\n6881321\t4.84\t6.44\t295\t147.93527\t97.942398\n6881322\t4.84\t6.48\t303\t156.05125\t107.5904\n6881323\t4.84\t6.52\t295\t156.31007\t114.176\n6881324\t4.84\t6.56\t283\t154.22353\t118.4128\n6881325\t4.84\t6.6\t295\t168.70222\t135.65601\n6881326\t4.84\t6.64\t387\t302.0123\t347.6048\n6881327\t4.84\t6.68\t528\t619.30365\t1143.9041\n6881328\t4.84\t6.72\t401\t380.50388\t563.33917\n6881329\t4.84\t6.76\t257\t161.88014\t149.496\n6881330\t4.84\t6.8\t223\t140.52336\t135.5696\n6881331\t4.84\t6.84\t210\t139.3932\t140.2384\n6946824\t4.88\t5.12\t257\t141.64993\t120.3952\n6946825\t4.88\t5.16\t281\t150.26085\t122.7664\n6946826\t4.88\t5.2\t303\t161.89883\t129.03999\n6946827\t4.88\t5.24\t311\t161.76492\t126.2768\n6946828\t4.88\t5.28\t266\t112.8196\t73.441597\n6946829\t4.88\t5.32\t253\t100.08851\t60.153599\n6946830\t4.88\t5.36\t240\t89.044327\t49.6576\n6946831\t4.88\t5.4\t231\t80.087898\t40.056\n6946832\t4.88\t5.44\t205\t60.688377\t23.132799\n6946833\t4.88\t5.48\t164\t43.486481\t13.672\n6946835\t4.88\t5.56\t272\t134.31546\t90.212799\n6946836\t4.88\t5.6\t289\t135.49271\t86.049599\n6946837\t4.88\t5.64\t293\t130.97589\t79.513603\n6946838\t4.88\t5.68\t294\t126.60983\t74.350403\n6946839\t4.88\t5.72\t295\t122.78362\t69.580803\n6946840\t4.88\t5.76\t297\t119.6748\t65.524803\n6946841\t4.88\t5.8\t298\t116.93443\t62.254398\n6946842\t4.88\t5.84\t303\t117.17518\t61.233601\n6946843\t4.88\t5.88\t310\t120.48535\t63.566399\n6946844\t4.88\t5.92\t348\t155.85977\t100.624\n6946845\t4.88\t5.96\t515\t530.81659\t1091.5472\n6946846\t4.88\t6\t500\t513.60162\t1072.4944\n6946847\t4.88\t6.04\t316\t125.67477\t68.892799\n6946848\t4.88\t6.08\t296\t111.03088\t56.944\n6946849\t4.88\t6.12\t287\t108.10593\t56.335999\n6946850\t4.88\t6.16\t287\t111.29408\t60.097599\n6946851\t4.88\t6.2\t282\t112.0092\t62.200001\n6946852\t4.88\t6.24\t281\t115.49922\t66.169601\n6946853\t4.88\t6.28\t283\t121.77474\t72.839996\n6946854\t4.88\t6.32\t278\t124.10552\t76.328003\n6946855\t4.88\t6.36\t275\t129.79068\t83.731201\n6946856\t4.88\t6.4\t247\t128.29137\t89.172798\n6946859\t4.88\t6.52\t106\t26.908369\t8.9231997\n6946860\t4.88\t6.56\t157\t51.603809\t23.820801\n6946861\t4.88\t6.6\t220\t102.92867\t69.919998\n6946862\t4.88\t6.64\t335\t285.27963\t408.80481\n6946863\t4.88\t6.68\t461\t559.37195\t1099.36\n6946864\t4.88\t6.72\t369\t364.23532\t585.56641\n6946865\t4.88\t6.76\t241\t140.84627\t118.1152\n6946866\t4.88\t6.8\t206\t115.38745\t96.347198\n6946867\t4.88\t6.84\t195\t116.85154\t105.3888\n7012360\t4.92\t5.12\t230\t108.00648\t76.294403\n7012361\t4.92\t5.16\t251\t117.99065\t84.099197\n7012362\t4.92\t5.2\t270\t131.07155\t97.688004\n7012363\t4.92\t5.24\t273\t127.94871\t93.627197\n7012364\t4.92\t5.28\t220\t73.31044\t36.515202\n7012365\t4.92\t5.32\t202\t58.96883\t24.593599\n7012366\t4.92\t5.36\t186\t48.671913\t17.121599\n7012367\t4.92\t5.4\t171\t40.873589\t11.9072\n7012368\t4.92\t5.44\t162\t39.592537\t11.5888\n7012369\t4.92\t5.48\t149\t39.862839\t12.6608\n7012371\t4.92\t5.56\t251\t130.53703\t89.6912\n7012372\t4.92\t5.6\t257\t123.22181\t79.692802\n7012373\t4.92\t5.64\t269\t121.00531\t73.795197\n7012374\t4.92\t5.68\t278\t119.66403\t69.259201\n7012375\t4.92\t5.72\t284\t118.34278\t65.984001\n7012376\t4.92\t5.76\t291\t118.19249\t63.942402\n7012377\t4.92\t5.8\t292\t115.62484\t61.0368\n7012378\t4.92\t5.84\t295\t114.63945\t59.180801\n7012379\t4.92\t5.88\t310\t125.05551\t67.897598\n7012380\t4.92\t5.92\t348\t162.54489\t108.936\n7012381\t4.92\t5.96\t512\t541.94452\t1128.5439\n7012382\t4.92\t6\t496\t523.48602\t1107.5424\n7012383\t4.92\t6.04\t311\t126.7425\t70.939201\n7012384\t4.92\t6.08\t292\t112.47406\t58.9888\n7012385\t4.92\t6.12\t284\t109.8588\t58.380798\n7012386\t4.92\t6.16\t283\t112.37938\t61.476799\n7012387\t4.92\t6.2\t276\t111.71053\t62.382401\n7012388\t4.92\t6.24\t276\t117.58091\t69.788803\n7012389\t4.92\t6.28\t270\t119.89943\t74.0336\n7012390\t4.92\t6.32\t264\t124.45248\t81.457603\n7012391\t4.92\t6.36\t253\t128.1942\t88.721603\n7012392\t4.92\t6.4\t250\t134.58475\t96.367996\n7012395\t4.92\t6.52\t104\t29.111048\t10.768\n7012396\t4.92\t6.56\t120\t36.916149\t16.865601\n7012397\t4.92\t6.6\t166\t75.649811\t56.534401\n7012398\t4.92\t6.64\t283\t275.92596\t477.52481\n7012399\t4.92\t6.68\t394\t511.87451\t1080.0225\n7012400\t4.92\t6.72\t330\t359.38165\t653.77118\n7012401\t4.92\t6.76\t210\t116.03286\t93.817596\n7012402\t4.92\t6.8\t176\t86.394363\t62.619202\n7012403\t4.92\t6.84\t170\t86.674629\t65.062401\n7077896\t4.96\t5.12\t209\t86.039223\t51.743999\n7077897\t4.96\t5.16\t228\t96.948875\t62.632\n7077898\t4.96\t5.2\t238\t104.89588\t73.804802\n7077899\t4.96\t5.24\t245\t106.74608\t76.195198\n7077900\t4.96\t5.28\t198\t59.028324\t25.867201\n7077901\t4.96\t5.32\t181\t46.04565\t15.8048\n7077902\t4.96\t5.36\t171\t41.134903\t12.8944\n7077903\t4.96\t5.4\t162\t37.735302\t10.712\n7077904\t4.96\t5.44\t154\t37.751087\t11.2032\n7077905\t4.96\t5.48\t149\t40.127056\t12.9312\n7077907\t4.96\t5.56\t246\t129.5233\t88.019203\n7077908\t4.96\t5.6\t251\t123.91936\t80.903999\n7077909\t4.96\t5.64\t257\t119.45538\t74.025597\n7077910\t4.96\t5.68\t261\t114.51888\t67.080002\n7077911\t4.96\t5.72\t272\t114.72202\t64.279999\n7077912\t4.96\t5.76\t276\t112.81989\t60.870399\n7077913\t4.96\t5.8\t282\t113.08817\t59.265598\n7077914\t4.96\t5.84\t292\t116.79713\t60.6688\n7077915\t4.96\t5.88\t309\t130.1626\t72.828796\n7077916\t4.96\t5.92\t347\t170.13162\t119.2768\n7077917\t4.96\t5.96\t503\t548.42926\t1161.3328\n7077918\t4.96\t6\t489\t531.71515\t1141.4368\n7077919\t4.96\t6.04\t314\t137.36725\t82.876801\n7077920\t4.96\t6.08\t293\t119.52432\t65.766403\n7077921\t4.96\t6.12\t288\t118.62825\t66.486397\n7077922\t4.96\t6.16\t279\t116.49083\t66.795197\n7077923\t4.96\t6.2\t272\t115.82111\t68.064003\n7077924\t4.96\t6.24\t269\t119.67442\t73.835197\n7077925\t4.96\t6.28\t260\t120.4241\t77.371201\n7077926\t4.96\t6.32\t253\t124.13023\t83.470398\n7077927\t4.96\t6.36\t252\t130.40561\t90.566399\n7077928\t4.96\t6.4\t251\t138.06085\t99.260803\n7077931\t4.96\t6.52\t107\t34.091934\t14.464\n7077932\t4.96\t6.56\t122\t43.965176\t23.774401\n7077933\t4.96\t6.6\t165\t86.33255\t72.222397\n7077934\t4.96\t6.64\t270\t284.69412\t513.0672\n7077935\t4.96\t6.68\t360\t495.96912\t1088.4784\n7077936\t4.96\t6.72\t312\t383.74921\t788.24158\n7077937\t4.96\t6.76\t189\t104.42886\t86.888\n7077938\t4.96\t6.8\t155\t67.842087\t42.032001\n7077939\t4.96\t6.84\t147\t64.659386\t39.5952\n7143432\t5\t5.12\t189\t68.636925\t34.023998\n7143433\t5\t5.16\t216\t89.221336\t56.4576\n7143434\t5\t5.2\t226\t98.96167\t71.188797\n7143435\t5\t5.24\t232\t101.87588\t75.4608\n7143436\t5\t5.28\t186\t53.807076\t23.259199\n7143437\t5\t5.32\t174\t44.387531\t15.5552\n7143438\t5\t5.36\t169\t42.096661\t14.008\n7143439\t5\t5.4\t154\t36.043404\t10.4048\n7143440\t5\t5.44\t151\t38.073978\t11.8448\n7143441\t5\t5.48\t149\t41.081272\t13.6992\n7143443\t5\t5.56\t245\t133.34746\t91.801598\n7143444\t5\t5.6\t248\t125.6116\t81.503998\n7143445\t5\t5.64\t251\t119.75078\t73.9216\n7143446\t5\t5.68\t255\t115.75961\t68.262398\n7143447\t5\t5.72\t259\t112.22642\t62.9776\n7143448\t5\t5.76\t267\t112.24181\t60.4496\n7143449\t5\t5.8\t276\t113.61813\t59.228802\n7143450\t5\t5.84\t282\t115.62297\t60.240002\n7143451\t5\t5.88\t301\t130.9525\t74.512001\n7143452\t5\t5.92\t343\t177.44749\t130.9088\n7143453\t5\t5.96\t493\t554.69794\t1194.1104\n7143454\t5\t6\t486\t543.25946\t1177.9088\n7143455\t5\t6.04\t315\t146.83084\t94.209602\n7143456\t5\t6.08\t294\t127.83262\t73.7024\n7143457\t5\t6.12\t280\t118.61005\t66.388802\n7143458\t5\t6.16\t274\t118.74092\t68.940804\n7143459\t5\t6.2\t268\t119.36779\t71.756798\n7143460\t5\t6.24\t264\t123.28454\t78.499199\n7143461\t5\t6.28\t258\t126.53695\t84.209602\n7143462\t5\t6.32\t256\t131.9953\t91.326401\n7143463\t5\t6.36\t253\t136.09894\t96.580803\n7143464\t5\t6.4\t252\t143.91705\t106.3952\n7143468\t5\t6.56\t128\t53.558598\t32.971199\n7143469\t5\t6.6\t163\t94.442467\t84.971199\n7143470\t5\t6.64\t267\t302.33621\t563.38397\n7143471\t5\t6.68\t344\t495.42938\t1114.4032\n7143472\t5\t6.72\t302\t399.29959\t866.32159\n7143473\t5\t6.76\t180\t106.47968\t94.809601\n7143474\t5\t6.8\t144\t64.892883\t41.603199\n7208968\t5.04\t5.12\t186\t68.448418\t33.913601\n7208969\t5.04\t5.16\t210\t88.598213\t57.796799\n7208970\t5.04\t5.2\t216\t95.460991\t70.734398\n7208971\t5.04\t5.24\t221\t99.247009\t76.7136\n7208972\t5.04\t5.28\t181\t54.241177\t24.7472\n7208973\t5.04\t5.32\t170\t44.713936\t16.280001\n7208974\t5.04\t5.36\t162\t41.733135\t14.7968\n7208975\t5.04\t5.4\t157\t40.557556\t13.8384\n7208976\t5.04\t5.44\t150\t39.606411\t13.1008\n7208977\t5.04\t5.48\t148\t42.008072\t14.4656\n7274504\t5.08\t5.12\t178\t65.381821\t31.8368\n7274505\t5.08\t5.16\t204\t88.90271\t60.107201\n7274506\t5.08\t5.2\t211\t96.756683\t74.345596\n7274507\t5.08\t5.24\t218\t102.59463\t82.335999\n7274508\t5.08\t5.28\t182\t60.685886\t32.502399\n7274509\t5.08\t5.32\t168\t47.817688\t19.2288\n7274510\t5.08\t5.36\t161\t44.476276\t17.096001\n7274511\t5.08\t5.4\t155\t42.468616\t15.5856\n7274512\t5.08\t5.44\t149\t41.282612\t14.3184\n7274513\t5.08\t5.48\t149\t44.779373\t16.417601\n7340040\t5.12\t5.12\t176\t67.550606\t34.030399\n7340041\t5.12\t5.16\t202\t92.958344\t65.968002\n7340042\t5.12\t5.2\t208\t100.16633\t79.643204\n7340043\t5.12\t5.24\t217\t106.7597\t87.222397\n7340044\t5.12\t5.28\t179\t66.32412\t40.952\n7340045\t5.12\t5.32\t166\t50.768524\t21.846399\n7340046\t5.12\t5.36\t161\t48.456814\t20.256001\n7340047\t5.12\t5.4\t155\t46.412476\t18.7952\n7340048\t5.12\t5.44\t152\t46.928383\t18.7904\n7340049\t5.12\t5.48\t150\t48.432838\t19.1696\n7405576\t5.16\t5.12\t175\t71.363174\t37.822399\n7405577\t5.16\t5.16\t203\t100.44492\t75.209602\n7405578\t5.16\t5.2\t208\t106.25475\t86.979202\n7405579\t5.16\t5.24\t211\t109.9676\t93.344002\n7405580\t5.16\t5.28\t178\t70.961754\t45.743999\n7405581\t5.16\t5.32\t162\t52.822296\t23.739201\n7405582\t5.16\t5.36\t161\t52.753807\t23.452801\n7405583\t5.16\t5.4\t155\t50.853527\t22.3216\n7405584\t5.16\t5.44\t150\t49.344448\t20.68\n7405585\t5.16\t5.48\t148\t50.383991\t20.6336\n7471112\t5.2\t5.12\t175\t76.092041\t41.928001\n7471113\t5.2\t5.16\t205\t109.62108\t86.564796\n7471114\t5.2\t5.2\t202\t109.21878\t92.599998\n7471115\t5.2\t5.24\t209\t115.41135\t100.6688\n7471116\t5.2\t5.28\t179\t78.552864\t53.811199\n7471117\t5.2\t5.32\t162\t58.598862\t28.823999\n7471118\t5.2\t5.36\t158\t56.123917\t26.478399\n7471119\t5.2\t5.4\t156\t56.065971\t26.128\n7471120\t5.2\t5.44\t153\t56.01944\t25.872\n7471121\t5.2\t5.48\t149\t55.871475\t25.5184\n"
  },
  {
    "path": "testdata/isovists.csv",
    "content": "id,x,y,angle,viewAngle\n1,1.77,6.6,180,60\n2,3.1,5.6,90,90\n"
  },
  {
    "path": "testdata/rooms.dxf",
    "content": "  0\r\nSECTION\r\n  2\r\nHEADER\r\n  9\r\n$ACADVER\r\n  1\r\nAC1032\r\n  9\r\n$ACADMAINTVER\r\n 90\r\n       29\r\n  9\r\n$DWGCODEPAGE\r\n  3\r\nANSI_1252\r\n  9\r\n$LASTSAVEDBY\r\n  1\r\npetros\r\n  9\r\n$REQUIREDVERSIONS\r\n160\r\n                 0\r\n  9\r\n$INSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$EXTMIN\r\n 10\r\n-2.310064731883713\r\n 20\r\n-1.263672883888023\r\n 30\r\n0.0\r\n  9\r\n$EXTMAX\r\n 10\r\n20.0\r\n 20\r\n11.0\r\n 30\r\n0.0\r\n  9\r\n$LIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$LIMMAX\r\n 10\r\n420.0\r\n 20\r\n297.0\r\n  9\r\n$ORTHOMODE\r\n 70\r\n     0\r\n  9\r\n$REGENMODE\r\n 70\r\n     1\r\n  9\r\n$FILLMODE\r\n 70\r\n     1\r\n  9\r\n$QTEXTMODE\r\n 70\r\n     0\r\n  9\r\n$MIRRTEXT\r\n 70\r\n     0\r\n  9\r\n$LTSCALE\r\n 40\r\n1.0\r\n  9\r\n$ATTMODE\r\n 70\r\n     1\r\n  9\r\n$TEXTSIZE\r\n 40\r\n2.5\r\n  9\r\n$TRACEWID\r\n 40\r\n1.0\r\n  9\r\n$TEXTSTYLE\r\n  7\r\nStandard\r\n  9\r\n$CLAYER\r\n  8\r\n0\r\n  9\r\n$CELTYPE\r\n  6\r\nByLayer\r\n  9\r\n$CECOLOR\r\n 62\r\n   256\r\n  9\r\n$CELTSCALE\r\n 40\r\n1.0\r\n  9\r\n$DISPSILH\r\n 70\r\n     0\r\n  9\r\n$DIMSCALE\r\n 40\r\n1.0\r\n  9\r\n$DIMASZ\r\n 40\r\n2.5\r\n  9\r\n$DIMEXO\r\n 40\r\n0.625\r\n  9\r\n$DIMDLI\r\n 40\r\n3.75\r\n  9\r\n$DIMRND\r\n 40\r\n0.0\r\n  9\r\n$DIMDLE\r\n 40\r\n0.0\r\n  9\r\n$DIMEXE\r\n 40\r\n1.25\r\n  9\r\n$DIMTP\r\n 40\r\n0.0\r\n  9\r\n$DIMTM\r\n 40\r\n0.0\r\n  9\r\n$DIMTXT\r\n 40\r\n2.5\r\n  9\r\n$DIMCEN\r\n 40\r\n2.5\r\n  9\r\n$DIMTSZ\r\n 40\r\n0.0\r\n  9\r\n$DIMTOL\r\n 70\r\n     0\r\n  9\r\n$DIMLIM\r\n 70\r\n     0\r\n  9\r\n$DIMTIH\r\n 70\r\n     0\r\n  9\r\n$DIMTOH\r\n 70\r\n     0\r\n  9\r\n$DIMSE1\r\n 70\r\n     0\r\n  9\r\n$DIMSE2\r\n 70\r\n     0\r\n  9\r\n$DIMTAD\r\n 70\r\n     1\r\n  9\r\n$DIMZIN\r\n 70\r\n     8\r\n  9\r\n$DIMBLK\r\n  1\r\n\r\n  9\r\n$DIMASO\r\n 70\r\n     1\r\n  9\r\n$DIMSHO\r\n 70\r\n     1\r\n  9\r\n$DIMPOST\r\n  1\r\n\r\n  9\r\n$DIMAPOST\r\n  1\r\n\r\n  9\r\n$DIMALT\r\n 70\r\n     0\r\n  9\r\n$DIMALTD\r\n 70\r\n     3\r\n  9\r\n$DIMALTF\r\n 40\r\n0.03937007874016\r\n  9\r\n$DIMLFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMTOFL\r\n 70\r\n     1\r\n  9\r\n$DIMTVP\r\n 40\r\n0.0\r\n  9\r\n$DIMTIX\r\n 70\r\n     0\r\n  9\r\n$DIMSOXD\r\n 70\r\n     0\r\n  9\r\n$DIMSAH\r\n 70\r\n     0\r\n  9\r\n$DIMBLK1\r\n  1\r\n\r\n  9\r\n$DIMBLK2\r\n  1\r\n\r\n  9\r\n$DIMSTYLE\r\n  2\r\nISO-25\r\n  9\r\n$DIMCLRD\r\n 70\r\n     0\r\n  9\r\n$DIMCLRE\r\n 70\r\n     0\r\n  9\r\n$DIMCLRT\r\n 70\r\n     0\r\n  9\r\n$DIMTFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMGAP\r\n 40\r\n0.625\r\n  9\r\n$DIMJUST\r\n 70\r\n     0\r\n  9\r\n$DIMSD1\r\n 70\r\n     0\r\n  9\r\n$DIMSD2\r\n 70\r\n     0\r\n  9\r\n$DIMTOLJ\r\n 70\r\n     0\r\n  9\r\n$DIMTZIN\r\n 70\r\n     8\r\n  9\r\n$DIMALTZ\r\n 70\r\n     0\r\n  9\r\n$DIMALTTZ\r\n 70\r\n     0\r\n  9\r\n$DIMUPT\r\n 70\r\n     0\r\n  9\r\n$DIMDEC\r\n 70\r\n     2\r\n  9\r\n$DIMTDEC\r\n 70\r\n     2\r\n  9\r\n$DIMALTU\r\n 70\r\n     2\r\n  9\r\n$DIMALTTD\r\n 70\r\n     3\r\n  9\r\n$DIMTXSTY\r\n  7\r\nStandard\r\n  9\r\n$DIMAUNIT\r\n 70\r\n     0\r\n  9\r\n$DIMADEC\r\n 70\r\n     0\r\n  9\r\n$DIMALTRND\r\n 40\r\n0.0\r\n  9\r\n$DIMAZIN\r\n 70\r\n     0\r\n  9\r\n$DIMDSEP\r\n 70\r\n    44\r\n  9\r\n$DIMATFIT\r\n 70\r\n     3\r\n  9\r\n$DIMFRAC\r\n 70\r\n     0\r\n  9\r\n$DIMLDRBLK\r\n  1\r\n\r\n  9\r\n$DIMLUNIT\r\n 70\r\n     2\r\n  9\r\n$DIMLWD\r\n 70\r\n    -2\r\n  9\r\n$DIMLWE\r\n 70\r\n    -2\r\n  9\r\n$DIMTMOVE\r\n 70\r\n     0\r\n  9\r\n$DIMFXL\r\n 40\r\n1.0\r\n  9\r\n$DIMFXLON\r\n 70\r\n     0\r\n  9\r\n$DIMJOGANG\r\n 40\r\n0.7853981633974483\r\n  9\r\n$DIMTFILL\r\n 70\r\n     0\r\n  9\r\n$DIMTFILLCLR\r\n 70\r\n     0\r\n  9\r\n$DIMARCSYM\r\n 70\r\n     0\r\n  9\r\n$DIMLTYPE\r\n  6\r\n\r\n  9\r\n$DIMLTEX1\r\n  6\r\n\r\n  9\r\n$DIMLTEX2\r\n  6\r\n\r\n  9\r\n$DIMTXTDIRECTION\r\n 70\r\n     0\r\n  9\r\n$LUNITS\r\n 70\r\n     2\r\n  9\r\n$LUPREC\r\n 70\r\n     4\r\n  9\r\n$SKETCHINC\r\n 40\r\n1.0\r\n  9\r\n$FILLETRAD\r\n 40\r\n0.0\r\n  9\r\n$AUNITS\r\n 70\r\n     0\r\n  9\r\n$AUPREC\r\n 70\r\n     0\r\n  9\r\n$MENU\r\n  1\r\n.\r\n  9\r\n$ELEVATION\r\n 40\r\n0.0\r\n  9\r\n$PELEVATION\r\n 40\r\n0.0\r\n  9\r\n$THICKNESS\r\n 40\r\n0.0\r\n  9\r\n$LIMCHECK\r\n 70\r\n     0\r\n  9\r\n$CHAMFERA\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERB\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERC\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERD\r\n 40\r\n0.0\r\n  9\r\n$SKPOLY\r\n 70\r\n     0\r\n  9\r\n$TDCREATE\r\n 40\r\n2459008.008020833\r\n  9\r\n$TDUCREATE\r\n 40\r\n2459007.883020833\r\n  9\r\n$TDUPDATE\r\n 40\r\n2459008.016388889\r\n  9\r\n$TDUUPDATE\r\n 40\r\n2459007.891388889\r\n  9\r\n$TDINDWG\r\n 40\r\n0.0083680556\r\n  9\r\n$TDUSRTIMER\r\n 40\r\n0.0083680556\r\n  9\r\n$USRTIMER\r\n 70\r\n     1\r\n  9\r\n$ANGBASE\r\n 50\r\n0.0\r\n  9\r\n$ANGDIR\r\n 70\r\n     0\r\n  9\r\n$PDMODE\r\n 70\r\n     0\r\n  9\r\n$PDSIZE\r\n 40\r\n0.0\r\n  9\r\n$PLINEWID\r\n 40\r\n0.0\r\n  9\r\n$SPLFRAME\r\n 70\r\n     0\r\n  9\r\n$SPLINETYPE\r\n 70\r\n     6\r\n  9\r\n$SPLINESEGS\r\n 70\r\n     8\r\n  9\r\n$HANDSEED\r\n  5\r\n2BC\r\n  9\r\n$SURFTAB1\r\n 70\r\n     6\r\n  9\r\n$SURFTAB2\r\n 70\r\n     6\r\n  9\r\n$SURFTYPE\r\n 70\r\n     6\r\n  9\r\n$SURFU\r\n 70\r\n     6\r\n  9\r\n$SURFV\r\n 70\r\n     6\r\n  9\r\n$UCSBASE\r\n  2\r\n\r\n  9\r\n$UCSNAME\r\n  2\r\n\r\n  9\r\n$UCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORTHOREF\r\n  2\r\n\r\n  9\r\n$UCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$UCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSBASE\r\n  2\r\n\r\n  9\r\n$PUCSNAME\r\n  2\r\n\r\n  9\r\n$PUCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORTHOREF\r\n  2\r\n\r\n  9\r\n$PUCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$PUCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$USERI1\r\n 70\r\n     0\r\n  9\r\n$USERI2\r\n 70\r\n     0\r\n  9\r\n$USERI3\r\n 70\r\n     0\r\n  9\r\n$USERI4\r\n 70\r\n     0\r\n  9\r\n$USERI5\r\n 70\r\n     0\r\n  9\r\n$USERR1\r\n 40\r\n0.0\r\n  9\r\n$USERR2\r\n 40\r\n0.0\r\n  9\r\n$USERR3\r\n 40\r\n0.0\r\n  9\r\n$USERR4\r\n 40\r\n0.0\r\n  9\r\n$USERR5\r\n 40\r\n0.0\r\n  9\r\n$WORLDVIEW\r\n 70\r\n     1\r\n  9\r\n$SHADEDGE\r\n 70\r\n     3\r\n  9\r\n$SHADEDIF\r\n 70\r\n    70\r\n  9\r\n$TILEMODE\r\n 70\r\n     1\r\n  9\r\n$MAXACTVP\r\n 70\r\n    64\r\n  9\r\n$PINSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMCHECK\r\n 70\r\n     0\r\n  9\r\n$PEXTMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PEXTMAX\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$PLIMMAX\r\n 10\r\n12.0\r\n 20\r\n9.0\r\n  9\r\n$UNITMODE\r\n 70\r\n     0\r\n  9\r\n$VISRETAIN\r\n 70\r\n     1\r\n  9\r\n$PLINEGEN\r\n 70\r\n     0\r\n  9\r\n$PSLTSCALE\r\n 70\r\n     1\r\n  9\r\n$TREEDEPTH\r\n 70\r\n  3020\r\n  9\r\n$CMLSTYLE\r\n  2\r\nStandard\r\n  9\r\n$CMLJUST\r\n 70\r\n     0\r\n  9\r\n$CMLSCALE\r\n 40\r\n20.0\r\n  9\r\n$PROXYGRAPHICS\r\n 70\r\n     1\r\n  9\r\n$MEASUREMENT\r\n 70\r\n     1\r\n  9\r\n$CELWEIGHT\r\n370\r\n    -1\r\n  9\r\n$ENDCAPS\r\n280\r\n     0\r\n  9\r\n$JOINSTYLE\r\n280\r\n     0\r\n  9\r\n$LWDISPLAY\r\n290\r\n     0\r\n  9\r\n$INSUNITS\r\n 70\r\n     4\r\n  9\r\n$HYPERLINKBASE\r\n  1\r\n\r\n  9\r\n$STYLESHEET\r\n  1\r\n\r\n  9\r\n$XEDIT\r\n290\r\n     1\r\n  9\r\n$CEPSNTYPE\r\n380\r\n     0\r\n  9\r\n$PSTYLEMODE\r\n290\r\n     1\r\n  9\r\n$FINGERPRINTGUID\r\n  2\r\n{BC3393AD-5A4F-A848-A35A-79F4AADFFA65}\r\n  9\r\n$VERSIONGUID\r\n  2\r\n{AD94D4D6-9452-9646-8FBB-DD3C75F1AFBD}\r\n  9\r\n$EXTNAMES\r\n290\r\n     1\r\n  9\r\n$PSVPSCALE\r\n 40\r\n0.0\r\n  9\r\n$OLESTARTUP\r\n290\r\n     0\r\n  9\r\n$SORTENTS\r\n280\r\n   127\r\n  9\r\n$INDEXCTL\r\n280\r\n     0\r\n  9\r\n$HIDETEXT\r\n280\r\n     1\r\n  9\r\n$XCLIPFRAME\r\n280\r\n     2\r\n  9\r\n$HALOGAP\r\n280\r\n     0\r\n  9\r\n$OBSCOLOR\r\n 70\r\n   257\r\n  9\r\n$OBSLTYPE\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONDISPLAY\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONCOLOR\r\n 70\r\n   257\r\n  9\r\n$DIMASSOC\r\n280\r\n     2\r\n  9\r\n$PROJECTNAME\r\n  1\r\n\r\n  9\r\n$CAMERADISPLAY\r\n290\r\n     0\r\n  9\r\n$LENSLENGTH\r\n 40\r\n50.0\r\n  9\r\n$CAMERAHEIGHT\r\n 40\r\n0.0\r\n  9\r\n$STEPSPERSEC\r\n 40\r\n2.0\r\n  9\r\n$STEPSIZE\r\n 40\r\n6.0\r\n  9\r\n$3DDWFPREC\r\n 40\r\n2.0\r\n  9\r\n$PSOLWIDTH\r\n 40\r\n5.0\r\n  9\r\n$PSOLHEIGHT\r\n 40\r\n80.0\r\n  9\r\n$LOFTANG1\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTANG2\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTMAG1\r\n 40\r\n0.0\r\n  9\r\n$LOFTMAG2\r\n 40\r\n0.0\r\n  9\r\n$LOFTPARAM\r\n 70\r\n     7\r\n  9\r\n$LOFTNORMALS\r\n280\r\n     1\r\n  9\r\n$LATITUDE\r\n 40\r\n37.795\r\n  9\r\n$LONGITUDE\r\n 40\r\n-122.394\r\n  9\r\n$NORTHDIRECTION\r\n 40\r\n0.0\r\n  9\r\n$TIMEZONE\r\n 70\r\n -8000\r\n  9\r\n$LIGHTGLYPHDISPLAY\r\n280\r\n     1\r\n  9\r\n$TILEMODELIGHTSYNCH\r\n280\r\n     1\r\n  9\r\n$CMATERIAL\r\n347\r\nEC\r\n  9\r\n$SOLIDHIST\r\n280\r\n     0\r\n  9\r\n$SHOWHIST\r\n280\r\n     1\r\n  9\r\n$DWFFRAME\r\n280\r\n     2\r\n  9\r\n$DGNFRAME\r\n280\r\n     0\r\n  9\r\n$REALWORLDSCALE\r\n290\r\n     1\r\n  9\r\n$INTERFERECOLOR\r\n 62\r\n     1\r\n  9\r\n$INTERFEREOBJVS\r\n345\r\nF9\r\n  9\r\n$INTERFEREVPVS\r\n346\r\nF6\r\n  9\r\n$CSHADOW\r\n280\r\n     0\r\n  9\r\n$SHADOWPLANELOCATION\r\n 40\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nCLASSES\r\n  0\r\nCLASS\r\n  1\r\nACDBDICTIONARYWDFLT\r\n  2\r\nAcDbDictionaryWithDefault\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nDICTIONARYVAR\r\n  2\r\nAcDbDictionaryVar\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n       11\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nTABLESTYLE\r\n  2\r\nAcDbTableStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMATERIAL\r\n  2\r\nAcDbMaterial\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nVISUALSTYLE\r\n  2\r\nAcDbVisualStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n       24\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSCALE\r\n  2\r\nAcDbScale\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n       17\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMLEADERSTYLE\r\n  2\r\nAcDbMLeaderStyle\r\n  3\r\nACDB_MLEADERSTYLE_CLASS\r\n 90\r\n     4095\r\n 91\r\n        2\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nCELLSTYLEMAP\r\n  2\r\nAcDbCellStyleMap\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1152\r\n 91\r\n        2\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nEXACXREFPANELOBJECT\r\n  2\r\nExAcXREFPanelObject\r\n  3\r\nEXAC_ESW\r\n 90\r\n     1025\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nNPOCOLLECTION\r\n  2\r\nAcDbImpNonPersistentObjectsCollection\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nLAYER_INDEX\r\n  2\r\nAcDbLayerIndex\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSPATIAL_INDEX\r\n  2\r\nAcDbSpatialIndex\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nIDBUFFER\r\n  2\r\nAcDbIdBuffer\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBSECTIONVIEWSTYLE\r\n  2\r\nAcDbSectionViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBDETAILVIEWSTYLE\r\n  2\r\nAcDbDetailViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSORTENTSTABLE\r\n  2\r\nAcDbSortentsTable\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nTABLES\r\n  0\r\nTABLE\r\n  2\r\nVPORT\r\n  5\r\n8\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nVPORT\r\n  5\r\nEA\r\n330\r\n8\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbViewportTableRecord\r\n  2\r\n*Active\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n1.0\r\n 12\r\n8.2397260662309\r\n 22\r\n3.866729587880248\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 14\r\n10.0\r\n 24\r\n10.0\r\n 15\r\n10.0\r\n 25\r\n10.0\r\n 16\r\n0.0\r\n 26\r\n0.0\r\n 36\r\n1.0\r\n 17\r\n0.0\r\n 27\r\n0.0\r\n 37\r\n0.0\r\n 40\r\n17.36427794278347\r\n 41\r\n1.188055908513341\r\n 42\r\n50.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 50\r\n0.0\r\n 51\r\n0.0\r\n 71\r\n     0\r\n 72\r\n  1000\r\n 73\r\n     1\r\n 74\r\n     3\r\n 75\r\n     0\r\n 76\r\n     1\r\n 77\r\n     0\r\n 78\r\n     0\r\n281\r\n     0\r\n 65\r\n     1\r\n110\r\n0.0\r\n120\r\n0.0\r\n130\r\n0.0\r\n111\r\n1.0\r\n121\r\n0.0\r\n131\r\n0.0\r\n112\r\n0.0\r\n122\r\n1.0\r\n132\r\n0.0\r\n 79\r\n     0\r\n146\r\n0.0\r\n348\r\nF5\r\n 60\r\n     3\r\n 61\r\n     5\r\n292\r\n     1\r\n282\r\n     1\r\n141\r\n0.0\r\n142\r\n0.0\r\n 63\r\n   250\r\n421\r\n  3355443\r\n1001\r\nACAD_NAV_VCDISPLAY\r\n1070\r\n     3\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLTYPE\r\n  5\r\n5\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nLTYPE\r\n  5\r\n14\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByBlock\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n15\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByLayer\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n16\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nContinuous\r\n 70\r\n     0\r\n  3\r\nSolid line\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLAYER\r\n  5\r\n2\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1FF\r\n102\r\n}\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nLAYER\r\n  5\r\n10\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n13C\r\n102\r\n}\r\n330\r\n2\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLayerTableRecord\r\n  2\r\n0\r\n 70\r\n     0\r\n 62\r\n     7\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n390\r\nF\r\n347\r\nEE\r\n348\r\n0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nSTYLE\r\n  5\r\n3\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nSTYLE\r\n  5\r\n11\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n2.5\r\n  3\r\narial.ttf\r\n  4\r\n\r\n1001\r\nACAD\r\n1000\r\nArial\r\n1071\r\n       34\r\n  0\r\nSTYLE\r\n  5\r\n132\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n2.5\r\n  3\r\narial.ttf\r\n  4\r\n\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n1001\r\nACAD\r\n1000\r\nArial\r\n1071\r\n       34\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nVIEW\r\n  5\r\n6\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nUCS\r\n  5\r\n7\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nAPPID\r\n  5\r\n9\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     8\r\n  0\r\nAPPID\r\n  5\r\n12\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n9E\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_PSEXT\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n133\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nAcadAnnoPO\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n134\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nAcadAnnotative\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n135\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_DSTYLE_DIMJAG\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n136\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_DSTYLE_DIMTALN\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n165\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_MLEADERVER\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n217\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_NAV_VCDISPLAY\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nDIMSTYLE\r\n  5\r\nA\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     3\r\n100\r\nAcDbDimStyleTable\r\n 71\r\n     2\r\n340\r\n27\r\n340\r\n137\r\n  0\r\nDIMSTYLE\r\n105\r\n1B0\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n340\r\n11\r\n  0\r\nDIMSTYLE\r\n105\r\n137\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n2.5\r\n 42\r\n0.625\r\n 43\r\n3.75\r\n 44\r\n1.25\r\n 73\r\n     0\r\n 74\r\n     0\r\n 77\r\n     1\r\n 78\r\n     8\r\n140\r\n2.5\r\n141\r\n2.5\r\n143\r\n0.03937007874016\r\n147\r\n0.625\r\n171\r\n     3\r\n172\r\n     1\r\n271\r\n     2\r\n272\r\n     2\r\n274\r\n     3\r\n278\r\n    44\r\n283\r\n     0\r\n284\r\n     8\r\n340\r\n11\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n1001\r\nACAD_DSTYLE_DIMJAG\r\n1070\r\n   388\r\n1040\r\n1.5\r\n1001\r\nACAD_DSTYLE_DIMTALN\r\n1070\r\n   392\r\n1070\r\n     0\r\n  0\r\nDIMSTYLE\r\n105\r\n27\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nISO-25\r\n 70\r\n     0\r\n 41\r\n2.5\r\n 42\r\n0.625\r\n 43\r\n3.75\r\n 44\r\n1.25\r\n 73\r\n     0\r\n 74\r\n     0\r\n 77\r\n     1\r\n 78\r\n     8\r\n140\r\n2.5\r\n141\r\n2.5\r\n143\r\n0.03937007874016\r\n147\r\n0.625\r\n171\r\n     3\r\n172\r\n     1\r\n271\r\n     2\r\n272\r\n     2\r\n274\r\n     3\r\n278\r\n    44\r\n283\r\n     0\r\n284\r\n     8\r\n340\r\n11\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nBLOCK_RECORD\r\n  5\r\n1\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n1F\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1CE\r\n102\r\n}\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Model_Space\r\n340\r\n22\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\nD2\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space\r\n340\r\nD3\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\nD6\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space0\r\n340\r\nD7\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nBLOCKS\r\n  0\r\nBLOCK\r\n  5\r\n20\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Model_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Model_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n21\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\nD4\r\n330\r\nD2\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\nD5\r\n330\r\nD2\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\nD8\r\n330\r\nD6\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space0\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space0\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\nD9\r\n330\r\nD6\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nENTITIES\r\n  0\r\nLWPOLYLINE\r\n  5\r\n276\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n6.0\r\n 20\r\n11.0\r\n 10\r\n9.0\r\n 20\r\n11.0\r\n  0\r\nLINE\r\n  5\r\n277\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.0\r\n 20\r\n1.000000000000001\r\n 30\r\n0.0\r\n 11\r\n9.0\r\n 21\r\n2.000000000000001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n278\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n11.0\r\n 30\r\n0.0\r\n 11\r\n6.0\r\n 21\r\n10.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n27F\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.0\r\n 20\r\n8.0\r\n 30\r\n0.0\r\n 11\r\n9.0\r\n 21\r\n11.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n280\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.0\r\n 20\r\n3.000000000000001\r\n 30\r\n0.0\r\n 11\r\n9.0\r\n 21\r\n7.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n284\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n9.0\r\n 30\r\n0.0\r\n 11\r\n6.0\r\n 21\r\n6.5\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n285\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.999999999999998\r\n 20\r\n2.0\r\n 30\r\n0.0\r\n 11\r\n5.999999999999998\r\n 21\r\n1.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n289\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n5.5\r\n 30\r\n0.0\r\n 11\r\n5.999999999999999\r\n 21\r\n3.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n293\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.900000000000001\r\n 20\r\n5.5\r\n 30\r\n0.0\r\n 11\r\n5.899999999999999\r\n 21\r\n4.049999999999998\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n294\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.9\r\n 20\r\n9.0\r\n 30\r\n0.0\r\n 11\r\n5.9\r\n 21\r\n8.05\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n295\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.9\r\n 20\r\n11.0\r\n 30\r\n0.0\r\n 11\r\n5.9\r\n 21\r\n10.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n298\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n3.000000000000001\r\n 30\r\n0.0\r\n 11\r\n9.099999999999999\r\n 21\r\n5.95\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n299\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n1.000000000000001\r\n 30\r\n0.0\r\n 11\r\n9.099999999999999\r\n 21\r\n2.000000000000001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29A\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n8.0\r\n 30\r\n0.0\r\n 11\r\n9.099999999999999\r\n 21\r\n11.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29B\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.899999999999999\r\n 20\r\n3.95\r\n 30\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n3.95\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29C\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.9\r\n 20\r\n4.049999999999999\r\n 30\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n4.049999999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29D\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.899999999999999\r\n 20\r\n7.95\r\n 30\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n7.950000000000003\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29E\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.899999999999999\r\n 20\r\n8.05\r\n 30\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n8.050000000000004\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n29F\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n6.049999999999999\r\n 30\r\n0.0\r\n 11\r\n14.0\r\n 21\r\n6.049999999999999\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A0\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n5.95\r\n 30\r\n0.0\r\n 11\r\n14.0\r\n 21\r\n5.95\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A1\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.899999999999998\r\n 20\r\n2.0\r\n 30\r\n0.0\r\n 11\r\n5.899999999999998\r\n 21\r\n1.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A2\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n7.0\r\n 30\r\n0.0\r\n 11\r\n9.0\r\n 21\r\n7.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A3\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n8.0\r\n 30\r\n0.0\r\n 11\r\n9.000000000000001\r\n 21\r\n8.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A4\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n3.000000000000001\r\n 30\r\n0.0\r\n 11\r\n9.0\r\n 21\r\n3.000000000000001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A5\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n2.000000000000001\r\n 30\r\n0.0\r\n 11\r\n9.0\r\n 21\r\n2.000000000000001\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A6\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.999999999999998\r\n 20\r\n2.0\r\n 30\r\n0.0\r\n 11\r\n5.899999999999998\r\n 21\r\n2.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A7\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.999999999999999\r\n 20\r\n3.0\r\n 30\r\n0.0\r\n 11\r\n5.9\r\n 21\r\n3.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A8\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n5.5\r\n 30\r\n0.0\r\n 11\r\n5.900000000000001\r\n 21\r\n5.5\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2A9\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n6.5\r\n 30\r\n0.0\r\n 11\r\n5.899999999999999\r\n 21\r\n6.5\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AB\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n9.0\r\n 30\r\n0.0\r\n 11\r\n5.899999999999999\r\n 21\r\n9.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AC\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n6.0\r\n 20\r\n10.0\r\n 30\r\n0.0\r\n 11\r\n5.9\r\n 21\r\n10.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AD\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.899999999999999\r\n 20\r\n3.95\r\n 30\r\n0.0\r\n 11\r\n5.899999999999999\r\n 21\r\n3.0\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AE\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n5.9\r\n 20\r\n7.95\r\n 30\r\n0.0\r\n 11\r\n5.9\r\n 21\r\n6.5\r\n 31\r\n0.0\r\n  0\r\nLINE\r\n  5\r\n2AF\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbLine\r\n 10\r\n9.099999999999999\r\n 20\r\n6.049999999999999\r\n 30\r\n0.0\r\n 11\r\n9.099999999999999\r\n 21\r\n7.0\r\n 31\r\n0.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n2B0\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n9.099999999999999\r\n 20\r\n11.0\r\n 10\r\n14.0\r\n 20\r\n11.0\r\n 10\r\n14.0\r\n 20\r\n1.0\r\n 10\r\n9.099999999999999\r\n 20\r\n1.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n2B1\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbPolyline\r\n 90\r\n        2\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n9.0\r\n 20\r\n1.0\r\n 10\r\n5.999999999999998\r\n 20\r\n1.0\r\n  0\r\nLWPOLYLINE\r\n  5\r\n2B2\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbPolyline\r\n 90\r\n        4\r\n 70\r\n     0\r\n 43\r\n0.0\r\n 10\r\n5.899999999999998\r\n 20\r\n1.0\r\n 10\r\n1.0\r\n 20\r\n1.0\r\n 10\r\n1.0\r\n 20\r\n11.0\r\n 10\r\n5.900000000000001\r\n 20\r\n11.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nOBJECTS\r\n  0\r\nDICTIONARY\r\n  5\r\nC\r\n330\r\n0\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nACAD_CIP_PREVIOUS_PRODUCT_INFO\r\n350\r\n216\r\n  3\r\nACAD_COLOR\r\n350\r\n6B\r\n  3\r\nACAD_DETAILVIEWSTYLE\r\n350\r\n21B\r\n  3\r\nACAD_GROUP\r\n350\r\nD\r\n  3\r\nACAD_LAYOUT\r\n350\r\n1A\r\n  3\r\nACAD_MATERIAL\r\n350\r\n6A\r\n  3\r\nACAD_MLEADERSTYLE\r\n350\r\n12D\r\n  3\r\nACAD_MLINESTYLE\r\n350\r\n17\r\n  3\r\nACAD_PLOTSETTINGS\r\n350\r\n19\r\n  3\r\nACAD_PLOTSTYLENAME\r\n350\r\nE\r\n  3\r\nACAD_SCALELIST\r\n350\r\n10C\r\n  3\r\nACAD_SECTIONVIEWSTYLE\r\n350\r\n219\r\n  3\r\nACAD_TABLESTYLE\r\n350\r\n7E\r\n  3\r\nACAD_VISUALSTYLE\r\n350\r\nEF\r\n  3\r\nACDB_RECOMPOSE_DATA\r\n350\r\n2BB\r\n  3\r\nAcDbVariableDictionary\r\n350\r\n5E\r\n  0\r\nDICTIONARY\r\n  5\r\n1FF\r\n330\r\n2\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_LAYERSTATES\r\n360\r\n200\r\n  0\r\nDICTIONARY\r\n  5\r\n13C\r\n330\r\n10\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n1CE\r\n330\r\n1F\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_SORTENTS\r\n360\r\n27B\r\n  0\r\nXRECORD\r\n  5\r\n216\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n300\r\nACDMAC\r\n300\r\n2018\r\n300\r\nACDMAC_F_S\r\n  0\r\nDICTIONARY\r\n  5\r\n6B\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n21B\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nMetric50\r\n350\r\n21C\r\n  0\r\nDICTIONARY\r\n  5\r\nD\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n1A\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nLayout1\r\n350\r\nD3\r\n  3\r\nLayout2\r\n350\r\nD7\r\n  3\r\nModel\r\n350\r\n22\r\n  0\r\nDICTIONARY\r\n  5\r\n6A\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nByBlock\r\n350\r\nED\r\n  3\r\nByLayer\r\n350\r\nEC\r\n  3\r\nGlobal\r\n350\r\nEE\r\n  0\r\nDICTIONARY\r\n  5\r\n12D\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nAnnotative\r\n350\r\n13B\r\n  3\r\nStandard\r\n350\r\n12E\r\n  0\r\nDICTIONARY\r\n  5\r\n17\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n18\r\n  0\r\nDICTIONARY\r\n  5\r\n19\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nACDBDICTIONARYWDFLT\r\n  5\r\nE\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nNormal\r\n350\r\nF\r\n100\r\nAcDbDictionaryWithDefault\r\n340\r\nF\r\n  0\r\nDICTIONARY\r\n  5\r\n10C\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nA0\r\n350\r\n10D\r\n  3\r\nA1\r\n350\r\n1BE\r\n  3\r\nA2\r\n350\r\n1BF\r\n  3\r\nA3\r\n350\r\n1C0\r\n  3\r\nA4\r\n350\r\n1C1\r\n  3\r\nA5\r\n350\r\n1C2\r\n  3\r\nA6\r\n350\r\n1C3\r\n  3\r\nA7\r\n350\r\n1C4\r\n  3\r\nA8\r\n350\r\n1C5\r\n  3\r\nA9\r\n350\r\n1C6\r\n  3\r\nB0\r\n350\r\n1C7\r\n  3\r\nB1\r\n350\r\n1C8\r\n  3\r\nB2\r\n350\r\n1C9\r\n  3\r\nB3\r\n350\r\n1CA\r\n  3\r\nB4\r\n350\r\n1CB\r\n  3\r\nB5\r\n350\r\n1CC\r\n  3\r\nB6\r\n350\r\n1CD\r\n  0\r\nDICTIONARY\r\n  5\r\n219\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nMetric50\r\n350\r\n21A\r\n  0\r\nDICTIONARY\r\n  5\r\n7E\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n7F\r\n  0\r\nDICTIONARY\r\n  5\r\nEF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n2dWireframe\r\n350\r\nF5\r\n  3\r\nBasic\r\n350\r\nF4\r\n  3\r\nBrighten\r\n350\r\nFB\r\n  3\r\nColorChange\r\n350\r\nFF\r\n  3\r\nConceptual\r\n350\r\nF8\r\n  3\r\nDim\r\n350\r\nFA\r\n  3\r\nEdgeColorOff\r\n350\r\n1E6\r\n  3\r\nFacepattern\r\n350\r\nFE\r\n  3\r\nFlat\r\n350\r\nF0\r\n  3\r\nFlatWithEdges\r\n350\r\nF1\r\n  3\r\nGouraud\r\n350\r\nF2\r\n  3\r\nGouraudWithEdges\r\n350\r\nF3\r\n  3\r\nHidden\r\n350\r\nF7\r\n  3\r\nJitterOff\r\n350\r\n1E4\r\n  3\r\nLinepattern\r\n350\r\nFD\r\n  3\r\nOverhangOff\r\n350\r\n1E5\r\n  3\r\nRealistic\r\n350\r\nF9\r\n  3\r\nShaded\r\n350\r\n1F3\r\n  3\r\nShaded with edges\r\n350\r\n1F2\r\n  3\r\nShades of Gray\r\n350\r\n1EF\r\n  3\r\nSketchy\r\n350\r\n1F0\r\n  3\r\nThicken\r\n350\r\nFC\r\n  3\r\nWireframe\r\n350\r\nF6\r\n  3\r\nX-Ray\r\n350\r\n1F1\r\n  0\r\nXRECORD\r\n  5\r\n2BB\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 90\r\n        1\r\n330\r\n7F\r\n  0\r\nDICTIONARY\r\n  5\r\n5E\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nCANNOSCALE\r\n350\r\n146\r\n  3\r\nCENTEREXE\r\n350\r\n259\r\n  3\r\nCENTERLTYPEFILE\r\n350\r\n25A\r\n  3\r\nCMLEADERSTYLE\r\n350\r\n145\r\n  3\r\nCTABLESTYLE\r\n350\r\n84\r\n  3\r\nCVIEWDETAILSTYLE\r\n350\r\n227\r\n  3\r\nCVIEWSECTIONSTYLE\r\n350\r\n228\r\n  3\r\nDIMASSOC\r\n350\r\n5F\r\n  3\r\nHIDETEXT\r\n350\r\n63\r\n  3\r\nLAYEREVAL\r\n350\r\n1AE\r\n  3\r\nLAYERNOTIFY\r\n350\r\n1AF\r\n  0\r\nDICTIONARY\r\n  5\r\n200\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1FF\r\n102\r\n}\r\n330\r\n1FF\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nSORTENTSTABLE\r\n  5\r\n27B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1CE\r\n102\r\n}\r\n330\r\n1CE\r\n100\r\nAcDbSortentsTable\r\n330\r\n1F\r\n331\r\n2A6\r\n  5\r\n2AD\r\n331\r\n280\r\n  5\r\n282\r\n331\r\n2AB\r\n  5\r\n2B1\r\n331\r\n2A5\r\n  5\r\n2AC\r\n331\r\n2A4\r\n  5\r\n2AB\r\n331\r\n295\r\n  5\r\n294\r\n331\r\n277\r\n  5\r\n27F\r\n331\r\n2A9\r\n  5\r\n2B0\r\n331\r\n285\r\n  5\r\n2A0\r\n331\r\n294\r\n  5\r\n297\r\n331\r\n276\r\n  5\r\n276\r\n331\r\n2A8\r\n  5\r\n2AF\r\n331\r\n29B\r\n  5\r\n2A5\r\n331\r\n284\r\n  5\r\n295\r\n331\r\n29A\r\n  5\r\n286\r\n331\r\n2AF\r\n  5\r\n284\r\n331\r\n2AE\r\n  5\r\n299\r\n331\r\n299\r\n  5\r\n280\r\n331\r\n2AD\r\n  5\r\n29F\r\n331\r\n289\r\n  5\r\n29C\r\n331\r\n298\r\n  5\r\n283\r\n331\r\n2AC\r\n  5\r\n2B2\r\n331\r\n29F\r\n  5\r\n2A3\r\n331\r\n29E\r\n  5\r\n2A6\r\n331\r\n278\r\n  5\r\n293\r\n331\r\n29D\r\n  5\r\n2A7\r\n331\r\n2B2\r\n  5\r\n27E\r\n331\r\n27F\r\n  5\r\n285\r\n331\r\n29C\r\n  5\r\n2A4\r\n331\r\n2B1\r\n  5\r\n27D\r\n331\r\n2A3\r\n  5\r\n2A9\r\n331\r\n2B0\r\n  5\r\n27C\r\n331\r\n2A2\r\n  5\r\n2A8\r\n331\r\n293\r\n  5\r\n29D\r\n331\r\n2A0\r\n  5\r\n2A2\r\n331\r\n2A7\r\n  5\r\n2AE\r\n  0\r\nACDBDETAILVIEWSTYLE\r\n  5\r\n21C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n21B\r\n102\r\n}\r\n330\r\n21B\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nMetric50\r\n290\r\n     0\r\n300\r\nMetric50\r\n 90\r\n        0\r\n100\r\nAcDbDetailViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n        3\r\n 71\r\n     1\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n5.0\r\n300\r\n\r\n 40\r\n0.0\r\n280\r\n     1\r\n 71\r\n     2\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n 71\r\n     3\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n 90\r\n        0\r\n 40\r\n15.0\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewDetailId>% (%<\\AcVar ViewScale \\f \"%sn\">%)\r\n 71\r\n     4\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n280\r\n     0\r\n  0\r\nLAYOUT\r\n  5\r\nD3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nC:\\Documents and Settings\\basas\\Application Data\\Autodesk\\AutoCAD 2005\\R16.1\\enu\\plotters\\Default Windows System Printer.pc3\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout1\r\n 70\r\n     1\r\n 71\r\n     1\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\nD2\r\n  0\r\nLAYOUT\r\n  5\r\nD7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nC:\\Documents and Settings\\basas\\Application Data\\Autodesk\\AutoCAD 2005\\R16.1\\enu\\plotters\\Default Windows System Printer.pc3\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout2\r\n 70\r\n     1\r\n 71\r\n     2\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\nD6\r\n  0\r\nLAYOUT\r\n  5\r\n22\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n205\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nnone_device\r\n  4\r\nISO_A4_(210.00_x_297.00_MM)\r\n  6\r\n\r\n 40\r\n7.5\r\n 41\r\n20.0\r\n 42\r\n7.5\r\n 43\r\n20.0\r\n 44\r\n210.0\r\n 45\r\n297.0\r\n 46\r\n11.54999923706054\r\n 47\r\n-13.65000009536743\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n8.704084754739808\r\n 70\r\n 11952\r\n 72\r\n     1\r\n 73\r\n     0\r\n 74\r\n     0\r\n  7\r\n\r\n 75\r\n     0\r\n147\r\n0.1148885871608098\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nModel\r\n 70\r\n     1\r\n 71\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n1F\r\n331\r\nEA\r\n1001\r\nACAD_PSEXT\r\n1000\r\nNone\r\n1000\r\nNone\r\n1000\r\nNot applicable\r\n1000\r\nThe layout will not be plotted unless a new plotter configuration name is selected.\r\n1070\r\n     0\r\n  0\r\nMATERIAL\r\n  5\r\nED\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1F9\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n6A\r\n102\r\n}\r\n330\r\n6A\r\n100\r\nAcDbMaterial\r\n  1\r\nByBlock\r\n 94\r\n       63\r\n  0\r\nMATERIAL\r\n  5\r\nEC\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1F7\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n6A\r\n102\r\n}\r\n330\r\n6A\r\n100\r\nAcDbMaterial\r\n  1\r\nByLayer\r\n 94\r\n       63\r\n  0\r\nMATERIAL\r\n  5\r\nEE\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n173\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n6A\r\n102\r\n}\r\n330\r\n6A\r\n100\r\nAcDbMaterial\r\n  1\r\nGlobal\r\n 43\r\n0.0007999999797903\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0007999999797903\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 49\r\n0.0007999999797903\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0007999999797903\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n142\r\n0.0007999999797903\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0007999999797903\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n144\r\n0.0007999999797903\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0007999999797903\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n 94\r\n       63\r\n1001\r\nACAD\r\n1070\r\n    -1\r\n1070\r\n     3\r\n1070\r\n     0\r\n1000\r\n\r\n1071\r\n        0\r\n1070\r\n     0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n13B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12D\r\n102\r\n}\r\n330\r\n12D\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n14\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n2.0\r\n291\r\n     1\r\n 43\r\n8.0\r\n  3\r\nStandard\r\n 44\r\n4.0\r\n300\r\n\r\n342\r\n11\r\n174\r\n     1\r\n178\r\n     1\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n4.0\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n4.0\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     1\r\n143\r\n3.75\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n12E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12D\r\n102\r\n}\r\n330\r\n12D\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n14\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n2.0\r\n291\r\n     1\r\n 43\r\n8.0\r\n  3\r\nStandard\r\n 44\r\n4.0\r\n300\r\n\r\n342\r\n11\r\n174\r\n     1\r\n178\r\n     1\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n4.0\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n4.0\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     0\r\n143\r\n3.75\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLINESTYLE\r\n  5\r\n18\r\n102\r\n{ACAD_REACTORS\r\n330\r\n17\r\n102\r\n}\r\n330\r\n17\r\n100\r\nAcDbMlineStyle\r\n  2\r\nSTANDARD\r\n 70\r\n     0\r\n  3\r\n\r\n 62\r\n   256\r\n 51\r\n90.0\r\n 52\r\n90.0\r\n 71\r\n     2\r\n 49\r\n0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n 49\r\n-0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n  0\r\nACDBPLACEHOLDER\r\n  5\r\nF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nE\r\n102\r\n}\r\n330\r\nE\r\n  0\r\nSCALE\r\n  5\r\n10D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:1\r\n140\r\n1.0\r\n141\r\n1.0\r\n290\r\n     1\r\n  0\r\nSCALE\r\n  5\r\n1BE\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:2\r\n140\r\n1.0\r\n141\r\n2.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1BF\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:4\r\n140\r\n1.0\r\n141\r\n4.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C0\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:5\r\n140\r\n1.0\r\n141\r\n5.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C1\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:8\r\n140\r\n1.0\r\n141\r\n8.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C2\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:10\r\n140\r\n1.0\r\n141\r\n10.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:16\r\n140\r\n1.0\r\n141\r\n16.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:20\r\n140\r\n1.0\r\n141\r\n20.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C5\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:30\r\n140\r\n1.0\r\n141\r\n30.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C6\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:40\r\n140\r\n1.0\r\n141\r\n40.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:50\r\n140\r\n1.0\r\n141\r\n50.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:100\r\n140\r\n1.0\r\n141\r\n100.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C9\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n2:1\r\n140\r\n2.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CA\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n4:1\r\n140\r\n4.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CB\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n8:1\r\n140\r\n8.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CC\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n10:1\r\n140\r\n10.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CD\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n100:1\r\n140\r\n100.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nACDBSECTIONVIEWSTYLE\r\n  5\r\n21A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n219\r\n102\r\n}\r\n330\r\n219\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nMetric50\r\n290\r\n     0\r\n300\r\nMetric50\r\n 90\r\n        0\r\n100\r\nAcDbSectionViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n      102\r\n 71\r\n     1\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n340\r\n0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n5.0\r\n300\r\nI, O, Q, S, X, Z\r\n 40\r\n10.0\r\n 90\r\n        0\r\n 40\r\n2.5\r\n 90\r\n        0\r\n 71\r\n     2\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n16\r\n 90\r\n       50\r\n 62\r\n   256\r\n 40\r\n5.0\r\n 40\r\n2.5\r\n 40\r\n5.0\r\n 71\r\n     3\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n 90\r\n        0\r\n 40\r\n15.0\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewSectionStartId>%-%<\\AcVar ViewSectionEndId>% (%<\\AcVar ViewScale \\f \"%sn\">%)\r\n 71\r\n     4\r\n 62\r\n   256\r\n 62\r\n   257\r\n300\r\nANSI31\r\n 40\r\n1.0\r\n 90\r\n        0\r\n290\r\n     0\r\n290\r\n     0\r\n 90\r\n        6\r\n 40\r\n0.0\r\n 40\r\n1.570796326794896\r\n 40\r\n0.2617993877991494\r\n 40\r\n1.308996938995747\r\n 40\r\n-0.2617993877991494\r\n 40\r\n1.832595714594046\r\n  0\r\nTABLESTYLE\r\n  5\r\n7F\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n162\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n7E\r\n102\r\n}\r\n330\r\n7E\r\n100\r\nAcDbTableStyle\r\n280\r\n     0\r\n  3\r\nStandard\r\n 70\r\n     0\r\n 71\r\n     0\r\n 40\r\n1.5\r\n 41\r\n1.5\r\n280\r\n     0\r\n281\r\n     0\r\n  7\r\nStandard\r\n140\r\n4.5\r\n170\r\n     2\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n6.0\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n4.5\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF5\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\n2dWireframe\r\n 70\r\n     4\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF4\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBasic\r\n 70\r\n     7\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFB\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBrighten\r\n 70\r\n    12\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nColorChange\r\n 70\r\n    16\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF8\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nConceptual\r\n 70\r\n     9\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFA\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nDim\r\n 70\r\n    11\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n-50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1E6\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nEdgeColorOff\r\n 70\r\n    22\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        8\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFE\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFacepattern\r\n 70\r\n    15\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF0\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlat\r\n 70\r\n     0\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF1\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlatWithEdges\r\n 70\r\n     1\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF2\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraud\r\n 70\r\n     2\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF3\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraudWithEdges\r\n 70\r\n     3\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF7\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nHidden\r\n 70\r\n     6\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1E4\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nJitterOff\r\n 70\r\n    20\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n       10\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFD\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nLinepattern\r\n 70\r\n    14\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1E5\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nOverhangOff\r\n 70\r\n    21\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        9\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF9\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nRealistic\r\n 70\r\n     8\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F3\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded\r\n 70\r\n    27\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  7895160\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F2\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded with edges\r\n 70\r\n    26\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1EF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShades of Gray\r\n 70\r\n    23\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F0\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nSketchy\r\n 70\r\n    24\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n       11\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFC\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nThicken\r\n 70\r\n    13\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n       12\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF6\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nWireframe\r\n 70\r\n     5\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F1\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nX-Ray\r\n 70\r\n    25\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.5\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n146\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1:1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n259\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n3.500000\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n25A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nacadiso.lin\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n145\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n84\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n227\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nMetric50\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n228\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nMetric50\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n2\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n63\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n1AE\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n1AF\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARY\r\n  5\r\n205\r\n330\r\n22\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n1F9\r\n330\r\nED\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nFBXASSET\r\n360\r\n1FA\r\n  0\r\nDICTIONARY\r\n  5\r\n1F7\r\n330\r\nEC\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nFBXASSET\r\n360\r\n1F8\r\n  0\r\nDICTIONARY\r\n  5\r\n173\r\n330\r\nEE\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n175\r\n  3\r\nDIFFUSETILE\r\n360\r\n174\r\n  3\r\nFBXASSET\r\n360\r\n1FB\r\n  3\r\nOPACITYTILE\r\n360\r\n176\r\n  3\r\nREFLECTIONTILE\r\n360\r\n177\r\n  0\r\nDICTIONARY\r\n  5\r\n162\r\n330\r\n7F\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP\r\n360\r\n2BA\r\n  0\r\nXRECORD\r\n  5\r\n1FA\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1F9\r\n102\r\n}\r\n330\r\n1F9\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 70\r\n     1\r\n 90\r\n429727718\r\n  1\r\nD62C5603-E3A1-4AEA-B7FB-FE5D8D0755AF\r\n310\r\n504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E\r\n310\r\n6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E\r\n310\r\nD98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A\r\n310\r\nEF7053A7E60B504B0304140006080800CC70623B853B8169EB0000007C01000008000000636F72652E786D6C8D90416EC3201045AF62CDB6C206821CC7C244919D9CA01740401C94182C03558F5F9C3852BBEB6A467FFE9B197D7EFC9E1EC5975982F5AE035262288C535E5B377690E21535501C055FBC8FBF6C503839990E\r\n310\r\n5619041F179FE64D52DE45E362569DD7661365082642A11EB9E920A89B99642953CC8E702F67A9EE7234257977194EC9EAE275C4EABCCF5EAD5940D4AC6F0E35A568B8F43562CD7046CD199FD07E60174276A7BE677B5EADB0E0D14EEFFB6A31321A0D82627C4084204C3F096B71DD52F6819B16635EADF63F509AF53FA164\r\n310\r\n5DDCD1EDDD17164090FCC8732078B56691CB33A85CD7DCC40F504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF32603847\r\n310\r\n2BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623BDBABAAF470010000D40300000C0000006662782F636F72652E786D6CC553D16E823014FD95A6AF4B694182CC941A83FA05FB810A9511A125A5257EFE2E82712ECEB8A7F100CD39F7F69E734AF9FADC366850B6\r\n310\r\nAF8DCE7018308C942E4C59EB2AC3DE1D498AD15A706B8CFB56869196ADCAF00863C12B6B7C374385D14E6907A836A59A41D9F7CA615434B0C8705F7CAA5606D23BA8E84F41278B93AC54100640439DE0BDB320004D43C63716C7C399D30917DCFBBA9CD9BA8469F5B156168B24CED3F7248AC8769F27244EB73B92EED8862C\r\n310\r\nB7F13E0C179B3C8F979C8ECD82BBBABDAA2BAC924E9558448CBD9330242CFA08E3154B5651FCC6D215639C8EE5774DBE2B5F6CF2B5768B68963BB5F5588420E442FC700B1139D4CB01F450C1E918227C2E09DF070D8140C84E1E9AAB8F1340832A9CB13130A5F1376A908D57309505ECF2A0DF179C4E9D30F5B239B87E3823\r\n310\r\n7A79C6F31DE1A8A5AEC08474B03C7837EAE4938639B44E5932B833D2C6B6B279CDC613877FA26EE21F4A2A4C63EC7F29A2F301D1F9F7A0E37D145F504B0304140006080800CC70623B9C113CC27E0000009D0000000B0000006662782F636E782E786D6C4DCCDF0A83201C86E15B91DFB94BFB330DD428C8FB886521330DA7\r\n310\r\n6397BF1A1DECE883878F57749FCDA1B7892F1BBC047A23808C7F84D9FA55424E0BE6803A256208E9EF06C84F9B91703228B1C690F78B66B34CD9A5439DF5CF0BFBF65E35BCA1B8D6A5C6F540381E886698B5741C695F9503EBA150A2F8958E3DC3EA0B504B0304140006080800CC70623B7DF2F77C2A010000120200003100\r\n310\r\n00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636F72652E786D6C8D51DB8EC22014FC15C2939B0D2DB4B45643319AE817EC0F6041255A68B86CFCFC856D4D76DF7CE190393373060EDB3DC707F856CE6B6B7A480A0C81328395DA5C7B18C3057510EC3873D686\r\n310\r\n3F34088C18550F330C39BB3A1BA7051AAC09CA84841A2BD5020AEF55806078A44B0FFD7053A328440C89E1EFC52486BBB8AA8214A99D789CF9E05200300FC927E4FB4D5B375D43103D5527440FB843077C5AA3F5861C8F645F5787F59E95B390B318B55CE45AA638FAA2957BD7248B390B7A7CC51F9C124149C82B8C378810\r\n310\r\n84AB2F42B7B8DD56F413775B8C5999E9FF4471926F8AA236A1AE96B8B3CC434E5839373893369E1FAF30EA395917409EB7F26AF8801C171837A4A6AC9C89E9F9C9B1A58BA30FD6A5EF5DDDCF894B9AD9B6A59C957943A9FCAE2FD5BC4DFE03504B0304140006080800CC70623BAD7543B64E01000033030000300000006662\r\n310\r\n782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C789FEE\r\n310\r\n6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5C89177\r\n310\r\n38143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05E20750\r\n310\r\n4B0304140006080800CC70623BE75B7789680500003C100000340000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F6F626A656374732E786D6CAD575B8F9B3818FD2B887D06C22499CB8AA1CA655245D5B455A356FB305264C061D8018C6C3393D95FBFC7600890\r\n310\r\nA4CD5EF210B0B1BFEBF98E3F7B1FF6596ABC522E1296DF9BAE3D320D9A872C4AF2F8DE2CE5CEBA358D0FBEC719939D65A691938CDE9B6ADAF4BD98B3B2D05311DD91329583D9D5FC0F438434A7A611A644887B5384CF34233629258BA878B12322891DEFF6B66BD70BFB62634E8AE781D082709A4B588AF91C528CDA28B73F\r\n310\r\n1C998EEF39EABBEFA97FBD6A7C7E9553F9D3D79FE442923C3C523610337627CB87ABE99D359D4CC6D6E4FACAB5E6ABF9D2726FC6A3C5F56271377BB88362213924694B38DD99FE47C48627A1E7D49F5A8BB5E1A74C0A599ED3B0F21F1E56366B89112D681E218F0915D0D6F17AD41FBA2A369DCF6335D62ABBD39779D5DDD1\r\n310\r\n11D4D8DE3CBB96B2E04FB8202E41051754A1AA8E8F76B4C6DFE810B580B1547F4B84911149794252234D024EF8BBE963A95AE27B3D310A9D5C215C7960FAEE415ED75694C6AFB17BCACA5D99A60A9AA65F217B0BFC53292ACB92BF283FAD0D3621576592CB5BED907C2FA8E9DF794E35E97BEA31BED21FEB401ABB94C44839\r\n310\r\nDCACBF0E1C5DA8DA5B2F4DFFD32AD86F543D9E565E7056502E157C00AD2671CD534549AB752FCA9CDA00677A313F04E51B22FF19E57B300579E3C97EB29F682D92935CEC18CF901B7B54FD8C51F362B56FC72FE0B3C1EAE335EDCCBF5AEC39ADB17DC238973F804BA5E6F6BFE7AF1FB32E523BE9F3BD571418E3631DCA4D48\r\n310\r\n5250CF639223210A9446CA30052EDF057BD35F8329C1ECD84552BF0DC8D18BE7BCE23BFE6BD960AB4A7DE79923A103BEBD80F911CBAA2C60DB19B01CF164A5583B772EE6D3FFA56666CBCDA74DC97724A48F9A58967497E489C4D979006FD7A05E227A1EBDD0F737C623387A9C844D3709995625106D157315F8B8392CD4E0\r\n310\r\nA0B9A720C4BE9829CEF37EA1E13111214D53925356365ADA634861B52519DD27A00AEB808EAF0628E6F435519D446F45CF2C9CF5214F0A15B2F6D06B79DA3EE3CBF7F56780D2F4E7EF73A0F5E5B02A38D07DC852C6B7C1FBB6664213E0C39E3EBA7FF4E1AD23EA2829407C85E586727488B751B2DB9502BC7B228A3FD68B6E\r\n310\r\nA65A22397E690AA8D158D7E404EC8CDA235CC3B7D1898680131CEC2CDF2638C65196279577750F15884AEE19F94199155B92B13297978469D4F8D358DF0AEF7631E28DC8F0D9F437D5D39A83B2231A1D52D543813A824EF8D44BCFF2FA6A31BD1E8DAD87F1CCB526B3879935BF59CDADD5C37479BB1CDD4CA7B3556B516589\r\n310\r\nEF352754B706114D9C885EC9131DE6EFEB43D99AFE2391C2F958179413D7CFEF6B1B6DB1E7600F00DE6E5C67454A339A4BA2E0FBA85ED26F045D454F463DBFCE484C2F90F2E5E3666003662ED8F755951A7D1BECD5B30B550B2785C8E7320B7292A4838DDA71BBC863ED7613CAF659337A3354231D4FF4A182A54904C2898C\r\n310\r\n98B28C4AD0CE056CCF332A80986E571EE9DBC305BB5FEB7E509220A58D25CF042D712A806AC0AD0C657FDEF80D2D9CEAA2EE4D1C76F60BFE74219A06527D6F82DF6412526107381E55E353090704D085B52408A8913C4ED159D79BDA71BB4BC506F4831350EB6F975CD22D69BF7AC49B91A2C0A9DDA3D5CA36AD20FC478E37\r\n310\r\nE61844E2352865EBCB61A275A65283CAAA9DD27703B4102F5AF51EF5F573B75CBB5AD38BC845F7A49F82A0966A49C2E3EA5EA0ECD326CD965F1DB402C6FA8B51A4658C5C5E2EC9E214602E55810345408596591009A82E7E7FFACA19EEA299B14A0081A705CB3296EBC14CDF658DCD336EA6D1136881AAEB87B81AB9EE53D5\r\n310\r\nF5EB8BC8362082DA24122F98680A4E7930C01A0079749CEA14382A0783E5EBA5A10F8C098456A03D6A4AEB6BB881E2513747552A5DB22C7EDAF83BD5528081A365F7FF06504B0304140006080000CC70623B000000000000000000000000350000006662782F41393633353835312D344632462D344230382D423046372D37\r\n310\r\n39314545314133324237412F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F747269616E676C65732E62696E636660600000504B0304140006080000CC7062\r\n310\r\n3B000000000000000000000000370000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F41393633353835312D344632462D344230382D4230\r\n310\r\n46372D3739314545314133324237412F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE6\r\n310\r\n07FB144396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623BEDD1DC58FD000000A00100003B0000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F7265736F75726365732F\r\n310\r\n636F72652E786D6C8D504B6E833010BD0A9A6D65B00922041947112427E8052C33A156828DFCA97AFC9A40A576D7CDCCE87D344F8F9FBFE667F689CE6B6B3A6039850C8DB2A336530731DC4903D95970676DF82583CCC8193B5861107C72362E3BA4AC096842428D1D7107A5F7182053CF7474E0D507CE32973124857FE48B\r\n310\r\n540F3961CEF244279DE03EB81420DB9EAC1384436FA353E879B1B182C7A8C75DA3C7F453DF353A1075D537A7BA6464B8F535A99AE14A9A2BBD90E350DD183B5CFABE3AF262350B1EF4FC9351399401471025A527C218A1E53BAB5A5AB765F5469B96525EACF23FA6B88CFF34456DC2A1DCE36E360F82A5202F42F062ED2BAD\r\n310\r\n579969AFDD8A6F504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B\r\n310\r\n436F6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623B853B8169EB0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000094020000636E782E786D6C504B\r\n310\r\n01021400140006080800CC70623BDBABAAF470010000D40300000C00000000000000000000000000180300006662782F636F72652E786D6C504B01021400140006080800CC70623B9C113CC27E0000009D0000000B00000000000000000000000000B20400006662782F636E782E786D6C504B01021400140006080800CC70\r\n310\r\n623B7DF2F77C2A010000120200003100000000000000000000000000590500006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D2060000\r\n310\r\n6662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636E782E786D6C504B01021400140006080800CC70623BE75B7789680500003C10000034000000000000000000000000006E0800006662782F41393633353835312D344632462D344230382D423046372D3739314545\r\n310\r\n314133324237412F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000280E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F76657274696365732E62696E504B01021400140006\r\n310\r\n080800CC70623BF270F133060000000400000036000000000000000000000000007B0E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F747269616E676C65732E62696E504B01021400140006080000CC70623B0000000000000000000000003700000000000000\r\n310\r\n000000000000D50E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD1900000004101000036000000000000000000000000002A0F00006662782F41393633353835312D344632\r\n310\r\n462D344230382D423046372D3739314545314133324237412F6469726563746F72792E786D6C504B01021400140006080800CC70623BEDD1DC58FD000000A00100003B000000000000000000000000000E1000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F7265\r\n310\r\n736F75726365732F636F72652E786D6C504B0506000000000E000E0080040000641100000000\r\n  0\r\nXRECORD\r\n  5\r\n1F8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1F7\r\n102\r\n}\r\n330\r\n1F7\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 70\r\n     1\r\n 90\r\n429727718\r\n  1\r\n30362254-06B7-45E0-A893-8CFA70E3D6BC\r\n310\r\n504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E\r\n310\r\n6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E\r\n310\r\nD98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A\r\n310\r\nEF7053A7E60B504B0304140006080800CC70623B1EC5D7A3EB0000007C01000008000000636F72652E786D6C8D90416EC3201045AF82665B6103C6756C6122AB4D4ED00B204C5C94182C03558F5F9C3852BBEB6A467FFE9B197D71FC9E6FE8CBACC17AD7032D0820E3B41FAD9B7A48F1820F808E52ACDEC75F36404ECDA687\r\n310\r\n4D0629A6D5A76597B477D1B89855E747B38B2A041301E95B6E7A08FAD3CCAA50296647B8168BD2573599823EBB0CA76447F43862C7BCCF5EAC59410E4DDD9C7973C2755553CCCFA4C603E3040F1565ED3B1FDE4E432BCA0D9622DAF9795FAF464533826484B498524CD807E51D79ED187F21878E10516EF63F505AC67F42C9\r\n310\r\nBA58B1FDDD071640D2FCC87D2045B96591CB3DA85CB7DCE40F504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF32603847\r\n310\r\n2BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623B8C9102E971010000D40300000C0000006662782F636F72652E786D6CC5535B6E833010BC8AE5DF0A6C08340F1947A84D4ED00B38C6A128602363A31CBFCB234A53A551FA553EC09AD9F5CE8C31DB9E9B1AF5CA\r\n310\r\n7695D1198E428A91D2D214952E33ECDD315861B4E5CC1AE3BE9561A445A3323CC098B3D21ADFCE9034DA29ED00D5A6503328BA4E398C640D8B0C77F253352214DE4145770A5B214FA2546114020D759C75CE8200340D19DE981F0F6746269C33EFAB6266AB02A655C74A59CCF365BADC27CB5D902ED22848F6340DF238A141\r\n310\r\nBE88E2F57B92BFEDF23523433367AE6A2EEAA455C2A902F398D2751045018D3FA264435F3771F242571B4A1919CA6F9A7C5B3CD9E42BED16F12C776AEB308F40C848FC700B1139D4891EF410CEC810227CC6846F8386402064270EF5C5C709A05E49676C024C61FC95EA45ED154CA5211D1FF4FB8291A913A68E9B83EBBB33\r\n310\r\nE2A7673CDE118E5AE8124C0807CB8377834E366998436B950D7A7746DAD846D4CFD978E0F04FD455FC5D49D2D4C6FE9722321F10997F0F32DC47FE05504B0304140006080800CC70623BFFEA85907E0000009D0000000B0000006662782F636E782E786D6C4DCCD10A83201886E15B91FFDC95D95A811AB6F23E625948A6C3\r\n310\r\nE9D8E5AF46073BFAE0E1E365ED67B3E8ADC3CB78C7815C7240DA3DFC64DCC221C519D7805AC182F7F1EF06C88D9BE6703008B6049F9E274D7A1E938DBB5AE3D6131B2589BA0D3D965551E0B2EA732C9B9A624AAEB41E3A557677029960D9AFB4EF11165F504B0304140006080800CC70623B4FEEA4082C0100001202000031\r\n310\r\n0000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636F72652E786D6C8D515B6EC32010BC0AE2AB55850DD871ED0813254D72825EC00192A2C460F1A872FC42ED48ED5F7E00CDCECCCEB26C731F6FE05B39AFADE921293004CA082BB5B9F43086336A21D870E6AC\r\n310\r\n0D7F68109861543DCC30E4ECE26C9C164858139409093556AA051CBC570102714B8F1E7AF1A5C6A11862480C7F2DA6415C878B2A4891CA89C7990F2E050073937C42DE1DB7E4F87ED8A36D4329AA9B3D46DBAEAD504556557BD81DEBDD0761E52CE42C462D17B996298E3E6BE59E35C962CE821E1FF18553435012728A7187\r\n310\r\n0841987E927A8D9B35ADDF70BBC6989599FE4F1427F9A4286A132ABAC49D651EF234CD5CE04CDA78BA3DC2A8FB645D00B9DF8B57E215725C60BCA2A463E54C4CE327C7A65E1C7DB02E7DEFCBF594B864C5CA6CDBD49C957943E9FA5D5FBAF336F90F504B0304140006080800CC70623BAD7543B64E01000033030000300000\r\n310\r\n006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C\r\n310\r\n789FEE6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5\r\n310\r\nC8917738143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05\r\n310\r\nE207504B0304140006080800CC70623B16AB87BA640500003C100000340000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F6F626A656374732E786D6CAD575B6FA33818FD2B887DE6924B3BED8A326A92B68A663B534DD4D13E548A0C38942D60649B369D5FBFC7\r\n310\r\n600890A493BDE42160637FD7F31D7FF63E6FB3D478A55C242CBF3247B66B1A340F5994E4F19559CA8D75611A9F7D8F33263BCB4C232719BD32D5B4E97B316765A1A722BA21652A07B3B7B33F0D11D29C9A46981221AE4C113ED38CD8A4942CA2E2C58E882476BCD9DA23BB5ED8171B73523C0F841684D35CC252CCE79062D4\r\n310\r\n468DFA43D7747CCF51DF7D4FFDEB5593E3AB9CCA9FBEFE241792E4E19EB28198C968BAB8199F5D5A67D3E9C49A9E8F47D6EC76B6B0469F26EEFC7C3EBFBCBEB98462213924694B38DD98FE1D62C393D073EA4FADC5DAF04326852CCF6958F90F0F2B9BB5C48816348F90C7840A68EB78EDF68723159BCEE7891A6B95DDE9D3\r\n310\r\nBCEAEEE8086A6C6F9E5D4B59F0175C10A7A0820BAA5055C7473B5AE3CFDD452D602CD5DF12616444529E90D448938013FE6EFA58AA96F85E4F8C42275708571E98FE6827AF6B2B4AE3D7D83D64E5A64C53054DD3AF90BD06FEA9149565C94FCA0F6B834DC85599E4F2423B24DF0B6AFA979E534DFA9E7A4CC6FA631D486393\r\n310\r\n921829879BF5D781A373557BCB85E97FB90DB62B558F8795179C15944B051F40AB495CF35451D26A4727654E6D8033BD98EF82F21D91FF8AF2DD9982BCF1643BDD4EB516C9492E368C67C88DED563FC36D5EACF66DFF057C3658BDBFA69DF9578B3DA735B64F18C7F20770A9D45CFCF7FCF563D6456A277DBEF78A02637CA2\r\n310\r\n43B90A490AEAB94F72244481D24819A6C0E59B606BFA4B3025981DBB48EAB701D97BF19C577CC77F2D1B6C55A9EF3C732474C0B727303F625995056C3B02963D9EAC146BE78EC5FCEC7FA999EBC5EACBAAE41B12D27B4D2C0BBA49F244E2ECDC81B76B502F113D8F5EE8FB1BE3111CDD4FC2AA9B844CAB1288B68AB90A7CDC\r\n310\r\n1C166AB0D3DC5310625FCC14E779BFD0709F8890A629C9292B1B2DED31A4B0DA928CEE135085754027E3018A397D4D5427D15BD1330B677DC8934285AC3DF45A9EB68FF8F2B8FC0A509AFEECFD0FF2DE25CC6047F7214B195F07EFEB9A094D800F7BFAE8FED187B78EA8A3A400F115961BCAD1215E47C966530AF0EE8128FE\r\n310\r\n58CEBB996A8964FFA529A046635D9353B0336A8F700DDF46271A024E70B0B37C9DE01847591E54DED53D54202AB947E4076556AC49C6CA5C9E1226B7F1A7B1BE15DEED62C41B91E1B3E9AFAAA735036547343A925075041DF0A9979E893B391F8FCFA6967B3EFB644DCF6E5CEBFAE272625DCC6FAF3FB93793C5F90CE1EF57\r\n310\r\n407342756B10D1C489E8953CD1617E5CEECAD6F4EF8914CE5D5D504E5C3F1F9736DA62CFC11E00BCDDB8CC8A9466349744C1F75EBDA4DF09BA8A9E8C7A7E9991989E20E5DBDD6A6003664ED8F7A04A8DBE0DF6EAD9B9AA858342E47399053949D2C146EDB85DE4B176BB0965FBAC19BD19AA918E27FA50C1D22402E144464C\r\n310\r\n59462568E704B6E71915404CB72B8FF4EDE184DDAF753F284990D2C6926782963815403548A70C657FDEF80D2D9CEAA2AE4C1C76F60BFE74219A06527D6582DF6412526107381E55E353090704D085B52408D0933C4ED159D79BDA71BB4BC506F4831350EB6F979CD22D69BF7AC49B91A2C0A9DDA3D5CA36AD20FC478E37E6\r\n310\r\n1844E2352865EBCB6EA275A652E3836BE04EFB400BF1A2556F515F1FBB35B2AB35BD889C744FFA1004B5544B121E57F70215746DD2F5E2C1412B602CBF19455AC6C8E5E9922C4E01E65215385004546899059180EAFCF7A707CE7017CD8CDB0410789AB32C63B91E5CEBBBACB17AC6CD347A022D5075FD106377347AAABA7E\r\n310\r\n7D11590744509B44E205134DC1290F06580320F78E537D3D73540E06CB970B431F185308AD40BBD794D6D77003C5A36E8EAA54BA64597CD8F83BD552A080A365F7FF06504B0304140006080000CC70623B000000000000000000000000350000006662782F39464131463745442D413632322D343644302D413938332D3331\r\n310\r\n353338454246344243312F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F747269616E676C65732E62696E636660600000504B0304140006080000CC70623B\r\n310\r\n000000000000000000000000370000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F39464131463745442D413632322D343644302D413938\r\n310\r\n332D3331353338454246344243312F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE607\r\n310\r\nFB144396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623B0D6EF93BFE000000A00100003B0000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F7265736F75726365732F63\r\n310\r\n6F72652E786D6C8D50596E833010BD0A9ADFCA60B334011947A8694ED00B586642AC041B79A97AFC9A40A5F6AF3F33A3B7689E1E3F7DCD8FEC139DD7D6F4C0720A191A65476DA61E62B892236427C19DB5E1970C322367EC618541F0C9D9B8EC90B226A009093576C41D94DE63804C3DD2D18357379C652E63480A7FCF17A9\r\n310\r\nEE72C29CE5894E3AC17D702940B63D59270887DE46A7D0F36263058F518FBB468FE9A7BE6A7420864373B8D4873369AA8691FA421B3294352543C5CAF65C0F6FEF43CB8BD52C78D0F34F46E550061C419494B6843142CB0F5677F4B52BEB177AEC28E5C52AFF638ACBF84F53D42654E51E77B379102C05791282176B5F693D\r\n310\r\nCB4C7BED567C03504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B\r\n310\r\n436F6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623B1EC5D7A3EB0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000094020000636E782E786D6C504B\r\n310\r\n01021400140006080800CC70623B8C9102E971010000D40300000C00000000000000000000000000180300006662782F636F72652E786D6C504B01021400140006080800CC70623BFFEA85907E0000009D0000000B00000000000000000000000000B30400006662782F636E782E786D6C504B01021400140006080800CC70\r\n310\r\n623B4FEEA4082C0100001202000031000000000000000000000000005A0500006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D5060000\r\n310\r\n6662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636E782E786D6C504B01021400140006080800CC70623B16AB87BA640500003C1000003400000000000000000000000000710800006662782F39464131463745442D413632322D343644302D413938332D3331353338\r\n310\r\n454246344243312F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000270E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F76657274696365732E62696E504B01021400140006\r\n310\r\n080800CC70623BF270F133060000000400000036000000000000000000000000007A0E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F747269616E676C65732E62696E504B01021400140006080000CC70623B0000000000000000000000003700000000000000\r\n310\r\n000000000000D40E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD190000000410100003600000000000000000000000000290F00006662782F39464131463745442D413632\r\n310\r\n322D343644302D413938332D3331353338454246344243312F6469726563746F72792E786D6C504B01021400140006080800CC70623B0D6EF93BFE000000A00100003B000000000000000000000000000D1000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F7265\r\n310\r\n736F75726365732F636F72652E786D6C504B0506000000000E000E0080040000641100000000\r\n  0\r\nXRECORD\r\n  5\r\n175\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n174\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1FB\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 70\r\n     0\r\n 90\r\n1673772943\r\n  1\r\nECE7A1D2-D628-4531-984C-D00F80459256\r\n310\r\n504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E\r\n310\r\n6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E\r\n310\r\nD98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A\r\n310\r\nEF7053A7E60B504B0304140006080800CC70623BD9DDAED0EC0000007C01000008000000636F72652E786D6C8D90416EC3201045AF82665B61836D9CD8C2444DD39CA01740405C94182C03558F5F9C3852BBEB6A467FFE9B197D7EF89E6EE8CB2CC17A37002D0820E394D7D68D03A478C17B4007C117EFE32F1B20272733C0\r\n310\r\n2A83E0E3E2D3BC49CABB685CCCAAF3DA6CA20CC14440EA969B0182FA34932C648AD911AEC52CD5558EA6A0CF2EC329598D1E47ACCEFBECC59A050463A7EA5833865FEBDD0E37353BE3EE8DBDE3F6786A48D375FBF6CC78B9C282473B3DEFABC5C86834888A900E538A49F5419B9EB47DD5BC907D4F082F57FB1F28CDFA9F50\r\n310\r\nB22ED6D5F6EE030B20687EE43E10BC5CB3C8E51E54AE6B6EE207504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF326038\r\n310\r\n472BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623BA24EB22D72010000D40300000C0000006662782F636F72652E786D6CC5535B6E833010BC8AE5DF0A6C5E49888CA3A6694ED00B38E05014B091B1518EDFE511A5A9D228FD2A1F60CDEC7A67C6986DCE4D8D7A\r\n310\r\n69BA4AAB0C073EC548AA5C17952A33ECECD15B61B4E1CC686DBF9561A44423333CC098B3D268D7CE50AE9595CA02AA74216750749DB418E5352C32DCE59FB211BE70162ABA93DF8AFC244AE9073ED050C759670D0840D390E18DF9F1706664C23973AE2A66B62A605A75ACA4C13C4976E1364A12EF355A2EBD384AF65EFA96\r\n310\r\nBC7B8BED2EA6719AAE16FB8491A199335B351775B991C2CA02F390D2D40B028F861F41BCA68B7518BFD0D59A524686F29B26D7164F36B94AD9289CE54E6D1DE6010819891F6E21228B3AD1831EC219194284CF98F06DD01008846CC5A1BEF83801D4CBDC6A1303536877A57A513B0953A94FC707FDBE6064EA84A9E3E6E0FA\r\n310\r\nEE8CF0E9198F7784A316AA0413C2C2F2E0ECA0934D1AE6D05A69BCDE9E91D2A611F573361E38FC1375157F5752AE6B6DFE4B11990F88CCBF0719EE23FF02504B0304140006080800CC70623B408A7D3B7C0000009D0000000B0000006662782F636E782E786D6C4DCCD10A83201886E15B91FFDC552A92A0064DBC8F581632\r\n310\r\nD3703A76F9ABD1C18E3E78F878E5F0D9027ABBFCF2292AE86E2D20171F69F6715550CB827B40839639A5F2770314A7CD293819B45C73AAFB45B35BA61ACAA1C1C7E7855C58C15BC331339661262CC762340413D68D77DA5B42298546CBE6573AF60CEB2F504B0304140006080800CC70623B449FB9BD290100001202000031\r\n310\r\n0000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636F72652E786D6C8D515B6EC32010BC0AE22B55850D98B871848994463E412FE002495162B07854397EA176A4F62F3F2C9A9D991D587EB84F37F0AD7D30CEF6905418026DA553C65E7A98E219ED203808EE9D\r\n310\r\n8B7F6810D871D23D2C3014FCE25D9A57483A1BB58D19B54EE9151C43D0110279CB971E06F9A5A7B11A53CC8C70ADE6515EC78BAE4895DB992778883E0700CB907242D17643D7E2538BD869608875438BBAE38922CAC8F1BDD90DB4691A5E2F42C153326A951B95E398B3D1FE599322163C9AE9115F7A3D46ADA0A018778810\r\n310\r\n84E907617BDCEE297BC5BB3DC6BC2EF47FA234AB2745C9D8D8D035EE220B50105E2F0DC1954B9FB747187D9F9D8FA0CCDB042D5FA0C015C65B42DF78BD10F3F3B363CB56C7109DCFDFBBB97E662ED92EB62D13BC2E1BCAE5777DB9966D8A1F504B0304140006080800CC70623BAD7543B64E01000033030000300000006662\r\n310\r\n782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C789FEE\r\n310\r\n6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5C89177\r\n310\r\n38143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05E20750\r\n310\r\n4B0304140006080800CC70623B8D05915C650500003B100000340000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F6F626A656374732E786D6CAD575B6FA33814FE2B887D06429276DA1565D4266D158D3A339A6846FB502932E050B66023DB74D2FDF5FB190C01\r\n310\r\n9276B2973C046C8ECFF53B17071F77456EBD502133CEAE6CDF9DD81665314F32965ED995DA3A17B6F5310C04E7AA47665B8C14F4CAD6DB7618A48257A5D94AE89654B91AEDDEDDFC61C998326A5B714EA4BCB265FC440BE2924AF184CA6737218AB8E976E7FA6E4338649B0A523E8D98964450A6A029F619B8588D52FE7039\r\n310\r\nB1BD30F0F4F730D0FF866AF6369557DB33949F31A9088B0F848DD8CCFCF9F2767A76E99CCDE733677E3EF59D9BBB9BA5E37F984D16E78BC5E5F5ED25044B25C0C96822E8D60EEFE11B91C581D77CEA34368A1F5329E68CD1B8B61F16D63A1B8E092D294B10C78C4A48EB593D192E7DED9BDEE7995E1B91FDEDD3ACEA9FE831\r\n310\r\n6A756F9F7D4D79F4274C90A7A04248AA51D5F8C718DAE06FB2F75AC4796EBE65D22A88A22223B995679120E2D50E41AA49C260C046A35368846B0BECD0DFF3EBEB8AD4F835768F69B9ADF25C43D30E6B646F807FAA64AD59F61715C7A54127C4AACA98BA3006A9D792DAE165E0D59B61A01FB3A9F9D838D2DAE62445C86166\r\n310\r\nF37564E842E7DE6A69879FEEA2DD5AE7E371E1A5E025154AC307D06A03D73EB5978C58FFA4C8E9033066E0F3BD53BEC1F39F91BE7B55103791EDE6BBB991A2046172CB4581D8B893FA674DDA17A77B3B7C413D1B511FD2743BFF8A38F03A658705E3ADF8015C3A3417FF3D7E439FF591DA0B5F18BC20C1B8981957AE6392A3\r\n310\r\nF43C640C01D1A0B4728E2DD4F26DB4B3C3152A252A3B4E913CEC1C72F012782FF88EFF8637AA552DBEF76408E8A8DE9E50F9E1CB3A2DA0DB1B6039A893B56063DC5B3E3FFB5F72E67AB9FEB4AEC496C4F4C1149625DD662C53E89D7BF0F6151A046260D1337DFDC94502430F83B0EE07A130A224BCAD7DAE1D9FB6CD422FF6\r\n310\r\n920702629C4BB9AE79C12F243C6432A6794E18E5552BA56B431AAB5D91317302B2B071E86C3A42B1A02F999E24061403B5D0EB639195DA655DD3EBEAB4FB862DDF579F014AD0E73C22F99E28DA57FB98E75C6CA2D74D53086D600F4786E0FE3144B771A8A7B900F03594DB8A633CBC49B2EDB69228BB479CF863B5E807AAAB\r\n310\r\n23872F6DFEB4129B949CA33823F58830E86D65621E10047D9DB34D862E8EAC3C2ABC2F7B2C40D67CDFE01F5545B92105AF983AC54D93D69E56FB8E797F88913F898A9FEC705D3F9D1B54EC8426FB500D40A03BD0119B06E1B95DDC7EB8F6975367793EBD70E66733DFB9BC982F9CE564727731999F5D4ECFCE3B8D6A4DC2A0\r\n310\r\n6D50FD148437D110834A64C6CDDF57FBACB5C307A2A477DFE4939736CFEF2B175371E0E10CF0DD1D5C15654E0BCA14D1E87DD02FF93782A162C0A3D95F1524A52770F972BF1EE9809D13CE7DD599467F8ECE9ADD85CE85A34CD45355448C64F9E8A031DC2D596ACC6E5DD93D9B82DE2EF5CAF81363A8E47996A0DE24564A79\r\n310\r\n4115AACE09C55E14540231FDA13C319787134EBF34E3A022514E5B4D9E0826E25C02D5805B15ABE1BEF51B26383D445DD9E875EE33FE4C22DA16427D65A3BCA92CA6D28DD01DF5DC53330704308475351050232CCD31583787BA75774AFB06E5070DD0C8EF484E19968C5D83BA5B90B244D31E54D55A372320FE4786B7EA58\r\n310\r\n44E135AA5467CB7EA333A61683CC6A8C3257034C10CF46F40EF9F5BE59BE5BD30C3C72D235E95D10345C1D45445A5F0BB47E46A5EBE5570F9380B5FA629579952296A773720405982B9DE04011506178964401AA8BDF1FBF0A8EAB6861DD6580C0E38217056766716DAEB2D6FA0917D3E4116581EADB879C4E7CFFB11EFACD\r\n310\r\n3D641311495D92C8676CB409A72D18610D803CE8A626049E8EC1887CB5B44CC39883690DDA8399B4B9855B481E7D71D4A9D22F96E5BB73BF5793020C02137BF837504B0304140006080000CC70623B000000000000000000000000350000006662782F36394639363044362D344446342D343946362D394244322D32343142\r\n310\r\n43333846323333332F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F747269616E676C65732E62696E636660600000504B0304140006080000CC70623B0000\r\n310\r\n00000000000000000000370000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F36394639363044362D344446342D343946362D394244322D\r\n310\r\n3234314243333846323333332F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE607FB14\r\n310\r\n4396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623BCA768048FE000000A00100003B0000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F7265736F75726365732F636F72\r\n310\r\n652E786D6C8D50596E833010BD0A9ADFCA60D600328E9AA639412F609909B1126CE4A5EAF16B0295DABFFECC8CDEA2797AECF8353F924FB44E193D409E5248504B332A3D0D10FC95B4901C39B3C6F85F3248B49871801506CE266BC2B243D2688FDA47549B11775038871E12F988C7004EDE7016A9083E2ADC3D5D84BC8B09\r\n310\r\nD33C8D74D471E6BC8D0192EDC93A815B742658898E651BCB59086ADC356A8C3FD555A1055ED7E7E254D615792D0F075295F585746FF53B694EE78A565DD736979A65AB9933AFE69F8CD2A2F038022F28ED489E135A7CE4554F9BBEA85E68DB53CAB255FEC71496F19FA6A0B42F8B3DEE6673C0F318E4497096AD7DC5F52C33\r\n310\r\nEEB55BFE0D504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B436F\r\n310\r\n6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623BD9DDAED0EC0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000095020000636E782E786D6C504B0102\r\n310\r\n1400140006080800CC70623BA24EB22D72010000D40300000C00000000000000000000000000190300006662782F636F72652E786D6C504B01021400140006080800CC70623B408A7D3B7C0000009D0000000B00000000000000000000000000B50400006662782F636E782E786D6C504B01021400140006080800CC70623B\r\n310\r\n449FB9BD290100001202000031000000000000000000000000005A0500006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D20600006662\r\n310\r\n782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636E782E786D6C504B01021400140006080800CC70623B8D05915C650500003B10000034000000000000000000000000006E0800006662782F36394639363044362D344446342D343946362D394244322D32343142433338\r\n310\r\n46323333332F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000250E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F76657274696365732E62696E504B010214001400060808\r\n310\r\n00CC70623BF270F13306000000040000003600000000000000000000000000780E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F747269616E676C65732E62696E504B01021400140006080000CC70623B00000000000000000000000037000000000000000000\r\n310\r\n00000000D20E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD190000000410100003600000000000000000000000000270F00006662782F36394639363044362D344446342D\r\n310\r\n343946362D394244322D3234314243333846323333332F6469726563746F72792E786D6C504B01021400140006080800CC70623BCA768048FE000000A00100003B000000000000000000000000000B1000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F7265736F\r\n310\r\n75726365732F636F72652E786D6C504B0506000000000E000E0080040000621100000000\r\n  0\r\nXRECORD\r\n  5\r\n176\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n177\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nCELLSTYLEMAP\r\n  5\r\n2BA\r\n102\r\n{ACAD_REACTORS\r\n330\r\n162\r\n102\r\n}\r\n330\r\n162\r\n100\r\nAcDbCellStyleMap\r\n 90\r\n        3\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n    32768\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n11\r\n144\r\n6.0\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n4.5\r\n 40\r\n4.5\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        1\r\n 91\r\n        1\r\n300\r\n_TITLE\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n11\r\n144\r\n4.5\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n4.5\r\n 40\r\n4.5\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        2\r\n 91\r\n        1\r\n300\r\n_HEADER\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        2\r\n 62\r\n     0\r\n340\r\n11\r\n144\r\n4.5\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n4.5\r\n 40\r\n4.5\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        3\r\n 91\r\n        2\r\n300\r\n_DATA\r\n309\r\nCELLSTYLE_END\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nACDSDATA\r\n 70\r\n     2\r\n 71\r\n     8\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        0\r\n  1\r\nAcDb_Thumbnail_Schema\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n 91\r\n        8\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 91\r\n        0\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        1\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        2\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        3\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        4\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n282\r\n     1\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        1\r\n  1\r\nAcDbDs::TreatedAsObjectDataSchema\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        2\r\n  1\r\nAcDbDs::LegacySchema\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        3\r\n  1\r\nAcDbDs::IndexedPropertySchema\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        4\r\n  1\r\nAcDbDs::HandleAttributeSchema\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n 91\r\n        1\r\n284\r\n     1\r\n  0\r\nACDSRECORD\r\n 90\r\n        0\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n320\r\n22\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 94\r\n     1192\r\n310\r\n89504E470D0A1A0A0000000D4948445200000130000001000803000000035FDA6C00000300504C5445212830FFFFFF2128300000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099\r\n310\r\n000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00\r\n310\r\n33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066\r\n310\r\nFF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00\r\n310\r\n33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333\r\n310\r\nFF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB\r\n310\r\nBBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF0000000000000000000000000000000000000000000000000000000000002E4550F1000001634944415478DAEDDCC10DC4200C0041FAEF977F2AE061C90EB6982DC09C265C1E28C95A922449922449922449924ADB59E54D8A2DFB3B58DA9C1DBA4CCD7E3E3060C0800103060C18\r\n310\r\n3060C080010336006C03AB5C15183060C0800103060C183060C080010306AC7845C73BE139C0800103060C183060C0800103060C18B0D32943D6AB337658DD243B2CB8C31A5EEFDEF73060C0800103060C183060C080010306CC01223060C0800103060CD835300F0597AE0A0C183060C05E027BFE3BAE9756B5C3EC30F730\r\n310\r\n60C0800103F63C98E39DF01C60C0800103060C183060C0800103060C183060C0800103060C5829984FC900F39704060C183060C0800103060C183060C08079C6754AC0800103060C183060C0800103060C183060A7398E77A273800103060C183060C0800103060C183060C05256CC7BD7E84A4B9224499224499224499224\r\n310\r\n499224499224499224499224499224499224499224499224499286F7013C57CBB289ED2ED80000000049454E44AE426082\r\n  0\r\nENDSEC\r\n  0\r\nEOF\r\n"
  },
  {
    "path": "testdata/simple_axial_lines.ntf",
    "content": "01depthmapX test\\0%\n02Land-Line\\0%\n050001                              Axial set 1\\0%\n050002                              Axial s1%\net 2\\0%\n07depthmap  21000062000000001000006200000000100000531000000018400000000000000%\n23000000        0001 0000000 0000000%\n2100000000000033993014668 033294036321 0%\n23000000        0001 0000000 0000000%\n2100000000000048311025494 018859026891 0188591%\n000000 0%\n23000000        0001 0000000 0000000%\n2100000000000044237011525 020838008614 0%\n23000000        0001 0000000 0000000%\n2100000000000004423021536 007101006286 0%\n23000000        0001 0000000 0000000%\n2100000000000003958000349 016880000931 0%\n23000000        0001 0000000 0000000%\n2100000000000014551004889 015366001280 0%\n23000000        0001 0000000 0000000%\n2100000000000034807011059 023748011.757 0%\n23000000        0001 0000000 0000000%\n2100000000000025494004889 024447013387 0%\n23000000        0001 0000000 0000000%\n2100000000000026658005122 014318005937 0%\n23000000        0002 0000000 0000000%\n2100000000000015599003026 015366013853 0%\n23000000        0002 0000000 0000000%\n2100000000000025844013154 010128012107 0%\n23000000        0002 0000000 0000000%\n2100000000000004423010360 004772017345 0%\n23000000        0002 0000000 0000000%\n2100000000000005005040745 003725035389 0%\n23000000        0002 0000000 0000000%\n2100000000000004540034807 000582039580 0%\n23000000        0002 0000000 0000000%\n2100000000000020605036670 002211030616 0%\n23000000        0002 0000000 0000000%\n2100000000000015133038882 013620022817 0%\n23000000        0002 0000000 0000000%\n2100000000000016996037252 000465035972 0%\n"
  },
  {
    "path": "testdata/simple_axlines.mid",
    "content": "0,2,67.185654\n1,3,50.994308\n2,2,65.140717\n3,2,27.951588\n4,2,12.985298\n5,1,6.2235465\n6,2,11.059984\n7,3,8.5625963\n8,2,12.366808\n9,2,10.829045\n10,3,35.987316\n11,1,6.9935918\n12,1,10.242486\n13,2,6.2006397\n14,1,19.364029\n15,3,16.136318\n16,2,16.580376\n"
  },
  {
    "path": "testdata/simple_axlines.mif",
    "content": "Version 300\nCharset \"WindowsLatin1\"\nDelimiter \",\"\nIndex 1\nCoordSys NonEarth Units \"m\" Bounds (-50.000000, -50.000000) ( 50.000000,  50.000000)\nColumns 3\n  Depthmap_Ref Integer\n  Connectivity Float\n  Line_Length Float\nData\n\nLINE -48.31199068684517 25.49476135040745 18.85913853317811 26.89173457508731\n    PEN (1,2,0)\nLINE -33.9930151338766 -14.66821885913853 -33.29452852153667 36.32130384167637\n    PEN (1,2,0)\nLINE -44.23748544819558 -11.52502910360885 20.83818393480792 -8.614668218859139\n    PEN (1,2,0)\nLINE 4.423748544819557 -21.53667054714785 7.10128055878929 6.286379511059371\n    PEN (1,2,0)\nLINE 3.958090803259604 0.3492433061699651 16.88009313154831 -0.9313154831199069\n    PEN (1,2,0)\nLINE 14.55180442374854 4.889406286379511 15.36670547147846 -1.280558789289872\n    PEN (1,2,0)\nLINE -34.80791618160652 11.05937136204889 -23.74854481955763 11.17578579743888\n    PEN (1,2,0)\nLINE -25.49476135040745 4.889406286379511 -24.44703143189756 13.38766006984866\n    PEN (1,2,0)\nLINE -26.65890570430733 5.122235157159488 -14.31897555296857 5.937136204889407\n    PEN (1,2,0)\nLINE -15.59953434225844 3.026775320139697 -15.36670547147846 13.85331781140861\n    PEN (1,2,0)\nLINE -25.84400465657741 13.15483119906868 10.12805587892899 12.10710128055879\n    PEN (1,2,0)\nLINE 4.423748544819557 10.36088474970896 4.772991850989523 17.34575087310827\n    PEN (1,2,0)\nLINE -5.005820721769499 40.74505238649593 3.725261932479627 35.38998835855646\n    PEN (1,2,0)\nLINE -4.540162980209546 34.80791618160652 -0.5820721769499417 39.58090803259604\n    PEN (1,2,0)\nLINE -20.60535506402794 36.67054714784634 -2.211874272409779 30.61699650756694\n    PEN (1,2,0)\nLINE -15.13387660069849 38.88242142025611 -13.62048894062864 22.81722933643772\n    PEN (1,2,0)\nLINE -16.9965075669383 37.25261932479627 -0.4656577415599534 35.9720605355064\n    PEN (1,2,0)\n"
  },
  {
    "path": "testdata/simple_axlines_pline.mid",
    "content": "0,2,67.185654\n1,3,50.994308\n2,2,65.140717\n3,2,27.951588\n4,2,12.985298\n5,1,6.2235465\n6,2,11.059984\n7,3,8.5625963\n8,2,12.366808\n9,2,10.829045\n10,3,35.987316\n11,1,6.9935918\n12,1,10.242486\n13,2,6.2006397\n14,1,19.364029\n15,3,16.136318\n16,2,16.580376\n"
  },
  {
    "path": "testdata/simple_axlines_pline.mif",
    "content": "Version 300\nCharset \"WindowsLatin1\"\nDelimiter \",\"\nIndex 1\nCoordSys NonEarth Units \"m\" Bounds (-50.000000, -50.000000) ( 50.000000,  50.000000)\nColumns 3\n  Depthmap_Ref Integer\n  Connectivity Float\n  Line_Length Float\nData\n\nPLINE 3\n-48.31199068684517 25.49476135040745\n18.85913853317811 26.89173457508731\n18.85913853317811 0\n    PEN (1,2,0)\nLINE -33.9930151338766 -14.66821885913853 -33.29452852153667 36.32130384167637\n    PEN (1,2,0)\nLINE -44.23748544819558 -11.52502910360885 20.83818393480792 -8.614668218859139\n    PEN (1,2,0)\nLINE 4.423748544819557 -21.53667054714785 7.10128055878929 6.286379511059371\n    PEN (1,2,0)\nLINE 3.958090803259604 0.3492433061699651 16.88009313154831 -0.9313154831199069\n    PEN (1,2,0)\nLINE 14.55180442374854 4.889406286379511 15.36670547147846 -1.280558789289872\n    PEN (1,2,0)\nLINE -34.80791618160652 11.05937136204889 -23.74854481955763 11.17578579743888\n    PEN (1,2,0)\nLINE -25.49476135040745 4.889406286379511 -24.44703143189756 13.38766006984866\n    PEN (1,2,0)\nLINE -26.65890570430733 5.122235157159488 -14.31897555296857 5.937136204889407\n    PEN (1,2,0)\nLINE -15.59953434225844 3.026775320139697 -15.36670547147846 13.85331781140861\n    PEN (1,2,0)\nLINE -25.84400465657741 13.15483119906868 10.12805587892899 12.10710128055879\n    PEN (1,2,0)\nLINE 4.423748544819557 10.36088474970896 4.772991850989523 17.34575087310827\n    PEN (1,2,0)\nLINE -5.005820721769499 40.74505238649593 3.725261932479627 35.38998835855646\n    PEN (1,2,0)\nLINE -4.540162980209546 34.80791618160652 -0.5820721769499417 39.58090803259604\n    PEN (1,2,0)\nLINE -20.60535506402794 36.67054714784634 -2.211874272409779 30.61699650756694\n    PEN (1,2,0)\nLINE -15.13387660069849 38.88242142025611 -13.62048894062864 22.81722933643772\n    PEN (1,2,0)\nLINE -16.9965075669383 37.25261932479627 -0.4656577415599534 35.9720605355064\n    PEN (1,2,0)\n"
  },
  {
    "path": "testdata/turns.dxf",
    "content": "  0\r\nSECTION\r\n  2\r\nHEADER\r\n  9\r\n$ACADVER\r\n  1\r\nAC1027\r\n  9\r\n$ACADMAINTVER\r\n 70\r\n   125\r\n  9\r\n$DWGCODEPAGE\r\n  3\r\nANSI_1252\r\n  9\r\n$LASTSAVEDBY\r\n  1\r\npetros\r\n  9\r\n$REQUIREDVERSIONS\r\n160\r\n                 0\r\n  9\r\n$INSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$EXTMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$EXTMAX\r\n 10\r\n2.5\r\n 20\r\n1.5\r\n 30\r\n0.0\r\n  9\r\n$LIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$LIMMAX\r\n 10\r\n420.0\r\n 20\r\n297.0\r\n  9\r\n$ORTHOMODE\r\n 70\r\n     0\r\n  9\r\n$REGENMODE\r\n 70\r\n     1\r\n  9\r\n$FILLMODE\r\n 70\r\n     1\r\n  9\r\n$QTEXTMODE\r\n 70\r\n     0\r\n  9\r\n$MIRRTEXT\r\n 70\r\n     0\r\n  9\r\n$LTSCALE\r\n 40\r\n1.0\r\n  9\r\n$ATTMODE\r\n 70\r\n     1\r\n  9\r\n$TEXTSIZE\r\n 40\r\n2.5\r\n  9\r\n$TRACEWID\r\n 40\r\n1.0\r\n  9\r\n$TEXTSTYLE\r\n  7\r\nStandard\r\n  9\r\n$CLAYER\r\n  8\r\n0\r\n  9\r\n$CELTYPE\r\n  6\r\nByLayer\r\n  9\r\n$CECOLOR\r\n 62\r\n   256\r\n  9\r\n$CELTSCALE\r\n 40\r\n1.0\r\n  9\r\n$DISPSILH\r\n 70\r\n     0\r\n  9\r\n$DIMSCALE\r\n 40\r\n1.0\r\n  9\r\n$DIMASZ\r\n 40\r\n2.5\r\n  9\r\n$DIMEXO\r\n 40\r\n0.625\r\n  9\r\n$DIMDLI\r\n 40\r\n3.75\r\n  9\r\n$DIMRND\r\n 40\r\n0.0\r\n  9\r\n$DIMDLE\r\n 40\r\n0.0\r\n  9\r\n$DIMEXE\r\n 40\r\n1.25\r\n  9\r\n$DIMTP\r\n 40\r\n0.0\r\n  9\r\n$DIMTM\r\n 40\r\n0.0\r\n  9\r\n$DIMTXT\r\n 40\r\n2.5\r\n  9\r\n$DIMCEN\r\n 40\r\n2.5\r\n  9\r\n$DIMTSZ\r\n 40\r\n0.0\r\n  9\r\n$DIMTOL\r\n 70\r\n     0\r\n  9\r\n$DIMLIM\r\n 70\r\n     0\r\n  9\r\n$DIMTIH\r\n 70\r\n     0\r\n  9\r\n$DIMTOH\r\n 70\r\n     0\r\n  9\r\n$DIMSE1\r\n 70\r\n     0\r\n  9\r\n$DIMSE2\r\n 70\r\n     0\r\n  9\r\n$DIMTAD\r\n 70\r\n     1\r\n  9\r\n$DIMZIN\r\n 70\r\n     8\r\n  9\r\n$DIMBLK\r\n  1\r\n\r\n  9\r\n$DIMASO\r\n 70\r\n     1\r\n  9\r\n$DIMSHO\r\n 70\r\n     1\r\n  9\r\n$DIMPOST\r\n  1\r\n\r\n  9\r\n$DIMAPOST\r\n  1\r\n\r\n  9\r\n$DIMALT\r\n 70\r\n     0\r\n  9\r\n$DIMALTD\r\n 70\r\n     3\r\n  9\r\n$DIMALTF\r\n 40\r\n0.03937007874016\r\n  9\r\n$DIMLFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMTOFL\r\n 70\r\n     1\r\n  9\r\n$DIMTVP\r\n 40\r\n0.0\r\n  9\r\n$DIMTIX\r\n 70\r\n     0\r\n  9\r\n$DIMSOXD\r\n 70\r\n     0\r\n  9\r\n$DIMSAH\r\n 70\r\n     0\r\n  9\r\n$DIMBLK1\r\n  1\r\n\r\n  9\r\n$DIMBLK2\r\n  1\r\n\r\n  9\r\n$DIMSTYLE\r\n  2\r\nISO-25\r\n  9\r\n$DIMCLRD\r\n 70\r\n     0\r\n  9\r\n$DIMCLRE\r\n 70\r\n     0\r\n  9\r\n$DIMCLRT\r\n 70\r\n     0\r\n  9\r\n$DIMTFAC\r\n 40\r\n1.0\r\n  9\r\n$DIMGAP\r\n 40\r\n0.625\r\n  9\r\n$DIMJUST\r\n 70\r\n     0\r\n  9\r\n$DIMSD1\r\n 70\r\n     0\r\n  9\r\n$DIMSD2\r\n 70\r\n     0\r\n  9\r\n$DIMTOLJ\r\n 70\r\n     0\r\n  9\r\n$DIMTZIN\r\n 70\r\n     8\r\n  9\r\n$DIMALTZ\r\n 70\r\n     0\r\n  9\r\n$DIMALTTZ\r\n 70\r\n     0\r\n  9\r\n$DIMUPT\r\n 70\r\n     0\r\n  9\r\n$DIMDEC\r\n 70\r\n     2\r\n  9\r\n$DIMTDEC\r\n 70\r\n     2\r\n  9\r\n$DIMALTU\r\n 70\r\n     2\r\n  9\r\n$DIMALTTD\r\n 70\r\n     3\r\n  9\r\n$DIMTXSTY\r\n  7\r\nStandard\r\n  9\r\n$DIMAUNIT\r\n 70\r\n     0\r\n  9\r\n$DIMADEC\r\n 70\r\n     0\r\n  9\r\n$DIMALTRND\r\n 40\r\n0.0\r\n  9\r\n$DIMAZIN\r\n 70\r\n     0\r\n  9\r\n$DIMDSEP\r\n 70\r\n    44\r\n  9\r\n$DIMATFIT\r\n 70\r\n     3\r\n  9\r\n$DIMFRAC\r\n 70\r\n     0\r\n  9\r\n$DIMLDRBLK\r\n  1\r\n\r\n  9\r\n$DIMLUNIT\r\n 70\r\n     2\r\n  9\r\n$DIMLWD\r\n 70\r\n    -2\r\n  9\r\n$DIMLWE\r\n 70\r\n    -2\r\n  9\r\n$DIMTMOVE\r\n 70\r\n     0\r\n  9\r\n$DIMFXL\r\n 40\r\n1.0\r\n  9\r\n$DIMFXLON\r\n 70\r\n     0\r\n  9\r\n$DIMJOGANG\r\n 40\r\n0.7853981633974483\r\n  9\r\n$DIMTFILL\r\n 70\r\n     0\r\n  9\r\n$DIMTFILLCLR\r\n 70\r\n     0\r\n  9\r\n$DIMARCSYM\r\n 70\r\n     0\r\n  9\r\n$DIMLTYPE\r\n  6\r\n\r\n  9\r\n$DIMLTEX1\r\n  6\r\n\r\n  9\r\n$DIMLTEX2\r\n  6\r\n\r\n  9\r\n$DIMTXTDIRECTION\r\n 70\r\n     0\r\n  9\r\n$LUNITS\r\n 70\r\n     2\r\n  9\r\n$LUPREC\r\n 70\r\n     4\r\n  9\r\n$SKETCHINC\r\n 40\r\n1.0\r\n  9\r\n$FILLETRAD\r\n 40\r\n0.0\r\n  9\r\n$AUNITS\r\n 70\r\n     0\r\n  9\r\n$AUPREC\r\n 70\r\n     0\r\n  9\r\n$MENU\r\n  1\r\n.\r\n  9\r\n$ELEVATION\r\n 40\r\n0.0\r\n  9\r\n$PELEVATION\r\n 40\r\n0.0\r\n  9\r\n$THICKNESS\r\n 40\r\n0.0\r\n  9\r\n$LIMCHECK\r\n 70\r\n     0\r\n  9\r\n$CHAMFERA\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERB\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERC\r\n 40\r\n0.0\r\n  9\r\n$CHAMFERD\r\n 40\r\n0.0\r\n  9\r\n$SKPOLY\r\n 70\r\n     0\r\n  9\r\n$TDCREATE\r\n 40\r\n2458063.099826389\r\n  9\r\n$TDUCREATE\r\n 40\r\n2458063.099826389\r\n  9\r\n$TDUPDATE\r\n 40\r\n2458063.103020833\r\n  9\r\n$TDUUPDATE\r\n 40\r\n2458063.103020833\r\n  9\r\n$TDINDWG\r\n 40\r\n0.0032060185\r\n  9\r\n$TDUSRTIMER\r\n 40\r\n0.0032060185\r\n  9\r\n$USRTIMER\r\n 70\r\n     1\r\n  9\r\n$ANGBASE\r\n 50\r\n0.0\r\n  9\r\n$ANGDIR\r\n 70\r\n     0\r\n  9\r\n$PDMODE\r\n 70\r\n     0\r\n  9\r\n$PDSIZE\r\n 40\r\n0.0\r\n  9\r\n$PLINEWID\r\n 40\r\n0.0\r\n  9\r\n$SPLFRAME\r\n 70\r\n     0\r\n  9\r\n$SPLINETYPE\r\n 70\r\n     6\r\n  9\r\n$SPLINESEGS\r\n 70\r\n     8\r\n  9\r\n$HANDSEED\r\n  5\r\n27E\r\n  9\r\n$SURFTAB1\r\n 70\r\n     6\r\n  9\r\n$SURFTAB2\r\n 70\r\n     6\r\n  9\r\n$SURFTYPE\r\n 70\r\n     6\r\n  9\r\n$SURFU\r\n 70\r\n     6\r\n  9\r\n$SURFV\r\n 70\r\n     6\r\n  9\r\n$UCSBASE\r\n  2\r\n\r\n  9\r\n$UCSNAME\r\n  2\r\n\r\n  9\r\n$UCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORTHOREF\r\n  2\r\n\r\n  9\r\n$UCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$UCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$UCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSBASE\r\n  2\r\n\r\n  9\r\n$PUCSNAME\r\n  2\r\n\r\n  9\r\n$PUCSORG\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSXDIR\r\n 10\r\n1.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSYDIR\r\n 10\r\n0.0\r\n 20\r\n1.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORTHOREF\r\n  2\r\n\r\n  9\r\n$PUCSORTHOVIEW\r\n 70\r\n     0\r\n  9\r\n$PUCSORGTOP\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBOTTOM\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGLEFT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGRIGHT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGFRONT\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PUCSORGBACK\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$USERI1\r\n 70\r\n     0\r\n  9\r\n$USERI2\r\n 70\r\n     0\r\n  9\r\n$USERI3\r\n 70\r\n     0\r\n  9\r\n$USERI4\r\n 70\r\n     0\r\n  9\r\n$USERI5\r\n 70\r\n     0\r\n  9\r\n$USERR1\r\n 40\r\n0.0\r\n  9\r\n$USERR2\r\n 40\r\n0.0\r\n  9\r\n$USERR3\r\n 40\r\n0.0\r\n  9\r\n$USERR4\r\n 40\r\n0.0\r\n  9\r\n$USERR5\r\n 40\r\n0.0\r\n  9\r\n$WORLDVIEW\r\n 70\r\n     1\r\n  9\r\n$SHADEDGE\r\n 70\r\n     3\r\n  9\r\n$SHADEDIF\r\n 70\r\n    70\r\n  9\r\n$TILEMODE\r\n 70\r\n     1\r\n  9\r\n$MAXACTVP\r\n 70\r\n    64\r\n  9\r\n$PINSBASE\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMCHECK\r\n 70\r\n     0\r\n  9\r\n$PEXTMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PEXTMAX\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  9\r\n$PLIMMIN\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n  9\r\n$PLIMMAX\r\n 10\r\n12.0\r\n 20\r\n9.0\r\n  9\r\n$UNITMODE\r\n 70\r\n     0\r\n  9\r\n$VISRETAIN\r\n 70\r\n     1\r\n  9\r\n$PLINEGEN\r\n 70\r\n     0\r\n  9\r\n$PSLTSCALE\r\n 70\r\n     1\r\n  9\r\n$TREEDEPTH\r\n 70\r\n  3020\r\n  9\r\n$CMLSTYLE\r\n  2\r\nStandard\r\n  9\r\n$CMLJUST\r\n 70\r\n     0\r\n  9\r\n$CMLSCALE\r\n 40\r\n20.0\r\n  9\r\n$PROXYGRAPHICS\r\n 70\r\n     1\r\n  9\r\n$MEASUREMENT\r\n 70\r\n     1\r\n  9\r\n$CELWEIGHT\r\n370\r\n    -1\r\n  9\r\n$ENDCAPS\r\n280\r\n     0\r\n  9\r\n$JOINSTYLE\r\n280\r\n     0\r\n  9\r\n$LWDISPLAY\r\n290\r\n     0\r\n  9\r\n$INSUNITS\r\n 70\r\n     4\r\n  9\r\n$HYPERLINKBASE\r\n  1\r\n\r\n  9\r\n$STYLESHEET\r\n  1\r\n\r\n  9\r\n$XEDIT\r\n290\r\n     1\r\n  9\r\n$CEPSNTYPE\r\n380\r\n     0\r\n  9\r\n$PSTYLEMODE\r\n290\r\n     1\r\n  9\r\n$FINGERPRINTGUID\r\n  2\r\n{AFD1DA9D-7DA5-454D-AE1C-440A3E196D4F}\r\n  9\r\n$VERSIONGUID\r\n  2\r\n{9AECDF69-EDC8-E448-993E-6650646B9926}\r\n  9\r\n$EXTNAMES\r\n290\r\n     1\r\n  9\r\n$PSVPSCALE\r\n 40\r\n0.0\r\n  9\r\n$OLESTARTUP\r\n290\r\n     0\r\n  9\r\n$SORTENTS\r\n280\r\n   127\r\n  9\r\n$INDEXCTL\r\n280\r\n     0\r\n  9\r\n$HIDETEXT\r\n280\r\n     1\r\n  9\r\n$XCLIPFRAME\r\n280\r\n     2\r\n  9\r\n$HALOGAP\r\n280\r\n     0\r\n  9\r\n$OBSCOLOR\r\n 70\r\n   257\r\n  9\r\n$OBSLTYPE\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONDISPLAY\r\n280\r\n     0\r\n  9\r\n$INTERSECTIONCOLOR\r\n 70\r\n   257\r\n  9\r\n$DIMASSOC\r\n280\r\n     2\r\n  9\r\n$PROJECTNAME\r\n  1\r\n\r\n  9\r\n$CAMERADISPLAY\r\n290\r\n     0\r\n  9\r\n$LENSLENGTH\r\n 40\r\n50.0\r\n  9\r\n$CAMERAHEIGHT\r\n 40\r\n0.0\r\n  9\r\n$STEPSPERSEC\r\n 40\r\n2.0\r\n  9\r\n$STEPSIZE\r\n 40\r\n6.0\r\n  9\r\n$3DDWFPREC\r\n 40\r\n2.0\r\n  9\r\n$PSOLWIDTH\r\n 40\r\n5.0\r\n  9\r\n$PSOLHEIGHT\r\n 40\r\n80.0\r\n  9\r\n$LOFTANG1\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTANG2\r\n 40\r\n1.570796326794896\r\n  9\r\n$LOFTMAG1\r\n 40\r\n0.0\r\n  9\r\n$LOFTMAG2\r\n 40\r\n0.0\r\n  9\r\n$LOFTPARAM\r\n 70\r\n     7\r\n  9\r\n$LOFTNORMALS\r\n280\r\n     1\r\n  9\r\n$LATITUDE\r\n 40\r\n37.795\r\n  9\r\n$LONGITUDE\r\n 40\r\n-122.394\r\n  9\r\n$NORTHDIRECTION\r\n 40\r\n0.0\r\n  9\r\n$TIMEZONE\r\n 70\r\n -8000\r\n  9\r\n$LIGHTGLYPHDISPLAY\r\n280\r\n     1\r\n  9\r\n$TILEMODELIGHTSYNCH\r\n280\r\n     1\r\n  9\r\n$CMATERIAL\r\n347\r\nEC\r\n  9\r\n$SOLIDHIST\r\n280\r\n     0\r\n  9\r\n$SHOWHIST\r\n280\r\n     1\r\n  9\r\n$DWFFRAME\r\n280\r\n     2\r\n  9\r\n$DGNFRAME\r\n280\r\n     0\r\n  9\r\n$REALWORLDSCALE\r\n290\r\n     1\r\n  9\r\n$INTERFERECOLOR\r\n 62\r\n     1\r\n  9\r\n$INTERFEREOBJVS\r\n345\r\nF9\r\n  9\r\n$INTERFEREVPVS\r\n346\r\nF6\r\n  9\r\n$CSHADOW\r\n280\r\n     0\r\n  9\r\n$SHADOWPLANELOCATION\r\n 40\r\n0.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nCLASSES\r\n  0\r\nCLASS\r\n  1\r\nACDBDICTIONARYWDFLT\r\n  2\r\nAcDbDictionaryWithDefault\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nDICTIONARYVAR\r\n  2\r\nAcDbDictionaryVar\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n       11\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nTABLESTYLE\r\n  2\r\nAcDbTableStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMATERIAL\r\n  2\r\nAcDbMaterial\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        3\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nVISUALSTYLE\r\n  2\r\nAcDbVisualStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     4095\r\n 91\r\n       24\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSCALE\r\n  2\r\nAcDbScale\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n       17\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nMLEADERSTYLE\r\n  2\r\nAcDbMLeaderStyle\r\n  3\r\nACDB_MLEADERSTYLE_CLASS\r\n 90\r\n     4095\r\n 91\r\n        2\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nCELLSTYLEMAP\r\n  2\r\nAcDbCellStyleMap\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1152\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nEXACXREFPANELOBJECT\r\n  2\r\nExAcXREFPanelObject\r\n  3\r\nEXAC_ESW\r\n 90\r\n     1025\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nNPOCOLLECTION\r\n  2\r\nAcDbImpNonPersistentObjectsCollection\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1153\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nLAYER_INDEX\r\n  2\r\nAcDbLayerIndex\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nSPATIAL_INDEX\r\n  2\r\nAcDbSpatialIndex\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nIDBUFFER\r\n  2\r\nAcDbIdBuffer\r\n  3\r\nObjectDBX Classes\r\n 90\r\n        0\r\n 91\r\n        0\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBSECTIONVIEWSTYLE\r\n  2\r\nAcDbSectionViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nCLASS\r\n  1\r\nACDBDETAILVIEWSTYLE\r\n  2\r\nAcDbDetailViewStyle\r\n  3\r\nObjectDBX Classes\r\n 90\r\n     1025\r\n 91\r\n        1\r\n280\r\n     0\r\n281\r\n     0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nTABLES\r\n  0\r\nTABLE\r\n  2\r\nVPORT\r\n  5\r\n8\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n1001\r\nACAD\r\n1000\r\nDbSaveVer\r\n1071\r\n       30\r\n  0\r\nVPORT\r\n  5\r\nEA\r\n330\r\n8\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbViewportTableRecord\r\n  2\r\n*Active\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n1.0\r\n 21\r\n1.0\r\n 12\r\n1.001627717390972\r\n 22\r\n0.5962582929476006\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 14\r\n10.0\r\n 24\r\n10.0\r\n 15\r\n10.0\r\n 25\r\n10.0\r\n 16\r\n0.0\r\n 26\r\n0.0\r\n 36\r\n1.0\r\n 17\r\n0.0\r\n 27\r\n0.0\r\n 37\r\n0.0\r\n 40\r\n3.854413096348022\r\n 41\r\n1.394052044609665\r\n 42\r\n50.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 50\r\n0.0\r\n 51\r\n0.0\r\n 71\r\n     0\r\n 72\r\n  1000\r\n 73\r\n     1\r\n 74\r\n     3\r\n 75\r\n     0\r\n 76\r\n     1\r\n 77\r\n     0\r\n 78\r\n     0\r\n281\r\n     0\r\n 65\r\n     1\r\n110\r\n0.0\r\n120\r\n0.0\r\n130\r\n0.0\r\n111\r\n1.0\r\n121\r\n0.0\r\n131\r\n0.0\r\n112\r\n0.0\r\n122\r\n1.0\r\n132\r\n0.0\r\n 79\r\n     0\r\n146\r\n0.0\r\n348\r\nF5\r\n 60\r\n     3\r\n 61\r\n     5\r\n292\r\n     1\r\n282\r\n     1\r\n141\r\n0.0\r\n142\r\n0.0\r\n 63\r\n   250\r\n421\r\n  3355443\r\n1001\r\nACAD_NAV_VCDISPLAY\r\n1070\r\n     3\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLTYPE\r\n  5\r\n5\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nLTYPE\r\n  5\r\n14\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByBlock\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n15\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nByLayer\r\n 70\r\n     0\r\n  3\r\n\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nLTYPE\r\n  5\r\n16\r\n330\r\n5\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLinetypeTableRecord\r\n  2\r\nContinuous\r\n 70\r\n     0\r\n  3\r\nSolid line\r\n 72\r\n    65\r\n 73\r\n     0\r\n 40\r\n0.0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nLAYER\r\n  5\r\n2\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1FF\r\n102\r\n}\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nLAYER\r\n  5\r\n10\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n13C\r\n102\r\n}\r\n330\r\n2\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbLayerTableRecord\r\n  2\r\n0\r\n 70\r\n     0\r\n 62\r\n     7\r\n  6\r\nContinuous\r\n370\r\n    -3\r\n390\r\nF\r\n347\r\nEE\r\n348\r\n0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nSTYLE\r\n  5\r\n3\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nSTYLE\r\n  5\r\n11\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n2.5\r\n  3\r\narial.ttf\r\n  4\r\n\r\n1001\r\nACAD\r\n1000\r\nArial\r\n1071\r\n       34\r\n  0\r\nSTYLE\r\n  5\r\n132\r\n330\r\n3\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbTextStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n1.0\r\n 50\r\n0.0\r\n 71\r\n     0\r\n 42\r\n2.5\r\n  3\r\narial.ttf\r\n  4\r\n\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n1001\r\nACAD\r\n1000\r\nArial\r\n1071\r\n       34\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nVIEW\r\n  5\r\n6\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     1\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nUCS\r\n  5\r\n7\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nAPPID\r\n  5\r\n9\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     9\r\n  0\r\nAPPID\r\n  5\r\n12\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n9E\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_PSEXT\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n133\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nAcadAnnoPO\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n134\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nAcadAnnotative\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n135\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_DSTYLE_DIMJAG\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n136\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_DSTYLE_DIMTALN\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n165\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_MLEADERVER\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n217\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_NAV_VCDISPLAY\r\n 70\r\n     0\r\n  0\r\nAPPID\r\n  5\r\n26C\r\n330\r\n9\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbRegAppTableRecord\r\n  2\r\nACAD_EXEMPT_FROM_CAD_STANDARDS\r\n 70\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nDIMSTYLE\r\n  5\r\nA\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     4\r\n100\r\nAcDbDimStyleTable\r\n 71\r\n     2\r\n340\r\n27\r\n340\r\n137\r\n  0\r\nDIMSTYLE\r\n105\r\n1B0\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nStandard\r\n 70\r\n     0\r\n340\r\n11\r\n  0\r\nDIMSTYLE\r\n105\r\n137\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nAnnotative\r\n 70\r\n     0\r\n 40\r\n0.0\r\n 41\r\n2.5\r\n 42\r\n0.625\r\n 43\r\n3.75\r\n 44\r\n1.25\r\n 73\r\n     0\r\n 74\r\n     0\r\n 77\r\n     1\r\n 78\r\n     8\r\n140\r\n2.5\r\n141\r\n2.5\r\n143\r\n0.03937007874016\r\n147\r\n0.625\r\n171\r\n     3\r\n172\r\n     1\r\n271\r\n     2\r\n272\r\n     2\r\n274\r\n     3\r\n278\r\n    44\r\n283\r\n     0\r\n284\r\n     8\r\n340\r\n11\r\n1001\r\nAcadAnnotative\r\n1000\r\nAnnotativeData\r\n1002\r\n{\r\n1070\r\n     1\r\n1070\r\n     1\r\n1002\r\n}\r\n1001\r\nACAD_DSTYLE_DIMJAG\r\n1070\r\n   388\r\n1040\r\n1.5\r\n1001\r\nACAD_DSTYLE_DIMTALN\r\n1070\r\n   392\r\n1070\r\n     0\r\n  0\r\nDIMSTYLE\r\n105\r\n27\r\n330\r\nA\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbDimStyleTableRecord\r\n  2\r\nISO-25\r\n 70\r\n     0\r\n 41\r\n2.5\r\n 42\r\n0.625\r\n 43\r\n3.75\r\n 44\r\n1.25\r\n 73\r\n     0\r\n 74\r\n     0\r\n 77\r\n     1\r\n 78\r\n     8\r\n140\r\n2.5\r\n141\r\n2.5\r\n143\r\n0.03937007874016\r\n147\r\n0.625\r\n171\r\n     3\r\n172\r\n     1\r\n271\r\n     2\r\n272\r\n     2\r\n274\r\n     3\r\n278\r\n    44\r\n283\r\n     0\r\n284\r\n     8\r\n340\r\n11\r\n  0\r\nENDTAB\r\n  0\r\nTABLE\r\n  2\r\nBLOCK_RECORD\r\n  5\r\n1\r\n330\r\n0\r\n100\r\nAcDbSymbolTable\r\n 70\r\n     2\r\n  0\r\nBLOCK_RECORD\r\n  5\r\n1F\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1CE\r\n102\r\n}\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Model_Space\r\n340\r\n22\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\nD2\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space\r\n340\r\nD3\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nBLOCK_RECORD\r\n  5\r\nD6\r\n330\r\n1\r\n100\r\nAcDbSymbolTableRecord\r\n100\r\nAcDbBlockTableRecord\r\n  2\r\n*Paper_Space0\r\n340\r\nD7\r\n 70\r\n     0\r\n280\r\n     1\r\n281\r\n     0\r\n  0\r\nENDTAB\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nBLOCKS\r\n  0\r\nBLOCK\r\n  5\r\n20\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Model_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Model_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\n21\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\nD4\r\n330\r\nD2\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\nD5\r\n330\r\nD2\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nBLOCK\r\n  5\r\nD8\r\n330\r\nD6\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockBegin\r\n  2\r\n*Paper_Space0\r\n 70\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 30\r\n0.0\r\n  3\r\n*Paper_Space0\r\n  1\r\n\r\n  0\r\nENDBLK\r\n  5\r\nD9\r\n330\r\nD6\r\n100\r\nAcDbEntity\r\n 67\r\n     1\r\n  8\r\n0\r\n100\r\nAcDbBlockEnd\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nENTITIES\r\n  0\r\nLWPOLYLINE\r\n  5\r\n26B\r\n330\r\n1F\r\n100\r\nAcDbEntity\r\n  8\r\n0\r\n100\r\nAcDbPolyline\r\n 90\r\n       12\r\n 70\r\n     1\r\n 43\r\n0.0\r\n 10\r\n1.0\r\n 20\r\n1.0\r\n 10\r\n1.0\r\n 20\r\n0.5\r\n 10\r\n0.5\r\n 20\r\n0.5\r\n 10\r\n0.5000000000000001\r\n 20\r\n1.0\r\n 10\r\n0.0000000000000001\r\n 20\r\n1.0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 10\r\n1.499999999999999\r\n 20\r\n0.0\r\n 10\r\n1.5\r\n 20\r\n0.75\r\n 10\r\n2.0\r\n 20\r\n0.75\r\n 10\r\n2.0\r\n 20\r\n0.0\r\n 10\r\n2.5\r\n 20\r\n0.0\r\n 10\r\n2.5\r\n 20\r\n1.0\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nOBJECTS\r\n  0\r\nDICTIONARY\r\n  5\r\nC\r\n330\r\n0\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nACAD_CIP_PREVIOUS_PRODUCT_INFO\r\n350\r\n216\r\n  3\r\nACAD_COLOR\r\n350\r\n6B\r\n  3\r\nACAD_DETAILVIEWSTYLE\r\n350\r\n21B\r\n  3\r\nACAD_GROUP\r\n350\r\nD\r\n  3\r\nACAD_LAYOUT\r\n350\r\n1A\r\n  3\r\nACAD_MATERIAL\r\n350\r\n6A\r\n  3\r\nACAD_MLEADERSTYLE\r\n350\r\n12D\r\n  3\r\nACAD_MLINESTYLE\r\n350\r\n17\r\n  3\r\nACAD_PLOTSETTINGS\r\n350\r\n19\r\n  3\r\nACAD_PLOTSTYLENAME\r\n350\r\nE\r\n  3\r\nACAD_SCALELIST\r\n350\r\n10C\r\n  3\r\nACAD_SECTIONVIEWSTYLE\r\n350\r\n219\r\n  3\r\nACAD_TABLESTYLE\r\n350\r\n7E\r\n  3\r\nACAD_VISUALSTYLE\r\n350\r\nEF\r\n  3\r\nACDB_RECOMPOSE_DATA\r\n350\r\n27D\r\n  3\r\nAcDbVariableDictionary\r\n350\r\n5E\r\n  0\r\nDICTIONARY\r\n  5\r\n1FF\r\n330\r\n2\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_LAYERSTATES\r\n360\r\n200\r\n  0\r\nDICTIONARY\r\n  5\r\n13C\r\n330\r\n10\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n1CE\r\n330\r\n1F\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n216\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n300\r\nACDMAC\r\n300\r\n2017\r\n300\r\nACDMAC_F_S\r\n  0\r\nDICTIONARY\r\n  5\r\n6B\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n21B\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nMetric50\r\n350\r\n21C\r\n  0\r\nDICTIONARY\r\n  5\r\nD\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n1A\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nLayout1\r\n350\r\nD3\r\n  3\r\nLayout2\r\n350\r\nD7\r\n  3\r\nModel\r\n350\r\n22\r\n  0\r\nDICTIONARY\r\n  5\r\n6A\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nByBlock\r\n350\r\nED\r\n  3\r\nByLayer\r\n350\r\nEC\r\n  3\r\nGlobal\r\n350\r\nEE\r\n  0\r\nDICTIONARY\r\n  5\r\n12D\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nAnnotative\r\n350\r\n13B\r\n  3\r\nStandard\r\n350\r\n12E\r\n  0\r\nDICTIONARY\r\n  5\r\n17\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n18\r\n  0\r\nDICTIONARY\r\n  5\r\n19\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nACDBDICTIONARYWDFLT\r\n  5\r\nE\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nNormal\r\n350\r\nF\r\n100\r\nAcDbDictionaryWithDefault\r\n340\r\nF\r\n  0\r\nDICTIONARY\r\n  5\r\n10C\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nA0\r\n350\r\n10D\r\n  3\r\nA1\r\n350\r\n1BE\r\n  3\r\nA2\r\n350\r\n1BF\r\n  3\r\nA3\r\n350\r\n1C0\r\n  3\r\nA4\r\n350\r\n1C1\r\n  3\r\nA5\r\n350\r\n1C2\r\n  3\r\nA6\r\n350\r\n1C3\r\n  3\r\nA7\r\n350\r\n1C4\r\n  3\r\nA8\r\n350\r\n1C5\r\n  3\r\nA9\r\n350\r\n1C6\r\n  3\r\nB0\r\n350\r\n1C7\r\n  3\r\nB1\r\n350\r\n1C8\r\n  3\r\nB2\r\n350\r\n1C9\r\n  3\r\nB3\r\n350\r\n1CA\r\n  3\r\nB4\r\n350\r\n1CB\r\n  3\r\nB5\r\n350\r\n1CC\r\n  3\r\nB6\r\n350\r\n1CD\r\n  0\r\nDICTIONARY\r\n  5\r\n219\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nMetric50\r\n350\r\n21A\r\n  0\r\nDICTIONARY\r\n  5\r\n7E\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nStandard\r\n350\r\n7F\r\n  0\r\nDICTIONARY\r\n  5\r\nEF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\n2dWireframe\r\n350\r\nF5\r\n  3\r\nBasic\r\n350\r\nF4\r\n  3\r\nBrighten\r\n350\r\nFB\r\n  3\r\nColorChange\r\n350\r\nFF\r\n  3\r\nConceptual\r\n350\r\nF8\r\n  3\r\nDim\r\n350\r\nFA\r\n  3\r\nEdgeColorOff\r\n350\r\n1E6\r\n  3\r\nFacepattern\r\n350\r\nFE\r\n  3\r\nFlat\r\n350\r\nF0\r\n  3\r\nFlatWithEdges\r\n350\r\nF1\r\n  3\r\nGouraud\r\n350\r\nF2\r\n  3\r\nGouraudWithEdges\r\n350\r\nF3\r\n  3\r\nHidden\r\n350\r\nF7\r\n  3\r\nJitterOff\r\n350\r\n1E4\r\n  3\r\nLinepattern\r\n350\r\nFD\r\n  3\r\nOverhangOff\r\n350\r\n1E5\r\n  3\r\nRealistic\r\n350\r\nF9\r\n  3\r\nShaded\r\n350\r\n1F3\r\n  3\r\nShaded with edges\r\n350\r\n1F2\r\n  3\r\nShades of Gray\r\n350\r\n1EF\r\n  3\r\nSketchy\r\n350\r\n1F0\r\n  3\r\nThicken\r\n350\r\nFC\r\n  3\r\nWireframe\r\n350\r\nF6\r\n  3\r\nX-Ray\r\n350\r\n1F1\r\n  0\r\nXRECORD\r\n  5\r\n27D\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 90\r\n        1\r\n330\r\n7F\r\n330\r\n21A\r\n330\r\n21C\r\n  0\r\nDICTIONARY\r\n  5\r\n5E\r\n102\r\n{ACAD_REACTORS\r\n330\r\nC\r\n102\r\n}\r\n330\r\nC\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  3\r\nCANNOSCALE\r\n350\r\n146\r\n  3\r\nCENTEREXE\r\n350\r\n259\r\n  3\r\nCENTERLTYPEFILE\r\n350\r\n25A\r\n  3\r\nCMLEADERSTYLE\r\n350\r\n145\r\n  3\r\nCTABLESTYLE\r\n350\r\n84\r\n  3\r\nCVIEWDETAILSTYLE\r\n350\r\n227\r\n  3\r\nCVIEWSECTIONSTYLE\r\n350\r\n228\r\n  3\r\nDIMASSOC\r\n350\r\n5F\r\n  3\r\nHIDETEXT\r\n350\r\n63\r\n  3\r\nLAYEREVAL\r\n350\r\n1AE\r\n  3\r\nLAYERNOTIFY\r\n350\r\n1AF\r\n  0\r\nDICTIONARY\r\n  5\r\n200\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1FF\r\n102\r\n}\r\n330\r\n1FF\r\n100\r\nAcDbDictionary\r\n281\r\n     1\r\n  0\r\nACDBDETAILVIEWSTYLE\r\n  5\r\n21C\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n236\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n21B\r\n102\r\n}\r\n330\r\n21B\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nMetric50\r\n290\r\n     0\r\n100\r\nAcDbDetailViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n        3\r\n 71\r\n     1\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n5.0\r\n300\r\n\r\n 40\r\n0.0\r\n280\r\n     1\r\n 71\r\n     2\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n 71\r\n     3\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n 90\r\n        0\r\n 40\r\n15.0\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewDetailId>% (%<\\AcVar ViewScale \\f \"%sn\">%)\r\n 71\r\n     4\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n280\r\n     0\r\n  0\r\nLAYOUT\r\n  5\r\nD3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nC:\\Documents and Settings\\basas\\Application Data\\Autodesk\\AutoCAD 2005\\R16.1\\enu\\plotters\\Default Windows System Printer.pc3\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout1\r\n 70\r\n     1\r\n 71\r\n     1\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\nD2\r\n  0\r\nLAYOUT\r\n  5\r\nD7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nC:\\Documents and Settings\\basas\\Application Data\\Autodesk\\AutoCAD 2005\\R16.1\\enu\\plotters\\Default Windows System Printer.pc3\r\n  4\r\n\r\n  6\r\n\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n 42\r\n0.0\r\n 43\r\n0.0\r\n 44\r\n0.0\r\n 45\r\n0.0\r\n 46\r\n0.0\r\n 47\r\n0.0\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n1.0\r\n 70\r\n   688\r\n 72\r\n     0\r\n 73\r\n     0\r\n 74\r\n     5\r\n  7\r\n\r\n 75\r\n    16\r\n147\r\n1.0\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nLayout2\r\n 70\r\n     1\r\n 71\r\n     2\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\nD6\r\n  0\r\nLAYOUT\r\n  5\r\n22\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n205\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1A\r\n102\r\n}\r\n330\r\n1A\r\n100\r\nAcDbPlotSettings\r\n  1\r\n\r\n  2\r\nnone_device\r\n  4\r\nISO_A4_(210.00_x_297.00_MM)\r\n  6\r\n\r\n 40\r\n7.5\r\n 41\r\n20.0\r\n 42\r\n7.5\r\n 43\r\n20.0\r\n 44\r\n210.0\r\n 45\r\n297.0\r\n 46\r\n11.54999923706054\r\n 47\r\n-13.65000009536743\r\n 48\r\n0.0\r\n 49\r\n0.0\r\n140\r\n0.0\r\n141\r\n0.0\r\n142\r\n1.0\r\n143\r\n8.704084754739808\r\n 70\r\n 11952\r\n 72\r\n     1\r\n 73\r\n     0\r\n 74\r\n     0\r\n  7\r\n\r\n 75\r\n     0\r\n147\r\n0.1148885871608098\r\n 76\r\n     0\r\n 77\r\n     2\r\n 78\r\n   300\r\n148\r\n0.0\r\n149\r\n0.0\r\n100\r\nAcDbLayout\r\n  1\r\nModel\r\n 70\r\n     1\r\n 71\r\n     0\r\n 10\r\n0.0\r\n 20\r\n0.0\r\n 11\r\n12.0\r\n 21\r\n9.0\r\n 12\r\n0.0\r\n 22\r\n0.0\r\n 32\r\n0.0\r\n 14\r\n0.0\r\n 24\r\n0.0\r\n 34\r\n0.0\r\n 15\r\n0.0\r\n 25\r\n0.0\r\n 35\r\n0.0\r\n146\r\n0.0\r\n 13\r\n0.0\r\n 23\r\n0.0\r\n 33\r\n0.0\r\n 16\r\n1.0\r\n 26\r\n0.0\r\n 36\r\n0.0\r\n 17\r\n0.0\r\n 27\r\n1.0\r\n 37\r\n0.0\r\n 76\r\n     0\r\n330\r\n1F\r\n331\r\nEA\r\n1001\r\nACAD_PSEXT\r\n1000\r\nNone\r\n1000\r\nNone\r\n1000\r\nNot applicable\r\n1000\r\nThe layout will not be plotted unless a new plotter configuration name is selected.\r\n1070\r\n     0\r\n  0\r\nMATERIAL\r\n  5\r\nED\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1F9\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n6A\r\n102\r\n}\r\n330\r\n6A\r\n100\r\nAcDbMaterial\r\n  1\r\nByBlock\r\n 94\r\n       63\r\n  0\r\nMATERIAL\r\n  5\r\nEC\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n1F7\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n6A\r\n102\r\n}\r\n330\r\n6A\r\n100\r\nAcDbMaterial\r\n  1\r\nByLayer\r\n 94\r\n       63\r\n  0\r\nMATERIAL\r\n  5\r\nEE\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n173\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n6A\r\n102\r\n}\r\n330\r\n6A\r\n100\r\nAcDbMaterial\r\n  1\r\nGlobal\r\n 43\r\n0.0007999999797903\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0007999999797903\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n0.0\r\n 43\r\n1.0\r\n 49\r\n0.0007999999797903\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0007999999797903\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n0.0\r\n 49\r\n1.0\r\n142\r\n0.0007999999797903\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0007999999797903\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n0.0\r\n142\r\n1.0\r\n144\r\n0.0007999999797903\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0007999999797903\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n0.0\r\n144\r\n1.0\r\n 94\r\n       63\r\n1001\r\nACAD\r\n1070\r\n    -1\r\n1070\r\n     3\r\n1070\r\n     0\r\n1000\r\n\r\n1071\r\n        0\r\n1070\r\n     0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n13B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12D\r\n102\r\n}\r\n330\r\n12D\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n14\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n2.0\r\n291\r\n     1\r\n 43\r\n8.0\r\n  3\r\nStandard\r\n 44\r\n4.0\r\n300\r\n\r\n342\r\n11\r\n174\r\n     1\r\n178\r\n     1\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n4.0\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n4.0\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     1\r\n143\r\n3.75\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLEADERSTYLE\r\n  5\r\n12E\r\n102\r\n{ACAD_REACTORS\r\n330\r\n12D\r\n102\r\n}\r\n330\r\n12D\r\n100\r\nAcDbMLeaderStyle\r\n179\r\n     2\r\n170\r\n     2\r\n171\r\n     1\r\n172\r\n     0\r\n 90\r\n        2\r\n 40\r\n0.0\r\n 41\r\n0.0\r\n173\r\n     1\r\n 91\r\n-1056964608\r\n340\r\n14\r\n 92\r\n       -2\r\n290\r\n     1\r\n 42\r\n2.0\r\n291\r\n     1\r\n 43\r\n8.0\r\n  3\r\nStandard\r\n 44\r\n4.0\r\n300\r\n\r\n342\r\n11\r\n174\r\n     1\r\n178\r\n     1\r\n175\r\n     1\r\n176\r\n     0\r\n 93\r\n-1056964608\r\n 45\r\n4.0\r\n292\r\n     0\r\n297\r\n     0\r\n 46\r\n4.0\r\n 94\r\n-1056964608\r\n 47\r\n1.0\r\n 49\r\n1.0\r\n140\r\n1.0\r\n293\r\n     1\r\n141\r\n0.0\r\n294\r\n     1\r\n177\r\n     0\r\n142\r\n1.0\r\n295\r\n     0\r\n296\r\n     0\r\n143\r\n3.75\r\n271\r\n     0\r\n272\r\n     9\r\n273\r\n     9\r\n298\r\n     0\r\n  0\r\nMLINESTYLE\r\n  5\r\n18\r\n102\r\n{ACAD_REACTORS\r\n330\r\n17\r\n102\r\n}\r\n330\r\n17\r\n100\r\nAcDbMlineStyle\r\n  2\r\nSTANDARD\r\n 70\r\n     0\r\n  3\r\n\r\n 62\r\n   256\r\n 51\r\n90.0\r\n 52\r\n90.0\r\n 71\r\n     2\r\n 49\r\n0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n 49\r\n-0.5\r\n 62\r\n   256\r\n  6\r\nBYLAYER\r\n  0\r\nACDBPLACEHOLDER\r\n  5\r\nF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nE\r\n102\r\n}\r\n330\r\nE\r\n  0\r\nSCALE\r\n  5\r\n10D\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:1\r\n140\r\n1.0\r\n141\r\n1.0\r\n290\r\n     1\r\n  0\r\nSCALE\r\n  5\r\n1BE\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:2\r\n140\r\n1.0\r\n141\r\n2.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1BF\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:4\r\n140\r\n1.0\r\n141\r\n4.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C0\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:5\r\n140\r\n1.0\r\n141\r\n5.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C1\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:8\r\n140\r\n1.0\r\n141\r\n8.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C2\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:10\r\n140\r\n1.0\r\n141\r\n10.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C3\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:16\r\n140\r\n1.0\r\n141\r\n16.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C4\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:20\r\n140\r\n1.0\r\n141\r\n20.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C5\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:30\r\n140\r\n1.0\r\n141\r\n30.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C6\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:40\r\n140\r\n1.0\r\n141\r\n40.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C7\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:50\r\n140\r\n1.0\r\n141\r\n50.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n1:100\r\n140\r\n1.0\r\n141\r\n100.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1C9\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n2:1\r\n140\r\n2.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CA\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n4:1\r\n140\r\n4.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CB\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n8:1\r\n140\r\n8.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CC\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n10:1\r\n140\r\n10.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nSCALE\r\n  5\r\n1CD\r\n102\r\n{ACAD_REACTORS\r\n330\r\n10C\r\n102\r\n}\r\n330\r\n10C\r\n100\r\nAcDbScale\r\n 70\r\n     0\r\n300\r\n100:1\r\n140\r\n100.0\r\n141\r\n1.0\r\n290\r\n     0\r\n  0\r\nACDBSECTIONVIEWSTYLE\r\n  5\r\n21A\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n234\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n219\r\n102\r\n}\r\n330\r\n219\r\n100\r\nAcDbModelDocViewStyle\r\n 70\r\n     0\r\n  3\r\nMetric50\r\n290\r\n     0\r\n100\r\nAcDbSectionViewStyle\r\n 70\r\n     0\r\n 71\r\n     0\r\n 90\r\n      102\r\n 71\r\n     1\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n340\r\n0\r\n340\r\n0\r\n 62\r\n   256\r\n 40\r\n5.0\r\n300\r\nI, O, Q, S, X, Z\r\n 40\r\n10.0\r\n 90\r\n        0\r\n 40\r\n2.5\r\n 90\r\n        0\r\n 71\r\n     2\r\n340\r\n16\r\n 90\r\n       25\r\n 62\r\n   256\r\n340\r\n16\r\n 90\r\n       50\r\n 62\r\n   256\r\n 40\r\n5.0\r\n 40\r\n2.5\r\n 40\r\n5.0\r\n 71\r\n     3\r\n340\r\n11\r\n 62\r\n   256\r\n 40\r\n5.0\r\n 90\r\n        0\r\n 40\r\n15.0\r\n 90\r\n        1\r\n300\r\n%<\\AcVar ViewSectionStartId>%-%<\\AcVar ViewSectionEndId>% (%<\\AcVar ViewScale \\f \"%sn\">%)\r\n 71\r\n     4\r\n 62\r\n   256\r\n 62\r\n   257\r\n300\r\nANSI31\r\n 40\r\n1.0\r\n 90\r\n        0\r\n290\r\n     0\r\n290\r\n     0\r\n 90\r\n        6\r\n 40\r\n0.0\r\n 40\r\n1.570796326794896\r\n 40\r\n0.2617993877991494\r\n 40\r\n1.308996938995747\r\n 40\r\n-0.2617993877991494\r\n 40\r\n1.832595714594046\r\n  0\r\nTABLESTYLE\r\n  5\r\n7F\r\n102\r\n{ACAD_XDICTIONARY\r\n360\r\n162\r\n102\r\n}\r\n102\r\n{ACAD_REACTORS\r\n330\r\n7E\r\n102\r\n}\r\n330\r\n7E\r\n100\r\nAcDbTableStyle\r\n280\r\n     0\r\n  3\r\nStandard\r\n 70\r\n     0\r\n 71\r\n     0\r\n 40\r\n1.5\r\n 41\r\n1.5\r\n280\r\n     0\r\n281\r\n     0\r\n  7\r\nStandard\r\n140\r\n4.5\r\n170\r\n     2\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n6.0\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  7\r\nStandard\r\n140\r\n4.5\r\n170\r\n     5\r\n 62\r\n     0\r\n 63\r\n     7\r\n283\r\n     0\r\n 90\r\n      512\r\n 91\r\n        0\r\n  1\r\n\r\n274\r\n    -2\r\n284\r\n     1\r\n 64\r\n     0\r\n275\r\n    -2\r\n285\r\n     1\r\n 65\r\n     0\r\n276\r\n    -2\r\n286\r\n     1\r\n 66\r\n     0\r\n277\r\n    -2\r\n287\r\n     1\r\n 67\r\n     0\r\n278\r\n    -2\r\n288\r\n     1\r\n 68\r\n     0\r\n279\r\n    -2\r\n289\r\n     1\r\n 69\r\n     0\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF5\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\n2dWireframe\r\n 70\r\n     4\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF4\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBasic\r\n 70\r\n     7\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFB\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nBrighten\r\n 70\r\n    12\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nColorChange\r\n 70\r\n    16\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  8421504\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF8\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nConceptual\r\n 70\r\n     9\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFA\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nDim\r\n 70\r\n    11\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n-50.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1E6\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nEdgeColorOff\r\n 70\r\n    22\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        8\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFE\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFacepattern\r\n 70\r\n    15\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF0\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlat\r\n 70\r\n     0\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF1\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nFlatWithEdges\r\n 70\r\n     1\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF2\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraud\r\n 70\r\n     2\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF3\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nGouraudWithEdges\r\n 70\r\n     3\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF7\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nHidden\r\n 70\r\n     6\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1E4\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nJitterOff\r\n 70\r\n    20\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n       10\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFD\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nLinepattern\r\n 70\r\n    14\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 90\r\n        7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1E5\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nOverhangOff\r\n 70\r\n    21\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 40\r\n0.6\r\n176\r\n     0\r\n 40\r\n30.0\r\n176\r\n     0\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        4\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 62\r\n   257\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        9\r\n176\r\n     2\r\n 62\r\n     7\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 90\r\n        6\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     0\r\n 62\r\n     7\r\n176\r\n     0\r\n 90\r\n        5\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     0\r\n 90\r\n        1\r\n176\r\n     0\r\n 40\r\n0.0\r\n176\r\n     0\r\n 90\r\n        0\r\n176\r\n     0\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF9\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nRealistic\r\n 70\r\n     8\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F3\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded\r\n 70\r\n    27\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     8\r\n420\r\n  7895160\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F2\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShaded with edges\r\n 70\r\n    26\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1EF\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nShades of Gray\r\n 70\r\n    23\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F0\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nSketchy\r\n 70\r\n    24\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n40.0\r\n176\r\n     1\r\n 90\r\n       11\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nFC\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nThicken\r\n 70\r\n    13\r\n177\r\n     3\r\n291\r\n     1\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n       12\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        5\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\nF6\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nWireframe\r\n 70\r\n     5\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 40\r\n0.6\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        4\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nVISUALSTYLE\r\n  5\r\n1F1\r\n102\r\n{ACAD_REACTORS\r\n330\r\nEF\r\n102\r\n}\r\n330\r\nEF\r\n100\r\nAcDbVisualStyle\r\n  2\r\nX-Ray\r\n 70\r\n    25\r\n177\r\n     3\r\n291\r\n     0\r\n 70\r\n    58\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n0.5\r\n176\r\n     1\r\n 40\r\n30.0\r\n176\r\n     1\r\n 62\r\n     7\r\n420\r\n 16777215\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 62\r\n   257\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        8\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        1\r\n176\r\n     1\r\n 90\r\n        6\r\n176\r\n     1\r\n 90\r\n        2\r\n176\r\n     1\r\n 62\r\n     7\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       13\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     1\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 40\r\n0.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 90\r\n        0\r\n176\r\n     1\r\n 62\r\n    18\r\n420\r\n        0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n        3\r\n176\r\n     1\r\n 62\r\n     5\r\n420\r\n      255\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 90\r\n       50\r\n176\r\n     1\r\n 62\r\n   256\r\n176\r\n     0\r\n 40\r\n1.0\r\n176\r\n     0\r\n 90\r\n        2\r\n176\r\n     1\r\n  1\r\nstrokes_ogs.tif\r\n176\r\n     1\r\n290\r\n     0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n 40\r\n1.0\r\n176\r\n     1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n146\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1:1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n259\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n3.500000\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n25A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nacadiso.lin\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n145\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n84\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nSTANDARD\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n227\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nMetric50\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n228\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\nMetric50\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n5F\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n2\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n63\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n1\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n1AE\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARYVAR\r\n  5\r\n1AF\r\n102\r\n{ACAD_REACTORS\r\n330\r\n5E\r\n102\r\n}\r\n330\r\n5E\r\n100\r\nDictionaryVariables\r\n280\r\n     0\r\n  1\r\n0\r\n  0\r\nDICTIONARY\r\n  5\r\n236\r\n330\r\n21C\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_XREC_ROUNDTRIP\r\n360\r\n27C\r\n  0\r\nDICTIONARY\r\n  5\r\n205\r\n330\r\n22\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  0\r\nDICTIONARY\r\n  5\r\n1F9\r\n330\r\nED\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nFBXASSET\r\n360\r\n1FA\r\n  0\r\nDICTIONARY\r\n  5\r\n1F7\r\n330\r\nEC\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nFBXASSET\r\n360\r\n1F8\r\n  0\r\nDICTIONARY\r\n  5\r\n173\r\n330\r\nEE\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nBUMPTILE\r\n360\r\n175\r\n  3\r\nDIFFUSETILE\r\n360\r\n174\r\n  3\r\nFBXASSET\r\n360\r\n1FB\r\n  3\r\nOPACITYTILE\r\n360\r\n176\r\n  3\r\nREFLECTIONTILE\r\n360\r\n177\r\n  0\r\nDICTIONARY\r\n  5\r\n234\r\n330\r\n21A\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_XREC_ROUNDTRIP\r\n360\r\n27B\r\n  0\r\nDICTIONARY\r\n  5\r\n162\r\n330\r\n7F\r\n100\r\nAcDbDictionary\r\n280\r\n     1\r\n281\r\n     1\r\n  3\r\nACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP\r\n360\r\n27A\r\n  0\r\nXRECORD\r\n  5\r\n27C\r\n102\r\n{ACAD_REACTORS\r\n330\r\n236\r\n102\r\n}\r\n330\r\n236\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n102\r\nDISPLAYNAME\r\n  1\r\nMetric50\r\n102\r\nFLAGS\r\n 90\r\n        0\r\n  0\r\nXRECORD\r\n  5\r\n1FA\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1F9\r\n102\r\n}\r\n330\r\n1F9\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 70\r\n     1\r\n 90\r\n429727718\r\n  1\r\nD62C5603-E3A1-4AEA-B7FB-FE5D8D0755AF\r\n310\r\n504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E\r\n310\r\n6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E\r\n310\r\nD98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A\r\n310\r\nEF7053A7E60B504B0304140006080800CC70623B853B8169EB0000007C01000008000000636F72652E786D6C8D90416EC3201045AF62CDB6C206821CC7C244919D9CA01740401C94182C03558F5F9C3852BBEB6A467FFE9B197D7EFC9E1EC5975982F5AE035262288C535E5B377690E21535501C055FBC8FBF6C503839990E\r\n310\r\n5619041F179FE64D52DE45E362569DD7661365082642A11EB9E920A89B99642953CC8E702F67A9EE7234257977194EC9EAE275C4EABCCF5EAD5940D4AC6F0E35A568B8F43562CD7046CD199FD07E60174276A7BE677B5EADB0E0D14EEFFB6A31321A0D82627C4084204C3F096B71DD52F6819B16635EADF63F509AF53FA164\r\n310\r\n5DDCD1EDDD17164090FCC8732078B56691CB33A85CD7DCC40F504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF32603847\r\n310\r\n2BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623BDBABAAF470010000D40300000C0000006662782F636F72652E786D6CC553D16E823014FD95A6AF4B694182CC941A83FA05FB810A9511A125A5257EFE2E82712ECEB8A7F100CD39F7F69E734AF9FADC366850B6\r\n310\r\nAF8DCE7018308C942E4C59EB2AC3DE1D498AD15A706B8CFB56869196ADCAF00863C12B6B7C374385D14E6907A836A59A41D9F7CA615434B0C8705F7CAA5606D23BA8E84F41278B93AC54100640439DE0BDB320004D43C63716C7C399D30917DCFBBA9CD9BA8469F5B156168B24CED3F7248AC8769F27244EB73B92EED8862C\r\n310\r\nB7F13E0C179B3C8F979C8ECD82BBBABDAA2BAC924E9558448CBD9330242CFA08E3154B5651FCC6D215639C8EE5774DBE2B5F6CF2B5768B68963BB5F5588420E442FC700B1139D4CB01F450C1E918227C2E09DF070D8140C84E1E9AAB8F1340832A9CB13130A5F1376A908D57309505ECF2A0DF179C4E9D30F5B239B87E3823\r\n310\r\n7A79C6F31DE1A8A5AEC08474B03C7837EAE4938639B44E5932B833D2C6B6B279CDC613877FA26EE21F4A2A4C63EC7F29A2F301D1F9F7A0E37D145F504B0304140006080800CC70623B9C113CC27E0000009D0000000B0000006662782F636E782E786D6C4DCCDF0A83201C86E15B91DFB94BFB330DD428C8FB886521330DA7\r\n310\r\n6397BF1A1DECE883878F57749FCDA1B7892F1BBC047A23808C7F84D9FA55424E0BE6803A256208E9EF06C84F9B91703228B1C690F78B66B34CD9A5439DF5CF0BFBF65E35BCA1B8D6A5C6F540381E886698B5741C695F9503EBA150A2F8958E3DC3EA0B504B0304140006080800CC70623B7DF2F77C2A010000120200003100\r\n310\r\n00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636F72652E786D6C8D51DB8EC22014FC15C2939B0D2DB4B45643319AE817EC0F6041255A68B86CFCFC856D4D76DF7CE190393373060EDB3DC707F856CE6B6B7A480A0C81328395DA5C7B18C3057510EC3873D686\r\n310\r\n3F34088C18550F330C39BB3A1BA7051AAC09CA84841A2BD5020AEF55806078A44B0FFD7053A328440C89E1EFC52486BBB8AA8214A99D789CF9E05200300FC927E4FB4D5B375D43103D5527440FB843077C5AA3F5861C8F645F5787F59E95B390B318B55CE45AA638FAA2957BD7248B390B7A7CC51F9C124149C82B8C378810\r\n310\r\n84AB2F42B7B8DD56F413775B8C5999E9FF4471926F8AA236A1AE96B8B3CC434E5839373893369E1FAF30EA395917409EB7F26AF8801C171837A4A6AC9C89E9F9C9B1A58BA30FD6A5EF5DDDCF894B9AD9B6A59C957943A9FCAE2FD5BC4DFE03504B0304140006080800CC70623BAD7543B64E01000033030000300000006662\r\n310\r\n782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C789FEE\r\n310\r\n6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5C89177\r\n310\r\n38143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05E20750\r\n310\r\n4B0304140006080800CC70623BE75B7789680500003C100000340000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F6F626A656374732E786D6CAD575B8F9B3818FD2B887D06C22499CB8AA1CA655245D5B455A356FB305264C061D8018C6C3393D95FBFC7600890\r\n310\r\nA4CD5EF210B0B1BFEBF98E3F7B1FF6596ABC522E1296DF9BAE3D320D9A872C4AF2F8DE2CE5CEBA358D0FBEC719939D65A691938CDE9B6ADAF4BD98B3B2D05311DD91329583D9D5FC0F438434A7A611A644887B5384CF34233629258BA878B12322891DEFF6B66BD70BFB62634E8AE781D082709A4B588AF91C528CDA28B73F\r\n310\r\n1C998EEF39EABBEFA97FBD6A7C7E9553F9D3D79FE442923C3C523610337627CB87ABE99D359D4CC6D6E4FACAB5E6ABF9D2726FC6A3C5F56271377BB88362213924694B38DD99FE47C48627A1E7D49F5A8BB5E1A74C0A599ED3B0F21F1E56366B89112D681E218F0915D0D6F17AD41FBA2A369DCF6335D62ABBD39779D5DDD1\r\n310\r\n11D4D8DE3CBB96B2E04FB8202E41051754A1AA8E8F76B4C6DFE810B580B1547F4B84911149794252234D024EF8BBE963A95AE27B3D310A9D5C215C7960FAEE415ED75694C6AFB17BCACA5D99A60A9AA65F217B0BFC53292ACB92BF283FAD0D3621576592CB5BED907C2FA8E9DF794E35E97BEA31BED21FEB401ABB94C44839\r\n310\r\nDCACBF0E1C5DA8DA5B2F4DFFD32AD86F543D9E565E7056502E157C00AD2671CD534549AB752FCA9CDA00677A313F04E51B22FF19E57B300579E3C97EB29F682D92935CEC18CF901B7B54FD8C51F362B56FC72FE0B3C1EAE335EDCCBF5AEC39ADB17DC238973F804BA5E6F6BFE7AF1FB32E523BE9F3BD571418E3631DCA4D48\r\n310\r\n5250CF639223210A9446CA30052EDF057BD35F8329C1ECD84552BF0DC8D18BE7BCE23BFE6BD960AB4A7DE79923A103BEBD80F911CBAA2C60DB19B01CF164A5583B772EE6D3FFA56666CBCDA74DC97724A48F9A58967497E489C4D979006FD7A05E227A1EBDD0F737C623387A9C844D3709995625106D157315F8B8392CD4E0\r\n310\r\nA0B9A720C4BE9829CEF37EA1E13111214D53925356365ADA634861B52519DD27A00AEB808EAF0628E6F435519D446F45CF2C9CF5214F0A15B2F6D06B79DA3EE3CBF7F56780D2F4E7EF73A0F5E5B02A38D07DC852C6B7C1FBB6664213E0C39E3EBA7FF4E1AD23EA2829407C85E586727488B751B2DB9502BC7B228A3FD68B6E\r\n310\r\nA65A22397E690AA8D158D7E404EC8CDA235CC3B7D1898680131CEC2CDF2638C65196279577750F15884AEE19F94199155B92B13297978469D4F8D358DF0AEF7631E28DC8F0D9F437D5D39A83B2231A1D52D543813A824EF8D44BCFF2FA6A31BD1E8DAD87F1CCB526B3879935BF59CDADD5C37479BB1CDD4CA7B3556B516589\r\n310\r\nEF352754B706114D9C885EC9131DE6EFEB43D99AFE2391C2F958179413D7CFEF6B1B6DB1E7600F00DE6E5C67454A339A4BA2E0FBA85ED26F045D454F463DBFCE484C2F90F2E5E3666003662ED8F755951A7D1BECD5B30B550B2785C8E7320B7292A4838DDA71BBC863ED7613CAF659337A3354231D4FF4A182A54904C2898C\r\n310\r\n98B28C4AD0CE056CCF332A80986E571EE9DBC305BB5FEB7E509220A58D25CF042D712A806AC0AD0C657FDEF80D2D9CEAA2EE4D1C76F60BFE74219A06527D6F82DF6412526107381E55E353090704D085B52408A8913C4ED159D79BDA71BB4BC506F4831350EB6F975CD22D69BF7AC49B91A2C0A9DDA3D5CA36AD20FC478E37\r\n310\r\nE61844E2352865EBCB61A275A65283CAAA9DD27703B4102F5AF51EF5F573B75CBB5AD38BC845F7A49F82A0966A49C2E3EA5EA0ECD326CD965F1DB402C6FA8B51A4658C5C5E2EC9E214602E55810345408596591009A82E7E7FFACA19EEA299B14A0081A705CB3296EBC14CDF658DCD336EA6D1136881AAEB87B81AB9EE53D5\r\n310\r\nF5EB8BC8362082DA24122F98680A4E7930C01A0079749CEA14382A0783E5EBA5A10F8C098456A03D6A4AEB6BB881E2513747552A5DB22C7EDAF83BD5528081A365F7FF06504B0304140006080000CC70623B000000000000000000000000350000006662782F41393633353835312D344632462D344230382D423046372D37\r\n310\r\n39314545314133324237412F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F747269616E676C65732E62696E636660600000504B0304140006080000CC7062\r\n310\r\n3B000000000000000000000000370000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F41393633353835312D344632462D344230382D4230\r\n310\r\n46372D3739314545314133324237412F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE6\r\n310\r\n07FB144396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623BEDD1DC58FD000000A00100003B0000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F7265736F75726365732F\r\n310\r\n636F72652E786D6C8D504B6E833010BD0A9A6D65B00922041947112427E8052C33A156828DFCA97AFC9A40A576D7CDCCE87D344F8F9FBFE667F689CE6B6B3A6039850C8DB2A336530731DC4903D95970676DF82583CCC8193B5861107C72362E3BA4AC096842428D1D7107A5F7182053CF7474E0D507CE32973124857FE48B\r\n310\r\n540F3961CEF244279DE03EB81420DB9EAC1384436FA353E879B1B182C7A8C75DA3C7F453DF353A1075D537A7BA6464B8F535A99AE14A9A2BBD90E350DD183B5CFABE3AF262350B1EF4FC9351399401471025A527C218A1E53BAB5A5AB765F5469B96525EACF23FA6B88CFF34456DC2A1DCE36E360F82A5202F42F062ED2BAD\r\n310\r\n579969AFDD8A6F504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B\r\n310\r\n436F6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623B853B8169EB0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000094020000636E782E786D6C504B\r\n310\r\n01021400140006080800CC70623BDBABAAF470010000D40300000C00000000000000000000000000180300006662782F636F72652E786D6C504B01021400140006080800CC70623B9C113CC27E0000009D0000000B00000000000000000000000000B20400006662782F636E782E786D6C504B01021400140006080800CC70\r\n310\r\n623B7DF2F77C2A010000120200003100000000000000000000000000590500006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D2060000\r\n310\r\n6662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636E782E786D6C504B01021400140006080800CC70623BE75B7789680500003C10000034000000000000000000000000006E0800006662782F41393633353835312D344632462D344230382D423046372D3739314545\r\n310\r\n314133324237412F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000280E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F76657274696365732E62696E504B01021400140006\r\n310\r\n080800CC70623BF270F133060000000400000036000000000000000000000000007B0E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F747269616E676C65732E62696E504B01021400140006080000CC70623B0000000000000000000000003700000000000000\r\n310\r\n000000000000D50E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD1900000004101000036000000000000000000000000002A0F00006662782F41393633353835312D344632\r\n310\r\n462D344230382D423046372D3739314545314133324237412F6469726563746F72792E786D6C504B01021400140006080800CC70623BEDD1DC58FD000000A00100003B000000000000000000000000000E1000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F7265\r\n310\r\n736F75726365732F636F72652E786D6C504B0506000000000E000E0080040000641100000000\r\n  0\r\nXRECORD\r\n  5\r\n1F8\r\n102\r\n{ACAD_REACTORS\r\n330\r\n1F7\r\n102\r\n}\r\n330\r\n1F7\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 70\r\n     1\r\n 90\r\n429727718\r\n  1\r\n30362254-06B7-45E0-A893-8CFA70E3D6BC\r\n310\r\n504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E\r\n310\r\n6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E\r\n310\r\nD98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A\r\n310\r\nEF7053A7E60B504B0304140006080800CC70623B1EC5D7A3EB0000007C01000008000000636F72652E786D6C8D90416EC3201045AF82665B6103C6756C6122AB4D4ED00B204C5C94182C03558F5F9C3852BBEB6A467FFE9B197D71FC9E6FE8CBACC17AD7032D0820E3B41FAD9B7A48F1820F808E52ACDEC75F36404ECDA687\r\n310\r\n4D0629A6D5A76597B477D1B89855E747B38B2A041301E95B6E7A08FAD3CCAA50296647B8168BD2573599823EBB0CA76447F43862C7BCCF5EAC59410E4DDD9C7973C2755553CCCFA4C603E3040F1565ED3B1FDE4E432BCA0D9622DAF9795FAF464533826484B498524CD807E51D79ED187F21878E10516EF63F505AC67F42C9\r\n310\r\nBA58B1FDDD071640D2FCC87D2045B96591CB3DA85CB7DCE40F504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF32603847\r\n310\r\n2BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623B8C9102E971010000D40300000C0000006662782F636F72652E786D6CC5535B6E833010BC8AE5DF0A6C08340F1947A84D4ED00B38C6A128602363A31CBFCB234A53A551FA553EC09AD9F5CE8C31DB9E9B1AF5CA\r\n310\r\n7695D1198E428A91D2D214952E33ECDD315861B4E5CC1AE3BE9561A445A3323CC098B3D21ADFCE9034DA29ED00D5A6503328BA4E398C640D8B0C77F253352214DE4145770A5B214FA2546114020D759C75CE8200340D19DE981F0F6746269C33EFAB6266AB02A655C74A59CCF365BADC27CB5D902ED22848F6340DF238A141\r\n310\r\nBE88E2F57B92BFEDF23523433367AE6A2EEAA455C2A902F398D2751045018D3FA264435F3771F242571B4A1919CA6F9A7C5B3CD9E42BED16F12C776AEB308F40C848FC700B1139D4891EF410CEC810227CC6846F8386402064270EF5C5C709A05E49676C024C61FC95EA45ED154CA5211D1FF4FB8291A913A68E9B83EBBB33\r\n310\r\nE2A7673CDE118E5AE8124C0807CB8377834E366998436B950D7A7746DAD846D4CFD978E0F04FD455FC5D49D2D4C6FE9722321F10997F0F32DC47FE05504B0304140006080800CC70623BFFEA85907E0000009D0000000B0000006662782F636E782E786D6C4DCCD10A83201886E15B91FFDC95D95A811AB6F23E625948A6C3\r\n310\r\nE9D8E5AF46073BFAE0E1E365ED67B3E8ADC3CB78C7815C7240DA3DFC64DCC221C519D7805AC182F7F1EF06C88D9BE6703008B6049F9E274D7A1E938DBB5AE3D6131B2589BA0D3D965551E0B2EA732C9B9A624AAEB41E3A557677029960D9AFB4EF11165F504B0304140006080800CC70623B4FEEA4082C0100001202000031\r\n310\r\n0000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636F72652E786D6C8D515B6EC32010BC0AE2AB55850DD871ED0813254D72825EC00192A2C460F1A872FC42ED48ED5F7E00CDCECCCEB26C731F6FE05B39AFADE921293004CA082BB5B9F43086336A21D870E6AC\r\n310\r\n0D7F68109861543DCC30E4ECE26C9C164858139409093556AA051CBC570102714B8F1E7AF1A5C6A11862480C7F2DA6415C878B2A4891CA89C7990F2E050073937C42DE1DB7E4F87ED8A36D4329AA9B3D46DBAEAD504556557BD81DEBDD0761E52CE42C462D17B996298E3E6BE59E35C962CE821E1FF18553435012728A7187\r\n310\r\n0841987E927A8D9B35ADDF70BBC6989599FE4F1427F9A4286A132ABAC49D651EF234CD5CE04CDA78BA3DC2A8FB645D00B9DF8B57E215725C60BCA2A463E54C4CE327C7A65E1C7DB02E7DEFCBF594B864C5CA6CDBD49C957943E9FA5D5FBAF336F90F504B0304140006080800CC70623BAD7543B64E01000033030000300000\r\n310\r\n006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C\r\n310\r\n789FEE6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5\r\n310\r\nC8917738143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05\r\n310\r\nE207504B0304140006080800CC70623B16AB87BA640500003C100000340000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F6F626A656374732E786D6CAD575B6FA33818FD2B887DE6924B3BED8A326A92B68A663B534DD4D13E548A0C38942D60649B369D5FBFC7\r\n310\r\n600890A493BDE42160637FD7F31D7FF63E6FB3D478A55C242CBF3247B66B1A340F5994E4F19559CA8D75611A9F7D8F33263BCB4C232719BD32D5B4E97B316765A1A722BA21652A07B3B7B33F0D11D29C9A46981221AE4C113ED38CD8A4942CA2E2C58E882476BCD9DA23BB5ED8171B73523C0F841684D35CC252CCE79062D4\r\n310\r\n468DFA43D7747CCF51DF7D4FFDEB5593E3AB9CCA9FBEFE241792E4E19EB28198C968BAB8199F5D5A67D3E9C49A9E8F47D6EC76B6B0469F26EEFC7C3EBFBCBEB98462213924694B38DD98FE1D62C393D073EA4FADC5DAF04326852CCF6958F90F0F2B9BB5C48816348F90C7840A68EB78EDF68723159BCEE7891A6B95DDE9D3\r\n310\r\nBCEAEEE8086A6C6F9E5D4B59F0175C10A7A0820BAA5055C7473B5AE3CFDD452D602CD5DF12616444529E90D448938013FE6EFA58AA96F85E4F8C42275708571E98FE6827AF6B2B4AE3D7D83D64E5A64C53054DD3AF90BD06FEA9149565C94FCA0F6B834DC85599E4F2423B24DF0B6AFA979E534DFA9E7A4CC6FA631D486393\r\n310\r\n921829879BF5D781A373557BCB85E97FB90DB62B558F8795179C15944B051F40AB495CF35451D26A4727654E6D8033BD98EF82F21D91FF8AF2DD9982BCF1643BDD4EB516C9492E368C67C88DED563FC36D5EACF66DFF057C3658BDBFA69DF9578B3DA735B64F18C7F20770A9D45CFCF7FCF563D6456A277DBEF78A02637CA2\r\n310\r\n43B90A490AEAB94F72244481D24819A6C0E59B606BFA4B3025981DBB48EAB701D97BF19C577CC77F2D1B6C55A9EF3C732474C0B727303F625995056C3B02963D9EAC146BE78EC5FCEC7FA999EBC5EACBAAE41B12D27B4D2C0BBA49F244E2ECDC81B76B502F113D8F5EE8FB1BE3111CDD4FC2AA9B844CAB1288B68AB90A7CDC\r\n310\r\n1C166AB0D3DC5310625FCC14E779BFD0709F8890A629C9292B1B2DED31A4B0DA928CEE135085754027E3018A397D4D5427D15BD1330B677DC8934285AC3DF45A9EB68FF8F2B8FC0A509AFEECFD0FF2DE25CC6047F7214B195F07EFEB9A094D800F7BFAE8FED187B78EA8A3A400F115961BCAD1215E47C966530AF0EE8128FE\r\n310\r\n58CEBB996A8964FFA529A046635D9353B0336A8F700DDF46271A024E70B0B37C9DE01847591E54DED53D54202AB947E4076556AC49C6CA5C9E1226B7F1A7B1BE15DEED62C41B91E1B3E9AFAAA735036547343A925075041DF0A9979E893B391F8FCFA6967B3EFB644DCF6E5CEBFAE272625DCC6FAF3FB93793C5F90CE1EF57\r\n310\r\n407342756B10D1C489E8953CD1617E5CEECAD6F4EF8914CE5D5D504E5C3F1F9736DA62CFC11E00BCDDB8CC8A9466349744C1F75EBDA4DF09BA8A9E8C7A7E9991989E20E5DBDD6A6003664ED8F7A04A8DBE0DF6EAD9B9AA858342E47399053949D2C146EDB85DE4B176BB0965FBAC19BD19AA918E27FA50C1D22402E144464C\r\n310\r\n59462568E704B6E71915404CB72B8FF4EDE184DDAF753F284990D2C6926782963815403548A70C657FDEF80D2D9CEAA2AE4C1C76F60BFE74219A06527D6582DF6412526107381E55E353090704D085B52408D0933C4ED159D79BDA71BB4BC506F4831350EB6F979CD22D69BF7AC49B91A2C0A9DDA3D5CA36AD20FC478E37E6\r\n310\r\n1844E2352865EBCB6EA275A652E3836BE04EFB400BF1A2556F515F1FBB35B2AB35BD889C744FFA1004B5544B121E57F70215746DD2F5E2C1412B602CBF19455AC6C8E5E9922C4E01E65215385004546899059180EAFCF7A707CE7017CD8CDB0410789AB32C63B91E5CEBBBACB17AC6CD347A022D5075FD106377347AAABA7E\r\n310\r\n7D11590744509B44E205134DC1290F06580320F78E537D3D73540E06CB970B431F185308AD40BBD794D6D77003C5A36E8EAA54BA64597CD8F83BD552A080A365F7FF06504B0304140006080000CC70623B000000000000000000000000350000006662782F39464131463745442D413632322D343644302D413938332D3331\r\n310\r\n353338454246344243312F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F747269616E676C65732E62696E636660600000504B0304140006080000CC70623B\r\n310\r\n000000000000000000000000370000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F39464131463745442D413632322D343644302D413938\r\n310\r\n332D3331353338454246344243312F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE607\r\n310\r\nFB144396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623B0D6EF93BFE000000A00100003B0000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F7265736F75726365732F63\r\n310\r\n6F72652E786D6C8D50596E833010BD0A9ADFCA60B334011947A8694ED00B586642AC041B79A97AFC9A40A5F6AF3F33A3B7689E1E3F7DCD8FEC139DD7D6F4C0720A191A65476DA61E62B892236427C19DB5E1970C322367EC618541F0C9D9B8EC90B226A009093576C41D94DE63804C3DD2D18357379C652E63480A7FCF17A9\r\n310\r\nEE72C29CE5894E3AC17D702940B63D59270887DE46A7D0F36263058F518FBB468FE9A7BE6A7420864373B8D4873369AA8691FA421B3294352543C5CAF65C0F6FEF43CB8BD52C78D0F34F46E550061C419494B6843142CB0F5677F4B52BEB177AEC28E5C52AFF638ACBF84F53D42654E51E77B379102C05791282176B5F693D\r\n310\r\nCB4C7BED567C03504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B\r\n310\r\n436F6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623B1EC5D7A3EB0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000094020000636E782E786D6C504B\r\n310\r\n01021400140006080800CC70623B8C9102E971010000D40300000C00000000000000000000000000180300006662782F636F72652E786D6C504B01021400140006080800CC70623BFFEA85907E0000009D0000000B00000000000000000000000000B30400006662782F636E782E786D6C504B01021400140006080800CC70\r\n310\r\n623B4FEEA4082C0100001202000031000000000000000000000000005A0500006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D5060000\r\n310\r\n6662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636E782E786D6C504B01021400140006080800CC70623B16AB87BA640500003C1000003400000000000000000000000000710800006662782F39464131463745442D413632322D343644302D413938332D3331353338\r\n310\r\n454246344243312F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000270E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F76657274696365732E62696E504B01021400140006\r\n310\r\n080800CC70623BF270F133060000000400000036000000000000000000000000007A0E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F747269616E676C65732E62696E504B01021400140006080000CC70623B0000000000000000000000003700000000000000\r\n310\r\n000000000000D40E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD190000000410100003600000000000000000000000000290F00006662782F39464131463745442D413632\r\n310\r\n322D343644302D413938332D3331353338454246344243312F6469726563746F72792E786D6C504B01021400140006080800CC70623B0D6EF93BFE000000A00100003B000000000000000000000000000D1000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F7265\r\n310\r\n736F75726365732F636F72652E786D6C504B0506000000000E000E0080040000641100000000\r\n  0\r\nXRECORD\r\n  5\r\n175\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n174\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n1FB\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n 70\r\n     0\r\n 90\r\n1673772943\r\n  1\r\nECE7A1D2-D628-4531-984C-D00F80459256\r\n310\r\n504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E\r\n310\r\n6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E\r\n310\r\nD98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A\r\n310\r\nEF7053A7E60B504B0304140006080800CC70623BD9DDAED0EC0000007C01000008000000636F72652E786D6C8D90416EC3201045AF82665B61836D9CD8C2444DD39CA01740405C94182C03558F5F9C3852BBEB6A467FFE9B197D7EF89E6EE8CB2CC17A37002D0820E394D7D68D03A478C17B4007C117EFE32F1B20272733C0\r\n310\r\n2A83E0E3E2D3BC49CABB685CCCAAF3DA6CA20CC14440EA969B0182FA34932C648AD911AEC52CD5558EA6A0CF2EC329598D1E47ACCEFBECC59A050463A7EA5833865FEBDD0E37353BE3EE8DBDE3F6786A48D375FBF6CC78B9C282473B3DEFABC5C86834888A900E538A49F5419B9EB47DD5BC907D4F082F57FB1F28CDFA9F50\r\n310\r\nB22ED6D5F6EE030B20687EE43E10BC5CB3C8E51E54AE6B6EE207504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF326038\r\n310\r\n472BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623BA24EB22D72010000D40300000C0000006662782F636F72652E786D6CC5535B6E833010BC8AE5DF0A6C5E49888CA3A6694ED00B38E05014B091B1518EDFE511A5A9D228FD2A1F60CDEC7A67C6986DCE4D8D7A\r\n310\r\n69BA4AAB0C073EC548AA5C17952A33ECECD15B61B4E1CC686DBF9561A44423333CC098B3D268D7CE50AE9595CA02AA74216750749DB418E5352C32DCE59FB211BE70162ABA93DF8AFC244AE9073ED050C759670D0840D390E18DF9F1706664C23973AE2A66B62A605A75ACA4C13C4976E1364A12EF355A2EBD384AF65EFA96\r\n310\r\nBC7B8BED2EA6719AAE16FB8491A199335B351775B991C2CA02F390D2D40B028F861F41BCA68B7518BFD0D59A524686F29B26D7164F36B94AD9289CE54E6D1DE6010819891F6E21228B3AD1831EC219194284CF98F06DD01008846CC5A1BEF83801D4CBDC6A1303536877A57A513B0953A94FC707FDBE6064EA84A9E3E6E0FA\r\n310\r\nEE8CF0E9198F7784A316AA0413C2C2F2E0ECA0934D1AE6D05A69BCDE9E91D2A611F573361E38FC1375157F5752AE6B6DFE4B11990F88CCBF0719EE23FF02504B0304140006080800CC70623B408A7D3B7C0000009D0000000B0000006662782F636E782E786D6C4DCCD10A83201886E15B91FFDC552A92A0064DBC8F581632\r\n310\r\nD3703A76F9ABD1C18E3E78F878E5F0D9027ABBFCF2292AE86E2D20171F69F6715550CB827B40839639A5F2770314A7CD293819B45C73AAFB45B35BA61ACAA1C1C7E7855C58C15BC331339661262CC762340413D68D77DA5B42298546CBE6573AF60CEB2F504B0304140006080800CC70623B449FB9BD290100001202000031\r\n310\r\n0000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636F72652E786D6C8D515B6EC32010BC0AE22B55850D98B871848994463E412FE002495162B07854397EA176A4F62F3F2C9A9D991D587EB84F37F0AD7D30CEF6905418026DA553C65E7A98E219ED203808EE9D\r\n310\r\n8B7F6810D871D23D2C3014FCE25D9A57483A1BB58D19B54EE9151C43D0110279CB971E06F9A5A7B11A53CC8C70ADE6515EC78BAE4895DB992778883E0700CB907242D17643D7E2538BD869608875438BBAE38922CAC8F1BDD90DB4691A5E2F42C153326A951B95E398B3D1FE599322163C9AE9115F7A3D46ADA0A018778810\r\n310\r\n84E907617BDCEE297BC5BB3DC6BC2EF47FA234AB2745C9D8D8D035EE220B50105E2F0DC1954B9FB747187D9F9D8FA0CCDB042D5FA0C015C65B42DF78BD10F3F3B363CB56C7109DCFDFBBB97E662ED92EB62D13BC2E1BCAE5777DB9966D8A1F504B0304140006080800CC70623BAD7543B64E01000033030000300000006662\r\n310\r\n782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C789FEE\r\n310\r\n6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5C89177\r\n310\r\n38143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05E20750\r\n310\r\n4B0304140006080800CC70623B8D05915C650500003B100000340000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F6F626A656374732E786D6CAD575B6FA33814FE2B887D06429276DA1565D4266D158D3A339A6846FB502932E050B66023DB74D2FDF5FB190C01\r\n310\r\n9276B2973C046C8ECFF53B17071F77456EBD502133CEAE6CDF9DD81665314F32965ED995DA3A17B6F5310C04E7AA47665B8C14F4CAD6DB7618A48257A5D94AE89654B91AEDDEDDFC61C998326A5B714EA4BCB265FC440BE2924AF184CA6737218AB8E976E7FA6E4338649B0A523E8D98964450A6A029F619B8588D52FE7039\r\n310\r\nB1BD30F0F4F730D0FF866AF6369557DB33949F31A9088B0F848DD8CCFCF9F2767A76E99CCDE733677E3EF59D9BBB9BA5E37F984D16E78BC5E5F5ED25044B25C0C96822E8D60EEFE11B91C581D77CEA34368A1F5329E68CD1B8B61F16D63A1B8E092D294B10C78C4A48EB593D192E7DED9BDEE7995E1B91FDEDD3ACEA9FE831\r\n310\r\n6A756F9F7D4D79F4274C90A7A04248AA51D5F8C718DAE06FB2F75AC4796EBE65D22A88A22223B995679120E2D50E41AA49C260C046A35368846B0BECD0DFF3EBEB8AD4F835768F69B9ADF25C43D30E6B646F807FAA64AD59F61715C7A54127C4AACA98BA3006A9D792DAE165E0D59B61A01FB3A9F9D838D2DAE62445C86166\r\n310\r\nF37564E842E7DE6A69879FEEA2DD5AE7E371E1A5E025154AC307D06A03D73EB5978C58FFA4C8E9033066E0F3BD53BEC1F39F91BE7B55103791EDE6BBB991A2046172CB4581D8B893FA674DDA17A77B3B7C413D1B511FD2743BFF8A38F03A658705E3ADF8015C3A3417FF3D7E439FF591DA0B5F18BC20C1B8981957AE6392A3\r\n310\r\nF43C640C01D1A0B4728E2DD4F26DB4B3C3152A252A3B4E913CEC1C72F012782FF88EFF8637AA552DBEF76408E8A8DE9E50F9E1CB3A2DA0DB1B6039A893B56063DC5B3E3FFB5F72E67AB9FEB4AEC496C4F4C1149625DD662C53E89D7BF0F6151A046260D1337DFDC94502430F83B0EE07A130A224BCAD7DAE1D9FB6CD422FF6\r\n310\r\n920702629C4BB9AE79C12F243C6432A6794E18E5552BA56B431AAB5D91317302B2B071E86C3A42B1A02F999E24061403B5D0EB639195DA655DD3EBEAB4FB862DDF579F014AD0E73C22F99E28DA57FB98E75C6CA2D74D53086D600F4786E0FE3144B771A8A7B900F03594DB8A633CBC49B2EDB69228BB479CF863B5E807AAAB\r\n310\r\n23872F6DFEB4129B949CA33823F58830E86D65621E10047D9DB34D862E8EAC3C2ABC2F7B2C40D67CDFE01F5545B92105AF983AC54D93D69E56FB8E797F88913F898A9FEC705D3F9D1B54EC8426FB500D40A03BD0119B06E1B95DDC7EB8F6975367793EBD70E66733DFB9BC982F9CE564727731999F5D4ECFCE3B8D6A4DC2A0\r\n310\r\n6D50FD148437D110834A64C6CDDF57FBACB5C307A2A477DFE4939736CFEF2B175371E0E10CF0DD1D5C15654E0BCA14D1E87DD02FF93782A162C0A3D95F1524A52770F972BF1EE9809D13CE7DD599467F8ECE9ADD85CE85A34CD45355448C64F9E8A031DC2D596ACC6E5DD93D9B82DE2EF5CAF81363A8E47996A0DE24564A79\r\n310\r\n4115AACE09C55E14540231FDA13C319787134EBF34E3A022514E5B4D9E0826E25C02D5805B15ABE1BEF51B26383D445DD9E875EE33FE4C22DA16427D65A3BCA92CA6D28DD01DF5DC53330704308475351050232CCD31583787BA75774AFB06E5070DD0C8EF484E19968C5D83BA5B90B244D31E54D55A372320FE4786B7EA58\r\n310\r\n44E135AA5467CB7EA333A61683CC6A8C3257034C10CF46F40EF9F5BE59BE5BD30C3C72D235E95D10345C1D45445A5F0BB47E46A5EBE5570F9380B5FA629579952296A773720405982B9DE04011506178964401AA8BDF1FBF0A8EAB6861DD6580C0E38217056766716DAEB2D6FA0917D3E4116581EADB879C4E7CFFB11EFACD\r\n310\r\n3D641311495D92C8676CB409A72D18610D803CE8A626049E8EC1887CB5B44CC39883690DDA8399B4B9855B481E7D71D4A9D22F96E5BB73BF5793020C02137BF837504B0304140006080000CC70623B000000000000000000000000350000006662782F36394639363044362D344446342D343946362D394244322D32343142\r\n310\r\n43333846323333332F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F747269616E676C65732E62696E636660600000504B0304140006080000CC70623B0000\r\n310\r\n00000000000000000000370000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F36394639363044362D344446342D343946362D394244322D\r\n310\r\n3234314243333846323333332F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE607FB14\r\n310\r\n4396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623BCA768048FE000000A00100003B0000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F7265736F75726365732F636F72\r\n310\r\n652E786D6C8D50596E833010BD0A9ADFCA60D600328E9AA639412F609909B1126CE4A5EAF16B0295DABFFECC8CDEA2797AECF8353F924FB44E193D409E5248504B332A3D0D10FC95B4901C39B3C6F85F3248B49871801506CE266BC2B243D2688FDA47549B11775038871E12F988C7004EDE7016A9083E2ADC3D5D84BC8B09\r\n310\r\nD33C8D74D471E6BC8D0192EDC93A815B742658898E651BCB59086ADC356A8C3FD555A1055ED7E7E254D615792D0F075295F585746FF53B694EE78A565DD736979A65AB9933AFE69F8CD2A2F038022F28ED489E135A7CE4554F9BBEA85E68DB53CAB255FEC71496F19FA6A0B42F8B3DEE6673C0F318E4497096AD7DC5F52C33\r\n310\r\nEEB55BFE0D504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B436F\r\n310\r\n6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623BD9DDAED0EC0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000095020000636E782E786D6C504B0102\r\n310\r\n1400140006080800CC70623BA24EB22D72010000D40300000C00000000000000000000000000190300006662782F636F72652E786D6C504B01021400140006080800CC70623B408A7D3B7C0000009D0000000B00000000000000000000000000B50400006662782F636E782E786D6C504B01021400140006080800CC70623B\r\n310\r\n449FB9BD290100001202000031000000000000000000000000005A0500006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D20600006662\r\n310\r\n782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636E782E786D6C504B01021400140006080800CC70623B8D05915C650500003B10000034000000000000000000000000006E0800006662782F36394639363044362D344446342D343946362D394244322D32343142433338\r\n310\r\n46323333332F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000250E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F76657274696365732E62696E504B010214001400060808\r\n310\r\n00CC70623BF270F13306000000040000003600000000000000000000000000780E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F747269616E676C65732E62696E504B01021400140006080000CC70623B00000000000000000000000037000000000000000000\r\n310\r\n00000000D20E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD190000000410100003600000000000000000000000000270F00006662782F36394639363044362D344446342D\r\n310\r\n343946362D394244322D3234314243333846323333332F6469726563746F72792E786D6C504B01021400140006080800CC70623BCA768048FE000000A00100003B000000000000000000000000000B1000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F7265736F\r\n310\r\n75726365732F636F72652E786D6C504B0506000000000E000E0080040000621100000000\r\n  0\r\nXRECORD\r\n  5\r\n176\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n177\r\n102\r\n{ACAD_REACTORS\r\n330\r\n173\r\n102\r\n}\r\n330\r\n173\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n270\r\n     1\r\n271\r\n     1\r\n  0\r\nXRECORD\r\n  5\r\n27B\r\n102\r\n{ACAD_REACTORS\r\n330\r\n234\r\n102\r\n}\r\n330\r\n234\r\n100\r\nAcDbXrecord\r\n280\r\n     1\r\n102\r\nDISPLAYNAME\r\n  1\r\nMetric50\r\n102\r\nFLAGS\r\n 90\r\n        0\r\n  0\r\nCELLSTYLEMAP\r\n  5\r\n27A\r\n102\r\n{ACAD_REACTORS\r\n330\r\n162\r\n102\r\n}\r\n330\r\n162\r\n100\r\nAcDbCellStyleMap\r\n 90\r\n        3\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n    32768\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n11\r\n144\r\n6.0\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n4.5\r\n 40\r\n4.5\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        1\r\n 91\r\n        1\r\n300\r\n_TITLE\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        5\r\n 62\r\n     0\r\n340\r\n11\r\n144\r\n4.5\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n4.5\r\n 40\r\n4.5\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        2\r\n 91\r\n        1\r\n300\r\n_HEADER\r\n309\r\nCELLSTYLE_END\r\n300\r\nCELLSTYLE\r\n  1\r\nTABLEFORMAT_BEGIN\r\n 90\r\n        5\r\n170\r\n     1\r\n 91\r\n        0\r\n 92\r\n        0\r\n 62\r\n   257\r\n 93\r\n        1\r\n300\r\nCONTENTFORMAT\r\n  1\r\nCONTENTFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        0\r\n 92\r\n      512\r\n 93\r\n        0\r\n300\r\n\r\n 40\r\n0.0\r\n140\r\n1.0\r\n 94\r\n        2\r\n 62\r\n     0\r\n340\r\n11\r\n144\r\n4.5\r\n309\r\nCONTENTFORMAT_END\r\n171\r\n     1\r\n301\r\nMARGIN\r\n  1\r\nCELLMARGIN_BEGIN\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n1.5\r\n 40\r\n4.5\r\n 40\r\n4.5\r\n309\r\nCELLMARGIN_END\r\n 94\r\n        6\r\n 95\r\n        1\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        2\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        4\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n        8\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       16\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n 95\r\n       32\r\n302\r\nGRIDFORMAT\r\n  1\r\nGRIDFORMAT_BEGIN\r\n 90\r\n        0\r\n 91\r\n        1\r\n 62\r\n     0\r\n 92\r\n       -2\r\n340\r\n14\r\n 93\r\n        0\r\n 40\r\n1.125\r\n309\r\nGRIDFORMAT_END\r\n309\r\nTABLEFORMAT_END\r\n  1\r\nCELLSTYLE_BEGIN\r\n 90\r\n        3\r\n 91\r\n        2\r\n300\r\n_DATA\r\n309\r\nCELLSTYLE_END\r\n  0\r\nENDSEC\r\n  0\r\nSECTION\r\n  2\r\nACDSDATA\r\n 70\r\n     2\r\n 71\r\n     8\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        0\r\n  1\r\nAcDb_Thumbnail_Schema\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n 91\r\n        8\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 91\r\n        0\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        1\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n 95\r\n        0\r\n 90\r\n        2\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        3\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n291\r\n     1\r\n101\r\nACDSRECORD\r\n  1\r\nAcDbDs::ID\r\n 90\r\n        4\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n282\r\n     1\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        1\r\n  1\r\nAcDbDs::TreatedAsObjectDataSchema\r\n  2\r\nAcDbDs::TreatedAsObjectData\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        2\r\n  1\r\nAcDbDs::LegacySchema\r\n  2\r\nAcDbDs::Legacy\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        3\r\n  1\r\nAcDbDs::IndexedPropertySchema\r\n  2\r\nAcDs:Indexable\r\n280\r\n     1\r\n 91\r\n        0\r\n  0\r\nACDSSCHEMA\r\n 90\r\n        4\r\n  1\r\nAcDbDs::HandleAttributeSchema\r\n  2\r\nAcDbDs::HandleAttribute\r\n280\r\n     7\r\n 91\r\n        1\r\n284\r\n     1\r\n  0\r\nACDSRECORD\r\n 90\r\n        0\r\n  2\r\nAcDbDs::ID\r\n280\r\n    10\r\n320\r\n22\r\n  2\r\nThumbnail_Data\r\n280\r\n    15\r\n 94\r\n      997\r\n310\r\n89504E470D0A1A0A0000000D4948445200000100000000B70803000000CA14702D00000300504C54452128300000000000000000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099\r\n310\r\n000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00\r\n310\r\n33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066\r\n310\r\nFF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00\r\n310\r\n33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333\r\n310\r\nFF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB\r\n310\r\nBBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF000000000000000000000000000000000000000000000000000000000000544354A8000000A04944415478DAEDDAA10A00200C4041FFFF7FED16AB61E09CCA5D1C82F03018D61A0000000000000000000000000000000000C0D45782C7A3EE09109BF7E46B051040000104104000\r\n310\r\n010410E0B100D13FFF7F0136CD051040000104104000010410A03CC09EBFFDBB01721F920002082080000208208000020820800002082080000208208000450172D7DFEF5F9707000000000000000000000000000080F3060A83AEBAB9C3D29D0000000049454E44AE426082\r\n  0\r\nENDSEC\r\n  0\r\nEOF\r\n"
  },
  {
    "path": "tools/build_and_upload.sh",
    "content": "#!/bin/sh\ntimestamp=$(date +%Y.%m.%d.%H.%M.%S)\n\nif [ $# -ne 3 ]; then\n    echo \"Three arguments are required, runner, sync git path and location of server upload php file\"\n    exit 1\nfi\n\nrunner=$1\ngitpath=$2\nuploadpath=$3\n\ncd \"$(dirname \"$0\")\"\nrm -rf depthmapX/\ngit clone $gitpath\ncurrentcommit=$(git rev-parse HEAD)\ncd depthmapX\nmkdir build\ncd build\ncmake -DCMAKE_BUILD_TYPE=Release ..\nmake -j\ncd ../RegressionTest\npython3 RegressionTestRunner.py  performance_regression.json\ncd ../../\nmkdir -p runs\ncd runs\nrundir=run-$timestamp\nmkdir $rundir\ncp -r ../depthmapX/RegressionTest/rundir/* $rundir/\n\ncd $rundir\n\nparams=\"{\\\"time\\\":\\\"$timestamp\\\",\\\"runner\\\":\\\"$runner\\\",\\\"commit\\\":\\\"$currentcommit\\\",\\\"tests\\\":[\"\n\ncounter=\"0\"\nfor i in $(find . | grep 'timings_[0-9]\\+_[0-9]\\+\\.csv')\ndo\n    newparams=$(csvtool drop 1 $i | csvtool format ',\"%(1)\":\"%(2)\"' - | cut -c2-);\n    #newparams=\"${newparams// /_}\"\n    if [ \"$counter\" -eq \"1\" ]; then\n         params=\"${params},\";\n    fi\n    params=\"${params}{\\\"file\\\":\\\"$i\\\",\\\"times\\\":{$newparams}}\"\n    counter=\"1\"\ndone\n\nparams=\"${params}]}\"\ncurl --data \"$params\" $uploadpath\n"
  },
  {
    "path": "tools/graph.grammar",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ufwb version=\"1.17\">\n    <grammar name=\"GRAPH grammar\" start=\"id:551\" author=\"Petros Koutsolampros, Christian Sailer\" fileextension=\"graph\">\n        <description>Grammar for depthmap GRAPH files</description>\n        <scripts>\n            <script name=\"PointNodeBin\" type=\"DataType\" id=\"458\">\n                <description>Parse one bin in a Node in a Point</description>\n                <source language=\"Python\"># custom data type script\n\ndef parseByteRange(element, byteView, bitPos, bitLength, results):\n\t# this method parses data starting at bitPos, bitLength bits are remaining\n\t&quot;&quot;&quot;parseByteRange method&quot;&quot;&quot;\n\t\n\tdir = byteView.readByte(0)\n\tnodeCount = byteView.readSignedInt(1, 2, ENDIAN_LITTLE)\n\t\n\n\t# create and set new value\n\tvalue = Value()\n\tvalue.setString(&quot;Value of custom element&quot;)\n\n\t# how many bytes were processed?\n\tprocessedBytes = 0\n\titeration = 0\n\n\tresults.addElement(element, processedBytes, iteration, value)\n\n\t# return number of processed bytes\n\treturn processedBytes\n\ndef fillByteRange(value, byteArray, bitPos, bitLength):\n\t# this method translates edited values back to the file\n\t&quot;&quot;&quot;fillByteRange method&quot;&quot;&quot;\n\n\t# write an integer back to file\n\t# byteArray.writeUnsignedIntBits(highWord, bitPos, bitLength, ENDIAN_BIG)\n</source>\n            </script>\n        </scripts>\n        <structure name=\"GRAPH file\" id=\"551\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"no\">\n            <structure name=\"header\" id=\"552\" length=\"0\">\n                <string name=\"grf\" mustmatch=\"yes\" id=\"553\" type=\"fixed-length\" length=\"3\">\n                    <fixedvalues>\n                        <fixedvalue name=\"grf\" value=\"grf\"/>\n                    </fixedvalues>\n                </string>\n                <number name=\"version\" id=\"554\" type=\"integer\" length=\"4\"/>\n                <structure name=\"&lt;new structure&gt;\" id=\"555\" length=\"19\"/>\n                <number name=\"stringDateLength\" id=\"557\" type=\"integer\" length=\"4\"/>\n                <string name=\"stringDate\" id=\"558\" type=\"fixed-length\" length=\"stringDateLength\"/>\n                <number name=\"stringVersionLength\" id=\"559\" type=\"integer\" length=\"4\"/>\n                <string name=\"stringVersion\" id=\"560\" type=\"fixed-length\" length=\"stringVersionLength\"/>\n                <binary name=\"&lt;new binary&gt;\" id=\"561\" length=\"12\"/>\n            </structure>\n            <structure name=\"LineData\" id=\"563\" repeatmin=\"0\">\n                <string name=\"map type\" mustmatch=\"yes\" id=\"564\" type=\"fixed-length\" length=\"1\">\n                    <fixedvalues>\n                        <fixedvalue name=\"map type\" value=\"l\"/>\n                    </fixedvalues>\n                </string>\n                <structref name=\"SuperSpacePixelName\" id=\"566\" structure=\"id:565\"/>\n                <structref name=\"Region\" id=\"568\" structure=\"id:567\"/>\n                <number name=\"numSpacePixel\" id=\"569\" type=\"integer\" length=\"4\" signed=\"yes\" endian=\"little\"/>\n                <structref name=\"SpacePixel\" id=\"571\" repeatmin=\"numSpacePixel\" repeatmax=\"numSpacePixel\" structure=\"id:570\"/>\n            </structure>\n            <structure name=\"PointMaps\" id=\"573\" repeatmin=\"0\">\n                <string name=\"map type\" mustmatch=\"yes\" id=\"574\" type=\"fixed-length\" length=\"1\">\n                    <fixedvalues>\n                        <fixedvalue name=\"map type\" value=\"p\"/>\n                    </fixedvalues>\n                </string>\n                <structref name=\"pointMaps\" id=\"576\" structure=\"id:575\"/>\n            </structure>\n            <structure name=\"ShapeGraphs\" id=\"578\">\n                <string name=\"map type\" mustmatch=\"yes\" id=\"579\" type=\"fixed-length\" length=\"1\">\n                    <fixedvalues>\n                        <fixedvalue name=\"map type\" value=\"x\"/>\n                    </fixedvalues>\n                </string>\n                <number name=\"DisplayedMap\" id=\"580\" type=\"integer\" length=\"4\"/>\n                <number name=\"sg_numShapeMaps\" id=\"581\" type=\"integer\" length=\"4\"/>\n                <structref name=\"shapeGraph\" id=\"583\" repeatmin=\"sg_numShapeMaps\" repeatmax=\"sg_numShapeMaps\" structure=\"id:582\"/>\n                <structure name=\"sg_polyConnectors\" id=\"584\">\n                    <number name=\"sg_numPolyConnectors\" id=\"585\" type=\"integer\" length=\"4\"/>\n                    <structref name=\"sg_polyConnector\" id=\"587\" repeatmin=\"sg_numPolyConnectors\" repeatmax=\"sg_numPolyConnectors\" structure=\"id:586\"/>\n                </structure>\n                <structure name=\"sg_radialLines\" id=\"589\">\n                    <number name=\"sg_numRadialLines\" id=\"590\" type=\"integer\" length=\"4\"/>\n                    <structure name=\"sg_radialLine\" id=\"591\" repeatmin=\"sg_numRadialLines\" repeatmax=\"sg_numRadialLines\">\n                        <structref name=\"sg_radialKey\" id=\"593\" structure=\"id:592\"/>\n                        <structref name=\"rl_openSpace\" id=\"595\" structure=\"id:594\"/>\n                        <structref name=\"rl_keyVertex\" id=\"596\" structure=\"id:594\"/>\n                        <structref name=\"rl_nextVertex\" id=\"597\" structure=\"id:594\"/>\n                    </structure>\n                </structure>\n            </structure>\n            <structure name=\"DataMaps\" id=\"601\" repeatmin=\"0\">\n                <string name=\"map type\" mustmatch=\"yes\" id=\"602\" type=\"fixed-length\" length=\"1\">\n                    <fixedvalues>\n                        <fixedvalue name=\"map type\" value=\"s\"/>\n                    </fixedvalues>\n                </string>\n                <number name=\"Displayed Map\" id=\"603\" type=\"integer\" length=\"4\"/>\n                <number name=\"dm_numShapeMaps\" id=\"604\" type=\"integer\" length=\"4\"/>\n                <structref name=\"dm_shapeMap\" id=\"606\" repeatmin=\"dm_numShapeMaps\" repeatmax=\"dm_numShapeMaps\" structure=\"id:605\"/>\n            </structure>\n        </structure>\n        <structure name=\"fourByteLengthAndString\" id=\"565\" length=\"0\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"no\" valueexpression=\"Str\">\n            <number name=\"len\" id=\"609\" type=\"integer\" length=\"4\" signed=\"yes\" endian=\"little\"/>\n            <string name=\"Str\" id=\"610\" type=\"fixed-length\" length=\"len\"/>\n        </structure>\n        <structure name=\"pixelRef\" id=\"612\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"no\">\n            <number name=\"x\" id=\"613\" type=\"integer\" length=\"2\"/>\n            <number name=\"y\" id=\"614\" type=\"integer\" length=\"2\"/>\n        </structure>\n        <structure name=\"pixelVec\" id=\"616\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"no\">\n            <structref name=\"start\" id=\"617\" structure=\"id:612\"/>\n            <number name=\"length\" id=\"618\" type=\"integer\" length=\"2\"/>\n        </structure>\n        <structure name=\"QtRegion\" id=\"567\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"minX\" id=\"620\" type=\"float\" length=\"64\" lengthunit=\"bit\"/>\n            <number name=\"minY\" id=\"621\" type=\"float\" length=\"64\" lengthunit=\"bit\"/>\n            <number name=\"maxX\" id=\"622\" type=\"float\" length=\"64\" lengthunit=\"bit\"/>\n            <number name=\"maxY\" id=\"623\" type=\"float\" length=\"64\" lengthunit=\"bit\"/>\n        </structure>\n        <structure name=\"SalaShape\" id=\"625\" encoding=\"ISO_8859-1:1987\" endian=\"big\" signed=\"no\">\n            <number name=\"shape key\" id=\"626\" type=\"integer\" length=\"4\"/>\n            <number name=\"shape type\" id=\"627\" type=\"integer\" length=\"1\" display=\"hex\">\n                <fixedvalues>\n                    <fixedvalue name=\"Point\" value=\"0x1\"/>\n                    <fixedvalue name=\"Line\" value=\"0x2\"/>\n                    <fixedvalue name=\"Polygon\" value=\"0x4\"/>\n                    <fixedvalue name=\"Circle\" value=\"0x8\"/>\n                    <fixedvalue name=\"ClosedPoly\" value=\"0x44\"/>\n                    <fixedvalue name=\"Circle\" value=\"0xC4\"/>\n                </fixedvalues>\n            </number>\n            <structref name=\"region\" id=\"629\" structure=\"id:628\"/>\n            <structref name=\"centroid\" id=\"630\" structure=\"id:594\"/>\n            <number name=\"area\" id=\"631\" type=\"float\" length=\"8\" signed=\"yes\" endian=\"little\"/>\n            <number name=\"perimeter\" id=\"632\" type=\"float\" length=\"8\" signed=\"yes\" endian=\"little\"/>\n            <number name=\"pointCount\" id=\"633\" type=\"integer\" length=\"4\" signed=\"yes\" endian=\"little\"/>\n            <structref name=\"point\" id=\"634\" repeatmin=\"pointCount\" repeatmax=\"pointCount\" structure=\"id:594\"/>\n        </structure>\n        <structure name=\"Point2f\" id=\"594\" encoding=\"ISO_8859-1:1987\" endian=\"big\" signed=\"no\">\n            <number name=\"x\" id=\"636\" type=\"float\" length=\"8\" signed=\"yes\" endian=\"little\"/>\n            <number name=\"y\" id=\"637\" type=\"float\" length=\"8\" signed=\"yes\" endian=\"little\"/>\n        </structure>\n        <structure name=\"SpacePixel\" id=\"570\" encoding=\"ISO_8859-1:1987\" endian=\"big\" signed=\"no\">\n            <structref name=\"planFileName\" id=\"639\" structure=\"id:565\"/>\n            <structref name=\"sp_Region\" id=\"640\" structure=\"id:567\"/>\n            <number name=\"sp_numShapeMaps\" id=\"641\" type=\"integer\" length=\"4\" signed=\"yes\" endian=\"little\"/>\n            <structref name=\"sp_layerShapeMap\" id=\"642\" repeatmin=\"sp_numShapeMaps\" repeatmax=\"sp_numShapeMaps\" structure=\"id:605\"/>\n        </structure>\n        <structure name=\"AttributeTable\" id=\"644\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"att_availableLayers\" id=\"645\" type=\"integer\" length=\"8\" endian=\"little\"/>\n            <number name=\"att_visibleLayers\" id=\"646\" type=\"integer\" length=\"8\" endian=\"little\"/>\n            <number name=\"att_layerCount\" id=\"647\" type=\"integer\" length=\"4\" endian=\"little\"/>\n            <structure name=\"att_layer\" id=\"648\" repeatmin=\"att_layerCount\" repeatmax=\"att_layerCount\">\n                <number name=\"att_layerKey\" id=\"649\" type=\"integer\" length=\"8\" endian=\"little\"/>\n                <structref name=\"att_layer\" id=\"650\" structure=\"id:565\"/>\n            </structure>\n            <number name=\"att_colCount\" id=\"652\" type=\"integer\" length=\"4\" endian=\"little\"/>\n            <structure name=\"att_Column\" id=\"653\" repeatmin=\"att_colCount\" repeatmax=\"att_colCount\">\n                <structref name=\"att_colName\" id=\"654\" structure=\"id:565\"/>\n                <number name=\"att_colMin\" id=\"655\" type=\"float\" length=\"32\" lengthunit=\"bit\" endian=\"little\"/>\n                <number name=\"att_colMax\" id=\"656\" type=\"float\" length=\"32\" lengthunit=\"bit\" endian=\"little\"/>\n                <number name=\"att_colTotal\" id=\"657\" type=\"float\" length=\"64\" lengthunit=\"bit\" endian=\"little\"/>\n                <number name=\"att_physicalCol\" id=\"658\" type=\"integer\" length=\"4\" endian=\"little\"/>\n                <number name=\"att_colHidden\" id=\"659\" type=\"integer\" length=\"1\" endian=\"little\"/>\n                <number name=\"att_colLocked\" id=\"660\" type=\"integer\" length=\"1\" endian=\"little\"/>\n                <structref name=\"col_DisplayParams\" id=\"662\" structure=\"id:661\"/>\n                <structref name=\"att_colFormula\" id=\"663\" structure=\"id:565\"/>\n            </structure>\n            <number name=\"att_rowCount\" id=\"665\" type=\"integer\" length=\"4\"/>\n            <structure name=\"att_Row\" id=\"666\" repeatmin=\"att_rowCount\" repeatmax=\"att_rowCount\">\n                <number name=\"att_rowKey\" id=\"667\" type=\"integer\" length=\"4\"/>\n                <number name=\"att_rowNumLayers\" id=\"668\" type=\"integer\" length=\"8\"/>\n                <structref name=\"att_rowValues\" id=\"670\" structure=\"id:669\"/>\n            </structure>\n            <structref name=\"att_DisplayParams\" id=\"672\" structure=\"id:661\"/>\n        </structure>\n        <structure name=\"IntVector\" id=\"674\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"numElements\" id=\"675\" type=\"integer\" length=\"4\" signed=\"no\"/>\n            <number name=\"value\" id=\"676\" repeatmin=\"numElements\" repeatmax=\"numElements\" type=\"integer\" length=\"4\"/>\n        </structure>\n        <structure name=\"SegmentRefFloatMap\" id=\"678\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"length\" id=\"679\" type=\"integer\" length=\"4\" signed=\"no\"/>\n            <structure name=\"kvp\" id=\"680\" repeatmin=\"length\" repeatmax=\"length\">\n                <structure name=\"SegmentRef\" id=\"681\">\n                    <number name=\"dir\" id=\"682\" type=\"integer\" length=\"1\"/>\n                    <binary name=\"padding\" id=\"683\" length=\"3\"/>\n                    <number name=\"ref\" id=\"684\" type=\"integer\" length=\"4\"/>\n                </structure>\n                <number name=\"value\" id=\"686\" type=\"float\" length=\"32\" lengthunit=\"bit\"/>\n            </structure>\n        </structure>\n        <structure name=\"IntPairVector\" id=\"689\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"ipvLength\" id=\"690\" type=\"integer\" length=\"4\" signed=\"no\"/>\n            <structure name=\"OrderedIntPair\" id=\"691\" repeatmin=\"ipvLength\" repeatmax=\"ipvLength\">\n                <number name=\"ip_x\" id=\"692\" type=\"integer\" length=\"4\"/>\n                <number name=\"ip_y\" id=\"693\" type=\"integer\" length=\"4\"/>\n            </structure>\n        </structure>\n        <structure name=\"FloatVector\" id=\"669\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"fv_length\" id=\"696\" type=\"integer\" length=\"4\" signed=\"no\"/>\n            <number name=\"value\" id=\"697\" repeatmin=\"fv_length\" repeatmax=\"fv_length\" type=\"float\" length=\"32\" lengthunit=\"bit\"/>\n        </structure>\n        <structure name=\"DisplayParameters\" id=\"661\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"dp_blue\" id=\"699\" type=\"float\" length=\"32\" lengthunit=\"bit\" endian=\"little\"/>\n            <number name=\"dp_red\" id=\"700\" type=\"float\" length=\"32\" lengthunit=\"bit\" endian=\"little\"/>\n            <number name=\"dp_colorscale\" id=\"701\" type=\"integer\" length=\"4\" endian=\"little\"/>\n        </structure>\n        <structure name=\"MapInfoData\" id=\"703\" disabled=\"yes\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <structref name=\"mid_version\" id=\"704\" structure=\"id:565\"/>\n            <structref name=\"mid_charset\" id=\"705\" structure=\"id:565\"/>\n            <string name=\"delimiter\" id=\"706\" type=\"fixed-length\" length=\"1\"/>\n            <structref name=\"mid_index\" id=\"707\" structure=\"id:565\"/>\n            <structref name=\"mid_coordsys\" id=\"708\" structure=\"id:703\"/>\n            <structref name=\"mid_bounds\" id=\"709\" structure=\"id:565\"/>\n        </structure>\n        <structure name=\"ShapeMap\" id=\"605\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <structref name=\"Map Name\" id=\"711\" structure=\"id:565\"/>\n            <number name=\"Map Type\" id=\"712\" type=\"integer\" length=\"4\"/>\n            <number name=\"show map\" id=\"713\" type=\"integer\" length=\"1\"/>\n            <number name=\"is editable\" id=\"714\" type=\"integer\" length=\"1\"/>\n            <structref name=\"Region\" id=\"715\" structure=\"id:567\"/>\n            <number name=\"rows\" id=\"716\" type=\"integer\" length=\"4\"/>\n            <number name=\"cols\" id=\"717\" type=\"integer\" length=\"4\"/>\n            <number name=\"object reference\" id=\"718\" type=\"integer\" length=\"4\"/>\n            <number name=\"shape reference\" id=\"719\" type=\"integer\" length=\"4\"/>\n            <structure name=\"shapes\" id=\"720\">\n                <number name=\"shapesCount\" id=\"721\" type=\"integer\" length=\"4\"/>\n                <structref name=\"shape\" id=\"722\" repeatmin=\"shapesCount\" repeatmax=\"shapesCount\" structure=\"id:625\"/>\n            </structure>\n            <number name=\"numSalaObjects\" id=\"724\" type=\"integer\" length=\"4\" endian=\"little\"/>\n            <structure name=\"SalaObject\" id=\"725\" repeatmin=\"numSalaObjects\" repeatmax=\"numSalaObjects\">\n                <number name=\"objKey\" id=\"726\" type=\"integer\" length=\"4\" endian=\"little\"/>\n                <structref name=\"Centroid\" id=\"727\" structure=\"id:594\"/>\n            </structure>\n            <structref name=\"DataMapAttributes\" id=\"729\" repeatmin=\"0\" structure=\"id:644\"/>\n            <number name=\"dm_displayedAttribute\" id=\"730\" type=\"integer\" length=\"4\" endian=\"little\"/>\n            <number name=\"dm_numConnectors\" id=\"731\" type=\"integer\" length=\"4\" endian=\"little\"/>\n            <structure name=\"DataMapConnector\" id=\"732\" repeatmin=\"dm_numConnectors\" repeatmax=\"dm_numConnectors\">\n                <structref name=\"connections\" id=\"733\" structure=\"id:674\"/>\n                <number name=\"conn_segmentAxialRef\" id=\"734\" type=\"integer\" length=\"4\"/>\n                <structref name=\"forward_segconns\" id=\"735\" structure=\"id:678\"/>\n                <structref name=\"back_segconns\" id=\"736\" structure=\"id:678\"/>\n            </structure>\n            <structref name=\"dm_links\" id=\"738\" structure=\"id:689\"/>\n            <structref name=\"dm_unlinks\" id=\"739\" structure=\"id:689\"/>\n            <structure name=\"MapInfoData\" id=\"740\" repeatmin=\"0\">\n                <string name=\"mapInfoMarker\" mustmatch=\"yes\" id=\"741\" type=\"fixed-length\" length=\"1\">\n                    <fixedvalues>\n                        <fixedvalue name=\"mapInfoMarker\" value=\"m\"/>\n                    </fixedvalues>\n                </string>\n                <structref name=\"&lt;MapInfoData&gt;\" id=\"742\" structure=\"id:703\"/>\n            </structure>\n            <structure name=\"ShapeMapEnd\" id=\"744\" repeatmin=\"0\">\n                <string name=\"end_marker\" mustmatch=\"yes\" id=\"745\" type=\"fixed-length\" length=\"1\">\n                    <fixedvalues>\n                        <fixedvalue name=\"end_marker\" value=\"x\"/>\n                    </fixedvalues>\n                </string>\n            </structure>\n        </structure>\n        <structure name=\"PointMap\" id=\"748\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <structref name=\"pm_Name\" id=\"749\" structure=\"id:565\"/>\n            <number name=\"pm_spacing\" id=\"750\" type=\"float\" length=\"64\" lengthunit=\"bit\"/>\n            <number name=\"pm_rowCount\" id=\"751\" type=\"integer\" length=\"4\"/>\n            <number name=\"pm_colCount\" id=\"752\" type=\"integer\" length=\"4\"/>\n            <number name=\"pm_pointCount\" id=\"753\" type=\"integer\" length=\"4\"/>\n            <structref name=\"pm_bottomLeft\" id=\"754\" structure=\"id:594\"/>\n            <number name=\"pm_dispAttribute\" id=\"755\" type=\"integer\" length=\"4\"/>\n            <structref name=\"pm_attributes\" id=\"756\" structure=\"id:644\"/>\n            <structure name=\"pm_column\" id=\"757\" repeatmin=\"pm_colCount\" repeatmax=\"pm_colCount\">\n                <structref name=\"point\" id=\"759\" repeatmin=\"pm_rowCount\" repeatmax=\"pm_rowCount\" structure=\"id:758\"/>\n            </structure>\n            <number name=\"pm_processed\" id=\"761\" type=\"integer\" length=\"1\"/>\n            <number name=\"pm_boundaryGraph\" id=\"762\" type=\"integer\" length=\"1\"/>\n        </structure>\n        <structure name=\"SalaPoint\" id=\"758\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"sp_state\" id=\"764\" type=\"integer\" length=\"4\"/>\n            <number name=\"sp_block\" id=\"765\" type=\"integer\" length=\"4\"/>\n            <number name=\"sp_misc\" id=\"766\" type=\"integer\" length=\"4\"/>\n            <number name=\"sp_gridConnections\" id=\"767\" type=\"integer\" length=\"1\"/>\n            <structref name=\"sp_merge\" id=\"768\" structure=\"id:612\"/>\n            <number name=\"sp_haveNode\" id=\"769\" type=\"integer\" length=\"1\"/>\n            <structure name=\"sp_Node\" id=\"770\" repeatmin=\"sp_haveNode\" repeatmax=\"sp_haveNode\">\n                <structure name=\"spn_Bin\" id=\"771\" repeatmin=\"32\" repeatmax=\"32\">\n                    <number name=\"bin_dir\" id=\"772\" type=\"integer\" length=\"1\"/>\n                    <number name=\"bin_nodeCount\" id=\"773\" type=\"integer\" length=\"2\" signed=\"no\"/>\n                    <number name=\"bin_distance\" id=\"774\" type=\"float\" length=\"32\" lengthunit=\"bit\"/>\n                    <number name=\"bin_occDistance\" id=\"775\" type=\"float\" length=\"32\" lengthunit=\"bit\"/>\n                    <structure name=\"bin_Nodes\" id=\"776\">\n                        <scriptelement name=\"bin_pixVec\" id=\"777\">\n                            <script name=\"unnamed\" type=\"Generic\">\n                                <source language=\"Python\">def log(msg):\n    logSrc = currentMapper.getCurrentLogSrc()\n    logSrc.logMessage(&quot;&quot;, 111, SEVERITY_INFO, msg)\n\nresults = currentMapper.getCurrentResults()\nnodeCount = results.getResultByName(&quot;bin_nodeCount&quot;).getValue().getSigned()\nif nodeCount &gt; 0:\n    byteView = currentMapper.getCurrentByteView()\n    grammar = currentMapper.getCurrentGrammar()\n    #log(&quot;Getting bin_dir&quot;)\n    dir = results.getResultByName(&quot;bin_dir&quot;).getValue().getSigned()\n    #log(&quot;bin_dir is: %d&quot; %dir)\n    if dir &amp; 0x0c:\n        pixelVec = grammar.getStructureByName(&quot;pixelVec&quot;)\n        currentMapper.mapStructure(pixelVec)\n    else:\n        multiPixelVec = grammar.getStructureByName(&quot;NodeBinMultiPixVec&quot;)\n        currentMapper.mapStructure(multiPixelVec)\n        </source>\n                            </script>\n                        </scriptelement>\n                    </structure>\n                </structure>\n                <structure name=\"spn_OcclusionBin\" id=\"780\">\n                    <structref name=\"occBin\" id=\"781\" repeatmin=\"32\" repeatmax=\"32\" structure=\"id:612\"/>\n                </structure>\n            </structure>\n            <structref name=\"sp_location\" id=\"784\" structure=\"id:594\"/>\n        </structure>\n        <structure name=\"Line\" id=\"628\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <structref name=\"l_region\" id=\"786\" structure=\"id:567\"/>\n            <number name=\"parity\" id=\"787\" type=\"integer\" length=\"1\"/>\n            <number name=\"dir\" id=\"788\" type=\"integer\" length=\"1\"/>\n            <binary name=\"padding\" id=\"789\" length=\"6\"/>\n        </structure>\n        <structure name=\"PointMaps\" id=\"575\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"Displayed Map\" id=\"791\" type=\"integer\" length=\"4\"/>\n            <number name=\"pms_count\" id=\"792\" type=\"integer\" length=\"4\"/>\n            <structref name=\"pms_pointMap\" id=\"793\" repeatmin=\"pms_count\" repeatmax=\"pms_count\" structure=\"id:748\"/>\n        </structure>\n        <structure name=\"pixelVecWithContext\" id=\"795\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"start\" id=\"796\" type=\"integer\" length=\"2\"/>\n            <number name=\"shift\" id=\"797\" type=\"integer\" length=\"4\" lengthunit=\"bit\" signed=\"no\"/>\n            <number name=\"runlength\" id=\"798\" type=\"integer\" length=\"12\" lengthunit=\"bit\" signed=\"no\"/>\n        </structure>\n        <structure name=\"NodeBinMultiPixVec\" id=\"800\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"bin_numVec\" id=\"801\" type=\"integer\" length=\"2\"/>\n            <structref name=\"pixVec\" id=\"802\" structure=\"id:616\"/>\n            <structref name=\"pixVecC\" id=\"803\" repeatmin=\"bin_numVec - 1\" repeatmax=\"bin_numVec - 1\" structure=\"id:795\"/>\n        </structure>\n        <structure name=\"ShapeGraph\" id=\"582\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"sg_keyVertexCount\" id=\"805\" type=\"integer\" length=\"4\"/>\n            <structure name=\"sg_keyVertices\" id=\"806\">\n                <number name=\"sg_numKeyVertices\" id=\"807\" type=\"integer\" length=\"4\"/>\n                <structref name=\"keyVertices\" id=\"808\" repeatmin=\"sg_numKeyVertices\" repeatmax=\"sg_numKeyVertices\" structure=\"id:674\"/>\n            </structure>\n            <structref name=\"sg_shapeMap\" id=\"810\" structure=\"id:605\"/>\n        </structure>\n        <structure name=\"PolyConnector\" id=\"586\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"no\">\n            <structref name=\"pc_line\" id=\"812\" structure=\"id:628\"/>\n            <structref name=\"pc_radialKey\" id=\"813\" structure=\"id:592\"/>\n        </structure>\n        <structure name=\"AxialVertexKey\" id=\"815\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <number name=\"avk_refKey\" id=\"816\" type=\"integer\" length=\"4\"/>\n            <number name=\"avk_refA\" id=\"817\" type=\"integer\" length=\"2\"/>\n            <number name=\"avk_refB\" id=\"818\" type=\"integer\" length=\"2\"/>\n        </structure>\n        <structure name=\"RadialKey\" id=\"592\" encoding=\"ISO_8859-1:1987\" endian=\"little\" signed=\"yes\">\n            <structref name=\"rk_axialVertexKey\" id=\"820\" structure=\"id:815\"/>\n            <number name=\"rk_ang\" id=\"821\" type=\"float\" length=\"32\" lengthunit=\"bit\"/>\n            <number name=\"rk_segend\" id=\"822\" type=\"integer\" length=\"1\"/>\n            <binary name=\"padding\" id=\"823\" length=\"3\"/>\n        </structure>\n    </grammar>\n</ufwb>\n"
  },
  {
    "path": "tools/storePerformanceTest.php",
    "content": "<?php\n$data = file_get_contents('php://input');\n$obj = json_decode($data);\n\nif($obj != null) {\n\t$fileName = 'performanceruns/data' . (new DateTime)->getTimeStamp() . '.json';\n\tfile_put_contents($fileName, $data, FILE_APPEND | LOCK_EX);\n}\n?>"
  },
  {
    "path": "version.h",
    "content": "// depthmapX - spatial network analysis platform\n// Copyright (C) 2017 Christian Sailer\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef VERSION_H\n#define VERSION_H\n\n#include \"version_defs.h\"\n\n// use these to define the depthmap versions\n#define DEPTHMAPX_MAJOR_VERSION 0\n#define DEPTHMAPX_MINOR_VERSION 8\n#define DEPTHMAPX_REVISION_VERSION 0\n\n#define DEPTHMAP_MODULE_VERSION 10.04\n\n// leave these alone - C Preprocessor magic to get stuff to the right format\n#define STRINGIFY(v) #v\n#define TITLE_BASE_FORMAT(version, minor, revision) \"depthmapX \" STRINGIFY(version) \".\" STRINGIFY(minor) \".\" STRINGIFY(revision)\n#define TITLE_BASE TITLE_BASE_FORMAT(DEPTHMAPX_MAJOR_VERSION, DEPTHMAPX_MINOR_VERSION, DEPTHMAPX_REVISION_VERSION)\n\n#endif // VERSION_H\n"
  },
  {
    "path": "version_defs.h.in",
    "content": "// Copyright (C) 2018 Christian Sailer \n// This program is free software: you can redistribute it and/or modify \n// it under the terms of the GNU General Public License as published by \n// the Free Software Foundation, either version 3 of the License, or \n// (at your option) any later version. \n  \n// This program is distributed in the hope that it will be useful, \n// but WITHOUT ANY WARRANTY; without even the implied warranty of \n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the \n// GNU General Public License for more details. \n \n// You should have received a copy of the GNU General Public License \n// along with this program.  If not, see <http://www.gnu.org/licenses/>. \n \n// This file is autogenerated - do not modify it directly! \n \n#pragma once \n \n#ifndef APP_DATE \n#define APP_DATE \"@APP_DATE@\" \n#endif \n \n#ifndef APP_GIT_BRANCH \n#define APP_GIT_BRANCH \"@APP_BRANCH@\" \n#endif \n \n#ifndef APP_GIT_COMMIT \n#define APP_GIT_COMMIT \"@APP_COMMIT@\" \n#endif \n"
  }
]