diff --git a/CMakeLists.txt b/CMakeLists.txt index 12dd085bc9..a186d60626 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,6 @@ set(PHANTOMJS_TESTS ON CACHE BOOL "Generate phantomjs unit tests.") set(FFHEADLESS_TESTS ON CACHE BOOL "Generate headless Firefox unit tests (requires xvfb to be running).") set(TEST_SAVE_IMAGE "none" CACHE STRING "Save headless test images even if there aren't errors. Valid options are none, all, or the a comma-separated list of test names.") set(ESLINT_TESTS ON CACHE BOOL "Generate eslint style tests for JS source files.") -set(SELENIUM_TESTS ON CACHE BOOL "Generate selenium unit tests.") site_name(HOSTNAME) @@ -37,11 +36,6 @@ function(add_geojs_test test_name) set_property(TEST "notes-report" APPEND PROPERTY DEPENDS "${test_name}") endfunction() -set(MIDAS_BASE_URL "https://midas3.kitware.com/midas" CACHE STRING "MIDAS data store URL.") -mark_as_advanced(MIDAS_BASE_URL) -set(MIDAS_COMMUNITY "GeoJS" CACHE STRING "MIDAS community hosting test images.") -mark_as_advanced(MIDAS_COMMUNITY) - # set variables for girder.cmake set(Girder_KEY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/testing/test-data") set(Girder_DATA_DIR "${GEOJS_DEPLOY_DIR}/data") @@ -53,11 +47,6 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/geojs_test_runne ${CMAKE_CURRENT_BINARY_DIR}/test/geojs_test_runner.py ) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/selenium-test-utils.js - ${GEOJS_DEPLOY_DIR}/test/lib/selenium-test-utils.js - COPYONLY -) - # Generate notes to send along with the test reports add_test( NAME "notes-reset" @@ -120,6 +109,8 @@ if(FFHEADLESS_TESTS) set_property(TEST "ffheadless" APPEND PROPERTY ENVIRONMENT "TEST_SAVE_IMAGE=${TEST_SAVE_IMAGE}") set_property(TEST "total-coverage" APPEND PROPERTY DEPENDS "ffheadless") set_property(TEST "ffheadless" APPEND PROPERTY DEPENDS "get_data_files") + # We use some of the example images in the ffheadless tests + set_property(TEST "ffheadless" APPEND PROPERTY DEPENDS "build_examples") add_test( NAME "examplesheadless" @@ -159,87 +150,6 @@ add_custom_target(baseline_images DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/base-imag add_test(NAME baseline_images CONFIGURATIONS "baseline_images" COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target baseline_images) set_property(TEST "baseline_images" APPEND PROPERTY ENVIRONMENT "CTEST_IMAGE_PATH=${CMAKE_CURRENT_BINARY_DIR}/images") -if(SELENIUM_TESTS) - - find_package(PythonInterp REQUIRED) - set(FIREFOX_TESTS ON CACHE BOOL "Turn on Firefox selenium tests.") - set(CHROME_TESTS OFF CACHE BOOL "Turn on Chrome selenium tests.") - set(DATA_REPO_PATH "" CACHE PATH "Local path to the geojs data repository (optional).") - set(SELENIUM_TEST_DIR "${GEOJS_DEPLOY_DIR}/test/selenium") - set(SELENIUM_HOST localhost CACHE STRING "The selenium test server host.") - mark_as_advanced(SELENIUM_HOST) - set(SELENIUM_PORT 4444 CACHE STRING "The selenium test server port.") - mark_as_advanced(SELENIUM_PORT) - - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/testing/js/selenium-blanket.js - ${GEOJS_DEPLOY_DIR}/test/lib/selenium-blanket.js - COPYONLY - ) - configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/selenium_test.py.in" - "${CMAKE_CURRENT_BINARY_DIR}/test/selenium_test.py" - ) - configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/midas_handler.py" - "${CMAKE_CURRENT_BINARY_DIR}/test/midas_handler.py" - COPYONLY - ) - configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/upload_test_cases.py" - "${CMAKE_CURRENT_BINARY_DIR}/test/upload_test_cases.py" - COPYONLY - ) - file(GLOB SELENIUM_TEST_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/testing/test-cases/selenium-tests/* - ) - foreach(dir ${SELENIUM_TEST_DIRS}) - if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/include.js") - set(html "${dir}/include.html") - set(js "${dir}/include.js") - set(css "${dir}/include.css") - get_filename_component(f "${dir}" NAME_WE) - set(test_dir "${SELENIUM_TEST_DIR}/${f}") - set(output_html "${test_dir}/index.html") - - add_custom_command(OUTPUT "${output_html}" - COMMAND ${CMAKE_COMMAND} -DHTML_INCLUDE="${html}" - -DJS_INCLUDE="${js}" - -DCSS_INCLUDE="${css}" - -DOUTPUT_HTML="${output_html}" - -DTEMPLATE_HTML="${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/selenium-template.html.in" - -P ${CMAKE_SOURCE_DIR}/cmake/configure-js-selenium-test.cmake - COMMAND ${CMAKE_COMMAND} -E touch "${output_html}" - DEPENDS "${html}" "${js}" "${css}" "${CMAKE_CURRENT_SOURCE_DIR}/testing/test-runners/selenium-template.html.in" - COMMENT "Generating selenium test ${f}" - ) - list(APPEND SELENIUM_TEST_FILES "${output_html}") - - add_test( - NAME "selenium:${f}" - WORKING_DIRECTORY "${GEOJS_DEPLOY_DIR}" - COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -v -s "${dir}" - ) - - set_property(TEST "selenium:${f}" APPEND PROPERTY DEPENDS "notes-reset") - set_property(TEST "notes-report" APPEND PROPERTY DEPENDS "selenium:${f}") - set_property(TEST "selenium:${f}" APPEND PROPERTY ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}/test") - set_property(TEST "selenium:${f}" APPEND PROPERTY ENVIRONMENT "FIREFOX_TESTS=${FIREFOX_TESTS}") - set_property(TEST "selenium:${f}" APPEND PROPERTY ENVIRONMENT "CHROME_TESTS=${CHROME_TESTS}") - endif() - endforeach() - - set_property(TEST "selenium:glPointsSpeed" APPEND PROPERTY ENVIRONMENT "LOAD_SPEED_THRESHOLD=1000") - set_property(TEST "selenium:glPointsSpeed" APPEND PROPERTY ENVIRONMENT "FRAMERATE_THRESHOLD=5") - - add_custom_target( - selenium_tests - ALL - DEPENDS ${SELENIUM_TEST_FILES} ${Girder_DOWNLOAD_FILES} - ) - -endif() - if(${ESLINT_TESTS}) find_program(NPM_EXECUTABLE npm) diff --git a/cmake/configure-js-selenium-test.cmake b/cmake/configure-js-selenium-test.cmake deleted file mode 100644 index f89665098b..0000000000 --- a/cmake/configure-js-selenium-test.cmake +++ /dev/null @@ -1,8 +0,0 @@ -file(READ "${HTML_INCLUDE}" TEST_SOURCE_HTML) -file(READ "${JS_INCLUDE}" TEST_SOURCE_JS) -file(READ "${CSS_INCLUDE}" TEST_SOURCE_CSS) - -configure_file( - ${TEMPLATE_HTML} - ${OUTPUT_HTML} -) diff --git a/cmake/travis_build.cmake b/cmake/travis_build.cmake index bbf08f653d..c7010cde77 100644 --- a/cmake/travis_build.cmake +++ b/cmake/travis_build.cmake @@ -8,9 +8,7 @@ set(CTEST_CMAKE_GENERATOR "Unix Makefiles") set(coverage_file "${CTEST_SOURCE_DIRECTORY}/dist/cobertura/cobertura-coverage.xml") ctest_start("Continuous") -ctest_configure( - OPTIONS "-DSELENIUM_TESTS=OFF" -) +ctest_configure() ctest_build() ctest_test(PARALLEL_LEVEL 1 RETURN_VALUE res) if(EXISTS "${coverage_file}") diff --git a/dashboard/github_service/dashboard.py b/dashboard/github_service/dashboard.py index e7e7102048..1e2840fa85 100644 --- a/dashboard/github_service/dashboard.py +++ b/dashboard/github_service/dashboard.py @@ -107,7 +107,6 @@ def run_test(repo, commit, testdir, branch): s, out = _communicate( ' '.join([ cmake, - '-D', 'SELENIUM_TESTS=ON', '-D', 'CHROME_TESTS=OFF', '-D', 'FIREFOX_TESTS=ON', '-D', 'COVERAGE_TESTS=OFF', diff --git a/docs/developers.rst b/docs/developers.rst index a3d12ff117..d362960e41 100644 --- a/docs/developers.rst +++ b/docs/developers.rst @@ -40,7 +40,7 @@ Headless browser testing Geojs uses `PhantomJS `_ for headless browser testing of core utilities. Unfortunately because PhantomJS does not support webgl at this time, so code paths requiring gl must be either -mocked or run via selenium. +mocked or run in an environment such as xvfb. The headless unit tests should be placed in the ``tests/cases/`` directory. All javascript files in this directory will be detected @@ -81,9 +81,9 @@ will run the headless WebGL tests. After the data for tests is downloaded, the tests can also be run via ``npm run test-webgl``, which assumes that ``xvfb-run`` is available. -The headless unit tests that require WebGL should be placed in the -``tests/gl-cases/`` directory. When tests are run in a normal browser via -``npm run start``, the webgl tests are included. +The headless unit tests that require WebGL or should run in a standard browser +should be placed in the ``tests/gl-cases/`` directory. When tests are run in a +normal browser via ``npm run start``, the webgl tests are included. Many of these tests compare against a baseline image. If a test is changed or added, new baselines can be generated and optionally uploaded via the script @@ -115,149 +115,3 @@ directory. To run these tests in a normal browser, run Since the browser's direct screen output is used, the browser must be running on the same machine as the ``npm run start`` command. -Selenium testing ----------------- - -The selenium testing infrastructure of Geojs is run via CTest, it assumes -that the testing "server" is started prior to execution. To start the -server, just run :: - - npm run start-test - -This will start a server on the default port of ``30100``. The port -and selenium host names are configurable with cmake. For example inside -the Kitware firewall, you can run the following to test on the selenium -node on ``garant`` :: - - cmake -DSELENIUM_TESTS=ON -DSELENIUM_HOST=garant /path/to/geojs - make - ctest -VV - -You may need to also set the variable ``TESTING_HOST`` to your computer's -IP address reachable by the selenium node. - -Most tests for geojs require a full browser with webgl support. -For these test, a framework based on `Selenium `_ -is provided. This test framework is intentionally lightweight to allow -for many different kinds of testing from simple Jasmine style unit tests -to complicated mouse interactions with screenshot comparisons. - -All selenium based tests should be placed inside subdirectories of -``testing/test-cases/selenium-tests``. All subdirectories are assumed -to be selenium tests by CMake and will be instrumented and run accordingly. -Each subdirectory should, at a minimum, contain the following three files, -which may be empty: - -1. ``include.css``: CSS that will be concatenated into a ``style`` node - in the ``head``. - -2. ``include.html``: HTML that will be concatenated into the ``body``. - -3. ``include.js``: Javascript source that will be concatenated into a ``script`` - node in the ``head`` after the inclusion of the geojs source and all dependent - libraries. - -Generally, developers are free to put arbitrary content into these files; however, -one convention **must** be followed for the default instrumentation to work correctly. -The javascript source should be wrapped in a global function called ``startTest``. -This function will be called automatically by the testing framework after all of -the instrumentation is in place and the page is loaded. The ``startTest`` function will -be called with function as an argument that should be called when page is ready to -run the unit tests. This is provided as a convenience for the default behavior -of :py:func:`selenium_test.BaseTest.wait` with no arguments. Developers can -extend this behavior as necessary to provide more complicated use cases. - -The compiled version of these -tests are placed inside the deployment root so the users can manually see the test -results. The path to each test is derived from the relative path inside -``testing/test-cases/selenium-tests/``. For example, the test page in -``testing/test-cases/selenium-tests/osmLayer/`` is available at -``_ after starting the test web server. - -The unit tests themselves are derived from Python's -`unittest `_ module via a customized -subclass :py:class:`selenium_test.BaseTest`. Detailed documentation of the methods -this class provides is given in the next section. Developers should feel free to -extend this class with any generally useful methods as they become necessary for -a wider variety test cases. - -Example unit test -^^^^^^^^^^^^^^^^^ - -The following is a minimal example of a selenium unit test using the testing framework. -More complicated examples can be found by examining the existing tests present -in the source. - -``hello/index.html``: - -.. code-block:: html - -
- -``hello/index.css``: - -.. code-block:: css - - #div-node { - text-align: center; - } - -``hello/index.js``: - -.. code-block:: js - - window.startTest = function (done) { - $("#div-node").text("Hello, World!"); - done(); - }; - -``hello/testHelloWorld.py``: - -.. code-block:: python - - # Importing setupModule and tearDownModule will start up and - # shut down the web server automatically. - from selenium_test import FirefoxTest, setupModule, tearDownModule - - # This test will run on firefox only. - class HelloWorld(FirefoxTest): - testCase = ('hello', 'world') - - def test_main(self): - # Resize the window to have consistent results. - self.resizeWindow(640, 480) - - # Load the main html for this test directory. - self.loadUrl('hello/index.html') - - # Wait for it to be loaded. - self.wait() - - # Now we are ready to test the page. - # The base class provide easy methods to test a screen shot. - # This will take a screen shot and compare it against any - # screenshots in the test image store at revision number 1. - # Any failure here will raise an exception that will mark the - # test as failed. - self.screenshotTest('helloWorldScreenshot', revision=1) - -Uploading screenshots to the image store -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -A script is provided in the source to help developers upload -images to the data store in a way that they can be loaded automatically -by the testing infrastructure. The script is built into ``test/upload_test_cases.py`` -when selenium testing is enabled in CMake. When creating a new test -(or updating a revision), the following is the recommended method for uploading -test data for the example test ``hello/`` described above. :: - - # inside the build directory - python test/upload_test_cases.py ../testing/test-cases/selenium-tests/hello - -The script will run all the tests in this directory and prompt you if you want to upload a new image -in the event that a screenshot test has failed. If you intend to start a new -revision, then the revision number should be changed in the unit test source -before running this script. Note: you must have write permission in the MIDAS -GeoJS community before you can upload new images. Contact a community administrator -for an invitation. - diff --git a/docs/midas_handler.rst b/docs/midas_handler.rst deleted file mode 100644 index 097e120135..0000000000 --- a/docs/midas_handler.rst +++ /dev/null @@ -1,5 +0,0 @@ -midas_handler -============= - -.. autoclass:: midas_handler.MidasHandler - :members: diff --git a/docs/provisioning.rst b/docs/provisioning.rst index 44099589a6..a74705d193 100644 --- a/docs/provisioning.rst +++ b/docs/provisioning.rst @@ -7,8 +7,7 @@ Provisioning for Development Ubuntu 14.04 ------------- -This shows how to set up a build and test environment in Ubuntu 14.04, using -all but the Selenium-based tests. +This shows how to set up a build and test environment in Ubuntu 14.04. These instructions will probably work for any Ubuntu release from 14.04 onward. They assume a basic installation, as, for instance, from the @@ -64,9 +63,9 @@ Run the headless WebGL tests :: xvfb-run -s '-ac -screen 0 1280x1024x24' ctest -VV -R ffheadless -Run all but the Selenium tests :: +Run all tests :: - xvfb-run -s '-ac -screen 0 1280x1024x24' ctest --output-on-failure -E selenium + xvfb-run -s '-ac -screen 0 1280x1024x24' ctest --output-on-failure Install python packages :: diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 5bfef95e4d..403a64ba05 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -23,7 +23,6 @@ and testing of geojs. * `Girder Client `_ * `Pillow `_ * `Requests `_ -* `Selenium `_ For testing WebGL in a headless environment, the additional packages are needed: diff --git a/docs/requirements.txt b/docs/requirements.txt index be69a493fd..28abb1f73b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,4 @@ Pillow -selenium requests sphinx_rtd_theme graphviz diff --git a/docs/selenium_test.rst b/docs/selenium_test.rst deleted file mode 100644 index 40244bbdc3..0000000000 --- a/docs/selenium_test.rst +++ /dev/null @@ -1,5 +0,0 @@ -selenium_test -============= - -.. automodule:: selenium_test - :members: diff --git a/docs/testingutils.rst b/docs/testingutils.rst index c02cfdd26e..c416a3d8d8 100644 --- a/docs/testingutils.rst +++ b/docs/testingutils.rst @@ -7,6 +7,4 @@ Testing infrastructure :maxdepth: 2 baseline_images - selenium_test - midas_handler upload_test_cases diff --git a/examples/blog-lines/main.js b/examples/blog-lines/main.js index d9bc63ee35..d964e1bff7 100644 --- a/examples/blog-lines/main.js +++ b/examples/blog-lines/main.js @@ -299,6 +299,7 @@ function geojsLinesTest(opts) { var geo = libraryReference(opts); + $(opts.node).removeClass('ready'); // create the map var map = geo.map({ node: opts.node, @@ -358,6 +359,12 @@ function geojsLinesTest(opts) { map.draw(); + map.onIdle(function () { + map.scheduleAnimationFrame(function () { + $(opts.node).addClass('ready'); + }, 'readyFlag'); + }); + // return references to the various objects return { map: map, diff --git a/examples/lines/main.js b/examples/lines/main.js index 4f695703eb..8be77cdae0 100644 --- a/examples/lines/main.js +++ b/examples/lines/main.js @@ -129,7 +129,7 @@ $(function () { * the line. */ function show_lines(rawdata) { - $('#map').removeClass('ready'); + $('#map').removeClass('ready').attr('segments', ''); if (!rawdata) { return; } @@ -146,7 +146,7 @@ $(function () { var text = 'Shown: ' + segments; $('#lines-shown').text(text).attr('title', text); map.onIdle(function () { - $('#map').addClass('ready'); + $('#map').addClass('ready').attr('segments', maxsegments); }); } @@ -291,9 +291,9 @@ $(function () { function select_preset(evt) { var update; var ctl = $(evt.target); - var keys = ['antialiasing', 'lineCap', 'lineJoin', 'lines', 'miterLimit', - 'showmap', 'strokeColor', 'strokeOffset', 'strokeOpacity', - 'strokeWidth']; + var keys = [ + 'antialiasing', 'lineCap', 'lineJoin', 'lines', 'miterLimit', 'showmap', + 'strokeColor', 'strokeOffset', 'strokeOpacity', 'strokeWidth']; skipdraw = true; $.each(keys, function (idx, key) { var value = ctl.attr(key); diff --git a/package.json b/package.json index ed02ffed52..dec8e45c2b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "d3": "^3.5.16" }, "devDependencies": { - "blanket": "~1.2", "body-parser": "^1.15.0", "bootstrap": "^3.3.6", "bootswatch": "^3.3.6", diff --git a/src/d3/d3Renderer.js b/src/d3/d3Renderer.js index 160a9d5b17..25450c63a0 100644 --- a/src/d3/d3Renderer.js +++ b/src/d3/d3Renderer.js @@ -418,7 +418,7 @@ var d3Renderer = function (arg) { m_svg.attr('width', w); m_svg.attr('height', h); m_this._setTransform(); - m_this.layer().geoTrigger(geo_event.d3Rescale, { scale: m_scale }, true); + m_this.layer().geoTrigger(d3Rescale, { scale: m_scale }, true); }; //////////////////////////////////////////////////////////////////////////// diff --git a/src/map.js b/src/map.js index b4e12db4df..3f65164b46 100644 --- a/src/map.js +++ b/src/map.js @@ -1689,10 +1689,13 @@ var map = function (arg) { return; } layer.node().children('canvas').each(function () { - if (layer.renderer().api() === 'vgl') { - layer.renderer()._renderFrame(); - } - drawLayerImageToContext(context, opacity, $(this), $(this)[0]); + var canvasElem = $(this); + defer = defer.then(function () { + if (layer.renderer().api() === 'vgl') { + layer.renderer()._renderFrame(); + } + drawLayerImageToContext(context, opacity, canvasElem, canvasElem[0]); + }); }); if (layer.node().children().not('canvas').length) { defer = defer.then(function () { diff --git a/src/mapInteractor.js b/src/mapInteractor.js index 5f98eabe80..80ca608a79 100644 --- a/src/mapInteractor.js +++ b/src/mapInteractor.js @@ -949,7 +949,6 @@ var mapInteractor = function (args) { */ //////////////////////////////////////////////////////////////////////////// this._handleMouseMove = function (evt) { - if (m_paused) { return; } diff --git a/src/quadFeature.js b/src/quadFeature.js index d350970c9b..388ee9d754 100644 --- a/src/quadFeature.js +++ b/src/quadFeature.js @@ -319,7 +319,7 @@ var quadFeature = function (arg) { } return; } - var quad, reload, image, prev_onload, + var quad, reload, image, prev_onload, prev_onerror, pos, img, opacity, previewColor, previewImage, quadinfo = {}; pos = m_this._positionToQuad(posFunc, depthFunc, d, i); @@ -337,10 +337,12 @@ var quadFeature = function (arg) { origin = pos.ll; origindiag2 = diag2; } - pos = [pos.ll[0], pos.ll[1], pos.ll[2], - pos.lr[0], pos.lr[1], pos.lr[2], - pos.ul[0], pos.ul[1], pos.ul[2], - pos.ur[0], pos.ur[1], pos.ur[2]]; + pos = [ + pos.ll[0], pos.ll[1], pos.ll[2], + pos.lr[0], pos.lr[1], pos.lr[2], + pos.ul[0], pos.ul[1], pos.ul[2], + pos.ur[0], pos.ur[1], pos.ur[2] + ]; img = imgFunc.call(m_this, d, i); if (!img) { quad = { @@ -396,6 +398,8 @@ var quadFeature = function (arg) { } reload = loadedFunc.call(m_this, d, i); if (reload) { + // add a promise to the layer if this image might complete + var defer = util.isReadyImage(image, true) ? null : $.Deferred(); prev_onload = image.onload; image.onload = function () { if (previewColor !== undefined) { @@ -408,10 +412,25 @@ var quadFeature = function (arg) { m_this.modified(); m_this._update(); m_this.layer().draw(); + if (defer) { + defer.resolve(); + } if (prev_onload) { return prev_onload.apply(this, arguments); } }; + prev_onerror = image.onerror; + image.onerror = function () { + if (defer) { + defer.reject(); + } + if (prev_onerror) { + return prev_onerror.apply(this, arguments); + } + }; + if (defer) { + m_this.layer().addPromise(defer.promise()); + } } else if (previewColor === undefined && !quad.image) { return; } diff --git a/testing/js/blanket.min.js b/testing/js/blanket.min.js deleted file mode 100644 index 8c11f9170e..0000000000 --- a/testing/js/blanket.min.js +++ /dev/null @@ -1 +0,0 @@ -typeof QUnit!="undefined"&&(QUnit.config.autostart=!1),function(e){(function(t,n){"use strict";typeof e=="function"&&e.amd?e(["exports"],n):typeof exports!="undefined"?n(exports):n(t.esprima={})})(this,function(e){"use strict";function m(e,t){if(!e)throw new Error("ASSERT: "+t)}function g(e,t){return u.slice(e,t)}function y(e){return"0123456789".indexOf(e)>=0}function b(e){return"0123456789abcdefABCDEF".indexOf(e)>=0}function w(e){return"01234567".indexOf(e)>=0}function E(e){return e===" "||e===" "||e===" "||e==="\f"||e==="\u00a0"||e.charCodeAt(0)>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(e)>=0}function S(e){return e==="\n"||e==="\r"||e==="\u2028"||e==="\u2029"}function x(e){return e==="$"||e==="_"||e==="\\"||e>="a"&&e<="z"||e>="A"&&e<="Z"||e.charCodeAt(0)>=128&&o.NonAsciiIdentifierStart.test(e)}function T(e){return e==="$"||e==="_"||e==="\\"||e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||e.charCodeAt(0)>=128&&o.NonAsciiIdentifierPart.test(e)}function N(e){switch(e){case"class":case"enum":case"export":case"extends":case"import":case"super":return!0}return!1}function C(e){switch(e){case"implements":case"interface":case"package":case"private":case"protected":case"public":case"static":case"yield":case"let":return!0}return!1}function k(e){return e==="eval"||e==="arguments"}function L(e){var t=!1;switch(e.length){case 2:t=e==="if"||e==="in"||e==="do";break;case 3:t=e==="var"||e==="for"||e==="new"||e==="try";break;case 4:t=e==="this"||e==="else"||e==="case"||e==="void"||e==="with";break;case 5:t=e==="while"||e==="break"||e==="catch"||e==="throw";break;case 6:t=e==="return"||e==="typeof"||e==="delete"||e==="switch";break;case 7:t=e==="default"||e==="finally";break;case 8:t=e==="function"||e==="continue"||e==="debugger";break;case 10:t=e==="instanceof"}if(t)return!0;switch(e){case"const":return!0;case"yield":case"let":return!0}return a&&C(e)?!0:N(e)}function A(){var e,t,n;t=!1,n=!1;while(f=h&&R({},s.UnexpectedToken,"ILLEGAL")):(e=u[f++],f>=h&&R({},s.UnexpectedToken,"ILLEGAL"),e==="*"&&(e=u[f],e==="/"&&(++f,t=!1)));else if(e==="/"){e=u[f+1];if(e==="/")f+=2,n=!0;else{if(e!=="*")break;f+=2,t=!0,f>=h&&R({},s.UnexpectedToken,"ILLEGAL")}}else if(E(e))++f;else{if(!S(e))break;++f,e==="\r"&&u[f]==="\n"&&++f,++l,c=f}}}function O(e){var t,n,r,i=0;n=e==="u"?4:2;for(t=0;t"&&r===">"&&i===">"&&s==="=")return f+=4,{type:t.Punctuator,value:">>>=",lineNumber:l,lineStart:c,range:[e,f]};if(n==="="&&r==="="&&i==="=")return f+=3,{type:t.Punctuator,value:"===",lineNumber:l,lineStart:c,range:[e,f]};if(n==="!"&&r==="="&&i==="=")return f+=3,{type:t.Punctuator,value:"!==",lineNumber:l,lineStart:c,range:[e,f]};if(n===">"&&r===">"&&i===">")return f+=3,{type:t.Punctuator,value:">>>",lineNumber:l,lineStart:c,range:[e,f]};if(n==="<"&&r==="<"&&i==="=")return f+=3,{type:t.Punctuator,value:"<<=",lineNumber:l,lineStart:c,range:[e,f]};if(n===">"&&r===">"&&i==="=")return f+=3,{type:t.Punctuator,value:">>=",lineNumber:l,lineStart:c,range:[e,f]};if(r==="="&&"<>=!+-*%&|^/".indexOf(n)>=0)return f+=2,{type:t.Punctuator,value:n+r,lineNumber:l,lineStart:c,range:[e,f]};if(n===r&&"+-<>&|".indexOf(n)>=0&&"+-<>&|".indexOf(r)>=0)return f+=2,{type:t.Punctuator,value:n+r,lineNumber:l,lineStart:c,range:[e,f]};if("[]<>+-*%&|^!~?:=/".indexOf(n)>=0)return{type:t.Punctuator,value:u[f++],lineNumber:l,lineStart:c,range:[e,f]}}function D(){var e,n,r;r=u[f],m(y(r)||r===".","Numeric literal must start with a decimal digit or a decimal point"),n=f,e="";if(r!=="."){e=u[f++],r=u[f];if(e==="0"){if(r==="x"||r==="X"){e+=u[f++];while(f=h&&(r=""),R({},s.UnexpectedToken,"ILLEGAL")}return f=0&&f=h)return{type:t.EOF,lineNumber:l,lineStart:c,range:[f,f]};n=_();if(typeof n!="undefined")return n;e=u[f];if(e==="'"||e==='"')return P();if(e==="."||y(e))return D();n=M();if(typeof n!="undefined")return n;R({},s.UnexpectedToken,"ILLEGAL")}function F(){var e;return p?(f=p.range[1],l=p.lineNumber,c=p.lineStart,e=p,p=null,e):(p=null,j())}function I(){var e,t,n;return p!==null?p:(e=f,t=l,n=c,p=j(),f=e,l=t,c=n,p)}function q(){var e,t,n,r;return e=f,t=l,n=c,A(),r=l!==t,f=e,l=t,c=n,r}function R(e,t){var n,r=Array.prototype.slice.call(arguments,2),i=t.replace(/%(\d)/g,function(e,t){return r[t]||""});throw typeof e.lineNumber=="number"?(n=new Error("Line "+e.lineNumber+": "+i),n.index=e.range[0],n.lineNumber=e.lineNumber,n.column=e.range[0]-c+1):(n=new Error("Line "+l+": "+i),n.index=f,n.lineNumber=l,n.column=f-c+1),n}function U(){try{R.apply(null,arguments)}catch(e){if(!v.errors)throw e;v.errors.push(e)}}function z(e){e.type===t.EOF&&R(e,s.UnexpectedEOS),e.type===t.NumericLiteral&&R(e,s.UnexpectedNumber),e.type===t.StringLiteral&&R(e,s.UnexpectedString),e.type===t.Identifier&&R(e,s.UnexpectedIdentifier);if(e.type===t.Keyword){if(N(e.value))R(e,s.UnexpectedReserved);else if(a&&C(e.value)){U(e,s.StrictReservedWord);return}R(e,s.UnexpectedToken,e.value)}R(e,s.UnexpectedToken,e.value)}function W(e){var n=F();(n.type!==t.Punctuator||n.value!==e)&&z(n)}function X(e){var n=F();(n.type!==t.Keyword||n.value!==e)&&z(n)}function V(e){var n=I();return n.type===t.Punctuator&&n.value===e}function $(e){var n=I();return n.type===t.Keyword&&n.value===e}function J(){var e=I(),n=e.value;return e.type!==t.Punctuator?!1:n==="="||n==="*="||n==="/="||n==="%="||n==="+="||n==="-="||n==="<<="||n===">>="||n===">>>="||n==="&="||n==="^="||n==="|="}function K(){var e,n;if(u[f]===";"){F();return}n=l,A();if(l!==n)return;if(V(";")){F();return}e=I(),e.type!==t.EOF&&!V("}")&&z(e)}function Q(e){return e.type===r.Identifier||e.type===r.MemberExpression}function G(){var e=[];W("[");while(!V("]"))V(",")?(F(),e.push(null)):(e.push(Tt()),V("]")||W(","));return W("]"),{type:r.ArrayExpression,elements:e}}function Y(e,t){var n,i;return n=a,i=Gt(),t&&a&&k(e[0].name)&&U(t,s.StrictParamName),a=n,{type:r.FunctionExpression,id:null,params:e,defaults:[],body:i,rest:null,generator:!1,expression:!1}}function Z(){var e=F();return e.type===t.StringLiteral||e.type===t.NumericLiteral?(a&&e.octal&&U(e,s.StrictOctalLiteral),ln(e)):{type:r.Identifier,name:e.value}}function et(){var e,n,i,o;e=I();if(e.type===t.Identifier)return i=Z(),e.value==="get"&&!V(":")?(n=Z(),W("("),W(")"),{type:r.Property,key:n,value:Y([]),kind:"get"}):e.value==="set"&&!V(":")?(n=Z(),W("("),e=I(),e.type!==t.Identifier?(W(")"),U(e,s.UnexpectedToken,e.value),{type:r.Property,key:n,value:Y([]),kind:"set"}):(o=[Lt()],W(")"),{type:r.Property,key:n,value:Y(o,e),kind:"set"})):(W(":"),{type:r.Property,key:i,value:Tt(),kind:"init"});if(e.type!==t.EOF&&e.type!==t.Punctuator)return n=Z(),W(":"),{type:r.Property,key:n,value:Tt(),kind:"init"};z(e)}function tt(){var e=[],t,n,o,u={},f=String;W("{");while(!V("}"))t=et(),t.key.type===r.Identifier?n=t.key.name:n=f(t.key.value),o=t.kind==="init"?i.Data:t.kind==="get"?i.Get:i.Set,Object.prototype.hasOwnProperty.call(u,n)?(u[n]===i.Data?a&&o===i.Data?U({},s.StrictDuplicateProperty):o!==i.Data&&U({},s.AccessorDataProperty):o===i.Data?U({},s.AccessorDataProperty):u[n]&o&&U({},s.AccessorGetSet),u[n]|=o):u[n]=o,e.push(t),V("}")||W(",");return W("}"),{type:r.ObjectExpression,properties:e}}function nt(){var e;return W("("),e=Nt(),W(")"),e}function rt(){var e=I(),n=e.type;if(n===t.Identifier)return{type:r.Identifier,name:F().value};if(n===t.StringLiteral||n===t.NumericLiteral)return a&&e.octal&&U(e,s.StrictOctalLiteral),ln(F());if(n===t.Keyword){if($("this"))return F(),{type:r.ThisExpression};if($("function"))return Zt()}return n===t.BooleanLiteral?(F(),e.value=e.value==="true",ln(e)):n===t.NullLiteral?(F(),e.value=null,ln(e)):V("[")?G():V("{")?tt():V("(")?nt():V("/")||V("/=")?ln(H()):z(F())}function it(){var e=[];W("(");if(!V(")"))while(f>")||V(">>>"))e={type:r.BinaryExpression,operator:F().value,left:e,right:dt()};return e}function mt(){var e,t;t=d.allowIn,d.allowIn=!0,e=vt();while(V("<")||V(">")||V("<=")||V(">=")||t&&$("in")||$("instanceof"))e={type:r.BinaryExpression,operator:F().value,left:e,right:vt()};return d.allowIn=t,e}function gt(){var e=mt();while(V("==")||V("!=")||V("===")||V("!=="))e={type:r.BinaryExpression,operator:F().value,left:e,right:mt()};return e}function yt(){var e=gt();while(V("&"))F(),e={type:r.BinaryExpression,operator:"&",left:e,right:gt()};return e}function bt(){var e=yt();while(V("^"))F(),e={type:r.BinaryExpression,operator:"^",left:e,right:yt()};return e}function wt(){var e=bt();while(V("|"))F(),e={type:r.BinaryExpression,operator:"|",left:e,right:bt()};return e}function Et(){var e=wt();while(V("&&"))F(),e={type:r.LogicalExpression,operator:"&&",left:e,right:wt()};return e}function St(){var e=Et();while(V("||"))F(),e={type:r.LogicalExpression,operator:"||",left:e,right:Et()};return e}function xt(){var e,t,n;return e=St(),V("?")&&(F(),t=d.allowIn,d.allowIn=!0,n=Tt(),d.allowIn=t,W(":"),e={type:r.ConditionalExpression,test:e,consequent:n,alternate:Tt()}),e}function Tt(){var e,t;return e=I(),t=xt(),J()&&(Q(t)||U({},s.InvalidLHSInAssignment),a&&t.type===r.Identifier&&k(t.name)&&U(e,s.StrictLHSAssignment),t={type:r.AssignmentExpression,operator:F().value,left:t,right:Tt()}),t}function Nt(){var e=Tt();if(V(",")){e={type:r.SequenceExpression,expressions:[e]};while(f0&&v.comments[v.comments.length-1].range[1]>n)return;v.comments.push({type:e,value:t,range:[n,r],loc:i})}function sn(){var e,t,n,r,i,o;e="",i=!1,o=!1;while(f=h?(o=!1,e+=t,n.end={line:l,column:h-c},rn("Line",e,r,h,n)):e+=t;else if(i)S(t)?(t==="\r"&&u[f+1]==="\n"?(++f,e+="\r\n"):e+=t,++l,++f,c=f,f>=h&&R({},s.UnexpectedToken,"ILLEGAL")):(t=u[f++],f>=h&&R({},s.UnexpectedToken,"ILLEGAL"),e+=t,t==="*"&&(t=u[f],t==="/"&&(e=e.substr(0,e.length-1),i=!1,++f,n.end={line:l,column:f-c},rn("Block",e,r,f,n),e="")));else if(t==="/"){t=u[f+1];if(t==="/")n={start:{line:l,column:f-c}},r=f,f+=2,o=!0,f>=h&&(n.end={line:l,column:f-c},o=!1,rn("Line",e,r,f,n));else{if(t!=="*")break;r=f,f+=2,i=!0,n={start:{line:l,column:f-c-2}},f>=h&&R({},s.UnexpectedToken,"ILLEGAL")}}else if(E(t))++f;else{if(!S(t))break;++f,t==="\r"&&u[f]==="\n"&&++f,++l,c=f}}}function on(){var e,t,n,r=[];for(e=0;e0&&(r=v.tokens[v.tokens.length-1],r.range[0]===e&&r.type==="Punctuator"&&(r.value==="/"||r.value==="/=")&&v.tokens.pop()),v.tokens.push({type:"RegularExpression",value:n.literal,range:[e,f],loc:t}),n}function fn(){var e,t,n,r=[];for(e=0;e0?1:0,c=0,h=u.length,p=null,d={allowIn:!0,labelSet:{},inFunctionBody:!1,inIteration:!1,inSwitch:!1},v={},typeof t!="undefined"&&(v.range=typeof t.range=="boolean"&&t.range,v.loc=typeof t.loc=="boolean"&&t.loc,v.raw=typeof t.raw=="boolean"&&t.raw,typeof t.tokens=="boolean"&&t.tokens&&(v.tokens=[]),typeof t.comment=="boolean"&&t.comment&&(v.comments=[]),typeof t.tolerant=="boolean"&&t.tolerant&&(v.errors=[])),h>0&&typeof u[0]=="undefined"&&(e instanceof String&&(u=e.valueOf()),typeof u[0]=="undefined"&&(u=wn(e))),yn();try{n=nn(),typeof v.comments!="undefined"&&(on(),n.comments=v.comments),typeof v.tokens!="undefined"&&(fn(),n.tokens=v.tokens),typeof v.errors!="undefined"&&(n.errors=v.errors);if(v.range||v.loc)n.body=mn(n.body)}catch(i){throw i}finally{bn(),v={}}return n}var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v;t={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},n={},n[t.BooleanLiteral]="Boolean",n[t.EOF]="",n[t.Identifier]="Identifier",n[t.Keyword]="Keyword",n[t.NullLiteral]="Null",n[t.NumericLiteral]="Numeric",n[t.Punctuator]="Punctuator",n[t.StringLiteral]="String",r={AssignmentExpression:"AssignmentExpression",ArrayExpression:"ArrayExpression",BlockStatement:"BlockStatement",BinaryExpression:"BinaryExpression",BreakStatement:"BreakStatement",CallExpression:"CallExpression",CatchClause:"CatchClause",ConditionalExpression:"ConditionalExpression",ContinueStatement:"ContinueStatement",DoWhileStatement:"DoWhileStatement",DebuggerStatement:"DebuggerStatement",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",ForStatement:"ForStatement",ForInStatement:"ForInStatement",FunctionDeclaration:"FunctionDeclaration",FunctionExpression:"FunctionExpression",Identifier:"Identifier",IfStatement:"IfStatement",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",NewExpression:"NewExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ReturnStatement:"ReturnStatement",SequenceExpression:"SequenceExpression",SwitchStatement:"SwitchStatement",SwitchCase:"SwitchCase",ThisExpression:"ThisExpression",ThrowStatement:"ThrowStatement",TryStatement:"TryStatement",UnaryExpression:"UnaryExpression",UpdateExpression:"UpdateExpression",VariableDeclaration:"VariableDeclaration",VariableDeclarator:"VariableDeclarator",WhileStatement:"WhileStatement",WithStatement:"WithStatement"},i={Data:1,Get:2,Set:4},s={UnexpectedToken:"Unexpected token %0",UnexpectedNumber:"Unexpected number",UnexpectedString:"Unexpected string",UnexpectedIdentifier:"Unexpected identifier",UnexpectedReserved:"Unexpected reserved word",UnexpectedEOS:"Unexpected end of input",NewlineAfterThrow:"Illegal newline after throw",InvalidRegExp:"Invalid regular expression",UnterminatedRegExp:"Invalid regular expression: missing /",InvalidLHSInAssignment:"Invalid left-hand side in assignment",InvalidLHSInForIn:"Invalid left-hand side in for-in",MultipleDefaultsInSwitch:"More than one default clause in switch statement",NoCatchOrFinally:"Missing catch or finally after try",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared",IllegalContinue:"Illegal continue statement",IllegalBreak:"Illegal break statement",IllegalReturn:"Illegal return statement",StrictModeWith:"Strict mode code may not include a with statement",StrictCatchVariable:"Catch variable may not be eval or arguments in strict mode",StrictVarName:"Variable name may not be eval or arguments in strict mode",StrictParamName:"Parameter name eval or arguments is not allowed in strict mode",StrictParamDupe:"Strict mode function may not have duplicate parameter names",StrictFunctionName:"Function name may not be eval or arguments in strict mode",StrictOctalLiteral:"Octal literals are not allowed in strict mode.",StrictDelete:"Delete of an unqualified identifier in strict mode.",StrictDuplicateProperty:"Duplicate data property in object literal not allowed in strict mode",AccessorDataProperty:"Object literal may not have data and accessor property with the same name",AccessorGetSet:"Object literal may not have multiple get/set accessors with the same name",StrictLHSAssignment:"Assignment to eval or arguments is not allowed in strict mode",StrictLHSPostfix:"Postfix increment/decrement may not have eval or arguments operand in strict mode",StrictLHSPrefix:"Prefix increment/decrement may not have eval or arguments operand in strict mode",StrictReservedWord:"Use of future reserved word in strict mode"},o={NonAsciiIdentifierStart:new RegExp("[\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]"),NonAsciiIdentifierPart:new RegExp("[\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]")},typeof "esprima"[0]=="undefined"&&(g=function(t,n){return u.slice(t,n).join("")}),e.version="1.0.4",e.parse=En,e.Syntax=function(){var e,t={};typeof Object.create=="function"&&(t=Object.create(null));for(e in r)r.hasOwnProperty(e)&&(t[e]=r[e]);return typeof Object.freeze=="function"&&Object.freeze(t),t}()})}(null),function(e,t){function o(e,t,n){function o(t){n[e.range[0]]=t;for(var r=e.range[0]+1;rparseInt(t,10)}).forEach(function(t){i+=s+"['"+e+"']["+t+"]=0;\n"}),n&&_blanket._branchingArraySetup.sort(function(e,t){return e.line>t.line}).sort(function(e,t){return e.column>t.column}).forEach(function(t){t.file===e&&(i+="if (typeof "+s+"['"+e+"'].branchData["+t.line+"] === 'undefined'){\n",i+=s+"['"+e+"'].branchData["+t.line+"]=[];\n",i+="}",i+=s+"['"+e+"'].branchData["+t.line+"]["+t.column+"] = [];\n",i+=s+"['"+e+"'].branchData["+t.line+"]["+t.column+"].consequent = "+JSON.stringify(t.consequent)+";\n",i+=s+"['"+e+"'].branchData["+t.line+"]["+t.column+"].alternate = "+JSON.stringify(t.alternate)+";\n")}),i+="}",i},_blockifyIf:function(e){if(t.indexOf(e.type)>-1){var n=e.consequent||e.body,r=e.alternate;r&&r.type!=="BlockStatement"&&r.update("{\n"+r.source()+"}\n"),n&&n.type!=="BlockStatement"&&n.update("{\n"+n.source()+"}\n")}},_trackBranch:function(e,t){var n=e.loc.start.line,r=e.loc.start.column;_blanket._branchingArraySetup.push({line:n,column:r,file:t,consequent:e.consequent.loc,alternate:e.alternate.loc});var i="_$branchFcn('"+t+"',"+n+","+r+","+e.test.source()+")?"+e.consequent.source()+":"+e.alternate.source();e.update(i)},_addTracking:function(t){var n=_blanket.getCovVar();return function(r){_blanket._blockifyIf(r);if(e.indexOf(r.type)>-1&&r.parent.type!=="LabeledStatement"){_blanket._checkDefs(r,t);if(r.type==="VariableDeclaration"&&(r.parent.type==="ForStatement"||r.parent.type==="ForInStatement"))return;if(!r.loc||!r.loc.start)throw new Error("The instrumenter encountered a node with no location: "+Object.keys(r));r.update(n+"['"+t+"']["+r.loc.start.line+"]++;\n"+r.source()),_blanket._trackingArraySetup.push(r.loc.start.line)}else _blanket.options("branchTracking")&&r.type==="ConditionalExpression"&&_blanket._trackBranch(r,t)}},_checkDefs:function(e,t){if(inBrowser){e.type==="VariableDeclaration"&&e.declarations&&e.declarations.forEach(function(n){if(n.id.name==="window")throw new Error("Instrumentation error, you cannot redefine the 'window' variable in "+t+":"+e.loc.start.line)}),e.type==="FunctionDeclaration"&&e.params&&e.params.forEach(function(n){if(n.name==="window")throw new Error("Instrumentation error, you cannot redefine the 'window' variable in "+t+":"+e.loc.start.line)});if(e.type==="ExpressionStatement"&&e.expression&&e.expression.left&&e.expression.left.object&&e.expression.left.property&&e.expression.left.object.name+"."+e.expression.left.property.name===_blanket.getCovVar())throw new Error("Instrumentation error, you cannot redefine the coverage variable in "+t+":"+e.loc.start.line)}else if(e.type==="ExpressionStatement"&&e.expression&&e.expression.left&&!e.expression.left.object&&!e.expression.left.property&&e.expression.left.name===_blanket.getCovVar())throw new Error("Instrumentation error, you cannot redefine the coverage variable in "+t+":"+e.loc.start.line)},setupCoverage:function(){i.instrumentation="blanket",i.stats={suites:0,tests:0,passes:0,pending:0,failures:0,start:new Date}},_checkIfSetup:function(){if(!i.stats)throw new Error("You must call blanket.setupCoverage() first.")},onTestStart:function(){_blanket.options("debug")&&console.log("BLANKET-Test event started"),this._checkIfSetup(),i.stats.tests++,i.stats.pending++},onTestDone:function(e,t){this._checkIfSetup(),t===e?i.stats.passes++:i.stats.failures++,i.stats.pending--},onModuleStart:function(){this._checkIfSetup(),i.stats.suites++},onTestsDone:function(){_blanket.options("debug")&&console.log("BLANKET-Test event done"),this._checkIfSetup(),i.stats.end=new Date,inBrowser?this.report(i):(_blanket.options("branchTracking")||delete (inBrowser?window:global)[_blanket.getCovVar()].branchFcn,this.options("reporter").call(this,i))}},_blanket}(),function(e){var t=e.options;e.extend({outstandingRequireFiles:[],options:function(n,r){var i={};if(typeof n!="string")t(n),i=n;else{if(typeof r=="undefined")return t(n);t(n,r),i[n]=r}i.adapter&&e._loadFile(i.adapter),i.loader&&e._loadFile(i.loader)},requiringFile:function(t,n){typeof t=="undefined"?e.outstandingRequireFiles=[]:typeof n=="undefined"?e.outstandingRequireFiles.push(t):e.outstandingRequireFiles.splice(e.outstandingRequireFiles.indexOf(t),1)},requireFilesLoaded:function(){return e.outstandingRequireFiles.length===0},showManualLoader:function(){if(document.getElementById("blanketLoaderDialog"))return;var e="
";e+=" 
",e+="
",e+="
",e+="Error: Blanket.js encountered a cross origin request error while instrumenting the source files. ",e+="

This is likely caused by the source files being referenced locally (using the file:// protocol). ",e+="

Some solutions include starting Chrome with special flags, running a server locally, or using a browser without these CORS restrictions (Safari).",e+="
",typeof FileReader!="undefined"&&(e+="
Or, try the experimental loader. When prompted, simply click on the directory containing all the source files you want covered.",e+="Start Loader",e+=""),e+="
Close",e+="
",e+="
";var t=".blanketDialogWrapper {";t+="display:block;",t+="position:fixed;",t+="z-index:40001; }",t+=".blanketDialogOverlay {",t+="position:fixed;",t+="width:100%;",t+="height:100%;",t+="background-color:black;",t+="opacity:.5; ",t+="-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)'; ",t+="filter:alpha(opacity=50); ",t+="z-index:40001; }",t+=".blanketDialogVerticalOffset { ",t+="position:fixed;",t+="top:30%;",t+="width:100%;",t+="z-index:40002; }",t+=".blanketDialogBox { ",t+="width:405px; ",t+="position:relative;",t+="margin:0 auto;",t+="background-color:white;",t+="padding:10px;",t+="border:1px solid black; }";var n=document.createElement("style");n.innerHTML=t,document.head.appendChild(n);var r=document.createElement("div");r.id="blanketLoaderDialog",r.className="blanketDialogWrapper",r.innerHTML=e,document.body.insertBefore(r,document.body.firstChild)},manualFileLoader:function(e){function o(e){var t=new FileReader;t.onload=s,t.readAsText(e)}var t=Array.prototype.slice;e=t.call(e).filter(function(e){return e.type!==""});var n=e.length-1,r=0,i={};sessionStorage.blanketSessionLoader&&(i=JSON.parse(sessionStorage.blanketSessionLoader));var s=function(t){var s=t.currentTarget.result,u=e[r],a=u.webkitRelativePath&&u.webkitRelativePath!==""?u.webkitRelativePath:u.name;i[a]=s,r++,r===n?(sessionStorage.setItem("blanketSessionLoader",JSON.stringify(i)),document.location.reload()):o(e[r])};o(e[r])},_loadFile:function(t){if(typeof t!="undefined"){var n=new XMLHttpRequest;n.open("GET",t,!1),n.send(),e._addScript(n.responseText)}},_addScript:function(e){var t=document.createElement("script");t.type="text/javascript",t.text=e,(document.body||document.getElementsByTagName("head")[0]).appendChild(t)},hasAdapter:function(t){return e.options("adapter")!==null},report:function(t){document.getElementById("blanketLoaderDialog")||(e.blanketSession=null),t.files=window._$blanket;var n=blanket.options("commonJS")?blanket._commonjs.require:window.require;if(!t.files||!Object.keys(t.files).length){e.options("debug")&&console.log("BLANKET-Reporting No files were instrumented.");return}typeof t.files.branchFcn!="undefined"&&delete t.files.branchFcn;if(typeof e.options("reporter")=="string")e._loadFile(e.options("reporter")),e.customReporter(t,e.options("reporter_options"));else if(typeof e.options("reporter")=="function")e.options("reporter")(t,e.options("reporter_options"));else{if(typeof e.defaultReporter!="function")throw new Error("no reporter defined.");e.defaultReporter(t,e.options("reporter_options"))}},_bindStartTestRunner:function(e,t){e?e(t):window.addEventListener("load",t,!1)},_loadSourceFiles:function(t){function r(e){var t=Object.create(Object.getPrototypeOf(e)),n=Object.getOwnPropertyNames(e);return n.forEach(function(n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r)}),t}var n=blanket.options("commonJS")?blanket._commonjs.require:window.require;e.options("debug")&&console.log("BLANKET-Collecting page scripts");var i=e.utils.collectPageScripts();if(i.length===0)t();else{sessionStorage.blanketSessionLoader&&(e.blanketSession=JSON.parse(sessionStorage.blanketSessionLoader)),i.forEach(function(t,n){e.utils.cache[t]={loaded:!1}});var s=-1;e.utils.loadAll(function(e){return e?typeof i[s+1]!="undefined":(s++,s>=i.length?null:i[s])},t)}},beforeStartTestRunner:function(t){t=t||{},t.checkRequirejs=typeof t.checkRequirejs=="undefined"?!0:t.checkRequirejs,t.callback=t.callback||function(){},t.coverage=typeof t.coverage=="undefined"?!0:t.coverage,t.coverage?e._bindStartTestRunner(t.bindEvent,function(){e._loadSourceFiles(function(){var n=function(){return t.condition?t.condition():e.requireFilesLoaded()},r=function(){if(n()){e.options("debug")&&console.log("BLANKET-All files loaded, init start test runner callback.");var i=e.options("testReadyCallback");i?typeof i=="function"?i(t.callback):typeof i=="string"&&(e._addScript(i),t.callback()):t.callback()}else setTimeout(r,13)};r()})}):t.callback()},utils:{qualifyURL:function(e){var t=document.createElement("a");return t.href=e,t.href}}})}(blanket),blanket.defaultReporter=function(e){function l(e){var t=document.getElementById(e);t.style.display==="block"?t.style.display="none":t.style.display="block"}function d(e){return e.replace(/\&/g,"&").replace(//g,">").replace(/\"/g,""").replace(/\'/g,"'")}function v(e,t){var n=t?0:1;return typeof e=="undefined"||typeof e===null||typeof e[n]=="undefined"?!1:e[n].length>0}function g(e,t,n,r,i){var s="",o="";if(m.length>0){s+="";if(m[0][0].end.line===i){s+=d(t.slice(0,m[0][0].end.column))+"",t=t.slice(m[0][0].end.column),m.shift();if(m.length>0){s+="";if(m[0][0].end.line===i){s+=d(t.slice(0,m[0][0].end.column))+"",t=t.slice(m[0][0].end.column),m.shift();if(!n)return{src:s+d(t),cols:n}}else{if(!n)return{src:s+d(t)+"",cols:n};o=""}}else if(!n)return{src:s+d(t),cols:n}}else{if(!n)return{src:s+d(t)+"",cols:n};o=""}}var u=n[e],a=u.consequent;if(a.start.line>i)m.unshift([u.alternate,u]),m.unshift([a,u]),t=d(t);else{var f="";s+=d(t.slice(0,a.start.column-r))+f;if(n.length>e+1&&n[e+1].consequent.start.line===i&&n[e+1].consequent.start.column-r";var c=u.alternate;if(c.start.line>i)s+=d(t.slice(a.end.column-r)),m.unshift([c,u]);else{s+=d(t.slice(a.end.column-r,c.start.column-r)),f="",s+=f;if(n.length>e+1&&n[e+1].consequent.start.line===i&&n[e+1].consequent.start.column-r",s+=d(t.slice(c.end.column-r)),t=s}}return{src:t+o,cols:n}}var t="#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}",n=60,r=document.head,i=0,s=document.body,o,u=Object.keys(e.files).some(function(t){return typeof e.files[t].branchData!="undefined"}),a="
results
Coverage (%)
Covered/Total Smts.
"+(u?"
Covered/Total Branches
":"")+"
",f="
{{fileNumber}}.{{file}}
{{percentage}} %
{{numberCovered}}/{{totalSmts}}
"+(u?"
{{passedBranches}}/{{totalBranches}}
":"")+"
";grandTotalTemplate="
{{rowTitle}}
{{percentage}} %
{{numberCovered}}/{{totalSmts}}
"+(u?"
{{passedBranches}}/{{totalBranches}}
":"")+"
";var c=document.createElement("script");c.type="text/javascript",c.text=l.toString().replace("function "+l.name,"function blanket_toggleSource"),s.appendChild(c);var h=function(e,t){return Math.round(e/t*100*100)/100},p=function(e,t,n){var r=document.createElement(e);r.innerHTML=n,t.appendChild(r)},m=[],y=function(e){return typeof e!="undefined"},b=e.files,w={totalSmts:0,numberOfFilesCovered:0,passedBranches:0,totalBranches:0,moduleTotalStatements:{},moduleTotalCoveredStatements:{},moduleTotalBranches:{},moduleTotalCoveredBranches:{}},E=_blanket.options("modulePattern"),S=E?new RegExp(E):null;for(var x in b){i++;var T=b[x],N=0,C=0,k=[],L,A=[];for(L=0;L0||typeof T.branchData!="undefined")if(typeof T.branchData[L+1]!="undefined"){var M=T.branchData[L+1].filter(y),_=0;O=g(_,O,M,0,L+1).src}else m.length?O=g(0,O,null,0,L+1).src:O=d(O);else O=d(O);var D="";T[L+1]?(C+=1,N+=1,D="hit"):T[L+1]===0&&(N++,D="miss"),k[L+1]="
"+(L+1)+""+O+"
"}w.totalSmts+=N,w.numberOfFilesCovered+=C;var P=0,H=0;if(typeof T.branchData!="undefined")for(var B=0;B0&&typeof T.branchData[B][j][1]!="undefined"&&T.branchData[B][j][1].length>0&&H++);w.passedBranches+=H,w.totalBranches+=P;if(S){var F=x.match(S)[1];w.moduleTotalStatements.hasOwnProperty(F)||(w.moduleTotalStatements[F]=0,w.moduleTotalCoveredStatements[F]=0),w.moduleTotalStatements[F]+=N,w.moduleTotalCoveredStatements[F]+=C,w.moduleTotalBranches.hasOwnProperty(F)||(w.moduleTotalBranches[F]=0,w.moduleTotalCoveredBranches[F]=0),w.moduleTotalBranches[F]+=P,w.moduleTotalCoveredBranches[F]+=H}var I=h(C,N),q=f.replace("{{file}}",x).replace("{{percentage}}",I).replace("{{numberCovered}}",C).replace(/\{\{fileNumber\}\}/g,i).replace("{{totalSmts}}",N).replace("{{totalBranches}}",P).replace("{{passedBranches}}",H).replace("{{source}}",k.join(" "));I",p("style",r,t),document.getElementById("blanket-main")?document.getElementById("blanket-main").innerHTML=a.slice(23,-6):p("div",s,a)},function(){var e={},t=Array.prototype.slice,n=t.call(document.scripts);t.call(n[n.length-1].attributes).forEach(function(t){t.nodeName==="data-cover-only"&&(e.filter=t.nodeValue),t.nodeName==="data-cover-never"&&(e.antifilter=t.nodeValue),t.nodeName==="data-cover-reporter"&&(e.reporter=t.nodeValue),t.nodeName==="data-cover-adapter"&&(e.adapter=t.nodeValue),t.nodeName==="data-cover-loader"&&(e.loader=t.nodeValue),t.nodeName==="data-cover-timeout"&&(e.timeout=t.nodeValue),t.nodeName==="data-cover-modulepattern"&&(e.modulePattern=t.nodeValue);if(t.nodeName==="data-cover-reporter-options")try{e.reporter_options=JSON.parse(t.nodeValue)}catch(n){if(blanket.options("debug"))throw new Error("Invalid reporter options. Must be a valid stringified JSON object.")}t.nodeName==="data-cover-testReadyCallback"&&(e.testReadyCallback=t.nodeValue),t.nodeName==="data-cover-customVariable"&&(e.customVariable=t.nodeValue);if(t.nodeName==="data-cover-flags"){var r=" "+t.nodeValue+" ";r.indexOf(" ignoreError ")>-1&&(e.ignoreScriptError=!0),r.indexOf(" autoStart ")>-1&&(e.autoStart=!0),r.indexOf(" ignoreCors ")>-1&&(e.ignoreCors=!0),r.indexOf(" branchTracking ")>-1&&(e.branchTracking=!0),r.indexOf(" sourceURL ")>-1&&(e.sourceURL=!0),r.indexOf(" debug ")>-1&&(e.debug=!0),r.indexOf(" engineOnly ")>-1&&(e.engineOnly=!0),r.indexOf(" commonJS ")>-1&&(e.commonJS=!0),r.indexOf(" instrumentCache ")>-1&&(e.instrumentCache=!0)}}),blanket.options(e),typeof requirejs!="undefined"&&blanket.options("existingRequireJS",!0),blanket.options("commonJS")&&(blanket._commonjs={})}(),function(e){e.extend({utils:{normalizeBackslashes:function(e){return e.replace(/\\/g,"/")},matchPatternAttribute:function(t,n){if(typeof n=="string"){if(n.indexOf("[")===0){var r=n.slice(1,n.length-1).split(",");return r.some(function(n){return e.utils.matchPatternAttribute(t,e.utils.normalizeBackslashes(n.slice(1,-1)))})}if(n.indexOf("//")===0){var i=n.slice(2,n.lastIndexOf("/")),s=n.slice(n.lastIndexOf("/")+1),o=new RegExp(i,s);return o.test(t)}return n.indexOf("#")===0?window[n.slice(1)].call(window,t):t.indexOf(e.utils.normalizeBackslashes(n))>-1}if(n instanceof Array)return n.some(function(n){return e.utils.matchPatternAttribute(t,n)});if(n instanceof RegExp)return n.test(t);if(typeof n=="function")return n.call(window,t)},blanketEval:function(t){e._addScript(t)},collectPageScripts:function(){var t=Array.prototype.slice,n=t.call(document.scripts),r=[],i=[],s=e.options("filter");if(s!=null){var o=e.options("antifilter");r=t.call(document.scripts).filter(function(n){return t.call(n.attributes).filter(function(t){return t.nodeName==="src"&&e.utils.matchPatternAttribute(t.nodeValue,s)&&(typeof o=="undefined"||!e.utils.matchPatternAttribute(t.nodeValue,o))}).length===1})}else r=t.call(document.querySelectorAll("script[data-cover]"));return i=r.map(function(n){return e.utils.qualifyURL(t.call(n.attributes).filter(function(e){return e.nodeName==="src"})[0].nodeValue)}),s||e.options("filter","['"+i.join("','")+"']"),i},loadAll:function(t,n,r){var i=t(),s=e.utils.scriptIsLoaded(i,e.utils.ifOrdered,t,n);if(!e.utils.cache[i]||!e.utils.cache[i].loaded){var o=function(){e.options("debug")&&console.log("BLANKET-Mark script:"+i+", as loaded and move to next script."),s()},u=function(t){e.options("debug")&&console.log("BLANKET-File loading finished"),typeof t!="undefined"&&(e.options("debug")&&console.log("BLANKET-Add file to DOM."),e._addScript(t)),o()};e.utils.attachScript({url:i},function(t){e.utils.processFile(t,i,u,u)})}else s()},attachScript:function(t,n){var r=e.options("timeout")||3e3;setTimeout(function(){if(!e.utils.cache[t.url].loaded)throw new Error("error loading source script")},r),e.utils.getFile(t.url,n,function(){throw new Error("error loading source script")})},ifOrdered:function(t,n){var r=t(!0);r?e.utils.loadAll(t,n):n(new Error("Error in loading chain."))},scriptIsLoaded:function(t,n,r,i){return e.options("debug")&&console.log("BLANKET-Returning function"),function(){e.options("debug")&&console.log("BLANKET-Marking file as loaded: "+t),e.utils.cache[t].loaded=!0,e.utils.allLoaded()?(e.options("debug")&&console.log("BLANKET-All files loaded"),i()):n&&(e.options("debug")&&console.log("BLANKET-Load next file."),n(r,i))}},cache:{},allLoaded:function(){var t=Object.keys(e.utils.cache);for(var n=0;n-1){n(e.blanketSession[a]),s=!0;return}}}if(!s){var f=e.utils.createXhr();f.open("GET",t,!0),i&&i(f,t),f.onreadystatechange=function(e){var i,s;f.readyState===4&&(i=f.status,i>399&&i<600?(s=new Error(t+" HTTP status: "+i),s.xhr=f,r(s)):n(f.responseText))};try{f.send(null)}catch(l){if(!l.code||l.code!==101&&l.code!==1012||e.options("ignoreCors")!==!1)throw l;e.showManualLoader()}}}}}),function(){var t=blanket.options("commonJS")?blanket._commonjs.require:window.require,n=blanket.options("commonJS")?blanket._commonjs.requirejs:window.requirejs;!e.options("engineOnly")&&e.options("existingRequireJS")&&(e.utils.oldloader=n.load,n.load=function(t,n,r){e.requiringFile(r),e.utils.getFile(r,function(i){e.utils.processFile(i,r,function(){t.completeLoad(n)},function(){e.utils.oldloader(t,n,r)})},function(t){throw e.requiringFile(),t})}),e.utils.cacheXhrConstructor()}()}(blanket),function(){if(typeof QUnit!="undefined"){var e=function(){return window.QUnit.config.queue.length>0&&blanket.noConflict().requireFilesLoaded()};QUnit.config.urlConfig[0].tooltip?(QUnit.config.urlConfig.push({id:"coverage",label:"Enable coverage",tooltip:"Enable code coverage."}),QUnit.urlParams.coverage||blanket.options("autoStart")?(QUnit.begin(function(){blanket.noConflict().setupCoverage()}),QUnit.done(function(e,t){blanket.noConflict().onTestsDone()}),QUnit.moduleStart(function(e){blanket.noConflict().onModuleStart()}),QUnit.testStart(function(e){blanket.noConflict().onTestStart()}),QUnit.testDone(function(e){blanket.noConflict().onTestDone(e.total,e.passed)}),blanket.noConflict().beforeStartTestRunner({condition:e,callback:function(){(!blanket.options("existingRequireJS")||!!blanket.options("autoStart"))&&QUnit.start()}})):(blanket.options("existingRequireJS")&&(requirejs.load=_blanket.utils.oldloader),blanket.noConflict().beforeStartTestRunner({condition:e,callback:function(){(!blanket.options("existingRequireJS")||!!blanket.options("autoStart"))&&QUnit.start()},coverage:!1}))):(QUnit.begin=function(){blanket.noConflict().setupCoverage()},QUnit.done=function(e,t){blanket.noConflict().onTestsDone()},QUnit.moduleStart=function(e){blanket.noConflict().onModuleStart()},QUnit.testStart=function(e){blanket.noConflict().onTestStart()},QUnit.testDone=function(e){blanket.noConflict().onTestDone(e.total,e.passed)},blanket.beforeStartTestRunner({condition:e,callback:QUnit.start}))}}(); \ No newline at end of file diff --git a/testing/js/selenium-blanket.js b/testing/js/selenium-blanket.js deleted file mode 100644 index effa574cf7..0000000000 --- a/testing/js/selenium-blanket.js +++ /dev/null @@ -1,40 +0,0 @@ -/*global blanket, $, window*/ -(function () { - - var blanket = window.blanket; - window.stopTest = function (totalTested, totalPassed, done) { - totalTested = totalTested === undefined ? 1 : totalTested; - totalPassed = totalPassed === undefined ? 1 : totalPassed; - if (blanket) { - blanket.onTestDone(totalTested, totalPassed); - blanket.onTestsDone(); - } - if (done) { - done(); - } - }; - - function run () { - if (window.startTest) { - window.startTest(function () { - window.testComplete = true; - }); - } - } - - window.testComplete = false; - if (blanket) { - $(function () { - // on window load setup coverage and run test - blanket.setupCoverage(); - blanket.onTestStart(); - }); - - blanket.beforeStartTestRunner({ - callback: run - }); - } else { - $(run); - } - -}()); diff --git a/testing/js/testUtils.js b/testing/js/testUtils.js deleted file mode 100644 index c0b5fabd13..0000000000 --- a/testing/js/testUtils.js +++ /dev/null @@ -1,372 +0,0 @@ -/* These are functions we want available to jasmine tests. */ -/* global it */ -/* exported waitForIt, mockVGLRenderer, closeToArray, closeToEqual, logCanvas2D, submitNote, mockAnimationFrame, mockDate */ - -/** - * Create a pair of it functions. The first one waits for a function to return - * a truthy value, and the second one runs after the first has assured its - * completion. This needs to be run within a describe block and not within - * another it function. - * - * @param {string} desc a description of the task. - * @param {function} testFunc a function that returns true when the - * specification is complete. - */ -function waitForIt(desc, testFunc) { - 'use strict'; - it('wait for ' + desc, function (done) { - var interval; - interval = setInterval(function () { - if (testFunc()) { - clearInterval(interval); - done(); - } - }, 1); - }); - it('done waiting for ' + desc, function () { - }); -} - -/** - * Compare two arrays with a precision tolerance. - * @param {array} a1 first array to compare - * @param {array} a2 second array to compare - * @param {number} precision precision used in jasmine's toBeCloseTo function - * @return {boolean} true if the arrays are close. - */ -function closeToArray(a1, a2, precision) { - 'use strict'; - var i; - if (a1.length !== a2.length) { - return false; - } - precision = (precision !== 0) ? (precision || 2) : precision; - precision = Math.pow(10, -precision) / 2; - for (i = 0; i < a1.length; i += 1) { - if (Math.abs(a1[i] - a2[i]) >= precision) { - return false; - } - } - return true; -} - -/** - * Compare two objects containing numbers with a precision tolerance. - * @param {array} a1 first object to compare - * @param {array} a2 second object to compare - * @param {number} precision precision used in jasmine's toBeCloseTo function - * @return {boolean} true if the objects are close. - */ -function closeToEqual(o1, o2, precision) { - 'use strict'; - var key; - - precision = (precision !== 0) ? (precision || 2) : precision; - precision = Math.pow(10, -precision) / 2; - for (key in o1) { - if (o1.hasOwnProperty(key)) { - if (o2[key] === undefined || - Math.abs(o1[key] - o2[key]) >= precision) { - console.log('not closeToEqual: ' + key + ' ' + o1[key] + ' !~= ' + - o2[key]); - return false; - } - } - } - for (key in o2) { - if (o2.hasOwnProperty(key) && o1[key] === undefined) { - return false; - } - } - return true; -} - -/** - * Replace vgl.renderer with a mocked version for phantom tests. - */ -function mockVGLRenderer() { - 'use strict'; - - if (vgl._mocked) { - return; - } - - var mockCounts = {}; - var count = function (name) { - mockCounts[name] = (mockCounts[name] || 0) + 1; - }; - var noop = function (name) { - return function () { - count(name); - }; - }; - var _id = 0, - incID = function (name) { - return function () { - count(name); - _id += 1; - return _id; - }; - }; - /* The context largely does nothing. */ - var m_context = { - activeTexture: noop('activeTexture'), - attachShader: noop('attachShader'), - bindAttribLocation: noop('bindAttribLocation'), - bindBuffer: noop('bindBuffer'), - bindFramebuffer: noop('bindFramebuffer'), - bindTexture: noop('bindTexture'), - blendFuncSeparate: noop('blendFuncSeparate'), - bufferData: noop('bufferData'), - bufferSubData: noop('bufferSubData'), - checkFramebufferStatus: function (key) { - count('checkFramebufferStatus'); - if (key === vgl.GL.FRAMEBUFFER) { - return vgl.GL.FRAMEBUFFER_COMPLETE; - } - }, - clear: noop('clear'), - clearColor: noop('clearColor'), - clearDepth: noop('clearDepth'), - compileShader: noop('compileShader'), - createBuffer: incID('createBuffer'), - createFramebuffer: noop('createFramebuffer'), - createProgram: incID('createProgram'), - createShader: incID('createShader'), - createTexture: incID('createTexture'), - deleteBuffer: noop('deleteBuffer'), - deleteProgram: noop('deleteProgram'), - deleteShader: noop('deleteShader'), - deleteTexture: noop('deleteTexture'), - depthFunc: noop('depthFunc'), - disable: noop('disable'), - disableVertexAttribArray: noop('disableVertexAttribArray'), - drawArrays: noop('drawArrays'), - enable: noop('enable'), - enableVertexAttribArray: noop('enableVertexAttribArray'), - finish: noop('finish'), - getExtension: incID('getExtension'), - getParameter: function (key) { - count('getParameter'); - if (key === vgl.GL.DEPTH_BITS) { - return 16; - } - }, - getProgramParameter: function (id, key) { - count('getProgramParameter'); - if (key === vgl.GL.LINK_STATUS) { - return true; - } - }, - getShaderInfoLog: function () { - count('getShaderInfoLog'); - return 'log'; - }, - getShaderParameter: function (id, key) { - count('getShaderParameter'); - if (key === vgl.GL.COMPILE_STATUS) { - return true; - } - }, - getUniformLocation: incID('getUniformLocation'), - isEnabled: function (key) { - count('isEnabled'); - if (key === vgl.GL.BLEND) { - return true; - } - }, - linkProgram: noop('linkProgram'), - pixelStorei: noop('pixelStorei'), - shaderSource: noop('shaderSource'), - texImage2D: noop('texImage2D'), - texParameteri: noop('texParameteri'), - uniform1iv: noop('uniform1iv'), - uniform1fv: noop('uniform1fv'), - uniform2fv: noop('uniform2fv'), - uniform3fv: noop('uniform3fv'), - uniform4fv: noop('uniform4fv'), - uniformMatrix3fv: noop('uniformMatrix3fv'), - uniformMatrix4fv: noop('uniformMatrix4fv'), - useProgram: noop('useProgram'), - vertexAttribPointer: noop('vertexAttribPointer'), - vertexAttrib3fv: noop('vertexAttrib3fv'), - viewport: noop('viewport') - }; - - /* Our mock has only a single renderWindow */ - var m_renderWindow = vgl.renderWindow(); - m_renderWindow._setup = function () { - return true; - }; - m_renderWindow.context = function () { - return m_context; - }; - vgl.renderWindow = function () { - return m_renderWindow; - }; - geo.gl.vglRenderer.supported = function () { - return true; - }; - - vgl._mocked = true; - vgl.mockCounts = function () { - return mockCounts; - }; -} - -/** - * Add counters for various canvas calls so we can tell if they have been used. - */ -function logCanvas2D(enable) { - 'use strict'; - - if (window._canvasLog) { - window._canvasLog.enable = enable; - return; - } - - var log = {enable: enable, counts: {}, log: []}; - - var proto = CanvasRenderingContext2D.prototype; - $.each(proto, function (key) { - var orig = proto[key]; - if (orig && orig.constructor && orig.call && orig.apply) { - proto[key] = function () { - log.counts[key] = (log.counts[key] || 0) + 1; - if (log.enable) { - log.log.push({func: key, arg: arguments}); - } - return orig.apply(this, arguments); - }; - } - }); - - window._canvasLog = log; -} - -/** - * Send data to be reported as part of the a build note. - * - * @param key: the key that this will be reported under. This should be the - * name of the test. - * @param note: the data to send. This will be converted to JSON. - */ -function submitNote(key, note) { - $.ajax({ - url: '/notes?key=' + encodeURIComponent(key), - data: JSON.stringify(note), - method: 'PUT', - contentType: 'application/json' - }); -} - -/** - * Allow stepping through animation frames. Call unmockAnimationFrame to - * retore the original animation frame behavior. - */ -function mockAnimationFrame(mockDate) { - - if (window.unmockAnimationFrame) { - return; - } - - var origRequestAnimationFrame = window.requestAnimationFrame, - origCancelAnimationFrame = window.cancelAnimationFrame, - animFrameCallbacks = [], animFrameIndex = 0; - - /* Stop mocking. */ - window.unmockAnimationFrame = function () { - window.requestAnimationFrame = origRequestAnimationFrame; - window.cancelAnimationFrame = origCancelAnimationFrame; - window.unmockAnimationFrame = undefined; - window.stepAnimationFrame = undefined; - }; - - /* Replace window.requestAnimationFrame with this function, then call - * stepAnimationFrame with a delta from when this was supposed to start to - * test asynchronous animations. - * - * @param {function} callback the function to call on an animation frame - * interval. - */ - function mockedRequestAnimationFrame(callback) { - animFrameIndex += 1; - var id = animFrameIndex; - animFrameCallbacks.push({id: id, callback: callback}); - } - - /* Replace window.cancelAnimationFrame with this function. - * - * @param {number} id id of the callback to cancel. - */ - function mockedCancelAnimationFrame(id) { - for (var i = 0; i < animFrameCallbacks.length; i += 1) { - if (animFrameCallbacks[i].id === id) { - animFrameCallbacks.splice(i, 1); - return; - } - } - } - - /* Call all animation frame functions that have been captured. - * - * @param {float} time float milliseconds. - */ - window.stepAnimationFrame = function (time) { - var callbacks = animFrameCallbacks, action; - animFrameCallbacks = []; - while (callbacks.length > 0) { - action = callbacks.shift(); - action.callback.call(window, time); - } - }; - - window.requestAnimationFrame = mockedRequestAnimationFrame; - window.cancelAnimationFrame = mockedCancelAnimationFrame; -} - -/** - * Allow mocking calls to Date so that each new object is slightly after the - * previous one. Use a delta of 0 and calls to advanceDate() for complete - * controls. - * - * @param {number} delta number of milliseconds added to each call. - */ -function mockDate(delta) { - if (window.unmockDate) { - return; - } - - var origDate = window.Date, mockDelta = delta === undefined ? 15 : delta, - startDate = (new Date()).getTime(); - - /* Stop mocking. */ - window.unmockDate = function () { - window.Date = origDate; - window.unmockDate = undefined; - window.advanceDate = undefined; - }; - - /** - * Change the date that will be reported by new Date(). - * - * @param {number} delta milliseconds to advance the date. - */ - window.advanceDate = function (delta) { - startDate += delta; - }; - - /** - * Override window.Date so that every fetch increments the date by a few - * milliseconds. - */ - geo.mockedDate = function (args) { - if (!(this instanceof geo.mockedDate)) { - return new geo.mockedDate(args); - } - startDate += mockDelta; - return new origDate(startDate); - }; - - window.Date = geo.mockedDate; -} diff --git a/testing/test-cases/.eslintrc b/testing/test-cases/.eslintrc deleted file mode 100644 index 28fc656c45..0000000000 --- a/testing/test-cases/.eslintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../.eslintrc", -} diff --git a/testing/test-cases/selenium-tests/d3GeoJson/include.css b/testing/test-cases/selenium-tests/d3GeoJson/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/d3GeoJson/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/d3GeoJson/include.html b/testing/test-cases/selenium-tests/d3GeoJson/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/d3GeoJson/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/d3GeoJson/include.js b/testing/test-cases/selenium-tests/d3GeoJson/include.js deleted file mode 100644 index fb080b9ebf..0000000000 --- a/testing/test-cases/selenium-tests/d3GeoJson/include.js +++ /dev/null @@ -1,159 +0,0 @@ -window.startTest = function (done) { - "use strict"; - - var myMap = window.geoTests.createOsmMap({ - center: { y: 40, x: -105 }, - zoom: 3.5 - }); - - // Load image to be used for drawing dots - var layer = myMap.createLayer("feature", {"renderer" : "d3"}); - - var obj = { - "features": [ - { - "geometry": { - "type": "LineString", - "coordinates": [ - [ - -101.744384765625, - 39.32155002466662 - ], - [ - -101.5521240234375, - 39.330048552942415 - ], - [ - -101.40380859375, - 39.330048552942415 - ], - [ - -101.33239746093749, - 39.364032338047984 - ], - [ - -101.041259765625, - 39.36827914916011 - ], - [ - -100.975341796875, - 39.30454987014581 - ], - [ - -100.9149169921875, - 39.24501680713314 - ], - [ - -100.843505859375, - 39.16414104768742 - ], - [ - -100.8050537109375, - 39.104488809440475 - ], - [ - -100.491943359375, - 39.10022600175347 - ], - [ - -100.43701171875, - 39.095962936305476 - ], - [ - -100.338134765625, - 39.095962936305476 - ], - [ - -100.1953125, - 39.027718840211605 - ], - [ - -100.008544921875, - 39.01064750994083 - ], - [ - -99.86572265625, - 39.00211029922512 - ], - [ - -99.6844482421875, - 38.97222194853654 - ], - [ - -99.51416015625, - 38.929502416386605 - ], - [ - -99.38232421875, - 38.92095542046727 - ], - [ - -99.3218994140625, - 38.89530825492018 - ], - [ - -99.1131591796875, - 38.86965182408357 - ], - [ - -99.0802001953125, - 38.85682013474361 - ], - [ - -98.82202148437499, - 38.85682013474361 - ], - [ - -98.44848632812499, - 38.84826438869913 - ], - [ - -98.20678710937499, - 38.84826438869913 - ], - [ - -98.02001953125, - 38.8782049970615 - ], - [ - -97.635498046875, - 38.87392853923629 - ] - ] - }, - "properties": { - "strokeColor": {"r": 0, "g": 1, "b": 0}, - "strokeWidth": 3, - "fill": false - }, - "type": "Feature" - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -80.83775386582222, - 35.24980190252168 - ] - }, - "properties": { - "name": "DOUBLE OAKS CENTER", - "address": "1326 WOODWARD AV", - "radius": 10, - "fillColor": "red", - "stroke": false - } - } - ], - "type": "FeatureCollection" - }; - - var reader = geo.createFileReader("jsonReader", {"layer": layer}); - reader.read(obj, function () { - myMap.draw(); - myMap.onIdle(done); - }); - - -}; diff --git a/testing/test-cases/selenium-tests/d3GeoJson/testd3GeoJson.py b/testing/test-cases/selenium-tests/d3GeoJson/testd3GeoJson.py deleted file mode 100644 index cd2bea1c1c..0000000000 --- a/testing/test-cases/selenium-tests/d3GeoJson/testd3GeoJson.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class d3GeoJsonBase(object): - testCase = ('d3GeoJson',) - testRevision = 6 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('d3GeoJson/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testd3DrawGeoJson(self): - self.loadPage() - - testName = 'd3DrawGeoJson' - self.screenshotTest(testName) - - -class FirefoxOSM(d3GeoJsonBase, FirefoxTest): - testCase = d3GeoJsonBase.testCase + ('firefox',) - - -class ChromeOSM(d3GeoJsonBase, ChromeTest): - testCase = d3GeoJsonBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/d3Graph/include.css b/testing/test-cases/selenium-tests/d3Graph/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/d3Graph/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/d3Graph/include.html b/testing/test-cases/selenium-tests/d3Graph/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/d3Graph/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/d3Graph/include.js b/testing/test-cases/selenium-tests/d3Graph/include.js deleted file mode 100644 index 82d49bbe2f..0000000000 --- a/testing/test-cases/selenium-tests/d3Graph/include.js +++ /dev/null @@ -1,41 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - $('#map').width('100%'); - $('#map').height('100%'); - - var mapOptions = { zoom: 3.5, center : { y: 40, x: -105 }}; - - var myMap = window.geoTests.createOsmMap(mapOptions); - - - function draw(citieslatlon) { - citieslatlon.forEach(function (c, i) { - c.children = [ - citieslatlon[(i + 1) % citieslatlon.length], - citieslatlon[(i + 2) % citieslatlon.length] - ]; - c.x = c.lon; - c.y = c.lat; - } - ); - - // Load image to be used for drawing dots - var layer = myMap.createLayer('feature', {'renderer' : 'd3'}), - style = { - nodes: { - stroke: false, - fillOpacity: 0.5 - }, - linkType: 'path' - }; - layer.createFeature('graph') - .data(citieslatlon) - .style(style); - myMap.draw(); - - myMap.onIdle(done); - } - - window.geoTests.loadCitiesData(draw, 10); -}; diff --git a/testing/test-cases/selenium-tests/d3Graph/testd3Graph.py b/testing/test-cases/selenium-tests/d3Graph/testd3Graph.py deleted file mode 100644 index 50885f2674..0000000000 --- a/testing/test-cases/selenium-tests/d3Graph/testd3Graph.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class d3GraphBase(object): - testCase = ('d3Graph',) - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('d3Graph/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testd3DrawGraph(self): - self.loadPage() - - testName = 'd3DrawGraph' - self.screenshotTest(testName) - - -class FirefoxOSM(d3GraphBase, FirefoxTest): - testCase = d3GraphBase.testCase + ('firefox',) - testRevision = 9 - - -class ChromeOSM(d3GraphBase, ChromeTest): - testCase = d3GraphBase.testCase + ('chrome',) - testRevision = 10 - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/d3Points/include.css b/testing/test-cases/selenium-tests/d3Points/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/d3Points/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/d3Points/include.html b/testing/test-cases/selenium-tests/d3Points/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/d3Points/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/d3Points/include.js b/testing/test-cases/selenium-tests/d3Points/include.js deleted file mode 100644 index d28ab9ed29..0000000000 --- a/testing/test-cases/selenium-tests/d3Points/include.js +++ /dev/null @@ -1,37 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40, x: -105 } }; - - var myMap = window.geoTests.createOsmMap(mapOptions); - - function draw(citieslatlon) { - var layer = myMap.createLayer('feature', {'renderer' : 'd3'}); - - layer.createFeature('point') - .data(citieslatlon) - .style('radius', 10.0) - .style('strokeColor', { r: 0.0, g: 1.0, b: 0.0 }) - .style('strokeWidth', 2) - .style('fillColor', function (d) { - if (d.lon < -100) { - return {r: 1.0, g: 0.0, b: 0.0}; - } - return {r: 0.0, g: 0.0, b: 1.0}; - }) - .style('fillOpacity', function (d) { - if (d.lon < -100) { - return 0.5; - } else { - return 0.25; - } - }) - .position(function (d) { return { x: d.lon, y: d.lat }; }); - - myMap.draw(); - - myMap.onIdle(done); - } - - window.geoTests.loadCitiesData(draw, 30); -}; diff --git a/testing/test-cases/selenium-tests/d3Points/testd3Points.py b/testing/test-cases/selenium-tests/d3Points/testd3Points.py deleted file mode 100644 index 5d91f7eb75..0000000000 --- a/testing/test-cases/selenium-tests/d3Points/testd3Points.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class d3PointsBase(object): - testCase = ('d3Points',) - testRevision = 9 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('d3Points/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testd3DrawPoints(self): - self.loadPage() - - testName = 'd3DrawPoints' - self.screenshotTest(testName) - - -class FirefoxOSM(d3PointsBase, FirefoxTest): - testCase = d3PointsBase.testCase + ('firefox',) - - -class ChromeOSM(d3PointsBase, ChromeTest): - testCase = d3PointsBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/d3StickyLayer/include.css b/testing/test-cases/selenium-tests/d3StickyLayer/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/d3StickyLayer/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/d3StickyLayer/include.html b/testing/test-cases/selenium-tests/d3StickyLayer/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/d3StickyLayer/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/d3StickyLayer/include.js b/testing/test-cases/selenium-tests/d3StickyLayer/include.js deleted file mode 100644 index b6ffe5c9b6..0000000000 --- a/testing/test-cases/selenium-tests/d3StickyLayer/include.js +++ /dev/null @@ -1,41 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40.0, x: -105.0 } }; - var myMap = window.geoTests.createOsmMap(mapOptions, {}, true); - var width = myMap.node().width(), height = myMap.node().height(); - - // create two layers - var fixedLayer = myMap.createLayer('feature', {'renderer' : 'd3', 'sticky': false}), - movingLayer = myMap.createLayer('feature', {'renderer': 'd3', 'sticky': true}), - fixedSvg = fixedLayer.canvas(), - movingSvg = movingLayer.canvas(); - - - // add three circles for different navigation behaviors - fixedSvg.append('circle') - .attr('cx', width / 4) - .attr('cy', height / 2) - .attr('r', 10) - .style('fill', 'red'); - - movingSvg.append('circle') - .attr('cx', width / 2) - .attr('cy', height / 2) - .attr('r', 10) - .style('fill', 'black'); - - var scaledCircle = movingSvg.append('circle') - .attr('cx', 3 * width / 4) - .attr('cy', height / 2) - .attr('r', 10) - .style('fill', 'blue'); - - movingLayer.geoOn(geo.event.d3Rescale, function (arg) { - scaledCircle.attr('r', 10 / arg.scale); - }); - - myMap.draw(); - - myMap.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/d3StickyLayer/testd3StickyLayer.py b/testing/test-cases/selenium-tests/d3StickyLayer/testd3StickyLayer.py deleted file mode 100644 index 9c39d078ef..0000000000 --- a/testing/test-cases/selenium-tests/d3StickyLayer/testd3StickyLayer.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class d3StickyBase(object): - testCase = ('d3StickyLayer',) - - def waitForIdle(self, timeout=5): - self.runScript( - 'window._wait = false; window.gjsmap.onIdle(function () {window._wait = true;});' - ) - self.wait(variable='window._wait', timeout=timeout) - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('d3StickyLayer/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testDrag(self): - testName = 'dragPoints' - self.loadPage() - - self.drag('#map', (100, 100)) - self.waitForIdle() - self.screenshotTest(testName) - - -class FirefoxOSM(d3StickyBase, FirefoxTest): - testCase = d3StickyBase.testCase + ('firefox',) - testRevision = 8 - - -class ChromeOSM(d3StickyBase, ChromeTest): - testCase = d3StickyBase.testCase + ('chrome',) - testRevision = 9 - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/d3Vectors/include.css b/testing/test-cases/selenium-tests/d3Vectors/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/d3Vectors/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/d3Vectors/include.html b/testing/test-cases/selenium-tests/d3Vectors/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/d3Vectors/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/d3Vectors/include.js b/testing/test-cases/selenium-tests/d3Vectors/include.js deleted file mode 100644 index b9e47a4c93..0000000000 --- a/testing/test-cases/selenium-tests/d3Vectors/include.js +++ /dev/null @@ -1,38 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { zoom: 3.5, center : { y: 40, x: -105 } }; - - var myMap = window.geoTests.createOsmMap(mapOptions); - - function draw(citieslatlon) { - var layer = myMap.createLayer('feature', {'renderer' : 'd3'}); - var color = d3.scale.category20().domain(d3.range(20)); - - var vectors = layer.createFeature('vector') - .data(citieslatlon) - .origin(function (d) { return { x: d.lon, y: d.lat }; }) - .style('strokeColor', function (d, i) { - return color(i % 20); - }) - .style('strokeWidth', 2.5); - - function setDelta() { - var center = myMap.center(); - vectors.delta(function (d) { - return { - x: center.x - d.lon, - y: center.y - d.lat - }; - }).draw(); - } - - setDelta(); - myMap.draw(); - - myMap.onIdle(done); - layer.geoOn(geo.event.pan, setDelta); - } - - window.geoTests.loadCitiesData(draw, 30); -}; diff --git a/testing/test-cases/selenium-tests/d3Vectors/testd3Vectors.py b/testing/test-cases/selenium-tests/d3Vectors/testd3Vectors.py deleted file mode 100644 index 8cfeb12a25..0000000000 --- a/testing/test-cases/selenium-tests/d3Vectors/testd3Vectors.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class d3VectorsBase(object): - testCase = ('d3Vectors',) - testRevision = 3 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('d3Vectors/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testd3DrawVectors(self): - self.loadPage() - - testName = 'd3DrawVectors' - self.screenshotTest(testName) - - -class FirefoxOSM(d3VectorsBase, FirefoxTest): - testCase = d3VectorsBase.testCase + ('firefox',) - - -class ChromeOSM(d3VectorsBase, ChromeTest): - testCase = d3VectorsBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/featureVisible/include.css b/testing/test-cases/selenium-tests/featureVisible/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/featureVisible/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/featureVisible/include.html b/testing/test-cases/selenium-tests/featureVisible/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/featureVisible/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/featureVisible/include.js b/testing/test-cases/selenium-tests/featureVisible/include.js deleted file mode 100644 index 767d32be11..0000000000 --- a/testing/test-cases/selenium-tests/featureVisible/include.js +++ /dev/null @@ -1,36 +0,0 @@ - -window.startTest = function (done) { - 'use strict'; - - window.geo_mouse_moves = 0; - $('#map').attr('geo-moves', window.geo_mouse_moves); - var map = window.geoTests.createOsmMap({zoom: 8}, {}, true); - var feature = map.createLayer('feature').createFeature('point', {selectionAPI: true}); - - feature.data([0]) - .position(function () { return {x: 0, y: 0}; }) - .style({radius: 1000}) - .geoOn(geo.event.feature.mousemove, function () { - // keep track of the number of mouse moves triggered - window.geo_mouse_moves += 1; - $('#map').attr('geo-moves', window.geo_mouse_moves); - }); - window.geo_feature = feature; - window.geo_wait_count = 0; - - // Used to block the python process waiting for an action to finish - window.geo_is_done = function (i) { - return window.geo_wait_count >= i; - }; - window.geo_wait = function () { - var c = window.geo_wait_count + 1; - map.draw(); - map.onIdle(function () { - window.geo_wait_count += 1; - }); - return c; - }; - - map.draw(); - map.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/featureVisible/testFeatureVisibility.py b/testing/test-cases/selenium-tests/featureVisible/testFeatureVisibility.py deleted file mode 100644 index b5bb67e48c..0000000000 --- a/testing/test-cases/selenium-tests/featureVisible/testFeatureVisibility.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class Visibility(object): - testCase = ('osmLayer',) - testRevision = 1 - - def getCount(self): - self.wait(function='return window.geo_is_done(window.geo_wait())') - return self.runScript('return window.geo_mouse_moves') - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('featureVisible/index.html') - self.resizeWindow(640, 480) - self.wait() - - def trigger_mouse_moves(self): - for i in range(10): - self.hover('#map', offset=(2.5 * i, 2.5 * i)) - - def test_visibility_toggle(self): - self.loadPage() - - self.trigger_mouse_moves() - initial = self.getCount() - - self.assertGreater(initial, 0, 'Initial mouse movements') - - self.runScript('window.geo_feature.visible(false)') - initial = self.getCount() - self.trigger_mouse_moves() - count = self.getCount() - - self.assertEqual(count, initial, 'Visibility off') - - self.runScript('window.geo_feature.visible(true)') - - initial = self.getCount() - self.trigger_mouse_moves() - count = self.getCount() - - self.assertGreater(count, initial, 'Visibility on') - - -class FirefoxVis(Visibility, FirefoxTest): - testCase = Visibility.testCase + ('firefox',) - - -class ChromeVis(Visibility, ChromeTest): - testCase = Visibility.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glContour/include.css b/testing/test-cases/selenium-tests/glContour/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glContour/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glContour/include.html b/testing/test-cases/selenium-tests/glContour/include.html deleted file mode 100644 index ad19e7dab4..0000000000 --- a/testing/test-cases/selenium-tests/glContour/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glContour/include.js b/testing/test-cases/selenium-tests/glContour/include.js deleted file mode 100644 index c0078edbc0..0000000000 --- a/testing/test-cases/selenium-tests/glContour/include.js +++ /dev/null @@ -1,104 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - /* Get a URL parameter or return null if it doesn't exist. - * - * @param name: name of the parameter to fetch. - * @returns: the decoded parameter. - */ - function getQueryParameter(name) { - var match = new RegExp('[?&]' + name + '=([^&]*)').exec( - window.location.search); - return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); - } - - var mapOptions = { - center: { - x: -157.965, - y: 21.482 - }, - zoom: 10 - }; - - var myMap = window.geoTests.createOsmMap(mapOptions, {}, true); - - var layer = myMap.createLayer('feature', {renderer: 'vgl'}); - var url = '/data/' + (getQueryParameter('url') || 'oahu.json'); - $.getJSON(url, {format: 'json'}).done(function (data) { - var contour = layer.createFeature('contour') - .data(data.position || data.values) - .style({ - opacity: 0.75 - }) - .contour({ - gridWidth: data.gridWidth, - gridHeight: data.gridHeight, - min: 0 - }); - if (data.position) { - contour - .position(function (d) { return {x: d.x, y: d.y, z: d.z}; }) - .style({ - value: function (d) { return d.z > -9999 ? d.z : null; } - }); - } else { - contour - .style({ - value: function (d) { return d > -9999 ? d : null; } - }) - .contour({ - /* The geometry can be specified using 0-point coordinates and deltas - * since it is a regular grid. */ - x0: data.x0, y0: data.y0, dx: data.dx, dy: data.dy - }); - } - var range = getQueryParameter('range'); - if (range) { - contour - .style({ - opacity: 1 - }) - .contour({ - minColor: 'blue', - minOpacity: 0.5, - maxColor: 'red', - maxOpacity: 0.5 - }); - switch (range) { - case 'nonlinear': - contour - .contour({ - rangeValues: [0, 25, 50, 75, 100, 125, 250, 500, 750, 2000] - }); - break; - case 'iso': - contour - .contour({ - rangeValues: [100, 100, 200, 200, 300, 300, 400, 400, 500, 500], - opacityRange: [1, 0, 1, 0, 1, 0, 1, 0, 1], - minOpacity: 0, - maxOpacity: 0 - }); - break; - default: - contour - .contour({ - min: 100, - max: 500, - colorRange: ['#FF00FF', '#CC33CC', '#996699', - '#669966', '#33CC33', '#00FF00'], - opacityRange: [0.5, 0.6, 0.7, 0.8, 0.9, 1.0] - }); - break; - } - } - if (getQueryParameter('stepped') === 'false') { - contour - .contour({ - stepped: false - }); - } - myMap.draw(); - }); - myMap.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/glContour/testGlContour.py b/testing/test-cases/selenium-tests/glContour/testGlContour.py deleted file mode 100644 index 58bd3334fb..0000000000 --- a/testing/test-cases/selenium-tests/glContour/testGlContour.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python - -import urllib -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glContourBase(object): - testCase = ('glContour',) - testRevision = 4 - - def loadPage(self, params=None): - self.resizeWindow(640, 480) - url = 'glContour/index.html' - if params: - url += '?' + urllib.urlencode(params) - self.loadURL(url) - self.wait() - self.resizeWindow(640, 480) - - def testGlContour(self): - self.loadPage() - # geo from position, auto min-max, default color range, stepped - self.screenshotTest('drawGlContour') - - def testOptionsGlContour(self): - self.loadPage({ - 'url': 'oahu-dense.json', - 'range': 'true', - 'stepped': 'false' - }) - # geo from x0, specified min-max, set color range, smooth - self.screenshotTest('optionsGlContour') - - def testRangeGlContour(self): - self.loadPage({ - 'url': 'oahu-dense.json', - 'range': 'nonlinear', - }) - # geo from x0, non-linear range - self.screenshotTest('rangeGlContour') - - def testIsoGlContour(self): - self.loadPage({ - 'url': 'oahu-dense.json', - 'range': 'iso', - }) - # geo from x0, iso-like range - self.screenshotTest('isoGlContour') - - -class FirefoxOSM(glContourBase, FirefoxTest): - testCase = glContourBase.testCase + ('firefox',) - - -class ChromeOSM(glContourBase, ChromeTest): - testCase = glContourBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glMultiPolygons/include.css b/testing/test-cases/selenium-tests/glMultiPolygons/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glMultiPolygons/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glMultiPolygons/include.html b/testing/test-cases/selenium-tests/glMultiPolygons/include.html deleted file mode 100644 index ad19e7dab4..0000000000 --- a/testing/test-cases/selenium-tests/glMultiPolygons/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glMultiPolygons/include.js b/testing/test-cases/selenium-tests/glMultiPolygons/include.js deleted file mode 100644 index 3008cf0bfc..0000000000 --- a/testing/test-cases/selenium-tests/glMultiPolygons/include.js +++ /dev/null @@ -1,40 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var data = { - type: 'FeatureCollection', - features: [{ - type: 'Feature', - properties: { - fillColor: {r: 1, g: 0, b: 0}, - fillOpacity: 0.25, - stroke: true, - strokeColor: {r: 0, g: 0, b: 0}, - strokeWidth: 2 - }, - geometry: { - type: 'MultiPolygon', - coordinates: [[[[-84.539963,35.670465],[-84.536919,35.670436],[-84.530976,35.670382],[-84.530886,35.67323],[-84.530875,35.673569],[-84.530779,35.676612],[-84.529882,35.67661],[-84.527308,35.676608],[-84.527195,35.676607],[-84.526299,35.676607],[-84.526122,35.676606],[-84.525594,35.676605],[-84.52542,35.676606],[-84.52386,35.6766],[-84.521936,35.676597],[-84.521905,35.679133],[-84.521903,35.679347],[-84.521899,35.679823],[-84.521891,35.68052],[-84.521887,35.680907],[-84.521862,35.68247],[-84.521849,35.683223],[-84.521842,35.683729],[-84.523616,35.68379],[-84.525276,35.683847],[-84.526842,35.683902],[-84.526973,35.683907],[-84.527198,35.68392],[-84.527366,35.683914],[-84.527427,35.683912],[-84.527497,35.683909],[-84.527521,35.683907],[-84.527589,35.683904],[-84.527613,35.683905],[-84.531607,35.68399],[-84.531909,35.683997],[-84.531877,35.684294],[-84.531803,35.687606],[-84.531546,35.687606],[-84.530761,35.687608],[-84.530737,35.687609],[-84.530632,35.689936],[-84.530597,35.69072],[-84.530577,35.691171],[-84.530282,35.691171],[-84.528044,35.691172],[-84.527299,35.691173],[-84.527043,35.691173],[-84.526276,35.691174],[-84.526175,35.691175],[-84.526171,35.691329],[-84.526094,35.694654],[-84.526091,35.6948],[-84.521869,35.694773],[-84.521693,35.700387],[-84.521592,35.703715],[-84.521578,35.70412],[-84.521551,35.705053],[-84.52152,35.705101],[-84.521391,35.705292],[-84.521165,35.705629],[-84.521133,35.705675],[-84.521038,35.705816],[-84.521008,35.705865],[-84.519609,35.707959],[-84.516891,35.71204],[-84.514702,35.71354],[-84.512627,35.714966],[-84.51257,35.714999],[-84.512413,35.715109],[-84.512361,35.715149],[-84.51208,35.715341],[-84.511238,35.715919],[-84.51096,35.716113],[-84.510472,35.716448],[-84.506191,35.716435],[-84.505599,35.716434],[-84.503459,35.716428],[-84.499931,35.716418],[-84.494488,35.716362],[-84.49237,35.718361],[-84.488828,35.721707],[-84.487572,35.72289],[-84.483807,35.726445],[-84.482554,35.727633],[-84.482332,35.727841],[-84.481671,35.728471],[-84.481451,35.728682],[-84.47956,35.730478],[-84.475095,35.734723],[-84.474643,35.735152],[-84.47389,35.735868],[-84.472,35.737664],[-84.471776,35.737875],[-84.471104,35.738504],[-84.47088,35.738716],[-84.470289,35.739269],[-84.468519,35.740933],[-84.46793,35.741489],[-84.46467,35.744547],[-84.458787,35.750073],[-84.454846,35.753676],[-84.45155,35.756694],[-84.451073,35.757127],[-84.449647,35.758431],[-84.449173,35.758867],[-84.449018,35.759006],[-84.448558,35.759426],[-84.448361,35.759382],[-84.448254,35.759351],[-84.448154,35.759321],[-84.447536,35.759141],[-84.447412,35.759105],[-84.44733,35.759083],[-84.447331,35.759072],[-84.447336,35.759042],[-84.447339,35.759032],[-84.4475,35.758201],[-84.447351,35.757112],[-84.447104,35.75612],[-84.446771,35.755396],[-84.446485,35.754913],[-84.446348,35.75468],[-84.445709,35.75403],[-84.445043,35.753484],[-84.444352,35.752917],[-84.442787,35.75179],[-84.441143,35.750583],[-84.440059,35.750074],[-84.43857,35.749192],[-84.43642,35.748367],[-84.436201,35.748332],[-84.435857,35.748278],[-84.435589,35.748252],[-84.435166,35.748212],[-84.43407,35.74821],[-84.433406,35.748306],[-84.431706,35.74873],[-84.431359,35.748888],[-84.430123,35.749452],[-84.42907,35.750074],[-84.428548,35.750473],[-84.427545,35.751452],[-84.427155,35.751833],[-84.426895,35.752155],[-84.426648,35.752464],[-84.426401,35.752772],[-84.42601,35.753255],[-84.425289,35.754569],[-84.42501,35.75547],[-84.424991,35.755533],[-84.424617,35.756981],[-84.424408,35.75796],[-84.42437,35.758696],[-84.424361,35.75889],[-84.424358,35.758954],[-84.424421,35.760456],[-84.424483,35.762976],[-84.424485,35.763861],[-84.424488,35.764664],[-84.424336,35.766402],[-84.423889,35.768441],[-84.423659,35.769002],[-84.423249,35.770004],[-84.422009,35.771976],[-84.421431,35.772632],[-84.421328,35.772748],[-84.421226,35.772864],[-84.421126,35.772977],[-84.421027,35.77309],[-84.420862,35.773277],[-84.419334,35.774586],[-84.419143,35.774752],[-84.417696,35.775747],[-84.416415,35.776451],[-84.416145,35.776524],[-84.414745,35.7769],[-84.413601,35.777015],[-84.412588,35.777117],[-84.412181,35.777129],[-84.410163,35.777191],[-84.409853,35.777202],[-84.40923,35.777218],[-84.408607,35.777235],[-84.408241,35.777245],[-84.407545,35.777155],[-84.407383,35.77713],[-84.407219,35.777113],[-84.406695,35.777046],[-84.405542,35.77679],[-84.405272,35.77673],[-84.405003,35.77667],[-84.404442,35.776545],[-84.403017,35.77604],[-84.402764,35.775951],[-84.401292,35.775267],[-84.399751,35.774535],[-84.399731,35.774526],[-84.398454,35.773889],[-84.398052,35.773688],[-84.397649,35.773488],[-84.397623,35.773475],[-84.395614,35.772471],[-84.393833,35.771458],[-84.391961,35.770405],[-84.390547,35.769518],[-84.388607,35.768352],[-84.38847,35.768518],[-84.388333,35.768683],[-84.388263,35.768766],[-84.387827,35.769296],[-84.387321,35.769908],[-84.387235,35.770011],[-84.387133,35.770136],[-84.386945,35.770363],[-84.386895,35.770427],[-84.386709,35.770648],[-84.386158,35.771317],[-84.385975,35.771542],[-84.384737,35.773043],[-84.381025,35.777548],[-84.380776,35.777851],[-84.382112,35.778645],[-84.382196,35.778695],[-84.382447,35.778845],[-84.382532,35.778896],[-84.382936,35.779137],[-84.384151,35.77986],[-84.384556,35.780102],[-84.384869,35.780288],[-84.38581,35.780849],[-84.386125,35.781036],[-84.386564,35.781297],[-84.386762,35.781414],[-84.3874,35.781794],[-84.387888,35.782083],[-84.387943,35.782116],[-84.388296,35.782319],[-84.388696,35.782527],[-84.387432,35.783375],[-84.387295,35.783447],[-84.387001,35.783676],[-84.385713,35.784669],[-84.38553,35.7848],[-84.385428,35.784874],[-84.384889,35.785274],[-84.384254,35.785735],[-84.383846,35.786045],[-84.383217,35.786503],[-84.382716,35.786893],[-84.382473,35.78709],[-84.382271,35.787235],[-84.382057,35.787361],[-84.381523,35.787748],[-84.381269,35.78795],[-84.380985,35.78815],[-84.379564,35.789162],[-84.379193,35.789414],[-84.378113,35.790153],[-84.378048,35.79019],[-84.377876,35.790289],[-84.377373,35.790582],[-84.377363,35.790587],[-84.377283,35.790636],[-84.377189,35.790678],[-84.377222,35.790744],[-84.377327,35.790949],[-84.377363,35.79102],[-84.377925,35.792145],[-84.378323,35.792941],[-84.378968,35.792881],[-84.380378,35.794629],[-84.381171,35.795613],[-84.381479,35.795993],[-84.381909,35.796521],[-84.381235,35.796951],[-84.380823,35.797218],[-84.380271,35.797565],[-84.379881,35.797815],[-84.380119,35.799288],[-84.380225,35.799934],[-84.380414,35.801074],[-84.380982,35.804499],[-84.381141,35.805453],[-84.381166,35.805605],[-84.381161,35.805642],[-84.380713,35.809177],[-84.380301,35.812414],[-84.379668,35.817439],[-84.375709,35.820024],[-84.375326,35.820274],[-84.375568,35.822429],[-84.374342,35.822954],[-84.372165,35.823888],[-84.371537,35.825862],[-84.365045,35.825258],[-84.36486,35.825335],[-84.3628,35.826172],[-84.357348,35.828397],[-84.356629,35.828691],[-84.354572,35.829531],[-84.354359,35.829617],[-84.35372,35.829878],[-84.353508,35.829965],[-84.352942,35.830195],[-84.351246,35.830889],[-84.350681,35.831121],[-84.350495,35.831196],[-84.349941,35.831421],[-84.349756,35.831497],[-84.34959,35.831564],[-84.349094,35.831766],[-84.348929,35.831834],[-84.348342,35.832073],[-84.347624,35.832367],[-84.346508,35.832219],[-84.34588,35.832137],[-84.34576,35.832122],[-84.345237,35.832052],[-84.344527,35.831957],[-84.344386,35.831938],[-84.343926,35.831878],[-84.343309,35.831797],[-84.342825,35.831734],[-84.342791,35.83189],[-84.342715,35.832239],[-84.342491,35.833286],[-84.342417,35.833636],[-84.342349,35.833951],[-84.342269,35.834323],[-84.34166,35.83489],[-84.341462,35.835039],[-84.341239,35.835138],[-84.340979,35.835212],[-84.340719,35.835286],[-84.340435,35.835385],[-84.340142,35.835486],[-84.340174,35.835657],[-84.340158,35.835892],[-84.340127,35.836095],[-84.340113,35.836195],[-84.340072,35.83642],[-84.339962,35.836684],[-84.339916,35.836796],[-84.339903,35.83688],[-84.339887,35.83698],[-84.339457,35.837143],[-84.33921,35.837316],[-84.338888,35.837539],[-84.33864,35.837786],[-84.338442,35.838058],[-84.33817,35.838603],[-84.338021,35.839098],[-84.337898,35.839865],[-84.337898,35.840558],[-84.337898,35.84093],[-84.337947,35.841177],[-84.338096,35.841524],[-84.338021,35.843776],[-84.338364,35.845528],[-84.338533,35.846121],[-84.338665,35.846434],[-84.338792,35.847163],[-84.338687,35.849486],[-84.338687,35.849979],[-84.338871,35.850295],[-84.338071,35.854085],[-84.337797,35.855376],[-84.337782,35.855453],[-84.337767,35.855531],[-84.337749,35.855615],[-84.337733,35.855675],[-84.337712,35.85576],[-84.337546,35.856449],[-84.337492,35.856671],[-84.33738,35.857137],[-84.33735,35.857322],[-84.337068,35.859127],[-84.337044,35.859274],[-84.336943,35.859925],[-84.336898,35.8602],[-84.336888,35.86027],[-84.336879,35.86033],[-84.336852,35.860507],[-84.336847,35.860559],[-84.336828,35.86065],[-84.336791,35.860895],[-84.336779,35.860979],[-84.336741,35.861209],[-84.336633,35.861905],[-84.336598,35.862138],[-84.336584,35.862228],[-84.336546,35.862499],[-84.336532,35.86259],[-84.336496,35.862829],[-84.336382,35.863563],[-84.336344,35.863807],[-84.336311,35.863963],[-84.33621,35.864431],[-84.336177,35.864586],[-84.336156,35.864746],[-84.336152,35.864781],[-84.33608,35.865368],[-84.336058,35.865565],[-84.335999,35.865935],[-84.335826,35.867046],[-84.335768,35.867417],[-84.335703,35.867825],[-84.335511,35.869052],[-84.335447,35.869461],[-84.335367,35.869854],[-84.335131,35.871035],[-84.335053,35.871429],[-84.334825,35.872434],[-84.334221,35.875103],[-84.334138,35.87545],[-84.333901,35.876443],[-84.333899,35.876453],[-84.333863,35.876601],[-84.333756,35.877045],[-84.333734,35.877137],[-84.334873,35.877237],[-84.338222,35.877217],[-84.337036,35.879522],[-84.336918,35.879751],[-84.336814,35.879955],[-84.336583,35.88044],[-84.336311,35.881015],[-84.334875,35.879831],[-84.33478,35.879804],[-84.334641,35.879766],[-84.334611,35.879763],[-84.334556,35.879745],[-84.334447,35.87973],[-84.333968,35.879589],[-84.333616,35.879476],[-84.333591,35.879467],[-84.33354,35.879448],[-84.333514,35.879434],[-84.333431,35.879412],[-84.333397,35.879392],[-84.333355,35.879384],[-84.333331,35.879363],[-84.333264,35.879349],[-84.333213,35.879319],[-84.33315,35.879579],[-84.332964,35.880363],[-84.332902,35.880624],[-84.332513,35.88225],[-84.33135,35.88713],[-84.330962,35.888757],[-84.33087,35.889138],[-84.330596,35.890283],[-84.330505,35.890665],[-84.330159,35.892115],[-84.330068,35.892496],[-84.329976,35.892878],[-84.32997,35.892904],[-84.328644,35.891247],[-84.328537,35.891093],[-84.327824,35.890074],[-84.327392,35.889375],[-84.326982,35.889035],[-84.325607,35.887898],[-84.32455,35.887291],[-84.324412,35.887212],[-84.324275,35.887133],[-84.324249,35.887118],[-84.322983,35.88675],[-84.3215,35.88654],[-84.321401,35.886527],[-84.319906,35.886383],[-84.319184,35.886313],[-84.316957,35.886591],[-84.314722,35.887273],[-84.313173,35.887779],[-84.312966,35.887847],[-84.312252,35.887998],[-84.311741,35.888106],[-84.310376,35.888272],[-84.310111,35.888303],[-84.30906,35.888253],[-84.30589,35.887453],[-84.304926,35.88721],[-84.303219,35.886705],[-84.302324,35.886441],[-84.300886,35.886005],[-84.300068,35.885757],[-84.299916,35.885709],[-84.29962,35.885616],[-84.299323,35.885523],[-84.298486,35.88526],[-84.29765,35.884997],[-84.297496,35.884948],[-84.296684,35.884602],[-84.293683,35.883323],[-84.293047,35.882745],[-84.291229,35.881094],[-84.290845,35.880669],[-84.290776,35.880592],[-84.290707,35.880515],[-84.290254,35.880013],[-84.289801,35.879511],[-84.288648,35.878101],[-84.287551,35.876758],[-84.286336,35.875555],[-84.285613,35.875077],[-84.285184,35.875004],[-84.284838,35.874923],[-84.284482,35.87489],[-84.28383,35.874865],[-84.283256,35.874952],[-84.282678,35.875077],[-84.28248,35.875155],[-84.281887,35.875388],[-84.28169,35.875467],[-84.280809,35.875813],[-84.279884,35.876406],[-84.278976,35.87721],[-84.278699,35.87811],[-84.278545,35.879796],[-84.278817,35.881035],[-84.279015,35.881421],[-84.27919,35.881763],[-84.279365,35.882105],[-84.279884,35.883117],[-84.280671,35.88451],[-84.281682,35.886298],[-84.283758,35.889491],[-84.285811,35.894283],[-84.285817,35.894381],[-84.285931,35.896142],[-84.285793,35.897554],[-84.285594,35.898667],[-84.285502,35.899181],[-84.284551,35.901026],[-84.282833,35.902308],[-84.282819,35.902319],[-84.281159,35.902984],[-84.279297,35.902846],[-84.277114,35.901997],[-84.277083,35.901985],[-84.275553,35.900949],[-84.274541,35.900263],[-84.272854,35.898407],[-84.271916,35.897301],[-84.271373,35.89666],[-84.268952,35.894794],[-84.266656,35.894101],[-84.265292,35.894349],[-84.264045,35.895181],[-84.263543,35.895957],[-84.263411,35.896767],[-84.263397,35.896854],[-84.263383,35.89694],[-84.263644,35.897196],[-84.263906,35.897453],[-84.264928,35.898455],[-84.264996,35.898545],[-84.265559,35.899286],[-84.266328,35.900299],[-84.268393,35.902563],[-84.268741,35.903111],[-84.270304,35.905577],[-84.27115,35.907071],[-84.271309,35.907351],[-84.271735,35.908802],[-84.271711,35.909488],[-84.271587,35.910165],[-84.271639,35.910242],[-84.271678,35.9103],[-84.271691,35.910318],[-84.27187,35.91058],[-84.271955,35.910705],[-84.272048,35.910841],[-84.27367,35.913219],[-84.276188,35.91691],[-84.278539,35.920356],[-84.280162,35.922736],[-84.280408,35.923098],[-84.281149,35.924184],[-84.281397,35.924546],[-84.281448,35.924622],[-84.2815,35.924697],[-84.28155,35.92477],[-84.2816,35.924844],[-84.281736,35.925042],[-84.283107,35.927052],[-84.284469,35.929047],[-84.284508,35.929103],[-84.284546,35.929159],[-84.284586,35.929218],[-84.284627,35.929278],[-84.28472,35.929414],[-84.285247,35.930285],[-84.285255,35.930299],[-84.286084,35.931762],[-84.290537,35.939646],[-84.291622,35.941566],[-84.291705,35.941712],[-84.292649,35.943372],[-84.293061,35.944096],[-84.294591,35.946789],[-84.294741,35.947052],[-84.295191,35.947843],[-84.295341,35.948107],[-84.298061,35.95289],[-84.300673,35.957585],[-84.300712,35.957652],[-84.300999,35.958156],[-84.301978,35.959877],[-84.302189,35.960249],[-84.302305,35.960452],[-84.303804,35.963085],[-84.308306,35.970986],[-84.309809,35.973623],[-84.310045,35.974035],[-84.310754,35.975273],[-84.310841,35.975425],[-84.31099,35.975686],[-84.311929,35.977334],[-84.314748,35.982281],[-84.315688,35.98393],[-84.317019,35.986267],[-84.317595,35.987269],[-84.319111,35.989903],[-84.319158,35.989978],[-84.3192,35.990058],[-84.32006,35.991607],[-84.320138,35.991811],[-84.320431,35.992529],[-84.320599,35.992939],[-84.320615,35.992977],[-84.321615,35.995453],[-84.321756,35.995806],[-84.321904,35.996176],[-84.322161,35.996818],[-84.322179,35.996868],[-84.322311,35.997226],[-84.322322,35.997258],[-84.322329,35.997277],[-84.322495,35.997745],[-84.322994,35.999149],[-84.323161,35.999617],[-84.323232,35.999814],[-84.323447,36.000405],[-84.323519,36.000603],[-84.323523,36.000614],[-84.323535,36.000647],[-84.323539,36.000658],[-84.323622,36.000885],[-84.323874,36.001566],[-84.323958,36.001793],[-84.323996,36.001897],[-84.324479,36.003205],[-84.324511,36.003288],[-84.324987,36.004535],[-84.325007,36.004589],[-84.32506,36.004727],[-84.325279,36.005303],[-84.325353,36.005496],[-84.325739,36.006506],[-84.326053,36.007327],[-84.327851,36.012127],[-84.329721,36.017098],[-84.331547,36.02196],[-84.331891,36.022874],[-84.331906,36.022913],[-84.331912,36.022929],[-84.331921,36.022952],[-84.332511,36.024503],[-84.333812,36.027984],[-84.334352,36.029417],[-84.334411,36.029573],[-84.334588,36.030042],[-84.334595,36.03006],[-84.334646,36.0302],[-84.334697,36.030336],[-84.334852,36.030749],[-84.334906,36.030888],[-84.335931,36.03362],[-84.335967,36.033715],[-84.336152,36.034209],[-84.336226,36.034405],[-84.336267,36.034516],[-84.336393,36.03485],[-84.336435,36.034962],[-84.336693,36.03565],[-84.337467,36.037715],[-84.337726,36.038404],[-84.337745,36.038452],[-84.337794,36.038578],[-84.337802,36.038601],[-84.337821,36.038651],[-84.337929,36.038938],[-84.338253,36.0398],[-84.338362,36.040089],[-84.338505,36.040469],[-84.338934,36.041611],[-84.339077,36.041992],[-84.33909,36.042028],[-84.339132,36.042138],[-84.339146,36.042175],[-84.339218,36.042366],[-84.339351,36.042721],[-84.339639,36.043487],[-84.339833,36.044001],[-84.340181,36.044928],[-84.340197,36.044973],[-84.340334,36.045472],[-84.340405,36.045727],[-84.340475,36.045815],[-84.340705,36.046407],[-84.340775,36.046588],[-84.340793,36.046632],[-84.340832,36.046734],[-84.34085,36.046778],[-84.341396,36.048183],[-84.341627,36.048776],[-84.34165,36.048801],[-84.341722,36.048879],[-84.341746,36.048905],[-84.341759,36.048919],[-84.341798,36.048962],[-84.341812,36.048977],[-84.342021,36.049205],[-84.342651,36.049889],[-84.342862,36.050118],[-84.342931,36.050193],[-84.34314,36.05042],[-84.34321,36.050496],[-84.34325,36.05054],[-84.343272,36.050564],[-84.343459,36.050771],[-84.343522,36.050841],[-84.343722,36.051058],[-84.344331,36.051717],[-84.344535,36.051938],[-84.344645,36.052057],[-84.344975,36.052417],[-84.345086,36.052538],[-84.345123,36.052577],[-84.345169,36.052627],[-84.345234,36.052697],[-84.345271,36.052738],[-84.34529,36.052759],[-84.345347,36.052822],[-84.345367,36.052843],[-84.345503,36.052992],[-84.345511,36.053001],[-84.345915,36.053439],[-84.346053,36.053589],[-84.346109,36.053649],[-84.346277,36.053832],[-84.346333,36.053893],[-84.346412,36.053979],[-84.346652,36.054239],[-84.346732,36.054326],[-84.346872,36.054479],[-84.347295,36.054938],[-84.347436,36.055092],[-84.347548,36.055214],[-84.347886,36.055581],[-84.347999,36.055704],[-84.34805,36.05576],[-84.348206,36.055929],[-84.348259,36.055986],[-84.348326,36.05606],[-84.348394,36.056134],[-84.348803,36.056579],[-84.34894,36.056728],[-84.3491,36.056901],[-84.349919,36.057791],[-84.350285,36.058189],[-84.352855,36.060983],[-84.353834,36.062047],[-84.353915,36.062135],[-84.354621,36.062903],[-84.354828,36.063128],[-84.357812,36.066372],[-84.358807,36.067454],[-84.358853,36.067504],[-84.359119,36.067793],[-84.360057,36.068813],[-84.36037,36.069153],[-84.360424,36.069212],[-84.360588,36.06939],[-84.360643,36.06945],[-84.360739,36.069555],[-84.36103,36.069871],[-84.361128,36.069977],[-84.361215,36.0701],[-84.361479,36.070472],[-84.361567,36.070596],[-84.365069,36.075544],[-84.374929,36.089476],[-84.375568,36.090397],[-84.376189,36.09129],[-84.37903,36.095377],[-84.37923,36.095477],[-84.37943,36.095577],[-84.37973,36.095777],[-84.37993,36.095977],[-84.38003,36.096077],[-84.38023,36.096077],[-84.38063,36.096377],[-84.38063,36.096477],[-84.38113,36.096477],[-84.38133,36.096477],[-84.38183,36.096577],[-84.38223,36.096777],[-84.38253,36.096877],[-84.38283,36.097177],[-84.38323,36.097277],[-84.38353,36.097277],[-84.38403,36.097477],[-84.38463,36.097677],[-84.38473,36.097877],[-84.38523,36.098177],[-84.38543,36.098277],[-84.38573,36.098577],[-84.385862,36.098599],[-84.385989,36.098621],[-84.38633,36.098677],[-84.386692,36.098797],[-84.38693,36.098877],[-84.38743,36.098877],[-84.387571,36.09883],[-84.387713,36.098783],[-84.38823,36.098677],[-84.388433,36.098677],[-84.38883,36.098677],[-84.38913,36.098977],[-84.38933,36.099277],[-84.390131,36.099377],[-84.390306,36.099352],[-84.390717,36.099293],[-84.390831,36.099277],[-84.391031,36.099277],[-84.391131,36.099277],[-84.391359,36.099441],[-84.391915,36.099847],[-84.392182,36.100041],[-84.392231,36.100077],[-84.392731,36.100277],[-84.393231,36.100477],[-84.393431,36.100877],[-84.393357,36.101171],[-84.393331,36.101277],[-84.393302,36.101336],[-84.393231,36.101477],[-84.393231,36.101562],[-84.393231,36.101777],[-84.393331,36.102077],[-84.393531,36.102477],[-84.393831,36.102777],[-84.394031,36.103177],[-84.394431,36.103678],[-84.395031,36.104377],[-84.395631,36.104877],[-84.396131,36.105077],[-84.396431,36.105077],[-84.396731,36.104977],[-84.397131,36.104777],[-84.398131,36.104677],[-84.399131,36.104677],[-84.399631,36.104677],[-84.400131,36.104677],[-84.400631,36.104577],[-84.400928,36.104477],[-84.401331,36.104477],[-84.401631,36.104477],[-84.401931,36.104277],[-84.402331,36.104177],[-84.402987,36.10398],[-84.403331,36.103877],[-84.403931,36.103777],[-84.404428,36.103777],[-84.404631,36.103777],[-84.404931,36.103777],[-84.405431,36.103677],[-84.405731,36.103677],[-84.406031,36.103577],[-84.406331,36.103677],[-84.406731,36.103777],[-84.407131,36.104077],[-84.407531,36.104377],[-84.407531,36.104477],[-84.407932,36.104877],[-84.408132,36.105077],[-84.40845,36.105183],[-84.408732,36.105277],[-84.409632,36.105677],[-84.410232,36.105877],[-84.410832,36.106077],[-84.411532,36.106377],[-84.412332,36.106677],[-84.412932,36.106977],[-84.413432,36.107177],[-84.413532,36.107177],[-84.413932,36.107477],[-84.414332,36.107777],[-84.414532,36.107877],[-84.414832,36.107877],[-84.415432,36.107777],[-84.415932,36.107877],[-84.416232,36.108077],[-84.416332,36.108177],[-84.416432,36.108277],[-84.417726,36.108309],[-84.420432,36.108377],[-84.42065,36.109536],[-84.42089,36.11081],[-84.421346,36.11323],[-84.421732,36.115277],[-84.421847,36.11551],[-84.424082,36.120034],[-84.424443,36.120764],[-84.425173,36.122243],[-84.425246,36.122392],[-84.425261,36.122422],[-84.425468,36.122842],[-84.425542,36.122992],[-84.425531,36.123125],[-84.425502,36.123524],[-84.425499,36.123569],[-84.425491,36.123657],[-84.425477,36.123848],[-84.425436,36.124427],[-84.425452,36.124612],[-84.425454,36.124629],[-84.425461,36.124668],[-84.425532,36.125078],[-84.429676,36.131352],[-84.429716,36.131398],[-84.429779,36.131493],[-84.429969,36.131781],[-84.430033,36.131877],[-84.432433,36.131677],[-84.432533,36.131777],[-84.432833,36.132077],[-84.433333,36.132377],[-84.433403,36.132408],[-84.434233,36.132777],[-84.435033,36.133377],[-84.435733,36.133977],[-84.436434,36.134277],[-84.436434,36.134377],[-84.436734,36.134377],[-84.436834,36.134377],[-84.439934,36.135277],[-84.441134,36.135277],[-84.442034,36.135477],[-84.442134,36.135477],[-84.442234,36.135777],[-84.442334,36.136077],[-84.442434,36.136477],[-84.442434,36.136793],[-84.442434,36.136977],[-84.442534,36.137477],[-84.442534,36.137577],[-84.442534,36.139977],[-84.442634,36.139977],[-84.442734,36.139977],[-84.442944,36.139907],[-84.442963,36.139901],[-84.443034,36.139877],[-84.443234,36.139777],[-84.443334,36.139777],[-84.444344,36.138582],[-84.444434,36.138477],[-84.444734,36.138477],[-84.444934,36.138477],[-84.445534,36.138477],[-84.445934,36.138477],[-84.446234,36.138477],[-84.446534,36.138577],[-84.446634,36.138577],[-84.448834,36.139377],[-84.448934,36.139377],[-84.449034,36.139577],[-84.449134,36.140077],[-84.449294,36.140398],[-84.449334,36.140477],[-84.449534,36.141177],[-84.449734,36.141677],[-84.449834,36.142277],[-84.449834,36.142677],[-84.449834,36.142977],[-84.449834,36.143151],[-84.449834,36.143577],[-84.449834,36.143977],[-84.449834,36.144477],[-84.449834,36.145177],[-84.449834,36.145677],[-84.449834,36.145774],[-84.449834,36.146427],[-84.449836,36.146649],[-84.449845,36.147528],[-84.449872,36.150166],[-84.449881,36.151046],[-84.449627,36.15126],[-84.448867,36.151905],[-84.448614,36.15212],[-84.448234,36.152478],[-84.447334,36.152378],[-84.447046,36.152413],[-84.446534,36.152478],[-84.445969,36.152236],[-84.445834,36.152178],[-84.445327,36.151878],[-84.445034,36.151878],[-84.444934,36.152278],[-84.444734,36.152578],[-84.444657,36.152655],[-84.444434,36.152878],[-84.444085,36.152994],[-84.443834,36.153078],[-84.443234,36.153678],[-84.443175,36.153744],[-84.443029,36.153912],[-84.442534,36.154478],[-84.442034,36.155178],[-84.44196,36.155252],[-84.441894,36.155317],[-84.441699,36.155512],[-84.441634,36.155578],[-84.441334,36.155778],[-84.441034,36.155678],[-84.440834,36.155978],[-84.440934,36.156378],[-84.441034,36.156778],[-84.441072,36.156829],[-84.441334,36.157178],[-84.441534,36.157478],[-84.442034,36.157878],[-84.442334,36.158278],[-84.442534,36.158778],[-84.442634,36.159178],[-84.442634,36.159878],[-84.442534,36.160278],[-84.442434,36.160778],[-84.442134,36.161078],[-84.441734,36.161378],[-84.441543,36.161663],[-84.441334,36.161978],[-84.441134,36.162478],[-84.441034,36.162978],[-84.441034,36.163478],[-84.440934,36.163578],[-84.440634,36.163478],[-84.440334,36.163578],[-84.440251,36.163591],[-84.439734,36.163678],[-84.439234,36.163778],[-84.438534,36.163978],[-84.437834,36.164178],[-84.437752,36.164178],[-84.437134,36.164178],[-84.436895,36.164178],[-84.436534,36.164178],[-84.435834,36.164478],[-84.435334,36.164778],[-84.434934,36.164778],[-84.434434,36.164678],[-84.433734,36.164778],[-84.433234,36.165078],[-84.432734,36.165378],[-84.431934,36.165378],[-84.430834,36.165078],[-84.429834,36.164978],[-84.429134,36.165078],[-84.428434,36.165078],[-84.427534,36.164878],[-84.426434,36.164678],[-84.425734,36.164978],[-84.425434,36.165278],[-84.424914,36.16626],[-84.423634,36.168678],[-84.423034,36.168978],[-84.422634,36.169078],[-84.422234,36.169078],[-84.421634,36.169278],[-84.420893,36.169278],[-84.420834,36.169278],[-84.420134,36.169278],[-84.41995,36.169258],[-84.419876,36.169249],[-84.419233,36.169178],[-84.418433,36.168778],[-84.417833,36.168678],[-84.417233,36.168678],[-84.416733,36.168478],[-84.416133,36.168178],[-84.415333,36.167978],[-84.414733,36.168378],[-84.414233,36.168978],[-84.414023,36.169189],[-84.413633,36.169578],[-84.413033,36.169778],[-84.412333,36.169878],[-84.411633,36.169978],[-84.411133,36.170478],[-84.410433,36.171278],[-84.409733,36.172278],[-84.409233,36.172978],[-84.408433,36.173878],[-84.407733,36.174278],[-84.406933,36.174678],[-84.406233,36.174978],[-84.405533,36.174878],[-84.404233,36.174478],[-84.403633,36.174778],[-84.403033,36.175578],[-84.402033,36.176078],[-84.401733,36.176478],[-84.401657,36.176781],[-84.401533,36.177278],[-84.401133,36.177778],[-84.400833,36.178478],[-84.400833,36.179178],[-84.401033,36.179678],[-84.401333,36.180078],[-84.401833,36.180378],[-84.402433,36.180778],[-84.402633,36.181378],[-84.402733,36.181978],[-84.402933,36.182678],[-84.403433,36.183478],[-84.403533,36.183978],[-84.403533,36.184478],[-84.403333,36.184978],[-84.403133,36.185778],[-84.403112,36.185799],[-84.40291,36.186],[-84.402533,36.186378],[-84.401933,36.186578],[-84.401476,36.186709],[-84.401233,36.186778],[-84.400333,36.187278],[-84.39979,36.187743],[-84.399633,36.187878],[-84.399385,36.18802],[-84.399184,36.188134],[-84.398933,36.188278],[-84.398133,36.188678],[-84.397433,36.189278],[-84.397033,36.189878],[-84.396633,36.190678],[-84.39628,36.190972],[-84.396033,36.191178],[-84.395741,36.191324],[-84.395233,36.191578],[-84.394533,36.191978],[-84.393933,36.192378],[-84.393639,36.192768],[-84.392792,36.193887],[-84.392078,36.194832],[-84.390833,36.196478],[-84.390833,36.196978],[-84.390833,36.197778],[-84.390833,36.198778],[-84.390933,36.199378],[-84.391133,36.199778],[-84.391513,36.200158],[-84.391533,36.200178],[-84.392033,36.200778],[-84.392233,36.201078],[-84.392248,36.201123],[-84.392433,36.201678],[-84.392333,36.202178],[-84.392098,36.202591],[-84.391933,36.202878],[-84.391601,36.203211],[-84.391533,36.203278],[-84.391033,36.203878],[-84.390333,36.204278],[-84.390057,36.204348],[-84.389933,36.204378],[-84.389433,36.204478],[-84.389337,36.204503],[-84.389033,36.204578],[-84.388733,36.204678],[-84.388233,36.205078],[-84.387698,36.205256],[-84.387333,36.205378],[-84.386733,36.205578],[-84.386333,36.205878],[-84.386133,36.206378],[-84.385633,36.206678],[-84.384933,36.206578],[-84.384533,36.206778],[-84.384033,36.206778],[-84.383333,36.206878],[-84.382733,36.207278],[-84.382133,36.207678],[-84.381433,36.208378],[-84.381321,36.208506],[-84.380733,36.209178],[-84.380233,36.209778],[-84.379533,36.210378],[-84.378733,36.210978],[-84.378233,36.211478],[-84.377633,36.211678],[-84.376902,36.211897],[-84.376632,36.211978],[-84.375832,36.212278],[-84.375432,36.212778],[-84.375132,36.213178],[-84.374932,36.213478],[-84.374732,36.213978],[-84.374332,36.214378],[-84.374332,36.214678],[-84.374332,36.215178],[-84.374332,36.215678],[-84.374132,36.215978],[-84.373632,36.216278],[-84.373132,36.216378],[-84.372732,36.216578],[-84.372731,36.216778],[-84.372632,36.216678],[-84.372132,36.216378],[-84.371432,36.215878],[-84.371032,36.215378],[-84.370632,36.214978],[-84.369932,36.214678],[-84.369332,36.214378],[-84.368632,36.213978],[-84.368132,36.213578],[-84.367632,36.213278],[-84.366932,36.212878],[-84.366369,36.21269],[-84.366332,36.212678],[-84.365732,36.212478],[-84.365032,36.212578],[-84.364132,36.212778],[-84.363432,36.213078],[-84.362732,36.213178],[-84.361732,36.213378],[-84.360332,36.213678],[-84.359532,36.213778],[-84.358632,36.213978],[-84.357732,36.214178],[-84.356732,36.214278],[-84.355832,36.214378],[-84.355622,36.214354],[-84.354932,36.214278],[-84.353932,36.214078],[-84.353131,36.214178],[-84.351831,36.214278],[-84.351331,36.214578],[-84.350531,36.214878],[-84.349531,36.215178],[-84.348831,36.215278],[-84.348131,36.215278],[-84.347631,36.215078],[-84.346731,36.215078],[-84.346131,36.214778],[-84.345431,36.214578],[-84.344831,36.214578],[-84.344231,36.214378],[-84.344151,36.214219],[-84.344031,36.213978],[-84.343631,36.213678],[-84.343131,36.213578],[-84.342431,36.213278],[-84.341431,36.212978],[-84.340931,36.212778],[-84.340231,36.212378],[-84.339031,36.212278],[-84.338431,36.211878],[-84.338131,36.211378],[-84.337585,36.210921],[-84.337482,36.210891],[-84.337396,36.210871],[-84.337194,36.210826],[-84.337142,36.210815],[-84.337097,36.210803],[-84.336931,36.210778],[-84.336031,36.210678],[-84.335631,36.210478],[-84.335431,36.210578],[-84.33526,36.210705],[-84.335031,36.210878],[-84.334331,36.210678],[-84.334031,36.210578],[-84.333831,36.210478],[-84.333831,36.210378],[-84.333831,36.210278],[-84.333931,36.210278],[-84.33273,36.208578],[-84.33193,36.208478],[-84.33113,36.208478],[-84.33093,36.208378],[-84.330871,36.20829],[-84.33073,36.208078],[-84.33023,36.208278],[-84.32973,36.208578],[-84.329154,36.20865],[-84.32893,36.208678],[-84.3289,36.208682],[-84.32833,36.208778],[-84.328143,36.20874],[-84.327893,36.208691],[-84.32783,36.208678],[-84.32713,36.208678],[-84.326921,36.208651],[-84.32633,36.208578],[-84.32543,36.208778],[-84.32503,36.208978],[-84.32463,36.209078],[-84.32413,36.209178],[-84.324096,36.209194],[-84.323694,36.209396],[-84.323204,36.209584],[-84.322894,36.209702],[-84.322085,36.210013],[-84.321964,36.210052],[-84.32165,36.210157],[-84.321544,36.210192],[-84.321227,36.210297],[-84.321206,36.210305],[-84.321122,36.210332],[-84.321119,36.210355],[-84.321093,36.210422],[-84.321126,36.210459],[-84.321145,36.21048],[-84.321295,36.210611],[-84.321467,36.210729],[-84.321587,36.210812],[-84.321731,36.210911],[-84.321897,36.211029],[-84.322043,36.211111],[-84.322199,36.211181],[-84.322332,36.211192],[-84.322463,36.211174],[-84.322505,36.21116],[-84.32259,36.211144],[-84.322674,36.211122],[-84.322798,36.2111],[-84.322837,36.211086],[-84.322966,36.211078],[-84.323093,36.211097],[-84.323258,36.211142],[-84.323547,36.211234],[-84.323752,36.211305],[-84.324276,36.2115],[-84.3243,36.211508],[-84.324606,36.211612],[-84.324982,36.21171],[-84.324996,36.211713],[-84.324987,36.211751],[-84.324969,36.21183],[-84.324892,36.212182],[-84.324867,36.2123],[-84.324857,36.21234],[-84.324855,36.212353],[-84.324776,36.212431],[-84.324747,36.212461],[-84.32453,36.212678],[-84.32423,36.212978],[-84.32373,36.213278],[-84.32303,36.213578],[-84.32253,36.213578],[-84.32153,36.213278],[-84.321154,36.213231],[-84.32073,36.213178],[-84.31973,36.213178],[-84.31823,36.213378],[-84.31783,36.213378],[-84.31683,36.214278],[-84.31633,36.214678],[-84.31563,36.214878],[-84.315378,36.214928],[-84.31513,36.214978],[-84.31443,36.215078],[-84.31363,36.215178],[-84.31273,36.215178],[-84.31243,36.215278],[-84.31183,36.215478],[-84.31143,36.215978],[-84.31113,36.216278],[-84.31043,36.216178],[-84.310137,36.216136],[-84.30973,36.216078],[-84.30903,36.216378],[-84.30883,36.216578],[-84.30873,36.216878],[-84.30873,36.216978],[-84.30863,36.217078],[-84.30703,36.217678],[-84.306907,36.217924],[-84.30683,36.218078],[-84.306329,36.218278],[-84.305529,36.218378],[-84.304128,36.218844],[-84.304029,36.218878],[-84.303829,36.219078],[-84.303329,36.219578],[-84.303129,36.219678],[-84.302129,36.220178],[-84.301729,36.220678],[-84.301429,36.220978],[-84.300429,36.220978],[-84.299929,36.220878],[-84.299529,36.220478],[-84.299129,36.220478],[-84.298229,36.220278],[-84.297729,36.219978],[-84.296929,36.219478],[-84.29651,36.219112],[-84.296129,36.218778],[-84.295529,36.218178],[-84.294929,36.217678],[-84.294406,36.217312],[-84.294227,36.217187],[-84.293929,36.216978],[-84.293329,36.216578],[-84.293243,36.21652],[-84.292729,36.216178],[-84.292229,36.215978],[-84.291929,36.215778],[-84.291429,36.215378],[-84.291029,36.215278],[-84.290729,36.214678],[-84.290633,36.214371],[-84.290829,36.214078],[-84.290829,36.214057],[-84.290829,36.213778],[-84.290744,36.213636],[-84.290554,36.213319],[-84.290529,36.213278],[-84.289929,36.212678],[-84.289529,36.211978],[-84.289415,36.211864],[-84.289386,36.211835],[-84.289029,36.211478],[-84.288729,36.211278],[-84.288229,36.211178],[-84.287844,36.21089],[-84.287828,36.210878],[-84.287693,36.210743],[-84.287328,36.210378],[-84.287028,36.209878],[-84.286886,36.209679],[-84.286871,36.209659],[-84.286528,36.209178],[-84.286278,36.208805],[-84.28625,36.208762],[-84.286128,36.208578],[-84.285928,36.208078],[-84.285428,36.207578],[-84.284728,36.207178],[-84.283628,36.206878],[-84.282928,36.206678],[-84.282328,36.206578],[-84.281428,36.206078],[-84.280728,36.205578],[-84.279928,36.205178],[-84.279628,36.204778],[-84.278928,36.204178],[-84.278528,36.204078],[-84.277928,36.203778],[-84.277528,36.203478],[-84.276828,36.203078],[-84.276128,36.202678],[-84.275628,36.202478],[-84.275228,36.202278],[-84.274628,36.201878],[-84.274528,36.201878],[-84.272628,36.200278],[-84.272227,36.199678],[-84.271927,36.199078],[-84.271827,36.198378],[-84.271827,36.197625],[-84.271827,36.197578],[-84.271827,36.197078],[-84.271627,36.196578],[-84.271427,36.196078],[-84.270927,36.195478],[-84.270227,36.194878],[-84.269627,36.194578],[-84.268927,36.194178],[-84.268327,36.193878],[-84.268027,36.193778],[-84.267627,36.193278],[-84.267554,36.193169],[-84.267427,36.192978],[-84.26729,36.192895],[-84.267179,36.192829],[-84.266927,36.192678],[-84.266427,36.192178],[-84.266127,36.191778],[-84.265627,36.191078],[-84.265427,36.190678],[-84.265127,36.189878],[-84.264727,36.189178],[-84.264727,36.188778],[-84.264527,36.188278],[-84.264127,36.188178],[-84.263427,36.188378],[-84.263149,36.188447],[-84.262627,36.188578],[-84.261327,36.188878],[-84.260627,36.189078],[-84.259827,36.189678],[-84.259627,36.189778],[-84.259227,36.189978],[-84.259027,36.190078],[-84.258827,36.190078],[-84.258627,36.190078],[-84.258127,36.189878],[-84.257527,36.189378],[-84.257026,36.188978],[-84.256626,36.188678],[-84.256126,36.188278],[-84.255626,36.187878],[-84.255126,36.187678],[-84.254726,36.187478],[-84.254226,36.187178],[-84.253926,36.186878],[-84.253526,36.186678],[-84.253326,36.186578],[-84.253126,36.186178],[-84.253026,36.185878],[-84.252826,36.185478],[-84.252626,36.185178],[-84.252426,36.184678],[-84.252426,36.184578],[-84.252326,36.184078],[-84.252326,36.183578],[-84.252026,36.183178],[-84.251626,36.182878],[-84.251226,36.182778],[-84.251026,36.182678],[-84.250826,36.182478],[-84.250726,36.182478],[-84.250326,36.182178],[-84.250126,36.182178],[-84.249926,36.182178],[-84.249926,36.182278],[-84.249826,36.182178],[-84.249426,36.181978],[-84.249226,36.181778],[-84.249026,36.181478],[-84.248826,36.181278],[-84.248526,36.181078],[-84.248226,36.180978],[-84.247826,36.180878],[-84.247477,36.18079],[-84.247426,36.180778],[-84.246926,36.180578],[-84.246526,36.180478],[-84.246126,36.180278],[-84.245826,36.179778],[-84.245526,36.179378],[-84.245126,36.179178],[-84.244726,36.178978],[-84.244226,36.178978],[-84.243426,36.178978],[-84.243126,36.178978],[-84.243026,36.178978],[-84.242726,36.178578],[-84.242225,36.177978],[-84.242125,36.177878],[-84.241925,36.177678],[-84.241825,36.177578],[-84.241325,36.177578],[-84.240325,36.177778],[-84.239457,36.178038],[-84.239325,36.178078],[-84.238625,36.178278],[-84.237925,36.178378],[-84.237325,36.178478],[-84.237125,36.178678],[-84.236425,36.179178],[-84.236425,36.179278],[-84.236225,36.179678],[-84.235925,36.179978],[-84.235425,36.180378],[-84.235225,36.180578],[-84.234725,36.180778],[-84.234225,36.180978],[-84.233925,36.180978],[-84.233325,36.181078],[-84.2329,36.181332],[-84.232825,36.181378],[-84.232525,36.181578],[-84.231825,36.181778],[-84.231425,36.181778],[-84.231025,36.181778],[-84.230525,36.181878],[-84.230468,36.181934],[-84.230325,36.182078],[-84.230325,36.182378],[-84.230259,36.182573],[-84.230225,36.182678],[-84.229925,36.182978],[-84.229725,36.183278],[-84.229279,36.183813],[-84.229225,36.183878],[-84.229136,36.18432],[-84.229025,36.184878],[-84.228991,36.185014],[-84.228725,36.186078],[-84.228725,36.186678],[-84.228725,36.187378],[-84.228824,36.187725],[-84.228925,36.188078],[-84.229025,36.189078],[-84.229325,36.189878],[-84.229725,36.190378],[-84.230225,36.190678],[-84.231525,36.191778],[-84.231425,36.192378],[-84.231225,36.192878],[-84.231125,36.193078],[-84.230525,36.193778],[-84.230425,36.194078],[-84.230233,36.194556],[-84.230225,36.194578],[-84.230025,36.195278],[-84.229825,36.195978],[-84.229725,36.196579],[-84.229725,36.197179],[-84.229742,36.197247],[-84.229767,36.197348],[-84.229825,36.197579],[-84.229867,36.197642],[-84.229926,36.19773],[-84.230017,36.197866],[-84.230226,36.198179],[-84.230309,36.198262],[-84.230426,36.198379],[-84.230526,36.198479],[-84.230626,36.198779],[-84.230267,36.199584],[-84.230226,36.199679],[-84.229826,36.200879],[-84.229726,36.201679],[-84.229926,36.202479],[-84.230126,36.203279],[-84.230173,36.203467],[-84.230226,36.203679],[-84.230426,36.203979],[-84.230826,36.204279],[-84.231079,36.204342],[-84.231226,36.204379],[-84.231395,36.204548],[-84.231426,36.204579],[-84.231726,36.204979],[-84.232047,36.205519],[-84.232247,36.205856],[-84.232532,36.206151],[-84.232984,36.206619],[-84.233307,36.206954],[-84.233387,36.207037],[-84.233673,36.207333],[-84.234026,36.208079],[-84.234226,36.208379],[-84.234126,36.208679],[-84.233926,36.209079],[-84.233526,36.209579],[-84.233326,36.210079],[-84.233226,36.210479],[-84.233126,36.210979],[-84.232926,36.211679],[-84.232926,36.212179],[-84.232926,36.212679],[-84.232926,36.212979],[-84.232626,36.214079],[-84.232526,36.214579],[-84.232426,36.214579],[-84.231626,36.214679],[-84.230926,36.214879],[-84.230726,36.214879],[-84.230366,36.214968],[-84.229526,36.215179],[-84.227826,36.215879],[-84.227026,36.216179],[-84.226526,36.216379],[-84.226326,36.216479],[-84.226026,36.216879],[-84.225726,36.217179],[-84.225726,36.217379],[-84.225726,36.217479],[-84.225726,36.217879],[-84.225826,36.218079],[-84.225826,36.218279],[-84.225926,36.218579],[-84.225726,36.219179],[-84.225626,36.219479],[-84.225626,36.219579],[-84.226366,36.2206],[-84.228526,36.223579],[-84.229126,36.224179],[-84.229726,36.224579],[-84.229926,36.224879],[-84.229826,36.225079],[-84.229526,36.225279],[-84.229326,36.225579],[-84.229126,36.226179],[-84.229048,36.226799],[-84.229026,36.226979],[-84.228989,36.22724],[-84.228926,36.227679],[-84.228851,36.227943],[-84.228846,36.227959],[-84.228726,36.228379],[-84.228594,36.228908],[-84.228526,36.229179],[-84.228522,36.229193],[-84.228391,36.22963],[-84.228383,36.229653],[-84.228226,36.230179],[-84.228126,36.230679],[-84.228026,36.231479],[-84.228026,36.231879],[-84.227726,36.232279],[-84.227526,36.232879],[-84.227726,36.233279],[-84.228126,36.233679],[-84.228626,36.234079],[-84.228926,36.234279],[-84.229026,36.234479],[-84.228926,36.235079],[-84.228626,36.235579],[-84.228426,36.235879],[-84.228126,36.236579],[-84.228127,36.237179],[-84.228227,36.237679],[-84.228427,36.238279],[-84.228614,36.238592],[-84.228727,36.238779],[-84.228727,36.239479],[-84.228427,36.239779],[-84.228181,36.239828],[-84.227927,36.239879],[-84.227427,36.239879],[-84.226727,36.239979],[-84.226227,36.240379],[-84.226127,36.240679],[-84.226127,36.241479],[-84.226459,36.241811],[-84.226527,36.241879],[-84.227127,36.241979],[-84.227927,36.242279],[-84.228327,36.242479],[-84.228427,36.242879],[-84.228527,36.243679],[-84.228127,36.244179],[-84.227827,36.244579],[-84.227627,36.244779],[-84.227527,36.244879],[-84.225901,36.244687],[-84.220714,36.244078],[-84.220551,36.244059],[-84.210518,36.24288],[-84.20918,36.242723],[-84.201125,36.241778],[-84.199204,36.241556],[-84.192087,36.240736],[-84.19205,36.240731],[-84.191939,36.240718],[-84.191903,36.240714],[-84.191829,36.240705],[-84.191611,36.24068],[-84.19154,36.240673],[-84.191294,36.240643],[-84.190558,36.240557],[-84.190313,36.240529],[-84.190131,36.240508],[-84.189588,36.240446],[-84.189407,36.240426],[-84.188278,36.240295],[-84.184891,36.239905],[-84.183762,36.239775],[-84.183594,36.239755],[-84.183091,36.239697],[-84.182924,36.239678],[-84.182637,36.239689],[-84.181777,36.239724],[-84.181491,36.239736],[-84.180138,36.239791],[-84.176079,36.239959],[-84.174928,36.240007],[-84.174727,36.240015],[-84.174477,36.240025],[-84.173729,36.240057],[-84.17348,36.240068],[-84.173442,36.240069],[-84.173369,36.240072],[-84.173217,36.240079],[-84.17304,36.240086],[-84.17293,36.240091],[-84.171409,36.240153],[-84.170824,36.240178],[-84.166987,36.239119],[-84.16582,36.238798],[-84.165521,36.238713],[-84.165499,36.238707],[-84.165436,36.238689],[-84.165415,36.238684],[-84.16539,36.238677],[-84.165316,36.238656],[-84.165292,36.238649],[-84.164962,36.238556],[-84.163974,36.238279],[-84.163645,36.238187],[-84.163451,36.238132],[-84.162869,36.237968],[-84.162676,36.237914],[-84.16243,36.237844],[-84.161834,36.237677],[-84.161698,36.237639],[-84.161454,36.237571],[-84.161416,36.23756],[-84.161328,36.237535],[-84.161302,36.237527],[-84.161265,36.237518],[-84.161123,36.237478],[-84.160783,36.237474],[-84.15932,36.23746],[-84.158833,36.237456],[-84.157528,36.237443],[-84.153615,36.237406],[-84.152311,36.237394],[-84.150977,36.237382],[-84.150523,36.237378],[-84.150323,36.237378],[-84.14712,36.236406],[-84.145844,36.23602],[-84.145803,36.236008],[-84.145683,36.235972],[-84.145643,36.23596],[-84.145285,36.235851],[-84.144213,36.235525],[-84.143856,36.235417],[-84.143665,36.235359],[-84.143092,36.235186],[-84.142902,36.235129],[-84.142022,36.234877],[-84.141922,36.234877],[-84.141718,36.234672],[-84.140924,36.233976],[-84.140524,36.233776],[-84.140125,36.233676],[-84.138217,36.234261],[-84.137526,36.234473],[-84.137184,36.234302],[-84.137005,36.234219],[-84.136919,36.234166],[-84.136619,36.233865],[-84.136419,36.233766],[-84.136019,36.233766],[-84.135355,36.233766],[-84.135319,36.233766],[-84.134518,36.234067],[-84.13392,36.234466],[-84.133118,36.234767],[-84.132019,36.234468],[-84.131819,36.234168],[-84.13173,36.234101],[-84.130868,36.233987],[-84.130619,36.23407],[-84.130435,36.234138],[-84.12982,36.234371],[-84.128885,36.234697],[-84.128738,36.234744],[-84.128654,36.234734],[-84.128544,36.23472],[-84.128526,36.23471],[-84.128435,36.234659],[-84.127476,36.234122],[-84.127402,36.234081],[-84.126777,36.233874],[-84.125841,36.23398],[-84.125009,36.234293],[-84.12428,36.234191],[-84.124176,36.234087],[-84.124072,36.234087],[-84.123969,36.234056],[-84.12303,36.233777],[-84.122788,36.233778],[-84.122621,36.233778],[-84.122534,36.233756],[-84.122221,36.233678],[-84.121821,36.233678],[-84.121776,36.233678],[-84.121521,36.233678],[-84.121436,36.233678],[-84.121421,36.233678],[-84.121181,36.233678],[-84.121096,36.233678],[-84.120821,36.233678],[-84.12031,36.233678],[-84.120121,36.233678],[-84.119421,36.233678],[-84.118821,36.233778],[-84.117968,36.233863],[-84.117821,36.233878],[-84.117184,36.233878],[-84.117121,36.233878],[-84.116521,36.233778],[-84.115821,36.233778],[-84.115408,36.233836],[-84.115121,36.233878],[-84.114521,36.234078],[-84.114021,36.234078],[-84.113421,36.234078],[-84.112721,36.233978],[-84.112121,36.233978],[-84.111521,36.233978],[-84.110421,36.233878],[-84.110107,36.233773],[-84.109521,36.233578],[-84.108821,36.233378],[-84.108417,36.233198],[-84.107921,36.232978],[-84.107121,36.232678],[-84.106916,36.232637],[-84.106121,36.232478],[-84.105121,36.232278],[-84.104521,36.232078],[-84.104121,36.231678],[-84.104121,36.231078],[-84.104021,36.229978],[-84.104004,36.229896],[-84.10392,36.229478],[-84.10332,36.228878],[-84.103087,36.228645],[-84.103053,36.228611],[-84.102953,36.228511],[-84.10292,36.228478],[-84.102966,36.228347],[-84.103103,36.227964],[-84.103179,36.227841],[-84.103363,36.227495],[-84.103426,36.22738],[-84.103579,36.226764],[-84.103561,36.226355],[-84.103544,36.225964],[-84.103535,36.225842],[-84.103508,36.225478],[-84.103507,36.225454],[-84.103463,36.225368],[-84.103233,36.224914],[-84.103168,36.224855],[-84.102691,36.224424],[-84.101981,36.224185],[-84.101585,36.224151],[-84.100991,36.224102],[-84.100742,36.224081],[-84.100178,36.224017],[-84.099757,36.22397],[-84.099088,36.223748],[-84.098477,36.223387],[-84.098037,36.223276],[-84.097876,36.223285],[-84.097061,36.223334],[-84.096992,36.223337],[-84.096547,36.223278],[-84.096523,36.223275],[-84.095834,36.223133],[-84.095034,36.222925],[-84.094533,36.222796],[-84.094268,36.222727],[-84.094137,36.222693],[-84.093475,36.222521],[-84.093328,36.222483],[-84.09321,36.222459],[-84.093117,36.222447],[-84.092838,36.222411],[-84.092746,36.2224],[-84.092649,36.222418],[-84.09236,36.222474],[-84.092264,36.222494],[-84.092198,36.222506],[-84.092113,36.222523],[-84.092017,36.222579],[-84.09196,36.222613],[-84.091882,36.222646],[-84.091805,36.222679],[-84.091786,36.222687],[-84.091737,36.2228],[-84.091742,36.222842],[-84.091755,36.222931],[-84.091833,36.223048],[-84.09192,36.223178],[-84.092005,36.223434],[-84.09202,36.223478],[-84.092073,36.223558],[-84.09222,36.223778],[-84.092309,36.223926],[-84.09241,36.224093],[-84.09251,36.22426],[-84.092543,36.224352],[-84.092565,36.224419],[-84.09262,36.224578],[-84.09272,36.224778],[-84.09302,36.226278],[-84.09302,36.226778],[-84.09282,36.227378],[-84.09262,36.227878],[-84.09242,36.228178],[-84.09222,36.228578],[-84.09202,36.228778],[-84.09172,36.229078],[-84.09152,36.229278],[-84.091203,36.229348],[-84.09062,36.229478],[-84.08942,36.229678],[-84.08832,36.229878],[-84.08702,36.229878],[-84.08592,36.229878],[-84.085775,36.229846],[-84.085019,36.229678],[-84.084319,36.229578],[-84.083419,36.229478],[-84.082318,36.229078],[-84.081018,36.228578],[-84.079818,36.228178],[-84.078318,36.227878],[-84.076818,36.227678],[-84.075518,36.227678],[-84.074518,36.227778],[-84.073718,36.227878],[-84.072818,36.228178],[-84.072018,36.228578],[-84.071118,36.229178],[-84.070318,36.229878],[-84.069918,36.230378],[-84.069618,36.230978],[-84.069418,36.231578],[-84.069318,36.232078],[-84.069218,36.232978],[-84.069218,36.233578],[-84.069319,36.234278],[-84.069419,36.235178],[-84.069619,36.235778],[-84.069819,36.236678],[-84.070119,36.237178],[-84.070319,36.237678],[-84.070819,36.238178],[-84.071219,36.238478],[-84.071919,36.238878],[-84.072519,36.239178],[-84.073119,36.239578],[-84.073819,36.239978],[-84.074419,36.240478],[-84.075219,36.241078],[-84.075619,36.241578],[-84.07592,36.241878],[-84.07612,36.242478],[-84.07622,36.243178],[-84.07632,36.244078],[-84.07632,36.244678],[-84.07632,36.245378],[-84.07632,36.246078],[-84.07622,36.246678],[-84.07612,36.247278],[-84.07602,36.247878],[-84.07582,36.248378],[-84.07562,36.248778],[-84.07552,36.249078],[-84.07542,36.249278],[-84.07492,36.250078],[-84.073707,36.251122],[-84.07309,36.251652],[-84.072698,36.251989],[-84.072542,36.252063],[-84.072435,36.252162],[-84.072135,36.252264],[-84.071841,36.252265],[-84.071734,36.252266],[-84.071433,36.252167],[-84.071132,36.252169],[-84.070731,36.25207],[-84.07053,36.251971],[-84.070229,36.251873],[-84.069926,36.251674],[-84.069725,36.251474],[-84.069524,36.251375],[-84.069392,36.251179],[-84.069322,36.251075],[-84.069021,36.250877],[-84.068815,36.25067],[-84.068721,36.250579],[-84.068706,36.250569],[-84.068119,36.250178],[-84.067919,36.250078],[-84.067219,36.249278],[-84.066919,36.249078],[-84.066642,36.248732],[-84.066519,36.248578],[-84.066119,36.248178],[-84.065519,36.247878],[-84.065019,36.247578],[-84.064619,36.247378],[-84.063919,36.247178],[-84.063119,36.246978],[-84.063019,36.246978],[-84.062819,36.246978],[-84.062219,36.246978],[-84.061519,36.247178],[-84.060919,36.247278],[-84.060319,36.247478],[-84.059719,36.247678],[-84.059219,36.247878],[-84.058924,36.248025],[-84.058819,36.248078],[-84.058519,36.248278],[-84.058119,36.248678],[-84.057919,36.248878],[-84.057619,36.249078],[-84.057519,36.249478],[-84.057319,36.249678],[-84.057219,36.250078],[-84.057219,36.250178],[-84.057119,36.250578],[-84.057135,36.25066],[-84.057219,36.251078],[-84.057519,36.251678],[-84.057617,36.252364],[-84.057619,36.252378],[-84.057719,36.252544],[-84.057819,36.252711],[-84.057919,36.252878],[-84.058019,36.253678],[-84.058119,36.254278],[-84.058219,36.255278],[-84.058319,36.255978],[-84.058219,36.256278],[-84.058219,36.256778],[-84.058119,36.257278],[-84.057919,36.258078],[-84.057718,36.258814],[-84.057619,36.259178],[-84.057419,36.259878],[-84.057319,36.260578],[-84.057019,36.261378],[-84.056619,36.262178],[-84.056119,36.262878],[-84.055419,36.263678],[-84.054989,36.26403],[-84.054319,36.264578],[-84.053898,36.264841],[-84.053519,36.265078],[-84.052603,36.265827],[-84.05255,36.26587],[-84.052419,36.265978],[-84.051219,36.266878],[-84.050319,36.267578],[-84.049219,36.268278],[-84.048019,36.269178],[-84.046919,36.269978],[-84.046019,36.270578],[-84.045245,36.271158],[-84.045219,36.271178],[-84.044119,36.272178],[-84.043319,36.272978],[-84.042519,36.273878],[-84.041919,36.274578],[-84.041419,36.275278],[-84.04126,36.275649],[-84.041218,36.275746],[-84.041177,36.275843],[-84.041119,36.275978],[-84.040919,36.276578],[-84.040919,36.276978],[-84.041019,36.277578],[-84.041219,36.278178],[-84.041447,36.27871],[-84.041519,36.278878],[-84.041719,36.279478],[-84.041919,36.280278],[-84.042119,36.280878],[-84.042119,36.281678],[-84.042019,36.282578],[-84.041743,36.28313],[-84.041719,36.283178],[-84.041219,36.283778],[-84.041019,36.284478],[-84.041003,36.284496],[-84.040519,36.285078],[-84.039319,36.285778],[-84.038519,36.286278],[-84.037819,36.286678],[-84.036819,36.287278],[-84.035619,36.287978],[-84.034919,36.288578],[-84.034319,36.289278],[-84.033719,36.290178],[-84.033219,36.291078],[-84.032819,36.292178],[-84.032719,36.293078],[-84.033019,36.293778],[-84.033092,36.293862],[-84.037619,36.299078],[-84.037619,36.299378],[-84.037519,36.299978],[-84.037183,36.300314],[-84.036819,36.300678],[-84.035819,36.301278],[-84.034719,36.301578],[-84.033719,36.301779],[-84.032519,36.301779],[-84.031319,36.301379],[-84.031113,36.301287],[-84.030419,36.300979],[-84.029519,36.300379],[-84.028519,36.299579],[-84.027719,36.298679],[-84.027119,36.297879],[-84.026519,36.297079],[-84.026453,36.296915],[-84.026319,36.296579],[-84.026119,36.296079],[-84.025919,36.295479],[-84.025819,36.294579],[-84.025774,36.294179],[-84.025768,36.294131],[-84.025731,36.293809],[-84.025717,36.293678],[-84.02578,36.292844],[-84.025806,36.292522],[-84.025818,36.292378],[-84.025918,36.291578],[-84.026018,36.290678],[-84.025918,36.289678],[-84.026018,36.289078],[-84.025718,36.288178],[-84.025518,36.287278],[-84.025318,36.286278],[-84.025218,36.285178],[-84.025218,36.284703],[-84.025218,36.284078],[-84.025318,36.283178],[-84.025342,36.282939],[-84.025418,36.282178],[-84.025618,36.281478],[-84.025718,36.280878],[-84.025741,36.280761],[-84.025818,36.280378],[-84.025823,36.280328],[-84.025918,36.279278],[-84.025718,36.278478],[-84.02546,36.277834],[-84.025318,36.277478],[-84.024854,36.276781],[-84.024718,36.276578],[-84.024118,36.275778],[-84.023618,36.275278],[-84.023318,36.274878],[-84.023018,36.274378],[-84.022818,36.273878],[-84.022418,36.273178],[-84.022018,36.272678],[-84.021518,36.272278],[-84.020818,36.271878],[-84.019918,36.271378],[-84.019018,36.271178],[-84.018418,36.271078],[-84.017318,36.271078],[-84.016568,36.271172],[-84.016518,36.271178],[-84.015917,36.271278],[-84.015594,36.271399],[-84.015117,36.271578],[-84.014517,36.271678],[-84.014217,36.271878],[-84.013417,36.271978],[-84.012817,36.272078],[-84.012217,36.272078],[-84.012017,36.272078],[-84.012003,36.272081],[-84.011617,36.272178],[-84.011317,36.272178],[-84.010917,36.272178],[-84.00943,36.271772],[-84.006874,36.271075],[-84.004317,36.270378],[-84.00369,36.270365],[-84.002594,36.270542],[-84.002114,36.270621],[-84.00072,36.271647],[-84.000218,36.273483],[-84.000229,36.273763],[-84.000259,36.27457],[-84.000281,36.275138],[-84.000271,36.276307],[-84.000267,36.276608],[-84.000264,36.276892],[-84.000213,36.277105],[-84.000111,36.277275],[-84.000026,36.277417],[-84.000012,36.277452],[-83.999958,36.277602],[-83.999917,36.277738],[-83.999865,36.278275],[-83.999813,36.278812],[-83.999804,36.278903],[-83.999661,36.28037],[-83.999328,36.281382],[-83.998569,36.281995],[-83.998537,36.282022],[-83.997617,36.282678],[-83.996617,36.283078],[-83.995717,36.283278],[-83.99524,36.283414],[-83.995017,36.283478],[-83.993617,36.283578],[-83.992717,36.283678],[-83.991717,36.283578],[-83.990717,36.283378],[-83.989717,36.283178],[-83.988817,36.282978],[-83.987906,36.282627],[-83.987517,36.282478],[-83.986817,36.282078],[-83.986217,36.281778],[-83.985817,36.281478],[-83.985717,36.281478],[-83.985584,36.281757],[-83.985185,36.282596],[-83.985053,36.282876],[-83.984805,36.283396],[-83.984063,36.284957],[-83.983817,36.285478],[-83.982976,36.285328],[-83.981016,36.284978],[-83.981376,36.285417],[-83.981917,36.286078],[-83.982156,36.286678],[-83.982876,36.288478],[-83.983117,36.289078],[-83.983117,36.289178],[-83.981642,36.290011],[-83.980817,36.290478],[-83.979117,36.292078],[-83.979717,36.292678],[-83.97869,36.293388],[-83.978417,36.293578],[-83.979217,36.294678],[-83.979317,36.294678],[-83.978939,36.294934],[-83.977807,36.295703],[-83.97743,36.29596],[-83.975522,36.297255],[-83.974017,36.298278],[-83.976217,36.300878],[-83.976782,36.302474],[-83.977552,36.304648],[-83.977625,36.304854],[-83.977844,36.305472],[-83.977917,36.305678],[-83.976403,36.305772],[-83.976317,36.305778],[-83.976117,36.306178],[-83.974017,36.306378],[-83.974274,36.308268],[-83.974317,36.308578],[-83.973117,36.308678],[-83.973397,36.309177],[-83.974237,36.310677],[-83.974517,36.311178],[-83.974177,36.311418],[-83.973157,36.312138],[-83.972817,36.312378],[-83.972578,36.315622],[-83.971861,36.325356],[-83.971623,36.328601],[-83.971617,36.328678],[-83.971297,36.329556],[-83.970445,36.331907],[-83.970262,36.332411],[-83.969917,36.333363],[-83.969917,36.333386],[-83.969917,36.333455],[-83.969917,36.333478],[-83.97017,36.335015],[-83.970931,36.339627],[-83.971185,36.341165],[-83.971266,36.341656],[-83.971347,36.342146],[-83.971368,36.342279],[-83.971418,36.342578],[-83.971147,36.343238],[-83.970567,36.344652],[-83.970246,36.345432],[-83.969987,36.346066],[-83.969902,36.346272],[-83.969818,36.346478],[-83.969618,36.346478],[-83.969418,36.346378],[-83.968818,36.346278],[-83.968018,36.345978],[-83.967629,36.3459],[-83.967337,36.345841],[-83.967018,36.345778],[-83.966018,36.345578],[-83.965218,36.345178],[-83.964117,36.344678],[-83.963117,36.344478],[-83.962617,36.344678],[-83.962017,36.345378],[-83.961817,36.345978],[-83.961717,36.346778],[-83.961819,36.347135],[-83.961918,36.347478],[-83.962306,36.347963],[-83.962318,36.347978],[-83.962818,36.348278],[-83.962832,36.348289],[-83.963318,36.348678],[-83.963618,36.348878],[-83.964578,36.350017],[-83.965102,36.35064],[-83.966585,36.352401],[-83.967102,36.353014],[-83.967458,36.353437],[-83.967618,36.353628],[-83.968018,36.354103],[-83.968418,36.354578],[-83.968418,36.354678],[-83.968318,36.354778],[-83.968018,36.354878],[-83.967968,36.354878],[-83.967888,36.354878],[-83.967718,36.354878],[-83.966918,36.354978],[-83.966162,36.355103],[-83.965718,36.355178],[-83.965566,36.355214],[-83.965212,36.355297],[-83.964153,36.355546],[-83.964018,36.355578],[-83.963818,36.355678],[-83.963058,36.35582],[-83.962218,36.355978],[-83.960778,36.356239],[-83.960018,36.356378],[-83.959112,36.356649],[-83.959018,36.356678],[-83.957618,36.357078],[-83.956818,36.357478],[-83.956545,36.35775],[-83.956518,36.357778],[-83.956718,36.358478],[-83.956844,36.358604],[-83.957118,36.358878],[-83.957718,36.359178],[-83.958118,36.359178],[-83.959018,36.359078],[-83.959145,36.359056],[-83.959618,36.358978],[-83.960518,36.358778],[-83.961518,36.358478],[-83.961918,36.358278],[-83.962518,36.358078],[-83.962818,36.358078],[-83.963118,36.358178],[-83.963218,36.358278],[-83.963518,36.358278],[-83.963818,36.358378],[-83.964018,36.358478],[-83.964203,36.358601],[-83.964318,36.358678],[-83.964718,36.359178],[-83.964618,36.360078],[-83.964475,36.360505],[-83.964418,36.360678],[-83.964798,36.361058],[-83.964818,36.361078],[-83.964964,36.361322],[-83.965118,36.361578],[-83.965117,36.362178],[-83.965018,36.362278],[-83.964618,36.362412],[-83.963518,36.362778],[-83.963418,36.362778],[-83.963218,36.362278],[-83.962218,36.361378],[-83.960718,36.361078],[-83.960199,36.361147],[-83.959218,36.361278],[-83.957618,36.361678],[-83.955518,36.362478],[-83.954318,36.363078],[-83.953418,36.363678],[-83.952118,36.364878],[-83.951764,36.365384],[-83.951418,36.365878],[-83.950918,36.366878],[-83.950418,36.367778],[-83.949918,36.368978],[-83.949918,36.369978],[-83.950213,36.370764],[-83.950218,36.370778],[-83.950331,36.371004],[-83.950618,36.371578],[-83.950918,36.372078],[-83.951318,36.372578],[-83.951618,36.373278],[-83.952118,36.374178],[-83.952918,36.374978],[-83.952818,36.375078],[-83.953318,36.375778],[-83.953418,36.375878],[-83.953718,36.376078],[-83.954218,36.376278],[-83.954336,36.376349],[-83.954718,36.376578],[-83.955018,36.376778],[-83.955399,36.376887],[-83.955718,36.376978],[-83.956418,36.377178],[-83.956818,36.377378],[-83.957418,36.377678],[-83.957818,36.378078],[-83.958218,36.378578],[-83.958318,36.379278],[-83.958318,36.379778],[-83.958318,36.379978],[-83.95822,36.380056],[-83.957818,36.380378],[-83.956918,36.380978],[-83.956618,36.381078],[-83.956513,36.381148],[-83.956474,36.381174],[-83.956357,36.381252],[-83.956318,36.381278],[-83.955778,36.381858],[-83.954158,36.383598],[-83.953618,36.384178],[-83.953618,36.384578],[-83.953618,36.384929],[-83.953618,36.384978],[-83.953718,36.385078],[-83.954018,36.385878],[-83.954418,36.386578],[-83.954598,36.386938],[-83.954718,36.387178],[-83.954908,36.387623],[-83.955018,36.387878],[-83.955418,36.388678],[-83.955581,36.389037],[-83.955918,36.389778],[-83.956118,36.390678],[-83.956118,36.391578],[-83.955975,36.392222],[-83.955919,36.392478],[-83.955638,36.393227],[-83.955619,36.393278],[-83.955219,36.394078],[-83.954919,36.394678],[-83.954519,36.395478],[-83.954019,36.396178],[-83.953519,36.397078],[-83.953119,36.397878],[-83.95303,36.398189],[-83.952919,36.398578],[-83.952619,36.399378],[-83.952419,36.399978],[-83.952119,36.400378],[-83.951419,36.400978],[-83.950919,36.401278],[-83.950519,36.401278],[-83.950019,36.401078],[-83.949786,36.400891],[-83.949519,36.400678],[-83.948818,36.399878],[-83.948518,36.399578],[-83.948518,36.399478],[-83.948218,36.399278],[-83.947806,36.399031],[-83.947718,36.398978],[-83.947019,36.398803],[-83.946918,36.398778],[-83.945918,36.398578],[-83.944918,36.398378],[-83.944118,36.397978],[-83.943318,36.397378],[-83.943064,36.397124],[-83.942878,36.396938],[-83.94281,36.39687],[-83.942518,36.396578],[-83.941818,36.395878],[-83.941558,36.395618],[-83.941118,36.395178],[-83.940618,36.394878],[-83.940018,36.394578],[-83.939293,36.394361],[-83.939018,36.394278],[-83.938118,36.394178],[-83.937018,36.394178],[-83.936218,36.394378],[-83.935318,36.394378],[-83.934018,36.394178],[-83.933218,36.393978],[-83.933052,36.393915],[-83.932418,36.393678],[-83.931518,36.393178],[-83.930818,36.392478],[-83.930599,36.392281],[-83.929818,36.391578],[-83.929218,36.391078],[-83.928518,36.390378],[-83.927617,36.389578],[-83.927017,36.388979],[-83.926517,36.388479],[-83.925817,36.387879],[-83.925017,36.387579],[-83.924417,36.387379],[-83.924217,36.387279],[-83.922017,36.387579],[-83.921217,36.387879],[-83.920717,36.388279],[-83.920317,36.388679],[-83.919817,36.389179],[-83.919599,36.389434],[-83.919217,36.389879],[-83.918417,36.390579],[-83.917317,36.391579],[-83.916817,36.391979],[-83.916817,36.392179],[-83.916717,36.392179],[-83.916717,36.392279],[-83.916434,36.392603],[-83.916017,36.393079],[-83.915017,36.393979],[-83.914117,36.394579],[-83.913396,36.395011],[-83.913117,36.395179],[-83.912888,36.395294],[-83.912317,36.395579],[-83.911617,36.396079],[-83.910917,36.396579],[-83.910317,36.396979],[-83.909817,36.397379],[-83.908717,36.398079],[-83.907917,36.398679],[-83.907217,36.399079],[-83.906817,36.399479],[-83.906556,36.399738],[-83.906217,36.400079],[-83.905676,36.400889],[-83.905617,36.400979],[-83.905317,36.401479],[-83.905217,36.401779],[-83.905017,36.402479],[-83.904817,36.403279],[-83.904617,36.403979],[-83.904217,36.404679],[-83.904117,36.404879],[-83.904068,36.404888],[-83.903617,36.404979],[-83.903104,36.405236],[-83.902817,36.405379],[-83.902717,36.405379],[-83.902954,36.405693],[-83.903191,36.406007],[-83.90396,36.407026],[-83.904717,36.408028],[-83.904769,36.408198],[-83.904926,36.408429],[-83.905232,36.408749],[-83.905334,36.408846],[-83.905376,36.408901],[-83.905405,36.408939],[-83.906427,36.410342],[-83.910819,36.413378],[-83.905817,36.413279],[-83.903917,36.417079],[-83.903895,36.417122],[-83.903317,36.418279],[-83.908355,36.419759],[-83.905638,36.419979],[-83.905533,36.419979],[-83.905221,36.419979],[-83.905117,36.419979],[-83.90376,36.419932],[-83.902217,36.419879],[-83.902117,36.419879],[-83.901917,36.419879],[-83.901517,36.419779],[-83.901017,36.419679],[-83.900417,36.419479],[-83.899917,36.419379],[-83.899757,36.419339],[-83.899517,36.419279],[-83.899017,36.419279],[-83.898517,36.419179],[-83.898417,36.419179],[-83.897577,36.419319],[-83.895057,36.419739],[-83.894217,36.419879],[-83.893717,36.419679],[-83.893678,36.419727],[-83.892917,36.420679],[-83.892917,36.420879],[-83.892817,36.420979],[-83.892717,36.420979],[-83.892629,36.421088],[-83.892317,36.421479],[-83.892317,36.421579],[-83.891947,36.421896],[-83.89165,36.42215],[-83.891521,36.422262],[-83.891334,36.422422],[-83.889517,36.423979],[-83.889417,36.424079],[-83.889217,36.424479],[-83.889117,36.424679],[-83.889117,36.424879],[-83.889117,36.425179],[-83.889217,36.425379],[-83.889317,36.425779],[-83.889317,36.425879],[-83.889819,36.426591],[-83.890517,36.427579],[-83.890617,36.427779],[-83.890817,36.427979],[-83.891117,36.428179],[-83.891317,36.428379],[-83.891417,36.428379],[-83.891417,36.428479],[-83.892617,36.428979],[-83.892265,36.429364],[-83.89121,36.430518],[-83.890859,36.430904],[-83.890811,36.430956],[-83.890517,36.431279],[-83.890462,36.431137],[-83.889753,36.429293],[-83.889517,36.428679],[-83.888117,36.428779],[-83.886384,36.424408],[-83.884737,36.421325],[-83.884389,36.421554],[-83.876546,36.426714],[-83.876409,36.426806],[-83.876017,36.427079],[-83.876117,36.427279],[-83.876117,36.427379],[-83.876217,36.427579],[-83.876117,36.427879],[-83.876117,36.428179],[-83.876017,36.428679],[-83.876117,36.428979],[-83.876217,36.429379],[-83.876317,36.429779],[-83.876517,36.430379],[-83.876517,36.430479],[-83.876217,36.430879],[-83.875717,36.430379],[-83.874917,36.430629],[-83.874217,36.430779],[-83.873917,36.430879],[-83.870817,36.431079],[-83.869971,36.431396],[-83.867436,36.432346],[-83.866591,36.432664],[-83.866011,36.432881],[-83.864273,36.433532],[-83.863694,36.43375],[-83.863208,36.433932],[-83.861752,36.434477],[-83.861267,36.43466],[-83.861217,36.434679],[-83.861216,36.434579],[-83.860416,36.433979],[-83.860316,36.433979],[-83.859816,36.433779],[-83.859739,36.433747],[-83.858116,36.433079],[-83.858016,36.433179],[-83.858016,36.433079],[-83.857916,36.432779],[-83.857616,36.432379],[-83.857516,36.432279],[-83.857416,36.432079],[-83.855216,36.431479],[-83.855216,36.431579],[-83.853516,36.431879],[-83.853421,36.431647],[-83.853136,36.430952],[-83.853041,36.430721],[-83.852589,36.42962],[-83.851916,36.427979],[-83.85013,36.428164],[-83.849092,36.428272],[-83.848947,36.428287],[-83.847025,36.428487],[-83.841262,36.429086],[-83.839341,36.429287],[-83.839457,36.429122],[-83.839577,36.428914],[-83.839649,36.428791],[-83.839823,36.428469],[-83.839945,36.428217],[-83.840026,36.428069],[-83.840166,36.427784],[-83.84019,36.42774],[-83.840221,36.427686],[-83.840306,36.427511],[-83.840349,36.427432],[-83.840395,36.427378],[-83.840413,36.427363],[-83.840216,36.427179],[-83.837949,36.425617],[-83.837284,36.424711],[-83.837115,36.424479],[-83.836931,36.424571],[-83.836815,36.424479],[-83.836715,36.424479],[-83.836515,36.424379],[-83.836418,36.424377],[-83.836247,36.424295],[-83.836211,36.424271],[-83.836131,36.424195],[-83.836115,36.424179],[-83.835762,36.423943],[-83.83557,36.423815],[-83.835487,36.423758],[-83.835259,36.423522],[-83.835091,36.423273],[-83.834894,36.423078],[-83.834725,36.422827],[-83.834625,36.422694],[-83.834553,36.422493],[-83.834389,36.422001],[-83.834359,36.421911],[-83.834346,36.421873],[-83.834328,36.421818],[-83.834317,36.421785],[-83.834284,36.421716],[-83.83424,36.421634],[-83.834221,36.42159],[-83.834208,36.421559],[-83.834192,36.421507],[-83.834115,36.421279],[-83.834103,36.421256],[-83.834067,36.421184],[-83.834038,36.421124],[-83.834032,36.421113],[-83.834015,36.421079],[-83.834015,36.420992],[-83.83401,36.42088],[-83.834015,36.420679],[-83.83397,36.420601],[-83.83393,36.420532],[-83.833282,36.419654],[-83.833093,36.419749],[-83.832562,36.420034],[-83.829567,36.422091],[-83.829404,36.422203],[-83.829242,36.422314],[-83.829081,36.422425],[-83.828942,36.422519],[-83.828803,36.422616],[-83.828766,36.422641],[-83.822504,36.426944],[-83.822493,36.427001],[-83.822323,36.42723],[-83.821616,36.427756],[-83.821248,36.427802],[-83.821081,36.427917],[-83.820581,36.428263],[-83.820415,36.428379],[-83.820354,36.428478],[-83.820174,36.428778],[-83.820115,36.428879],[-83.820042,36.428904],[-83.819826,36.428981],[-83.819754,36.429008],[-83.817912,36.429664],[-83.817089,36.429957],[-83.815194,36.430633],[-83.812815,36.431479],[-83.809432,36.433518],[-83.80894,36.433815],[-83.807051,36.434953],[-83.807009,36.434978],[-83.806995,36.434985],[-83.806955,36.435009],[-83.806942,36.435018],[-83.806656,36.43519],[-83.8058,36.435706],[-83.805515,36.435879],[-83.805415,36.435679],[-83.805215,36.435379],[-83.805115,36.435079],[-83.805015,36.434779],[-83.805015,36.434679],[-83.805015,36.434479],[-83.804915,36.434379],[-83.804915,36.434179],[-83.804715,36.434079],[-83.804615,36.433979],[-83.804415,36.433779],[-83.804315,36.433579],[-83.804315,36.433379],[-83.804215,36.433079],[-83.804115,36.432879],[-83.803915,36.432579],[-83.803815,36.432479],[-83.803615,36.432379],[-83.803515,36.432279],[-83.803515,36.432179],[-83.803315,36.432079],[-83.803215,36.432179],[-83.803174,36.432219],[-83.803015,36.432379],[-83.802915,36.432479],[-83.802715,36.432579],[-83.802515,36.432679],[-83.802315,36.432779],[-83.802014,36.432779],[-83.801314,36.432779],[-83.800914,36.432779],[-83.800714,36.432779],[-83.800514,36.432779],[-83.800414,36.432679],[-83.800214,36.432379],[-83.800014,36.432179],[-83.800014,36.431879],[-83.800014,36.431679],[-83.800014,36.431279],[-83.800014,36.430879],[-83.799914,36.430679],[-83.799814,36.430579],[-83.799814,36.430479],[-83.799514,36.430379],[-83.799314,36.430279],[-83.799014,36.430179],[-83.798914,36.429979],[-83.798914,36.429879],[-83.798814,36.429779],[-83.798614,36.429579],[-83.798714,36.429379],[-83.798714,36.429179],[-83.798714,36.428979],[-83.798714,36.428779],[-83.798714,36.428479],[-83.798814,36.428279],[-83.798914,36.428079],[-83.799014,36.427979],[-83.799414,36.427879],[-83.799714,36.427779],[-83.800114,36.427679],[-83.800214,36.427679],[-83.800514,36.427579],[-83.800614,36.427579],[-83.800914,36.427379],[-83.801014,36.427279],[-83.801014,36.427179],[-83.801214,36.426979],[-83.801414,36.426879],[-83.801614,36.426779],[-83.801914,36.426579],[-83.802214,36.426479],[-83.802514,36.426279],[-83.802814,36.426179],[-83.803114,36.426079],[-83.803414,36.425979],[-83.803514,36.425779],[-83.803614,36.425579],[-83.803714,36.425479],[-83.803914,36.425279],[-83.803938,36.425279],[-83.804114,36.425279],[-83.804414,36.425079],[-83.804714,36.424879],[-83.805014,36.424579],[-83.805214,36.424179],[-83.805314,36.424079],[-83.805514,36.423879],[-83.805714,36.423679],[-83.805914,36.423379],[-83.806014,36.423379],[-83.806114,36.423179],[-83.806514,36.422879],[-83.806714,36.422879],[-83.807014,36.422679],[-83.807414,36.422579],[-83.807616,36.422477],[-83.807627,36.422472],[-83.807675,36.422456],[-83.807854,36.422398],[-83.807914,36.422379],[-83.8078,36.422099],[-83.807736,36.421939],[-83.807687,36.421817],[-83.807203,36.42062],[-83.807134,36.420448],[-83.807026,36.420181],[-83.806823,36.41968],[-83.806216,36.418179],[-83.806014,36.417679],[-83.805914,36.417479],[-83.805714,36.417179],[-83.805614,36.416879],[-83.805514,36.416679],[-83.805414,36.416579],[-83.805214,36.416479],[-83.805014,36.416379],[-83.804914,36.416379],[-83.804614,36.416379],[-83.804414,36.416379],[-83.804214,36.416579],[-83.803714,36.416879],[-83.803414,36.417079],[-83.803414,36.417179],[-83.803314,36.417179],[-83.803214,36.417279],[-83.803127,36.417279],[-83.803014,36.417379],[-83.802914,36.417479],[-83.802814,36.417479],[-83.802714,36.417579],[-83.802614,36.417579],[-83.802606,36.417587],[-83.802419,36.417779],[-83.802322,36.417879],[-83.802421,36.417877],[-83.802328,36.418273],[-83.801277,36.418193],[-83.801243,36.418191],[-83.801243,36.418277],[-83.801243,36.418291],[-83.801243,36.418892],[-83.801042,36.419693],[-83.800842,36.420294],[-83.800842,36.420895],[-83.800842,36.421395],[-83.800742,36.421796],[-83.800642,36.421996],[-83.800442,36.422297],[-83.800241,36.422497],[-83.800141,36.422597],[-83.799841,36.422898],[-83.79944,36.423298],[-83.79894,36.423599],[-83.798639,36.423799],[-83.798038,36.4241],[-83.797738,36.4241],[-83.796636,36.4241],[-83.796436,36.4241],[-83.796236,36.4241],[-83.795535,36.4241],[-83.795434,36.4241],[-83.795034,36.4241],[-83.794733,36.424],[-83.794233,36.4239],[-83.794032,36.4238],[-83.793532,36.4237],[-83.793431,36.423599],[-83.793031,36.423399],[-83.793004,36.423372],[-83.792931,36.423299],[-83.79273,36.423099],[-83.79253,36.422798],[-83.79233,36.422398],[-83.79223,36.422097],[-83.792129,36.421797],[-83.792029,36.421496],[-83.792029,36.421196],[-83.791929,36.420896],[-83.792029,36.420595],[-83.792129,36.420194],[-83.792329,36.419894],[-83.79253,36.419694],[-83.79273,36.419493],[-83.792839,36.419384],[-83.79303,36.419193],[-83.793331,36.418993],[-83.793531,36.418692],[-83.793832,36.418492],[-83.794032,36.418291],[-83.794132,36.418191],[-83.794232,36.418191],[-83.795033,36.41749],[-83.795133,36.41749],[-83.795534,36.41719],[-83.795734,36.416989],[-83.796035,36.416789],[-83.796235,36.416488],[-83.796435,36.416188],[-83.796535,36.415888],[-83.796635,36.415687],[-83.796736,36.415387],[-83.796735,36.414986],[-83.796635,36.414786],[-83.796299,36.414353],[-83.795934,36.413885],[-83.795834,36.413785],[-83.795634,36.413584],[-83.795433,36.413584],[-83.795133,36.413284],[-83.794432,36.413084],[-83.794031,36.412984],[-83.79343,36.412783],[-83.792829,36.412583],[-83.792228,36.412383],[-83.791828,36.412283],[-83.791427,36.412082],[-83.791127,36.411982],[-83.790726,36.411782],[-83.790326,36.411582],[-83.790225,36.411582],[-83.790025,36.411382],[-83.789825,36.411081],[-83.789523,36.410781],[-83.789323,36.41058],[-83.789268,36.410507],[-83.789022,36.41018],[-83.788722,36.409779],[-83.788221,36.409479],[-83.787821,36.409078],[-83.78732,36.408678],[-83.78722,36.408678],[-83.786893,36.408597],[-83.786819,36.408578],[-83.786318,36.408478],[-83.786018,36.408378],[-83.785818,36.408378],[-83.785617,36.408378],[-83.785116,36.408378],[-83.784516,36.408478],[-83.783815,36.408478],[-83.783314,36.408578],[-83.783013,36.408678],[-83.782713,36.408778],[-83.782413,36.408779],[-83.782047,36.40843],[-83.781789,36.40797],[-83.781617,36.407664],[-83.781495,36.407329],[-83.781332,36.406928],[-83.781094,36.406483],[-83.780571,36.405917],[-83.780476,36.40578],[-83.780429,36.405637],[-83.780435,36.405595],[-83.779478,36.405468],[-83.776607,36.405089],[-83.77565,36.404963],[-83.775522,36.404946],[-83.775253,36.404911],[-83.77514,36.404895],[-83.775013,36.404879],[-83.775113,36.404779],[-83.775213,36.404779],[-83.775313,36.404679],[-83.775413,36.404579],[-83.775613,36.404479],[-83.775813,36.404379],[-83.77593,36.40432],[-83.776013,36.404279],[-83.776061,36.404279],[-83.776213,36.404279],[-83.776413,36.404179],[-83.776713,36.403979],[-83.776913,36.403879],[-83.777113,36.403779],[-83.777213,36.403579],[-83.777413,36.403479],[-83.777613,36.403379],[-83.777713,36.403279],[-83.777913,36.403179],[-83.778013,36.403079],[-83.777995,36.403065],[-83.777368,36.402595],[-83.776714,36.402105],[-83.776487,36.401934],[-83.776413,36.401879],[-83.776113,36.401979],[-83.776078,36.401993],[-83.775768,36.402117],[-83.775701,36.402143],[-83.775613,36.402179],[-83.775113,36.402379],[-83.774613,36.402479],[-83.774313,36.402579],[-83.774013,36.402579],[-83.773913,36.402579],[-83.773713,36.402579],[-83.773513,36.402679],[-83.773413,36.402679],[-83.773313,36.402679],[-83.773241,36.402679],[-83.773013,36.402679],[-83.772813,36.402679],[-83.772613,36.402779],[-83.772548,36.402779],[-83.772413,36.402779],[-83.771172,36.402059],[-83.770065,36.401416],[-83.767452,36.399899],[-83.766212,36.399179],[-83.765871,36.399099],[-83.764851,36.398859],[-83.764512,36.398779],[-83.764648,36.398496],[-83.765056,36.397647],[-83.765156,36.397442],[-83.765193,36.397365],[-83.765316,36.397107],[-83.765687,36.396336],[-83.765812,36.396079],[-83.765712,36.396079],[-83.765411,36.396003],[-83.765312,36.395979],[-83.764713,36.395481],[-83.762919,36.393988],[-83.762571,36.393699],[-83.762321,36.393492],[-83.761979,36.393209],[-83.760953,36.392361],[-83.760612,36.392079],[-83.760512,36.391979],[-83.760256,36.391575],[-83.759312,36.39008],[-83.759399,36.390067],[-83.760012,36.389979],[-83.759752,36.389479],[-83.758972,36.387979],[-83.758712,36.38748],[-83.758712,36.38728],[-83.758656,36.386947],[-83.758612,36.38668],[-83.758612,36.38648],[-83.758512,36.38628],[-83.758512,36.38588],[-83.758412,36.38548],[-83.758412,36.385375],[-83.758412,36.38528],[-83.758312,36.38518],[-83.758312,36.38508],[-83.758312,36.38488],[-83.758314,36.384604],[-83.758321,36.383915],[-83.758184,36.383936],[-83.757912,36.38398],[-83.754412,36.38388],[-83.754117,36.382848],[-83.754079,36.382715],[-83.753609,36.38107],[-83.752637,36.381062],[-83.751086,36.380463],[-83.751127,36.380379],[-83.751155,36.380306],[-83.750867,36.380204],[-83.750685,36.380117],[-83.750678,36.379892],[-83.750645,36.379634],[-83.750522,36.379414],[-83.750523,36.379302],[-83.750523,36.379205],[-83.750519,36.37919],[-83.750462,36.378958],[-83.750419,36.37887],[-83.750371,36.378769],[-83.750335,36.378694],[-83.750228,36.378472],[-83.750193,36.378398],[-83.750061,36.378123],[-83.75002,36.378038],[-83.749913,36.377816],[-83.749766,36.377636],[-83.749725,36.377575],[-83.749671,36.377482],[-83.749611,36.377336],[-83.749555,36.377196],[-83.749487,36.377059],[-83.749412,36.376938],[-83.749358,36.376818],[-83.749324,36.376691],[-83.749249,36.376356],[-83.7492,36.376162],[-83.749153,36.376005],[-83.749113,36.375846],[-83.749126,36.375653],[-83.749167,36.375461],[-83.749221,36.375296],[-83.749228,36.375203],[-83.749186,36.374708],[-83.749223,36.374286],[-83.749218,36.374071],[-83.749206,36.373933],[-83.749201,36.373873],[-83.749163,36.37335],[-83.749151,36.373176],[-83.749144,36.372983],[-83.749177,36.372797],[-83.749272,36.372528],[-83.749304,36.372427],[-83.749289,36.372406],[-83.749282,36.372395],[-83.749021,36.37202],[-83.748668,36.37165],[-83.748275,36.371282],[-83.748101,36.371223],[-83.747941,36.37117],[-83.747501,36.371141],[-83.747189,36.37106],[-83.746138,36.370732],[-83.745186,36.370362],[-83.744498,36.370089],[-83.744054,36.369964],[-83.743432,36.369617],[-83.743365,36.369543],[-83.743141,36.369295],[-83.742969,36.368977],[-83.742763,36.368556],[-83.74266,36.368462],[-83.742547,36.36836],[-83.742559,36.368127],[-83.742692,36.367982],[-83.743092,36.367546],[-83.743226,36.367402],[-83.743249,36.367376],[-83.74332,36.367301],[-83.743345,36.367276],[-83.743594,36.367004],[-83.744342,36.366189],[-83.744592,36.365918],[-83.744811,36.36568],[-83.744711,36.36568],[-83.744668,36.365437],[-83.744319,36.36346],[-83.744203,36.362801],[-83.744184,36.362696],[-83.744129,36.362384],[-83.744111,36.36228],[-83.744066,36.362186],[-83.743932,36.361905],[-83.743888,36.361812],[-83.743803,36.361632],[-83.743639,36.361286],[-83.74382,36.361179],[-83.743992,36.361079],[-83.744207,36.36093],[-83.744855,36.360485],[-83.745071,36.360338],[-83.746234,36.359538],[-83.746611,36.35928],[-83.746316,36.358714],[-83.744863,36.355931],[-83.74421,36.35468],[-83.745578,36.354005],[-83.744801,36.353586],[-83.744299,36.353312],[-83.743089,36.353014],[-83.741045,36.352873],[-83.74065,36.35283],[-83.739589,36.352632],[-83.739169,36.352493],[-83.738944,36.352511],[-83.738544,36.352344],[-83.738488,36.352298],[-83.73816,36.352147],[-83.738147,36.352141],[-83.737881,36.351996],[-83.737823,36.351957],[-83.737588,36.351799],[-83.737579,36.351792],[-83.737315,36.351579],[-83.736928,36.3512],[-83.736921,36.351193],[-83.736712,36.351001],[-83.736578,36.350879],[-83.736273,36.3506],[-83.73616,36.350543],[-83.735999,36.350463],[-83.736029,36.350414],[-83.73612,36.35027],[-83.736151,36.350222],[-83.736262,36.350046],[-83.736433,36.349805],[-83.73641,36.34978],[-83.736125,36.349378],[-83.735639,36.348693],[-83.734184,36.346638],[-83.73391,36.346251],[-83.733699,36.345953],[-83.73357,36.345771],[-83.733183,36.345225],[-83.733054,36.345043],[-83.733045,36.34503],[-83.733018,36.344992],[-83.73301,36.34498],[-83.73291,36.34508],[-83.73271,36.34508],[-83.732426,36.345151],[-83.73231,36.34518],[-83.73191,36.34518],[-83.73161,36.34518],[-83.73121,36.34518],[-83.73071,36.34508],[-83.730501,36.345027],[-83.73031,36.34498],[-83.72991,36.34488],[-83.72971,36.34478],[-83.72941,36.34458],[-83.72881,36.344381],[-83.72831,36.344181],[-83.72781,36.344081],[-83.72721,36.343981],[-83.72661,36.343881],[-83.72611,36.343681],[-83.72541,36.343581],[-83.72481,36.343381],[-83.72441,36.343281],[-83.72411,36.343281],[-83.72381,36.343181],[-83.72341,36.343181],[-83.723109,36.343081],[-83.723087,36.343073],[-83.722809,36.342981],[-83.722509,36.342881],[-83.722209,36.342781],[-83.721809,36.342681],[-83.721409,36.342781],[-83.721009,36.342881],[-83.720709,36.342981],[-83.72062,36.343025],[-83.720309,36.343181],[-83.719909,36.343281],[-83.719309,36.343281],[-83.718809,36.343381],[-83.718409,36.343381],[-83.718009,36.343481],[-83.717209,36.343581],[-83.716609,36.343681],[-83.716209,36.343681],[-83.715709,36.343781],[-83.715209,36.343881],[-83.714809,36.343981],[-83.714409,36.344081],[-83.714009,36.344181],[-83.713509,36.344381],[-83.713109,36.344681],[-83.712709,36.344881],[-83.712409,36.344981],[-83.71222,36.345122],[-83.71208,36.345228],[-83.712009,36.345281],[-83.711709,36.345581],[-83.711409,36.345881],[-83.711109,36.346181],[-83.710909,36.346481],[-83.710874,36.346586],[-83.710809,36.346781],[-83.710709,36.346981],[-83.710609,36.347381],[-83.710509,36.347781],[-83.710409,36.348081],[-83.710309,36.348381],[-83.710209,36.348781],[-83.710009,36.349181],[-83.709809,36.349481],[-83.709609,36.349781],[-83.709409,36.350081],[-83.709041,36.350449],[-83.709009,36.350481],[-83.708709,36.350881],[-83.708509,36.351181],[-83.708209,36.351481],[-83.707909,36.351881],[-83.707609,36.352281],[-83.707409,36.352781],[-83.707309,36.353081],[-83.707109,36.353481],[-83.706909,36.353981],[-83.706809,36.354381],[-83.706809,36.354781],[-83.706709,36.355181],[-83.706609,36.355481],[-83.7066,36.355518],[-83.706509,36.355881],[-83.706309,36.356281],[-83.706109,36.356781],[-83.705909,36.357081],[-83.705709,36.357381],[-83.705509,36.357781],[-83.705384,36.357906],[-83.705209,36.358081],[-83.705009,36.358481],[-83.704808,36.358883],[-83.704609,36.359281],[-83.704409,36.359781],[-83.704009,36.360181],[-83.703809,36.360481],[-83.703609,36.360781],[-83.703309,36.361181],[-83.703009,36.361481],[-83.702759,36.361814],[-83.702709,36.361881],[-83.702636,36.361978],[-83.702409,36.362281],[-83.702109,36.362681],[-83.701609,36.362981],[-83.701209,36.363381],[-83.700809,36.363681],[-83.700409,36.363881],[-83.700109,36.364181],[-83.699709,36.364381],[-83.699409,36.364581],[-83.699009,36.364881],[-83.698609,36.365181],[-83.698309,36.365281],[-83.698009,36.365481],[-83.697609,36.365581],[-83.697319,36.365677],[-83.697309,36.365681],[-83.696909,36.365681],[-83.696409,36.365581],[-83.695909,36.365381],[-83.695409,36.365081],[-83.695109,36.364881],[-83.694809,36.364581],[-83.694666,36.364438],[-83.694409,36.364181],[-83.694109,36.363781],[-83.693809,36.363481],[-83.693409,36.363081],[-83.693009,36.362681],[-83.692609,36.362281],[-83.692409,36.361981],[-83.692109,36.361681],[-83.691709,36.361281],[-83.691309,36.360881],[-83.691109,36.360581],[-83.690709,36.360281],[-83.690109,36.359981],[-83.689509,36.359681],[-83.689469,36.359665],[-83.689009,36.359481],[-83.688509,36.359181],[-83.688009,36.358981],[-83.687509,36.358681],[-83.687019,36.358517],[-83.686909,36.358481],[-83.686309,36.358281],[-83.685709,36.358081],[-83.685209,36.357981],[-83.684809,36.357881],[-83.684409,36.357781],[-83.684109,36.357681],[-83.683709,36.357581],[-83.683209,36.357481],[-83.682409,36.357381],[-83.681909,36.357181],[-83.681409,36.356981],[-83.681009,36.356681],[-83.680609,36.356482],[-83.680526,36.35642],[-83.680208,36.356182],[-83.679808,36.355882],[-83.679408,36.355582],[-83.678908,36.355282],[-83.678608,36.354982],[-83.678208,36.354782],[-83.678008,36.354482],[-83.677708,36.354182],[-83.677408,36.353882],[-83.677208,36.353682],[-83.676808,36.353482],[-83.676408,36.353282],[-83.67626,36.353183],[-83.676108,36.353082],[-83.675808,36.352782],[-83.675708,36.352482],[-83.675508,36.352282],[-83.675308,36.351982],[-83.675008,36.351682],[-83.674708,36.351482],[-83.674308,36.351082],[-83.673908,36.350782],[-83.673608,36.350482],[-83.673392,36.350338],[-83.673308,36.350282],[-83.673143,36.350034],[-83.673108,36.349982],[-83.672808,36.349782],[-83.672608,36.349382],[-83.672308,36.349082],[-83.672298,36.349067],[-83.672108,36.348782],[-83.671708,36.348482],[-83.671308,36.348182],[-83.671008,36.347882],[-83.670708,36.347582],[-83.670408,36.347382],[-83.670208,36.347182],[-83.669908,36.346882],[-83.669508,36.346482],[-83.669008,36.346082],[-83.668708,36.345682],[-83.668576,36.345577],[-83.668208,36.345282],[-83.668108,36.344982],[-83.667408,36.344381],[-83.66752,36.344121],[-83.667858,36.343343],[-83.667971,36.343084],[-83.668318,36.342283],[-83.66936,36.339882],[-83.669708,36.339082],[-83.670446,36.339536],[-83.671008,36.339882],[-83.672008,36.339582],[-83.672108,36.339582],[-83.672108,36.339482],[-83.672308,36.339482],[-83.672408,36.339482],[-83.672508,36.339382],[-83.672608,36.339382],[-83.672708,36.339282],[-83.672722,36.339282],[-83.672808,36.339282],[-83.672908,36.339182],[-83.673408,36.338782],[-83.672668,36.338602],[-83.670448,36.338062],[-83.669708,36.337882],[-83.670868,36.335561],[-83.670908,36.335482],[-83.672408,36.335582],[-83.673308,36.336682],[-83.673408,36.336782],[-83.673508,36.336782],[-83.673508,36.336882],[-83.673608,36.336982],[-83.673708,36.337082],[-83.673808,36.337182],[-83.673908,36.337282],[-83.674008,36.337382],[-83.674108,36.337382],[-83.674208,36.337482],[-83.674208,36.337582],[-83.674308,36.337582],[-83.674408,36.337582],[-83.674508,36.337582],[-83.674708,36.337482],[-83.674808,36.337482],[-83.674908,36.337382],[-83.675108,36.337182],[-83.675208,36.337082],[-83.675508,36.336882],[-83.675608,36.336782],[-83.676008,36.336582],[-83.676308,36.336382],[-83.676508,36.336182],[-83.676708,36.335982],[-83.676808,36.335882],[-83.676962,36.335804],[-83.677008,36.335782],[-83.678708,36.334382],[-83.678808,36.334282],[-83.679008,36.334282],[-83.679208,36.334082],[-83.679508,36.333982],[-83.679808,36.333782],[-83.680208,36.333582],[-83.680608,36.333282],[-83.680908,36.333182],[-83.681308,36.332982],[-83.681408,36.332782],[-83.681508,36.332682],[-83.681608,36.332482],[-83.681708,36.332382],[-83.681808,36.332182],[-83.681908,36.331982],[-83.682108,36.331882],[-83.682208,36.331682],[-83.682308,36.331582],[-83.682308,36.331382],[-83.682208,36.331182],[-83.682108,36.330882],[-83.681808,36.330682],[-83.681508,36.330482],[-83.681208,36.330282],[-83.680808,36.330082],[-83.680608,36.329882],[-83.680408,36.329682],[-83.680108,36.329482],[-83.679808,36.329282],[-83.679508,36.329082],[-83.679208,36.328882],[-83.678908,36.328782],[-83.678708,36.328582],[-83.678408,36.328482],[-83.678208,36.328282],[-83.678108,36.328082],[-83.677808,36.327782],[-83.677724,36.327656],[-83.677608,36.327482],[-83.677408,36.327182],[-83.677208,36.326982],[-83.676908,36.326782],[-83.676608,36.326682],[-83.676508,36.326682],[-83.676308,36.326682],[-83.676208,36.326582],[-83.676108,36.326582],[-83.675908,36.326482],[-83.675808,36.326482],[-83.675708,36.326382],[-83.675608,36.326282],[-83.676373,36.324565],[-83.677585,36.321844],[-83.677631,36.321742],[-83.677665,36.321663],[-83.677769,36.321426],[-83.677804,36.321348],[-83.677867,36.321201],[-83.677882,36.321168],[-83.677961,36.320989],[-83.678042,36.320804],[-83.678059,36.320764],[-83.678123,36.320619],[-83.678486,36.319803],[-83.679565,36.317381],[-83.679576,36.317358],[-83.679711,36.317053],[-83.679941,36.31654],[-83.680483,36.315323],[-83.682114,36.311664],[-83.682659,36.310445],[-83.682668,36.310424],[-83.682696,36.31036],[-83.682706,36.31034],[-83.683463,36.308641],[-83.685375,36.304355],[-83.685736,36.303544],[-83.686494,36.301846],[-83.686505,36.301819],[-83.686509,36.301809],[-83.687522,36.299534],[-83.689107,36.295981],[-83.68561,36.296726],[-83.683176,36.297245],[-83.683146,36.29725],[-83.683062,36.297267],[-83.683038,36.297274],[-83.683007,36.297281],[-83.682787,36.296691],[-83.682098,36.29484],[-83.681869,36.294225],[-83.681873,36.294188],[-83.681887,36.294079],[-83.681892,36.294043],[-83.681899,36.293994],[-83.68193,36.293739],[-83.682049,36.292826],[-83.682086,36.292544],[-83.682088,36.292523],[-83.6821,36.292426],[-83.682134,36.292134],[-83.682147,36.292038],[-83.682183,36.292004],[-83.682259,36.29195],[-83.682528,36.291762],[-83.682617,36.291711],[-83.682742,36.291641],[-83.682868,36.29157],[-83.683078,36.291477],[-83.683329,36.291394],[-83.683845,36.291307],[-83.684021,36.29129],[-83.684123,36.291252],[-83.684292,36.291158],[-83.684353,36.291142],[-83.68453,36.291065],[-83.684869,36.290845],[-83.68507,36.290728],[-83.685201,36.290653],[-83.685466,36.290488],[-83.685555,36.290439],[-83.685569,36.29043],[-83.685615,36.290406],[-83.685799,36.290304],[-83.685846,36.290279],[-83.686144,36.290082],[-83.686333,36.289967],[-83.686443,36.289901],[-83.686504,36.289846],[-83.686507,36.289782],[-83.686507,36.289582],[-83.686507,36.289482],[-83.686607,36.289382],[-83.686595,36.289363],[-83.685607,36.287781],[-83.688207,36.286582],[-83.68772,36.285431],[-83.687107,36.283982],[-83.687678,36.281886],[-83.688007,36.280682],[-83.688407,36.280682],[-83.688607,36.280582],[-83.688807,36.280282],[-83.688907,36.279882],[-83.688907,36.279582],[-83.689107,36.279282],[-83.689507,36.279082],[-83.690007,36.279182],[-83.690507,36.279082],[-83.690548,36.27902],[-83.690707,36.278782],[-83.690907,36.278482],[-83.691107,36.278182],[-83.691607,36.277882],[-83.692207,36.277682],[-83.692807,36.277582],[-83.693207,36.277382],[-83.693507,36.277082],[-83.693907,36.276982],[-83.694307,36.276982],[-83.694607,36.276782],[-83.694907,36.276382],[-83.695107,36.276082],[-83.695507,36.275882],[-83.696007,36.275882],[-83.696607,36.275882],[-83.697207,36.275982],[-83.697607,36.275882],[-83.698107,36.275682],[-83.698507,36.275482],[-83.698807,36.275382],[-83.699107,36.275382],[-83.699307,36.275282],[-83.699607,36.275082],[-83.699859,36.274913],[-83.699907,36.274882],[-83.700107,36.274782],[-83.700407,36.274782],[-83.700607,36.274582],[-83.700907,36.274382],[-83.701207,36.274082],[-83.701407,36.273782],[-83.701607,36.273582],[-83.701807,36.273382],[-83.701907,36.273182],[-83.702107,36.273182],[-83.702207,36.273182],[-83.702307,36.273182],[-83.702407,36.273182],[-83.702507,36.273182],[-83.702607,36.273182],[-83.702707,36.273182],[-83.702949,36.270614],[-83.70305,36.269556],[-83.703679,36.262913],[-83.703735,36.262326],[-83.703922,36.260346],[-83.703931,36.259994],[-83.703958,36.258938],[-83.703967,36.258586],[-83.704039,36.257462],[-83.704074,36.256905],[-83.704398,36.251862],[-83.704507,36.250182],[-83.704407,36.250282],[-83.704307,36.250382],[-83.704207,36.250482],[-83.704107,36.250582],[-83.703807,36.250782],[-83.703507,36.250982],[-83.703106,36.251182],[-83.702828,36.251251],[-83.702706,36.251282],[-83.702206,36.251482],[-83.701706,36.251682],[-83.701406,36.251882],[-83.701106,36.252082],[-83.700806,36.252282],[-83.700406,36.252582],[-83.700106,36.252682],[-83.700006,36.252782],[-83.699706,36.252882],[-83.699506,36.252982],[-83.699206,36.253082],[-83.698906,36.253182],[-83.698606,36.253282],[-83.698206,36.253482],[-83.697806,36.253682],[-83.697506,36.253782],[-83.697386,36.253782],[-83.697206,36.253782],[-83.697106,36.253882],[-83.696906,36.253982],[-83.696806,36.253982],[-83.696606,36.254082],[-83.696506,36.254082],[-83.696306,36.254182],[-83.695606,36.254382],[-83.695506,36.254382],[-83.695418,36.2537],[-83.695156,36.251657],[-83.695082,36.251076],[-83.695069,36.250976],[-83.695035,36.250712],[-83.694955,36.250081],[-83.694938,36.249925],[-83.69491,36.249663],[-83.694907,36.249633],[-83.694649,36.247228],[-83.694006,36.241214],[-83.693868,36.23993],[-83.693608,36.237497],[-83.693606,36.237483],[-83.693586,36.237483],[-83.693526,36.237483],[-83.693506,36.237483],[-83.693524,36.237399],[-83.69358,36.237148],[-83.6936,36.237065],[-83.693628,36.236939],[-83.693674,36.236735],[-83.693712,36.236561],[-83.693741,36.236435],[-83.694251,36.234154],[-83.694419,36.233406],[-83.695106,36.23034],[-83.695784,36.227314],[-83.696295,36.225034],[-83.696302,36.225002],[-83.69632,36.224919],[-83.696327,36.224891],[-83.696626,36.223558],[-83.696739,36.223054],[-83.697448,36.219921],[-83.697976,36.217546],[-83.698385,36.215709],[-83.698432,36.215498],[-83.698672,36.214421],[-83.698836,36.213693],[-83.699537,36.210558],[-83.699826,36.209271],[-83.699901,36.208933],[-83.700128,36.20792],[-83.700205,36.207583],[-83.700205,36.207483],[-83.700205,36.207383],[-83.700305,36.206983],[-83.700505,36.206683],[-83.700705,36.206283],[-83.701305,36.205883],[-83.701705,36.205683],[-83.702205,36.205383],[-83.703005,36.204983],[-83.703205,36.204983],[-83.703868,36.204761],[-83.704405,36.204583],[-83.705405,36.204283],[-83.706005,36.204183],[-83.706805,36.203983],[-83.707205,36.203883],[-83.707805,36.203583],[-83.708305,36.203083],[-83.708705,36.202783],[-83.710105,36.202383],[-83.711105,36.201983],[-83.712305,36.201483],[-83.712905,36.201283],[-83.713405,36.201083],[-83.713805,36.200683],[-83.714305,36.200383],[-83.715205,36.200183],[-83.716005,36.199983],[-83.716605,36.199883],[-83.716905,36.199783],[-83.717205,36.199383],[-83.717375,36.199212],[-83.717605,36.198983],[-83.718505,36.198483],[-83.718805,36.198583],[-83.718805,36.198483],[-83.719005,36.198183],[-83.719105,36.197683],[-83.719405,36.196583],[-83.719605,36.195783],[-83.719405,36.195483],[-83.715705,36.194083],[-83.715405,36.193983],[-83.715285,36.193923],[-83.715205,36.193883],[-83.715205,36.193683],[-83.715205,36.193283],[-83.715305,36.192583],[-83.715605,36.192183],[-83.715805,36.191983],[-83.716505,36.191583],[-83.717105,36.191183],[-83.717805,36.190683],[-83.718205,36.190483],[-83.718905,36.190083],[-83.719405,36.189683],[-83.719805,36.189483],[-83.720105,36.189283],[-83.720305,36.189183],[-83.720505,36.188983],[-83.720705,36.188883],[-83.720905,36.188683],[-83.721105,36.188483],[-83.721705,36.188283],[-83.722405,36.188183],[-83.722505,36.188183],[-83.722805,36.188083],[-83.723305,36.187883],[-83.723605,36.187783],[-83.723705,36.187783],[-83.724005,36.187783],[-83.724405,36.187683],[-83.724605,36.187683],[-83.725005,36.187683],[-83.725505,36.187583],[-83.725617,36.187545],[-83.725805,36.187483],[-83.726105,36.187483],[-83.726505,36.187483],[-83.726805,36.187483],[-83.726905,36.187483],[-83.727105,36.187483],[-83.727305,36.187483],[-83.727705,36.187383],[-83.728105,36.187383],[-83.728305,36.187383],[-83.728805,36.187183],[-83.728905,36.187182],[-83.729005,36.187082],[-83.729305,36.186982],[-83.729605,36.186882],[-83.729705,36.186782],[-83.729805,36.186682],[-83.729805,36.186582],[-83.729805,36.186482],[-83.729905,36.186382],[-83.729905,36.186282],[-83.729805,36.186182],[-83.729905,36.186082],[-83.729805,36.185982],[-83.729705,36.185982],[-83.729605,36.185983],[-83.729505,36.185883],[-83.728805,36.185583],[-83.728705,36.185483],[-83.728605,36.185483],[-83.728505,36.185383],[-83.728405,36.185183],[-83.728205,36.184983],[-83.728005,36.184883],[-83.727905,36.184683],[-83.727905,36.184483],[-83.727905,36.184383],[-83.727905,36.184183],[-83.727905,36.183883],[-83.727905,36.183583],[-83.728005,36.183483],[-83.728005,36.183283],[-83.728105,36.183183],[-83.728105,36.182883],[-83.728205,36.182683],[-83.728305,36.182583],[-83.728305,36.182383],[-83.728405,36.182083],[-83.728305,36.181983],[-83.728205,36.181883],[-83.728105,36.181683],[-83.728005,36.181583],[-83.727805,36.181483],[-83.727605,36.181483],[-83.727405,36.181383],[-83.727205,36.181283],[-83.727105,36.181283],[-83.726905,36.181283],[-83.726705,36.181183],[-83.726405,36.181083],[-83.726305,36.181083],[-83.726005,36.181083],[-83.725705,36.180983],[-83.725505,36.180883],[-83.725305,36.180683],[-83.725105,36.180483],[-83.725005,36.180483],[-83.724705,36.180283],[-83.724305,36.180183],[-83.724105,36.180083],[-83.723805,36.179883],[-83.723605,36.179583],[-83.723305,36.179383],[-83.723105,36.179183],[-83.722905,36.178983],[-83.722705,36.178783],[-83.722505,36.178383],[-83.722405,36.178183],[-83.722405,36.177583],[-83.722204,36.177283],[-83.722104,36.176983],[-83.722004,36.176783],[-83.721904,36.176783],[-83.721904,36.176683],[-83.721804,36.176683],[-83.721604,36.176683],[-83.721504,36.176583],[-83.721204,36.176583],[-83.718904,36.175483],[-83.718704,36.175283],[-83.718404,36.175183],[-83.718304,36.175083],[-83.718004,36.175083],[-83.717704,36.174983],[-83.717304,36.174883],[-83.716904,36.174783],[-83.716504,36.174783],[-83.716004,36.174783],[-83.715704,36.174783],[-83.715304,36.174583],[-83.715004,36.174483],[-83.714804,36.174283],[-83.714704,36.173983],[-83.714704,36.173783],[-83.714804,36.173683],[-83.714904,36.173483],[-83.715104,36.173383],[-83.715704,36.172983],[-83.716004,36.172683],[-83.716504,36.172383],[-83.716904,36.172183],[-83.717304,36.171883],[-83.717704,36.171683],[-83.718004,36.171583],[-83.718304,36.171583],[-83.718704,36.171583],[-83.719404,36.171383],[-83.719804,36.171083],[-83.720504,36.170683],[-83.720704,36.170583],[-83.721204,36.170483],[-83.721904,36.169883],[-83.722504,36.169383],[-83.723004,36.169083],[-83.723304,36.168983],[-83.723604,36.168983],[-83.724004,36.169083],[-83.724504,36.169083],[-83.724957,36.168992],[-83.725004,36.168983],[-83.725404,36.168783],[-83.725604,36.168483],[-83.726304,36.168083],[-83.726704,36.167983],[-83.727304,36.167783],[-83.727904,36.167583],[-83.728804,36.167183],[-83.729504,36.166883],[-83.730004,36.166483],[-83.730704,36.165883],[-83.731204,36.165483],[-83.731804,36.164983],[-83.731904,36.164983],[-83.732104,36.164783],[-83.732204,36.164783],[-83.732304,36.164683],[-83.732404,36.164583],[-83.732464,36.164583],[-83.732504,36.164583],[-83.732644,36.164583],[-83.732704,36.164583],[-83.732699,36.164567],[-83.732684,36.164522],[-83.732679,36.164508],[-83.732427,36.163738],[-83.731263,36.160191],[-83.73126,36.160181],[-83.730718,36.158526],[-83.729308,36.157306],[-83.728006,36.156209],[-83.727842,36.156071],[-83.727771,36.15601],[-83.72645,36.154891],[-83.72589,36.154435],[-83.725223,36.15385],[-83.724949,36.153619],[-83.723071,36.152024],[-83.722904,36.151883],[-83.725686,36.149816],[-83.726004,36.149583],[-83.724008,36.147761],[-83.723697,36.147502],[-83.724194,36.145694],[-83.725103,36.142383],[-83.724986,36.142245],[-83.724881,36.14212],[-83.723478,36.14047],[-83.723403,36.140382],[-83.723303,36.140282],[-83.723703,36.137483],[-83.721103,36.136883],[-83.721003,36.136883],[-83.720389,36.136336],[-83.720321,36.13626],[-83.720246,36.136188],[-83.720227,36.136168],[-83.720206,36.136123],[-83.720181,36.136069],[-83.72014,36.135961],[-83.720081,36.135843],[-83.720008,36.135766],[-83.71977,36.135538],[-83.71964,36.135421],[-83.718953,36.134432],[-83.718731,36.134113],[-83.717818,36.132997],[-83.717546,36.132777],[-83.717506,36.132744],[-83.717042,36.132369],[-83.712603,36.128784],[-83.707202,36.128284],[-83.706831,36.125107],[-83.707067,36.124692],[-83.704671,36.122331],[-83.703491,36.122074],[-83.703982,36.120652],[-83.701743,36.120059],[-83.701723,36.121261],[-83.700383,36.121059],[-83.700151,36.122286],[-83.700057,36.122789],[-83.699975,36.122782],[-83.698728,36.122671],[-83.693215,36.122184],[-83.691433,36.122027],[-83.691436,36.121971],[-83.69147,36.121242],[-83.691477,36.121108],[-83.69352,36.120931],[-83.694247,36.120869],[-83.694303,36.120453],[-83.69447,36.119207],[-83.694527,36.118792],[-83.69453,36.118741],[-83.694543,36.118588],[-83.694548,36.118538],[-83.694557,36.118417],[-83.694587,36.118055],[-83.694597,36.117935],[-83.694615,36.117703],[-83.694628,36.11755],[-83.69474,36.11702],[-83.694743,36.117007],[-83.69484,36.116812],[-83.694813,36.11655],[-83.694737,36.115808],[-83.69478,36.11581],[-83.695044,36.115822],[-83.696091,36.115873],[-83.697014,36.115918],[-83.697515,36.113753],[-83.697752,36.112732],[-83.698453,36.113085],[-83.699015,36.113369],[-83.699186,36.111648],[-83.699265,36.110866],[-83.699301,36.110502],[-83.699405,36.109469],[-83.699347,36.109466],[-83.698982,36.109452],[-83.697665,36.109391],[-83.694581,36.11128],[-83.689534,36.111797],[-83.689247,36.111826],[-83.689247,36.112476],[-83.687688,36.112406],[-83.687167,36.111815],[-83.68775,36.1087],[-83.687212,36.108628],[-83.687211,36.106024],[-83.687208,36.102311],[-83.682063,36.101854],[-83.681199,36.101777],[-83.680945,36.10136],[-83.67932,36.098706],[-83.675665,36.098094],[-83.67353,36.095191],[-83.672119,36.093271],[-83.667026,36.086238],[-83.667249,36.083343],[-83.66741,36.081236],[-83.667432,36.080941],[-83.667455,36.080646],[-83.66746,36.080587],[-83.668037,36.080525],[-83.669956,36.080631],[-83.671365,36.080971],[-83.672177,36.081167],[-83.673865,36.081597],[-83.674736,36.081819],[-83.676289,36.082559],[-83.67663,36.082799],[-83.677083,36.083118],[-83.677536,36.083438],[-83.67779,36.083617],[-83.678045,36.083796],[-83.678203,36.083908],[-83.679504,36.084969],[-83.680446,36.086075],[-83.681264,36.086936],[-83.681468,36.08715],[-83.682103,36.087708],[-83.682316,36.087895],[-83.68253,36.088082],[-83.682916,36.088422],[-83.683679,36.088941],[-83.683898,36.08909],[-83.684118,36.089239],[-83.684232,36.089317],[-83.684347,36.089395],[-83.684805,36.089716],[-83.685263,36.090038],[-83.685692,36.090339],[-83.68612,36.09064],[-83.686301,36.090768],[-83.687589,36.092111],[-83.688346,36.092709],[-83.689138,36.093335],[-83.689645,36.093639],[-83.690956,36.094428],[-83.691292,36.09463],[-83.693164,36.095283],[-83.695149,36.095745],[-83.695184,36.095749],[-83.695553,36.095794],[-83.695923,36.095838],[-83.696814,36.095946],[-83.697706,36.096053],[-83.699122,36.096223],[-83.699331,36.096207],[-83.70172,36.096019],[-83.702096,36.095985],[-83.70317,36.095887],[-83.704244,36.095789],[-83.704319,36.095782],[-83.704521,36.095728],[-83.705147,36.095556],[-83.705773,36.095385],[-83.706324,36.095235],[-83.706589,36.095079],[-83.707976,36.094264],[-83.708979,36.093452],[-83.709185,36.093287],[-83.70925,36.093234],[-83.709648,36.092638],[-83.709887,36.092278],[-83.709914,36.092184],[-83.710114,36.091497],[-83.710168,36.090206],[-83.710239,36.089536],[-83.71025,36.089437],[-83.71029,36.089061],[-83.710063,36.087802],[-83.709994,36.087417],[-83.709924,36.087032],[-83.709846,36.086827],[-83.709769,36.086622],[-83.709651,36.08631],[-83.709533,36.085999],[-83.709422,36.085705],[-83.709147,36.08522],[-83.709004,36.084968],[-83.708862,36.084717],[-83.708719,36.084464],[-83.708561,36.084328],[-83.707172,36.083127],[-83.706381,36.082188],[-83.705857,36.081566],[-83.704929,36.080032],[-83.70425,36.078983],[-83.703725,36.078173],[-83.702781,36.076301],[-83.701548,36.073546],[-83.701188,36.07289],[-83.700931,36.072423],[-83.700674,36.071956],[-83.700578,36.07178],[-83.700483,36.071604],[-83.700271,36.071218],[-83.699069,36.069731],[-83.698986,36.069625],[-83.698943,36.069586],[-83.69859,36.069268],[-83.698237,36.068951],[-83.697273,36.068084],[-83.696899,36.067737],[-83.696241,36.067127],[-83.693366,36.064458],[-83.692652,36.063388],[-83.6924,36.063011],[-83.692147,36.062633],[-83.692005,36.062418],[-83.691951,36.060997],[-83.692092,36.060808],[-83.692709,36.05998],[-83.693465,36.059018],[-83.694599,36.058249],[-83.694137,36.058208],[-83.693932,36.05819],[-83.693499,36.058155],[-83.693383,36.058144],[-83.692115,36.058035],[-83.691923,36.058018],[-83.691664,36.057995],[-83.685418,36.057517],[-83.684861,36.057472],[-83.684862,36.057201],[-83.684735,36.054542],[-83.671169,36.053105],[-83.671273,36.048941],[-83.675199,36.048215],[-83.675283,36.044545],[-83.675193,36.044423],[-83.675122,36.044335],[-83.674895,36.043982],[-83.67472,36.043787],[-83.674508,36.043654],[-83.674274,36.043535],[-83.674036,36.043406],[-83.673913,36.043315],[-83.673926,36.043276],[-83.673935,36.043251],[-83.673847,36.043074],[-83.673519,36.042756],[-83.673423,36.042638],[-83.673366,36.042522],[-83.673348,36.042323],[-83.673365,36.042069],[-83.673463,36.041732],[-83.67365,36.041289],[-83.673869,36.040848],[-83.674086,36.040545],[-83.674245,36.040254],[-83.674276,36.040021],[-83.674306,36.039709],[-83.674336,36.0394],[-83.674408,36.039055],[-83.674446,36.03873],[-83.674449,36.038714],[-83.674454,36.038699],[-83.673297,36.038486],[-83.673324,36.037904],[-83.67334,36.037583],[-83.673398,36.036386],[-83.67362,36.036413],[-83.674198,36.036486],[-83.674214,36.036316],[-83.674266,36.035812],[-83.674284,36.035645],[-83.674316,36.03531],[-83.674419,36.034305],[-83.674453,36.033971],[-83.67447,36.033797],[-83.674523,36.033273],[-83.674541,36.0331],[-83.674612,36.032396],[-83.674826,36.030289],[-83.674898,36.029586],[-83.675214,36.02911],[-83.675564,36.028586],[-83.675698,36.028386],[-83.676532,36.028266],[-83.677098,36.028186],[-83.677177,36.028162],[-83.677416,36.028091],[-83.677496,36.028068],[-83.6775,36.027952],[-83.677499,36.027942],[-83.67749,36.027721],[-83.677475,36.027565],[-83.677464,36.02744],[-83.677433,36.027097],[-83.67743,36.027069],[-83.677388,36.026665],[-83.677319,36.025994],[-83.677315,36.025961],[-83.677274,36.025592],[-83.677178,36.02559],[-83.676893,36.025587],[-83.676798,36.025586],[-83.674527,36.025519],[-83.673398,36.025486],[-83.670914,36.020373],[-83.669997,36.018486],[-83.669979,36.018314],[-83.669893,36.017489],[-83.669655,36.01517],[-83.669639,36.015014],[-83.669554,36.014191],[-83.669511,36.013794],[-83.669502,36.013701],[-83.669389,36.012609],[-83.669369,36.012409],[-83.669349,36.012216],[-83.669271,36.011518],[-83.669187,36.010754],[-83.669096,36.009933],[-83.66904,36.009429],[-83.668966,36.008734],[-83.668964,36.008718],[-83.668344,36.007449],[-83.667817,36.006371],[-83.666903,36.0045],[-83.666462,36.003599],[-83.665993,36.002638],[-83.665836,36.002316],[-83.665775,36.002192],[-83.665594,36.001821],[-83.665534,36.001698],[-83.665474,36.001564],[-83.664972,36.000431],[-83.66482,36.000087],[-83.663617,35.996505],[-83.663176,35.995193],[-83.66312,35.995027],[-83.662981,35.994615],[-83.662399,35.992884],[-83.662278,35.992522],[-83.662206,35.992307],[-83.661938,35.991507],[-83.661828,35.991494],[-83.660737,35.991371],[-83.660174,35.991036],[-83.659087,35.990827],[-83.658261,35.990669],[-83.658149,35.990664],[-83.657183,35.990619],[-83.655857,35.990558],[-83.656053,35.989938],[-83.655133,35.989877],[-83.654169,35.989814],[-83.653548,35.989773],[-83.651687,35.989651],[-83.651287,35.989625],[-83.651358,35.989416],[-83.651349,35.989392],[-83.651323,35.989322],[-83.651315,35.989299],[-83.651264,35.989099],[-83.65122,35.988927],[-83.651118,35.9885],[-83.651071,35.988301],[-83.651068,35.988298],[-83.651052,35.988141],[-83.651018,35.987809],[-83.650978,35.987665],[-83.650935,35.987511],[-83.650931,35.98743],[-83.650921,35.987187],[-83.65092,35.987126],[-83.650919,35.987107],[-83.650917,35.987063],[-83.650911,35.986922],[-83.650922,35.98678],[-83.650938,35.986581],[-83.650947,35.986481],[-83.650957,35.986368],[-83.65106,35.986325],[-83.651371,35.9862],[-83.651544,35.986131],[-83.651601,35.986108],[-83.651697,35.986069],[-83.651894,35.98607],[-83.657032,35.986717],[-83.659711,35.985887],[-83.657978,35.9805],[-83.657921,35.98035],[-83.656686,35.977239],[-83.655771,35.974936],[-83.655755,35.974894],[-83.655312,35.973755],[-83.654605,35.971937],[-83.656004,35.970946],[-83.657002,35.970241],[-83.658396,35.969254],[-83.662371,35.966444],[-83.662553,35.966264],[-83.663769,35.965065],[-83.663784,35.964941],[-83.663834,35.964572],[-83.663852,35.96445],[-83.664239,35.964235],[-83.664621,35.96398],[-83.665009,35.963724],[-83.665955,35.962912],[-83.666671,35.962227],[-83.667029,35.961885],[-83.667341,35.961643],[-83.667349,35.961636],[-83.667516,35.961506],[-83.667554,35.961455],[-83.667658,35.961319],[-83.667671,35.961303],[-83.667675,35.961284],[-83.667732,35.961028],[-83.667786,35.960858],[-83.667878,35.960711],[-83.668002,35.960517],[-83.668033,35.960485],[-83.668746,35.959748],[-83.670475,35.958452],[-83.671788,35.957485],[-83.671833,35.957453],[-83.67232,35.957118],[-83.672597,35.956772],[-83.672793,35.956409],[-83.673171,35.956129],[-83.673988,35.955498],[-83.674772,35.954723],[-83.675502,35.954152],[-83.676778,35.953317],[-83.677771,35.952889],[-83.679021,35.952472],[-83.680129,35.952158],[-83.682203,35.951703],[-83.684121,35.951175],[-83.684334,35.951097],[-83.684877,35.950901],[-83.68556,35.950637],[-83.686086,35.950351],[-83.686586,35.949967],[-83.687073,35.949335],[-83.687302,35.948786],[-83.687383,35.947946],[-83.687382,35.947904],[-83.687363,35.946452],[-83.687174,35.945837],[-83.686687,35.944963],[-83.686127,35.944178],[-83.685579,35.943535],[-83.685397,35.943373],[-83.684863,35.942898],[-83.683904,35.941426],[-83.683418,35.940548],[-83.683087,35.939784],[-83.682972,35.939284],[-83.682911,35.938565],[-83.682972,35.937977],[-83.68306,35.937598],[-83.683283,35.937208],[-83.683627,35.936846],[-83.683965,35.936692],[-83.684532,35.936637],[-83.685248,35.936829],[-83.685827,35.937067],[-83.68614,35.937197],[-83.686997,35.93773],[-83.687693,35.93829],[-83.688078,35.938647],[-83.68876,35.93946],[-83.689307,35.940009],[-83.690068,35.940748],[-83.690172,35.940849],[-83.691118,35.94192],[-83.6923,35.943359],[-83.693364,35.9447],[-83.693606,35.944537],[-83.693875,35.944358],[-83.694335,35.944049],[-83.694386,35.944016],[-83.694482,35.943952],[-83.694578,35.943887],[-83.694666,35.943828],[-83.694752,35.94377],[-83.694814,35.943728],[-83.695256,35.943433],[-83.695524,35.943254],[-83.695761,35.943097],[-83.695843,35.943042],[-83.696162,35.942867],[-83.696458,35.942401],[-83.696586,35.9422],[-83.696994,35.941081],[-83.697792,35.939763],[-83.697851,35.939722],[-83.698452,35.939314],[-83.69874,35.939306],[-83.698813,35.939304],[-83.700499,35.939262],[-83.701071,35.939073],[-83.702113,35.938731],[-83.705769,35.936542],[-83.706981,35.935307],[-83.707414,35.934866],[-83.708078,35.934119],[-83.70877,35.933843],[-83.709095,35.933714],[-83.710071,35.933096],[-83.710334,35.93293],[-83.712497,35.932096],[-83.71406,35.931044],[-83.715279,35.930161],[-83.715504,35.930252],[-83.715954,35.930138],[-83.716629,35.929634],[-83.717151,35.929248],[-83.718711,35.9281],[-83.720202,35.927688],[-83.721355,35.927184],[-83.722508,35.926406],[-83.722909,35.926174],[-83.724815,35.925078],[-83.727769,35.92323],[-83.728563,35.922734],[-83.732792,35.919572],[-83.733651,35.919084],[-83.73663,35.917784],[-83.738506,35.916966],[-83.739339,35.918011],[-83.739392,35.918098],[-83.739485,35.91825],[-83.740057,35.919178],[-83.740297,35.919566],[-83.74072,35.920988],[-83.741397,35.920838],[-83.742571,35.920796],[-83.742956,35.920783],[-83.743324,35.920702],[-83.74382,35.920594],[-83.743834,35.920591],[-83.743864,35.920584],[-83.743876,35.920582],[-83.74404,35.920547],[-83.745066,35.920132],[-83.746601,35.919512],[-83.747535,35.919388],[-83.748722,35.919077],[-83.74889,35.919033],[-83.74923,35.918777],[-83.749898,35.918676],[-83.751514,35.918294],[-83.75201,35.918374],[-83.75257,35.918278],[-83.75337,35.917686],[-83.754154,35.917014],[-83.754301,35.916838],[-83.75449,35.916614],[-83.755034,35.916342],[-83.755546,35.916166],[-83.75657,35.915702],[-83.75697,35.91551],[-83.757498,35.915062],[-83.75801,35.914758],[-83.759082,35.914534],[-83.760394,35.914486],[-83.761114,35.914294],[-83.76209,35.913926],[-83.763546,35.91351],[-83.764266,35.91327],[-83.764938,35.91287],[-83.766042,35.912422],[-83.766714,35.912102],[-83.767242,35.911862],[-83.76745,35.911686],[-83.767594,35.911462],[-83.767606,35.911101],[-83.76761,35.911014],[-83.767322,35.910534],[-83.767146,35.910054],[-83.767082,35.909654],[-83.76713,35.909302],[-83.767354,35.908822],[-83.768058,35.908262],[-83.769114,35.907702],[-83.769498,35.907477],[-83.769786,35.907221],[-83.770522,35.906997],[-83.771418,35.907029],[-83.772122,35.906613],[-83.773306,35.906085],[-83.773978,35.905573],[-83.774202,35.905285],[-83.77425,35.904853],[-83.774042,35.904405],[-83.773986,35.904063],[-83.773962,35.903909],[-83.774282,35.903477],[-83.77449,35.903157],[-83.775578,35.902325],[-83.776554,35.901781],[-83.777306,35.901461],[-83.777322,35.900901],[-83.777354,35.900309],[-83.77785,35.899685],[-83.778522,35.899077],[-83.77897,35.898533],[-83.779082,35.897845],[-83.778906,35.897173],[-83.778858,35.896613],[-83.780378,35.895189],[-83.781002,35.894965],[-83.78161,35.894901],[-83.781978,35.894901],[-83.782186,35.894917],[-83.782394,35.894725],[-83.782938,35.893397],[-83.783722,35.892613],[-83.784826,35.892021],[-83.785898,35.891541],[-83.786741,35.891342],[-83.787323,35.891205],[-83.788251,35.890805],[-83.789563,35.890197],[-83.790891,35.889717],[-83.791627,35.889317],[-83.792571,35.888357],[-83.792926,35.888119],[-83.793243,35.887909],[-83.793755,35.887333],[-83.793877,35.887283],[-83.794275,35.887125],[-83.793568,35.885858],[-83.793523,35.885768],[-83.793452,35.885674],[-83.793404,35.885597],[-83.79328,35.885457],[-83.793259,35.885433],[-83.793198,35.885364],[-83.793189,35.885354],[-83.793178,35.885342],[-83.79302,35.885167],[-83.793001,35.885145],[-83.792732,35.88488],[-83.7925,35.884692],[-83.792318,35.884545],[-83.79218,35.884445],[-83.792079,35.884372],[-83.791899,35.884273],[-83.791743,35.884189],[-83.791665,35.884147],[-83.791596,35.884107],[-83.791437,35.88418],[-83.791406,35.884187],[-83.791289,35.884184],[-83.791248,35.884178],[-83.791033,35.884162],[-83.790444,35.884119],[-83.790048,35.884096],[-83.78956,35.884092],[-83.789296,35.884101],[-83.78872,35.884119],[-83.788622,35.88393],[-83.788351,35.883379],[-83.788267,35.883208],[-83.788236,35.883147],[-83.788145,35.882964],[-83.788115,35.882904],[-83.788106,35.882885],[-83.788026,35.882758],[-83.787762,35.882339],[-83.786697,35.880649],[-83.786362,35.880117],[-83.78634,35.880088],[-83.786218,35.879925],[-83.786015,35.879956],[-83.78568,35.880008],[-83.785386,35.880053],[-83.784922,35.879765],[-83.784882,35.879747],[-83.784522,35.879589],[-83.784512,35.879578],[-83.784446,35.879503],[-83.784251,35.879279],[-83.784186,35.879205],[-83.784228,35.878595],[-83.78436,35.876769],[-83.784394,35.876305],[-83.784382,35.8762],[-83.784379,35.876163],[-83.784309,35.876212],[-83.784096,35.876355],[-83.784029,35.876402],[-83.784098,35.87618],[-83.784307,35.87552],[-83.784378,35.875301],[-83.784475,35.875085],[-83.784498,35.874618],[-83.784606,35.87251],[-83.784643,35.871808],[-83.784653,35.871604],[-83.784663,35.871416],[-83.784661,35.870993],[-83.784661,35.870889],[-83.78463,35.870712],[-83.784582,35.870429],[-83.78443,35.870231],[-83.784323,35.870089],[-83.784135,35.869762],[-83.784051,35.869615],[-83.784081,35.86905],[-83.784258,35.868841],[-83.784361,35.868784],[-83.784436,35.868744],[-83.784302,35.868486],[-83.784157,35.868204],[-83.784017,35.867935],[-83.783163,35.866285],[-83.782879,35.865735],[-83.782856,35.865691],[-83.782779,35.865557],[-83.782475,35.865028],[-83.782374,35.864852],[-83.782269,35.864674],[-83.782241,35.864627],[-83.781977,35.864129],[-83.781882,35.863948],[-83.781815,35.863839],[-83.781775,35.863762],[-83.78148,35.863195],[-83.781383,35.863007],[-83.781282,35.86282],[-83.780985,35.862262],[-83.780888,35.862078],[-83.780864,35.862032],[-83.780794,35.8619],[-83.780771,35.861857],[-83.780761,35.86184],[-83.780586,35.861513],[-83.780518,35.861385],[-83.780389,35.861143],[-83.780064,35.860533],[-83.77989,35.860207],[-83.77988,35.860184],[-83.779557,35.859577],[-83.779405,35.859291],[-83.781009,35.859954],[-83.781644,35.860217],[-83.78146,35.85988],[-83.780909,35.858869],[-83.780726,35.858533],[-83.781165,35.858304],[-83.782484,35.857621],[-83.782924,35.857393],[-83.783271,35.857212],[-83.784286,35.856686],[-83.784266,35.856659],[-83.784034,35.856344],[-83.783901,35.856164],[-83.783842,35.856084],[-83.783504,35.855625],[-83.783372,35.855446],[-83.783346,35.855413],[-83.783271,35.855313],[-83.783247,35.855282],[-83.782892,35.8548],[-83.782284,35.855065],[-83.78021,35.855975],[-83.780131,35.855637],[-83.780013,35.855307],[-83.779648,35.854913],[-83.779458,35.854703],[-83.779274,35.854501],[-83.778602,35.853778],[-83.778488,35.853529],[-83.778439,35.853421],[-83.778108,35.852801],[-83.7781,35.852785],[-83.777984,35.852558],[-83.777916,35.852426],[-83.777713,35.85203],[-83.777646,35.851898],[-83.777037,35.852203],[-83.77521,35.853122],[-83.774884,35.853287],[-83.774569,35.853314],[-83.774532,35.853317],[-83.774423,35.853327],[-83.774387,35.853331],[-83.774088,35.853358],[-83.773792,35.853189],[-83.773604,35.852931],[-83.773485,35.852791],[-83.771268,35.850173],[-83.77078,35.849597],[-83.77056,35.849338],[-83.770528,35.849301],[-83.769418,35.84799],[-83.769008,35.847506],[-83.772214,35.845733],[-83.771815,35.844979],[-83.771012,35.843462],[-83.770806,35.843073],[-83.770189,35.841907],[-83.769984,35.841519],[-83.769438,35.840488],[-83.768791,35.839266],[-83.768129,35.838015],[-83.765214,35.832509],[-83.764022,35.830257],[-83.763974,35.830166],[-83.763831,35.829895],[-83.763784,35.829805],[-83.763771,35.829781],[-83.763737,35.829716],[-83.763723,35.829689],[-83.763253,35.828802],[-83.761845,35.826141],[-83.761376,35.825255],[-83.760558,35.823709],[-83.758269,35.819383],[-83.758105,35.819073],[-83.757287,35.817528],[-83.757157,35.817664],[-83.757042,35.817758],[-83.756969,35.81782],[-83.756619,35.818091],[-83.756446,35.818225],[-83.756241,35.818373],[-83.755968,35.818571],[-83.755578,35.817942],[-83.754432,35.816085],[-83.75406,35.815475],[-83.753565,35.814674],[-83.752083,35.812272],[-83.751656,35.811579],[-83.75159,35.811472],[-83.751535,35.811383],[-83.75137,35.811116],[-83.751315,35.811028],[-83.75037,35.809495],[-83.749895,35.808725],[-83.749011,35.80868],[-83.748124,35.808621],[-83.747867,35.808806],[-83.74764,35.809047],[-83.747236,35.809078],[-83.746998,35.809392],[-83.746782,35.809309],[-83.745256,35.808724],[-83.744421,35.808027],[-83.743998,35.807848],[-83.743976,35.808372],[-83.742978,35.809031],[-83.742789,35.809692],[-83.742718,35.810144],[-83.742528,35.810773],[-83.741937,35.810746],[-83.741681,35.810592],[-83.740509,35.810483],[-83.740163,35.810821],[-83.740289,35.811249],[-83.739835,35.811449],[-83.73877,35.811534],[-83.738535,35.811138],[-83.738813,35.810719],[-83.739503,35.808292],[-83.73973,35.807978],[-83.739998,35.807511],[-83.739518,35.806815],[-83.740928,35.805897],[-83.74115,35.805752],[-83.742206,35.805064],[-83.745878,35.802278],[-83.746127,35.802134],[-83.746156,35.802116],[-83.746216,35.802083],[-83.746237,35.802055],[-83.746258,35.802029],[-83.746327,35.801939],[-83.746386,35.80189],[-83.746693,35.801641],[-83.746726,35.801468],[-83.746735,35.801423],[-83.746762,35.801281],[-83.746835,35.800897],[-83.747056,35.799748],[-83.747131,35.799365],[-83.747317,35.798398],[-83.746912,35.797592],[-83.74688,35.79753],[-83.744247,35.792286],[-83.743801,35.791397],[-83.74337,35.790539],[-83.743218,35.790251],[-83.742762,35.789388],[-83.742639,35.789155],[-83.742616,35.789099],[-83.742602,35.789069],[-83.742566,35.788979],[-83.742553,35.788949],[-83.742397,35.788659],[-83.742113,35.788126],[-83.740797,35.785655],[-83.740607,35.785298],[-83.74056,35.785206],[-83.740369,35.784828],[-83.740116,35.784331],[-83.73936,35.782844],[-83.739108,35.782348],[-83.739099,35.782329],[-83.739047,35.782228],[-83.738911,35.78196],[-83.738868,35.781874],[-83.738807,35.781757],[-83.738683,35.781514],[-83.738314,35.780787],[-83.738193,35.780545],[-83.73816,35.780479],[-83.738061,35.780284],[-83.738028,35.78022],[-83.737348,35.778881],[-83.735808,35.77585],[-83.735308,35.774867],[-83.734629,35.773529],[-83.73454,35.773354],[-83.734274,35.772831],[-83.734186,35.772657],[-83.733645,35.771593],[-83.731754,35.76787],[-83.731882,35.767034],[-83.731987,35.766361],[-83.731687,35.765125],[-83.73105,35.764372],[-83.730381,35.764216],[-83.729723,35.763754],[-83.729068,35.762516],[-83.728684,35.762418],[-83.727559,35.762874],[-83.726148,35.763369],[-83.726001,35.76311],[-83.726042,35.762796],[-83.726596,35.762063],[-83.727151,35.761452],[-83.727931,35.760978],[-83.727924,35.760252],[-83.728399,35.759575],[-83.729486,35.759079],[-83.73003,35.758564],[-83.730151,35.757773],[-83.729828,35.757022],[-83.729604,35.75652],[-83.729753,35.755763],[-83.729815,35.755455],[-83.729968,35.754302],[-83.729723,35.753921],[-83.728769,35.753684],[-83.7288,35.753337],[-83.728595,35.752908],[-83.728222,35.752584],[-83.727325,35.752694],[-83.726606,35.752764],[-83.726288,35.752602],[-83.725889,35.752398],[-83.725189,35.752516],[-83.724349,35.753151],[-83.724272,35.752723],[-83.724177,35.751875],[-83.724476,35.751061],[-83.724155,35.750087],[-83.724554,35.749829],[-83.724588,35.749808],[-83.724034,35.749294],[-83.723728,35.749069],[-83.723146,35.748957],[-83.722406,35.748395],[-83.721813,35.748114],[-83.718914,35.747726],[-83.718851,35.74734],[-83.718534,35.74518],[-83.717954,35.741222],[-83.717945,35.741162],[-83.717436,35.736499],[-83.716886,35.732316],[-83.716671,35.730682],[-83.716484,35.729209],[-83.716462,35.729035],[-83.715626,35.72829],[-83.714283,35.727445],[-83.712961,35.726819],[-83.711464,35.726943],[-83.709887,35.727091],[-83.708951,35.727238],[-83.708251,35.72724],[-83.707807,35.726685],[-83.707776,35.725934],[-83.707775,35.725895],[-83.708395,35.725112],[-83.709033,35.724144],[-83.708795,35.723387],[-83.708166,35.72078],[-83.708138,35.720664],[-83.707398,35.720214],[-83.705772,35.719984],[-83.705178,35.719389],[-83.704262,35.719649],[-83.702971,35.719482],[-83.701985,35.719444],[-83.701344,35.719276],[-83.701393,35.718606],[-83.701431,35.718091],[-83.701979,35.716478],[-83.701985,35.716017],[-83.701992,35.715556],[-83.701996,35.715269],[-83.702852,35.714429],[-83.703213,35.713042],[-83.704433,35.712065],[-83.70525,35.71158],[-83.705269,35.711161],[-83.70453,35.710808],[-83.703386,35.710334],[-83.702152,35.709217],[-83.700407,35.709059],[-83.698652,35.708112],[-83.69672,35.708132],[-83.695931,35.707658],[-83.695369,35.707506],[-83.694415,35.708144],[-83.693922,35.708274],[-83.691351,35.708319],[-83.690092,35.709111],[-83.688181,35.709534],[-83.687532,35.710051],[-83.686724,35.709899],[-83.685226,35.709934],[-83.684634,35.709606],[-83.682831,35.709725],[-83.682161,35.709772],[-83.681391,35.708838],[-83.680502,35.707865],[-83.679947,35.706512],[-83.680271,35.705649],[-83.681263,35.704084],[-83.682106,35.702511],[-83.682307,35.701596],[-83.682449,35.700948],[-83.682507,35.700689],[-83.681844,35.699103],[-83.681762,35.69853],[-83.681704,35.698463],[-83.68132,35.698024],[-83.680846,35.697726],[-83.68119,35.697353],[-83.681249,35.69729],[-83.681278,35.696807],[-83.680547,35.695551],[-83.680041,35.694053],[-83.679833,35.693393],[-83.679956,35.692748],[-83.680058,35.692216],[-83.67987,35.691605],[-83.679732,35.691156],[-83.679622,35.690798],[-83.6796,35.690595],[-83.679431,35.689025],[-83.679369,35.688882],[-83.679138,35.688353],[-83.678947,35.687914],[-83.678335,35.687722],[-83.677965,35.687545],[-83.676708,35.686943],[-83.674272,35.685497],[-83.67391,35.685506],[-83.672381,35.685548],[-83.67018,35.686015],[-83.670047,35.686044],[-83.667733,35.686564],[-83.66545,35.68772],[-83.664821,35.688583],[-83.66442,35.689048],[-83.663965,35.689576],[-83.662814,35.690618],[-83.66281,35.689538],[-83.662799,35.686298],[-83.662796,35.685219],[-83.662792,35.684094],[-83.662782,35.680722],[-83.662779,35.679598],[-83.662776,35.678634],[-83.662767,35.675742],[-83.662765,35.674948],[-83.662766,35.674844],[-83.662767,35.674779],[-83.662767,35.674717],[-83.662768,35.674561],[-83.662769,35.674507],[-83.662773,35.674225],[-83.662771,35.6736],[-83.662766,35.671057],[-83.66277,35.670882],[-83.662796,35.669977],[-83.662797,35.669892],[-83.662801,35.669724],[-83.662803,35.66964],[-83.662805,35.669558],[-83.662806,35.669484],[-83.662808,35.669411],[-83.662814,35.669138],[-83.662814,35.669003],[-83.662814,35.668865],[-83.662814,35.668793],[-83.662814,35.66858],[-83.662814,35.668509],[-83.662814,35.668429],[-83.662814,35.667476],[-83.662814,35.664378],[-83.662814,35.663347],[-83.662814,35.660754],[-83.662814,35.652982],[-83.662814,35.650391],[-83.662814,35.649302],[-83.662815,35.64726],[-83.662815,35.646038],[-83.662815,35.64495],[-83.662815,35.644458],[-83.662815,35.642985],[-83.662816,35.642494],[-83.662816,35.641284],[-83.662816,35.637654],[-83.662816,35.636443],[-83.662816,35.635818],[-83.662816,35.63394],[-83.662817,35.633315],[-83.662817,35.632312],[-83.662817,35.629303],[-83.662817,35.6283],[-83.662817,35.627657],[-83.662817,35.625732],[-83.662818,35.62509],[-83.662913,35.623434],[-83.663201,35.618466],[-83.663292,35.616914],[-83.663291,35.61681],[-83.66329,35.616789],[-83.66329,35.616725],[-83.66329,35.616704],[-83.663276,35.614536],[-83.663236,35.608032],[-83.663223,35.605865],[-83.663198,35.601908],[-83.663165,35.596444],[-83.663133,35.591273],[-83.663125,35.590042],[-83.663101,35.586086],[-83.663091,35.584539],[-83.663062,35.579905],[-83.663057,35.579079],[-83.663053,35.578359],[-83.663041,35.576546],[-83.663008,35.571104],[-83.662998,35.569291],[-83.662989,35.56926],[-83.662965,35.569168],[-83.662957,35.569138],[-83.664474,35.56953],[-83.666272,35.569389],[-83.66759,35.569347],[-83.66869,35.56924],[-83.670421,35.569309],[-83.673093,35.568974],[-83.674719,35.569422],[-83.676268,35.570289],[-83.677829,35.569803],[-83.679473,35.57009],[-83.68033,35.570314],[-83.680835,35.569362],[-83.683709,35.568494],[-83.684154,35.568848],[-83.685383,35.568757],[-83.687132,35.568616],[-83.68768,35.568333],[-83.688787,35.567791],[-83.690339,35.568868],[-83.691262,35.568689],[-83.69306,35.568555],[-83.693653,35.568892],[-83.695227,35.570339],[-83.696671,35.570239],[-83.697207,35.56957],[-83.697827,35.568352],[-83.700663,35.567621],[-83.702099,35.567634],[-83.703846,35.568476],[-83.707199,35.568533],[-83.707796,35.568057],[-83.709644,35.566788],[-83.711776,35.566485],[-83.712806,35.566257],[-83.713867,35.564885],[-83.714853,35.563908],[-83.717162,35.563806],[-83.719062,35.564027],[-83.720787,35.563347],[-83.723459,35.561874],[-83.724605,35.562516],[-83.726552,35.562584],[-83.727696,35.563121],[-83.72974,35.564148],[-83.729799,35.564148],[-83.730259,35.564062],[-83.730496,35.564017],[-83.732163,35.563361],[-83.732947,35.563149],[-83.734325,35.564596],[-83.735669,35.565455],[-83.737308,35.565024],[-83.740198,35.5638],[-83.741038,35.563056],[-83.742027,35.562603],[-83.744643,35.562693],[-83.745255,35.561781],[-83.746972,35.560117],[-83.748071,35.559848],[-83.74867,35.561055],[-83.749894,35.561146],[-83.756917,35.563604],[-83.759675,35.562492],[-83.761194,35.562307],[-83.762912,35.562863],[-83.764606,35.561538],[-83.771736,35.562118],[-83.773092,35.557465],[-83.780129,35.550387],[-83.781357,35.550702],[-83.782263,35.550275],[-83.783989,35.549857],[-83.786052,35.548468],[-83.786802,35.5472],[-83.789393,35.546355],[-83.791078,35.545901],[-83.794241,35.54533],[-83.796261,35.544042],[-83.798872,35.541047],[-83.802434,35.541588],[-83.803341,35.541026],[-83.808713,35.536415],[-83.809798,35.53431],[-83.823115,35.52565],[-83.82559,35.523829],[-83.827428,35.524653],[-83.831895,35.524766],[-83.833909,35.524283],[-83.835925,35.523397],[-83.840203,35.52156],[-83.842948,35.521687],[-83.843893,35.521428],[-83.848502,35.519259],[-83.853898,35.521059],[-83.85713,35.521763],[-83.859261,35.521851],[-83.860495,35.521394],[-83.862013,35.521241],[-83.864964,35.52127],[-83.866413,35.52091],[-83.868701,35.520367],[-83.871196,35.521063],[-83.87263,35.521145],[-83.874899,35.519716],[-83.87826,35.519001],[-83.880074,35.518745],[-83.882563,35.517182],[-83.883362,35.515741],[-83.884262,35.512754],[-83.888107,35.507904],[-83.892074,35.503089],[-83.893031,35.502253],[-83.895669,35.501868],[-83.896968,35.500085],[-83.897045,35.499847],[-83.897531,35.499683],[-83.897987,35.499526],[-83.898424,35.499362],[-83.898716,35.498985],[-83.89955,35.49809],[-83.900818,35.4972],[-83.901381,35.496553],[-83.90151,35.495916],[-83.901403,35.495278],[-83.900655,35.49468],[-83.9002,35.494191],[-83.900338,35.493095],[-83.900806,35.492229],[-83.901527,35.491026],[-83.902361,35.49068],[-83.903258,35.490108],[-83.903934,35.489761],[-83.904864,35.489593],[-83.905612,35.48906],[-83.906184,35.487904],[-83.906612,35.486593],[-83.906981,35.486355],[-83.907171,35.485623],[-83.907573,35.485191],[-83.90804,35.484397],[-83.908638,35.483984],[-83.908761,35.483743],[-83.908902,35.483027],[-83.909167,35.482497],[-83.908973,35.481752],[-83.908944,35.480614],[-83.909265,35.479714],[-83.9101,35.478706],[-83.910707,35.477832],[-83.911267,35.476814],[-83.911773,35.476028],[-83.912869,35.475895],[-83.913783,35.475444],[-83.914343,35.474966],[-83.91573,35.473988],[-83.916801,35.473612],[-83.917644,35.473823],[-83.918124,35.47399],[-83.918393,35.473839],[-83.918434,35.473751],[-83.918485,35.473595],[-83.918962,35.473494],[-83.919564,35.473367],[-83.920189,35.473649],[-83.920334,35.473721],[-83.92077,35.473941],[-83.921039,35.474077],[-83.921881,35.474409],[-83.923231,35.474367],[-83.924462,35.474396],[-83.924895,35.473884],[-83.925569,35.473665],[-83.926337,35.473714],[-83.926926,35.473445],[-83.927201,35.47332],[-83.928191,35.47304],[-83.929743,35.47333],[-83.931058,35.47307],[-83.932768,35.472717],[-83.933876,35.472438],[-83.936035,35.471823],[-83.937015,35.471511],[-83.937402,35.470797],[-83.938183,35.470054],[-83.93945,35.469156],[-83.941253,35.467995],[-83.942172,35.467254],[-83.942336,35.46628],[-83.942838,35.46576],[-83.942987,35.465084],[-83.942939,35.464918],[-83.942838,35.464566],[-83.943887,35.464319],[-83.944921,35.464345],[-83.946182,35.463818],[-83.946997,35.463383],[-83.947381,35.462822],[-83.947815,35.462237],[-83.948182,35.462059],[-83.948912,35.461716],[-83.949019,35.461589],[-83.949337,35.461217],[-83.950642,35.460774],[-83.951487,35.460729],[-83.95169,35.460732],[-83.95263,35.460742],[-83.952664,35.460743],[-83.952682,35.460758],[-83.953048,35.461091],[-83.953351,35.461344],[-83.953419,35.461475],[-83.953553,35.461695],[-83.953688,35.461896],[-83.953836,35.462027],[-83.953844,35.462183],[-83.953891,35.462313],[-83.954167,35.462543],[-83.95441,35.462845],[-83.954517,35.463024],[-83.954586,35.463162],[-83.954801,35.463359],[-83.955104,35.463606],[-83.9554,35.463737],[-83.956418,35.464167],[-83.956755,35.464228],[-83.956923,35.464221],[-83.957259,35.464297],[-83.957488,35.464357],[-83.957885,35.464432],[-83.958512,35.464469],[-83.959341,35.464356],[-83.960194,35.464291],[-83.961052,35.464228],[-83.961056,35.463738],[-83.961859,35.464023],[-83.963213,35.46452],[-83.964108,35.465126],[-83.964855,35.46582],[-83.965418,35.466772],[-83.965488,35.466891],[-83.965503,35.468304],[-83.965504,35.468439],[-83.965509,35.469692],[-83.965151,35.471117],[-83.964398,35.472243],[-83.963434,35.473004],[-83.963272,35.47306],[-83.963162,35.473098],[-83.962076,35.473474],[-83.959906,35.473964],[-83.959001,35.474168],[-83.958902,35.474206],[-83.958773,35.474255],[-83.958644,35.474304],[-83.957374,35.474789],[-83.956919,35.474977],[-83.956795,35.475028],[-83.956671,35.47508],[-83.956401,35.475191],[-83.956131,35.475302],[-83.955987,35.475362],[-83.955843,35.475421],[-83.955469,35.475576],[-83.955384,35.475622],[-83.955263,35.475687],[-83.955142,35.475752],[-83.954972,35.475843],[-83.954802,35.475934],[-83.954656,35.476012],[-83.95451,35.476091],[-83.954256,35.476227],[-83.954002,35.476364],[-83.953772,35.476487],[-83.953542,35.47661],[-83.953123,35.476835],[-83.952966,35.476907],[-83.952901,35.476937],[-83.950689,35.477948],[-83.950264,35.478109],[-83.950192,35.478136],[-83.95012,35.478163],[-83.94918,35.478518],[-83.948239,35.478874],[-83.948024,35.478955],[-83.947809,35.479036],[-83.947703,35.479076],[-83.947597,35.479116],[-83.947198,35.479267],[-83.9468,35.47942],[-83.946748,35.47944],[-83.946479,35.479544],[-83.94621,35.479647],[-83.945582,35.479888],[-83.943794,35.480741],[-83.943481,35.481017],[-83.94333,35.48115],[-83.943179,35.481282],[-83.943053,35.481393],[-83.942927,35.4815],[-83.942781,35.481634],[-83.942634,35.481763],[-83.941893,35.482416],[-83.940918,35.483501],[-83.940607,35.483847],[-83.93939,35.485319],[-83.938856,35.486506],[-83.938826,35.486572],[-83.93854,35.487773],[-83.939246,35.488518],[-83.939643,35.488937],[-83.939998,35.489124],[-83.941098,35.489703],[-83.942476,35.490371],[-83.944234,35.490737],[-83.944299,35.490741],[-83.944777,35.490773],[-83.945255,35.490805],[-83.94637,35.49088],[-83.947184,35.490912],[-83.94832,35.490957],[-83.949766,35.490944],[-83.950025,35.490942],[-83.950813,35.490402],[-83.950902,35.490353],[-83.950986,35.490307],[-83.951071,35.490261],[-83.951379,35.490092],[-83.951687,35.489923],[-83.951927,35.489792],[-83.95413,35.489435],[-83.956118,35.489585],[-83.957411,35.489659],[-83.957674,35.489674],[-83.958734,35.489935],[-83.958912,35.490003],[-83.959791,35.490341],[-83.960426,35.490801],[-83.960696,35.490996],[-83.961789,35.491702],[-83.962992,35.49286],[-83.96381,35.493681],[-83.964407,35.494279],[-83.965406,35.495358],[-83.966217,35.496234],[-83.966372,35.496402],[-83.968104,35.498271],[-83.96894,35.498982],[-83.970371,35.499811],[-83.970606,35.499948],[-83.970842,35.500084],[-83.971612,35.500502],[-83.972028,35.500728],[-83.972807,35.500935],[-83.973588,35.501041],[-83.974067,35.501095],[-83.974149,35.501104],[-83.974534,35.501148],[-83.974882,35.50105],[-83.975006,35.501015],[-83.975078,35.500995],[-83.975149,35.500974],[-83.975235,35.50095],[-83.975343,35.500903],[-83.975855,35.500685],[-83.976222,35.50033],[-83.976479,35.500084],[-83.976611,35.499359],[-83.977278,35.498544],[-83.977405,35.498391],[-83.978321,35.496665],[-83.978615,35.495436],[-83.978681,35.495159],[-83.978915,35.493506],[-83.978938,35.493346],[-83.979267,35.492535],[-83.979342,35.492347],[-83.979418,35.49216],[-83.979462,35.492052],[-83.979536,35.491832],[-83.979611,35.49161],[-83.979686,35.491389],[-83.979731,35.491256],[-83.980001,35.490436],[-83.980133,35.489598],[-83.980382,35.488829],[-83.980456,35.4886],[-83.980622,35.48802],[-83.980654,35.487908],[-83.980806,35.487739],[-83.980896,35.487639],[-83.980985,35.487539],[-83.981455,35.487292],[-83.981925,35.487044],[-83.982019,35.486994],[-83.982244,35.486941],[-83.982443,35.486895],[-83.982532,35.486874],[-83.982622,35.486853],[-83.98291,35.486785],[-83.984351,35.486686],[-83.985531,35.486803],[-83.985764,35.486893],[-83.986403,35.487142],[-83.986876,35.487314],[-83.987343,35.487483],[-83.988287,35.488186],[-83.988914,35.489016],[-83.988922,35.48903],[-83.988959,35.489092],[-83.989001,35.489164],[-83.989054,35.489254],[-83.989107,35.489343],[-83.989422,35.489876],[-83.989501,35.490498],[-83.989491,35.491079],[-83.989368,35.492571],[-83.98925,35.493716],[-83.989195,35.494619],[-83.989451,35.495808],[-83.990004,35.496952],[-83.990125,35.497413],[-83.990648,35.497927],[-83.9911,35.498657],[-83.991227,35.498774],[-83.991944,35.499433],[-83.992805,35.499914],[-83.993107,35.500083],[-83.996425,35.501674],[-83.998529,35.502682],[-83.999904,35.503342],[-84.001698,35.50437],[-84.00241,35.504869],[-84.00359,35.505696],[-84.004482,35.506335],[-84.005344,35.506953],[-84.005384,35.506982],[-84.006378,35.507696],[-84.006957,35.508112],[-84.007536,35.508528],[-84.007611,35.508582],[-84.008844,35.509667],[-84.009842,35.510955],[-84.009864,35.510999],[-84.010663,35.512574],[-84.010992,35.513807],[-84.011035,35.515049],[-84.010978,35.515528],[-84.01091,35.516114],[-84.010275,35.517495],[-84.010021,35.517838],[-84.009061,35.519135],[-84.007983,35.52046],[-84.007906,35.520529],[-84.006698,35.521609],[-84.004954,35.522902],[-84.004627,35.523146],[-84.002554,35.524143],[-84.002068,35.524297],[-84.001039,35.524625],[-84.000781,35.524708],[-84.000523,35.52479],[-83.999904,35.524988],[-83.999266,35.525076],[-83.998563,35.525175],[-83.998272,35.525264],[-83.995531,35.526104],[-83.995012,35.526264],[-83.994925,35.526346],[-83.994696,35.526563],[-83.994468,35.52678],[-83.994241,35.526995],[-83.993562,35.527641],[-83.993431,35.527767],[-83.993389,35.527891],[-83.992453,35.530721],[-83.992842,35.532331],[-83.992966,35.532843],[-83.993464,35.533687],[-83.994422,35.535307],[-83.995991,35.538848],[-83.99712,35.541075],[-83.996856,35.542721],[-83.996709,35.542988],[-83.996382,35.543579],[-83.996056,35.544171],[-83.995303,35.545537],[-83.995055,35.546039],[-83.994887,35.546378],[-83.994719,35.546718],[-83.994485,35.547192],[-83.994251,35.547665],[-83.994209,35.54775],[-83.994184,35.547895],[-83.99417,35.54797],[-83.993815,35.550001],[-83.994101,35.550465],[-83.994544,35.551182],[-83.995926,35.55294],[-83.998728,35.554185],[-83.999904,35.554707],[-84.000071,35.554711],[-84.003729,35.554819],[-84.004432,35.554794],[-84.0055,35.554758],[-84.005875,35.554666],[-84.006316,35.554558],[-84.006838,35.554432],[-84.007563,35.554035],[-84.007962,35.553818],[-84.008842,35.553338],[-84.009685,35.552393],[-84.010136,35.551593],[-84.01035,35.55042],[-84.010426,35.550004],[-84.010864,35.548559],[-84.011029,35.547913],[-84.011317,35.547645],[-84.011361,35.547604],[-84.011405,35.547563],[-84.011564,35.547414],[-84.011628,35.547355],[-84.012768,35.546635],[-84.014371,35.54626],[-84.015371,35.546248],[-84.016112,35.546239],[-84.019123,35.546077],[-84.021189,35.546088],[-84.022331,35.546206],[-84.024281,35.546596],[-84.025698,35.546786],[-84.027371,35.546782],[-84.028876,35.546738],[-84.030008,35.546622],[-84.030402,35.546512],[-84.031462,35.546215],[-84.032446,35.545793],[-84.033078,35.545462],[-84.033978,35.54499],[-84.034009,35.544974],[-84.036149,35.543912],[-84.038753,35.542679],[-84.040424,35.542247],[-84.041137,35.542189],[-84.041673,35.542146],[-84.042329,35.542161],[-84.042466,35.542164],[-84.042604,35.542167],[-84.042972,35.542175],[-84.043122,35.54222],[-84.044095,35.542511],[-84.045122,35.542942],[-84.045317,35.543024],[-84.046185,35.543715],[-84.046518,35.544045],[-84.046965,35.544487],[-84.047882,35.545033],[-84.048203,35.545211],[-84.048667,35.54547],[-84.04876,35.545522],[-84.04883,35.545544],[-84.049208,35.545664],[-84.049585,35.545785],[-84.049703,35.545822],[-84.049924,35.545892],[-84.050002,35.545912],[-84.050053,35.545933],[-84.050139,35.54596],[-84.050302,35.546012],[-84.050399,35.546034],[-84.050488,35.546055],[-84.051754,35.546353],[-84.052936,35.546414],[-84.054117,35.546338],[-84.056506,35.545904],[-84.057214,35.545803],[-84.05865,35.545599],[-84.060175,35.545538],[-84.060329,35.545552],[-84.060618,35.545577],[-84.060907,35.545602],[-84.062744,35.545764],[-84.064418,35.546073],[-84.064916,35.546135],[-84.066328,35.546309],[-84.066693,35.546326],[-84.06809,35.546393],[-84.069309,35.546244],[-84.069433,35.546218],[-84.069646,35.546173],[-84.069859,35.546128],[-84.070361,35.546023],[-84.072249,35.545227],[-84.072721,35.545073],[-84.072813,35.545043],[-84.073919,35.544682],[-84.074477,35.544539],[-84.074577,35.544513],[-84.074677,35.544487],[-84.075315,35.544323],[-84.076603,35.543932],[-84.077142,35.543689],[-84.077747,35.543417],[-84.078047,35.543282],[-84.080215,35.541824],[-84.081561,35.541231],[-84.083292,35.541105],[-84.084532,35.541157],[-84.084548,35.541161],[-84.085507,35.541372],[-84.086474,35.541934],[-84.086805,35.542133],[-84.087529,35.542567],[-84.088181,35.543041],[-84.088794,35.543709],[-84.0892,35.544466],[-84.08939,35.544984],[-84.089588,35.545521],[-84.090036,35.546834],[-84.090711,35.548195],[-84.091118,35.548992],[-84.091194,35.549137],[-84.091744,35.550176],[-84.092525,35.551206],[-84.092709,35.551392],[-84.093158,35.551849],[-84.093748,35.552375],[-84.094807,35.55332],[-84.094249,35.55402],[-84.093641,35.554781],[-84.091132,35.5579],[-84.089614,35.559788],[-84.087768,35.559875],[-84.091438,35.563397],[-84.092165,35.564107],[-84.092973,35.564901],[-84.096196,35.567997],[-84.096192,35.568851],[-84.096191,35.569357],[-84.096184,35.571409],[-84.09617,35.575245],[-84.096169,35.575487],[-84.096486,35.575473],[-84.100635,35.5753],[-84.104351,35.575146],[-84.10444,35.575142],[-84.10451,35.575036],[-84.104582,35.574931],[-84.104721,35.574725],[-84.105137,35.574101],[-84.105386,35.573806],[-84.105576,35.573697],[-84.105766,35.573588],[-84.105855,35.573537],[-84.106062,35.573455],[-84.106086,35.573446],[-84.106314,35.573393],[-84.106373,35.573403],[-84.106725,35.573462],[-84.106929,35.573526],[-84.106966,35.573537],[-84.107053,35.573637],[-84.107102,35.573694],[-84.107197,35.573803],[-84.107314,35.573939],[-84.107484,35.574135],[-84.107654,35.574332],[-84.110436,35.577554],[-84.111764,35.576758],[-84.112321,35.577735],[-84.109418,35.579698],[-84.110062,35.58297],[-84.109841,35.584384],[-84.112319,35.587456],[-84.116943,35.584537],[-84.11787,35.583953],[-84.117944,35.583907],[-84.118128,35.583791],[-84.118944,35.583275],[-84.119713,35.58132],[-84.12094,35.582331],[-84.121694,35.582333],[-84.122405,35.582334],[-84.125071,35.582343],[-84.125114,35.582345],[-84.125122,35.582345],[-84.125247,35.58235],[-84.125339,35.581083],[-84.125486,35.580616],[-84.126065,35.579966],[-84.126992,35.5792],[-84.127256,35.578896],[-84.127508,35.578321],[-84.127798,35.578042],[-84.128798,35.577461],[-84.130523,35.576781],[-84.130953,35.576313],[-84.13288,35.579025],[-84.132845,35.580192],[-84.138265,35.580079],[-84.138612,35.58035],[-84.138909,35.580507],[-84.139224,35.580642],[-84.139923,35.580763],[-84.140295,35.580828],[-84.140256,35.581445],[-84.140114,35.581908],[-84.13983,35.582839],[-84.140016,35.58363],[-84.141046,35.583649],[-84.14871,35.58379],[-84.148736,35.584791],[-84.14891,35.591265],[-84.1514,35.59151],[-84.15302,35.59167],[-84.154581,35.591825],[-84.157895,35.592152],[-84.158517,35.592214],[-84.159306,35.592292],[-84.1595,35.592312],[-84.16217,35.592576],[-84.169121,35.593264],[-84.169319,35.593283],[-84.170773,35.593427],[-84.170868,35.593436],[-84.17551,35.595735],[-84.177742,35.596842],[-84.17833,35.597134],[-84.180094,35.59801],[-84.180683,35.598303],[-84.181537,35.598726],[-84.181648,35.598782],[-84.181868,35.598892],[-84.183283,35.601523],[-84.183516,35.601956],[-84.183822,35.602456],[-84.183854,35.602509],[-84.183866,35.602527],[-84.183909,35.602599],[-84.18395,35.60267],[-84.183983,35.602724],[-84.184,35.602752],[-84.184064,35.602871],[-84.184256,35.603229],[-84.184321,35.603349],[-84.184406,35.603504],[-84.184569,35.603799],[-84.184663,35.603969],[-84.184749,35.604125],[-84.184759,35.604143],[-84.184789,35.604197],[-84.184799,35.604216],[-84.184822,35.604259],[-84.184835,35.604282],[-84.184878,35.604362],[-84.184896,35.604396],[-84.184923,35.604444],[-84.185074,35.604715],[-84.186387,35.607093],[-84.186555,35.607392],[-84.186617,35.607502],[-84.186656,35.607571],[-84.186695,35.60764],[-84.186759,35.607753],[-84.186808,35.60784],[-84.18692,35.60804],[-84.187184,35.608509],[-84.187222,35.608577],[-84.187274,35.60867],[-84.187326,35.608762],[-84.187362,35.608825],[-84.187375,35.608849],[-84.187398,35.608889],[-84.187485,35.609044],[-84.187522,35.609111],[-84.187572,35.609199],[-84.187654,35.609347],[-84.1879,35.609794],[-84.187983,35.609943],[-84.188027,35.610023],[-84.188162,35.610266],[-84.188207,35.610347],[-84.188216,35.610363],[-84.188234,35.610396],[-84.188239,35.610405],[-84.188255,35.610433],[-84.188288,35.610493],[-84.188303,35.61052],[-84.188319,35.610549],[-84.188417,35.610727],[-84.188713,35.611261],[-84.188756,35.611339],[-84.188812,35.61144],[-84.188984,35.611753],[-84.189501,35.612692],[-84.189674,35.613006],[-84.189856,35.613337],[-84.190178,35.613921],[-84.190404,35.614333],[-84.190587,35.614665],[-84.190613,35.614712],[-84.190691,35.614854],[-84.190718,35.614902],[-84.190803,35.615057],[-84.190872,35.615172],[-84.190884,35.615205],[-84.190942,35.61531],[-84.190967,35.615356],[-84.191074,35.61555],[-84.191502,35.616329],[-84.19177,35.616719],[-84.191782,35.616736],[-84.19263,35.618241],[-84.195041,35.618032],[-84.195871,35.617938],[-84.195961,35.617935],[-84.196447,35.617885],[-84.196606,35.617871],[-84.197265,35.617804],[-84.197956,35.617733],[-84.198406,35.617687],[-84.198688,35.617658],[-84.199378,35.617587],[-84.199536,35.617572],[-84.199796,35.617546],[-84.199819,35.617544],[-84.199837,35.617541],[-84.199903,35.617535],[-84.199912,35.617534],[-84.199926,35.617532],[-84.199972,35.617528],[-84.199987,35.617527],[-84.200001,35.617525],[-84.200047,35.61752],[-84.200062,35.617519],[-84.200168,35.617507],[-84.200488,35.617475],[-84.200595,35.617464],[-84.201333,35.617387],[-84.203549,35.61716],[-84.204288,35.617085],[-84.206112,35.616897],[-84.211587,35.616337],[-84.213413,35.616151],[-84.2143,35.61606],[-84.214466,35.616042],[-84.215186,35.615968],[-84.21634,35.615848],[-84.217484,35.615735],[-84.217537,35.61573],[-84.217628,35.615719],[-84.218198,35.615655],[-84.218438,35.615631],[-84.218682,35.615606],[-84.219005,35.615572],[-84.219977,35.615471],[-84.220301,35.615438],[-84.221451,35.615322],[-84.222108,35.616036],[-84.222735,35.616758],[-84.223453,35.617698],[-84.224361,35.618819],[-84.22437,35.61883],[-84.225247,35.619761],[-84.22646,35.620875],[-84.227099,35.621264],[-84.227679,35.621618],[-84.228423,35.622074],[-84.229529,35.622358],[-84.230594,35.622296],[-84.231893,35.622047],[-84.232498,35.62199],[-84.233252,35.621919],[-84.234906,35.621612],[-84.236076,35.621218],[-84.236782,35.620884],[-84.238078,35.620279],[-84.239786,35.619537],[-84.240278,35.619324],[-84.242468,35.618376],[-84.24412,35.617835],[-84.245144,35.617612],[-84.246089,35.617445],[-84.246709,35.617337],[-84.247891,35.617242],[-84.248956,35.617217],[-84.249917,35.617196],[-84.250494,35.617246],[-84.250808,35.617274],[-84.2517,35.617352],[-84.25177,35.617358],[-84.252219,35.617459],[-84.252785,35.617587],[-84.253584,35.618327],[-84.253686,35.618527],[-84.254195,35.619522],[-84.254461,35.620585],[-84.254524,35.621843],[-84.254529,35.622314],[-84.254543,35.623377],[-84.254502,35.623626],[-84.254322,35.624712],[-84.254266,35.625019],[-84.254256,35.625077],[-84.253929,35.6262],[-84.253315,35.627627],[-84.252713,35.628954],[-84.252701,35.628982],[-84.252018,35.630184],[-84.251268,35.630717],[-84.251064,35.630827],[-84.249917,35.63145],[-84.248799,35.632358],[-84.248341,35.6329],[-84.2476,35.633782],[-84.247669,35.633935],[-84.247747,35.63404],[-84.247834,35.634029],[-84.248418,35.633961],[-84.248971,35.633813],[-84.249345,35.633714],[-84.249507,35.633984],[-84.249917,35.634667],[-84.249969,35.634809],[-84.250078,35.635106],[-84.25009,35.635138],[-84.250126,35.635237],[-84.250139,35.63527],[-84.250146,35.635282],[-84.250252,35.635565],[-84.250585,35.636456],[-84.250697,35.636753],[-84.250715,35.6368],[-84.250771,35.636941],[-84.25079,35.636989],[-84.252109,35.636512],[-84.254065,35.635807],[-84.255248,35.634037],[-84.256028,35.632871],[-84.256048,35.632818],[-84.256111,35.63266],[-84.256132,35.632608],[-84.256186,35.63247],[-84.256352,35.632059],[-84.256407,35.631922],[-84.256503,35.631985],[-84.256792,35.632174],[-84.256889,35.632237],[-84.256907,35.632272],[-84.256912,35.632281],[-84.257967,35.63314],[-84.258806,35.633675],[-84.259646,35.63421],[-84.260491,35.634749],[-84.261336,35.635288],[-84.261629,35.635276],[-84.261922,35.635264],[-84.262288,35.635249],[-84.262464,35.635279],[-84.263209,35.635632],[-84.263385,35.635686],[-84.263541,35.635685],[-84.264234,35.635559],[-84.264858,35.635489],[-84.26766,35.635457],[-84.267728,35.63545],[-84.267926,35.635432],[-84.26835,35.635456],[-84.269497,35.635471],[-84.269824,35.635475],[-84.272452,35.635506],[-84.273423,35.635517],[-84.281835,35.635572],[-84.281776,35.640829],[-84.282185,35.641346],[-84.282392,35.641482],[-84.283308,35.641525],[-84.288001,35.641727],[-84.290059,35.641861],[-84.290805,35.641872],[-84.290821,35.642514],[-84.290793,35.642905],[-84.290777,35.643006],[-84.290887,35.643017],[-84.297522,35.643152],[-84.296241,35.646975],[-84.295383,35.649535],[-84.2953,35.649843],[-84.295197,35.650229],[-84.295088,35.650286],[-84.294652,35.650258],[-84.294575,35.650254],[-84.294338,35.650303],[-84.293879,35.650282],[-84.291567,35.650181],[-84.291088,35.650219],[-84.290867,35.650327],[-84.29086,35.651098],[-84.290859,35.651203],[-84.290837,35.651717],[-84.290837,35.65229],[-84.290781,35.654264],[-84.290765,35.654838],[-84.290765,35.654925],[-84.290952,35.654949],[-84.29111,35.654971],[-84.291522,35.654937],[-84.291713,35.654923],[-84.291751,35.654919],[-84.291865,35.654911],[-84.291904,35.654908],[-84.292205,35.654908],[-84.295063,35.654916],[-84.299561,35.654928],[-84.299549,35.657673],[-84.308698,35.657795],[-84.308998,35.657913],[-84.309174,35.658068],[-84.309567,35.658437],[-84.309656,35.658557],[-84.309691,35.658657],[-84.309721,35.658844],[-84.309744,35.658957],[-84.309833,35.659077],[-84.309955,35.659199],[-84.310078,35.659287],[-84.310238,35.659311],[-84.310417,35.65928],[-84.310591,35.659235],[-84.310814,35.659188],[-84.311032,35.659153],[-84.311286,35.659165],[-84.311661,35.659217],[-84.311903,35.659256],[-84.312084,35.659293],[-84.312363,35.659378],[-84.313286,35.659676],[-84.313603,35.659789],[-84.313985,35.659918],[-84.314378,35.660061],[-84.31469,35.660151],[-84.315008,35.660219],[-84.315518,35.660343],[-84.315779,35.660415],[-84.315917,35.660454],[-84.316159,35.660506],[-84.316281,35.660516],[-84.316338,35.660517],[-84.316391,35.660516],[-84.316514,35.660507],[-84.316699,35.660459],[-84.316906,35.660392],[-84.317082,35.660316],[-84.317402,35.660081],[-84.31759,35.65996],[-84.317541,35.660053],[-84.317513,35.66017],[-84.317503,35.6604],[-84.317502,35.660521],[-84.317498,35.660932],[-84.317498,35.660944],[-84.317495,35.661341],[-84.317499,35.661477],[-84.317503,35.661576],[-84.317502,35.661951],[-84.317508,35.662567],[-84.317499,35.662905],[-84.317506,35.663245],[-84.317507,35.663602],[-84.317501,35.66386],[-84.317507,35.664868],[-84.317493,35.665813],[-84.317494,35.666075],[-84.317497,35.666342],[-84.317483,35.666676],[-84.317413,35.667598],[-84.317445,35.66787],[-84.317455,35.668108],[-84.317466,35.668365],[-84.317489,35.668817],[-84.317495,35.669097],[-84.317506,35.669485],[-84.317514,35.669673],[-84.317524,35.669892],[-84.317526,35.670267],[-84.317531,35.670407],[-84.317541,35.670766],[-84.317555,35.671555],[-84.317577,35.671818],[-84.3176,35.672005],[-84.317615,35.672059],[-84.317628,35.672107],[-84.319268,35.672127],[-84.321799,35.672156],[-84.324206,35.672182],[-84.325852,35.672201],[-84.326176,35.672203],[-84.326443,35.672204],[-84.326454,35.667867],[-84.326464,35.666688],[-84.326467,35.666257],[-84.326477,35.665005],[-84.326513,35.665003],[-84.326906,35.664959],[-84.327143,35.66496],[-84.327453,35.664964],[-84.329099,35.664982],[-84.329648,35.664989],[-84.329659,35.66499],[-84.334968,35.665048],[-84.337646,35.665092],[-84.338234,35.665102],[-84.339503,35.665003],[-84.339975,35.665013],[-84.340557,35.665026],[-84.341476,35.66504],[-84.342389,35.665042],[-84.342614,35.665044],[-84.343466,35.665074],[-84.347533,35.665185],[-84.349176,35.665164],[-84.355212,35.665162],[-84.357608,35.665162],[-84.357602,35.662106],[-84.357585,35.657916],[-84.357486,35.657906],[-84.35602,35.657862],[-84.354936,35.657866],[-84.354665,35.657857],[-84.354589,35.657846],[-84.353303,35.657837],[-84.353287,35.655906],[-84.353275,35.654396],[-84.355739,35.654409],[-84.35621,35.654412],[-84.356331,35.654413],[-84.357845,35.654421],[-84.362228,35.654448],[-84.36223,35.654039],[-84.362238,35.652442],[-84.362212,35.652216],[-84.362213,35.651806],[-84.362214,35.651512],[-84.362232,35.651183],[-84.362243,35.650948],[-84.362224,35.650082],[-84.362229,35.649595],[-84.362211,35.649308],[-84.362205,35.648643],[-84.36221,35.648189],[-84.362215,35.647988],[-84.362245,35.647309],[-84.36225,35.647285],[-84.36227,35.647189],[-84.366068,35.646977],[-84.366739,35.646974],[-84.366933,35.646978],[-84.36709,35.646978],[-84.367531,35.646988],[-84.368023,35.646976],[-84.369505,35.647025],[-84.369758,35.647025],[-84.370518,35.647025],[-84.370772,35.647025],[-84.371296,35.647025],[-84.371303,35.645529],[-84.371304,35.645509],[-84.371314,35.643713],[-84.371315,35.643451],[-84.374387,35.643449],[-84.374392,35.642539],[-84.374397,35.641706],[-84.374924,35.641682],[-84.375572,35.641678],[-84.377688,35.641664],[-84.377671,35.64152],[-84.37766,35.641414],[-84.378739,35.641416],[-84.380115,35.641419],[-84.380124,35.640592],[-84.38529,35.640644],[-84.385302,35.640536],[-84.385275,35.64034],[-84.385216,35.640172],[-84.385107,35.639975],[-84.385011,35.639841],[-84.386149,35.639831],[-84.388969,35.63981],[-84.388948,35.640084],[-84.394139,35.640155],[-84.398074,35.640208],[-84.398074,35.640228],[-84.39809,35.640737],[-84.398054,35.64213],[-84.398061,35.642535],[-84.398019,35.643325],[-84.398001,35.644215],[-84.397926,35.645536],[-84.397918,35.650184],[-84.397917,35.650219],[-84.397901,35.650995],[-84.406502,35.651188],[-84.406459,35.654637],[-84.402237,35.654694],[-84.402765,35.656044],[-84.404484,35.660435],[-84.403663,35.66086],[-84.403931,35.661315],[-84.406472,35.665622],[-84.408502,35.665609],[-84.408975,35.66561],[-84.408992,35.665802],[-84.409042,35.665831],[-84.410509,35.666698],[-84.41053,35.666711],[-84.41079,35.666381],[-84.410918,35.666325],[-84.411564,35.666138],[-84.412152,35.665943],[-84.41218,35.665903],[-84.412201,35.665848],[-84.412315,35.66571],[-84.41243,35.665595],[-84.412474,35.665553],[-84.412584,35.665452],[-84.412612,35.66543],[-84.412661,35.665394],[-84.413643,35.665044],[-84.414254,35.664828],[-84.413044,35.666992],[-84.412536,35.667903],[-84.412566,35.667911],[-84.412656,35.667935],[-84.412687,35.667944],[-84.412801,35.667975],[-84.413455,35.666923],[-84.414515,35.665219],[-84.415514,35.663414],[-84.416172,35.662228],[-84.416207,35.66224],[-84.416301,35.662262],[-84.416503,35.662289],[-84.416563,35.662311],[-84.416698,35.662328],[-84.417075,35.662361],[-84.417358,35.662344],[-84.417627,35.662355],[-84.417782,35.662388],[-84.417936,35.662438],[-84.418246,35.66258],[-84.418347,35.662652],[-84.418401,35.662679],[-84.418737,35.66291],[-84.418986,35.663064],[-84.419094,35.663119],[-84.419181,35.663174],[-84.419424,35.663317],[-84.419544,35.663392],[-84.419565,35.663405],[-84.419679,35.66346],[-84.419881,35.663569],[-84.419922,35.663586],[-84.419955,35.663608],[-84.420076,35.663646],[-84.420191,35.663663],[-84.4204,35.663663],[-84.420474,35.663646],[-84.420554,35.663597],[-84.420642,35.663526],[-84.420696,35.663416],[-84.42073,35.663317],[-84.420817,35.663185],[-84.420857,35.663136],[-84.420918,35.663103],[-84.420958,35.663092],[-84.421053,35.663075],[-84.421423,35.663086],[-84.421566,35.663106],[-84.421699,35.663125],[-84.421988,35.663152],[-84.422177,35.663152],[-84.422453,35.663125],[-84.422682,35.663081],[-84.42289,35.663015],[-84.422991,35.66296],[-84.423159,35.662839],[-84.423213,35.662812],[-84.423415,35.662658],[-84.423516,35.662559],[-84.42353,35.662526],[-84.423557,35.662499],[-84.423712,35.662246],[-84.423792,35.662092],[-84.423846,35.661977],[-84.42388,35.661719],[-84.423866,35.661658],[-84.423826,35.661565],[-84.424785,35.661078],[-84.425619,35.662526],[-84.425619,35.662658],[-84.425575,35.662877],[-84.425444,35.663206],[-84.42529,35.663492],[-84.425158,35.663733],[-84.425136,35.663887],[-84.42518,35.664062],[-84.425312,35.664194],[-84.425444,35.664216],[-84.425619,35.664282],[-84.425707,35.664369],[-84.425663,35.665225],[-84.423907,35.665159],[-84.423776,35.665357],[-84.423644,35.665576],[-84.423534,35.665862],[-84.4236,35.666147],[-84.423578,35.666388],[-84.423512,35.666783],[-84.423381,35.6672],[-84.423227,35.667529],[-84.422942,35.668012],[-84.424149,35.668517],[-84.423996,35.669245],[-84.423925,35.66964],[-84.423715,35.670828],[-84.423645,35.671224],[-84.423625,35.671326],[-84.423568,35.671632],[-84.423549,35.671735],[-84.423586,35.671756],[-84.42385,35.671953],[-84.424025,35.672058],[-84.424046,35.672065],[-84.424215,35.672124],[-84.424474,35.672182],[-84.424977,35.672252],[-84.425376,35.672269],[-84.425822,35.672257],[-84.426422,35.672243],[-84.426422,35.672231],[-84.426459,35.672228],[-84.427157,35.672224],[-84.427399,35.672249],[-84.427479,35.672264],[-84.42758,35.67209],[-84.427628,35.672007],[-84.427839,35.671934],[-84.428055,35.671935],[-84.4288,35.671938],[-84.429121,35.67194],[-84.432917,35.671958],[-84.433364,35.671959],[-84.433835,35.671775],[-84.434428,35.671381],[-84.435214,35.671002],[-84.436229,35.670893],[-84.436544,35.670909],[-84.437664,35.671077],[-84.437254,35.669486],[-84.437298,35.669234],[-84.437545,35.668616],[-84.437865,35.667873],[-84.435684,35.66787],[-84.4356,35.667585],[-84.435549,35.667343],[-84.435591,35.667141],[-84.435846,35.666758],[-84.435925,35.666438],[-84.43578,35.665953],[-84.436315,35.665951],[-84.436493,35.665951],[-84.448094,35.665957],[-84.448658,35.665946],[-84.44921,35.665928],[-84.449308,35.665926],[-84.450026,35.665908],[-84.4505,35.665904],[-84.45101,35.66585],[-84.451171,35.665833],[-84.451286,35.665829],[-84.452017,35.665811],[-84.452118,35.665809],[-84.452396,35.665807],[-84.452603,35.665805],[-84.453289,35.665795],[-84.453583,35.665796],[-84.453677,35.665794],[-84.455404,35.665774],[-84.456836,35.665767],[-84.457249,35.665763],[-84.457217,35.660199],[-84.457219,35.660086],[-84.45724,35.659081],[-84.458231,35.658775],[-84.458363,35.658735],[-84.460119,35.658623],[-84.461407,35.658488],[-84.463638,35.658537],[-84.46498,35.658503],[-84.465187,35.658501],[-84.465278,35.658501],[-84.466684,35.658493],[-84.467744,35.658492],[-84.470698,35.658416],[-84.47318,35.658423],[-84.474413,35.658427],[-84.477568,35.658437],[-84.477894,35.658365],[-84.478703,35.658157],[-84.47899,35.658109],[-84.481041,35.658272],[-84.481729,35.658311],[-84.482296,35.658343],[-84.483211,35.658396],[-84.484001,35.658382],[-84.484041,35.658381],[-84.484465,35.658373],[-84.48455,35.658373],[-84.486754,35.658376],[-84.486851,35.657904],[-84.487309,35.655678],[-84.487344,35.655508],[-84.492895,35.655465],[-84.495561,35.655445],[-84.495575,35.655445],[-84.495592,35.655445],[-84.495592,35.65547],[-84.495592,35.655484],[-84.495591,35.656176],[-84.495583,35.656423],[-84.495525,35.658378],[-84.496388,35.658413],[-84.497327,35.658452],[-84.497727,35.658468],[-84.498927,35.658518],[-84.499145,35.658527],[-84.499143,35.65871],[-84.499137,35.65939],[-84.499131,35.660161],[-84.49913,35.660251],[-84.499253,35.660259],[-84.49993,35.660301],[-84.50022,35.660296],[-84.500222,35.660387],[-84.500233,35.660725],[-84.500245,35.661069],[-84.500245,35.661091],[-84.500169,35.663761],[-84.500114,35.665745],[-84.50152,35.665785],[-84.504274,35.665866],[-84.504305,35.664399],[-84.504336,35.662993],[-84.50435,35.662291],[-84.504354,35.662144],[-84.504396,35.660188],[-84.504412,35.659487],[-84.504416,35.659272],[-84.504419,35.659094],[-84.50443,35.658603],[-84.50447,35.656726],[-84.504593,35.651098],[-84.504595,35.651034],[-84.506004,35.651074],[-84.506406,35.651085],[-84.506537,35.651088],[-84.506933,35.651098],[-84.507065,35.651102],[-84.50735,35.651143],[-84.507459,35.651159],[-84.508205,35.651266],[-84.508491,35.651308],[-84.508944,35.65131],[-84.50943,35.651312],[-84.512248,35.651327],[-84.5132,35.651332],[-84.516501,35.651323],[-84.51668,35.651326],[-84.521029,35.651379],[-84.522162,35.651394],[-84.522486,35.645117],[-84.522545,35.643984],[-84.518383,35.644008],[-84.518047,35.644009],[-84.513697,35.644034],[-84.513697,35.644],[-84.513701,35.643901],[-84.513702,35.643868],[-84.513711,35.643542],[-84.513738,35.642603],[-84.513739,35.642567],[-84.51374,35.642542],[-84.513749,35.642242],[-84.51275,35.642234],[-84.510431,35.642216],[-84.510207,35.642215],[-84.509888,35.642213],[-84.509243,35.642154],[-84.509201,35.639474],[-84.513774,35.639492],[-84.513771,35.639229],[-84.513771,35.638746],[-84.513773,35.638037],[-84.513786,35.6373],[-84.513788,35.637189],[-84.513777,35.636829],[-84.51346,35.636819],[-84.513204,35.636817],[-84.512528,35.636813],[-84.511482,35.636778],[-84.511001,35.636762],[-84.510909,35.636759],[-84.510821,35.636756],[-84.510763,35.636754],[-84.510646,35.63675],[-84.510602,35.636748],[-84.510526,35.636745],[-84.509286,35.636698],[-84.508657,35.636686],[-84.508579,35.629399],[-84.505246,35.629393],[-84.504192,35.629392],[-84.502235,35.629392],[-84.500061,35.62939],[-84.500078,35.629372],[-84.500131,35.629323],[-84.500151,35.629306],[-84.500326,35.629159],[-84.500319,35.62906],[-84.500198,35.628763],[-84.500205,35.628598],[-84.500394,35.62834],[-84.500495,35.628022],[-84.500434,35.627813],[-84.500468,35.627555],[-84.500522,35.627521],[-84.500637,35.627417],[-84.500793,35.627201],[-84.500833,35.627152],[-84.500877,35.627083],[-84.500995,35.626894],[-84.501022,35.626707],[-84.501136,35.626509],[-84.501298,35.626383],[-84.501748,35.62618],[-84.501929,35.626022],[-84.501943,35.625956],[-84.501963,35.62578],[-84.501997,35.625659],[-84.50234,35.625484],[-84.502441,35.625396],[-84.502408,35.625259],[-84.502426,35.625092],[-84.502428,35.625073],[-84.502389,35.624657],[-84.502396,35.624542],[-84.502396,35.624438],[-84.502497,35.624262],[-84.502726,35.623993],[-84.502834,35.623801],[-84.503116,35.623548],[-84.503204,35.623334],[-84.503372,35.623115],[-84.503413,35.622939],[-84.503595,35.622692],[-84.503703,35.622362],[-84.503763,35.622109],[-84.503441,35.62173],[-84.503488,35.621434],[-84.503387,35.621335],[-84.503428,35.621148],[-84.503415,35.620648],[-84.503489,35.62056],[-84.503657,35.620478],[-84.503994,35.620473],[-84.504155,35.620346],[-84.504263,35.620105],[-84.504337,35.620028],[-84.504653,35.619825],[-84.504727,35.619671],[-84.504746,35.619542],[-84.51371,35.619494],[-84.51371,35.620967],[-84.513715,35.621138],[-84.513718,35.621268],[-84.513902,35.621247],[-84.514038,35.621231],[-84.514103,35.621229],[-84.516041,35.62312],[-84.516058,35.623119],[-84.516653,35.623085],[-84.517331,35.623046],[-84.517365,35.624057],[-84.517368,35.624132],[-84.51737,35.624191],[-84.51745,35.624191],[-84.523124,35.624187],[-84.52585,35.624186],[-84.525859,35.625073],[-84.525899,35.626058],[-84.525984,35.628113],[-84.529546,35.628116],[-84.531419,35.628119],[-84.531411,35.628244],[-84.531398,35.628475],[-84.531409,35.628619],[-84.53142,35.628745],[-84.531424,35.628886],[-84.531441,35.629313],[-84.531448,35.629457],[-84.534006,35.629555],[-84.534197,35.630128],[-84.535255,35.633291],[-84.535386,35.633696],[-84.539013,35.63779],[-84.539197,35.637597],[-84.540067,35.63669],[-84.541694,35.63769],[-84.542568,35.63823],[-84.545191,35.639855],[-84.545632,35.640128],[-84.545645,35.640136],[-84.546067,35.640398],[-84.546136,35.640437],[-84.546346,35.640554],[-84.546416,35.640594],[-84.546913,35.640901],[-84.547603,35.641327],[-84.548536,35.641196],[-84.549115,35.641115],[-84.549115,35.640941],[-84.549115,35.640571],[-84.549137,35.64048],[-84.549171,35.640425],[-84.549165,35.640381],[-84.549149,35.640262],[-84.549098,35.640174],[-84.549134,35.63925],[-84.54923,35.636896],[-84.549644,35.636907],[-84.550569,35.636934],[-84.553206,35.636947],[-84.557926,35.636973],[-84.557902,35.63378],[-84.557883,35.631143],[-84.557877,35.630432],[-84.557872,35.629651],[-84.559221,35.629668],[-84.559932,35.629678],[-84.562524,35.629713],[-84.566934,35.629773],[-84.566915,35.633142],[-84.566915,35.63324],[-84.569003,35.633222],[-84.569411,35.633218],[-84.570863,35.633204],[-84.573259,35.633182],[-84.575222,35.633165],[-84.575656,35.633161],[-84.576675,35.633153],[-84.578569,35.633136],[-84.584254,35.633086],[-84.584296,35.633086],[-84.584276,35.634509],[-84.584277,35.634561],[-84.584289,35.634939],[-84.584298,35.635281],[-84.584301,35.635397],[-84.584339,35.636772],[-84.58435,35.637149],[-84.584352,35.637231],[-84.584361,35.637566],[-84.584361,35.637621],[-84.584369,35.638105],[-84.584413,35.64073],[-84.584428,35.641606],[-84.584436,35.642169],[-84.584454,35.643304],[-84.584463,35.64386],[-84.584472,35.644424],[-84.584471,35.644433],[-84.584471,35.644462],[-84.584471,35.644472],[-84.584468,35.644736],[-84.584461,35.645534],[-84.584461,35.645801],[-84.584455,35.646307],[-84.584447,35.64783],[-84.584444,35.648339],[-84.584448,35.648737],[-84.584449,35.648753],[-84.584463,35.649932],[-84.584469,35.650331],[-84.584464,35.650586],[-84.584458,35.650946],[-84.584428,35.651352],[-84.58441,35.651607],[-84.583445,35.65161],[-84.580551,35.651621],[-84.579587,35.651625],[-84.57895,35.651627],[-84.577043,35.651634],[-84.576407,35.651638],[-84.575503,35.651638],[-84.575515,35.652057],[-84.575631,35.656025],[-84.575671,35.657348],[-84.57567,35.657404],[-84.575664,35.657599],[-84.57565,35.65812],[-84.575623,35.65831],[-84.575621,35.658352],[-84.575615,35.658604],[-84.575614,35.658617],[-84.575612,35.658656],[-84.575612,35.65867],[-84.57561,35.658713],[-84.575603,35.658845],[-84.575602,35.658889],[-84.573623,35.658879],[-84.567693,35.658852],[-84.56629,35.658846],[-84.565717,35.658843],[-84.562035,35.658836],[-84.556047,35.658828],[-84.553352,35.658825],[-84.553362,35.66118],[-84.55337,35.662406],[-84.550918,35.662404],[-84.54986,35.662402],[-84.548872,35.662402],[-84.548833,35.664584],[-84.548815,35.665642],[-84.548814,35.665726],[-84.548811,35.665977],[-84.54881,35.666062],[-84.547546,35.666037],[-84.543756,35.665964],[-84.542493,35.66594],[-84.542235,35.665935],[-84.541461,35.66592],[-84.541204,35.665916],[-84.541099,35.665914],[-84.541013,35.665908],[-84.540443,35.665872],[-84.540332,35.665866],[-84.540254,35.665873],[-84.540213,35.665876],[-84.540198,35.665879],[-84.540154,35.665882],[-84.54014,35.665883],[-84.540098,35.665887],[-84.540085,35.665889],[-84.540031,35.665894],[-84.540001,35.666764],[-84.539992,35.667054],[-84.539972,35.669539],[-84.539968,35.670158],[-84.539963,35.670465]]],[[[-84.540351,35.61824],[-84.540354,35.61937],[-84.540355,35.619427],[-84.537019,35.619415],[-84.535889,35.619411],[-84.533449,35.619402],[-84.526894,35.619381],[-84.526775,35.618672],[-84.526731,35.618671],[-84.524294,35.618644],[-84.523909,35.618638],[-84.522757,35.618628],[-84.522373,35.618625],[-84.522554,35.617412],[-84.522582,35.617214],[-84.522592,35.616745],[-84.522639,35.615881],[-84.522634,35.615452],[-84.522599,35.614598],[-84.522576,35.613578],[-84.522552,35.612497],[-84.522512,35.611732],[-84.522508,35.611653],[-84.522552,35.611448],[-84.522651,35.610995],[-84.522429,35.607782],[-84.523104,35.607786],[-84.525132,35.607798],[-84.525809,35.607803],[-84.525847,35.607803],[-84.525964,35.607803],[-84.526004,35.607804],[-84.525933,35.608582],[-84.525723,35.610916],[-84.525653,35.611695],[-84.525647,35.611779],[-84.527007,35.611775],[-84.531342,35.611765],[-84.532787,35.611762],[-84.533681,35.611759],[-84.534866,35.611756],[-84.535109,35.611756],[-84.535594,35.611755],[-84.540328,35.611744],[-84.540341,35.615432],[-84.540351,35.61824]]],[[[-84.350001,35.632939],[-84.352799,35.637157],[-84.355297,35.640924],[-84.351172,35.643203],[-84.349251,35.644264],[-84.343901,35.637829],[-84.342871,35.636585],[-84.346546,35.634706],[-84.34747,35.634232],[-84.350001,35.632939]]],[[[-84.539963,35.670465],[-84.540219,35.670466],[-84.540988,35.670474],[-84.541246,35.670477],[-84.54134,35.670476],[-84.541625,35.670478],[-84.541723,35.670481],[-84.543131,35.670491],[-84.547363,35.670524],[-84.548774,35.670536],[-84.548777,35.673213],[-84.548068,35.673207],[-84.544534,35.673179],[-84.544266,35.673265],[-84.544214,35.676893],[-84.541503,35.67686],[-84.539774,35.67684],[-84.539822,35.675185],[-84.539827,35.674915],[-84.539842,35.674107],[-84.539848,35.673838],[-84.539869,35.673301],[-84.539932,35.671689],[-84.539954,35.671153],[-84.539955,35.671061],[-84.539958,35.670785],[-84.53996,35.670694],[-84.53996,35.670648],[-84.539962,35.67051],[-84.539963,35.670465]]]] - } - }] - }; - - var myMap = geo.map({ - node: '#map', - zoom: 11, - center: { - x: -84.5, - y: 35.65 - } - }); - - var layer = myMap.createLayer('feature'); - - geo.createFileReader('jsonReader', { - layer: layer - }).read(JSON.stringify(data), function() { - myMap.draw(); - }); - - myMap.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/glMultiPolygons/testGlMultiPolygons.py b/testing/test-cases/selenium-tests/glMultiPolygons/testGlMultiPolygons.py deleted file mode 100644 index e3154d39d4..0000000000 --- a/testing/test-cases/selenium-tests/glMultiPolygons/testGlMultiPolygons.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -from selenium_test import FirefoxTest, ChromeTest - - -class glMultiPolygonsBase(object): - testCase = ('glMultiPolygons',) - testRevision = 6 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glMultiPolygons/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlMultiPolygons(self): - self.loadPage() - - testName = 'drawGlMultiPolygons' - self.screenshotTest(testName, revision=self.testRevision) - - -class FirefoxOSM(glMultiPolygonsBase, FirefoxTest): - testCase = glMultiPolygonsBase.testCase + ('firefox',) - - -class ChromeOSM(glMultiPolygonsBase, ChromeTest): - testCase = glMultiPolygonsBase.testCase + ('chrome',) - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glPoints/include.css b/testing/test-cases/selenium-tests/glPoints/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glPoints/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glPoints/include.html b/testing/test-cases/selenium-tests/glPoints/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glPoints/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glPoints/include.js b/testing/test-cases/selenium-tests/glPoints/include.js deleted file mode 100644 index 2651c57a05..0000000000 --- a/testing/test-cases/selenium-tests/glPoints/include.js +++ /dev/null @@ -1,32 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40.0, x: -105.0 } }; - - var myMap = window.geoTests.createOsmMap(mapOptions); - - window.geoTests.loadCitiesData(function (citieslatlon) { - var layer = myMap.createLayer('feature'); - layer.createFeature('point') - .data(citieslatlon) - .style('radius', 10.0) - .style('strokeColor', { r: 0.0, g: 1.0, b: 0.0 }) - .style('strokeWidth', 2) - .style('fillColor', function (d) { - if (d.lon < -100) { - return {r: 1.0, g: 0.0, b: 0.0}; - } - return {r: 0.0, g: 0.0, b: 1.0}; - }) - .style('fillOpacity', function (d) { - if (d.lon < -100) { - return 0.5; - } else { - return 0.25; - } - }) - .position(function (d) { return {x: d.lon, y: d.lat, z: d.elev}; }); - myMap.draw(); - myMap.onIdle(done); - }); -}; diff --git a/testing/test-cases/selenium-tests/glPoints/testGlPoints.py b/testing/test-cases/selenium-tests/glPoints/testGlPoints.py deleted file mode 100644 index 5265d46091..0000000000 --- a/testing/test-cases/selenium-tests/glPoints/testGlPoints.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glPointsBase(object): - testCase = ('glPoints',) - testRevision = 9 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glPoints/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlPoints(self): - self.loadPage() - - testName = 'drawGlPoints' - self.screenshotTest(testName) - - -class FirefoxOSM(glPointsBase, FirefoxTest): - testCase = glPointsBase.testCase + ('firefox',) - - -class ChromeOSM(glPointsBase, ChromeTest): - testCase = glPointsBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glPointsNoFill/include.css b/testing/test-cases/selenium-tests/glPointsNoFill/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoFill/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glPointsNoFill/include.html b/testing/test-cases/selenium-tests/glPointsNoFill/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoFill/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glPointsNoFill/include.js b/testing/test-cases/selenium-tests/glPointsNoFill/include.js deleted file mode 100644 index 136ecbee21..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoFill/include.js +++ /dev/null @@ -1,20 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40.0, x: -105.0 }, zoom: 6}; - - var myMap = window.geoTests.createOsmMap(mapOptions, {}, true); - - window.geoTests.loadCitiesData(function (citieslatlon) { - var layer = myMap.createLayer('feature'); - layer.createFeature('point') - .data(citieslatlon) - .style('radius', 10.0) - .style('fill', false) - .style('strokeColor', { r: 0.0, g: 1.0, b: 0.0 }) - .style('strokeWidth', 2) - .position(function (d) { return {x: d.lon, y: d.lat, z: d.elev}; }); - myMap.draw(); - myMap.onIdle(done); - }); -}; diff --git a/testing/test-cases/selenium-tests/glPointsNoFill/testGlPointsNoFill.py b/testing/test-cases/selenium-tests/glPointsNoFill/testGlPointsNoFill.py deleted file mode 100644 index 92fddc1b82..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoFill/testGlPointsNoFill.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glPointsNoFillBase(object): - testCase = ('glPointsNoFill',) - testRevision = 9 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glPointsNoFill/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlPoints(self): - self.loadPage() - - testName = 'drawGlPointsNoFill' - self.screenshotTest(testName) - - -class FirefoxOSM(glPointsNoFillBase, FirefoxTest): - testCase = glPointsNoFillBase.testCase + ('firefox',) - - -class ChromeOSM(glPointsNoFillBase, ChromeTest): - testCase = glPointsNoFillBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glPointsNoStroke/include.css b/testing/test-cases/selenium-tests/glPointsNoStroke/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoStroke/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glPointsNoStroke/include.html b/testing/test-cases/selenium-tests/glPointsNoStroke/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoStroke/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glPointsNoStroke/include.js b/testing/test-cases/selenium-tests/glPointsNoStroke/include.js deleted file mode 100644 index 79785dc5dc..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoStroke/include.js +++ /dev/null @@ -1,31 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40.0, x: -105.0 }, zoom: 6 }; - - var myMap = window.geoTests.createOsmMap(mapOptions, {}, true); - - window.geoTests.loadCitiesData(function (citieslatlon) { - var layer = myMap.createLayer('feature'); - layer.createFeature('point') - .data(citieslatlon) - .style('radius', 10.0) - .style('stroke', false) - .style('fillColor', function (d) { - if (d.lon < -100) { - return {r: 1.0, g: 0.0, b: 0.0}; - } - return {r: 0.0, g: 0.0, b: 1.0}; - }) - .style('fillOpacity', function (d) { - if (d.lon < -100) { - return 0.5; - } else { - return 0.25; - } - }) - .position(function (d) { return {x: d.lon, y: d.lat, z: d.elev}; }); - myMap.draw(); - myMap.onIdle(done); - }); -}; diff --git a/testing/test-cases/selenium-tests/glPointsNoStroke/testGlPointsNoStroke.py b/testing/test-cases/selenium-tests/glPointsNoStroke/testGlPointsNoStroke.py deleted file mode 100644 index 01eeca2953..0000000000 --- a/testing/test-cases/selenium-tests/glPointsNoStroke/testGlPointsNoStroke.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glPointsNoStrokeBase(object): - testCase = ('glPointsNoStroke',) - testRevision = 8 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glPointsNoStroke/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlPoints(self): - self.loadPage() - - testName = 'drawGlPointsNoStroke' - self.screenshotTest(testName) - - -class FirefoxOSM(glPointsNoStrokeBase, FirefoxTest): - testCase = glPointsNoStrokeBase.testCase + ('firefox',) - - -class ChromeOSM(glPointsNoStrokeBase, ChromeTest): - testCase = glPointsNoStrokeBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glPointsSpeed/include.css b/testing/test-cases/selenium-tests/glPointsSpeed/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glPointsSpeed/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glPointsSpeed/include.html b/testing/test-cases/selenium-tests/glPointsSpeed/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glPointsSpeed/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glPointsSpeed/testGlPointsSpeed.py b/testing/test-cases/selenium-tests/glPointsSpeed/testGlPointsSpeed.py deleted file mode 100644 index 29a718a724..0000000000 --- a/testing/test-cases/selenium-tests/glPointsSpeed/testGlPointsSpeed.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python - -import math -import os -import unittest - -import selenium_test -from selenium_test import FirefoxTest, ChromeTest, ThresholdException - - -setUpModule = selenium_test.setUpModule -tearDownModule = selenium_test.tearDownModule - - -class glPointsSpeedBase(object): - - testCase = ('glPointsSpeed',) - testRevision = 1 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glPointsSpeed/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlPointsSpeed(self): - self.loadPage() - - testName = 'drawGlPointsSpeed' - self.loadTimeTest(testName) - self.framerateTest(testName) - - def loadTimeTest(self, testName, revision=None): - # Threshold is in milliseconds. We need the value to be less than the - # threshold. - el = self.getElement('#loadResults') - value = float(el.get_attribute('results')) - threshold = float(os.environ.get('LOAD_SPEED_THRESHOLD', '1000')) - print 'Average load time %1.0f ms (must be less than %1.0f ms)' % ( - value, threshold) - if value > threshold or math.isnan(value): - raise ThresholdException({'value': value, 'threshold': threshold}) - - def framerateTest(self, testName, revision=None): - # Threshold is in frames-per-second. We need the value to be greater - # than the threshold. - el = self.getElement('#framerateResults') - value = float(el.get_attribute('results')) # in milliseconds - threshold = float(os.environ.get('FRAMERATE_THRESHOLD', '10')) - print 'Average framerate %4.2f fps (must be at least %4.2f fps)' % ( - value, threshold) - if value < threshold or math.isnan(value): - raise ThresholdException({'value': value, 'threshold': threshold}) - - -class FirefoxOSM(glPointsSpeedBase, FirefoxTest): - testCase = glPointsSpeedBase.testCase + ('firefox',) - - -class ChromeOSM(glPointsSpeedBase, ChromeTest): - testCase = glPointsSpeedBase.testCase + ('chrome',) - - -if __name__ == '__main__': - unittest.main() diff --git a/testing/test-cases/selenium-tests/glPointsTransparent/include.css b/testing/test-cases/selenium-tests/glPointsTransparent/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glPointsTransparent/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glPointsTransparent/include.html b/testing/test-cases/selenium-tests/glPointsTransparent/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glPointsTransparent/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glPointsTransparent/include.js b/testing/test-cases/selenium-tests/glPointsTransparent/include.js deleted file mode 100644 index ca7e076f0a..0000000000 --- a/testing/test-cases/selenium-tests/glPointsTransparent/include.js +++ /dev/null @@ -1,22 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40.0, x: -105.0 }, zoom: 6 }; - - var myMap = window.geoTests.createOsmMap(mapOptions, {}, true); - - window.geoTests.loadCitiesData(function (citieslatlon) { - var layer = myMap.createLayer('feature'); - layer.createFeature('point') - .data(citieslatlon) - .style('radius', 10.0) - .style('fillColor', {r: 0.0, g: 0.0, b: 1.0}) - .style('strokeColor', {r: 1.0, g: 0.0, b: 0.0}) - .style('strokeWidth', 2) - .style('fillOpacity', 0.2) - .style('strokeOpacity', 0.2) - .position(function (d) { return {x: d.lon, y: d.lat, z: d.elev}; }); - myMap.draw(); - myMap.onIdle(done); - }); -}; diff --git a/testing/test-cases/selenium-tests/glPointsTransparent/testGlPointsTransparent.py b/testing/test-cases/selenium-tests/glPointsTransparent/testGlPointsTransparent.py deleted file mode 100644 index 83a79e1f41..0000000000 --- a/testing/test-cases/selenium-tests/glPointsTransparent/testGlPointsTransparent.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python - -import unittest - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glPointsTransparentBase(object): - testCase = ('glPointsTransparent',) - testRevision = 7 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glPointsTransparent/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlPoints(self): - self.loadPage() - - testName = 'drawGlPointsTransparent' - self.screenshotTest(testName) - - -class FirefoxOSM(glPointsTransparentBase, FirefoxTest): - testCase = glPointsTransparentBase.testCase + ('firefox',) - - -class ChromeOSM(glPointsTransparentBase, ChromeTest): - testCase = glPointsTransparentBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glPolygons/include.css b/testing/test-cases/selenium-tests/glPolygons/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glPolygons/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glPolygons/include.html b/testing/test-cases/selenium-tests/glPolygons/include.html deleted file mode 100644 index ad19e7dab4..0000000000 --- a/testing/test-cases/selenium-tests/glPolygons/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glPolygons/include.js b/testing/test-cases/selenium-tests/glPolygons/include.js deleted file mode 100644 index 39a63fab64..0000000000 --- a/testing/test-cases/selenium-tests/glPolygons/include.js +++ /dev/null @@ -1,53 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { - zoom: 5.5, - center : { - y: 33.60, - x: -80.83 - } - }; - - var myMap = window.geoTests.createOsmMap(mapOptions, {}, true); - - var states = [{ - 'type': 'Polygon', - 'coordinates': [ - [[-84.32281494140625, 34.9895035675793], [-84.29122924804688, 35.21981940793435], [-84.24041748046875, 35.25459097465022], [-84.22531127929688, 35.266925688950074], [-84.20745849609375, 35.26580442886754], [-84.19921875, 35.24674063355999], [-84.16213989257812, 35.24113278166642], [-84.12368774414062, 35.24898366572645], [-84.09072875976562, 35.24898366572645], [-84.08798217773438, 35.264683153268116], [-84.04266357421875, 35.27701633139884], [-84.03030395507812, 35.291589484566124], [-84.0234375, 35.306160014550784], [-84.03305053710936, 35.32745068492882], [-84.03579711914062, 35.34313496028189], [-84.03579711914062, 35.348735749472546], [-84.01657104492188, 35.35545618392078], [-84.01107788085938, 35.37337460834958], [-84.00970458984374, 35.39128905521763], [-84.01931762695312, 35.41479572901859], [-84.00283813476562, 35.429344044107154], [-83.93692016601562, 35.47409160773029], [-83.91220092773438, 35.47632833265728], [-83.88885498046875, 35.504282143299655], [-83.88473510742186, 35.516578738902936], [-83.8751220703125, 35.52104976129943], [-83.85314941406249, 35.52104976129943], [-83.82843017578125, 35.52104976129943], [-83.8092041015625, 35.53446133418443], [-83.80233764648438, 35.54116627999813], [-83.76800537109374, 35.56239491058853], [-83.7432861328125, 35.56239491058853], [-83.71994018554688, 35.56239491058853], [-83.67050170898438, 35.569097520776054], [-83.6334228515625, 35.570214567965984], [-83.61007690429688, 35.576916524038616], [-83.59634399414061, 35.574682600980914], [-83.5894775390625, 35.55904339525896], [-83.55239868164062, 35.56574628576276], [-83.49746704101562, 35.563512051219696], [-83.47000122070312, 35.586968406786475], [-83.4466552734375, 35.60818490437746], [-83.37936401367188, 35.63609277863135], [-83.35739135742188, 35.65618041632016], [-83.32305908203124, 35.66622234103479], [-83.3148193359375, 35.65394870599763], [-83.29971313476561, 35.660643649881614], [-83.28598022460938, 35.67180064238771], [-83.26126098632811, 35.6907639509368], [-83.25714111328125, 35.69968630125201], [-83.25576782226562, 35.715298012125295], [-83.23516845703125, 35.72310272092263], [-83.19808959960936, 35.72756221127198], [-83.16238403320312, 35.753199435570316], [-83.15826416015625, 35.76322914549896], [-83.10333251953125, 35.76991491635478], [-83.08685302734375, 35.7843988251953], [-83.0511474609375, 35.787740890986576], [-83.01681518554688, 35.78328477203738], [-83.001708984375, 35.77882840327371], [-82.96737670898438, 35.793310688351724], [-82.94540405273438, 35.820040281161], [-82.9193115234375, 35.85121343450061], [-82.9083251953125, 35.86902116501695], [-82.90557861328125, 35.87792352995116], [-82.91244506835938, 35.92353244718235], [-82.88360595703125, 35.94688293218141], [-82.85614013671875, 35.951329861522666], [-82.8424072265625, 35.94243575255426], [-82.825927734375, 35.92464453144099], [-82.80670166015625, 35.927980690382704], [-82.80532836914062, 35.94243575255426], [-82.77923583984375, 35.97356075349624], [-82.78060913085938, 35.99245209055831], [-82.76138305664062, 36.00356252895066], [-82.69546508789062, 36.04465753921525], [-82.64465332031249, 36.060201412392914], [-82.61306762695312, 36.060201412392914], [-82.60620117187499, 36.033552893400376], [-82.60620117187499, 35.991340960635405], [-82.60620117187499, 35.97911749857497], [-82.5787353515625, 35.96133453736691], [-82.5677490234375, 35.951329861522666], [-82.53067016601562, 35.97244935753683], [-82.46475219726562, 36.006895355244666], [-82.41668701171875, 36.070192281208456], [-82.37960815429686, 36.10126686921446], [-82.35488891601562, 36.117908916563685], [-82.34115600585936, 36.113471382052175], [-82.29583740234375, 36.13343831245866], [-82.26287841796874, 36.13565654678543], [-82.23403930664062, 36.13565654678543], [-82.2216796875, 36.154509006695], [-82.20382690429688, 36.15561783381855], [-82.19009399414062, 36.144528857027744], [-82.15438842773438, 36.15007354140755], [-82.14065551757812, 36.134547437460064], [-82.1337890625, 36.116799556445024], [-82.12142944335938, 36.10570509327921], [-82.08984375, 36.10792411128649], [-82.05276489257811, 36.12678323326429], [-82.03628540039062, 36.12900165569652], [-81.91268920898438, 36.29409768373033], [-81.89071655273438, 36.30959215409138], [-81.86325073242188, 36.33504067209607], [-81.83029174804688, 36.34499652561904], [-81.80145263671875, 36.35605709240176], [-81.77947998046874, 36.34610265300638], [-81.76162719726562, 36.33835943134047], [-81.73690795898438, 36.33835943134047], [-81.71905517578125, 36.33835943134047], [-81.70669555664062, 36.33504067209607], [-81.70669555664062, 36.342784223707234], [-81.72317504882812, 36.357163062654365], [-81.73278808593749, 36.379279167407965], [-81.73690795898438, 36.40028364332352], [-81.73690795898438, 36.41354670392876], [-81.72454833984374, 36.423492513472326], [-81.71768188476562, 36.445589751779174], [-81.69845581054688, 36.47541104282962], [-81.69845581054688, 36.51073994146672], [-81.705322265625, 36.53060536411363], [-81.69158935546875, 36.55929085774001], [-81.68060302734375, 36.56480607840351], [-81.68197631835938, 36.58686302344181], [-81.04202270507812, 36.56370306576917], [-80.74264526367186, 36.561496993252575], [-79.89120483398438, 36.54053616262899], [-78.68408203124999, 36.53943280355122], [-77.88345336914062, 36.54053616262899], [-76.91665649414062, 36.54163950596125], [-76.91665649414062, 36.55046568575947], [-76.31103515625, 36.551568887374], [-75.79605102539062, 36.54936246839778], [-75.6298828125, 36.07574221562703], [-75.4925537109375, 35.82226734114509], [-75.3936767578125, 35.639441068973916], [-75.41015624999999, 35.43829554739668], [-75.43212890625, 35.263561862152095], [-75.487060546875, 35.18727767598896], [-75.5914306640625, 35.17380831799959], [-75.9210205078125, 35.04798673426734], [-76.17919921875, 34.867904962568744], [-76.41540527343749, 34.62868797377061], [-76.4593505859375, 34.57442951865274], [-76.53076171875, 34.53371242139567], [-76.5911865234375, 34.551811369170494], [-76.651611328125, 34.615126683462194], [-76.761474609375, 34.63320791137959], [-77.069091796875, 34.59704151614417], [-77.376708984375, 34.45674800347809], [-77.5909423828125, 34.3207552752374], [-77.8326416015625, 33.97980872872457], [-77.9150390625, 33.80197351806589], [-77.9754638671875, 33.73804486328907], [-78.11279296875, 33.8521697014074], [-78.2830810546875, 33.8521697014074], [-78.4808349609375, 33.815666308702774], [-79.6728515625, 34.8047829195724], [-80.782470703125, 34.836349990763864], [-80.782470703125, 34.91746688928252], [-80.9307861328125, 35.092945313732635], [-81.0516357421875, 35.02999636902566], [-81.0516357421875, 35.05248370662468], [-81.0516357421875, 35.137879119634185], [-82.3150634765625, 35.19625600786368], [-82.3590087890625, 35.19625600786368], [-82.40295410156249, 35.22318504970181], [-82.4688720703125, 35.16931803601131], [-82.6885986328125, 35.1154153142536], [-82.781982421875, 35.06147690849717], [-83.1060791015625, 35.003003395276714], [-83.616943359375, 34.99850370014629], [-84.05639648437499, 34.985003130171066], [-84.22119140625, 34.985003130171066], [-84.32281494140625, 34.9895035675793]], - [[-75.69030761718749, 35.74205383068037], [-75.5914306640625, 35.74205383068037], [-75.5419921875, 35.585851593232356], [-75.56396484375, 35.32633026307483], [-75.69030761718749, 35.285984736065735], [-75.970458984375, 35.16482750605027], [-76.2066650390625, 34.994003757575776], [-76.300048828125, 35.02999636902566], [-76.409912109375, 35.07946034047981], [-76.5252685546875, 35.10642805736423], [-76.4208984375, 35.25907654252574], [-76.3385009765625, 35.294952147406576], [-76.0858154296875, 35.29943548054543], [-75.948486328125, 35.44277092585766], [-75.8660888671875, 35.53669637839501], [-75.772705078125, 35.567980458012094], [-75.706787109375, 35.634976650677295], [-75.706787109375, 35.74205383068037], [-75.69030761718749, 35.74205383068037]] - ] - }]; - - // Load image to be used for drawing dots - var hover = false; - var layer = myMap.createLayer('feature'); - layer.createFeature('polygon', {selectionAPI: true}) - .data(states) - .polygon(function (d) { return { - 'outer': d.coordinates[0], - 'inner': [d.coordinates[1]] - }; - }) - .position(function (d) { - return {x: d[0], - y: d[1], z: 0.0}; - }) - .style('fillOpacity', 0.5) - .style('fillColor', function () { - return hover ? 'firebrick' : { r: 1, g: 0.3, b: 0.1 }; - }) - .geoOn(geo.event.feature.mouseover, function () { - hover = true; - this.modified(); - myMap.draw(); - }) - .geoOn(geo.event.feature.mouseout, function () { - hover = false; - this.modified(); - myMap.draw(); - }); - - myMap.draw(); - myMap.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/glPolygons/testGlPolygons.py b/testing/test-cases/selenium-tests/glPolygons/testGlPolygons.py deleted file mode 100644 index 82b61d46b1..0000000000 --- a/testing/test-cases/selenium-tests/glPolygons/testGlPolygons.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glPolygonsBase(object): - testCase = ('glPolygons',) - testRevision = 5 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glPolygons/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlPolygons(self): - self.loadPage() - - testName = 'drawGlPolygons' - self.screenshotTest(testName) - - def testHoverPolygon(self): - self.loadPage() - self.hover('#map', (365, 180)) - - self.screenshotTest('hoverGlPolygons') - - -class FirefoxOSM(glPolygonsBase, FirefoxTest): - testCase = glPolygonsBase.testCase + ('firefox',) - - -class ChromeOSM(glPolygonsBase, ChromeTest): - testCase = glPolygonsBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/glQuad/include.css b/testing/test-cases/selenium-tests/glQuad/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glQuad/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glQuad/include.html b/testing/test-cases/selenium-tests/glQuad/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glQuad/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glQuad/include.js b/testing/test-cases/selenium-tests/glQuad/include.js deleted file mode 100644 index d6fcee25e5..0000000000 --- a/testing/test-cases/selenium-tests/glQuad/include.js +++ /dev/null @@ -1,135 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var map = geo.map({ - node: '#map', - center: { - x: -83.0, - y: 29 - }, - zoom: 3.5 - }); - var layer = map.createLayer('feature', {renderer: 'vgl'}); - var quads = layer.createFeature('quad', {selectionAPI: true}); - var previewImage = new Image(); - previewImage.onload = function () { - - quads - .data([{ - ll: {x: -108, y: 29}, - ur: {x: -88, y: 49}, - image: '/data/tilefancy.png' - }, { - ll: {x: -88, y: 29}, - ur: {x: -58, y: 49}, - image: '/examples/quads/flower1.jpg', - opacity: 0.75 - }, { - ul: {x: -108, y: 29}, - ur: {x: -58, y: 29}, - ll: {x: -98, y: 9}, - lr: {x: -68, y: 9}, - previewImage: null, - image: '/examples/quads/flower3.jpg' - }, { - lr: {x: -58, y: 29}, - ur: {x: -58, y: 49}, - ul: {x: -38, y: 54}, - ll: {x: -33, y: 34}, - image: '/examples/quads/flower2.jpg', - opacity: 0.15 - }, { - ll: {x: -33, y: 34}, - lr: {x: -33, y: 9}, - ur: {x: -68, y: 9}, - ul: {x: -58, y: 29}, - image: '/data/tilefancy.png' - }, { - ll: {x: -128, y: 29}, - ur: {x: -108, y: 49}, - image: '/data/nosuchimage.png' - }, { - ul: {x: -128, y: 29}, - ur: {x: -108, y: 29}, - ll: {x: -123, y: 9}, - lr: {x: -98, y: 9}, - previewImage: null, - image: '/data/nosuchimage.png' - }, { - ul: {x: -148, y: 29}, - ur: {x: -128, y: 29}, - ll: {x: -148, y: 9}, - lr: {x: -123, y: 9}, - previewImage: previewImage, - image: '/data/nosuchimage.png' - }, { - ll: {x: -138, y: 29}, - ur: {x: -128, y: 39}, - color: '#FF0000' - }, { - ll: {x: -148, y: 39}, - ur: {x: -138, y: 49}, - color: '#FF0000' - }, { - ll: {x: -138, y: 39}, - ur: {x: -128, y: 49}, - color: '#00FFFF' - }, { - ll: {x: -148, y: 29}, - ur: {x: -138, y: 39}, - opacity: 0.25, - color: '#0000FF' - }, { - ll: {x: -108, y: 49}, - lr: {x: -88, y: 49}, - ur: {x: -108, y: 59}, - ul: {x: -88, y: 59}, - image: '/data/tilefancy.png' - }, { - ll: {x: -88, y: 49}, - ur: {x: -68, y: 49}, - ul: {x: -88, y: 59}, - lr: {x: -68, y: 59}, - image: '/data/tilefancy.png' - }]) - .style({ - opacity: function (d) { - return d.opacity !== undefined ? d.opacity : 1; - }, - color: function (d) { - return d.color; - }, - previewColor: {r: 1, g: 0.75, b: 0.75}, - previewImage: function (d) { - return d.previewImage !== undefined ? d.previewImage : previewImage; - } - }) - .geoOn(geo.event.feature.mouseover, function (evt) { - if (evt.data.orig_opacity === undefined) { - evt.data.orig_opacity = (evt.data.opacity || null); - } - evt.data.opacity = 0.5; - // we either have to clear the internal cache on the item, or have - // asked for it not to have been cached to begin with. - delete evt.data._cachedQuad; - this.modified(); - layer.map().draw(); - }) - .geoOn(geo.event.feature.mouseout, function (evt) { - if (evt.data.orig_opacity === undefined) { - evt.data.orig_opacity = (evt.data.opacity || null); - } - evt.data.opacity = evt.data.orig_opacity || undefined; - delete evt.data._cachedQuad; - this.modified(); - layer.map().draw(); - }) - .draw(); - - map.draw(); - - map.onIdle(done); - }; - - previewImage.src = '/data/grid.jpg'; -}; diff --git a/testing/test-cases/selenium-tests/glQuad/testGlQuad.py b/testing/test-cases/selenium-tests/glQuad/testGlQuad.py deleted file mode 100644 index ffaa3ddfe7..0000000000 --- a/testing/test-cases/selenium-tests/glQuad/testGlQuad.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -import unittest - -from selenium_test import FirefoxTest, ChromeTest, setUpModule, tearDownModule - - -class glQuadBase(object): - testCase = ('glQuad',) - testRevision = 1 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('glQuad/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testGlQuad(self): - self.loadPage() - - testName = 'drawGlQuad' - self.screenshotTest(testName) - - -class FirefoxOSM(glQuadBase, FirefoxTest): - testCase = glQuadBase.testCase + ('firefox',) - - -class ChromeOSM(glQuadBase, ChromeTest): - testCase = glQuadBase.testCase + ('chrome',) - - -if __name__ == '__main__': - unittest.main() diff --git a/testing/test-cases/selenium-tests/glTwoRenderers/include.css b/testing/test-cases/selenium-tests/glTwoRenderers/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/glTwoRenderers/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/glTwoRenderers/include.html b/testing/test-cases/selenium-tests/glTwoRenderers/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/glTwoRenderers/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/glTwoRenderers/include.js b/testing/test-cases/selenium-tests/glTwoRenderers/include.js deleted file mode 100644 index 6e4a3ed5ea..0000000000 --- a/testing/test-cases/selenium-tests/glTwoRenderers/include.js +++ /dev/null @@ -1,44 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var myMap = geo.map({node: '#map', clampBounds: false, gcs: 'EPSG:4326'}); - window.gjsmap = myMap; - var layer2 = myMap.createLayer('feature'); - layer2.createFeature('quad') - .data([{ - ul: {x: -180, y: 90}, - lr: {x: 180, y: -90}, - image: '/data/land_shallow_topo_2048.png' - }]) - layer2.name = 'layer2'; - myMap.center({x: -40, y: 0}); - myMap.zoom(3.5); - - myMap.draw(); - myMap.onIdle(function () { - window.geoTests.loadCitiesData(function (citieslatlon) { - var layer = myMap.createLayer('feature'); - layer.createFeature('point') - .data(citieslatlon) - .style('radius', 10.0) - .style('strokeColor', { r: 0.0, g: 1.0, b: 0.0 }) - .style('strokeWidth', 2) - .style('fillColor', function (d) { - if (d.lon < -100) { - return {r: 1.0, g: 0.0, b: 0.0}; - } - return {r: 0.0, g: 0.0, b: 1.0}; - }) - .style('fillOpacity', function (d) { - if (d.lon < -100) { - return 0.5; - } else { - return 0.25; - } - }) - .position(function (d) { return {x: d.lon, y: d.lat, z: d.elev}; }); - myMap.draw(); - myMap.onIdle(done); - }); - }); -}; diff --git a/testing/test-cases/selenium-tests/glTwoRenderers/testGlTwoRenderers.py b/testing/test-cases/selenium-tests/glTwoRenderers/testGlTwoRenderers.py deleted file mode 100644 index e1ac9b43a3..0000000000 --- a/testing/test-cases/selenium-tests/glTwoRenderers/testGlTwoRenderers.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python - -import unittest - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glTwoRenderersBase(object): - testCase = ('glTwoRenderers',) - testRevision = 5 - - def loadPage(self): - self.resizeWindow(1600, 900) - self.loadURL('glTwoRenderers/index.html') - self.wait() - self.resizeWindow(1600, 900) - - def testGlTwoRenderers(self): - self.loadPage() - - testName = 'drawGlTwoRenderers' - self.screenshotTest(testName) - - -class FirefoxOSM(glTwoRenderersBase, FirefoxTest): - testCase = glTwoRenderersBase.testCase + ('firefox',) - - -class ChromeOSM(glTwoRenderersBase, ChromeTest): - testCase = glTwoRenderersBase.testCase + ('chrome',) - - -if __name__ == '__main__': - unittest.main() diff --git a/testing/test-cases/selenium-tests/layerReorder/include.css b/testing/test-cases/selenium-tests/layerReorder/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/layerReorder/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/layerReorder/include.html b/testing/test-cases/selenium-tests/layerReorder/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/layerReorder/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/layerReorder/include.js b/testing/test-cases/selenium-tests/layerReorder/include.js deleted file mode 100644 index 88601f197a..0000000000 --- a/testing/test-cases/selenium-tests/layerReorder/include.js +++ /dev/null @@ -1,49 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 0, x: 0 }, zoom: 2 }; - - var map = window.geoTests.createOsmMap(mapOptions, null, true); - - var l1 = map.children()[0], - l2 = map.createLayer('feature'), - l3 = map.createLayer('feature', {renderer: 'd3'}), - layers = [l1, l2, l3]; - - - l2.createFeature('point') - .data([{x: -20, y: 0}, {x: 0, y: 0}]) - .style({ - stroke: false, - fillColor: 'red', - radius: 15, - fillOpacity: 1 - }); - - l3.createFeature('point') - .data([{x: 20, y: 0}, {x: 0, y: 0}]) - .style({ - stroke: false, - fillColor: 'blue', - radius: 15, - fillOpacity: 1 - }); - - // set the layer order - window.layerOrder = function (z1, z2, z3) { - l1.zIndex(z1); - l2.zIndex(z2); - l3.zIndex(z3); - }; - - window.moveUp = function (layer, n) { - layers[layer].moveUp(n); - }; - - window.moveDown = function (layer, n) { - layers[layer].moveDown(n); - }; - - map.draw(); - map.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/layerReorder/testLayerReorder.py b/testing/test-cases/selenium-tests/layerReorder/testLayerReorder.py deleted file mode 100644 index 9a7239cfee..0000000000 --- a/testing/test-cases/selenium-tests/layerReorder/testLayerReorder.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class LayerReorder(FirefoxTest): - testCase = ('LayerReorder',) - testRevision = 1 - - def testReorder(self): - self.resizeWindow(640, 480) - self.loadURL('layerReorder/index.html') - self.wait() - - self.screenshotTest('1-2-3') - - self.runScript('window.layerOrder(10, 9, 11);') - self.screenshotTest('2-1-3') - - self.runScript('window.layerOrder(10, 12, 11);') - self.screenshotTest('1-3-2') - - self.runScript('window.layerOrder(15, 14, 13);') - self.screenshotTest('3-2-1') - - def testMoveUp(self): - self.resizeWindow(640, 480) - self.loadURL('layerReorder/index.html') - self.wait() - - # move osm layer up to top - self.runScript('window.moveUp(0, 2);') - self.screenshotTest('moveUp_0_2') - - # move d3 layer below gl layer - self.runScript('window.moveUp(2, -1);') - self.screenshotTest('moveUp_2_-1') - - # move gl layer up one - self.runScript('window.moveUp(1);') - self.screenshotTest('moveUp_1_1') - - def testMoveDown(self): - self.resizeWindow(640, 480) - self.loadURL('layerReorder/index.html') - self.wait() - - # move down (no-op) - self.runScript('window.moveDown(0);') - self.screenshotTest('moveDown_0') - - # move d3 layer below gl layer - self.runScript('window.moveDown(2, 1);') - self.screenshotTest('moveDown_2_1') - - # move osm layer to the top - self.runScript('window.moveDown(0, -5);') - self.screenshotTest('moveDown_0_-5') - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/mapBounds/include.css b/testing/test-cases/selenium-tests/mapBounds/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/mapBounds/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/mapBounds/include.html b/testing/test-cases/selenium-tests/mapBounds/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/mapBounds/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/mapBounds/include.js b/testing/test-cases/selenium-tests/mapBounds/include.js deleted file mode 100644 index 1ab87beb37..0000000000 --- a/testing/test-cases/selenium-tests/mapBounds/include.js +++ /dev/null @@ -1,18 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var options = { - center: { x: -80, y: 30 }, - zoom: 2, - clampZoom: true, - clampBoundsX: false, - clampBoundsY: false, - maxZoom: 4 - }; - var myMap = window.geoTests.createOsmMap(options).draw(); - myMap.bounds({left: 113, right: 153, bottom: -45, top: -5}); - - window.setTimeout(function () { - myMap.onIdle(done); - }, 250); -}; diff --git a/testing/test-cases/selenium-tests/mapBounds/testMapBounds.py b/testing/test-cases/selenium-tests/mapBounds/testMapBounds.py deleted file mode 100644 index a64914a543..0000000000 --- a/testing/test-cases/selenium-tests/mapBounds/testMapBounds.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class Base(object): - testCase = ('mapBounds',) - testRevision = 4 - - def loadPage(self): - self.resizeWindow(1024, 600) - self.loadURL('mapBounds/index.html') - self.wait() - self.resizeWindow(1024, 600) - - def test_set_bounds(self): - testName = 'set_new_bounds' - self.loadPage() - self.screenshotTest(testName) - - -class FirefoxTestCls(Base, FirefoxTest): - testCase = Base.testCase + ('firefox',) - - -class ChromeTestCls(Base, ChromeTest): - testCase = Base.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/mapCenterAndZoom/include.css b/testing/test-cases/selenium-tests/mapCenterAndZoom/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/mapCenterAndZoom/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/mapCenterAndZoom/include.html b/testing/test-cases/selenium-tests/mapCenterAndZoom/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/mapCenterAndZoom/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/mapCenterAndZoom/include.js b/testing/test-cases/selenium-tests/mapCenterAndZoom/include.js deleted file mode 100644 index 530afc934e..0000000000 --- a/testing/test-cases/selenium-tests/mapCenterAndZoom/include.js +++ /dev/null @@ -1,9 +0,0 @@ -window.startTest = function(done) { - 'use strict'; - - var options = { center: { x: 78, y: 21 } }; - var myMap = window.geoTests.createOsmMap(options); - - // give the tiles a chance to load - myMap.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/mapCenterAndZoom/testMapCenterAndZoom.py b/testing/test-cases/selenium-tests/mapCenterAndZoom/testMapCenterAndZoom.py deleted file mode 100644 index 2a37b778ff..0000000000 --- a/testing/test-cases/selenium-tests/mapCenterAndZoom/testMapCenterAndZoom.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class mapCenter(object): - testCase = ('mapCenterAndZoom',) - testRevision = 6 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('mapCenterAndZoom/index.html') - self.wait() - self.resizeWindow(640, 480) - - def test_map_initial_center(self): - testName = 'mapInitialCenter' - self.loadPage() - self.screenshotTest(testName) - - def test_map_center(self): - # test the map.center method - testName = 'mapCenter' - self.loadPage() - self.runScript( - ''' -window.gjsmap.center({ - x: 60, - y: 20 -}); -window.gjsmap.onIdle(function () { - window.centerDone = true; -}); -''' - ) - self.wait('window.centerDone') - self.screenshotTest(testName) - - def test_map_zoom(self): - # test the map.zoom method - testName = 'mapZoom' - self.loadPage() - self.runScript( - ''' -window.gjsmap.zoom(3); -window.gjsmap.onIdle(function () { - window.zoomDone = true; -}); -''' - ) - self.wait('window.zoomDone') - self.screenshotTest(testName) - - -class FirefoxMapCenter(mapCenter, FirefoxTest): - testCase = mapCenter.testCase + ('firefox',) - - -class ChromeMapCenter(mapCenter, ChromeTest): - testCase = mapCenter.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/multipleMaps/include.css b/testing/test-cases/selenium-tests/multipleMaps/include.css deleted file mode 100644 index c45a1a54bc..0000000000 --- a/testing/test-cases/selenium-tests/multipleMaps/include.css +++ /dev/null @@ -1,11 +0,0 @@ -body { - overflow: hidden; -} -html, body { - width: 100%; - height: 100%; -} -.map { - width: 100%; - height: 50%; -} diff --git a/testing/test-cases/selenium-tests/multipleMaps/include.html b/testing/test-cases/selenium-tests/multipleMaps/include.html deleted file mode 100644 index ea0ec730df..0000000000 --- a/testing/test-cases/selenium-tests/multipleMaps/include.html +++ /dev/null @@ -1,2 +0,0 @@ -
-
diff --git a/testing/test-cases/selenium-tests/multipleMaps/include.js b/testing/test-cases/selenium-tests/multipleMaps/include.js deleted file mode 100644 index 07a9859376..0000000000 --- a/testing/test-cases/selenium-tests/multipleMaps/include.js +++ /dev/null @@ -1,36 +0,0 @@ - -window.startTest = function (done) { - 'use strict'; - - var map1 = geo.map({node: '#map1', zoom: 3, center: {x: -70, y: 40}}), - map2 = geo.map({node: '#map2', zoom: 3, center: {x: 70, y: 40}}), - done1, done2; - - map1.createLayer('osm', {baseUrl: '/data/tiles/'}); - map2.createLayer('osm', {baseUrl: '/data/tiles/'}); - - - function resizeCanvas() { - var width = $('#map1').width(), - height = $('#map1').height(); - map1.resize(0, 0, width, height); - map1.draw(); - map2.resize(0, 0, width, height); - map2.draw(); - } - - resizeCanvas(); - - /// Resize the canvas to fill browser window dynamically - window.addEventListener('resize', resizeCanvas, false); - - // give the tiles a chance to load - map1.onIdle(function () { - done1 = true; - if (done2) { done(); } - }); - map2.onIdle(function () { - done2 = true; - if (done1) { done(); } - }); -}; diff --git a/testing/test-cases/selenium-tests/multipleMaps/testTwoMaps.py b/testing/test-cases/selenium-tests/multipleMaps/testTwoMaps.py deleted file mode 100644 index 68af9546c2..0000000000 --- a/testing/test-cases/selenium-tests/multipleMaps/testTwoMaps.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class osmBase(object): - testCase = ('multipleMaps',) - testRevision = 5 - - def loadPage(self): - self.resizeWindow(320, 480) - self.loadURL('multipleMaps/index.html') - self.wait() - self.resizeWindow(320, 480) - - def test_2map_draw(self): - testName = 'twoMapDraw' - self.loadPage() - self.screenshotTest(testName) - - -class FirefoxOSM(osmBase, FirefoxTest): - testCase = osmBase.testCase + ('firefox',) - - -class ChromeOSM(osmBase, ChromeTest): - testCase = osmBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/parallelProjection/include.css b/testing/test-cases/selenium-tests/parallelProjection/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/parallelProjection/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/parallelProjection/include.html b/testing/test-cases/selenium-tests/parallelProjection/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/parallelProjection/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/parallelProjection/include.js b/testing/test-cases/selenium-tests/parallelProjection/include.js deleted file mode 100644 index 92f1677817..0000000000 --- a/testing/test-cases/selenium-tests/parallelProjection/include.js +++ /dev/null @@ -1,18 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { - center : {y: 40.0, x: -105.0}, - parallelProjection: true, - discreteZoom: true, - zoom: 8 - }; - var osmOpts = { - url: '/data/tilefancy.png' - }; - - var myMap = window.geoTests.createOsmMap(mapOptions, osmOpts); - - myMap.draw(); - myMap.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/parallelProjection/testParallelProjection.py b/testing/test-cases/selenium-tests/parallelProjection/testParallelProjection.py deleted file mode 100644 index 6249e5167b..0000000000 --- a/testing/test-cases/selenium-tests/parallelProjection/testParallelProjection.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class parallelProjectionBase(object): - testCase = ('parallelProjection',) - testRevision = 1 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('parallelProjection/index.html') - self.wait() - self.resizeWindow(640, 480) - - def testParallelProjection(self): - self.loadPage() - - testName = 'drawParallelProjection' - self.screenshotTest(testName) - - -class FirefoxOSM(parallelProjectionBase, FirefoxTest): - testCase = parallelProjectionBase.testCase + ('firefox',) - - -class ChromeOSM(parallelProjectionBase, ChromeTest): - testCase = parallelProjectionBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/pointClustering/include.css b/testing/test-cases/selenium-tests/pointClustering/include.css deleted file mode 100644 index 355579c9fd..0000000000 --- a/testing/test-cases/selenium-tests/pointClustering/include.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - overflow: hidden; -} diff --git a/testing/test-cases/selenium-tests/pointClustering/include.html b/testing/test-cases/selenium-tests/pointClustering/include.html deleted file mode 100644 index f1756fd785..0000000000 --- a/testing/test-cases/selenium-tests/pointClustering/include.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/testing/test-cases/selenium-tests/pointClustering/include.js b/testing/test-cases/selenium-tests/pointClustering/include.js deleted file mode 100644 index 69fc6cdc3f..0000000000 --- a/testing/test-cases/selenium-tests/pointClustering/include.js +++ /dev/null @@ -1,44 +0,0 @@ -window.startTest = function (done) { - 'use strict'; - - var mapOptions = { center : { y: 40.3, x: -99.0 }, zoom: 2 }; - - var myMap = window.geoTests.createOsmMap(mapOptions); - window.myMap = myMap; - - window.geoTests.loadCitiesData(function (citieslatlon) { - var layer = myMap.createLayer('feature'); - layer.createFeature('point') - .clustering(true) - .data(citieslatlon) - .style('radius', function (d) { - if (d.__cluster) { - return 10.0; - } - return 6; - }) - .style('strokeColor', 'black') - .style('strokeWidth', function (d) { - if (d.__cluster) { - return 2; - } - return 0; - }) - .style('fillColor', function (d) { - if (d.__cluster) { - return 'grey'; - } - return 'red'; - }) - .style('fillOpacity', function (d) { - if (d.__cluster) { - return 0.25; - } else { - return 1; - } - }) - .position(function (d) { return {x: d.lon, y: d.lat, z: d.elev}; }); - myMap.draw(); - myMap.onIdle(done); - }); -}; diff --git a/testing/test-cases/selenium-tests/pointClustering/testPointCluster.py b/testing/test-cases/selenium-tests/pointClustering/testPointCluster.py deleted file mode 100644 index 261537207c..0000000000 --- a/testing/test-cases/selenium-tests/pointClustering/testPointCluster.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -from time import sleep -from selenium_test import FirefoxTest, ChromeTest,\ - setUpModule, tearDownModule - - -class glPointsBase(object): - testCase = ('pointClustering',) - testRevision = 4 - - def loadPage(self): - self.resizeWindow(640, 480) - self.loadURL('pointClustering/index.html') - self.wait() - self.resizeWindow(640, 480) - sleep(5) - - def testClustering0(self): - self.loadPage() - self.screenshotTest('zoom0') - - def testClustering2(self): - self.loadPage() - self.runScript( - 'myMap.zoom(5); myMap.center({x: -99, y: 40});' - ) - self.screenshotTest('zoom2') - - -class FirefoxOSM(glPointsBase, FirefoxTest): - testCase = glPointsBase.testCase + ('firefox',) - - -class ChromeOSM(glPointsBase, ChromeTest): - testCase = glPointsBase.testCase + ('chrome',) - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/testing/test-cases/selenium-tests/uiLayer/include.css b/testing/test-cases/selenium-tests/uiLayer/include.css deleted file mode 100644 index fcde4808df..0000000000 --- a/testing/test-cases/selenium-tests/uiLayer/include.css +++ /dev/null @@ -1,15 +0,0 @@ -.map { - position: relative; - top: 25%; - left: 25%; - width: 25%; - height: 25%; -} -#map { - width: 100%; - height: 100%; -} -body, html { - width: 100%; - height; 100%; -} diff --git a/testing/test-cases/selenium-tests/uiLayer/include.html b/testing/test-cases/selenium-tests/uiLayer/include.html deleted file mode 100644 index c2a1c4e9be..0000000000 --- a/testing/test-cases/selenium-tests/uiLayer/include.html +++ /dev/null @@ -1,3 +0,0 @@ -
-
-
diff --git a/testing/test-cases/selenium-tests/uiLayer/include.js b/testing/test-cases/selenium-tests/uiLayer/include.js deleted file mode 100644 index 3100ce9b57..0000000000 --- a/testing/test-cases/selenium-tests/uiLayer/include.js +++ /dev/null @@ -1,24 +0,0 @@ - -window.startTest = function (done) { - 'use strict'; - - var map = geo.map({node: '#map', zoom: 3, center: {x: -70, y: 40}}); - - map.createLayer( - 'osm', - {url: function () { return '/data/white.jpg'; }} - ); - map.createLayer( - 'osm', - {attribution: '', url: function () { return '/data/red.jpg'; }} - ); - map.createLayer('ui').createWidget('slider'); - map.createLayer( - 'osm', - {attribution: '', url: function () { return '/data/blue.jpg'; }} - ); - map.createLayer('ui').createWidget('slider'); - - // give the tiles a chance to load - map.onIdle(done); -}; diff --git a/testing/test-cases/selenium-tests/uiLayer/testUiLayer.py b/testing/test-cases/selenium-tests/uiLayer/testUiLayer.py deleted file mode 100644 index 6faad0b7e4..0000000000 --- a/testing/test-cases/selenium-tests/uiLayer/testUiLayer.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python - -from selenium_test import FirefoxTest,\ - setUpModule, tearDownModule - - -class uiLayer(FirefoxTest): - testCase = ('uiLayer',) - testRevision = 2 - - def test_ui_position(self): - self.resizeWindow(1024, 768) - self.loadURL('uiLayer/index.html') - self.wait() - self.screenshotTest('uiLayer') diff --git a/testing/test-data/base-images.tgz.md5 b/testing/test-data/base-images.tgz.md5 index 72d92f782e..f2458e316b 100644 --- a/testing/test-data/base-images.tgz.md5 +++ b/testing/test-data/base-images.tgz.md5 @@ -1 +1 @@ -9f0f67e4fed972bfe317e8232d826a59 \ No newline at end of file +f2fa25ac074a409ccc072c3444edfb6f \ No newline at end of file diff --git a/testing/test-data/base-images.tgz.url b/testing/test-data/base-images.tgz.url index 4c9e299960..7bc3557343 100644 --- a/testing/test-data/base-images.tgz.url +++ b/testing/test-data/base-images.tgz.url @@ -1 +1 @@ -https://data.kitware.com/api/v1/file/58a7550d8d777f073240d3a7/download \ No newline at end of file +https://data.kitware.com/api/v1/file/58c934128d777f0aef5d79a7/download \ No newline at end of file diff --git a/testing/test-runners/midas_handler.py b/testing/test-runners/midas_handler.py deleted file mode 100644 index 4bbb4e9d7b..0000000000 --- a/testing/test-runners/midas_handler.py +++ /dev/null @@ -1,354 +0,0 @@ -#!/usr/bin/env python - -import sys -import hashlib -import getpass -from PIL import Image - -if sys.version_info[0] == 2: - from cStringIO import StringIO -elif sys.version_info[0] == 3: - from io import BytesIO as StringIO - -import requests as http - - -class MidasHandler(object): - ''' - Contains several utility function for interacting with - MIDAS by wrapping api methods and caching the results. - ''' - - def __init__(self, - MIDAS_BASE_URL='https://midas3.kitware.com/midas', - MIDAS_COMMUNITY='geojs'): - ''' - Initialize private variables. - - :param string MIDAS_BASE_URL: URL of the midas server. - :param string MIDAS_COMMUNITY: The community name on the server. - ''' - self._apiURL = MIDAS_BASE_URL + '/api/json?method=' - self._communityName = MIDAS_COMMUNITY - self._community = None - self._token = None - self._apiKey = None - - def _request(self, method, parameters=None, asjson=True): - ''' - Like pydas.drivers.BaseDriver.request, but without the retry. - ''' - method_url = self._apiURL + method - request = http.post( - method_url, - params=parameters, - allow_redirects=True, - verify=False - ) - try: - response = request.json() - except ValueError: - response = { - 'data': request.content, - 'stat': 'ok' - } - - if request.status_code not in (200, 302) or response['stat'] != 'ok': - sys.stderr.write(str(response) + '\n') - raise Exception("Could not complete request to %s." % method) - - return response['data'] - - def community(self): - ''' - Get the id of the GeoJS community. - - >>> midas.community() - { - u'admingroup_id': u'121', - u'can_join': u'1', - u'community_id': u'40', - u'creation': u'2014-06-02 11:38:38', - u'description': u'', - u'folder_id': u'11361', - u'membergroup_id': u'123', - u'moderatorgroup_id': u'122', - u'name': u'GeoJS', - u'privacy': u'0', - u'uuid': u'538c9a7ead4a21c3b3e4e52724b3e6949487279edfad3', - u'view': u'68' - } - - :return: MIDAS response object. - :rtype: dict - ''' - if self._community is None: - self._community = self._request( - 'midas.community.get', - {'name': self._communityName} - ) - return self._community - - def getFolder(self, name, root=None): - ''' - Get a folder named ``name`` under ``root``. If no root - is given, use the community root. - - >>> midas.getFolder('Testing') - u'11364' - >>> midas.getFolder('data', '11364') - u'11373' - - :param string name: The folder name to find. - :param string root: The id of the root folder. - :returns: The id of the folder. - :rtype: string - :raises Exception: If the folder is not found. - ''' - if root is None: - root = self.community()['community_id'] - children = self._request( - 'midas.community.children', - {'id': root} - )['folders'] - else: - children = self._request( - 'midas.folder.children', - {'id': root} - )['folders'] - for folder in children: - if folder['name'] == name: - return folder['folder_id'] - raise Exception("Folder '%s' not found in '%s'." % (name, str(root))) - - def getItem(self, path, root=None): - ''' - Get an item at the given path. If no root is specified, use the - community root. - - >>> midas.getItem(('Testing', 'data', 'cities.csv')) - { - u'date_creation': u'2014-06-02 15:26:12', - ... - u'view': u'2' - } - - :param tuple path: The relative path from ``root``. - :param string root: The id of the root folder. - :return: MIDAS response object - :rtype: dict - :raises Exception: If the item is not found. - ''' - for p in path[:-1]: - root = self.getFolder(p, root) - items = self._request( - 'midas.folder.children', - {'id': root} - )['items'] - item_id = None - for item in items: - if item['name'] == path[-1]: - item_id = item['item_id'] - if item_id is None: - raise Exception("Item '%s' not found." % '/'.join(path)) - return self._request( - 'midas.item.get', - {'id': item_id} - ) - - def getImages(self, path, revision): - ''' - Download images in an item at the given path and revision. - - >>> .getImages(('Testing', 'test', 'selenium', 'osmLayer', 'firefox', 'osmDraw.png'), 2) - [] - - :param tuple path: The relative path from the community root. - :param int revision: The item revision to download. - :return: List of `Image`_. - :raises Exception: If the path or revision is not found. - - .. _Image: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - item_id = self.getItem(path)['item_id'] - item = self._request( - 'midas.item.get', - {'id': item_id} - ) - images = [] - revisions = item['revisions'] - if revision > len(revisions) or revision < 1: - raise Exception("Invalid revision number.") - - for bitstream in revisions[revision-1]['bitstreams']: - data = self._request( - 'midas.bitstream.download', - {'id': bitstream['bitstream_id']} - ) - images.append(Image.open(StringIO(data))) - return images - - def login(self, email=None, password=None, apiKey=None): - ''' - Log into midas and return a token. If `email` or `password` - are not provided, they must be entered in stdin. The token - is cached internally, so the user will only be prompted - once after a successful login. Alternatively, an apiKey - can be provided as login credentials. - - :param string email: The user's email address. - :param string password: The user's password. - :param string apiKey: The user's api key. - :rtype: string - :return: The login token. - ''' - if self._token is None: - if email is None: - email = raw_input('email: ') - nTries = 0 - - if apiKey is not None: - self._apiKey = apiKey - - while self._apiKey is None and nTries < 3: - if password is None: - password = getpass.getpass() - resp = http.post( - self._apiURL + 'midas.user.apikey.default', - params={ - 'email': email, - 'password': password - } - ) - try: - self._apiKey = resp.json()['data']['apikey'] - except Exception: - print("Could not log in with the provided information.") - nTries += 1 - - resp = http.get( - self._apiURL + 'midas.login', - params={ - 'email': email, - 'apikey': self._apiKey, - 'appname': 'Default' - } - ) - - try: - self._token = resp.json()['data']['token'] - except Exception: - raise Exception("Could not get a login token.") - return self._token - - def getOrCreateItem(self, path): - ''' - Create an empty item at the given path if none exists - otherwise return the item. This - method will create folders as necessary while traversing - the path. - - :param tuple path: The relative path from the community root. - :return: MIDAS response object - :rtype: dict - ''' - token = self.login() - root = None - for p in path[:-1]: - try: - root = self.getFolder(p, root) - except Exception: - root = self._request( - 'midas.folder.create', - { - 'token': token, - 'name': p, - 'reuseExisting': True, - 'parentid': root - } - )['folder_id'] - try: - item = self.getItem([path[-1]], root=root) - except Exception: - item = self._request( - 'midas.item.create', - { - 'token': token, - 'parentid': root, - 'name': path[-1], - } - ) - item = self.getItem([path[-1]], root=root) - - return item - - def uploadFile(self, fileData, path, revision=None): - ''' - Uploads a file to the midas server to the given path. - If revision is not specified, it will create a new revision. - Otherwise, append the file to the given revision number. - - :param string fileData: The raw file contents to upload. - :param tuple path: The relative path to the item. - :param int revision: The revision number to append the file to. - :raises Exception: If the upload fails for any reason. - :returns: MIDAS response object - :rtype: dict - ''' - item = self.getOrCreateItem(path) - if revision is not None and len(item['revisions']) < revision: - revision = None - token = self.login() - fileIO = StringIO(fileData) - - # md5 = hashlib.md5() - - ul_token = self._request( - 'midas.upload.generatetoken', - { - 'token': token, - 'itemid': item['item_id'], - 'filename': path[-1] - } - )['token'] - - params = { - 'uploadtoken': ul_token, - 'filename': path[-1], - 'length': len(fileData), - } - if revision is not None: - params['revision'] = revision - - resp = http.post( - self._apiURL + 'midas.upload.perform', - params=params, - data=fileIO - ) - - try: - resp = resp.json()['data'] - except Exception: - sys.stderr.write(resp.content + '\n') - raise Exception("Could not upload data.") - return resp - -if __name__ == '__main__': - - import sys - import os - - if len(sys.argv[1:]) != 2: - 'usage: %s ' - sys.exit(1) - - path = [p for p in sys.argv[1].split('/') if p] - handler = MidasHandler('https://midas3.kitware.com/midas', 'geojs') - images = handler.getImages(path, int(sys.argv[2])) - - img_base, img_ext = os.path.splitext(path[-1]) - img_name = img_base + '_%02i' + img_ext - for i, image in enumerate(images): - name = img_name % (i + 1) - print('Saving image to: "%s"' % name) - image.save(name) diff --git a/testing/test-runners/selenium-template.html.in b/testing/test-runners/selenium-template.html.in deleted file mode 100644 index ed743f325a..0000000000 --- a/testing/test-runners/selenium-template.html.in +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - -@TEST_SOURCE_HTML@ - diff --git a/testing/test-runners/selenium-test-utils.js b/testing/test-runners/selenium-test-utils.js deleted file mode 100644 index f4964273ce..0000000000 --- a/testing/test-runners/selenium-test-utils.js +++ /dev/null @@ -1,121 +0,0 @@ -/* global geo, $ */ -// General utilities that are made available to selenium tests. - -window.geoTests = { - createOsmMap: function (mapOpts, osmOpts, notiles) { - // Generate a default open street maps layer with optional - // arguments. If no options present, creates the map - // in $('#map') with tiles served from the local server. - - 'use strict'; - - mapOpts = mapOpts || {}; - osmOpts = osmOpts || {}; - notiles = !!notiles; - - var mapDefaults = { - node: '#map', - zoom: 2.5, - center: { - x: 0, - y: 0 - }, - wrapX: false, - clampBoundsX: true - }; - $.extend(true, mapDefaults, mapOpts); - - var osmDefaults = { - baseUrl: '/data/tiles/', - attribution: null - }; - - if (notiles) { - osmDefaults.url = function () { - return '/data/white.jpg'; - }; - delete osmDefaults.baseUrl; - } - $.extend(true, osmDefaults, osmOpts); - - if (osmDefaults.url) { - delete osmDefaults.baseUrl; - } - - var map = geo.map(mapDefaults); - if (!notiles) { - map.createLayer('osm', osmDefaults); - } - - map.interactor().options({ - momentum: false, - throttle: 0 - }); - - if (osmDefaults.m_baseUrl) { - // change the zoom range to represent the - // tiles present in the local dataset - map.zoomRange({ - min: 0, - max: 3 - }); - } - - function resizeMap() { - var width = $(mapDefaults.node).width(), - height = $(mapDefaults.node).height(); - - map.resize(0, 0, width, height); - map.draw(); - } - - resizeMap(); - - window.gjsmap = map; - return map; - }, - - loadCitiesData: function (done, n) { - 'use strict'; - - // Load at most n rows of the cities dataset. - $.ajax({ - type: 'GET', - url: '/data/cities.csv', - dataType: 'text', - success: function (data) { - function processCSVData(csvdata) { - var table = []; - var lines = csvdata.split(/\r\n|\n/); - - lines.forEach(function (line, i) { - if (n && i >= n) { - return; - } - if (line.length) { - table.push(line.split(',')); - } - }); - return table; - } - - var table = processCSVData(data); - var citieslatlon = []; - var i; - for (i = 0; i < table.length; i += 1) { - if (table[i][2] !== undefined) { - var lat = table[i][2]; - lat = lat.replace(/(^\s+|\s+$|^\"|\"$)/g, ''); - lat = parseFloat(lat); - - var lon = table[i][3]; - lon = lon.replace(/(^\s+|\s+$|^\"|\"$)/g, ''); - lon = parseFloat(lon); - citieslatlon.push({lon: lon, lat: lat, elev: 0.0}); - } - } - done(citieslatlon); - } - }); - } -}; diff --git a/testing/test-runners/selenium_test.py.in b/testing/test-runners/selenium_test.py.in deleted file mode 100644 index 8ed7e4d3d9..0000000000 --- a/testing/test-runners/selenium_test.py.in +++ /dev/null @@ -1,851 +0,0 @@ -#!/usr/bin/env python - -# Base TestCase for selenium based unit testing. -# Requires python packages: -# pillow -# selenium -# Should be installable by: -# pip install Pillow selenium - -import sys -import os -import unittest -from unittest import TestCase -from math import sqrt -import json -import inspect -import time - -if sys.version_info[0] == 2: - from cStringIO import StringIO - from urllib2 import urlopen -elif sys.version_info[0] == 3: - from io import BytesIO as StringIO - from urllib.request import urlopen -else: - raise Exception("Unknown python version") - -from selenium import webdriver -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.common.keys import Keys -from PIL import Image, ImageStat, ImageChops - -from midas_handler import MidasHandler - -# to be set by cmake: -TEST_HOST = "@TESTING_HOST@" -TEST_PORT = @TESTING_PORT@ -SELENIUM_HOST = "@SELENIUM_HOST@" -SELENIUM_PORT = @SELENIUM_PORT@ -DEPLOY_PATH = "@GEOJS_DEPLOY_DIR@" -BUILD_PATH = "@CMAKE_CURRENT_BINARY_DIR@" -SOURCE_PATH = "@CMAKE_CURRENT_SOURCE_DIR@" -TEST_REPO_PATH = "@DATA_REPO_PATH@" -MIDAS_BASE_URL = "@MIDAS_BASE_URL@" -MIDAS_COMMUNITY = "@MIDAS_COMMUNITY@" - - -class NullDriver(object): - ''' - A placeholder for selenium drivers that does nothing. - ''' - pass - - -class ImageDifferenceException(BaseException): - ''' - Exception to be raised when two images differ. - Stores extra information that can be captured to handle uploading - failed tests. - ''' - def __init__(self, **kw): - self.stats = kw - self.stats.update({ - 'midas_url': MIDAS_BASE_URL, - 'midas_community': MIDAS_COMMUNITY - }) - s = 'Calculated image difference %f over threshold.' % \ - kw.get('difference', float('inf')) - super(ImageDifferenceException, self).__init__(s) - - def __str__(self): - s = [BaseException.__str__(self)] - if 'testPath' in self.stats: - s.append( - '' + - self.stats['testPath'] + - '' - ) - if 'basePath' in self.stats: - s.append( - '' + - self.stats['basePath'] + - '' - ) - if 'diffPath' in self.stats: - s.append( - '' + - self.stats['diffPath'] + - '' - ) - return '\n'.join(s) - - -class ThresholdException(BaseException): - ''' - Exception to be raised when a test doesn't meet a threshold value. - ''' - def __init__(self, **kw): - self.stats = kw - s = 'Value %f doesn\'t meet threshold.' % kw.get('value', float('inf')) - super(ThresholdException, self).__init__(s) - - def __str__(self): - s = [BaseException.__str__(self)] - if 'threshold' in self.stats: - s.append( - '' - ) - return '\n'.join(s) - - -def _chromeOptions(): - opts = webdriver.ChromeOptions() - opts.add_argument('--test-type') - return { - 'chrome_options': opts - } - -drivers = { - 'firefox': (webdriver.Firefox, {}), - 'firefoxRemote': (webdriver.Remote, { - 'command_executor': 'http://{}:{}/wd/hub'.format(SELENIUM_HOST, - SELENIUM_PORT), - 'desired_capabilities': webdriver.common.desired_capabilities. - DesiredCapabilities.FIREFOX - }), - 'chrome': (webdriver.Chrome, _chromeOptions()), - 'chromeRemote': (webdriver.Remote, { - 'command_executor': 'http://{}:{}/wd/hub'.format(SELENIUM_HOST, - SELENIUM_PORT), - 'desired_capabilities': webdriver.common.desired_capabilities. - DesiredCapabilities.CHROME - }), - 'opera': (webdriver.Opera, {}), - 'phantomjs': (webdriver.PhantomJS, {}), - 'safari': (webdriver.Safari, {}), - 'ie': (webdriver.Ie, {}), - 'null': (NullDriver, {}) -} - - -class BaseTest(TestCase): - ''' - Base class for all selenium based tests. This class - contains several attributes that are configured by cmake - to give the test cases information about the build environment. - The class attributes representing paths should not be modified - by derived classes in general unless noted in the docstrings. - - The testing framework is intended to be organized as follows: - - * Each testing subdirectory contains one or more test classes derived from this class. - Test classes each have a class attribute :py:attr:`BaseTest.testCase` - that should be a tuple of strings. - * Each test class contains one or more test functions that are run independently. - * Each test function contains one or more unit tests that are referred to in the - arguments list as ``testName``. - - The tests are discovered and executed using python's - `unittest `_ - module on the commandline by executing: :: - - python -m unittest discover - - Paths to test specific resources such as base line images are - computed as follows: - - * Test web page :: - - DEPLOY_PATH/test/selenium/testDirectory/index.html - - * Test case image store path :: - - DEPLOY_PATH/test/selenium/testDirectory/testCase[0]/testCase[1]/.../ - - * Unit test screenshots :: - - DEPLOY_PATH/test/selenium/testDirectory/testCase[0]/testCase[1]/.../testName.png - - * MIDAS image store :: - - MIDAS_COMMUNITY/Testing/test/selenium/testDirectory/testCase[0]/testCase[1]/.../testName.png - - Where each MIDAS item contains multiple revisions and bitstreams to account for changes in - the code and differences between platforms. - - * Unit test screenshot comparisons for debugging :: - - DEPLOY_PATH/test/selenium/testDirectory/testCase[0]/testCase[1]/.../testName_test.png - DEPLOY_PATH/test/selenium/testDirectory/testCase[0]/testCase[1]/.../testName_base_NN.png - DEPLOY_PATH/test/selenium/testDirectory/testCase[0]/testCase[1]/.../testName_diff_NN.png - - ''' - - #: String representing the selenium driver to be used. - #: Currently supports 'firefox' and 'chrome' - driverName = 'null' - - #: The address of the webserver hosting the test content - #: configured by cmake. - testHost = TEST_HOST - - #: The port of the webserver hosting the test content - #: configured by cmake. - testPort = TEST_PORT - - # unused at the moment - seleniumHost = SELENIUM_HOST - - # unused at the moment - seleniumPort = SELENIUM_PORT - - #: The absolute path to the webserver root. - deploy_path = DEPLOY_PATH - - #: The absolute path to the build root. - build_path = BUILD_PATH - - #: The absolute path to the source root. - source_path = SOURCE_PATH - - #: The root URL of the test webserver. - testBaseURL = 'http://' + testHost + ':' + str(testPort) - if testHost == '0.0.0.0': - testBaseURL = 'http://127.0.0.1:' + str(testPort) - - #: A tuple giving the selenium test root relative to both - #: :py:attr:`testBaseURL` and :py:attr:`deploy_path`. - testPath = ('test', 'selenium') - - #: A tuple representing the relative path to test data relative to the - #: `geojs MIDAS community `_. - midasPath = ('Testing', ) + testPath - - #: A tuple representing the path to the selenium test - #: sources relative to :py:attr:`source_path`. - srcTestPath = ('testing', 'test-cases', 'selenium-tests') - - #: The maximum allowable image difference between screenshots - #: and baseline images. The difference is calculated as the - #: RMS average difference between pixel values in the RGB - #: channels. This should be a number between - #: ``0`` and ``255``, with ``0`` meaning a perfect match. - imageDifferenceThreshold = 2.0 - - #: A tuple representing the path to a specific test case. - #: This value should be set by all derived classes. The - #: path is used to determine both the image store path - #: on MIDAS server and the local image output path. - testCase = tuple() - - #: A :py:class:`midas_handler.MidasHandler` object providing methods for downloading and - #: uploading data to the - #: `geojs MIDAS community `_. - midas = MidasHandler(MIDAS_BASE_URL, MIDAS_COMMUNITY) - - #: The revision number of the test. This value should be set by - #: all derived classes and incremented - #: whenever there are changes to either the test case or the geojs - #: source resulting in an expected change in screenshots. After - #: incrementing this value, new baseline images must be uploaded - #: to the MIDAS server. - testRevision = 1 - - @classmethod - def _relativeImagePath(cls, testName): - ''' - Get the standard path for storing a test image as a list. - ''' - case = cls.testCase - - if isinstance(case, basestring): - case = case.split('/') - if isinstance(testName, basestring): - testName = testName.split('/') - - testName = list(testName) - testName[-1] += '.png' - - return list(case) + testName - - @classmethod - def startServer(cls): - ''' - Start a local web server. (depreciated) - ''' - pass - - @classmethod - def stopServer(cls): - ''' - Stop the local webserver. (depreciated) - ''' - pass - - def setUp(self): - ''' - Start up a selenium driver. - ''' - drvTuple = drivers[self.driverName] - self.driver = drvTuple[0](**drvTuple[1]) - - def tearDown(self): - ''' - Stop the selenium driver and calls the coverage handler - if enabled. - ''' - self.driver.execute_script( - 'if (window.stopTest) { window.stopTest(); }' - ) - self.driver.quit() - - def wait(self, variable='window.testComplete', function=None, timeout=30): - ''' - Wait for a variable to be set to true, or a function to return true. - Raise an error if timeout is exceeded. - - :param string variable: The variable to query. - :param string function: The function to execute. - :param float timeout: The maximum number of seconds to wait. - - ''' - if function is None: - function = 'return !!%s' % variable - variable = 'function return value' - - def check_status(drv): - try: - return drv.execute_script(function) - except Exception: - return False - - WebDriverWait( - self.driver, - timeout - ).until(check_status, 'checking truthiness of %s' % variable) - - def runScript(self, script): - ''' - Run a javascript script in the browser. Scripts that execute - asynchronously should set a global variable when finished - so that a :py:func:`BaseTest.wait` call can be made to block - for it to finish, as follows: - - >>> script = 'window.setTimeout(function () { window.finished = true; })' - >>> test.runScript(script) - >>> test.wait('window.finished') - - :param string script: The script content to run. - ''' - return self.driver.execute_script(script) - - def resizeWindow(self, width, height): - ''' - Resize the browser to the given width and height. - - :param int width: The width of the view in pixels. - :param in height: The height of the view in pixels. - ''' - testImage = self.screenshot() - if width == testImage.size[0] and height == testImage.size[1]: - return - self.driver.set_window_size(width, height) - # Check the actual size of the viewport of the window we requested - testImage = self.screenshot() - dw = width - testImage.size[0] - dh = height - testImage.size[1] - # Rescale the window so the viewport is actually our target size - if dw or dh: - self.driver.set_window_size(width + dw, height + dh) - - def getElement(self, selector): - ''' - Find an element on the page by a CSS selector. For example, - - >>> node = test.getElement('#my-div') - - :param string selector: A CSS selector. - :rtype: `WebElement`_ - - .. _Webelement: http://selenium-python.readthedocs.org/en/latest/api.html#selenium.webdriver.remote.webelement.WebElement - ''' - return self.driver.find_element_by_css_selector(selector) - - def getElements(self, selector): - ''' - Find all elements on the page matching a css selector. - - >>> divs = test.getElements('div') - - :param string selector: A CSS selector. - :rtype: List of `WebElement`_ - - .. _Webelement: http://selenium-python.readthedocs.org/en/latest/api.html#selenium.webdriver.remote.webelement.WebElement - - ''' - return self.driver.find_elements_by_css_selector(selector) - - def screenshot(self): - ''' - Capture a screenshot of the current viewport. - - :rtype: `Image`_ - - .. _Image: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - png = self.driver.get_screenshot_as_png() - return Image.open(StringIO(png)) - - def loadURL(self, url, relative=True): - ''' - Load a URL path on the test server. - - :param string url: The path to the page go load. - :param bool relative: Whether or not to prefix with the current test path. - - For example, - - >>> test.loadURL('index.html') - - will load ``_, and - - >>> test.loadURL('/index.html', False) - - will load ``_ - using the currently configured test path. - ''' - if relative: - url = '/'.join( - (self.testBaseURL,) + - tuple(self.testPath) + - (url,) - ) - else: - url = self.testBaseURL + url - return self.driver.get(url) - - def drag(self, element, delta, offset=(0, 0), ctrlDown=False): - ''' - Drag the element given (by a CSS selector) starting - at ``offset`` relative to the center of the element by - an amount ``delta``. - - :param string element: A CSS selector. - :param delta: The number of pixels to drag in ``x`` and ``y``. - :type delta: [x, y] - :param offset: The offset from the element center to start the drag. - :type offset: [x, y] - :param ctrlDown: if True, hold down control key during the drag. - - For example, - - >>> test.drag('#map', (100, -10), (-50, 0)) - - performs a mousedown on ``#map`` ``50`` pixels to the left of its center, - drags right ``100`` pixels and up ``10`` pixels, and then performs a mouseup. - ''' - el = self.getElement(element) - action = ActionChains(self.driver) - if ctrlDown: - action.key_down(Keys.CONTROL) - - action.move_to_element_with_offset(el, offset[0], offset[1]) - action.click_and_hold() - action.move_by_offset(delta[0], delta[1]) - action.release() - if ctrlDown: - action.key_up(Keys.CONTROL) - action.perform() - - def hover(self, element, offset=(0, 0)): - ''' - Move the mouse pointer over the given element and offset. - - :param string element: A CSS selector. - :param offset: The offset from the element center - :type offset: [x, y] - ''' - el = self.getElement(element) - action = ActionChains(self.driver) - action.move_to_element_with_offset(el, offset[0], offset[1]) - action.perform() - - def click(self, element, offset=(0, 0)): - ''' - Click on a element given (by a CSS selector) at ``offset`` - relative to the center of the element. - - :param string element: A CSS selector - :param offset: The offset from the element center - :type offset: [x, y] - - For example, - - >>> test.click('button.test-button') - ''' - el = self.getElement(element) - action = ActionChains(self.driver) - action.move_to_element_with_offset(el, offset[0], offset[1]) - action.click() - action.perform() - - @classmethod - def loadImageFile(cls, filename, relative=True): - ''' - Load an image from a local file. If relative is True, then - load it relative the current testing directory, otherwise - assume an absolute path. - - :param string filename: The file path of the image. - :param bool relative: Whether to treat the filename as a relative or absolute path. - :rtype: `Image`_ - - .. _Image: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - if relative: - filename = os.path.join(*( - (SOURCE_PATH,) + - tuple(cls.srcTestPath) + - (filename,) - )) - return Image.open(filename) - - @classmethod - def loadImageURL(cls, filename, relative=True): - ''' - Load an image from a URL. If relative is True, then - load it relative the current testing path, otherwise - assume an absolute URL. - - :param string filename: The file path of the image. - :param bool relative: Whether to treat the filename as a relative or absolute path. - :rtype: `Image`_ - :raises Exception: if the image could not be loaded - - .. _Image: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - if relative: - filename = '/'.join( - (cls.testBaseURL,) + - tuple(cls.testPath) + - (filename,) - ) - request = urlopen(filename) - if request.getcode() != 200: - raise Exception("Could not load image at %s" % filename) - img = StringIO(request.read()) - return Image.open(img) - - @classmethod - def loadTestImages(cls, testName, revision=None): - ''' - Load all images from the globally configured MIDAS image store. The - images are used for matching a screenshot for the current test. - Multiple images are possible to account for differences on - multiple platforms. If no revision is provided, then the - class attribute :py:attr:`testRevision` is used. - - :param string testName: The name of the current test. - :param int revision: The revision number to load. - :rtype: List of `Images`_. - - .. _Images: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - - if revision is None: - revision = cls.testRevision - testImagePath = \ - list(cls.midasPath) + \ - list(cls._relativeImagePath(testName)) - images = cls.midas.getImages(testImagePath, revision) - if not len(images): - raise Exception( - "No images found at path '%s'" % '/'.join(testImagePath) - ) - return images - - @classmethod - def exportTestImage(cls, img, testName, kind='', deploy=''): - ''' - Save an image to the local image store path. This is an internal - method providing a unified method for saving image outputs from - tests for debugging test failures. - - :param img: The image object to save. - :type img: `Image`_ - :param string testName: The name of the test. - :param string kind: (optional) Additional string to added to the file name distinguishing multiple images. - :param string deploy: (optional) Root path for the local image store. - :returns: The full path of the saved image. - :rtype: string - - .. _Image: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - if not deploy: - deploy = DEPLOY_PATH - deploy = deploy.split(os.path.sep) - fullPathList = \ - list(deploy) + \ - list(cls.testPath) + \ - cls._relativeImagePath(testName) - fullPath = os.path.sep.join(fullPathList[:-1]) - try: - os.makedirs(fullPath) - except OSError: - pass # directory already exists... probably - - splt = os.path.splitext(fullPathList[-1]) - - if kind: - kind = '_' + kind - - imageName = os.path.join( - fullPath, - splt[0] + kind + splt[1] - ) - img.putalpha(255) - img.save(imageName) - return imageName - - @classmethod - def compareImages(cls, baseImage, testImage, testName, iImage=0): - ''' - Compute the difference between two images and throw a - :py:class:`ImageDifferenceException` if the difference is above - :py:attr:`imageDifferenceThreshold`. If the two images are - different sizes, this function will always raise. - - :param baseImage: The base line image. - :type baseImage: `Image`_ - :param testImage: The image generated by a screenshot. - :type testImage: `Image`_ - :param string testName: The name of the test. - :param int iImage: A number used to generate unique file names when doing multiple comparisons per test. - :raises ImageDifferenceException: If the images are different. - - .. _Image: http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image - ''' - - basePath = cls.exportTestImage( - baseImage, - testName, - 'base_%02i' % iImage - ) - testPath = cls.exportTestImage(testImage, testName, 'test') - - stats = dict( - difference=float('inf'), - iImage=iImage, - testName=testName, - testPath=testPath, - basePath=basePath, - midas_path=list(cls.midasPath) + - list(cls._relativeImagePath(testName)) - ) - - if baseImage.size != testImage.size: - raise ImageDifferenceException(**stats) - - nPixels = baseImage.size[0] * baseImage.size[1] - diff = ImageChops.difference(baseImage, testImage) - st = ImageStat.Stat(diff) - sum2 = st.sum2 - val = sqrt(reduce(lambda x, y: x + y, sum2, 0)/(len(sum2) * nPixels)) - - diffPath = cls.exportTestImage(diff, testName, 'diff_%02i' % iImage) - - stats.update({ - 'difference': val, - 'diffPath': diffPath - }) - if val > cls.imageDifferenceThreshold: - raise ImageDifferenceException(**stats) - - def screenshotTest(self, testName, revision=None): - ''' - Convenience method for taking a screenshot and comparing - to stored images. Throws an exception if the images differ - by more than :py:attr:`imageDifferenceThreshold`. This method - also exports the images and differences under the deploy path - for debugging failed tests. If no revision is provided, then the - class attribute :py:attr:`testRevision` is used. - - - :param string testName: The name of the test. - :param int revision: The revision number to compare against. - :raises ImageDifferenceException: If the images are different. - ''' - - # put in a global 1 second delay for screenshots to ensure the rendering is done - time.sleep(1) - - failure = False - testImage = self.screenshot() - testImagePath = self.exportTestImage( - testImage, - testName, - deploy=TEST_REPO_PATH - ) - - if revision is None: - revision = self.testRevision - - # collect test stats for possibly uploading new images to server - stats = { - 'testPath': testImagePath, - 'testName': testName, - 'revision': revision, - 'difference': float('inf'), - 'iImage': -1, - 'midas_path': list(self.midasPath) + - list(self._relativeImagePath(testName)) - } - - try: - baseImages = self.loadTestImages(testName, revision) - assert len(baseImages) - except Exception: - raise ImageDifferenceException(**stats) - - success = False - iImage = 0 - minDiff = float('inf') - iDiff = -1 - excep = None - while not success and iImage < len(baseImages): - try: - self.compareImages( - baseImages[iImage], - testImage, - testName, - iImage - ) - success = True - except ImageDifferenceException as e: - if e.stats['difference'] <= minDiff: - stats.update(e.stats) - e.stats = stats - minDiff = e.stats['difference'] - iDiff = iImage - excep = e - iImage += 1 - except Exception as e: - if excep is None: - excep = e - - if not success: - raise excep - - -@unittest.skipIf( - os.environ.get('FIREFOX_TESTS', 'ON') == 'OFF', - "Firefox tests disabled by $FIREFOX_TESTS" -) -class FirefoxTest(BaseTest): - ''' - Firefox test base class. Uses the Firefox selenium driver. May - be extended in the future to handle Firefox specific customizations. - Setting the environment variable ``FIREFOX_TESTS`` to ``OFF`` will - turn off all tests derived from here. - ''' - driverName = 'firefox' - if SELENIUM_HOST not in ('localhost', '127.0.0.1'): - driverName = 'firefoxRemote' - - -@unittest.skipIf( - os.environ.get('CHROME_TESTS', 'OFF') == 'OFF', - "Chrome tests disabled by $CHROME_TESTS" -) -class ChromeTest(BaseTest): - ''' - Chrome test base class. Uses the Chrome selenium driver. May - be extended in the future to handle Chrome specific customizations. - All tests derived from here are disabled by default because they - require special drivers to be installed. - Setting the environment variable ``CHROME_TESTS`` to ``ON`` will - enable them. - ''' - driverName = 'chrome' - if SELENIUM_HOST not in ('localhost', '127.0.0.1'): - driverName = 'chromeRemote' - - -def setUpModule(): - ''' - A module wide set up method that starts the test web server. - Unless there is a reason to override the default behavior in - your test, you should import this function into your test module. - ''' - BaseTest.startServer() - - -def tearDownModule(): - ''' - A module wide tear down method that stops the test web server. - Unless there is a reason to override the default behavior in - your test, you should import this function into your test module. - ''' - BaseTest.stopServer() - - -def makeAllBrowserTest(cls, baseName=None, **kw): - ''' - Instrument a test class to run in all currently enabled browsers. - Takes in a class that will be used to generate browser specific - classes using class mixins. This is a convience function for the - case when a test doesn't need any special handling for different - browsers. Extra keyword arguments are appended as class level - variables. - - :param class cls: The base test class - :param str baseName: Override cls.__name__ to construct generated class names - - For example, :: - - class MyTest(object): - def test_example(self): - pass # Do test here - - makeAllBrowserTest(MyTest, aparam=1) - ''' - - # This black magic is used to get the module of the calling function: - module = inspect.getmodule(inspect.stack()[1][0]) - - if baseName is None: - baseName = cls.__name__ - - testCase = tuple(getattr(cls, 'testCase', ())) - - for base in [FirefoxTest, ChromeTest]: - name = baseName + base.driverName.capitalize() - - _kw = dict(**kw) - _kw['testCase'] = testCase + (base.driverName,) - - setattr( - module, - name, - type(name, (cls, base), _kw) - ) diff --git a/testing/test-runners/upload_test_cases.py b/testing/test-runners/upload_test_cases.py deleted file mode 100644 index 0f7ef147f4..0000000000 --- a/testing/test-runners/upload_test_cases.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python - -''' -This python module is a script that helps to generate test images -and upload them to the midas data store. It is dependent on a -the specific structure of the unit tests. It can be improved -in the future by using the testtools module and providing a -custom exception handler. -''' - -import sys -import os -import unittest -import textwrap - -if sys.version_info[0] == 2: - from cStringIO import StringIO -elif sys.version_info[0] == 3: - from io import BytesIO as StringIO -else: - raise Exception("Unknown python version") - -from PIL import Image - -from selenium_test import BaseTest, ImageDifferenceException - - -def iterate_tests(test_suite_or_case): - """Iterate through all of the test cases in 'test_suite_or_case'.""" - try: - suite = iter(test_suite_or_case) - except TypeError: - yield test_suite_or_case - else: - for test in suite: - for subtest in iterate_tests(test): - yield subtest - - -def findTests(path): - ''' - Find all the tests in the selenium tests path - and return an interable. - ''' - loader = unittest.TestLoader() - return iterate_tests(loader.discover(path)) - - -def handleImageDifference(**kw): - hasDiff = False - if kw['iImage'] < 0: - because = 'no base line images ' + \ - 'were found in the datastore.' - elif kw.get('diffPath') is None: - because = 'no images in the data store had the ' + \ - 'same size as the screenshot.' - else: - hasDiff = True - because = 'the nearest image in the data store differed ' + \ - 'from the screenshot by %f.' % kw['difference'] - s = ('The test %s failed because ' % kw['testName']) + because - print('\n'.join(textwrap.wrap(s))) - - print('') - - print('Trying to open %s' % kw['testPath']) - testImage = Image.open(kw['testPath']) - - print('Would you like to view the screenshot?') - yesorno = raw_input('[y/n]: ') - if yesorno.lower() == 'y': - testImage.show() - - if kw.get('basePath'): - s = 'Would you like to see the base line image?' - print('\n'.join(textwrap.wrap(s))) - yesorno = raw_input('[y/n]: ') - if yesorno.lower() == 'y': - print('Trying to open %s' % kw['basePath']) - baseImage = Image.open(kw['basePath']) - baseImage.show() - - if hasDiff: - s = 'Would you like to see the difference image?' - print('\n'.join(textwrap.wrap(s))) - yesorno = raw_input('[y/n]: ') - if yesorno.lower() == 'y': - print('Trying to open %s' % kw['diffPath']) - diffImage = Image.open(kw['diffPath']) - diffImage.show() - - s = 'Would you like to upload this image to the data store at "%s"?' % \ - '/'.join(kw['midas_path']) - print('\n'.join(textwrap.wrap(s))) - yesorno = raw_input('[y/n]: ') - if yesorno.lower() == 'y': - fileobj = StringIO() - testImage.save(fileobj, 'png') - fileobj.seek(0) - BaseTest.midas.uploadFile( - fileobj.read(), - kw['midas_path'], - kw['revision'] - ) - - -def exceptionHandler(func): - ''' - Decorator function to catch ImageDifferenceExceptions - and prompt the user to upload test images to the midas - data store. Catch all other exceptions and warn the - user. - ''' - def wrapped(*arg, **kw): - try: - func(*arg, **kw) - except ImageDifferenceException as e: - handleImageDifference(**e.stats) - except Exception as e: - sys.stderr.write("Test failed with an unknown exception.\n") - sys.stderr.write(str(e) + "\n") - return wrapped - - -@exceptionHandler -def runTest(test): - sys.stderr.write("Running '%s'.\n" % str(test)) - testMethod = getattr(test, test._testMethodName) - test.setUp() - try: - testMethod() - finally: # always call the tear down method - test.tearDown() - print("Test passed!") - - -def main(paths): - paths = [os.path.abspath(p) for p in paths] - BaseTest.startServer() - try: - for path in paths: - for test in findTests(path): - try: - runTest(test) - except Exception as e: - # just to make sure no exceptions leak - sys.stderr.write("Exception caught\n") - sys.stderr.write(str(e) + "\n") - finally: - BaseTest.stopServer() - -if __name__ == '__main__': - s = 'This is an interactive utility for uploading base line images ' + \ - 'to the default midas data store. Before uploading any images ' + \ - 'you will be asked for your log in information at the midas ' + \ - 'server. You will need to have an account there as well as write' + \ - 'access to the community where the data is stored.' - print('\n'.join(textwrap.wrap(s))) - - print('') - s = 'Note: If you are unable to view any images with this program ' + \ - 'on linux, make sure you have imagemagick installed.' - print('\n'.join(textwrap.wrap(s))) - print('') - if not len(sys.argv[1:]): - print('usage: python %s [ ... ]' % sys.argv[0]) - sys.exit(1) - main(sys.argv[1:]) diff --git a/tests/example-cases/blog-lines.js b/tests/example-cases/blog-lines.js index b6dcc3f8e2..6c4cb2e226 100644 --- a/tests/example-cases/blog-lines.js +++ b/tests/example-cases/blog-lines.js @@ -32,7 +32,7 @@ describe('blog-lines example', function () { it('basic', function (done) { $('#map').attr('src', '/examples/blog-lines/index.html?mode=select'); - imageTest.imageTest('exampleBlogLines', '#map', 0.0015, done, ready, 500, 2); + imageTest.imageTest('exampleBlogLines', '#map', 0.0015, done, ready, 500, 2, '.leaflet-pane'); }, 10000); it('round line cap', function (done) { $('#map')[0].contentWindow.scrollTo(0, 130); @@ -41,7 +41,10 @@ describe('blog-lines example', function () { imageTest.imageTest('exampleBlogLinesRoundCap', '#map', 0.0015, done, ready, 500, 2, '.mapboxgl-canvas'); }, 20000); it('10,000 lines in geojs', function (done) { + // remove previous contents to ensure we detect new contents + base$ = $('iframe#map')[0].contentWindow.jQuery; + base$('.geojs-map.ready').remove(); $('#map').attr('src', '/examples/blog-lines/index.html?renderer=vgl&data=roads&lines=10000&x=-73.7593015&y=42.8496799&zoom=13&strokeOpacity=1&strokeWidth=2&antialiasing=2&referenceLines=false'); - imageTest.imageTest('exampleBlogLines10k', '#map', 0.0015, done, null, 1000, 2); + imageTest.imageTest('exampleBlogLines10k', '#map', 0.0015, done, null, 1000, 2, '.geojs-map.ready'); }, 10000); }); diff --git a/tests/example-cases/lines.js b/tests/example-cases/lines.js index eb233e72ae..c6c8673198 100644 --- a/tests/example-cases/lines.js +++ b/tests/example-cases/lines.js @@ -15,7 +15,7 @@ describe('lines example', function () { it('more lines', function (done) { base$ = $('iframe#map')[0].contentWindow.jQuery; base$('#lines').val(100000).trigger('change'); - imageTest.imageTest('exampleLines100k', '#map', 0.0015, done, null, 0, 2, '#map.ready'); + imageTest.imageTest('exampleLines100k', '#map', 0.0015, done, null, 0, 2, '#map.ready[segments="100000"]'); }, 10000); it('thin preset', function (done) { base$('button.preset').eq(1).trigger('click'); diff --git a/tests/gl-cases/d3GeoJson.js b/tests/gl-cases/d3GeoJson.js new file mode 100644 index 0000000000..882d01e98d --- /dev/null +++ b/tests/gl-cases/d3GeoJson.js @@ -0,0 +1,82 @@ +describe('d3GeoJSON', function () { + var imageTest = require('../image-test'); + var common = require('../test-common'); + var geo = require('../test-utils').geo; + + var obj = { + 'features': [{ + 'geometry': { + 'type': 'LineString', + 'coordinates': [ + [-101.744384765625, 39.32155002466662], + [-101.5521240234375, 39.330048552942415], + [-101.40380859375, 39.330048552942415], + [-101.33239746093749, 39.364032338047984], + [-101.041259765625, 39.36827914916011], + [-100.975341796875, 39.30454987014581], + [-100.9149169921875, 39.24501680713314], + [-100.843505859375, 39.16414104768742], + [-100.8050537109375, 39.104488809440475], + [-100.491943359375, 39.10022600175347], + [-100.43701171875, 39.095962936305476], + [-100.338134765625, 39.095962936305476], + [-100.1953125, 39.027718840211605], + [-100.008544921875, 39.01064750994083], + [-99.86572265625, 39.00211029922512], + [-99.6844482421875, 38.97222194853654], + [-99.51416015625, 38.929502416386605], + [-99.38232421875, 38.92095542046727], + [-99.3218994140625, 38.89530825492018], + [-99.1131591796875, 38.86965182408357], + [-99.0802001953125, 38.85682013474361], + [-98.82202148437499, 38.85682013474361], + [-98.44848632812499, 38.84826438869913], + [-98.20678710937499, 38.84826438869913], + [-98.02001953125, 38.8782049970615], + [-97.635498046875, 38.87392853923629] + ] + }, + 'properties': { + 'strokeColor': {'r': 0, 'g': 1, 'b': 0}, + 'strokeWidth': 3, + 'fill': false + }, + 'type': 'Feature' + }, { + 'type': 'Feature', + 'geometry': { + 'type': 'Point', + 'coordinates': [-80.83775386582222, 35.24980190252168] + }, + 'properties': { + 'name': 'DOUBLE OAKS CENTER', + 'address': '1326 WOODWARD AV', + 'radius': 10, + 'fillColor': 'red', + 'stroke': false + } + }], + 'type': 'FeatureCollection' + }; + + var myMap; + + beforeEach(function () { + imageTest.prepareImageTest(); + }); + + afterEach(function () { + myMap.exit(); + }); + + it('d3 GeoJSON test', function (done) { + var mapOptions = {center: {x: -105.0, y: 40.0}, zoom: 3.5}; + myMap = common.createOsmMap(mapOptions, {}, true); + var layer = myMap.createLayer('feature', {'renderer': 'd3'}); + var reader = geo.createFileReader('jsonReader', {'layer': layer}); + reader.read(obj, function () { + myMap.draw(); + imageTest.imageTest('d3GeoJson', null, 0.0015, done, myMap.onIdle, 0, 2); + }); + }); +}); diff --git a/tests/gl-cases/d3Graph.js b/tests/gl-cases/d3Graph.js new file mode 100644 index 0000000000..4c1ba32064 --- /dev/null +++ b/tests/gl-cases/d3Graph.js @@ -0,0 +1,43 @@ +describe('d3Graph', function () { + var imageTest = require('../image-test'); + var common = require('../test-common'); + + var myMap; + + beforeEach(function () { + imageTest.prepareImageTest(); + }); + + afterEach(function () { + myMap.exit(); + }); + + it('graph test', function (done) { + var mapOptions = {center: {x: -105.0, y: 40.0}, zoom: 3.5}; + myMap = common.createOsmMap(mapOptions, {}, true); + common.loadCitiesData(function (citieslatlon) { + citieslatlon.forEach(function (c, i) { + c.children = [ + citieslatlon[(i + 1) % citieslatlon.length], + citieslatlon[(i + 2) % citieslatlon.length] + ]; + c.x = c.lon; + c.y = c.lat; + }); + + var layer = myMap.createLayer('feature', {'renderer' : 'd3'}); + layer.createFeature('graph') + .data(citieslatlon) + .style({ + nodes: { + stroke: false, + fillOpacity: 0.5 + }, + linkType: 'path' + }); + myMap.draw(); + + imageTest.imageTest('d3Graph', null, 0.0015, done, myMap.onIdle, 0, 2); + }, 10); // just load 10 cities + }); +}); diff --git a/tests/gl-cases/d3StickyLayer.js b/tests/gl-cases/d3StickyLayer.js new file mode 100644 index 0000000000..d698df4ed1 --- /dev/null +++ b/tests/gl-cases/d3StickyLayer.js @@ -0,0 +1,62 @@ +describe('d3StickyLayer', function () { + var imageTest = require('../image-test'); + var common = require('../test-common'); + var geo = require('../test-utils').geo; + + var myMap; + + beforeEach(function () { + imageTest.prepareImageTest(); + }); + + afterEach(function () { + myMap.exit(); + }); + + it('sticky layer test', function (done) { + var mapOptions = {center: {x: -105.0, y: 40.0}}; + myMap = common.createOsmMap(mapOptions, {}, true); + + var width = myMap.node().width(), height = myMap.node().height(); + + // create two layers + var fixedLayer = myMap.createLayer('feature', {'renderer' : 'd3', 'sticky': false}), + movingLayer = myMap.createLayer('feature', {'renderer': 'd3', 'sticky': true}), + fixedSvg = fixedLayer.canvas(), + movingSvg = movingLayer.canvas(); + + // add three circles for different navigation behaviors + fixedSvg.append('circle') + .attr('cx', width / 4) + .attr('cy', height / 2) + .attr('r', 10) + .style('fill', 'red'); + + movingSvg.append('circle') + .attr('cx', width / 2) + .attr('cy', height / 2) + .attr('r', 10) + .style('fill', 'black'); + + var scaledCircle = movingSvg.append('circle') + .attr('cx', 3 * width / 4) + .attr('cy', height / 2) + .attr('r', 10) + .style('fill', 'blue'); + + movingLayer.geoOn(geo.event.d3.rescale, function (arg) { + scaledCircle.attr('r', 10 / arg.scale); + }); + + myMap.draw(); + + myMap.pan({x: 100, y: 100}); + myMap.zoom(myMap.zoom() + 0.5); + + // the image should be three points that are NOT colinear and are NOT all + // the same size. Specifically, the black and blue circles should be lower + // than the red circle, and the black circle should be larger than the red + // and blue circles + imageTest.imageTest('d3StickyLayer', null, 0.0015, done, myMap.onIdle, 0, 2); + }); +}); diff --git a/tests/gl-cases/d3Vectors.js b/tests/gl-cases/d3Vectors.js new file mode 100644 index 0000000000..9cd626d961 --- /dev/null +++ b/tests/gl-cases/d3Vectors.js @@ -0,0 +1,50 @@ +describe('d3Lines', function () { + var imageTest = require('../image-test'); + var common = require('../test-common'); + var geo = require('../test-utils').geo; + var d3 = require('d3'); + + var myMap; + + beforeEach(function () { + imageTest.prepareImageTest(); + }); + + afterEach(function () { + myMap.exit(); + }); + + it('line test', function (done) { + var mapOptions = {center: {x: -105.0, y: 40.0}, zoom: 3.5}; + myMap = common.createOsmMap(mapOptions, {}, true); + common.loadCitiesData(function (citieslatlon) { + var layer = myMap.createLayer('feature', {'renderer': 'd3'}); + + var color = d3.scale.category20().domain(d3.range(20)); + + var vectors = layer.createFeature('vector') + .data(citieslatlon) + .origin(function (d) { return { x: d.lon, y: d.lat }; }) + .style('strokeColor', function (d, i) { + return color(i % 20); + }) + .style('strokeWidth', 2.5); + + function setDelta() { + var center = myMap.center(); + vectors.delta(function (d) { + return { + x: center.x - d.lon, + y: center.y - d.lat + }; + }).draw(); + } + + setDelta(); + layer.geoOn(geo.event.pan, setDelta); + myMap.draw(); + + imageTest.imageTest('d3Vectors', null, 0.0015, done, myMap.onIdle, 0, 2); + }, 30); + }); +}); diff --git a/tests/gl-cases/glContour.js b/tests/gl-cases/glContour.js new file mode 100644 index 0000000000..321e0a17c9 --- /dev/null +++ b/tests/gl-cases/glContour.js @@ -0,0 +1,151 @@ +var $ = require('jquery'); + +describe('glContour', function () { + var imageTest = require('../image-test'); + var common = require('../test-common'); + + var myMap; + + beforeEach(function () { + imageTest.prepareImageTest(); + }); + + afterEach(function () { + myMap.exit(); + }); + + /** Test contours + * + * @param {string} imageName: name used for the image test. + * @param {object} opts: display options, including: + * url: the url to load. Defaults to oahu.json. + * range: one of false, true, 'nonlinear', or 'iso'. Default false. + * stepped: boolean, default true. + * @param {function} done: function to call when the test is complete. + */ + function testContour(imageName, opts, done) { + var mapOptions = {center: {x: -157.965, y: 21.482}, zoom: 10}; + myMap = common.createOsmMap(mapOptions, {}, true); + + var layer = myMap.createLayer('feature', {renderer: 'vgl'}); + var url = '/data/' + (opts.url || 'oahu.json'); + $.getJSON(url, {format: 'json'}).done(function (data) { + + var contour = layer.createFeature('contour') + .data(data.position || data.values) + .style({ + opacity: 0.75 + }) + .contour({ + gridWidth: data.gridWidth, + gridHeight: data.gridHeight, + min: 0 + }); + if (data.position) { + contour + .position(function (d) { return {x: d.x, y: d.y, z: d.z}; }) + .style({ + value: function (d) { return d.z > -9999 ? d.z : null; } + }); + } else { + contour + .style({ + value: function (d) { return d > -9999 ? d : null; } + }) + .contour({ + /* The geometry can be specified using 0-point coordinates and + * deltas since it is a regular grid. */ + x0: data.x0, y0: data.y0, dx: data.dx, dy: data.dy + }); + } + if (opts.range) { + contour + .style({ + opacity: 1 + }) + .contour({ + minColor: 'blue', + minOpacity: 0.5, + maxColor: 'red', + maxOpacity: 0.5 + }); + switch (opts.range) { + case 'nonlinear': + contour + .contour({ + rangeValues: [0, 25, 50, 75, 100, 125, 250, 500, 750, 2000] + }); + break; + case 'iso': + contour + .contour({ + rangeValues: [100, 100, 200, 200, 300, 300, 400, 400, 500, 500], + opacityRange: [1, 0, 1, 0, 1, 0, 1, 0, 1], + minOpacity: 0, + maxOpacity: 0 + }); + break; + default: + contour + .contour({ + min: 100, + max: 500, + colorRange: [ + '#FF00FF', '#CC33CC', '#996699', + '#669966', '#33CC33', '#00FF00' + ], + opacityRange: [0.5, 0.6, 0.7, 0.8, 0.9, 1.0] + }); + break; + } + } + if (opts.stepped === false) { + contour + .contour({ + stepped: false + }); + } + myMap.draw(); + + imageTest.imageTest(imageName, null, 0.0015, done, myMap.onIdle, 0, 2); + }); + } + + it('contours', function (done) { + testContour('glContour', {}, done); + }); + + it('contours with options', function (done) { + // geo from x0, specified min-max, set color range, smooth + testContour('glContourOptions', { + url: 'oahu-dense.json', + range: true, + stepped: false + }, done); + }); + + it('contours with options', function (done) { + // geo from x0, specified min-max, set color range, smooth + testContour('glContourOptions', { + url: 'oahu-dense.json', + range: true, + stepped: false + }, done); + }); + + it('contours with nonlinear range', function (done) { + // geo from x0, non-linear range + testContour('glContourRange', { + url: 'oahu-dense.json', + range: 'nonlinear' + }, done); + }); + + it('contours with iso range', function (done) { + // geo from x0, iso-like range + testContour('glContourIso', { + url: 'oahu-dense.json', + range: 'iso' + }, done); + }); +}); diff --git a/tests/gl-cases/glLines.js b/tests/gl-cases/glLines.js index 61e07dc0bb..dd109d0429 100644 --- a/tests/gl-cases/glLines.js +++ b/tests/gl-cases/glLines.js @@ -142,5 +142,5 @@ describe('glLines', function () { imageTest.imageTest('glLinesOpts', null, 0.0015, done, myMap.onIdle, 0, 2); - }); + }, 10000); }); diff --git a/testing/test-cases/selenium-tests/glPointsSpeed/include.js b/tests/gl-cases/glPointsSpeed.js similarity index 67% rename from testing/test-cases/selenium-tests/glPointsSpeed/include.js rename to tests/gl-cases/glPointsSpeed.js index 3371e06927..60189032a9 100644 --- a/testing/test-cases/selenium-tests/glPointsSpeed/include.js +++ b/tests/gl-cases/glPointsSpeed.js @@ -1,26 +1,39 @@ -window.startTest = function (done) { - 'use strict'; +var $ = require('jquery'); - var mapOptions = { center: { y: 40.0, x: -105.0 } }; +describe('glPointsSpeed', function () { + var imageTest = require('../image-test'); + var common = require('../test-common'); - var myMap = window.geoTests.createOsmMap(mapOptions); + var myMap; - var layer = myMap.createLayer('feature'); - var feature = layer.createFeature('point', { - selectionAPI: false, - dynamicDraw: true + beforeEach(function () { + imageTest.prepareImageTest(); }); - window.geoTests.loadCitiesData(function (citieslatlon) { + afterEach(function () { + myMap.exit(); + }); + + it('speed test', function (done) { var numPoints = 250000, points = [], i, times = [], starttime, stoptime, totaltime = 0, - frames = 0, pass = 0, dx = 0, dy = 0, animTimes = []; + frames = 0, animTimes = [], firsttime, dx = 0, dy = 0, pass = 0; + + var mapOptions = {center: {x: -105.0, y: 40.0}}; + myMap = common.createOsmMap(mapOptions, {}, true); + + var layer = myMap.createLayer('feature', {renderer: 'vgl'}); + var feature = layer.createFeature('point', { + selectionAPI: false, + dynamicDraw: true + }); function postLoadTest() { times.sort(function (a, b) { return a - b; }); if (times.length > 5) { times = times.slice(1, times.length - 1); } + totaltime = 0; for (i = 0; i < times.length; i += 1) { totaltime += times[i]; } @@ -28,6 +41,7 @@ window.startTest = function (done) { console.log('Load time ' + totaltime + ' ms (average across ' + times.length + ' loads)'); console.log(times); + expect(totaltime).toBeLessThan(2000); /* Test animation time. */ starttime = new Date().getTime(); animationFrame(); @@ -61,6 +75,7 @@ window.startTest = function (done) { fps = 1000.0 / frametime; console.log('Usable framerate ' + fps); console.log(animTimes); + expect(fps).toBeGreaterThan(2.5); $('#map').append($('